v5.0.0
5.0.0 (2021-06-08)
Features
- Bidirectional ping/pong message types (#201) (1efaf83), closes #117
- client: Rename
keepAlive
option tolazyCloseTimeout
(3c1f13c) - uWebSockets: Drop deprecated
request
context extra (02ea5ee)
BREAKING CHANGES
- Because of the Protocol's strictness, an instant connection termination will happen whenever an invalid message is identified; meaning, all previous implementations will fail when receiving the new subprotocol ping/pong messages.
Beware, the client will NOT ping the server by default. Please make sure to upgrade your stack in order to support the new ping/pong message types.
A simple recipe showcasing a client that times out if no pong is received and measures latency, looks like this:
import { createClient } from 'graphql-ws';
let activeSocket,
timedOut,
pingSentAt = 0,
latency = 0;
createClient({
url: 'ws://i.time.out:4000/and-measure/latency',
keepAlive: 10_000, // ping server every 10 seconds
on: {
connected: (socket) => (activeSocket = socket),
ping: (received) => {
if (!received /* sent */) {
pingSentAt = Date.now();
timedOut = setTimeout(() => {
if (activeSocket.readyState === WebSocket.OPEN)
activeSocket.close(4408, 'Request Timeout');
}, 5_000); // wait 5 seconds for the pong and then close the connection
}
},
pong: (received) => {
if (received) {
latency = Date.now() - pingSentAt;
clearTimeout(timedOut); // pong is received, clear connection close timeout
}
},
},
});
- uWebSockets: The deprecated uWebSockets
request
context extra field has been dropped because it is stack allocated and cannot be used ouside the internalupgrade
callback. - client: Client
keepAlive
option has been renamed tolazyCloseTimeout
in order to eliminate ambiguity with the client to server pings keep-alive option.