UNPKG

@n1ru4l/socket-io-graphql-client

Version:

[![npm version](https://img.shields.io/npm/v/@n1ru4l/socket-io-graphql-client.svg)](https://www.npmjs.com/package/@n1ru4l/socket-io-graphql-client) [![npm downloads](https://img.shields.io/npm/dm/@n1ru4l/socket-io-graphql-client.svg)](https://www.npmjs.co

74 lines (73 loc) 2.4 kB
import { makePushPullAsyncIterableIterator, withHandlers, } from "@n1ru4l/push-pull-async-iterable-iterator"; export const createSocketIOGraphQLClient = (socket) => { let currentOperationId = 0; const operations = new Map(); const onExecutionResult = ({ id, isFinal, ...result }) => { var _a, _b; const record = operations.get(id); if (!record) { return; } record.publishValue(result); if (isFinal) { (_b = (_a = record.iterator).return) === null || _b === void 0 ? void 0 : _b.call(_a); operations.delete(id); } }; let isOffline = false; const onDisconnect = () => { isOffline = true; }; const onConnect = () => { if (isOffline) { isOffline = false; Array.from(operations.values()).forEach((record) => { record.execute(); }); } }; socket.on("@graphql/result", onExecutionResult); socket.on("connect", onConnect); socket.on("disconnect", onDisconnect); const destroy = () => { socket.off("@graphql/result", onExecutionResult); socket.off("connect", onConnect); socket.off("disconnect", onDisconnect); }; const execute = ({ operation, variables, operationName, extensions, }) => { const operationId = currentOperationId; currentOperationId = currentOperationId + 1; const { asyncIterableIterator: source, pushValue: publishValue } = makePushPullAsyncIterableIterator(); const stream = withHandlers(source, () => { if (operations.delete(operationId) === false) { return; } socket.emit("@graphql/unsubscribe", { id: operationId, }); source.return(); }); const record = { execute: () => { socket.emit("@graphql/execute", { id: operationId, operationName, operation, variables, extensions, }); }, iterator: stream, publishValue, }; operations.set(operationId, record); if (!isOffline) { record.execute(); } return stream; }; return { execute, destroy, }; };