Skip to content

Releases: enisdenjo/graphql-ws

v5.5.3

20 Oct 15:25
Compare
Choose a tag to compare

5.5.3 (2021-10-20)

Bug Fixes

  • client: Distinguish client connection closes (ed4d9db)

v5.5.2

20 Oct 14:52
Compare
Choose a tag to compare

5.5.2 (2021-10-20)

Bug Fixes

  • client: Don't complete after connection error (5f829c3)
  • client: Report close error even if Complete message followed (27754b2), closes #245

v5.5.1

19 Oct 13:34
Compare
Choose a tag to compare

5.5.1 (2021-10-19)

Bug Fixes

  • 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)

v5.5.0

08 Sep 21:26
Compare
Choose a tag to compare

5.5.0 (2021-09-08)

Bug Fixes

  • Define graphql execution results (a64c91b)
  • server: Operation result can be async generator or iterable (b1fb883)

Features

  • client: Add connectionAckWaitTimeout option (#228) (35ce054)

v5.4.1

26 Aug 19:16
Compare
Choose a tag to compare

5.4.1 (2021-08-26)

Bug Fixes

  • Add support for graphql@v16 (ad5aea2)
  • Sink's next callback always receives an ExecutionResult (045b402)

v5.4.0

21 Aug 11:04
Compare
Choose a tag to compare

5.4.0 (2021-08-21)

Bug Fixes

  • 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)

Features

  • Centralise expected close codes in CloseCode enum (d10a75c)
  • server: Add support for ws@v8 (9119153)

v5.3.0

23 Jun 14:15
Compare
Choose a tag to compare

5.3.0 (2021-06-23)

Bug Fixes

  • client: ConnectionInit payload is absent if connectionParams returns nothing (98f8265)

Features

  • client: connectionParams can return undefined (a543187)
  • client: Add opened event for when a WebSocket opens (9053224)

v5.2.0

21 Jun 17:43
Compare
Choose a tag to compare

5.2.0 (2021-06-21)

Features

  • server: Optional onPing and onPong message type listeners (f36066f)

Server usage with ws and subprotocol pings and pongs

import ws from 'ws'; // yarn add ws
import { makeServer, stringifyMessage, MessageType, CloseCode } from 'graphql-ws';
import { schema } from './my-graphql-schema';

// make
const server = makeServer({ schema });

// create websocket server
const wsServer = new ws.Server({
  port: 4000,
  path: '/graphql',
});

// implement
wsServer.on('connection', (socket, request) => {
  // subprotocol pinger because WS level ping/pongs might not be available
  let pinger, pongWait;
  function ping() {
    if (socket.readyState === socket.OPEN) {
      // send the subprotocol level ping message
      socket.send(stringifyMessage({ type: MessageType.Ping }));

      // wait for the pong for 6 seconds and then terminate
      pongWait = setTimeout(() => {
        clearInterval(pinger);
        socket.close();
      }, 6_000);
    }
  }

  // ping the client on an interval every 12 seconds
  pinger = setInterval(() => ping(), 12_000);

  // a new socket opened, let graphql-ws take over
  const closed = server.opened(
    {
      protocol: socket.protocol, // will be validated
      send: (data) => socket.send(data),
      close: (code, reason) => socket.close(code, reason),
      onMessage: (cb) =>
        socket.on('message', async (event) => {
          try {
            // wait for the the operation to complete
            // - if init message, waits for connect
            // - if query/mutation, waits for result
            // - if subscription, waits for complete
            await cb(event.toString());
          } catch (err) {
            // all errors that could be thrown during the
            // execution of operations will be caught here
            socket.close(CloseCode.InternalServerError, err.message);
          }
        }),
      // pong received, clear termination timeout
      onPong: () => clearTimeout(pongWait),
    },
    // pass values to the `extra` field in the context
    { socket, request },
  );

  // notify server that the socket closed and stop the pinger
  socket.once('close', (code, reason) => {
    clearTimeout(pongWait);
    clearInterval(pinger);
    closed(code, reason);
  });
});

v5.1.2

09 Jun 18:16
Compare
Choose a tag to compare

5.1.2 (2021-06-09)

Bug Fixes

  • client: Return ping's payload through the response pong (ee6193a)

v5.1.1

09 Jun 17:01
Compare
Choose a tag to compare

5.1.1 (2021-06-09)

Bug Fixes

  • server: Return ping's payload through the response pong (47730a9), closes #117