Skip to content

Releases: enisdenjo/graphql-ws

v5.1.0

09 Jun 11:22
Compare
Choose a tag to compare

5.1.0 (2021-06-09)

Features

  • client: disablePong option for when implementing a custom pinger (6510360), closes #117
  • Optional payload for ping/pong message types (2fe0345), closes #117

v5.0.0

08 Jun 20:39
Compare
Choose a tag to compare

5.0.0 (2021-06-08)

Features

  • Bidirectional ping/pong message types (#201) (1efaf83), closes #117
  • client: Rename keepAlive option to lazyCloseTimeout (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 internal upgrade callback.
  • client: Client keepAlive option has been renamed to lazyCloseTimeout in order to eliminate ambiguity with the client to server pings keep-alive option.

v4.9.0

06 Jun 13:07
Compare
Choose a tag to compare

4.9.0 (2021-06-06)

Features

Server usage with fastify-websocket

import Fastify from 'fastify'; // yarn add fastify
import fastifyWebsocket from 'fastify-websocket'; // yarn add fastify-websocket
import { makeHandler } from 'graphql-ws/lib/use/fastify-websocket';

const fastify = Fastify();
fastify.register(fastifyWebsocket);

fastify.get(
  '/graphql',
  { websocket: true },
  makeHandler(
    // from the previous step
    { schema, roots },
  ),
);

fastify.listen(4000, (err) => {
  if (err) {
    fastify.log.error(err);
    return process.exit(1);
  }
  console.log('Listening to port 4000');
});

v4.8.0

03 Jun 15:51
Compare
Choose a tag to compare

4.8.0 (2021-06-03)

Features

  • uWebSockets: Add persistedRequest to context extra and deprecate uWS's stack allocated request (#196) (736e6ed)

v4.7.0

31 May 20:33
Compare
Choose a tag to compare

4.7.0 (2021-05-31)

Features

  • Add extensions field to the subscribe message payload (d86a8e4)

v4.6.0

30 May 18:06
Compare
Choose a tag to compare

4.6.0 (2021-05-30)

Features

  • use: Generic for extending the context extras (401cd4c), closes #189

v4.5.2

28 May 17:42
Compare
Choose a tag to compare

4.5.2 (2021-05-28)

Bug Fixes

  • uWebSockets: Handle premature and abrupt socket closes (9d3ff52), closes #186

v4.5.1

18 May 08:41
Compare
Choose a tag to compare

4.5.1 (2021-05-18)

Bug Fixes

  • server: Init context first on connection open (a80e753), closes #181

v4.5.0

29 Apr 21:17
Compare
Choose a tag to compare

4.5.0 (2021-04-29)

Features

  • Support custom JSON message reviver and replacer (#172) (0a9894e)

v4.4.4

28 Apr 08:38
Compare
Choose a tag to compare

4.4.4 (2021-04-28)

Bug Fixes

  • client: complete should not be called after subscription error (1fba419)
  • client: Subscription can be disposed only once (abd9c28), closes #170

Note about complete not being called after subscription error

Promises and Async Iterators can reject/throw/error or resolve/return/complete only once, subsequent calls to either will simply be ignored.

Furthermore, as per the Observer pattern, from RxJS docs:

In an Observable Execution, zero to infinite Next notifications may be delivered. If either an Error or Complete notification is delivered, then nothing else can be delivered afterwards.