Releases: enisdenjo/graphql-ws
v6.0.6
v6.0.5
v6.0.4
Patch Changes
- #625
b4a656dThanks @HermanBilous! - Use Math.pow for retry delay calculation
v6.0.3
Patch Changes
-
747c01cThanks @enisdenjo! - DropExecutionPatchResultandFormattedExecutionPatchResulttypesNeither of the types are officially supported (yet) and the future versions of graphql-js adding support for stream/defer will a different signature for the incremental execution result.
v6.0.2
v6.0.1
Patch Changes
-
#618
6be34c7Thanks @enisdenjo! - Remove exports for CommonJS for Deno exports in package.json -
#618
6be34c7Thanks @enisdenjo! - Define exports for CommonJS TypeScript definitions in package.json
v6.0.0
Major Changes
-
b668b30Thanks @enisdenjo! - @fastify/websocket WebSocket in the context extra has been renamed fromconnectiontosocketMigrating from v5 to v6
import { makeHandler } from 'graphql-ws/use/@fastify/websocket'; makeHandler({ schema(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, context(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, onConnect(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, onDisconnect(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, onClose(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, onSubscribe(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, onOperation(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, onError(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, onNext(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, onComplete(ctx) { - const websocket = ctx.extra.connection; + const websocket = ctx.extra.socket; }, }); -
#613
3f11abaThanks @enisdenjo! - Drop support forwsv7wsv7 has been deprecated. Please upgrade and use v8. -
#613
3f11abaThanks @enisdenjo! - Drop support for deprecatedfastify-websocketfastify-websockethas been deprecated since v4.3.0.. Please upgrade and use@fastify/websocket. -
#613
3f11abaThanks @enisdenjo! - The/lib/part from imports has been removed, for examplegraphql-ws/lib/use/wsbecomesgraphql-ws/use/wsMigrating from v5 to v6
Simply remove the
/lib/part from your graphql-ws imports that use a handler.ws
- import { useServer } from 'graphql-ws/lib/use/ws'; + import { useServer } from 'graphql-ws/use/ws';
uWebSockets.js
- import { makeBehavior } from 'graphql-ws/lib/use/uWebSockets'; + import { makeBehavior } from 'graphql-ws/use/uWebSockets';
@fastify/websocket
- import { makeHandler } from 'graphql-ws/lib/use/@fastify/websocket'; + import { makeHandler } from 'graphql-ws/use/@fastify/websocket';
Bun
-import { handleProtocols, makeHandler } from 'graphql-ws/lib/use/bun'; + import { handleProtocols, makeHandler } from 'graphql-ws/use/bun';Deno
- import { makeHandler } from 'https://esm.sh/graphql-ws/lib/use/deno'; + import { makeHandler } from 'https://esm.sh/graphql-ws/use/deno';
-
#613
3f11abaThanks @enisdenjo! -ErrorMessageuses andonErrorreturnsGraphQLFormattedError(instead ofGraphQLError) -
#613
3f11abaThanks @enisdenjo! - Least supported Node version is v20Node v10 has been deprecated for years now. There is no reason to support it. Bumping the engine to the current LTS (v20) also allows the code to be leaner and use less polyfills.
-
#613
3f11abaThanks @enisdenjo! - Least supportedgraphqlpeer dependency is ^15.10.1 and ^16Users are advised to use the latest of
graphqlbecause of various improvements in performance and security. -
#613
3f11abaThanks @enisdenjo! -NextMessageuses andonNextreturnsFormattedExecutionResult(instead ofExecutionResult) -
#613
3f11abaThanks @enisdenjo! -schema,context,onSubscribe,onOperation,onError,onNextandonCompletehooks don't have the full accompanying message anymore, only the ID and the relevant part from the messageThere is really no need to pass the full
SubscribeMessageto theonSubscribehook. The only relevant parts from the message are theidand thepayload, thetypeis useless since the hook inherently has it (onNextisnexttype,onErroriserrortype, etc).The actual techincal reason for not having the full message is to avoid serialising results and errors twice. Both
onNextandonErrorallow the user to augment the result and return it to be used instead.onNextoriginally had theNextMessageargument which already has theFormattedExecutionResult, andonErrororiginally had theErrorMessageargument which already has theGraphQLFormattedError, and they both also returnedFormattedExecutionResultandGraphQLFormattedErrorrespectivelly - meaning, if the user serialised the results - the serialisation would happen twice.Additionally, the
onOperation,onError,onNextandonCompletenow have thepayloadwhich is theSubscribeMessage.payload(SubscribePayload) for easier access to the original query as well as execution params extensions.Migrating from v5 to v6
schemaimport { ExecutionArgs } from 'graphql'; import { ServerOptions, SubscribePayload } from 'graphql-ws'; const opts: ServerOptions = { - schema(ctx, message, argsWithoutSchema: Omit<ExecutionArgs, 'schema'>) { - const messageId = message.id; - const messagePayload: SubscribePayload = message.payload; - }, + schema(ctx, id, payload) { + const messageId = id; + const messagePayload: SubscribePayload = payload; + }, };contextimport { ExecutionArgs } from 'graphql'; import { ServerOptions, SubscribePayload } from 'graphql-ws'; const opts: ServerOptions = { - context(ctx, message, args: ExecutionArgs) { - const messageId = message.id; - const messagePayload: SubscribePayload = message.payload; - }, + context(ctx, id, payload, args: ExecutionArgs) { + const messageId = id; + const messagePayload: SubscribePayload = payload; + }, };onSubscribeimport { ServerOptions, SubscribePayload } from 'graphql-ws'; const opts: ServerOptions = { - onSubscribe(ctx, message) { - const messageId = message.id; - const messagePayload: SubscribePayload = message.payload; - }, + onSubscribe(ctx, id, payload) { + const messageId = id; + const messagePayload: SubscribePayload = payload; + }, };onOperationThe
SubscribeMessage.payloadis not useful here at all, thepayloadhas been parsed to ready-to-use graphql execution args and should be used instead.import { ExecutionArgs } from 'graphql'; import { ServerOptions, SubscribePayload, OperationResult } from 'graphql-ws'; const opts: ServerOptions = { - onOperation(ctx, message, args: ExecutionArgs, result: OperationResult) { - const messageId = message.id; - const messagePayload: SubscribePayload = message.payload; - }, + onOperation(ctx, id, payload, args: ExecutionArgs, result: OperationResult) { + const messageId = id; + const messagePayload: SubscribePayload = payload; + }, };onErrorThe
ErrorMessage.payload(GraphQLFormattedError[]) is not useful here at all, the user has access toGraphQLError[]that are true instances of the error containing object references tooriginalErrors and other properties. The user can always convert and returnGraphQLFormattedError[]by using the.toJSON()method.import { GraphQLError, GraphQLFormattedError } from 'graphql'; import { ServerOptions, SubscribePayload } from 'graphql-ws'; const opts: ServerOptions = { - onError(ctx, message, errors) { - const messageId = message.id; - const graphqlErrors: readonly GraphQLError[] = errors; - const errorMessagePayload: readonly GraphQLFormattedError[]...
v5.16.2
Patch Changes
-
#611
6a5fde1Thanks @enisdenjo! - No more workspacesThis version does not contain any code changes.
v5.16.1
Patch Changes
-
#607
a629ec7Thanks @enisdenjo! - Release with changesetsThis version does not contain any code changes.