* Write TCP data - writes as much as will fit, returns amount written * @param {string} key - TCP session key * @param {Uint8Array|Buffer} data - TCP payload * @param {number} offset - Start offset in data (default 0) * @returns {number} - Number of bytes written (0 if buffer ful
(key, data, offset = 0)
| 154 | * @returns {number} - Number of bytes written (0 if buffer full) |
| 155 | */ |
| 156 | writeTcpData(key, data, offset = 0) { |
| 157 | // Format: keyLen(1) + key + data |
| 158 | const keyBytes = Buffer.from(key, 'utf8'); |
| 159 | |
| 160 | // Max payload size is 65535 - 1 (keyLen) - keyBytes.length |
| 161 | // Use 60000 as safe chunk size to leave room for header |
| 162 | const maxDataPerChunk = 60000; |
| 163 | const perChunkOverhead = 3 + 1 + keyBytes.length; // 3 bytes msg header + 1 keyLen + key |
| 164 | |
| 165 | let bytesWritten = 0; |
| 166 | |
| 167 | while (offset + bytesWritten < data.length) { |
| 168 | const remaining = data.length - offset - bytesWritten; |
| 169 | const chunkSize = Math.min(maxDataPerChunk, remaining); |
| 170 | const payloadSize = 1 + keyBytes.length + chunkSize; |
| 171 | const msgSize = 3 + payloadSize; |
| 172 | |
| 173 | // Check if we have space for at least one chunk |
| 174 | if (!this.hasSpace(msgSize)) { |
| 175 | break; // No space, return what we've written so far |
| 176 | } |
| 177 | |
| 178 | const payload = Buffer.alloc(payloadSize); |
| 179 | payload[0] = keyBytes.length; |
| 180 | keyBytes.copy(payload, 1); |
| 181 | |
| 182 | const srcOffset = offset + bytesWritten; |
| 183 | if (Buffer.isBuffer(data)) { |
| 184 | data.copy(payload, 1 + keyBytes.length, srcOffset, srcOffset + chunkSize); |
| 185 | } else { |
| 186 | payload.set(data.subarray(srcOffset, srcOffset + chunkSize), 1 + keyBytes.length); |
| 187 | } |
| 188 | |
| 189 | this.writeMessage(NET_MSG_TCP_DATA, payload); |
| 190 | bytesWritten += chunkSize; |
| 191 | } |
| 192 | |
| 193 | return bytesWritten; |
| 194 | } |
| 195 | |
| 196 | /** |
| 197 | * Write TCP end event |
no test coverage detected