From 211e1f697b781d92c7b7e4bfd057384e9a0215d7 Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Wed, 10 Aug 2022 16:21:30 -0700 Subject: [PATCH] Patch websocket to fix data after end issues --- patches/websocket+1.0.28.patch | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 patches/websocket+1.0.28.patch diff --git a/patches/websocket+1.0.28.patch b/patches/websocket+1.0.28.patch new file mode 100644 index 000000000..157888c61 --- /dev/null +++ b/patches/websocket+1.0.28.patch @@ -0,0 +1,51 @@ +diff --git a/node_modules/websocket/lib/WebSocketConnection.js b/node_modules/websocket/lib/WebSocketConnection.js +index 9f2750c..f5a1997 100644 +--- a/node_modules/websocket/lib/WebSocketConnection.js ++++ b/node_modules/websocket/lib/WebSocketConnection.js +@@ -271,7 +271,7 @@ WebSocketConnection.prototype.handleSocketData = function(data) { + this.processReceivedData(); + }; + +-WebSocketConnection.prototype.processReceivedData = function() { ++WebSocketConnection.prototype.processReceivedData = function(isSync = false) { + this._debug('processReceivedData'); + // If we're not connected, we should ignore any data remaining on the buffer. + if (!this.connected) { return; } +@@ -320,7 +320,11 @@ WebSocketConnection.prototype.processReceivedData = function() { + process.nextTick(function() { self.emit('frame', frame); }); + } + +- process.nextTick(function() { self.processFrame(frame); }); ++ if (isSync) { ++ self.processFrame(frame); ++ } else { ++ process.nextTick(function() { self.processFrame(frame); }); ++ } + + this.currentFrame = new WebSocketFrame(this.maskBytes, this.frameHeader, this.config); + +@@ -329,7 +333,11 @@ WebSocketConnection.prototype.processReceivedData = function() { + // processed. We use setImmediate here instead of process.nextTick to + // explicitly indicate that we wish for other I/O to be handled first. + if (this.bufferList.length > 0) { +- setImmediateImpl(this.receivedDataHandler); ++ if (isSync) { ++ this.receivedDataHandler(); ++ } else { ++ setImmediateImpl(this.receivedDataHandler); ++ } + } + }; + +@@ -353,6 +361,11 @@ WebSocketConnection.prototype.handleSocketError = function(error) { + }; + + WebSocketConnection.prototype.handleSocketEnd = function() { ++ // We might have socket data scheduled for a next tick, process it now. ++ if (this.bufferList.length > 0) { ++ this.receivedDataHandler(true); ++ } ++ + this._debug('handleSocketEnd: received socket end. state = %s', this.state); + this.receivedEnd = true; + if (this.state === STATE_CLOSED) {