diff options
Diffstat (limited to 'lib/internal/stream_base_commons.js')
-rw-r--r-- | lib/internal/stream_base_commons.js | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/internal/stream_base_commons.js b/lib/internal/stream_base_commons.js index 870b5b3e3b..709395fa91 100644 --- a/lib/internal/stream_base_commons.js +++ b/lib/internal/stream_base_commons.js @@ -6,6 +6,8 @@ const { WriteWrap, kReadBytesOrError, kArrayBufferOffset, + kBytesWritten, + kLastWriteWasAsync, streamBaseState } = internalBinding('stream_wrap'); const { UV_EOF } = internalBinding('uv'); @@ -20,7 +22,12 @@ function handleWriteReq(req, data, encoding) { switch (encoding) { case 'buffer': - return handle.writeBuffer(req, data); + { + const ret = handle.writeBuffer(req, data); + if (streamBaseState[kLastWriteWasAsync]) + req.buffer = data; + return ret; + } case 'latin1': case 'binary': return handle.writeLatin1String(req, data); @@ -35,7 +42,13 @@ function handleWriteReq(req, data, encoding) { case 'utf-16le': return handle.writeUcs2String(req, data); default: - return handle.writeBuffer(req, Buffer.from(data, encoding)); + { + const buffer = Buffer.from(data, encoding); + const ret = handle.writeBuffer(req, buffer); + if (streamBaseState[kLastWriteWasAsync]) + req.buffer = buffer; + return ret; + } } } @@ -45,6 +58,8 @@ function createWriteWrap(handle, oncomplete) { req.handle = handle; req.oncomplete = oncomplete; req.async = false; + req.bytes = 0; + req.buffer = null; return req; } @@ -80,6 +95,9 @@ function writeGeneric(self, req, data, encoding, cb) { } function afterWriteDispatched(self, req, err, cb) { + req.bytes = streamBaseState[kBytesWritten]; + req.async = !!streamBaseState[kLastWriteWasAsync]; + if (err !== 0) return self.destroy(errnoException(err, 'write', req.error), cb); |