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 3.0.1 to 3.0.2

7

CHANGELOG.md

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

## [3.0.2](https://github.com/enisdenjo/graphql-ws/compare/v3.0.1...v3.0.2) (2020-12-10)
### Bug Fixes
* **client:** No retries when disposed ([0d5e6c2](https://github.com/enisdenjo/graphql-ws/commit/0d5e6c259eee5e331c5cef92246888745edda5a4))
## [3.0.1](https://github.com/enisdenjo/graphql-ws/compare/v3.0.0...v3.0.1) (2020-12-10)

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

10

lib/client.js

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

let state = {
disposed: false,
socket: null,

@@ -117,3 +118,3 @@ acknowledged: false,

// use retry wait strategy
await retryWait(state.retries++);
await retryWait(state.retries);
// complete all waiting and clear the queue

@@ -155,3 +156,3 @@ while (retryWaiting.length) {

const socket = new WebSocketImpl(url, protocol_1.GRAPHQL_TRANSPORT_WS_PROTOCOL);
state = Object.assign(Object.assign({}, state), { acknowledged: false, socket });
state = Object.assign(Object.assign({}, state), { acknowledged: false, socket, retries: state.retries + (state.retrying ? 1 : 0) });
emitter.emit('connecting');

@@ -286,4 +287,4 @@ await new Promise((resolve, reject) => {

}
// normal closure is disposal, shouldnt try again
if (errOrCloseEvent.code === 1000) {
// already disposed or normal closure, shouldnt try again
if (state.disposed || errOrCloseEvent.code === 1000) {
return false;

@@ -417,2 +418,3 @@ }

var _a;
state.disposed = true;
(_a = state.socket) === null || _a === void 0 ? void 0 : _a.close(1000, 'Normal Closure');

@@ -419,0 +421,0 @@ emitter.reset();

2

package.json
{
"name": "graphql-ws",
"version": "3.0.1",
"version": "3.0.2",
"description": "Coherent, zero-dependency, lazy, simple, GraphQL over WebSocket Protocol compliant server and client",

@@ -5,0 +5,0 @@ "keywords": [

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

let state = {
disposed: false,
socket: null,

@@ -228,3 +229,3 @@ acknowledged: false,

// use retry wait strategy
await retryWait(state.retries++);
await retryWait(state.retries);
// complete all waiting and clear the queue

@@ -266,3 +267,3 @@ while (retryWaiting.length) {

const socket = new WebSocketImpl(url, GRAPHQL_TRANSPORT_WS_PROTOCOL);
state = Object.assign(Object.assign({}, state), { acknowledged: false, socket });
state = Object.assign(Object.assign({}, state), { acknowledged: false, socket, retries: state.retries + (state.retrying ? 1 : 0) });
emitter.emit('connecting');

@@ -397,4 +398,4 @@ await new Promise((resolve, reject) => {

}
// normal closure is disposal, shouldnt try again
if (errOrCloseEvent.code === 1000) {
// already disposed or normal closure, shouldnt try again
if (state.disposed || errOrCloseEvent.code === 1000) {
return false;

@@ -528,2 +529,3 @@ }

var _a;
state.disposed = true;
(_a = state.socket) === null || _a === void 0 ? void 0 : _a.close(1000, 'Normal Closure');

@@ -530,0 +532,0 @@ emitter.reset();

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

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).graphqlWs={})}(this,(function(e){"use strict";const t=Object.prototype.hasOwnProperty;function n(e){return"object"==typeof e&&null!==e}function o(e,n){return t.call(e,n)}function r(e,o){return t.call(e,o)&&n(e[o])}function c(e,n){return t.call(e,n)&&"string"==typeof e[n]}var i;function a(e){if(n(e)){if(!c(e,"type"))return!1;switch(e.type){case i.ConnectionInit:case i.ConnectionAck:return!o(e,"payload")||void 0===e.payload||n(e.payload);case i.Subscribe:return c(e,"id")&&r(e,"payload")&&(!o(e.payload,"operationName")||void 0===e.payload.operationName||null===e.payload.operationName||"string"==typeof e.payload.operationName)&&c(e.payload,"query")&&(!o(e.payload,"variables")||void 0===e.payload.variables||null===e.payload.variables||r(e.payload,"variables"));case i.Next:return c(e,"id")&&r(e,"payload");case i.Error:return c(e,"id")&&(t=e.payload,Array.isArray(t)&&t.length>0&&t.every((e=>"message"in e)));case i.Complete:return c(e,"id");default:return!1}}var t;return!1}function s(e){if(a(e))return e;if("string"!=typeof e)throw new Error("Message not parsable");const t=JSON.parse(e);if(!a(t))throw new Error("Invalid message");return t}function l(e){if(!a(e))throw new Error("Cannot stringify invalid message");return JSON.stringify(e)}!function(e){e.ConnectionInit="connection_init",e.ConnectionAck="connection_ack",e.Subscribe="subscribe",e.Next="next",e.Error="error",e.Complete="complete"}(i||(i={})),e.createClient=function(e){const{url:t,connectionParams:o,lazy:r=!0,keepAlive:c=0,retryAttempts:a=5,retryWait:u=async function(e){let t=1e3;for(let n=0;n<e;n++)t*=2;await new Promise((e=>setTimeout(e,t+Math.floor(2700*Math.random()+300))))},on:d,webSocketImpl:f,generateID:p=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(e=>{const t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)}))}}=e;let y;if(f){if(!("function"==typeof(m=f)&&"constructor"in m&&"CLOSED"in m&&"CLOSING"in m&&"CONNECTING"in m&&"OPEN"in m))throw new Error("Invalid WebSocket implementation provided");y=f}else"undefined"!=typeof WebSocket?y=WebSocket:"undefined"!=typeof global?y=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&(y=window.WebSocket||window.MozWebSocket);var m;if(!y)throw new Error("WebSocket implementation missing");const w=y,g=(()=>{const e={connecting:(null==d?void 0:d.connecting)?[d.connecting]:[],connected:(null==d?void 0:d.connected)?[d.connected]:[],closed:(null==d?void 0:d.closed)?[d.closed]:[]};return{on(t,n){const o=e[t];return o.push(n),()=>{o.splice(o.indexOf(n),1)}},emit(t,...n){for(const o of e[t])o(...n)},reset(){Object.keys(e).forEach((t=>{e[t]=[]}))}}})();let b={socket:null,acknowledged:!1,locks:0,retrying:!1,retries:0};const k=[];async function v(e,n=0){var r;if(n>10)throw new Error("Kept trying to connect but the socket never settled.");if(b.retrying&&0===n)if(k.length)await new Promise((e=>k.push(e)));else for(k.push((()=>{})),await u(b.retries++);k.length;)null===(r=k.pop())||void 0===r||r();if(n&&await new Promise((e=>setTimeout(e,50*n))),b.socket)switch(b.socket.readyState){case w.OPEN:return b.acknowledged?x(b.socket,e):v(e,n+1);case w.CONNECTING:return v(e,n+1);case w.CLOSED:break;case w.CLOSING:return v(e,n+1);default:throw new Error(`Impossible ready state ${b.socket.readyState}`)}const c=new w(t,"graphql-transport-ws");return b=Object.assign(Object.assign({},b),{acknowledged:!1,socket:c}),g.emit("connecting"),await new Promise(((t,n)=>{let r=!1;e.current=()=>r=!0;const a=setTimeout((()=>{c.close(3408,"Waited 5 seconds but socket connect never settled")}),5e3);c.onclose=e=>(c.onclose=null,clearTimeout(a),b=Object.assign(Object.assign({},b),{acknowledged:!1,socket:null}),g.emit("closed",e),n(e)),c.onmessage=e=>{if(c.onmessage=null,r)c.close(3499,"Client cancelled the socket before connecting");else try{const n=s(e.data);if(n.type!==i.ConnectionAck)throw new Error(`First message cannot be of type ${n.type}`);return clearTimeout(a),b=Object.assign(Object.assign({},b),{acknowledged:!0,socket:c,retrying:!1,retries:0}),g.emit("connected",c,n.payload),t()}catch(e){c.close(4400,e instanceof Error?e.message:new Error(e).message)}},c.onopen=()=>{c.onopen=null,r?c.close(3499,"Client cancelled the socket before connecting"):(async()=>{try{c.send(l({type:i.ConnectionInit,payload:"function"==typeof o?await o():o}))}catch(e){c.close(4400,e instanceof Error?e.message:new Error(e).message)}})()}})),x(c,e)}async function x(e,t){return[e,n=>new Promise(((o,r)=>{if(e.readyState===w.CLOSED)return r(new Error("Socket has already been closed"));function i(n){return t.current=null,b.locks--,e.removeEventListener("close",i),r(n)}b.locks++,e.addEventListener("close",i),t.current=()=>(t.current=null,null==n||n(),b.locks--,b.locks||(c>0&&isFinite(c)?setTimeout((()=>{!b.locks&&e.OPEN&&e.close(1e3,"Normal Closure")}),c):e.close(1e3,"Normal Closure")),e.removeEventListener("close",i),o())}))]}function h(e){if(!function(e){return n(e)&&"code"in e&&"reason"in e}(e))throw e;if([1002,1011,4400,4401,4409,4429].includes(e.code))throw e;if(1e3===e.code)return!1;if(3499===e.code)return!1;if(!a||b.retries>=a)throw e;return b.retrying=!0,!0}let E,C;return r||(async()=>{for(;;)try{const[,e]=await v({current:null});return void await e()}catch(e){if(!h(e))return}})(),{on:g.on,subscribe(e,t){const n=p();let o=!1;const r={current:null},c=({data:e})=>{const c=function(e){return e!==E&&(C=s(e),E=e),C}(e);switch(c.type){case i.Next:return void(c.id===n&&t.next(c.payload));case i.Error:return void(c.id===n&&(t.error(c.payload),r.current()));case i.Complete:return void(c.id===n&&(o=!0,r.current()))}};return(async()=>{for(;;)try{const[t,a]=await v(r);return t.addEventListener("message",c),t.send(l({id:n,type:i.Subscribe,payload:e})),await a((()=>{o||t.send(l({id:n,type:i.Complete}))})),void t.removeEventListener("message",c)}catch(e){if(!h(e))return}})().catch(t.error).then(t.complete),()=>{var e;null===(e=r.current)||void 0===e||e.call(r)}},dispose(){var e;null===(e=b.socket)||void 0===e||e.close(1e3,"Normal Closure"),g.reset()}}},Object.defineProperty(e,"__esModule",{value:!0})}));
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).graphqlWs={})}(this,(function(e){"use strict";const t=Object.prototype.hasOwnProperty;function n(e){return"object"==typeof e&&null!==e}function o(e,n){return t.call(e,n)}function r(e,o){return t.call(e,o)&&n(e[o])}function c(e,n){return t.call(e,n)&&"string"==typeof e[n]}var i;function s(e){if(n(e)){if(!c(e,"type"))return!1;switch(e.type){case i.ConnectionInit:case i.ConnectionAck:return!o(e,"payload")||void 0===e.payload||n(e.payload);case i.Subscribe:return c(e,"id")&&r(e,"payload")&&(!o(e.payload,"operationName")||void 0===e.payload.operationName||null===e.payload.operationName||"string"==typeof e.payload.operationName)&&c(e.payload,"query")&&(!o(e.payload,"variables")||void 0===e.payload.variables||null===e.payload.variables||r(e.payload,"variables"));case i.Next:return c(e,"id")&&r(e,"payload");case i.Error:return c(e,"id")&&(t=e.payload,Array.isArray(t)&&t.length>0&&t.every((e=>"message"in e)));case i.Complete:return c(e,"id");default:return!1}}var t;return!1}function a(e){if(s(e))return e;if("string"!=typeof e)throw new Error("Message not parsable");const t=JSON.parse(e);if(!s(t))throw new Error("Invalid message");return t}function l(e){if(!s(e))throw new Error("Cannot stringify invalid message");return JSON.stringify(e)}!function(e){e.ConnectionInit="connection_init",e.ConnectionAck="connection_ack",e.Subscribe="subscribe",e.Next="next",e.Error="error",e.Complete="complete"}(i||(i={})),e.createClient=function(e){const{url:t,connectionParams:o,lazy:r=!0,keepAlive:c=0,retryAttempts:s=5,retryWait:u=async function(e){let t=1e3;for(let n=0;n<e;n++)t*=2;await new Promise((e=>setTimeout(e,t+Math.floor(2700*Math.random()+300))))},on:d,webSocketImpl:f,generateID:p=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(e=>{const t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)}))}}=e;let y;if(f){if(!("function"==typeof(m=f)&&"constructor"in m&&"CLOSED"in m&&"CLOSING"in m&&"CONNECTING"in m&&"OPEN"in m))throw new Error("Invalid WebSocket implementation provided");y=f}else"undefined"!=typeof WebSocket?y=WebSocket:"undefined"!=typeof global?y=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&(y=window.WebSocket||window.MozWebSocket);var m;if(!y)throw new Error("WebSocket implementation missing");const g=y,w=(()=>{const e={connecting:(null==d?void 0:d.connecting)?[d.connecting]:[],connected:(null==d?void 0:d.connected)?[d.connected]:[],closed:(null==d?void 0:d.closed)?[d.closed]:[]};return{on(t,n){const o=e[t];return o.push(n),()=>{o.splice(o.indexOf(n),1)}},emit(t,...n){for(const o of e[t])o(...n)},reset(){Object.keys(e).forEach((t=>{e[t]=[]}))}}})();let b={disposed:!1,socket:null,acknowledged:!1,locks:0,retrying:!1,retries:0};const k=[];async function v(e,n=0){var r;if(n>10)throw new Error("Kept trying to connect but the socket never settled.");if(b.retrying&&0===n)if(k.length)await new Promise((e=>k.push(e)));else for(k.push((()=>{})),await u(b.retries);k.length;)null===(r=k.pop())||void 0===r||r();if(n&&await new Promise((e=>setTimeout(e,50*n))),b.socket)switch(b.socket.readyState){case g.OPEN:return b.acknowledged?x(b.socket,e):v(e,n+1);case g.CONNECTING:return v(e,n+1);case g.CLOSED:break;case g.CLOSING:return v(e,n+1);default:throw new Error(`Impossible ready state ${b.socket.readyState}`)}const c=new g(t,"graphql-transport-ws");return b=Object.assign(Object.assign({},b),{acknowledged:!1,socket:c,retries:b.retries+(b.retrying?1:0)}),w.emit("connecting"),await new Promise(((t,n)=>{let r=!1;e.current=()=>r=!0;const s=setTimeout((()=>{c.close(3408,"Waited 5 seconds but socket connect never settled")}),5e3);c.onclose=e=>(c.onclose=null,clearTimeout(s),b=Object.assign(Object.assign({},b),{acknowledged:!1,socket:null}),w.emit("closed",e),n(e)),c.onmessage=e=>{if(c.onmessage=null,r)c.close(3499,"Client cancelled the socket before connecting");else try{const n=a(e.data);if(n.type!==i.ConnectionAck)throw new Error(`First message cannot be of type ${n.type}`);return clearTimeout(s),b=Object.assign(Object.assign({},b),{acknowledged:!0,socket:c,retrying:!1,retries:0}),w.emit("connected",c,n.payload),t()}catch(e){c.close(4400,e instanceof Error?e.message:new Error(e).message)}},c.onopen=()=>{c.onopen=null,r?c.close(3499,"Client cancelled the socket before connecting"):(async()=>{try{c.send(l({type:i.ConnectionInit,payload:"function"==typeof o?await o():o}))}catch(e){c.close(4400,e instanceof Error?e.message:new Error(e).message)}})()}})),x(c,e)}async function x(e,t){return[e,n=>new Promise(((o,r)=>{if(e.readyState===g.CLOSED)return r(new Error("Socket has already been closed"));function i(n){return t.current=null,b.locks--,e.removeEventListener("close",i),r(n)}b.locks++,e.addEventListener("close",i),t.current=()=>(t.current=null,null==n||n(),b.locks--,b.locks||(c>0&&isFinite(c)?setTimeout((()=>{!b.locks&&e.OPEN&&e.close(1e3,"Normal Closure")}),c):e.close(1e3,"Normal Closure")),e.removeEventListener("close",i),o())}))]}function h(e){if(!function(e){return n(e)&&"code"in e&&"reason"in e}(e))throw e;if([1002,1011,4400,4401,4409,4429].includes(e.code))throw e;if(b.disposed||1e3===e.code)return!1;if(3499===e.code)return!1;if(!s||b.retries>=s)throw e;return b.retrying=!0,!0}let E,C;return r||(async()=>{for(;;)try{const[,e]=await v({current:null});return void await e()}catch(e){if(!h(e))return}})(),{on:w.on,subscribe(e,t){const n=p();let o=!1;const r={current:null},c=({data:e})=>{const c=function(e){return e!==E&&(C=a(e),E=e),C}(e);switch(c.type){case i.Next:return void(c.id===n&&t.next(c.payload));case i.Error:return void(c.id===n&&(t.error(c.payload),r.current()));case i.Complete:return void(c.id===n&&(o=!0,r.current()))}};return(async()=>{for(;;)try{const[t,s]=await v(r);return t.addEventListener("message",c),t.send(l({id:n,type:i.Subscribe,payload:e})),await s((()=>{o||t.send(l({id:n,type:i.Complete}))})),void t.removeEventListener("message",c)}catch(e){if(!h(e))return}})().catch(t.error).then(t.complete),()=>{var e;null===(e=r.current)||void 0===e||e.call(r)}},dispose(){var e;b.disposed=!0,null===(e=b.socket)||void 0===e||e.close(1e3,"Normal Closure"),w.reset()}}},Object.defineProperty(e,"__esModule",{value:!0})}));

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