Skip to content

Commit 1495e11

Browse files
committed
Read and use the connectionParams from operation extensions
1 parent 30b1f05 commit 1495e11

File tree

4 files changed

+29
-3
lines changed

4 files changed

+29
-3
lines changed

.changeset/early-donkeys-join.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@graphql-tools/executor-graphql-ws': minor
3+
---
4+
5+
Read and use `connectionParams` from operation extensions

packages/executors/graphql-ws/src/index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,20 @@ function isClient(client: Client | GraphQLWSExecutorOptions): client is Client {
1313

1414
export function buildGraphQLWSExecutor(clientOptionsOrClient: GraphQLWSExecutorOptions | Client): Executor {
1515
let graphqlWSClient: Client;
16+
let executorConnectionParams = {};
1617
if (isClient(clientOptionsOrClient)) {
1718
graphqlWSClient = clientOptionsOrClient;
1819
} else {
1920
graphqlWSClient = createClient({
2021
webSocketImpl: WebSocket,
2122
lazy: true,
23+
connectionParams: () => {
24+
const optionsConnectionParams =
25+
(typeof clientOptionsOrClient.connectionParams === 'function'
26+
? clientOptionsOrClient.connectionParams()
27+
: clientOptionsOrClient.connectionParams) || {};
28+
return Object.assign(optionsConnectionParams, executorConnectionParams);
29+
},
2230
...clientOptionsOrClient,
2331
});
2432
if (clientOptionsOrClient.onClient) {
@@ -40,6 +48,11 @@ export function buildGraphQLWSExecutor(clientOptionsOrClient: GraphQLWSExecutorO
4048
extensions,
4149
operationType = getOperationASTFromRequest(executionRequest).operation,
4250
} = executionRequest;
51+
// additional connection params can be supplied through the "connectionParams" field in extensions.
52+
// TODO: connection params only from the FIRST operation in lazy mode will be used (detect connectionParams changes and reconnect, too implicit?)
53+
if (extensions?.['connectionParams'] && typeof extensions?.['connectionParams'] === 'object') {
54+
executorConnectionParams = Object.assign(executorConnectionParams, extensions['connectionParams']);
55+
}
4356
const query = print(document);
4457
const iterableIterator = graphqlWSClient.iterate<TData, TExtensions>({
4558
query,

packages/executors/legacy-ws/src/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export enum LEGACY_WS {
1616
}
1717

1818
export interface LegacyWSExecutorOpts {
19-
connectionParams?: Record<string, any>;
19+
connectionParams?: Record<string, unknown> | (() => Record<string, unknown>);
2020
headers?: Record<string, any>;
2121
}
2222

@@ -25,6 +25,7 @@ export function buildWSLegacyExecutor(
2525
WebSocketImpl: typeof WebSocket,
2626
options?: LegacyWSExecutorOpts
2727
): Executor {
28+
let executorConnectionParams = {};
2829
let websocket: WebSocket | null = null;
2930

3031
const ensureWebsocket = (errorHandler: (error: Error) => void = err => console.error(err)) => {
@@ -46,6 +47,7 @@ export function buildWSLegacyExecutor(
4647
payload = options?.connectionParams;
4748
break;
4849
}
50+
payload = Object.assign(payload, executorConnectionParams);
4951
websocket!.send(
5052
JSON.stringify({
5153
type: LEGACY_WS.CONNECTION_INIT,
@@ -82,6 +84,12 @@ export function buildWSLegacyExecutor(
8284
};
8385

8486
return function legacyExecutor(request: ExecutionRequest) {
87+
// additional connection params can be supplied through the "connectionParams" field in extensions.
88+
// TODO: connection params only from the FIRST operation in lazy mode will be used (detect connectionParams changes and reconnect, too implicit?)
89+
if (request.extensions?.['connectionParams'] && typeof request.extensions?.['connectionParams'] === 'object') {
90+
executorConnectionParams = Object.assign(executorConnectionParams, request.extensions['connectionParams']);
91+
}
92+
8593
const id = Date.now().toString();
8694
return observableToAsyncIterable({
8795
subscribe(observer) {

packages/loaders/url/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export interface LoadFromUrlOptions extends BaseLoaderOptions, Partial<Introspec
9191
/**
9292
* Connection Parameters for WebSockets connection
9393
*/
94-
connectionParams?: any;
94+
connectionParams?: Record<string, unknown> | (() => Record<string, unknown>);
9595
/**
9696
* Enable Batching
9797
*/
@@ -154,7 +154,7 @@ export class UrlLoader implements Loader<LoadFromUrlOptions> {
154154
buildWSExecutor(
155155
subscriptionsEndpoint: string,
156156
webSocketImpl: typeof WebSocket,
157-
connectionParams?: Record<string, any>
157+
connectionParams?: Record<string, unknown> | (() => Record<string, unknown>)
158158
): Executor {
159159
const WS_URL = switchProtocols(subscriptionsEndpoint, {
160160
https: 'wss',

0 commit comments

Comments
 (0)