UNPKG

@graphql-tools/executor-graphql-ws

Version:

A set of utils for faster development of GraphQL tools

55 lines (54 loc) 2.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildGraphQLWSExecutor = void 0; const tslib_1 = require("tslib"); const utils_1 = require("@graphql-tools/utils"); const graphql_1 = require("graphql"); const graphql_ws_1 = require("graphql-ws"); const isomorphic_ws_1 = tslib_1.__importDefault(require("isomorphic-ws")); function isClient(client) { return 'subscribe' in client; } function buildGraphQLWSExecutor(clientOptionsOrClient) { let graphqlWSClient; let executorConnectionParams = {}; if (isClient(clientOptionsOrClient)) { graphqlWSClient = clientOptionsOrClient; } else { graphqlWSClient = (0, graphql_ws_1.createClient)({ webSocketImpl: isomorphic_ws_1.default, lazy: true, connectionParams: () => { const optionsConnectionParams = (typeof clientOptionsOrClient.connectionParams === 'function' ? clientOptionsOrClient.connectionParams() : clientOptionsOrClient.connectionParams) || {}; return Object.assign(optionsConnectionParams, executorConnectionParams); }, ...clientOptionsOrClient, }); if (clientOptionsOrClient.onClient) { clientOptionsOrClient.onClient(graphqlWSClient); } } return function GraphQLWSExecutor(executionRequest) { const { document, variables, operationName, extensions, operationType = (0, utils_1.getOperationASTFromRequest)(executionRequest).operation, } = executionRequest; // additional connection params can be supplied through the "connectionParams" field in extensions. // TODO: connection params only from the FIRST operation in lazy mode will be used (detect connectionParams changes and reconnect, too implicit?) if (extensions?.['connectionParams'] && typeof extensions?.['connectionParams'] === 'object') { executorConnectionParams = Object.assign(executorConnectionParams, extensions['connectionParams']); } const query = (0, graphql_1.print)(document); const iterableIterator = graphqlWSClient.iterate({ query, variables, operationName, extensions, }); if (operationType === 'subscription') { return iterableIterator; } return iterableIterator.next().then(({ value }) => value); }; } exports.buildGraphQLWSExecutor = buildGraphQLWSExecutor;