Socket
Socket
Sign inDemoInstall

graphql-ws

Package Overview
Dependencies
0
Maintainers
1
Versions
103
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 5.5.0 to 5.5.1

14

lib/client.js

@@ -143,3 +143,3 @@ "use strict";

if (socket.readyState === WebSocketImpl.OPEN) {
socket.send(common_1.stringifyMessage({ type: common_1.MessageType.Ping }));
socket.send((0, common_1.stringifyMessage)({ type: common_1.MessageType.Ping }));
emitter.emit('ping', false, undefined);

@@ -167,3 +167,3 @@ }

: connectionParams;
socket.send(common_1.stringifyMessage(payload
socket.send((0, common_1.stringifyMessage)(payload
? {

@@ -192,3 +192,3 @@ type: common_1.MessageType.ConnectionInit,

try {
const message = common_1.parseMessage(data, reviver);
const message = (0, common_1.parseMessage)(data, reviver);
emitter.emit('message', message);

@@ -202,3 +202,3 @@ if (message.type === 'ping' || message.type === 'pong') {

// respond with pong on ping
socket.send(common_1.stringifyMessage(message.payload
socket.send((0, common_1.stringifyMessage)(message.payload
? {

@@ -365,3 +365,3 @@ type: common_1.MessageType.Pong,

});
socket.send(common_1.stringifyMessage({
socket.send((0, common_1.stringifyMessage)({
id,

@@ -374,3 +374,3 @@ type: common_1.MessageType.Subscribe,

// if not completed already and socket is open, send complete message to server on release
socket.send(common_1.stringifyMessage({
socket.send((0, common_1.stringifyMessage)({
id,

@@ -419,3 +419,3 @@ type: common_1.MessageType.Complete,

function isLikeCloseEvent(val) {
return utils_1.isObject(val) && 'code' in val && 'reason' in val;
return (0, utils_1.isObject)(val) && 'code' in val && 'reason' in val;
}

@@ -422,0 +422,0 @@ function isFatalInternalCloseCode(code) {

@@ -57,5 +57,5 @@ "use strict";

function isMessage(val) {
if (utils_1.isObject(val)) {
if ((0, utils_1.isObject)(val)) {
// all messages must have the `type` prop
if (!utils_1.hasOwnStringProperty(val, 'type')) {
if (!(0, utils_1.hasOwnStringProperty)(val, 'type')) {
return false;

@@ -67,5 +67,5 @@ }

// the connection init message can have optional payload object
return (!utils_1.hasOwnProperty(val, 'payload') ||
return (!(0, utils_1.hasOwnProperty)(val, 'payload') ||
val.payload === undefined ||
utils_1.isObject(val.payload));
(0, utils_1.isObject)(val.payload));
case MessageType.ConnectionAck:

@@ -75,28 +75,28 @@ case MessageType.Ping:

// the connection ack, ping and pong messages can have optional payload object too
return (!utils_1.hasOwnProperty(val, 'payload') ||
return (!(0, utils_1.hasOwnProperty)(val, 'payload') ||
val.payload === undefined ||
utils_1.isObject(val.payload));
(0, utils_1.isObject)(val.payload));
case MessageType.Subscribe:
return (utils_1.hasOwnStringProperty(val, 'id') &&
utils_1.hasOwnObjectProperty(val, 'payload') &&
(!utils_1.hasOwnProperty(val.payload, 'operationName') ||
return ((0, utils_1.hasOwnStringProperty)(val, 'id') &&
(0, utils_1.hasOwnObjectProperty)(val, 'payload') &&
(!(0, utils_1.hasOwnProperty)(val.payload, 'operationName') ||
val.payload.operationName === undefined ||
val.payload.operationName === null ||
typeof val.payload.operationName === 'string') &&
utils_1.hasOwnStringProperty(val.payload, 'query') &&
(!utils_1.hasOwnProperty(val.payload, 'variables') ||
(0, utils_1.hasOwnStringProperty)(val.payload, 'query') &&
(!(0, utils_1.hasOwnProperty)(val.payload, 'variables') ||
val.payload.variables === undefined ||
val.payload.variables === null ||
utils_1.hasOwnObjectProperty(val.payload, 'variables')) &&
(!utils_1.hasOwnProperty(val.payload, 'extensions') ||
(0, utils_1.hasOwnObjectProperty)(val.payload, 'variables')) &&
(!(0, utils_1.hasOwnProperty)(val.payload, 'extensions') ||
val.payload.extensions === undefined ||
val.payload.extensions === null ||
utils_1.hasOwnObjectProperty(val.payload, 'extensions')));
(0, utils_1.hasOwnObjectProperty)(val.payload, 'extensions')));
case MessageType.Next:
return (utils_1.hasOwnStringProperty(val, 'id') &&
utils_1.hasOwnObjectProperty(val, 'payload'));
return ((0, utils_1.hasOwnStringProperty)(val, 'id') &&
(0, utils_1.hasOwnObjectProperty)(val, 'payload'));
case MessageType.Error:
return utils_1.hasOwnStringProperty(val, 'id') && utils_1.areGraphQLErrors(val.payload);
return (0, utils_1.hasOwnStringProperty)(val, 'id') && (0, utils_1.areGraphQLErrors)(val.payload);
case MessageType.Complete:
return utils_1.hasOwnStringProperty(val, 'id');
return (0, utils_1.hasOwnStringProperty)(val, 'id');
default:

@@ -103,0 +103,0 @@ return false;

@@ -59,3 +59,3 @@ "use strict";

try {
message = common_1.parseMessage(data, reviver);
message = (0, common_1.parseMessage)(data, reviver);
}

@@ -71,3 +71,3 @@ catch (err) {

ctx.connectionInitReceived = true;
if (utils_1.isObject(message.payload))
if ((0, utils_1.isObject)(message.payload))
// @ts-expect-error: I can write

@@ -78,3 +78,3 @@ ctx.connectionParams = message.payload;

return socket.close(common_1.CloseCode.Forbidden, 'Forbidden');
await socket.send(common_1.stringifyMessage(utils_1.isObject(permittedOrPayload)
await socket.send((0, common_1.stringifyMessage)((0, utils_1.isObject)(permittedOrPayload)
? {

@@ -96,3 +96,3 @@ type: common_1.MessageType.ConnectionAck,

return await socket.onPing(message.payload);
await socket.send(common_1.stringifyMessage(message.payload
await socket.send((0, common_1.stringifyMessage)(message.payload
? { type: common_1.MessageType.Pong, payload: message.payload }

@@ -126,3 +126,3 @@ : {

nextMessage = Object.assign(Object.assign({}, nextMessage), { payload: maybeResult });
await socket.send(common_1.stringifyMessage(nextMessage, replacer));
await socket.send((0, common_1.stringifyMessage)(nextMessage, replacer));
},

@@ -138,3 +138,3 @@ error: async (errors) => {

errorMessage = Object.assign(Object.assign({}, errorMessage), { payload: maybeErrors });
await socket.send(common_1.stringifyMessage(errorMessage, replacer));
await socket.send((0, common_1.stringifyMessage)(errorMessage, replacer));
},

@@ -148,3 +148,3 @@ complete: async (notifyClient) => {

if (notifyClient)
await socket.send(common_1.stringifyMessage(completeMessage, replacer));
await socket.send((0, common_1.stringifyMessage)(completeMessage, replacer));
},

@@ -155,3 +155,3 @@ };

if (maybeExecArgsOrErrors) {
if (utils_1.areGraphQLErrors(maybeExecArgsOrErrors))
if ((0, utils_1.areGraphQLErrors)(maybeExecArgsOrErrors))
return await emit.error(maybeExecArgsOrErrors);

@@ -170,3 +170,3 @@ else if (Array.isArray(maybeExecArgsOrErrors))

operationName: payload.operationName,
document: graphql_1.parse(payload.query),
document: (0, graphql_1.parse)(payload.query),
variableValues: payload.variables,

@@ -181,3 +181,3 @@ };

}
const operationAST = graphql_1.getOperationAST(execArgs.document, execArgs.operationName);
const operationAST = (0, graphql_1.getOperationAST)(execArgs.document, execArgs.operationName);
if (!operationAST)

@@ -207,7 +207,7 @@ return await emit.error([

operationResult = maybeResult;
if (utils_1.isAsyncIterable(operationResult)) {
if ((0, utils_1.isAsyncIterable)(operationResult)) {
/** multiple emitted results */
if (!(id in ctx.subscriptions)) {
// subscription was completed/canceled before the operation settled
if (utils_1.isAsyncGenerator(operationResult))
if ((0, utils_1.isAsyncGenerator)(operationResult))
operationResult.return(undefined);

@@ -247,3 +247,3 @@ }

const subscription = ctx.subscriptions[message.id];
if (utils_1.isAsyncGenerator(subscription))
if ((0, utils_1.isAsyncGenerator)(subscription))
await subscription.return(undefined);

@@ -262,3 +262,3 @@ delete ctx.subscriptions[message.id]; // deleting the subscription means no further activity should take place

for (const sub of Object.values(ctx.subscriptions)) {
if (utils_1.isAsyncGenerator(sub))
if ((0, utils_1.isAsyncGenerator)(sub))
await sub.return(undefined);

@@ -265,0 +265,0 @@ }

@@ -22,3 +22,3 @@ "use strict";

const isProd = process.env.NODE_ENV === 'production';
const server = server_1.makeServer(options);
const server = (0, server_1.makeServer)(options);
return (connection, request) => {

@@ -51,2 +51,4 @@ const { socket } = connection;

send: (data) => new Promise((resolve, reject) => {
if (socket.readyState !== socket.OPEN)
return resolve();
socket.send(data, (err) => (err ? reject(err) : resolve()));

@@ -60,3 +62,9 @@ }),

catch (err) {
socket.close(common_1.CloseCode.InternalServerError, isProd ? 'Internal server error' : err.message);
console.error('Internal error occurred during message handling. ' +
'Please check your implementation.', err);
socket.close(common_1.CloseCode.InternalServerError,
// close reason should fit in one frame https://datatracker.ietf.org/doc/html/rfc6455#section-5.2
isProd || err.message.length > 123
? 'Internal server error'
: err.message);
}

@@ -63,0 +71,0 @@ }),

@@ -22,3 +22,3 @@ "use strict";

const isProd = process.env.NODE_ENV === 'production';
const server = server_1.makeServer(options);
const server = (0, server_1.makeServer)(options);
const clients = new Map();

@@ -118,3 +118,9 @@ let onDrain = () => {

catch (err) {
socket.end(common_1.CloseCode.InternalServerError, isProd ? 'Internal server error' : err.message);
console.error('Internal error occurred during message handling. ' +
'Please check your implementation.', err);
socket.end(common_1.CloseCode.InternalServerError,
// close reason should fit in one frame https://datatracker.ietf.org/doc/html/rfc6455#section-5.2
isProd || err.message.length > 123
? 'Internal server error'
: err.message);
}

@@ -121,0 +127,0 @@ },

@@ -22,3 +22,3 @@ "use strict";

const isProd = process.env.NODE_ENV === 'production';
const server = server_1.makeServer(options);
const server = (0, server_1.makeServer)(options);
ws.on('error', (err) => {

@@ -64,2 +64,4 @@ // catch the first thrown error and re-throw it once all clients have been notified

send: (data) => new Promise((resolve, reject) => {
if (socket.readyState !== socket.OPEN)
return resolve();
socket.send(data, (err) => (err ? reject(err) : resolve()));

@@ -73,3 +75,9 @@ }),

catch (err) {
socket.close(common_1.CloseCode.InternalServerError, isProd ? 'Internal server error' : err.message);
console.error('Internal error occurred during message handling. ' +
'Please check your implementation.', err);
socket.close(common_1.CloseCode.InternalServerError,
// close reason should fit in one frame https://datatracker.ietf.org/doc/html/rfc6455#section-5.2
isProd || err.message.length > 123
? 'Internal server error'
: err.message);
}

@@ -76,0 +84,0 @@ }),

{
"name": "graphql-ws",
"version": "5.5.0",
"version": "5.5.1",
"description": "Coherent, zero-dependency, lazy, simple, GraphQL over WebSocket Protocol compliant server and client",

@@ -72,2 +72,4 @@ "keywords": [

"test": "jest",
"bench:start-servers": "NODE_ENV=production node benchmark/servers/index.mjs",
"bench": "k6 run benchmark/k6.mjs",
"build:esm": "tsc -b tsconfig.esm.json && node scripts/esm-post-process.js",

@@ -83,37 +85,39 @@ "build:cjs": "tsc -b tsconfig.cjs.json",

"devDependencies": {
"@babel/core": "^7.15.5",
"@babel/core": "^7.15.8",
"@babel/plugin-proposal-class-properties": "^7.14.5",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5",
"@babel/plugin-proposal-object-rest-spread": "^7.14.7",
"@babel/plugin-proposal-object-rest-spread": "^7.15.6",
"@babel/plugin-proposal-optional-chaining": "^7.14.5",
"@babel/preset-env": "^7.15.4",
"@babel/preset-env": "^7.15.8",
"@babel/preset-typescript": "^7.15.0",
"@rollup/plugin-typescript": "^8.2.5",
"@semantic-release/changelog": "^5.0.1",
"@semantic-release/git": "^9.0.1",
"@rollup/plugin-typescript": "^8.3.0",
"@semantic-release/changelog": "^6.0.0",
"@semantic-release/git": "^10.0.0",
"@types/jest": "^26.0.24",
"@types/ws": "^7.4.7",
"@typescript-eslint/eslint-plugin": "^4.31.0",
"@typescript-eslint/parser": "^4.31.0",
"babel-jest": "^27.1.1",
"eslint": "^7.32.0",
"@types/ws": "^8.2.0",
"@typescript-eslint/eslint-plugin": "^5.1.0",
"@typescript-eslint/parser": "^5.1.0",
"babel-jest": "^27.3.1",
"eslint": "^8.0.1",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"fastify": "^3.21.0",
"fastify": "^3.22.0",
"fastify-websocket": "^4.0.0",
"glob": "^7.1.7",
"graphql": "16.0.0-rc.2.experimental-stream-defer.3",
"jest": "^27.1.1",
"prettier": "^2.3.2",
"glob": "^7.2.0",
"graphql": "16.0.0-rc.5",
"jest": "^27.3.1",
"prettier": "^2.4.1",
"replacestream": "^4.0.3",
"rollup": "^2.56.3",
"rollup": "^2.58.0",
"rollup-plugin-terser": "^7.0.2",
"semantic-release": "^17.4.7",
"semantic-release": "^18.0.0",
"subscriptions-transport-ws": "^0.9.19",
"tslib": "^2.3.1",
"typedoc": "^0.21.9",
"typedoc-plugin-markdown": "^3.10.4",
"typescript": "4.3.5",
"typedoc": "0.22.6",
"typedoc-plugin-markdown": "^3.11.3",
"typescript": "^4.4.4",
"uWebSockets.js": "uNetworking/uWebSockets.js#v19.3.0",
"ws": "^8.2.1"
"ws": "^8.2.3",
"ws7": "npm:ws@^7.5.5"
}
}

@@ -10,2 +10,4 @@ <div align="center">

<i>Use [Server-sent events (SSE)](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) instead? Check out <b>[graphql-sse](https://github.com/enisdenjo/graphql-sse)</b>!</i>
<br />

@@ -228,3 +230,3 @@ </div>

function subscribe<T>(payload: SubscribePayload): AsyncIterableIterator<T> {
function subscribe<T>(payload: SubscribePayload): AsyncGenerator<T> {
let deferred: {

@@ -266,4 +268,4 @@ resolve: (done: boolean) => void;

async throw(err) {
throw err
}
throw err;
},
async return() {

@@ -693,2 +695,37 @@ dispose();

<details id="supported-check">
<summary><a href="#supported-check">🔗</a> Client usage supported check</summary>
```ts
import { createClient } from 'graphql-ws';
function supportsGraphQLTransportWS(url: string): Promise<boolean> {
return new Promise((resolve) => {
const client = createClient({
url,
retryAttempts: 0, // fail immediately
lazy: false, // connect as soon as the client is created
on: {
closed: () => resolve(false), // connection rejected, probably not supported
connected: () => {
resolve(true); // connected = supported
client.dispose(); // dispose after check
},
},
});
});
}
const supported = await supportsGraphQLTransportWS(
'ws://some.unknown:4000/enpoint',
);
if (supported) {
// use graphql-ws
} else {
// fallback (use subscriptions-transport-ws?)
}
```
</details>
<details id="browser">

@@ -1475,2 +1512,3 @@ <summary><a href="#browser">🔗</a> Client usage in browser</summary>

import { useServer } from 'graphql-ws/lib/use/ws';
import { CloseCode } from 'graphql-ws';
import { schema } from './my-graphql-schema';

@@ -1497,3 +1535,3 @@ import { isTokenValid } from './my-auth';

if (!(await isTokenValid(ctx.connectionParams?.token)))
return ctx.extra.socket.close(4403, 'Forbidden');
return ctx.extra.socket.close(CloseCode.Forbidden, 'Forbidden');
},

@@ -1503,3 +1541,3 @@ onNext: async (ctx) => {

if (!(await isTokenValid(ctx.connectionParams?.token)))
return ctx.extra.socket.close(4403, 'Forbidden');
return ctx.extra.socket.close(CloseCode.Forbidden, 'Forbidden');
},

@@ -1558,3 +1596,3 @@ },

if (socket.readyState === WebSocket.OPEN)
socket.close(CloseCode.Unauthorized, 'Unauthorized');
socket.close(CloseCode.Forbidden, 'Forbidden');
}, getCurrentTokenExpiresIn());

@@ -1561,0 +1599,0 @@ },

@@ -5,3 +5,3 @@ (function (global, factory) {

(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.graphqlWs = {}));
}(this, (function (exports) { 'use strict';
})(this, (function (exports) { 'use strict';

@@ -592,2 +592,2 @@ // Extremely small optimisation, reduces runtime prototype traversal

})));
}));

@@ -1,1 +0,1 @@

!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e="undefined"!=typeof globalThis?globalThis:e||self).graphqlWs={})}(this,(function(e){"use strict";const o=Object.prototype.hasOwnProperty;function n(e){return"object"==typeof e&&null!==e}function t(e,n){return o.call(e,n)}function r(e,t){return o.call(e,t)&&n(e[t])}function i(e,n){return o.call(e,n)&&"string"==typeof e[n]}const a="graphql-transport-ws";var s,c;function l(o){if(n(o)){if(!i(o,"type"))return!1;switch(o.type){case e.MessageType.ConnectionInit:return!t(o,"payload")||void 0===o.payload||n(o.payload);case e.MessageType.ConnectionAck:case e.MessageType.Ping:case e.MessageType.Pong:return!t(o,"payload")||void 0===o.payload||n(o.payload);case e.MessageType.Subscribe:return i(o,"id")&&r(o,"payload")&&(!t(o.payload,"operationName")||void 0===o.payload.operationName||null===o.payload.operationName||"string"==typeof o.payload.operationName)&&i(o.payload,"query")&&(!t(o.payload,"variables")||void 0===o.payload.variables||null===o.payload.variables||r(o.payload,"variables"))&&(!t(o.payload,"extensions")||void 0===o.payload.extensions||null===o.payload.extensions||r(o.payload,"extensions"));case e.MessageType.Next:return i(o,"id")&&r(o,"payload");case e.MessageType.Error:return i(o,"id")&&(a=o.payload,Array.isArray(a)&&a.length>0&&a.every((e=>"message"in e)));case e.MessageType.Complete:return i(o,"id");default:return!1}}var a;return!1}function d(e,o){if(l(e))return e;if("string"!=typeof e)throw new Error("Message not parsable");const n=JSON.parse(e,o);if(!l(n))throw new Error("Invalid message");return n}function p(e,o){if(!l(e))throw new Error("Cannot stringify invalid message");return JSON.stringify(e,o)}function u(e){return n(e)&&"code"in e&&"reason"in e}e.CloseCode=void 0,(s=e.CloseCode||(e.CloseCode={}))[s.InternalServerError=4500]="InternalServerError",s[s.BadRequest=4400]="BadRequest",s[s.Unauthorized=4401]="Unauthorized",s[s.Forbidden=4403]="Forbidden",s[s.SubprotocolNotAcceptable=4406]="SubprotocolNotAcceptable",s[s.ConnectionInitialisationTimeout=4408]="ConnectionInitialisationTimeout",s[s.ConnectionAcknowledgementTimeout=4504]="ConnectionAcknowledgementTimeout",s[s.SubscriberAlreadyExists=4409]="SubscriberAlreadyExists",s[s.TooManyInitialisationRequests=4429]="TooManyInitialisationRequests",e.MessageType=void 0,(c=e.MessageType||(e.MessageType={})).ConnectionInit="connection_init",c.ConnectionAck="connection_ack",c.Ping="ping",c.Pong="pong",c.Subscribe="subscribe",c.Next="next",c.Error="error",c.Complete="complete",e.GRAPHQL_TRANSPORT_WS_PROTOCOL=a,e.createClient=function(o){const{url:n,connectionParams:t,lazy:r=!0,onNonLazyError:i=console.error,lazyCloseTimeout:s=0,keepAlive:c=0,disablePong:l,connectionAckWaitTimeout:y=0,retryAttempts:g=5,retryWait:f=async function(e){let o=1e3;for(let n=0;n<e;n++)o*=2;await new Promise((e=>setTimeout(e,o+Math.floor(2700*Math.random()+300))))},isFatalConnectionProblem:m=(e=>!u(e)),on:C,webSocketImpl:b,generateID:w=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(e=>{const o=16*Math.random()|0;return("x"==e?o:3&o|8).toString(16)}))},jsonMessageReplacer:x,jsonMessageReviver:v}=o;let T;if(b){if(!("function"==typeof(M=b)&&"constructor"in M&&"CLOSED"in M&&"CLOSING"in M&&"CONNECTING"in M&&"OPEN"in M))throw new Error("Invalid WebSocket implementation provided");T=b}else"undefined"!=typeof WebSocket?T=WebSocket:"undefined"!=typeof global?T=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&(T=window.WebSocket||window.MozWebSocket);var M;if(!T)throw new Error("WebSocket implementation missing");const S=T,h=(()=>{const e=(()=>{const e={};return{on:(o,n)=>(e[o]=n,()=>{delete e[o]}),emit(o){var n;"id"in o&&(null===(n=e[o.id])||void 0===n||n.call(e,o))}}})(),o={connecting:(null==C?void 0:C.connecting)?[C.connecting]:[],opened:(null==C?void 0:C.opened)?[C.opened]:[],connected:(null==C?void 0:C.connected)?[C.connected]:[],ping:(null==C?void 0:C.ping)?[C.ping]:[],pong:(null==C?void 0:C.pong)?[C.pong]:[],message:(null==C?void 0:C.message)?[e.emit,C.message]:[e.emit],closed:(null==C?void 0:C.closed)?[C.closed]:[],error:(null==C?void 0:C.error)?[C.error]:[]};return{onMessage:e.on,on(e,n){const t=o[e];return t.push(n),()=>{t.splice(t.indexOf(n),1)}},emit(e,...n){for(const t of o[e])t(...n)}}})();let E,N=0,P=!1,A=0,k=!1;async function I(){const[o,r]=await(null!=E?E:E=new Promise(((o,r)=>(async()=>{if(P){if(await f(A),!N)return E=void 0,r({code:1e3,reason:"All Subscriptions Gone"});A++}h.emit("connecting");const i=new S("function"==typeof n?await n():n,a);let s,u;function g(){isFinite(c)&&c>0&&(clearTimeout(u),u=setTimeout((()=>{i.readyState===S.OPEN&&(i.send(p({type:e.MessageType.Ping})),h.emit("ping",!1,void 0))}),c))}i.onerror=e=>{h.emit("error",e)},i.onclose=e=>{E=void 0,clearTimeout(s),clearTimeout(u),h.emit("closed",e),r(e)},i.onopen=async()=>{try{h.emit("opened",i);const o="function"==typeof t?await t():t;i.send(p(o?{type:e.MessageType.ConnectionInit,payload:o}:{type:e.MessageType.ConnectionInit},x)),isFinite(y)&&y>0&&(s=setTimeout((()=>{i.close(e.CloseCode.ConnectionAcknowledgementTimeout,"Connection acknowledgement timeout")}),y)),g()}catch(o){i.close(e.CloseCode.BadRequest,o instanceof Error?o.message:new Error(o).message)}};let m=!1;i.onmessage=({data:n})=>{try{const t=d(n,v);if(h.emit("message",t),"ping"===t.type||"pong"===t.type)return h.emit(t.type,!0,t.payload),void("pong"===t.type?g():l||(i.send(p(t.payload?{type:e.MessageType.Pong,payload:t.payload}:{type:e.MessageType.Pong})),h.emit("pong",!1,t.payload)));if(m)return;if(t.type!==e.MessageType.ConnectionAck)throw new Error(`First message cannot be of type ${t.type}`);clearTimeout(s),m=!0,h.emit("connected",i,t.payload),P=!1,A=0,o([i,new Promise(((e,o)=>i.addEventListener("close",o)))])}catch(o){i.close(e.CloseCode.BadRequest,o instanceof Error?o.message:new Error(o).message)}}})())));o.readyState===S.CLOSING&&await r;let i=()=>{};const u=new Promise((e=>i=e));return[o,i,Promise.race([u.then((()=>{if(!N){const e=()=>o.close(1e3,"Normal Closure");isFinite(s)&&s>0?setTimeout((()=>{N||o.readyState!==S.OPEN||e()}),s):e()}})),r])]}function O(o){if(u(o)&&(n=o.code,![1e3,1001,1006,1005,1012,1013,1013].includes(n)&&n>=1e3&&n<=1999||[e.CloseCode.InternalServerError,e.CloseCode.BadRequest,e.CloseCode.Unauthorized,e.CloseCode.SubprotocolNotAcceptable,e.CloseCode.SubscriberAlreadyExists,e.CloseCode.TooManyInitialisationRequests].includes(o.code)))throw o;var n;if(k)return!1;if(u(o)&&1e3===o.code)return N>0;if(!g||A>=g)throw o;if(m(o))throw o;return P=!0}return r||(async()=>{for(N++;;)try{const[,,e]=await I();await e}catch(e){try{if(!O(e))return}catch(e){return null==i?void 0:i(e)}}})(),{on:h.on,subscribe(o,n){const t=w();let r=!1,i=!1,a=()=>{N--,r=!0};return(async()=>{for(N++;;)try{const[s,c,l]=await I();if(r)return c();const d=h.onMessage(t,(o=>{switch(o.type){case e.MessageType.Next:return void n.next(o.payload);case e.MessageType.Error:return i=!0,r=!0,n.error(o.payload),void a();case e.MessageType.Complete:return r=!0,void a()}}));return s.send(p({id:t,type:e.MessageType.Subscribe,payload:o},x)),a=()=>{r||s.readyState!==S.OPEN||s.send(p({id:t,type:e.MessageType.Complete},x)),N--,r=!0,c()},void await l.finally(d)}catch(e){if(!O(e))return}})().catch(n.error).then((()=>{i||n.complete()})),()=>{r||a()}},async dispose(){if(k=!0,E){const[e]=await E;e.close(1e3,"Normal Closure")}}}},e.isMessage=l,e.parseMessage=d,e.stringifyMessage=p,Object.defineProperty(e,"__esModule",{value:!0})}));
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e="undefined"!=typeof globalThis?globalThis:e||self).graphqlWs={})}(this,(function(e){"use strict";const o=Object.prototype.hasOwnProperty;function n(e){return"object"==typeof e&&null!==e}function t(e,n){return o.call(e,n)}function r(e,t){return o.call(e,t)&&n(e[t])}function i(e,n){return o.call(e,n)&&"string"==typeof e[n]}const a="graphql-transport-ws";var s,c;function l(o){if(n(o)){if(!i(o,"type"))return!1;switch(o.type){case e.MessageType.ConnectionInit:case e.MessageType.ConnectionAck:case e.MessageType.Ping:case e.MessageType.Pong:return!t(o,"payload")||void 0===o.payload||n(o.payload);case e.MessageType.Subscribe:return i(o,"id")&&r(o,"payload")&&(!t(o.payload,"operationName")||void 0===o.payload.operationName||null===o.payload.operationName||"string"==typeof o.payload.operationName)&&i(o.payload,"query")&&(!t(o.payload,"variables")||void 0===o.payload.variables||null===o.payload.variables||r(o.payload,"variables"))&&(!t(o.payload,"extensions")||void 0===o.payload.extensions||null===o.payload.extensions||r(o.payload,"extensions"));case e.MessageType.Next:return i(o,"id")&&r(o,"payload");case e.MessageType.Error:return i(o,"id")&&(a=o.payload,Array.isArray(a)&&a.length>0&&a.every((e=>"message"in e)));case e.MessageType.Complete:return i(o,"id");default:return!1}}var a;return!1}function d(e,o){if(l(e))return e;if("string"!=typeof e)throw new Error("Message not parsable");const n=JSON.parse(e,o);if(!l(n))throw new Error("Invalid message");return n}function p(e,o){if(!l(e))throw new Error("Cannot stringify invalid message");return JSON.stringify(e,o)}function u(e){return n(e)&&"code"in e&&"reason"in e}e.CloseCode=void 0,(s=e.CloseCode||(e.CloseCode={}))[s.InternalServerError=4500]="InternalServerError",s[s.BadRequest=4400]="BadRequest",s[s.Unauthorized=4401]="Unauthorized",s[s.Forbidden=4403]="Forbidden",s[s.SubprotocolNotAcceptable=4406]="SubprotocolNotAcceptable",s[s.ConnectionInitialisationTimeout=4408]="ConnectionInitialisationTimeout",s[s.ConnectionAcknowledgementTimeout=4504]="ConnectionAcknowledgementTimeout",s[s.SubscriberAlreadyExists=4409]="SubscriberAlreadyExists",s[s.TooManyInitialisationRequests=4429]="TooManyInitialisationRequests",e.MessageType=void 0,(c=e.MessageType||(e.MessageType={})).ConnectionInit="connection_init",c.ConnectionAck="connection_ack",c.Ping="ping",c.Pong="pong",c.Subscribe="subscribe",c.Next="next",c.Error="error",c.Complete="complete",e.GRAPHQL_TRANSPORT_WS_PROTOCOL=a,e.createClient=function(o){const{url:n,connectionParams:t,lazy:r=!0,onNonLazyError:i=console.error,lazyCloseTimeout:s=0,keepAlive:c=0,disablePong:l,connectionAckWaitTimeout:y=0,retryAttempts:g=5,retryWait:f=async function(e){let o=1e3;for(let n=0;n<e;n++)o*=2;await new Promise((e=>setTimeout(e,o+Math.floor(2700*Math.random()+300))))},isFatalConnectionProblem:m=(e=>!u(e)),on:C,webSocketImpl:b,generateID:w=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(e=>{const o=16*Math.random()|0;return("x"==e?o:3&o|8).toString(16)}))},jsonMessageReplacer:x,jsonMessageReviver:v}=o;let T;if(b){if(!("function"==typeof(M=b)&&"constructor"in M&&"CLOSED"in M&&"CLOSING"in M&&"CONNECTING"in M&&"OPEN"in M))throw new Error("Invalid WebSocket implementation provided");T=b}else"undefined"!=typeof WebSocket?T=WebSocket:"undefined"!=typeof global?T=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&(T=window.WebSocket||window.MozWebSocket);var M;if(!T)throw new Error("WebSocket implementation missing");const S=T,h=(()=>{const e=(()=>{const e={};return{on:(o,n)=>(e[o]=n,()=>{delete e[o]}),emit(o){var n;"id"in o&&(null===(n=e[o.id])||void 0===n||n.call(e,o))}}})(),o={connecting:(null==C?void 0:C.connecting)?[C.connecting]:[],opened:(null==C?void 0:C.opened)?[C.opened]:[],connected:(null==C?void 0:C.connected)?[C.connected]:[],ping:(null==C?void 0:C.ping)?[C.ping]:[],pong:(null==C?void 0:C.pong)?[C.pong]:[],message:(null==C?void 0:C.message)?[e.emit,C.message]:[e.emit],closed:(null==C?void 0:C.closed)?[C.closed]:[],error:(null==C?void 0:C.error)?[C.error]:[]};return{onMessage:e.on,on(e,n){const t=o[e];return t.push(n),()=>{t.splice(t.indexOf(n),1)}},emit(e,...n){for(const t of o[e])t(...n)}}})();let E,N=0,P=!1,A=0,k=!1;async function I(){const[o,r]=await(null!=E?E:E=new Promise(((o,r)=>(async()=>{if(P){if(await f(A),!N)return E=void 0,r({code:1e3,reason:"All Subscriptions Gone"});A++}h.emit("connecting");const i=new S("function"==typeof n?await n():n,a);let s,u;function g(){isFinite(c)&&c>0&&(clearTimeout(u),u=setTimeout((()=>{i.readyState===S.OPEN&&(i.send(p({type:e.MessageType.Ping})),h.emit("ping",!1,void 0))}),c))}i.onerror=e=>{h.emit("error",e)},i.onclose=e=>{E=void 0,clearTimeout(s),clearTimeout(u),h.emit("closed",e),r(e)},i.onopen=async()=>{try{h.emit("opened",i);const o="function"==typeof t?await t():t;i.send(p(o?{type:e.MessageType.ConnectionInit,payload:o}:{type:e.MessageType.ConnectionInit},x)),isFinite(y)&&y>0&&(s=setTimeout((()=>{i.close(e.CloseCode.ConnectionAcknowledgementTimeout,"Connection acknowledgement timeout")}),y)),g()}catch(o){i.close(e.CloseCode.BadRequest,o instanceof Error?o.message:new Error(o).message)}};let m=!1;i.onmessage=({data:n})=>{try{const t=d(n,v);if(h.emit("message",t),"ping"===t.type||"pong"===t.type)return h.emit(t.type,!0,t.payload),void("pong"===t.type?g():l||(i.send(p(t.payload?{type:e.MessageType.Pong,payload:t.payload}:{type:e.MessageType.Pong})),h.emit("pong",!1,t.payload)));if(m)return;if(t.type!==e.MessageType.ConnectionAck)throw new Error(`First message cannot be of type ${t.type}`);clearTimeout(s),m=!0,h.emit("connected",i,t.payload),P=!1,A=0,o([i,new Promise(((e,o)=>i.addEventListener("close",o)))])}catch(o){i.close(e.CloseCode.BadRequest,o instanceof Error?o.message:new Error(o).message)}}})())));o.readyState===S.CLOSING&&await r;let i=()=>{};const u=new Promise((e=>i=e));return[o,i,Promise.race([u.then((()=>{if(!N){const e=()=>o.close(1e3,"Normal Closure");isFinite(s)&&s>0?setTimeout((()=>{N||o.readyState!==S.OPEN||e()}),s):e()}})),r])]}function O(o){if(u(o)&&(n=o.code,![1e3,1001,1006,1005,1012,1013,1013].includes(n)&&n>=1e3&&n<=1999||[e.CloseCode.InternalServerError,e.CloseCode.BadRequest,e.CloseCode.Unauthorized,e.CloseCode.SubprotocolNotAcceptable,e.CloseCode.SubscriberAlreadyExists,e.CloseCode.TooManyInitialisationRequests].includes(o.code)))throw o;var n;if(k)return!1;if(u(o)&&1e3===o.code)return N>0;if(!g||A>=g)throw o;if(m(o))throw o;return P=!0}return r||(async()=>{for(N++;;)try{const[,,e]=await I();await e}catch(e){try{if(!O(e))return}catch(e){return null==i?void 0:i(e)}}})(),{on:h.on,subscribe(o,n){const t=w();let r=!1,i=!1,a=()=>{N--,r=!0};return(async()=>{for(N++;;)try{const[s,c,l]=await I();if(r)return c();const d=h.onMessage(t,(o=>{switch(o.type){case e.MessageType.Next:return void n.next(o.payload);case e.MessageType.Error:return i=!0,r=!0,n.error(o.payload),void a();case e.MessageType.Complete:return r=!0,void a()}}));return s.send(p({id:t,type:e.MessageType.Subscribe,payload:o},x)),a=()=>{r||s.readyState!==S.OPEN||s.send(p({id:t,type:e.MessageType.Complete},x)),N--,r=!0,c()},void await l.finally(d)}catch(e){if(!O(e))return}})().catch(n.error).then((()=>{i||n.complete()})),()=>{r||a()}},async dispose(){if(k=!0,E){const[e]=await E;e.close(1e3,"Normal Closure")}}}},e.isMessage=l,e.parseMessage=d,e.stringifyMessage=p,Object.defineProperty(e,"__esModule",{value:!0})}));

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc