Socket
Socket
Sign inDemoInstall

graphql-ws

Package Overview
Dependencies
Maintainers
1
Versions
103
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 4.2.2 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

SocketSocket SOC 2 Logo

Product

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

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc