5.16.0 (2024-03-27)
- server: Return all subscriptions regardless of the return invocation order (f442288)
- server: should not send error messages if socket closes before onSubscribe hooks resolves (db47a66), closes #539
5.15.0 (2024-02-12)
- client: Use
TerminatedCloseEvent
class extending anError
for rejecting promises when terminating (74b4ceb), closes #531 - server: Dispose of subscriptions on close even if added late to the subscriptions list (#534) (e45d6b1), closes #532
5.14.3 (2023-12-20)
- client: Use closures instead of bindings (with
this
) (812129d) - remove package.json workspaces entry in release (63a831e), closes #524
5.14.2 (2023-10-23)
5.14.1 (2023-09-28)
- server: Acknowledge connection before notifying the client to avoid race conditions with slow sends (#506) (8cb82bd), closes #501
5.14.0 (2023-06-22)
5.13.1 (2023-05-15)
5.13.0 (2023-05-12)
5.12.1 (2023-03-31)
- Add file extensions to imports/exports in ESM type definitions (48775be)
5.12.0 (2023-03-06)
5.11.3 (2023-02-01)
- ws,uWebSockets,@fastify/websocket: Handle internal errors that are not instances of
Error
(#442) (9884889), closes #441
5.11.2 (2022-09-21)
5.11.1 (2022-09-16)
5.11.0 (2022-09-16)
5.10.2 (2022-09-12)
- Easier message parser (d44c6f1)
5.10.1 (2022-08-19)
5.10.0 (2022-08-09)
5.9.1 (2022-07-01)
5.9.0 (2022-06-09)
5.8.2 (2022-05-12)
- server: Should clean up subscription reservations on abrupt errors without relying on connection close (611c223)
5.8.1 (2022-04-25)
- client:
isFatalConnectionProblem
defaults to undefined for usingshouldRetry
(9d5c573)
5.8.0 (2022-04-25)
- client: Deprecate
isFatalConnectionProblem
option in favour ofshouldRetry
(d8dcf21)
5.7.0 (2022-04-07)
5.6.4 (2022-03-24)
- Warn about subscriptions-transport-ws clients and provide migration link (e080739), closes #339 #325
5.6.3 (2022-03-13)
- client: Stop execution if
connectionParams
took too long and the server kicked the client off (1e94e45), closes #331
5.6.2 (2022-02-23)
- server:
handleProtocols
accepts arrays too and gracefully rejects other types (98dec1a), closes #318
5.6.1 (2022-02-21)
- server: Handle upgrade requests with multiple subprotocols and omit
Sec-WebSocket-Protocol
header if none supported (9bae064)
5.6.0 (2022-02-19)
5.5.5 (2021-10-29)
- client: Limit client emitted error close message size (2d959f6)
- client: Report close causing internal errors to error listeners (4e7e389)
5.5.4 (2021-10-27)
- fastify-websocket: Handle connection and socket emitted errors (71e9586)
- fastify-websocket: Handle server emitted errors (3fa17a7)
- ws: Handle socket emitted errors (a22c00f)
- ws: Limit server emitted error close message size (50620df)
- ws: Log server emitted errors to the console (0826b0a)
5.5.3 (2021-10-20)
- client: Distinguish client connection closes (ed4d9db)
5.5.2 (2021-10-20)
- client: Don't complete after connection error (5f829c3)
- client: Report close error even if
Complete
message followed (27754b2), closes #245
5.5.1 (2021-10-19)
- server: Limit internal server error close message size (8479f76)
- server: Log internal errors to the console (6ddf0d1)
- ws,fastify-websocket: Send only on ready socket (8d13c9e)
5.5.0 (2021-09-08)
- Define graphql execution results (a64c91b)
- server: Operation result can be async generator or iterable (b1fb883)
5.4.1 (2021-08-26)
- Add support for
graphql@v16
(ad5aea2) - Sink's next callback always receives an
ExecutionResult
(045b402)
5.4.0 (2021-08-21)
- client: Specify and fail on fatal internal WebSocket close codes (a720125)
- Use
4406
close code for unsupported subprotocol (1002
is an internal WebSocket close code) (df85281) - Use
4500
close code for internal server errors (1011
is an internal WebSocket close code) (3c0316d)
5.3.0 (2021-06-23)
- client:
ConnectionInit
payload is absent ifconnectionParams
returns nothing (98f8265)
- client:
connectionParams
can returnundefined
(a543187) - client: Add
opened
event for when a WebSocket opens (9053224)
5.2.0 (2021-06-21)
- server: Optional
onPing
andonPong
message type listeners (f36066f)
5.1.2 (2021-06-09)
- client: Return ping's payload through the response pong (ee6193a)
5.1.1 (2021-06-09)
5.1.0 (2021-06-09)
- client:
disablePong
option for when implementing a custom pinger (6510360), closes #117 - Optional
payload
for ping/pong message types (2fe0345), closes #117
5.0.0 (2021-06-08)
- Bidirectional ping/pong message types (#201) (1efaf83)
- client: Rename
keepAlive
option tolazyCloseTimeout
(3c1f13c) - uWebSockets: Drop deprecated
request
context extra (02ea5ee)
- 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.
4.9.0 (2021-06-06)
4.8.0 (2021-06-03)
- uWebSockets: Add
persistedRequest
to context extra and deprecate uWS's stack allocatedrequest
(#196) (736e6ed)
4.7.0 (2021-05-31)
- Add
extensions
field to the subscribe message payload (d86a8e4)
4.6.0 (2021-05-30)
4.5.2 (2021-05-28)
4.5.1 (2021-05-18)
4.5.0 (2021-04-29)
4.4.4 (2021-04-28)
- client:
complete
should not be called after subscriptionerror
(1fba419) - client: Subscription can be disposed only once (abd9c28), closes #170
4.4.3 (2021-04-27)
- client: Subscribes even if socket is in CLOSING state due to all subscriptions being completed (3e3b8b7), closes #173 #170
4.4.2 (2021-04-22)
- client: Lazy connects after successful reconnects are not retries (99b85a3)
- client: Shouldn't reconnect if all subscriptions complete while waiting for retry (2826c10), closes #163
4.4.1 (2021-04-14)
4.4.0 (2021-04-11)
4.3.4 (2021-04-11)
- client: Subscriptions acquire locks (eb6cb2a)
4.3.3 (2021-04-11)
4.3.2 (2021-03-29)
4.3.1 (2021-03-25)
- Close the details tag in the README (84144c4)
4.3.0 (2021-03-25)
- server: Respect completed subscriptions even if
subscribe
oronOperation
didnt resolve yet (4700154)
- client:
url
option accepts a function or a Promise (#143) (76f522f), closes #145 #146 - server:
execute
andsubscribe
are optional (#148) (af748b0) - server: Dynamic
schema
support by accepting a function or a Promise (#147) (6a0bf94), closes #127 - server: Use
validate
option for custom GraphQL validation (b68d56c)
4.2.3 (2021-03-23)
- client: Reduce WebSocket event listeners and add new client
message
event (#104) (68d0e20), closes #102
4.2.2 (2021-03-17)
4.2.1 (2021-03-11)
4.2.0 (2021-02-25)
- Only UMD build has side effects (66ed43f)
- client:
isFatalConnectionProblem
option for deciding if the connect error should be immediately reported or the connection retried (#126) (8115871), closes #122
4.1.6 (2021-02-18)
4.1.5 (2021-02-12)
- Main entrypoint in
exports
is just"."
(8f70b02)
4.1.4 (2021-02-12)
4.1.3 (2021-02-08)
- client: Should emit
closed
event when disposing (5800de8), closes #108 - client: Shouldn’t send the
Complete
message if socket is not open (cd12024)
4.1.2 (2021-01-24)
4.1.1 (2021-01-19)
- client: Export relevant elements from the browser bundle (b106dbe), closes #97
- client: Wait for server acknowledgement indefinitely (a4bd602), closes #98
4.1.0 (2021-01-13)
- server:
onDisconnect
is called exclusively if the connection is acknowledged (33ed5f2)
- server: Add
onClose
callback for closures at any point in time (dd0d4fa)
4.0.0 (2021-01-13)
- server: Client can complete/cancel any operation (0ad1c4c)
- server: Enforce ID uniqueness across all operations and during the whole subscription life (#96) (65d1bfa)
- server: Add
onDisconnect
callback (#94) (2a61268) - server: Log a warning for unsupported subprotocols (88a12ef), closes #92
- server: The return function of
server.opened
(closed
) now requires the close event code and reason for reporting to theonDisconnect
callback. - server: The
Context.subscriptions
record value can be either anAsyncIterator
or aPromise
.
3.2.0 (2020-12-17)
3.1.0 (2020-12-11)
- client:
onNonLazyError
allows you to catch errors reported in non-lazy mode (cd1e7df)
3.0.2 (2020-12-10)
- client: No retries when disposed (0d5e6c2)
3.0.1 (2020-12-10)
- client: Await timeouts only in recursive connects (55c8fc8)
3.0.0 (2020-12-09)
- client: Client
retryTimeout
option has been replaced with the newretryWait
.
retryWait
allows you to control the retry timeout strategy by resolving the returned promise when ready. The default implements the randomised exponential backoff like so:
// this is the default
const retryWait = async function randomisedExponentialBackoff(retries: number) {
let retryDelay = 1000; // start with 1s delay
for (let i = 0; i < retries; i++) {
retryDelay *= 2; // square `retries` times
}
await new Promise((resolve) =>
setTimeout(
// resolve pending promise with added random timeout from 300ms to 3s
resolve,
retryDelay + Math.floor(Math.random() * (3000 - 300) + 300),
),
);
};
2.0.1 (2020-12-03)
2.0.0 (2020-11-20)
- server: You now "make" a ready-to-use server that can be used with any WebSocket implementation!
Summary of breaking changes:
- No more
keepAlive
. The user should provide its own keep-alive implementation. (I highly recommend WebSocket Ping and Pongs) - No more HTTP
request
in the server context. - No more WebSocket in the server context (you're the one that creates it).
- You use your own WebSocket server
- Server exports only
makeServer
(no morecreateServer
)
- You're responsible for the server (any optimisation or adjustment can be applied)
- Any WebSocket server can be used (or even mocked if necessary)
- You control the disposal of the server (close or transfer clients however you wish)
- New
extra
field in theContext
for storing custom values useful for callbacks - Full control of authentication flow
- Full control over error handling
- True zero-dependency
Only the server has to be migrated. Since this release allows you to use your favourite WebSocket library (or your own implementation), using ws is just one way of using graphql-ws
. This is how to use the implementation shipped with the lib:
/**
* ❌ instead of the lib creating a WebSocket server internally with the provided arguments
*/
import https from 'https';
import { createServer } from 'graphql-ws';
const server = https.createServer(...);
createServer(
{
onConnect(ctx) {
// were previously directly on the context
ctx.request as IncomingRequest
ctx.socket as WebSocket
},
...rest,
},
{
server,
path: '/graphql',
},
);
/**
* ✅ you have to supply the server yourself
*/
import https from 'https';
import ws from 'ws'; // yarn add ws
import { useServer } from 'graphql-ws/lib/use/ws'; // notice the import path
const server = https.createServer(...);
const wsServer = new ws.Server({
server,
path: '/graphql',
});
useServer(
{
onConnect(ctx) {
// are now in the `extra` field
ctx.extra.request as IncomingRequest
ctx.extra.socket as WebSocket
},
...rest,
},
wsServer,
// optional keepAlive with ping pongs (defaults to 12 seconds)
);
1.14.0 (2020-11-15)
1.13.1 (2020-11-14)
- client: Some close events are not worth retrying (4d9134b)
- message: Allow
data
field to be of any type (533248e), closes #72 - message: Allow
payload
field to be of any type forNextMessage
(7cebbfe), closes #72 - Use
ID
type for message id field (87ebd35)
1.13.0 (2020-11-12)
- client: One cleanup per subscription (#67) (5a5ae4d)
- Stop sending messages after receiving complete (#65) (3f4f836)
- client:
connectionParams
may return a promise (#71) (33f210c) - client: Allow keeping the connection alive for some time before lazy closing (#69) (555c2c3)
1.12.0 (2020-11-07)
- client: Close with error message during connecting issues (f8ecdd7)
1.11.0 (2020-11-04)
- Node 10 is the min supported version (19844d7)
- Support more
graphql
versions (de69b4e) - server: Close socket if
onSubscribe
returns invalid array (#53) (0464a54) - server: Consistently set
rootValue
andcontextValue
, if not overridden (#49) (7aa3bcd) - server: Distribute server error to all clients even if one error listener throws (#56) (b96dbb9)
- server: Don't surface bad request error details in production (#55) (70317b2)
1.10.0 (2020-11-03)
- Subscribe message
query
must be a string (#45) (60d9cd5) - server: For dynamic usage,
context
option can be a function too (#46) (149b582)
1.9.3 (2020-10-31)
- Drop TypeScript DOM lib dependency (a81e8c1)
- Support more Node versions by not using
globalThis
(79c2ed2)
1.9.2 (2020-10-31)
- server: Make sure to use
onSubscribe
result exclusively (51fdb7c) - Export useful types (e4cc4d4)
- client: Accept nullish values for
operationName
andvariables
(2d60dda)
1.9.1 (2020-10-25)
- Package rename
graphql-transport-ws
👉graphql-ws
. (#43)
1.9.0 (2020-10-24)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
Should've been a major release but semantic-release
didn't detect the breaking changes of the 507a222 commit, so here we are...
This time we come with a few breaking changes that will open doors for all sorts of enhancements. Check the linked PR for more details.
- Now executes before any other subscribe message processing
- Now takes 2 arguments, the
Context
and theSubscribeMessage
- Now returns nothing,
ExecutionArgs
or an array ofGraphQLError
s- Returning
void
(or nothing) will leave the execution args preparation and validation to the library - Returned
ExecutionArgs
will be used directly for the GraphQL operation execution (preparations and validation should be done by you in this case) - Returned array of
GraphQLError
s will be reported to the client through theErrorMessage
- Returning
Dropped in favour of applying custom validation rules in the onSubscribe
callback. Find the recipe in the readme!
Dropped in favour of using the return value of onNext
callback.
1.8.2 (2020-10-22)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- server: No need to bind
this
scope (f76ac73)
1.8.1 (2020-10-22)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- yarn engine is not required (#34) (89484b8)
- server: Hide internal server error messages from the client in production (36fe405), closes #31
1.8.0 (2020-10-19)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
1.7.0 (2020-10-01)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- client: Dispose of subscription on complete or error messages (#23) (fb4d8e9)
- server:
subscription
operations are distinct on the message ID (#24) (dfffb05)
1.6.0 (2020-09-28)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
1.5.0 (2020-09-18)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- server: Use
subscribe
from the config (6fbd47c)
1.4.2 (2020-09-16)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- server: Receiving more than one
ConnectionInit
message closes the socket immediately (757c6e9)
1.4.1 (2020-09-11)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- client: Memoize message parsing for each subscriber (2a7ba46)
1.4.0 (2020-09-10)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- client: Only
query
is required in the subscribe payload (e892530)
- server: Pass roots for operation fields as an option (dcb5ed4)
1.3.0 (2020-09-10)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- WebSocket Ping and Pong as keep-alive (#11) (16ae316)
- client: Emit events for
connecting
,connected
andclosed
(627775b) - client: Implement silent-reconnects (c6f7872), closes #7
- client: Lazy option can be changed (fb0ec14)
1.2.0 (2020-09-04)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- Package rename
@enisdenjo/graphql-transport-ws
👉graphql-transport-ws
. (494f676)
1.1.1 (2020-08-28)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- add the sink to the subscribed map AFTER emitting a subscribe message (814f46c)
- notify only relevant sinks about errors or completions (62155ba)
1.1.0 (2020-08-28)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- server: allow skipping init message wait with zero values (a7419df)
- server: use subscription specific formatter for queries and mutations too (5672a04)
1.0.2 (2020-08-26)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- correctly detect WebSocket server (eab29dc)
1.0.1 (2020-08-26)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- reset connected/connecting state when disconnecting and disposing (2eb3cd5)
- client: cant read the
CloseEvent.reason
after bundling so just pass the whole event to the sink error and let the user handle it (9ccb46b) - client: send complete message and close only if socket is still open (49b75ce)
- http and ws have no default exports (5c01ed9)
- include
types
file holding important types (f3e4edf) - server: scoped execution result formatter from
onConnect
(f91fadb) - export both the client and the server from index (29923b1)
- server: store the intial request in the context (6927ee0)
1.0.0 (2020-08-17)
Package has been renamed from graphql-transport-ws
to graphql-ws
.
- client: Re-implement following the new transport protocol (#6) (5191a35)
- server: Implement following the new transport protocol (#1) (a412d25)
- Rewrite GraphQL over WebSocket Protocol (#2) (42045c5)
- This lib is no longer compatible with
subscriptions-transport-ws
. It follows a redesigned transport protocol aiming to improve security, stability and reduce ambiguity.