|
|
@ -100,22 +100,35 @@ function onread(buffer, offset, length) { |
|
|
|
|
|
|
|
var end = offset + length; |
|
|
|
|
|
|
|
// Emit 'data' event.
|
|
|
|
if (buffer) { |
|
|
|
// Emit 'data' event.
|
|
|
|
|
|
|
|
if (self._decoder) { |
|
|
|
// Emit a string.
|
|
|
|
var string = self._decoder.write(buffer.slice(offset, end)); |
|
|
|
if (string.length) self.emit('data', string); |
|
|
|
} else { |
|
|
|
// Emit a slice. Attempt to avoid slicing the buffer if no one is
|
|
|
|
// listening for 'data'.
|
|
|
|
if (self._events && self._events['data']) { |
|
|
|
self.emit('data', buffer.slice(offset, end)); |
|
|
|
if (self._decoder) { |
|
|
|
// Emit a string.
|
|
|
|
var string = self._decoder.write(buffer.slice(offset, end)); |
|
|
|
if (string.length) self.emit('data', string); |
|
|
|
} else { |
|
|
|
// Emit a slice. Attempt to avoid slicing the buffer if no one is
|
|
|
|
// listening for 'data'.
|
|
|
|
if (self._events && self._events['data']) { |
|
|
|
self.emit('data', buffer.slice(offset, end)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Optimization: emit the original buffer with end points
|
|
|
|
if (self.ondata) self.ondata(buffer, offset, end); |
|
|
|
// Optimization: emit the original buffer with end points
|
|
|
|
if (self.ondata) self.ondata(buffer, offset, end); |
|
|
|
|
|
|
|
} else { |
|
|
|
// EOF
|
|
|
|
self.readable = false; |
|
|
|
|
|
|
|
if (!self.writable) self.destroy(); |
|
|
|
// Note: 'close' not emitted until nextTick.
|
|
|
|
|
|
|
|
if (!self.allowHalfOpen) self.end(); |
|
|
|
if (self._events && self._events['end']) self.emit('end'); |
|
|
|
if (self.onend) self.onend(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|