-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Description
Is there an existing issue for this?
- I've searched for any related issues and avoided creating a duplicate issue.
Description
I am not sure this is a bug or rather a topic for discussion. I have noticed that there is a subtle difference between ws
and the WebSockets standard. The standard says that when a message is received the agent has to queue a new task. This has an important side effect that the microtask queue will be processed after the task is over and before the next task is picked from the queue. This behaviour is important in the cases where the messages need to be processed in a specified order.
This can be demonstrated by the following server code:
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.send('something1');
ws.send('something2');
});
And the client code:
import { WebSocket } from 'ws'; // in the browser, omit this line.
const ws = new WebSocket('ws://127.0.0.1:8080');
ws.addEventListener('message', function message(event) {
console.log('received: %s', event.data);
new Promise(resolve => {
resolve()
}).then(() => {
console.log('microtask', event.data.toString())
})
});
If you run this code in Node and in the browser, you should observe that the order of console messages is different. It's probably not feasible to change the behaviour of 'ws' as it could be a breaking change but I wonder if there could be some compatibility mode for this? I believe it's possible to workaround that using setTimeout or setImmediate but the downside is that the same code cannot be used across platforms. If I have overlooked an existing issue about this topic, I apologize.
ws version
8.13.0
Node.js Version
v20.3.1
System
System:
OS: macOS 13.5
CPU: (10) arm64 Apple M1 Max
Memory: 696.63 MB / 64.00 GB
Shell: 5.9 - /bin/zsh
Expected result
The order of console messages is the same in Node and in the browser and matches the behaviour defined by the standard:
received: something1
microtask something1
received: something2
microtask something2
Actual result
The order of console messages in Node is different (microtasks are processed after all messages):
received: something1
received: something2
microtask something1
microtask something2
Attachments
No response