diff --git a/.changeset/healthy-jokes-sing.md b/.changeset/healthy-jokes-sing.md new file mode 100644 index 00000000000..3b48e7780e9 --- /dev/null +++ b/.changeset/healthy-jokes-sing.md @@ -0,0 +1,5 @@ +--- +"@apollo/client": patch +--- + +Don't send `operationType` in the payload sent by `GraphQLWsLink`. diff --git a/src/link/subscriptions/__tests__/graphqlWsLink.ts b/src/link/subscriptions/__tests__/graphqlWsLink.ts index 92c32aebe3e..82c731f1722 100644 --- a/src/link/subscriptions/__tests__/graphqlWsLink.ts +++ b/src/link/subscriptions/__tests__/graphqlWsLink.ts @@ -6,7 +6,10 @@ import type { Observable } from "rxjs"; import { CombinedGraphQLErrors } from "@apollo/client/errors"; import { GraphQLWsLink } from "@apollo/client/link/subscriptions"; -import { executeWithDefaultContext as execute } from "@apollo/client/testing/internal"; +import { + executeWithDefaultContext as execute, + ObservableStream, +} from "@apollo/client/testing/internal"; const query = gql` query SampleQuery { @@ -175,3 +178,31 @@ describe("GraphQLWSlink", () => { }); }); }); + +// https://github.com/apollographql/apollo-client/issues/12946 +test("sends only known keys to the GraphQLWsLink", async () => { + const knownKeys = [ + "query", + "variables", + "operationName", + "extensions", + ].sort(); + + type SubscribeFn = Client["subscribe"]; + const subscribe = jest.fn, Parameters>( + (_payload, sink) => { + sink.complete(); + return () => {}; + } + ); + const client = mockClient(subscribe); + const link = new GraphQLWsLink(client); + + const stream = new ObservableStream(execute(link, { query: subscription })); + await stream.takeComplete(); + + expect(subscribe).toHaveBeenCalledTimes(1); + + const payload = subscribe.mock.calls[0][0]; + expect(Object.keys(payload).sort()).toStrictEqual(knownKeys); +}); diff --git a/src/link/subscriptions/index.ts b/src/link/subscriptions/index.ts index 7f6295117fe..2a3ab8e7e0c 100644 --- a/src/link/subscriptions/index.ts +++ b/src/link/subscriptions/index.ts @@ -79,8 +79,9 @@ export class GraphQLWsLink extends ApolloLink { operation: ApolloLink.Operation ): Observable { return new Observable((observer) => { + const { query, variables, operationName, extensions } = operation; return this.client.subscribe( - { ...operation, query: print(operation.query) }, + { variables, operationName, extensions, query: print(query) }, { next: observer.next.bind(observer), complete: observer.complete.bind(observer),