🚀 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
4.2.3

7

CHANGELOG.md

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

## [4.2.3](https://github.com/enisdenjo/graphql-ws/compare/v4.2.2...v4.2.3) (2021-03-23)
### Bug Fixes
* **client:** Reduce WebSocket event listeners and add new client `message` event ([#104](https://github.com/enisdenjo/graphql-ws/issues/104)) ([68d0e20](https://github.com/enisdenjo/graphql-ws/commit/68d0e20674488e8792a61d07f068233d78acaa3a)), closes [#102](https://github.com/enisdenjo/graphql-ws/issues/102)
## [4.2.2](https://github.com/enisdenjo/graphql-ws/compare/v4.2.1...v4.2.2) (2021-03-17)

@@ -2,0 +9,0 @@

12

lib/client.d.ts

@@ -7,3 +7,3 @@ /**

import { Sink, ID, Disposable } from './types';
import { SubscribePayload } from './message';
import { Message, SubscribePayload } from './message';
export * from './message';

@@ -13,5 +13,6 @@ export * from './protocol';

export declare type EventConnected = 'connected';
export declare type EventMessage = 'message';
export declare type EventClosed = 'closed';
export declare type EventError = 'error';
export declare type Event = EventConnecting | EventConnected | EventClosed | EventError;
export declare type Event = EventConnecting | EventConnected | EventMessage | EventClosed | EventError;
/**

@@ -28,2 +29,7 @@ * The first argument is actually the `WebSocket`, but to avoid

/**
* Called for all **valid** messages received by the client. Mainly useful for
* debugging and logging received messages.
*/
export declare type EventMessageListener = (message: Message) => void;
/**
* The argument is actually the websocket `CloseEvent`, but to avoid

@@ -41,3 +47,3 @@ * bundling DOM typings because the client can run in Node env too,

export declare type EventErrorListener = (error: unknown) => void;
export declare type EventListener<E extends Event> = E extends EventConnecting ? EventConnectingListener : E extends EventConnected ? EventConnectedListener : E extends EventClosed ? EventClosedListener : E extends EventError ? EventErrorListener : never;
export declare type EventListener<E extends Event> = E extends EventConnecting ? EventConnectingListener : E extends EventConnected ? EventConnectedListener : E extends EventMessage ? EventMessageListener : E extends EventClosed ? EventClosedListener : E extends EventError ? EventErrorListener : never;
/** Configuration used for the GraphQL over WebSocket client. */

@@ -44,0 +50,0 @@ export interface ClientOptions {

@@ -82,2 +82,3 @@ "use strict";

connected: (on === null || on === void 0 ? void 0 : on.connected) ? [on.connected] : [],
message: (on === null || on === void 0 ? void 0 : on.message) ? [on.message] : [],
closed: (on === null || on === void 0 ? void 0 : on.closed) ? [on.closed] : [],

@@ -105,3 +106,3 @@ error: (on === null || on === void 0 ? void 0 : on.error) ? [on.error] : [],

locks++;
const socket = await (connecting !== null && connecting !== void 0 ? connecting : (connecting = new Promise((resolve, reject) => (async () => {
const [socket, throwOnClose] = await (connecting !== null && connecting !== void 0 ? connecting : (connecting = new Promise((connected, denied) => (async () => {
if (retrying) {

@@ -120,3 +121,3 @@ await retryWait(retries);

emitter.emit('closed', event);
reject(event);
denied(event);
};

@@ -136,12 +137,20 @@ socket.onopen = async () => {

};
let hasConnected = false;
socket.onmessage = ({ data }) => {
socket.onmessage = null; // interested only in the first message
try {
const message = message_1.parseMessage(data);
emitter.emit('message', message);
if (hasConnected)
return;
// havent connected yet. expect the acknowledgement message and proceed
if (message.type !== message_1.MessageType.ConnectionAck) {
throw new Error(`First message cannot be of type ${message.type}`);
}
hasConnected = true;
emitter.emit('connected', socket, message.payload); // connected = socket opened + acknowledged
retries = 0; // reset the retries on connect
resolve(socket);
connected([
socket,
new Promise((_, closed) => socket.addEventListener('close', closed)),
]);
}

@@ -180,3 +189,3 @@ catch (err) {

}),
new Promise((_resolve, reject) => socket.addEventListener('close', reject, { once: true })),
throwOnClose,
]),

@@ -197,3 +206,3 @@ ];

4409,
4429,
4429, // Too many initialisation requests
].includes(errOrCloseEvent.code)) {

@@ -241,12 +250,2 @@ throw errOrCloseEvent;

}
// to avoid parsing the same message in each
// subscriber, we memo one on the last received data
let lastData, lastMessage;
function memoParseMessage(data) {
if (data !== lastData) {
lastMessage = message_1.parseMessage(data);
lastData = data;
}
return lastMessage;
}
return {

@@ -263,31 +262,2 @@ on: emitter.on,

};
function messageHandler({ data }) {
const message = memoParseMessage(data);
switch (message.type) {
case message_1.MessageType.Next: {
if (message.id === id) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
sink.next(message.payload);
}
return;
}
case message_1.MessageType.Error: {
if (message.id === id) {
completed = true;
sink.error(message.payload);
releaserRef.current();
// TODO-db-201025 calling releaser will complete the sink, meaning that both the `error` and `complete` will be
// called. neither promises or observables care; once they settle, additional calls to the resolvers will be ignored
}
return;
}
case message_1.MessageType.Complete: {
if (message.id === id) {
completed = true;
releaserRef.current(); // release completes the sink
}
return;
}
}
}
(async () => {

@@ -300,3 +270,30 @@ for (;;) {

return release();
socket.addEventListener('message', messageHandler);
const unlisten = emitter.on('message', (message) => {
switch (message.type) {
case message_1.MessageType.Next: {
if (message.id === id) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
sink.next(message.payload);
}
return;
}
case message_1.MessageType.Error: {
if (message.id === id) {
completed = true;
sink.error(message.payload);
releaserRef.current();
// TODO-db-201025 calling releaser will complete the sink, meaning that both the `error` and `complete` will be
// called. neither promises or observables care; once they settle, additional calls to the resolvers will be ignored
}
return;
}
case message_1.MessageType.Complete: {
if (message.id === id) {
completed = true;
releaserRef.current(); // release completes the sink
}
return;
}
}
});
socket.send(message_1.stringifyMessage({

@@ -318,5 +315,5 @@ id: id,

// either the releaser will be called, connection completed and
// the promise resolved or the socket closed and the promise rejected
await waitForReleaseOrThrowOnClose;
socket.removeEventListener('message', messageHandler);
// the promise resolved or the socket closed and the promise rejected.
// whatever happens though, we want to stop listening for messages
await waitForReleaseOrThrowOnClose.finally(unlisten);
return; // completed, shouldnt try again

@@ -338,3 +335,3 @@ }

// if there is a connection, close it
const socket = await connecting;
const [socket] = await connecting;
socket.close(1000, 'Normal Closure');

@@ -341,0 +338,0 @@ }

@@ -86,2 +86,3 @@ "use strict";

type: message_1.MessageType.ConnectionAck,
// payload is completely absent if not provided
}));

@@ -88,0 +89,0 @@ // @ts-expect-error: I can write

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

@@ -75,4 +75,4 @@ "keywords": [

"@babel/plugin-proposal-object-rest-spread": "^7.13.8",
"@babel/plugin-proposal-optional-chaining": "^7.13.8",
"@babel/preset-env": "^7.13.10",
"@babel/plugin-proposal-optional-chaining": "^7.13.12",
"@babel/preset-env": "^7.13.12",
"@babel/preset-typescript": "^7.13.0",

@@ -82,8 +82,8 @@ "@rollup/plugin-typescript": "^8.2.0",

"@semantic-release/git": "^9.0.0",
"@types/jest": "^26.0.20",
"@types/jest": "^26.0.21",
"@types/ws": "^7.4.0",
"@typescript-eslint/eslint-plugin": "^4.17.0",
"@typescript-eslint/parser": "^4.17.0",
"@typescript-eslint/eslint-plugin": "^4.19.0",
"@typescript-eslint/parser": "^4.19.0",
"babel-jest": "^26.6.3",
"eslint": "^7.21.0",
"eslint": "^7.22.0",
"eslint-config-prettier": "^8.1.0",

@@ -96,11 +96,11 @@ "eslint-plugin-prettier": "^3.3.1",

"replacestream": "^4.0.3",
"rollup": "^2.41.1",
"rollup": "^2.42.3",
"rollup-plugin-terser": "^7.0.2",
"semantic-release": "^17.4.1",
"semantic-release": "^17.4.2",
"tslib": "^2.1.0",
"typedoc": "^0.20.30",
"typedoc": "^0.20.33",
"typedoc-plugin-markdown": "^3.6.0",
"typescript": "4.1.5",
"typescript": "^4.2.3",
"ws": "^7.4.4"
}
}

@@ -180,2 +180,3 @@ (function (global, factory) {

connected: (on === null || on === void 0 ? void 0 : on.connected) ? [on.connected] : [],
message: (on === null || on === void 0 ? void 0 : on.message) ? [on.message] : [],
closed: (on === null || on === void 0 ? void 0 : on.closed) ? [on.closed] : [],

@@ -203,3 +204,3 @@ error: (on === null || on === void 0 ? void 0 : on.error) ? [on.error] : [],

locks++;
const socket = await (connecting !== null && connecting !== void 0 ? connecting : (connecting = new Promise((resolve, reject) => (async () => {
const [socket, throwOnClose] = await (connecting !== null && connecting !== void 0 ? connecting : (connecting = new Promise((connected, denied) => (async () => {
if (retrying) {

@@ -218,3 +219,3 @@ await retryWait(retries);

emitter.emit('closed', event);
reject(event);
denied(event);
};

@@ -234,12 +235,20 @@ socket.onopen = async () => {

};
let hasConnected = false;
socket.onmessage = ({ data }) => {
socket.onmessage = null; // interested only in the first message
try {
const message = parseMessage(data);
emitter.emit('message', message);
if (hasConnected)
return;
// havent connected yet. expect the acknowledgement message and proceed
if (message.type !== exports.MessageType.ConnectionAck) {
throw new Error(`First message cannot be of type ${message.type}`);
}
hasConnected = true;
emitter.emit('connected', socket, message.payload); // connected = socket opened + acknowledged
retries = 0; // reset the retries on connect
resolve(socket);
connected([
socket,
new Promise((_, closed) => socket.addEventListener('close', closed)),
]);
}

@@ -278,3 +287,3 @@ catch (err) {

}),
new Promise((_resolve, reject) => socket.addEventListener('close', reject, { once: true })),
throwOnClose,
]),

@@ -295,3 +304,3 @@ ];

4409,
4429,
4429, // Too many initialisation requests
].includes(errOrCloseEvent.code)) {

@@ -339,12 +348,2 @@ throw errOrCloseEvent;

}
// to avoid parsing the same message in each
// subscriber, we memo one on the last received data
let lastData, lastMessage;
function memoParseMessage(data) {
if (data !== lastData) {
lastMessage = parseMessage(data);
lastData = data;
}
return lastMessage;
}
return {

@@ -361,31 +360,2 @@ on: emitter.on,

};
function messageHandler({ data }) {
const message = memoParseMessage(data);
switch (message.type) {
case exports.MessageType.Next: {
if (message.id === id) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
sink.next(message.payload);
}
return;
}
case exports.MessageType.Error: {
if (message.id === id) {
completed = true;
sink.error(message.payload);
releaserRef.current();
// TODO-db-201025 calling releaser will complete the sink, meaning that both the `error` and `complete` will be
// called. neither promises or observables care; once they settle, additional calls to the resolvers will be ignored
}
return;
}
case exports.MessageType.Complete: {
if (message.id === id) {
completed = true;
releaserRef.current(); // release completes the sink
}
return;
}
}
}
(async () => {

@@ -398,3 +368,30 @@ for (;;) {

return release();
socket.addEventListener('message', messageHandler);
const unlisten = emitter.on('message', (message) => {
switch (message.type) {
case exports.MessageType.Next: {
if (message.id === id) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
sink.next(message.payload);
}
return;
}
case exports.MessageType.Error: {
if (message.id === id) {
completed = true;
sink.error(message.payload);
releaserRef.current();
// TODO-db-201025 calling releaser will complete the sink, meaning that both the `error` and `complete` will be
// called. neither promises or observables care; once they settle, additional calls to the resolvers will be ignored
}
return;
}
case exports.MessageType.Complete: {
if (message.id === id) {
completed = true;
releaserRef.current(); // release completes the sink
}
return;
}
}
});
socket.send(stringifyMessage({

@@ -416,5 +413,5 @@ id: id,

// either the releaser will be called, connection completed and
// the promise resolved or the socket closed and the promise rejected
await waitForReleaseOrThrowOnClose;
socket.removeEventListener('message', messageHandler);
// the promise resolved or the socket closed and the promise rejected.
// whatever happens though, we want to stop listening for messages
await waitForReleaseOrThrowOnClose.finally(unlisten);
return; // completed, shouldnt try again

@@ -436,3 +433,3 @@ }

// if there is a connection, close it
const socket = await connecting;
const [socket] = await connecting;
socket.close(1000, 'Normal Closure');

@@ -439,0 +436,0 @@ }

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

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