diff --git a/zefie_wtvp_minisrv/app.js b/zefie_wtvp_minisrv/app.js index 7a84ef55..c7810f1b 100644 --- a/zefie_wtvp_minisrv/app.js +++ b/zefie_wtvp_minisrv/app.js @@ -736,27 +736,30 @@ async function sendToClient(socket, headers_obj, data) { } } -async function sendToSocket(socket, data, chunk_offset = 0) { +async function sendToSocket(socket, data) { // buffer size = lesser of minisrv_config.config.chunk_size or size remaining var chunk_size = 16384; var can_write = true; - var data_left = 0; - while (data_left != data.byteLength && can_write) { - var data_left = (data.byteLength - chunk_offset); - if (data_left === 0) break; + var expected_data_out = 0; + while ((socket.bytesWritten == 0 || socket.bytesWritten != expected_data_out) && can_write) { + if (expected_data_out === 0) expected_data_out = data.byteLength + (socket_sessions[socket.id].socket_total_written || 0); + if (socket.bytesWritten == expected_data_out) break; + var data_left = (expected_data_out - socket.bytesWritten); var buffer_size = (data_left >= chunk_size) ? chunk_size : data_left; + var offset = (data.byteLength - data_left); var chunk = new Buffer.alloc(buffer_size); - chunk_offset += data.copy(chunk, 0, chunk_offset, (chunk_offset + buffer_size)); + data.copy(chunk, 0, offset, (offset + buffer_size)); can_write = socket.write(chunk); if (!can_write) { socket.once('drain', function () { - sendToSocket(socket, data, socket.bytesWritten); + sendToSocket(socket, data); }); break; } } - if (data_left == data.byteLength) { + if (socket.bytesWritten == expected_data_out) { + socket_sessions[socket.id].socket_total_written = socket.bytesWritten; if (socket_sessions[socket.id].expecting_post_data) delete socket_sessions[socket.id].expecting_post_data; if (socket_sessions[socket.id].header_buffer) delete socket_sessions[socket.id].header_buffer; if (socket_sessions[socket.id].secure_buffer) delete socket_sessions[socket.id].secure_buffer;