Socket
Socket
Sign inDemoInstall

graphql-ws

Package Overview
Dependencies
Maintainers
2
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.1.0 to 4.1.1

8

CHANGELOG.md

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

## [4.1.1](https://github.com/enisdenjo/graphql-ws/compare/v4.1.0...v4.1.1) (2021-01-19)
### Bug Fixes
* **client:** Export relevant elements from the browser bundle ([b106dbe](https://github.com/enisdenjo/graphql-ws/commit/b106dbed1440488692a5588dcfd73f2f5a855a74)), closes [#97](https://github.com/enisdenjo/graphql-ws/issues/97)
* **client:** Wait for server acknowledgement indefinitely ([a4bd602](https://github.com/enisdenjo/graphql-ws/commit/a4bd6029916e26a48b3f1acbbf9d741775e34baa)), closes [#98](https://github.com/enisdenjo/graphql-ws/issues/98)
# [4.1.0](https://github.com/enisdenjo/graphql-ws/compare/v4.0.0...v4.1.0) (2021-01-13)

@@ -2,0 +10,0 @@

2

lib/client.d.ts

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

import { SubscribePayload } from './message';
export * from './message';
export * from './protocol';
export declare type EventConnecting = 'connecting';

@@ -10,0 +12,0 @@ export declare type EventConnected = 'connected';

18

lib/client.js

@@ -7,2 +7,12 @@ "use strict";

*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -13,2 +23,5 @@ exports.createClient = void 0;

const utils_1 = require("./utils");
// this file is the entry point for browsers, re-export relevant elements
__exportStar(require("./message"), exports);
__exportStar(require("./protocol"), exports);
/** Creates a disposable GraphQL over WebSocket client. */

@@ -161,5 +174,2 @@ function createClient(options) {

cancellerRef.current = () => (cancelled = true);
const tooLong = setTimeout(() => {
socket.close(3408, 'Waited 5 seconds but socket connect never settled');
}, 5 * 1000);
/**

@@ -175,3 +185,2 @@ * `onerror` handler is unnecessary because even if an error occurs, the `onclose` handler will be called

socket.onclose = null;
clearTimeout(tooLong);
state = Object.assign(Object.assign({}, state), { acknowledged: false, socket: null });

@@ -192,3 +201,2 @@ emitter.emit('closed', event);

}
clearTimeout(tooLong);
state = Object.assign(Object.assign({}, state), { acknowledged: true, socket, retrying: false, retries: 0 });

@@ -195,0 +203,0 @@ emitter.emit('connected', socket, message.payload); // connected = socket opened + acknowledged

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

@@ -68,7 +68,7 @@ "keywords": [

"@types/ws": "^7.4.0",
"@typescript-eslint/eslint-plugin": "^4.13.0",
"@typescript-eslint/parser": "^4.13.0",
"@typescript-eslint/eslint-plugin": "^4.14.0",
"@typescript-eslint/parser": "^4.14.0",
"babel-jest": "^26.6.3",
"eslint": "^7.17.0",
"eslint-config-prettier": "^7.1.0",
"eslint": "^7.18.0",
"eslint-config-prettier": "^7.2.0",
"eslint-plugin-prettier": "^3.3.1",

@@ -78,8 +78,8 @@ "graphql": "^15.4.0",

"prettier": "^2.2.1",
"rollup": "^2.36.1",
"rollup": "^2.37.0",
"rollup-plugin-terser": "^7.0.2",
"semantic-release": "^17.3.1",
"semantic-release": "^17.3.4",
"tslib": "^2.1.0",
"typedoc": "^0.20.14",
"typedoc-plugin-markdown": "^3.4.0",
"typedoc": "^0.20.16",
"typedoc-plugin-markdown": "^3.4.1",
"typescript": "^4.1.3",

@@ -86,0 +86,0 @@ "ws": "^7.4.2"

@@ -42,4 +42,2 @@ (function (global, factory) {

*/
/** Types of messages allowed to be sent by the client/server over the WS protocol. */
var MessageType;
(function (MessageType) {

@@ -52,3 +50,3 @@ MessageType["ConnectionInit"] = "connection_init";

MessageType["Complete"] = "complete";
})(MessageType || (MessageType = {}));
})(exports.MessageType || (exports.MessageType = {}));
/** Checks if the provided value is a message. */

@@ -63,3 +61,3 @@ function isMessage(val) {

switch (val.type) {
case MessageType.ConnectionInit:
case exports.MessageType.ConnectionInit:
// the connection init message can have optional payload object

@@ -69,3 +67,3 @@ return (!hasOwnProperty(val, 'payload') ||

isObject(val.payload));
case MessageType.ConnectionAck:
case exports.MessageType.ConnectionAck:
// the connection ack message can have optional payload object too

@@ -75,3 +73,3 @@ return (!hasOwnProperty(val, 'payload') ||

isObject(val.payload));
case MessageType.Subscribe:
case exports.MessageType.Subscribe:
return (hasOwnStringProperty(val, 'id') &&

@@ -88,8 +86,8 @@ hasOwnObjectProperty(val, 'payload') &&

hasOwnObjectProperty(val.payload, 'variables')));
case MessageType.Next:
case exports.MessageType.Next:
return (hasOwnStringProperty(val, 'id') &&
hasOwnObjectProperty(val, 'payload'));
case MessageType.Error:
case exports.MessageType.Error:
return hasOwnStringProperty(val, 'id') && areGraphQLErrors(val.payload);
case MessageType.Complete:
case exports.MessageType.Complete:
return hasOwnStringProperty(val, 'id');

@@ -276,5 +274,2 @@ default:

cancellerRef.current = () => (cancelled = true);
const tooLong = setTimeout(() => {
socket.close(3408, 'Waited 5 seconds but socket connect never settled');
}, 5 * 1000);
/**

@@ -290,3 +285,2 @@ * `onerror` handler is unnecessary because even if an error occurs, the `onclose` handler will be called

socket.onclose = null;
clearTimeout(tooLong);
state = Object.assign(Object.assign({}, state), { acknowledged: false, socket: null });

@@ -304,6 +298,5 @@ emitter.emit('closed', event);

const message = parseMessage(event.data);
if (message.type !== MessageType.ConnectionAck) {
if (message.type !== exports.MessageType.ConnectionAck) {
throw new Error(`First message cannot be of type ${message.type}`);
}
clearTimeout(tooLong);
state = Object.assign(Object.assign({}, state), { acknowledged: true, socket, retrying: false, retries: 0 });

@@ -328,3 +321,3 @@ emitter.emit('connected', socket, message.payload); // connected = socket opened + acknowledged

socket.send(stringifyMessage({
type: MessageType.ConnectionInit,
type: exports.MessageType.ConnectionInit,
payload: typeof connectionParams === 'function'

@@ -466,3 +459,3 @@ ? await connectionParams()

switch (message.type) {
case MessageType.Next: {
case exports.MessageType.Next: {
if (message.id === id) {

@@ -474,3 +467,3 @@ // eslint-disable-next-line @typescript-eslint/no-explicit-any

}
case MessageType.Error: {
case exports.MessageType.Error: {
if (message.id === id) {

@@ -488,3 +481,3 @@ sink.error(message.payload);

}
case MessageType.Complete: {
case exports.MessageType.Complete: {
if (message.id === id) {

@@ -510,3 +503,3 @@ completed = true;

id: id,
type: MessageType.Subscribe,
type: exports.MessageType.Subscribe,
payload,

@@ -521,3 +514,3 @@ }));

id: id,
type: MessageType.Complete,
type: exports.MessageType.Complete,
}));

@@ -564,3 +557,7 @@ }

exports.GRAPHQL_TRANSPORT_WS_PROTOCOL = GRAPHQL_TRANSPORT_WS_PROTOCOL;
exports.createClient = createClient;
exports.isMessage = isMessage;
exports.parseMessage = parseMessage;
exports.stringifyMessage = stringifyMessage;

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

@@ -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 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,onNonLazyError:c=console.error,keepAlive:s=0,retryAttempts:u=5,retryWait:d=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:f,webSocketImpl:p,generateID:y=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 g;if(p){if(!("function"==typeof(m=p)&&"constructor"in m&&"CLOSED"in m&&"CLOSING"in m&&"CONNECTING"in m&&"OPEN"in m))throw new Error("Invalid WebSocket implementation provided");g=p}else"undefined"!=typeof WebSocket?g=WebSocket:"undefined"!=typeof global?g=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&(g=window.WebSocket||window.MozWebSocket);var m;if(!g)throw new Error("WebSocket implementation missing");const w=g,b=(()=>{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]:[]};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 v={disposed:!1,socket:null,acknowledged:!1,locks:0,retrying:!1,retries:0};const h=[];async function k(e,n=0){var r;if(n){if(n>10)throw new Error("Kept trying to connect but the socket never settled.");await new Promise((e=>setTimeout(e,50*n)))}if(v.retrying)if(h.length)await new Promise((e=>h.push(e)));else for(h.push((()=>{})),await d(v.retries),v=Object.assign(Object.assign({},v),{retrying:!1,retries:v.retries+1});h.length;)null===(r=h.pop())||void 0===r||r();if(v.socket)switch(v.socket.readyState){case w.OPEN:return v.acknowledged?x(v.socket,e):k(e,n+1);case w.CONNECTING:return k(e,n+1);case w.CLOSED:break;case w.CLOSING:return k(e,n+1);default:throw new Error(`Impossible ready state ${v.socket.readyState}`)}const c=new w(t,"graphql-transport-ws");return v=Object.assign(Object.assign({},v),{acknowledged:!1,socket:c}),b.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),v=Object.assign(Object.assign({},v),{acknowledged:!1,socket:null}),b.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),v=Object.assign(Object.assign({},v),{acknowledged:!0,socket:c,retrying:!1,retries:0}),b.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 c(n){return t.current=null,v.locks--,e.removeEventListener("close",c),r(n)}v.locks++,e.addEventListener("close",c),t.current=()=>(t.current=null,null==n||n(),v.locks--,v.locks||(s>0&&isFinite(s)?setTimeout((()=>{!v.locks&&e.OPEN&&e.close(1e3,"Normal Closure")}),s):e.close(1e3,"Normal Closure")),e.removeEventListener("close",c),o())}))]}function E(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(v.disposed||1e3===e.code)return!1;if(3499===e.code)return!1;if(!u||v.retries>=u)throw e;return v.retrying=!0,!0}let C,O;return r||(async()=>{for(;;)try{const[,e]=await k({current:null});return void await e()}catch(e){try{if(!E(e))return null==c?void 0:c(e)}catch(t){return null==c?void 0:c(e)}}})(),{on:b.on,subscribe(e,t){const n=y();let o=!1;const r={current:null},c=({data:e})=>{const c=function(e){return e!==C&&(O=a(e),C=e),O}(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 k(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(!E(e))return}})().catch(t.error).then(t.complete),()=>{var e;null===(e=r.current)||void 0===e||e.call(r)}},dispose(){var e;v.disposed=!0,null===(e=v.socket)||void 0===e||e.close(1e3,"Normal Closure"),b.reset()}}},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",t=Object.prototype.hasOwnProperty;function r(e){return"object"==typeof e&&null!==e}function o(e,n){return t.call(e,n)}function s(e,n){return t.call(e,n)&&r(e[n])}function a(e,n){return t.call(e,n)&&"string"==typeof e[n]}var i;function c(n){if(r(n)){if(!a(n,"type"))return!1;switch(n.type){case e.MessageType.ConnectionInit:case e.MessageType.ConnectionAck:return!o(n,"payload")||void 0===n.payload||r(n.payload);case e.MessageType.Subscribe:return a(n,"id")&&s(n,"payload")&&(!o(n.payload,"operationName")||void 0===n.payload.operationName||null===n.payload.operationName||"string"==typeof n.payload.operationName)&&a(n.payload,"query")&&(!o(n.payload,"variables")||void 0===n.payload.variables||null===n.payload.variables||s(n.payload,"variables"));case e.MessageType.Next:return a(n,"id")&&s(n,"payload");case e.MessageType.Error:return a(n,"id")&&(t=n.payload,Array.isArray(t)&&t.length>0&&t.every((e=>"message"in e)));case e.MessageType.Complete:return a(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)}(i=e.MessageType||(e.MessageType={})).ConnectionInit="connection_init",i.ConnectionAck="connection_ack",i.Subscribe="subscribe",i.Next="next",i.Error="error",i.Complete="complete",e.GRAPHQL_TRANSPORT_WS_PROTOCOL=n,e.createClient=function(t){const{url:o,connectionParams:s,lazy:a=!0,onNonLazyError:i=console.error,keepAlive:c=0,retryAttempts:u=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))))},on:y,webSocketImpl:f,generateID:g=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(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");w=f}else"undefined"!=typeof WebSocket?w=WebSocket:"undefined"!=typeof global?w=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&(w=window.WebSocket||window.MozWebSocket);var m;if(!w)throw new Error("WebSocket implementation missing");const b=w,v=(()=>{const e={connecting:(null==y?void 0:y.connecting)?[y.connecting]:[],connected:(null==y?void 0:y.connected)?[y.connected]:[],closed:(null==y?void 0:y.closed)?[y.closed]:[]};return{on(n,t){const r=e[n];return r.push(t),()=>{r.splice(r.indexOf(t),1)}},emit(n,...t){for(const r of e[n])r(...t)},reset(){Object.keys(e).forEach((n=>{e[n]=[]}))}}})();let h={disposed:!1,socket:null,acknowledged:!1,locks:0,retrying:!1,retries:0};const x=[];async function k(t,r=0){var a;if(r){if(r>10)throw new Error("Kept trying to connect but the socket never settled.");await new Promise((e=>setTimeout(e,50*r)))}if(h.retrying)if(x.length)await new Promise((e=>x.push(e)));else for(x.push((()=>{})),await p(h.retries),h=Object.assign(Object.assign({},h),{retrying:!1,retries:h.retries+1});x.length;)null===(a=x.pop())||void 0===a||a();if(h.socket)switch(h.socket.readyState){case b.OPEN:return h.acknowledged?E(h.socket,t):k(t,r+1);case b.CONNECTING:return k(t,r+1);case b.CLOSED:break;case b.CLOSING:return k(t,r+1);default:throw new Error(`Impossible ready state ${h.socket.readyState}`)}const i=new b(o,n);return h=Object.assign(Object.assign({},h),{acknowledged:!1,socket:i}),v.emit("connecting"),await new Promise(((n,r)=>{let o=!1;t.current=()=>o=!0,i.onclose=e=>(i.onclose=null,h=Object.assign(Object.assign({},h),{acknowledged:!1,socket:null}),v.emit("closed",e),r(e)),i.onmessage=t=>{if(i.onmessage=null,o)i.close(3499,"Client cancelled the socket before connecting");else try{const r=l(t.data);if(r.type!==e.MessageType.ConnectionAck)throw new Error(`First message cannot be of type ${r.type}`);return h=Object.assign(Object.assign({},h),{acknowledged:!0,socket:i,retrying:!1,retries:0}),v.emit("connected",i,r.payload),n()}catch(e){i.close(4400,e instanceof Error?e.message:new Error(e).message)}},i.onopen=()=>{i.onopen=null,o?i.close(3499,"Client cancelled the socket before connecting"):(async()=>{try{i.send(d({type:e.MessageType.ConnectionInit,payload:"function"==typeof s?await s():s}))}catch(e){i.close(4400,e instanceof Error?e.message:new Error(e).message)}})()}})),E(i,t)}async function E(e,n){return[e,t=>new Promise(((r,o)=>{if(e.readyState===b.CLOSED)return o(new Error("Socket has already been closed"));function s(t){return n.current=null,h.locks--,e.removeEventListener("close",s),o(t)}h.locks++,e.addEventListener("close",s),n.current=()=>(n.current=null,null==t||t(),h.locks--,h.locks||(c>0&&isFinite(c)?setTimeout((()=>{!h.locks&&e.OPEN&&e.close(1e3,"Normal Closure")}),c):e.close(1e3,"Normal Closure")),e.removeEventListener("close",s),r())}))]}function O(e){if(!function(e){return r(e)&&"code"in e&&"reason"in e}(e))throw e;if([1002,1011,4400,4401,4409,4429].includes(e.code))throw e;if(h.disposed||1e3===e.code)return!1;if(3499===e.code)return!1;if(!u||h.retries>=u)throw e;return h.retrying=!0,!0}let C,S;return a||(async()=>{for(;;)try{const[,e]=await k({current:null});return void await e()}catch(e){try{if(!O(e))return null==i?void 0:i(e)}catch(n){return null==i?void 0:i(e)}}})(),{on:v.on,subscribe(n,t){const r=g();let o=!1;const s={current:null},a=({data:n})=>{const a=function(e){return e!==C&&(S=l(e),C=e),S}(n);switch(a.type){case e.MessageType.Next:return void(a.id===r&&t.next(a.payload));case e.MessageType.Error:return void(a.id===r&&(t.error(a.payload),s.current()));case e.MessageType.Complete:return void(a.id===r&&(o=!0,s.current()))}};return(async()=>{for(;;)try{const[t,i]=await k(s);return t.addEventListener("message",a),t.send(d({id:r,type:e.MessageType.Subscribe,payload:n})),await i((()=>{o||t.send(d({id:r,type:e.MessageType.Complete}))})),void t.removeEventListener("message",a)}catch(e){if(!O(e))return}})().catch(t.error).then(t.complete),()=>{var e;null===(e=s.current)||void 0===e||e.call(s)}},dispose(){var e;h.disposed=!0,null===(e=h.socket)||void 0===e||e.close(1e3,"Normal Closure"),v.reset()}}},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

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