diff --git a/lib/units/device/plugins/screen/stream.js b/lib/units/device/plugins/screen/stream.js index 3b9c00d9..4c72d3b9 100644 --- a/lib/units/device/plugins/screen/stream.js +++ b/lib/units/device/plugins/screen/stream.js @@ -42,6 +42,7 @@ module.exports = syrup.serial() this.failCounter = new FailCounter(3, 10000) this.failCounter.on('exceedLimit', this._failLimitExceeded.bind(this)) this.failed = false + this.readableListener = this._readableListener.bind(this) } util.inherits(FrameProducer, EventEmitter) @@ -298,12 +299,15 @@ module.exports = syrup.serial() return Promise.resolve(true) } + socket.stream.removeListener('readable', this.readableListener) + var endListener return new Promise(function(resolve/*, reject*/) { socket.on('end', endListener = function() { resolve(true) }) + socket.stream.resume() socket.end() }) .finally(function() { @@ -373,11 +377,11 @@ module.exports = syrup.serial() FrameProducer.prototype._readFrames = function(socket) { this.needsReadable = true + socket.on('readable', this.readableListener) - socket.on('readable', function() { - this.readable = true - this._maybeEmitReadable() - }.bind(this)) + // We may already have data pending. Let the user know they should + // at least attempt to read frames now. + this.readableListener() } FrameProducer.prototype._maybeEmitReadable = function() { @@ -387,6 +391,11 @@ module.exports = syrup.serial() } } + FrameProducer.prototype._readableListener = function() { + this.readable = true + this._maybeEmitReadable() + } + function createServer() { log.info('Starting WebSocket server on port %d', screenOptions.publicPort)