🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more
Socket
Book a DemoInstallSign in
Socket

graphql-ws

Package Overview
Dependencies
Maintainers
1
Versions
165
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

graphql-ws - npm Package Compare versions

Comparing version

to
5.9.0

12

lib/common.d.ts

@@ -155,6 +155,16 @@ /**

/**
* Checks if the provided value is a message.
* Validates the message against the GraphQL over WebSocket Protocol.
*
* Invalid messages will throw descriptive errors.
*
* @category Common
*/
export declare function validateMessage(val: unknown): Message;
/**
* Checks if the provided value is a valid GraphQL over WebSocket message.
*
* @deprecated Use `validateMessage` instead.
*
* @category Common
*/
export declare function isMessage(val: unknown): val is Message;

@@ -161,0 +171,0 @@ /**

168

lib/common.js

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

Object.defineProperty(exports, "__esModule", { value: true });
exports.stringifyMessage = exports.parseMessage = exports.isMessage = exports.MessageType = exports.CloseCode = exports.DEPRECATED_GRAPHQL_WS_PROTOCOL = exports.GRAPHQL_TRANSPORT_WS_PROTOCOL = void 0;
exports.stringifyMessage = exports.parseMessage = exports.isMessage = exports.validateMessage = exports.MessageType = exports.CloseCode = exports.DEPRECATED_GRAPHQL_WS_PROTOCOL = exports.GRAPHQL_TRANSPORT_WS_PROTOCOL = void 0;
const utils_1 = require("./utils");

@@ -61,55 +61,108 @@ /**

/**
* Checks if the provided value is a message.
* Validates the message against the GraphQL over WebSocket Protocol.
*
* Invalid messages will throw descriptive errors.
*
* @category Common
*/
function isMessage(val) {
if ((0, utils_1.isObject)(val)) {
// all messages must have the `type` prop
if (!(0, utils_1.hasOwnStringProperty)(val, 'type')) {
return false;
function validateMessage(val) {
if (!(0, utils_1.isObject)(val)) {
throw new Error(`Message is expected to be an object, but got ${(0, utils_1.extendedTypeof)(val)}`);
}
if (!val.type) {
throw new Error(`Message is missing the 'type' property`);
}
if (typeof val.type !== 'string') {
throw new Error(`Message is expects the 'type' property to be a string, but got ${(0, utils_1.extendedTypeof)(val.type)}`);
}
switch (val.type) {
case MessageType.ConnectionInit:
case MessageType.ConnectionAck:
case MessageType.Ping:
case MessageType.Pong: {
if ('payload' in val && !(0, utils_1.isObject)(val.payload)) {
throw new Error(`"${val.type}" message expects the 'payload' property to be an object or missing, but got "${val.payload}"`);
}
break;
}
// validate other properties depending on the `type`
switch (val.type) {
case MessageType.ConnectionInit:
// the connection init message can have optional payload object
return (!(0, utils_1.hasOwnProperty)(val, 'payload') ||
val.payload === undefined ||
(0, utils_1.isObject)(val.payload));
case MessageType.ConnectionAck:
case MessageType.Ping:
case MessageType.Pong:
// the connection ack, ping and pong messages can have optional payload object too
return (!(0, utils_1.hasOwnProperty)(val, 'payload') ||
val.payload === undefined ||
(0, utils_1.isObject)(val.payload));
case MessageType.Subscribe:
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') &&
(0, utils_1.hasOwnStringProperty)(val.payload, 'query') &&
(!(0, utils_1.hasOwnProperty)(val.payload, 'variables') ||
val.payload.variables === undefined ||
val.payload.variables === null ||
(0, utils_1.hasOwnObjectProperty)(val.payload, 'variables')) &&
(!(0, utils_1.hasOwnProperty)(val.payload, 'extensions') ||
val.payload.extensions === undefined ||
val.payload.extensions === null ||
(0, utils_1.hasOwnObjectProperty)(val.payload, 'extensions')));
case MessageType.Next:
return ((0, utils_1.hasOwnStringProperty)(val, 'id') &&
(0, utils_1.hasOwnObjectProperty)(val, 'payload'));
case MessageType.Error:
return (0, utils_1.hasOwnStringProperty)(val, 'id') && (0, utils_1.areGraphQLErrors)(val.payload);
case MessageType.Complete:
return (0, utils_1.hasOwnStringProperty)(val, 'id');
default:
return false;
case MessageType.Subscribe: {
if (typeof val.id !== 'string') {
throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${(0, utils_1.extendedTypeof)(val.id)}`);
}
if (!val.id) {
throw new Error(`"${val.type}" message requires a non-empty 'id' property`);
}
if (!(0, utils_1.isObject)(val.payload)) {
throw new Error(`"${val.type}" message expects the 'payload' property to be an object, but got ${(0, utils_1.extendedTypeof)(val.payload)}`);
}
if (typeof val.payload.query !== 'string') {
throw new Error(`"${val.type}" message payload expects the 'query' property to be a string, but got ${(0, utils_1.extendedTypeof)(val.payload.query)}`);
}
if (val.payload.variables != null && !(0, utils_1.isObject)(val.payload.variables)) {
throw new Error(`"${val.type}" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${(0, utils_1.extendedTypeof)(val.payload.variables)}`);
}
if (val.payload.operationName != null &&
(0, utils_1.extendedTypeof)(val.payload.operationName) !== 'string') {
throw new Error(`"${val.type}" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${(0, utils_1.extendedTypeof)(val.payload.operationName)}`);
}
if (val.payload.extensions != null && !(0, utils_1.isObject)(val.payload.extensions)) {
throw new Error(`"${val.type}" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${(0, utils_1.extendedTypeof)(val.payload.extensions)}`);
}
break;
}
case MessageType.Next: {
if (typeof val.id !== 'string') {
throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${(0, utils_1.extendedTypeof)(val.id)}`);
}
if (!val.id) {
throw new Error(`"${val.type}" message requires a non-empty 'id' property`);
}
if (!(0, utils_1.isObject)(val.payload)) {
throw new Error(`"${val.type}" message expects the 'payload' property to be an object, but got ${(0, utils_1.extendedTypeof)(val.payload)}`);
}
break;
}
case MessageType.Error: {
if (typeof val.id !== 'string') {
throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${(0, utils_1.extendedTypeof)(val.id)}`);
}
if (!val.id) {
throw new Error(`"${val.type}" message requires a non-empty 'id' property`);
}
if (!(0, utils_1.areGraphQLErrors)(val.payload)) {
throw new Error(`"${val.type}" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(val.payload)}`);
}
break;
}
case MessageType.Complete: {
if (typeof val.id !== 'string') {
throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${(0, utils_1.extendedTypeof)(val.id)}`);
}
if (!val.id) {
throw new Error(`"${val.type}" message requires a non-empty 'id' property`);
}
break;
}
default:
throw new Error(`Invalid message 'type' property "${val.type}"`);
}
return false;
return val;
}
exports.validateMessage = validateMessage;
/**
* Checks if the provided value is a valid GraphQL over WebSocket message.
*
* @deprecated Use `validateMessage` instead.
*
* @category Common
*/
function isMessage(val) {
try {
validateMessage(val);
return true;
}
catch (_a) {
return false;
}
}
exports.isMessage = isMessage;

@@ -122,13 +175,12 @@ /**

function parseMessage(data, reviver) {
if (isMessage(data)) {
return data;
try {
return validateMessage(data);
}
if (typeof data !== 'string') {
throw new Error('Message not parsable');
catch (_a) {
if (typeof data !== 'string') {
throw new Error('Only strings are parsable messages');
}
const message = JSON.parse(data, reviver);
return validateMessage(message);
}
const message = JSON.parse(data, reviver);
if (!isMessage(message)) {
throw new Error('Invalid message');
}
return message;
}

@@ -142,7 +194,5 @@ exports.parseMessage = parseMessage;

function stringifyMessage(msg, replacer) {
if (!isMessage(msg)) {
throw new Error('Cannot stringify invalid message');
}
validateMessage(msg);
return JSON.stringify(msg, replacer);
}
exports.stringifyMessage = stringifyMessage;

@@ -8,2 +8,4 @@ /**

/** @private */
export declare function extendedTypeof(val: unknown): 'string' | 'number' | 'bigint' | 'boolean' | 'symbol' | 'undefined' | 'object' | 'function' | 'array' | 'null';
/** @private */
export declare function isObject(val: unknown): val is Record<PropertyKey, unknown>;

@@ -16,10 +18,2 @@ /** @private */

export declare function areGraphQLErrors(obj: unknown): obj is readonly GraphQLError[];
/** @private */
export declare function hasOwnProperty<O extends Record<PropertyKey, unknown>, P extends PropertyKey>(obj: O, prop: P): obj is O & Record<P, unknown>;
/** @private */
export declare function hasOwnObjectProperty<O extends Record<PropertyKey, unknown>, P extends PropertyKey>(obj: O, prop: P): obj is O & Record<P, Record<PropertyKey, unknown>>;
/** @private */
export declare function hasOwnArrayProperty<O extends Record<PropertyKey, unknown>, P extends PropertyKey>(obj: O, prop: P): obj is O & Record<P, unknown[]>;
/** @private */
export declare function hasOwnStringProperty<O extends Record<PropertyKey, unknown>, P extends PropertyKey>(obj: O, prop: P): obj is O & Record<P, string>;
/**

@@ -26,0 +20,0 @@ * Limits the WebSocket close event reason to not exceed a length of one frame.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.limitCloseReason = exports.hasOwnStringProperty = exports.hasOwnArrayProperty = exports.hasOwnObjectProperty = exports.hasOwnProperty = exports.areGraphQLErrors = exports.isAsyncGenerator = exports.isAsyncIterable = exports.isObject = void 0;
// Extremely small optimisation, reduces runtime prototype traversal
const baseHasOwnProperty = Object.prototype.hasOwnProperty;
exports.limitCloseReason = exports.areGraphQLErrors = exports.isAsyncGenerator = exports.isAsyncIterable = exports.isObject = exports.extendedTypeof = void 0;
/** @private */
function extendedTypeof(val) {
if (val === null) {
return 'null';
}
if (Array.isArray(val)) {
return 'array';
}
return typeof val;
}
exports.extendedTypeof = extendedTypeof;
/** @private */
function isObject(val) {
return typeof val === 'object' && val !== null;
return extendedTypeof(val) === 'object';
}

@@ -36,22 +45,2 @@ exports.isObject = isObject;

exports.areGraphQLErrors = areGraphQLErrors;
/** @private */
function hasOwnProperty(obj, prop) {
return baseHasOwnProperty.call(obj, prop);
}
exports.hasOwnProperty = hasOwnProperty;
/** @private */
function hasOwnObjectProperty(obj, prop) {
return baseHasOwnProperty.call(obj, prop) && isObject(obj[prop]);
}
exports.hasOwnObjectProperty = hasOwnObjectProperty;
/** @private */
function hasOwnArrayProperty(obj, prop) {
return baseHasOwnProperty.call(obj, prop) && Array.isArray(obj[prop]);
}
exports.hasOwnArrayProperty = hasOwnArrayProperty;
/** @private */
function hasOwnStringProperty(obj, prop) {
return baseHasOwnProperty.call(obj, prop) && typeof obj[prop] === 'string';
}
exports.hasOwnStringProperty = hasOwnStringProperty;
/**

@@ -58,0 +47,0 @@ * Limits the WebSocket close event reason to not exceed a length of one frame.

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

@@ -30,3 +30,3 @@ "keywords": [

},
"packageManager": "yarn@3.2.0",
"packageManager": "yarn@3.2.1",
"main": "lib/index.js",

@@ -86,18 +86,18 @@ "module": "lib/index.mjs",

"devDependencies": {
"@babel/core": "^7.17.10",
"@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.17.3",
"@babel/plugin-proposal-optional-chaining": "^7.16.7",
"@babel/preset-env": "^7.17.10",
"@babel/preset-typescript": "^7.16.7",
"@babel/core": "^7.18.2",
"@babel/plugin-proposal-class-properties": "^7.17.12",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12",
"@babel/plugin-proposal-object-rest-spread": "^7.18.0",
"@babel/plugin-proposal-optional-chaining": "^7.17.12",
"@babel/preset-env": "^7.18.2",
"@babel/preset-typescript": "^7.17.12",
"@rollup/plugin-typescript": "^8.3.2",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/git": "^10.0.1",
"@types/jest": "^27.5.1",
"@types/jest": "^28.1.1",
"@types/ws": "^8.5.3",
"@typescript-eslint/eslint-plugin": "^5.23.0",
"@typescript-eslint/parser": "^5.23.0",
"babel-jest": "^28.1.0",
"eslint": "^8.15.0",
"@typescript-eslint/eslint-plugin": "^5.27.1",
"@typescript-eslint/parser": "^5.27.1",
"babel-jest": "^28.1.1",
"eslint": "^8.17.0",
"eslint-config-prettier": "^8.5.0",

@@ -107,20 +107,20 @@ "eslint-plugin-prettier": "^4.0.0",

"fastify-websocket": "4.2.2",
"glob": "^8.0.1",
"glob": "^8.0.3",
"graphql": "^16.5.0",
"jest": "^28.1.0",
"jest-environment-jsdom": "^28.1.0",
"jest-jasmine2": "^28.1.0",
"jest": "^28.1.1",
"jest-environment-jsdom": "^28.1.1",
"jest-jasmine2": "^28.1.1",
"prettier": "^2.6.2",
"replacestream": "^4.0.3",
"rollup": "^2.72.1",
"rollup": "^2.75.6",
"rollup-plugin-terser": "^7.0.2",
"semantic-release": "^19.0.2",
"semantic-release": "^19.0.3",
"subscriptions-transport-ws": "^0.11.0",
"tslib": "^2.4.0",
"typedoc": "^0.22.15",
"typedoc": "^0.22.17",
"typedoc-plugin-markdown": "^3.12.1",
"typescript": "^4.6.4",
"uWebSockets.js": "uNetworking/uWebSockets.js#v20.8.0",
"ws": "^8.6.0",
"ws7": "npm:ws@^7.5.7"
"typescript": "^4.7.3",
"uWebSockets.js": "uNetworking/uWebSockets.js#v20.10.0",
"ws": "^8.7.0",
"ws7": "npm:ws@^7.5.8"
},

@@ -127,0 +127,0 @@ "resolutions": {

@@ -7,7 +7,15 @@ (function (global, factory) {

// Extremely small optimisation, reduces runtime prototype traversal
const baseHasOwnProperty = Object.prototype.hasOwnProperty;
/** @private */
function extendedTypeof(val) {
if (val === null) {
return 'null';
}
if (Array.isArray(val)) {
return 'array';
}
return typeof val;
}
/** @private */
function isObject(val) {
return typeof val === 'object' && val !== null;
return extendedTypeof(val) === 'object';
}

@@ -22,14 +30,2 @@ /** @private */

}
/** @private */
function hasOwnProperty(obj, prop) {
return baseHasOwnProperty.call(obj, prop);
}
/** @private */
function hasOwnObjectProperty(obj, prop) {
return baseHasOwnProperty.call(obj, prop) && isObject(obj[prop]);
}
/** @private */
function hasOwnStringProperty(obj, prop) {
return baseHasOwnProperty.call(obj, prop) && typeof obj[prop] === 'string';
}
/**

@@ -100,56 +96,108 @@ * Limits the WebSocket close event reason to not exceed a length of one frame.

/**
* Checks if the provided value is a message.
* Validates the message against the GraphQL over WebSocket Protocol.
*
* Invalid messages will throw descriptive errors.
*
* @category Common
*/
function isMessage(val) {
if (isObject(val)) {
// all messages must have the `type` prop
if (!hasOwnStringProperty(val, 'type')) {
return false;
function validateMessage(val) {
if (!isObject(val)) {
throw new Error(`Message is expected to be an object, but got ${extendedTypeof(val)}`);
}
if (!val.type) {
throw new Error(`Message is missing the 'type' property`);
}
if (typeof val.type !== 'string') {
throw new Error(`Message is expects the 'type' property to be a string, but got ${extendedTypeof(val.type)}`);
}
switch (val.type) {
case exports.MessageType.ConnectionInit:
case exports.MessageType.ConnectionAck:
case exports.MessageType.Ping:
case exports.MessageType.Pong: {
if ('payload' in val && !isObject(val.payload)) {
throw new Error(`"${val.type}" message expects the 'payload' property to be an object or missing, but got "${val.payload}"`);
}
break;
}
// validate other properties depending on the `type`
switch (val.type) {
case exports.MessageType.ConnectionInit:
// the connection init message can have optional payload object
return (!hasOwnProperty(val, 'payload') ||
val.payload === undefined ||
isObject(val.payload));
case exports.MessageType.ConnectionAck:
case exports.MessageType.Ping:
case exports.MessageType.Pong:
// the connection ack, ping and pong messages can have optional payload object too
return (!hasOwnProperty(val, 'payload') ||
val.payload === undefined ||
isObject(val.payload));
case exports.MessageType.Subscribe:
return (hasOwnStringProperty(val, 'id') &&
hasOwnObjectProperty(val, 'payload') &&
(!hasOwnProperty(val.payload, 'operationName') ||
val.payload.operationName === undefined ||
val.payload.operationName === null ||
typeof val.payload.operationName === 'string') &&
hasOwnStringProperty(val.payload, 'query') &&
(!hasOwnProperty(val.payload, 'variables') ||
val.payload.variables === undefined ||
val.payload.variables === null ||
hasOwnObjectProperty(val.payload, 'variables')) &&
(!hasOwnProperty(val.payload, 'extensions') ||
val.payload.extensions === undefined ||
val.payload.extensions === null ||
hasOwnObjectProperty(val.payload, 'extensions')));
case exports.MessageType.Next:
return (hasOwnStringProperty(val, 'id') &&
hasOwnObjectProperty(val, 'payload'));
case exports.MessageType.Error:
return hasOwnStringProperty(val, 'id') && areGraphQLErrors(val.payload);
case exports.MessageType.Complete:
return hasOwnStringProperty(val, 'id');
default:
return false;
case exports.MessageType.Subscribe: {
if (typeof val.id !== 'string') {
throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${extendedTypeof(val.id)}`);
}
if (!val.id) {
throw new Error(`"${val.type}" message requires a non-empty 'id' property`);
}
if (!isObject(val.payload)) {
throw new Error(`"${val.type}" message expects the 'payload' property to be an object, but got ${extendedTypeof(val.payload)}`);
}
if (typeof val.payload.query !== 'string') {
throw new Error(`"${val.type}" message payload expects the 'query' property to be a string, but got ${extendedTypeof(val.payload.query)}`);
}
if (val.payload.variables != null && !isObject(val.payload.variables)) {
throw new Error(`"${val.type}" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${extendedTypeof(val.payload.variables)}`);
}
if (val.payload.operationName != null &&
extendedTypeof(val.payload.operationName) !== 'string') {
throw new Error(`"${val.type}" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${extendedTypeof(val.payload.operationName)}`);
}
if (val.payload.extensions != null && !isObject(val.payload.extensions)) {
throw new Error(`"${val.type}" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${extendedTypeof(val.payload.extensions)}`);
}
break;
}
case exports.MessageType.Next: {
if (typeof val.id !== 'string') {
throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${extendedTypeof(val.id)}`);
}
if (!val.id) {
throw new Error(`"${val.type}" message requires a non-empty 'id' property`);
}
if (!isObject(val.payload)) {
throw new Error(`"${val.type}" message expects the 'payload' property to be an object, but got ${extendedTypeof(val.payload)}`);
}
break;
}
case exports.MessageType.Error: {
if (typeof val.id !== 'string') {
throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${extendedTypeof(val.id)}`);
}
if (!val.id) {
throw new Error(`"${val.type}" message requires a non-empty 'id' property`);
}
if (!areGraphQLErrors(val.payload)) {
throw new Error(`"${val.type}" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(val.payload)}`);
}
break;
}
case exports.MessageType.Complete: {
if (typeof val.id !== 'string') {
throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${extendedTypeof(val.id)}`);
}
if (!val.id) {
throw new Error(`"${val.type}" message requires a non-empty 'id' property`);
}
break;
}
default:
throw new Error(`Invalid message 'type' property "${val.type}"`);
}
return false;
return val;
}
/**
* Checks if the provided value is a valid GraphQL over WebSocket message.
*
* @deprecated Use `validateMessage` instead.
*
* @category Common
*/
function isMessage(val) {
try {
validateMessage(val);
return true;
}
catch (_a) {
return false;
}
}
/**
* Parses the raw websocket message data to a valid message.

@@ -160,13 +208,12 @@ *

function parseMessage(data, reviver) {
if (isMessage(data)) {
return data;
try {
return validateMessage(data);
}
if (typeof data !== 'string') {
throw new Error('Message not parsable');
catch (_a) {
if (typeof data !== 'string') {
throw new Error('Only strings are parsable messages');
}
const message = JSON.parse(data, reviver);
return validateMessage(message);
}
const message = JSON.parse(data, reviver);
if (!isMessage(message)) {
throw new Error('Invalid message');
}
return message;
}

@@ -179,5 +226,3 @@ /**

function stringifyMessage(msg, replacer) {
if (!isMessage(msg)) {
throw new Error('Cannot stringify invalid message');
}
validateMessage(msg);
return JSON.stringify(msg, replacer);

@@ -652,2 +697,3 @@ }

exports.stringifyMessage = stringifyMessage;
exports.validateMessage = validateMessage;

@@ -654,0 +700,0 @@ Object.defineProperty(exports, '__esModule', { value: true });

@@ -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]}function a(e,o){return e.length<124?e:o}const s="graphql-transport-ws";var l,c;function d(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 p(e,o){if(d(e))return e;if("string"!=typeof e)throw new Error("Message not parsable");const n=JSON.parse(e,o);if(!d(n))throw new Error("Invalid message");return n}function u(e,o){if(!d(e))throw new Error("Cannot stringify invalid message");return JSON.stringify(e,o)}function y(e){return n(e)&&"code"in e&&"reason"in e}e.CloseCode=void 0,(l=e.CloseCode||(e.CloseCode={}))[l.InternalServerError=4500]="InternalServerError",l[l.InternalClientError=4005]="InternalClientError",l[l.BadRequest=4400]="BadRequest",l[l.BadResponse=4004]="BadResponse",l[l.Unauthorized=4401]="Unauthorized",l[l.Forbidden=4403]="Forbidden",l[l.SubprotocolNotAcceptable=4406]="SubprotocolNotAcceptable",l[l.ConnectionInitialisationTimeout=4408]="ConnectionInitialisationTimeout",l[l.ConnectionAcknowledgementTimeout=4504]="ConnectionAcknowledgementTimeout",l[l.SubscriberAlreadyExists=4409]="SubscriberAlreadyExists",l[l.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.DEPRECATED_GRAPHQL_WS_PROTOCOL="graphql-ws",e.GRAPHQL_TRANSPORT_WS_PROTOCOL=s,e.createClient=function(o){const{url:n,connectionParams:t,lazy:r=!0,onNonLazyError:i=console.error,lazyCloseTimeout:l=0,keepAlive:c=0,disablePong:d,connectionAckWaitTimeout:g=0,retryAttempts:f=5,retryWait:m=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))))},shouldRetry:C=y,isFatalConnectionProblem:b,on:w,webSocketImpl:T,generateID:x=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:v,jsonMessageReviver:h}=o;let M;if(T){if(!("function"==typeof(S=T)&&"constructor"in S&&"CLOSED"in S&&"CLOSING"in S&&"CONNECTING"in S&&"OPEN"in S))throw new Error("Invalid WebSocket implementation provided");M=T}else"undefined"!=typeof WebSocket?M=WebSocket:"undefined"!=typeof global?M=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&(M=window.WebSocket||window.MozWebSocket);var S;if(!M)throw new Error("WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`");const E=M,P=(()=>{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==w?void 0:w.connecting)?[w.connecting]:[],opened:(null==w?void 0:w.opened)?[w.opened]:[],connected:(null==w?void 0:w.connected)?[w.connected]:[],ping:(null==w?void 0:w.ping)?[w.ping]:[],pong:(null==w?void 0:w.pong)?[w.pong]:[],message:(null==w?void 0:w.message)?[e.emit,w.message]:[e.emit],closed:(null==w?void 0:w.closed)?[w.closed]:[],error:(null==w?void 0:w.error)?[w.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)}}})();function N(e){const o=[P.on("error",(n=>{o.forEach((e=>e())),e(n)})),P.on("closed",(n=>{o.forEach((e=>e())),e(n)}))]}let I,k=0,A=!1,O=0,R=!1;async function W(){const[o,r]=await(null!=I?I:I=new Promise(((o,r)=>(async()=>{if(A){if(await m(O),!k)return I=void 0,r({code:1e3,reason:"All Subscriptions Gone"});O++}P.emit("connecting");const i=new E("function"==typeof n?await n():n,s);let l,f;function C(){isFinite(c)&&c>0&&(clearTimeout(f),f=setTimeout((()=>{i.readyState===E.OPEN&&(i.send(u({type:e.MessageType.Ping})),P.emit("ping",!1,void 0))}),c))}N((e=>{I=void 0,clearTimeout(l),clearTimeout(f),r(e),y(e)&&4499===e.code&&(i.close(4499,"Terminated"),i.onerror=null,i.onclose=null)})),i.onerror=e=>P.emit("error",e),i.onclose=e=>P.emit("closed",e),i.onopen=async()=>{try{P.emit("opened",i);const o="function"==typeof t?await t():t;if(i.readyState!==E.OPEN)return;i.send(u(o?{type:e.MessageType.ConnectionInit,payload:o}:{type:e.MessageType.ConnectionInit},v)),isFinite(g)&&g>0&&(l=setTimeout((()=>{i.close(e.CloseCode.ConnectionAcknowledgementTimeout,"Connection acknowledgement timeout")}),g)),C()}catch(o){P.emit("error",o),i.close(e.CloseCode.InternalClientError,a(o instanceof Error?o.message:new Error(o).message,"Internal client error"))}};let b=!1;i.onmessage=({data:n})=>{try{const t=p(n,h);if(P.emit("message",t),"ping"===t.type||"pong"===t.type)return P.emit(t.type,!0,t.payload),void("pong"===t.type?C():d||(i.send(u(t.payload?{type:e.MessageType.Pong,payload:t.payload}:{type:e.MessageType.Pong})),P.emit("pong",!1,t.payload)));if(b)return;if(t.type!==e.MessageType.ConnectionAck)throw new Error(`First message cannot be of type ${t.type}`);clearTimeout(l),b=!0,P.emit("connected",i,t.payload),A=!1,O=0,o([i,new Promise(((e,o)=>N(o)))])}catch(o){i.onmessage=null,P.emit("error",o),i.close(e.CloseCode.BadResponse,a(o instanceof Error?o.message:new Error(o).message,"Bad response"))}}})())));o.readyState===E.CLOSING&&await r;let i=()=>{};const f=new Promise((e=>i=e));return[o,i,Promise.race([f.then((()=>{if(!k){const e=()=>o.close(1e3,"Normal Closure");isFinite(l)&&l>0?setTimeout((()=>{k||o.readyState!==E.OPEN||e()}),l):e()}})),r])]}function q(o){if(y(o)&&(n=o.code,![1e3,1001,1006,1005,1012,1013,1013].includes(n)&&n>=1e3&&n<=1999||[e.CloseCode.InternalServerError,e.CloseCode.InternalClientError,e.CloseCode.BadRequest,e.CloseCode.BadResponse,e.CloseCode.Unauthorized,e.CloseCode.SubprotocolNotAcceptable,e.CloseCode.SubscriberAlreadyExists,e.CloseCode.TooManyInitialisationRequests].includes(o.code)))throw o;var n;if(R)return!1;if(y(o)&&1e3===o.code)return k>0;if(!f||O>=f)throw o;if(!C(o))throw o;if(null==b?void 0:b(o))throw o;return A=!0}return r||(async()=>{for(k++;;)try{const[,,e]=await W();await e}catch(e){try{if(!q(e))return}catch(e){return null==i?void 0:i(e)}}})(),{on:P.on,subscribe(o,n){const t=x();let r=!1,i=!1,a=()=>{k--,r=!0};return(async()=>{for(k++;;)try{const[s,l,c]=await W();if(r)return l();const d=P.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(u({id:t,type:e.MessageType.Subscribe,payload:o},v)),a=()=>{r||s.readyState!==E.OPEN||s.send(u({id:t,type:e.MessageType.Complete},v)),k--,r=!0,l()},void await c.finally(d)}catch(e){if(!q(e))return}})().then((()=>{i||n.complete()})).catch((e=>{n.error(e)})),()=>{r||a()}},async dispose(){if(R=!0,I){const[e]=await I;e.close(1e3,"Normal Closure")}},terminate(){I&&P.emit("closed",{code:4499,reason:"Terminated",wasClean:!1})}}},e.isMessage=d,e.parseMessage=p,e.stringifyMessage=u,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";function o(e){return null===e?"null":Array.isArray(e)?"array":typeof e}function t(e){return"object"===o(e)}function r(e,o){return e.length<124?e:o}const n="graphql-transport-ws";var s,a;function i(r){if(!t(r))throw new Error(`Message is expected to be an object, but got ${o(r)}`);if(!r.type)throw new Error("Message is missing the 'type' property");if("string"!=typeof r.type)throw new Error(`Message is expects the 'type' property to be a string, but got ${o(r.type)}`);switch(r.type){case e.MessageType.ConnectionInit:case e.MessageType.ConnectionAck:case e.MessageType.Ping:case e.MessageType.Pong:if("payload"in r&&!t(r.payload))throw new Error(`"${r.type}" message expects the 'payload' property to be an object or missing, but got "${r.payload}"`);break;case e.MessageType.Subscribe:if("string"!=typeof r.id)throw new Error(`"${r.type}" message expects the 'id' property to be a string, but got ${o(r.id)}`);if(!r.id)throw new Error(`"${r.type}" message requires a non-empty 'id' property`);if(!t(r.payload))throw new Error(`"${r.type}" message expects the 'payload' property to be an object, but got ${o(r.payload)}`);if("string"!=typeof r.payload.query)throw new Error(`"${r.type}" message payload expects the 'query' property to be a string, but got ${o(r.payload.query)}`);if(null!=r.payload.variables&&!t(r.payload.variables))throw new Error(`"${r.type}" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${o(r.payload.variables)}`);if(null!=r.payload.operationName&&"string"!==o(r.payload.operationName))throw new Error(`"${r.type}" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${o(r.payload.operationName)}`);if(null!=r.payload.extensions&&!t(r.payload.extensions))throw new Error(`"${r.type}" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${o(r.payload.extensions)}`);break;case e.MessageType.Next:if("string"!=typeof r.id)throw new Error(`"${r.type}" message expects the 'id' property to be a string, but got ${o(r.id)}`);if(!r.id)throw new Error(`"${r.type}" message requires a non-empty 'id' property`);if(!t(r.payload))throw new Error(`"${r.type}" message expects the 'payload' property to be an object, but got ${o(r.payload)}`);break;case e.MessageType.Error:if("string"!=typeof r.id)throw new Error(`"${r.type}" message expects the 'id' property to be a string, but got ${o(r.id)}`);if(!r.id)throw new Error(`"${r.type}" message requires a non-empty 'id' property`);if(n=r.payload,!(Array.isArray(n)&&n.length>0&&n.every((e=>"message"in e))))throw new Error(`"${r.type}" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(r.payload)}`);break;case e.MessageType.Complete:if("string"!=typeof r.id)throw new Error(`"${r.type}" message expects the 'id' property to be a string, but got ${o(r.id)}`);if(!r.id)throw new Error(`"${r.type}" message requires a non-empty 'id' property`);break;default:throw new Error(`Invalid message 'type' property "${r.type}"`)}var n;return r}function p(e,o){try{return i(e)}catch(t){if("string"!=typeof e)throw new Error("Only strings are parsable messages");return i(JSON.parse(e,o))}}function l(e,o){return i(e),JSON.stringify(e,o)}function c(e){return t(e)&&"code"in e&&"reason"in e}e.CloseCode=void 0,(s=e.CloseCode||(e.CloseCode={}))[s.InternalServerError=4500]="InternalServerError",s[s.InternalClientError=4005]="InternalClientError",s[s.BadRequest=4400]="BadRequest",s[s.BadResponse=4004]="BadResponse",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,(a=e.MessageType||(e.MessageType={})).ConnectionInit="connection_init",a.ConnectionAck="connection_ack",a.Ping="ping",a.Pong="pong",a.Subscribe="subscribe",a.Next="next",a.Error="error",a.Complete="complete",e.DEPRECATED_GRAPHQL_WS_PROTOCOL="graphql-ws",e.GRAPHQL_TRANSPORT_WS_PROTOCOL=n,e.createClient=function(o){const{url:t,connectionParams:s,lazy:a=!0,onNonLazyError:i=console.error,lazyCloseTimeout:d=0,keepAlive:y=0,disablePong:u,connectionAckWaitTimeout:g=0,retryAttempts:m=5,retryWait:f=async function(e){let o=1e3;for(let t=0;t<e;t++)o*=2;await new Promise((e=>setTimeout(e,o+Math.floor(2700*Math.random()+300))))},shouldRetry:b=c,isFatalConnectionProblem:w,on:h,webSocketImpl:C,generateID:x=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:E,jsonMessageReviver:T}=o;let v;if(C){if(!("function"==typeof(M=C)&&"constructor"in M&&"CLOSED"in M&&"CLOSING"in M&&"CONNECTING"in M&&"OPEN"in M))throw new Error("Invalid WebSocket implementation provided");v=C}else"undefined"!=typeof WebSocket?v=WebSocket:"undefined"!=typeof global?v=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&(v=window.WebSocket||window.MozWebSocket);var M;if(!v)throw new Error("WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`");const S=v,$=(()=>{const e=(()=>{const e={};return{on:(o,t)=>(e[o]=t,()=>{delete e[o]}),emit(o){var t;"id"in o&&(null===(t=e[o.id])||void 0===t||t.call(e,o))}}})(),o={connecting:(null==h?void 0:h.connecting)?[h.connecting]:[],opened:(null==h?void 0:h.opened)?[h.opened]:[],connected:(null==h?void 0:h.connected)?[h.connected]:[],ping:(null==h?void 0:h.ping)?[h.ping]:[],pong:(null==h?void 0:h.pong)?[h.pong]:[],message:(null==h?void 0:h.message)?[e.emit,h.message]:[e.emit],closed:(null==h?void 0:h.closed)?[h.closed]:[],error:(null==h?void 0:h.error)?[h.error]:[]};return{onMessage:e.on,on(e,t){const r=o[e];return r.push(t),()=>{r.splice(r.indexOf(t),1)}},emit(e,...t){for(const r of[...o[e]])r(...t)}}})();function N(e){const o=[$.on("error",(t=>{o.forEach((e=>e())),e(t)})),$.on("closed",(t=>{o.forEach((e=>e())),e(t)}))]}let k,P=0,I=!1,A=0,O=!1;async function R(){const[o,a]=await(null!=k?k:k=new Promise(((o,a)=>(async()=>{if(I){if(await f(A),!P)return k=void 0,a({code:1e3,reason:"All Subscriptions Gone"});A++}$.emit("connecting");const i=new S("function"==typeof t?await t():t,n);let d,m;function b(){isFinite(y)&&y>0&&(clearTimeout(m),m=setTimeout((()=>{i.readyState===S.OPEN&&(i.send(l({type:e.MessageType.Ping})),$.emit("ping",!1,void 0))}),y))}N((e=>{k=void 0,clearTimeout(d),clearTimeout(m),a(e),c(e)&&4499===e.code&&(i.close(4499,"Terminated"),i.onerror=null,i.onclose=null)})),i.onerror=e=>$.emit("error",e),i.onclose=e=>$.emit("closed",e),i.onopen=async()=>{try{$.emit("opened",i);const o="function"==typeof s?await s():s;if(i.readyState!==S.OPEN)return;i.send(l(o?{type:e.MessageType.ConnectionInit,payload:o}:{type:e.MessageType.ConnectionInit},E)),isFinite(g)&&g>0&&(d=setTimeout((()=>{i.close(e.CloseCode.ConnectionAcknowledgementTimeout,"Connection acknowledgement timeout")}),g)),b()}catch(o){$.emit("error",o),i.close(e.CloseCode.InternalClientError,r(o instanceof Error?o.message:new Error(o).message,"Internal client error"))}};let w=!1;i.onmessage=({data:t})=>{try{const r=p(t,T);if($.emit("message",r),"ping"===r.type||"pong"===r.type)return $.emit(r.type,!0,r.payload),void("pong"===r.type?b():u||(i.send(l(r.payload?{type:e.MessageType.Pong,payload:r.payload}:{type:e.MessageType.Pong})),$.emit("pong",!1,r.payload)));if(w)return;if(r.type!==e.MessageType.ConnectionAck)throw new Error(`First message cannot be of type ${r.type}`);clearTimeout(d),w=!0,$.emit("connected",i,r.payload),I=!1,A=0,o([i,new Promise(((e,o)=>N(o)))])}catch(o){i.onmessage=null,$.emit("error",o),i.close(e.CloseCode.BadResponse,r(o instanceof Error?o.message:new Error(o).message,"Bad response"))}}})())));o.readyState===S.CLOSING&&await a;let i=()=>{};const m=new Promise((e=>i=e));return[o,i,Promise.race([m.then((()=>{if(!P){const e=()=>o.close(1e3,"Normal Closure");isFinite(d)&&d>0?setTimeout((()=>{P||o.readyState!==S.OPEN||e()}),d):e()}})),a])]}function q(o){if(c(o)&&(t=o.code,![1e3,1001,1006,1005,1012,1013,1013].includes(t)&&t>=1e3&&t<=1999||[e.CloseCode.InternalServerError,e.CloseCode.InternalClientError,e.CloseCode.BadRequest,e.CloseCode.BadResponse,e.CloseCode.Unauthorized,e.CloseCode.SubprotocolNotAcceptable,e.CloseCode.SubscriberAlreadyExists,e.CloseCode.TooManyInitialisationRequests].includes(o.code)))throw o;var t;if(O)return!1;if(c(o)&&1e3===o.code)return P>0;if(!m||A>=m)throw o;if(!b(o))throw o;if(null==w?void 0:w(o))throw o;return I=!0}return a||(async()=>{for(P++;;)try{const[,,e]=await R();await e}catch(e){try{if(!q(e))return}catch(e){return null==i?void 0:i(e)}}})(),{on:$.on,subscribe(o,t){const r=x();let n=!1,s=!1,a=()=>{P--,n=!0};return(async()=>{for(P++;;)try{const[i,p,c]=await R();if(n)return p();const d=$.onMessage(r,(o=>{switch(o.type){case e.MessageType.Next:return void t.next(o.payload);case e.MessageType.Error:return s=!0,n=!0,t.error(o.payload),void a();case e.MessageType.Complete:return n=!0,void a()}}));return i.send(l({id:r,type:e.MessageType.Subscribe,payload:o},E)),a=()=>{n||i.readyState!==S.OPEN||i.send(l({id:r,type:e.MessageType.Complete},E)),P--,n=!0,p()},void await c.finally(d)}catch(e){if(!q(e))return}})().then((()=>{s||t.complete()})).catch((e=>{t.error(e)})),()=>{n||a()}},async dispose(){if(O=!0,k){const[e]=await k;e.close(1e3,"Normal Closure")}},terminate(){k&&$.emit("closed",{code:4499,reason:"Terminated",wasClean:!1})}}},e.isMessage=function(e){try{return i(e),!0}catch(e){return!1}},e.parseMessage=p,e.stringifyMessage=l,e.validateMessage=i,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