@wxn0brp/gloves-link-client 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- var h=class{_events={};on(n,t){let e=n;this._events[e]||(this._events[e]=[]),this._events[e].push(t)}once(n,t){let e=(...s)=>{this.off(n,e),t(...s)};this.on(n,e)}off(n,t){let e=n;this._events[e]&&(this._events[e]=this._events[e].filter(s=>s!==t))}emit(n,...t){let e=this._events[n];e&&e.length>0&&e.forEach(s=>{s(...t)})}listenerCount(n){return this._events[n]?.length||0}},d=h;var u;if(typeof window>"u"){let{WebSocket:c}=await import("ws");u=c}else u=window.WebSocket;var p=u;var v=class{ws;ackIdCounter;ackCallbacks;handlers=new d;opts;url;constructor(n,t={}){this.ackIdCounter=1,this.ackCallbacks=new Map,this.opts={logs:!1,reConnect:!0,reConnectInterval:1e3,token:null,...t},this.url=new URL(n,window?window.location.href.replace("http","ws"):"ws://localhost"),this.opts.token&&this.url.searchParams.set("token",this.opts.token),this._connect()}_connect(){let n=Date.now().toString(36)+Math.random().toString(36).substring(2,10);this.url.searchParams.set("id",n),this.ws=new p(this.url.href),this.ws.onopen=()=>{this.opts.logs&&console.log("[ws] Connected"),this.handlers.emit("connect",this.ws)},this.ws.onerror=(...t)=>{this.opts.logs&&console.warn("[ws] Error:",t),this.handlers.emit("error",...t)},this.ws.onmessage=t=>{let e=t?.data?.toString()||t?.toString()||"",s;try{s=JSON.parse(e)}catch{this.opts.logs&&console.warn("[ws] Invalid JSON:",e);return}if("ack"in s){let r=s.ack,a=this.ackCallbacks.get(r);a&&(this.ackCallbacks.delete(r),a(...s.data));return}let{evt:i,data:o,ackI:l}=s;if(!(!i||o&&!Array.isArray(o))){if(Array.isArray(l))for(let r=0;r<l.length;r++){let a=l[r];if(!o[a])break;let f=o[a];o[a]=(...k)=>{this.ws.send(JSON.stringify({ack:f,data:k}))}}this.handlers.emit(i,...o)}},this.ws.onclose=t=>{if(this.opts.logs&&console.log("[ws] Disconnected",t),this.handlers.emit("disconnect",this.ws,t),t.code===1006){this.opts.logs&&console.log("[ws] Connection closed by server"),fetch("/gloves-link/status?id="+n).then(e=>e.json()).then(e=>{if(e.err){this.opts.logs&&console.log("[ws] Status error",e.msg);return}let s=e.status;this.opts.logs&&console.log("[ws] Status",s),s===401?this.handlers.emit("unauthorized",this.ws):s===403?this.handlers.emit("forbidden",this.ws):s===500&&this.handlers.emit("serverError",this.ws)});return}this.opts.reConnect&&setTimeout(()=>{this._connect()},this.opts.reConnectInterval)}}on(n,t){this.handlers.on(n,t)}once(n,t){this.handlers.once(n,t)}emit(n,...t){let e=t.map((s,i)=>{if(typeof s=="function")return i}).filter(s=>s!==void 0);for(let s=0;s<e.length;s++){let i=e[s],o=this.ackIdCounter++;this.ackCallbacks.set(o,t[i]),t[i]=o}this.ws.send(JSON.stringify({evt:n,data:t||void 0,ackI:e.length?e:void 0}))}send(n,...t){return this.emit(n,...t)}close(){this.ws.close()}};export{v as GLC,v as GlovesLinkClient,v as client,v as default};
1
+ var l=class{_events={};on(s,t){let e=s;this._events[e]||(this._events[e]=[]),this._events[e].push(t)}once(s,t){let e=(...n)=>{this.off(s,e),t(...n)};this.on(s,e)}off(s,t){let e=s;this._events[e]&&(this._events[e]=this._events[e].filter(n=>n!==t))}emit(s,...t){let e=this._events[s];e&&e.length>0&&e.forEach(n=>{n(...t)})}listenerCount(s){return this._events[s]?.length||0}},h=l;var u=class{ws;ackIdCounter;ackCallbacks;handlers=new h;opts;url;connected=!1;_manuallyDisconnected=!1;constructor(s,t={}){this.ackIdCounter=1,this.ackCallbacks=new Map,this.opts={logs:!1,reConnect:!0,reConnectInterval:1e3,token:null,autoConnect:!0,...t},this.url=new URL(s,window?window.location.href.replace("http","ws"):"ws://localhost"),this.opts.token&&this.url.searchParams.set("token",this.opts.token),this.opts.autoConnect&&this.connect()}connect(){this._manuallyDisconnected=!1;let s=Date.now().toString(36)+Math.random().toString(36).substring(2,10);this.url.searchParams.set("id",s),this.ws=new WebSocket(this.url.href),this.ws.onopen=()=>{this.connected=!0,this.opts.logs&&console.log("[ws] Connected"),this.handlers.emit("connect",this.ws)},this.ws.onerror=(...t)=>{this.opts.logs&&console.warn("[ws] Error:",t),this.handlers.emit("error",...t)},this.ws.onmessage=t=>{let e=t?.data?.toString()||t?.toString()||"",n;try{n=JSON.parse(e)}catch{this.opts.logs&&console.warn("[ws] Invalid JSON:",e);return}if("ack"in n){let i=n.ack,r=this.ackCallbacks.get(i);r&&(this.ackCallbacks.delete(i),r(...n.data));return}let{evt:o,data:a,ackI:c}=n;if(!(!o||a&&!Array.isArray(a))){if(Array.isArray(c))for(let i=0;i<c.length;i++){let r=c[i];if(!a[r])break;let p=a[r];a[r]=(...v)=>{this.ws.send(JSON.stringify({ack:p,data:v}))}}this.handlers.emit(o,...a)}},this.ws.onclose=async t=>{if(this.connected=!1,this.opts.logs&&console.log("[ws] Disconnected",t),this.handlers.emit("disconnect",this.ws,t),this._manuallyDisconnected){this._manuallyDisconnected=!1;return}if(t.code===1006){this.opts.logs&&console.log("[ws] Connection closed by server");let e=new URLSearchParams;e.set("id",s),e.set("path",this.url.pathname);let n=await fetch("/gloves-link/status?"+e.toString()).then(a=>a.json());if(n.err){this.opts.logs&&console.log("[ws] Status error",n.msg);return}let o=n.status;this.opts.logs&&console.log("[ws] Status",o),o.status===401?this.handlers.emit("unauthorized",this.ws):o.status===403?this.handlers.emit("forbidden",this.ws):o.status===500&&this.handlers.emit("serverError",this.ws);return}this.opts.reConnect&&setTimeout(()=>{this.connect()},this.opts.reConnectInterval)}}on(s,t){this.handlers.on(s,t)}once(s,t){this.handlers.once(s,t)}emit(s,...t){let e=t.map((n,o)=>{if(typeof n=="function")return o}).filter(n=>n!==void 0);for(let n=0;n<e.length;n++){let o=e[n],a=this.ackIdCounter++;this.ackCallbacks.set(a,t[o]),t[o]=a}this.ws.send(JSON.stringify({evt:s,data:t||void 0,ackI:e.length?e:void 0}))}send(s,...t){return this.emit(s,...t)}disconnect(){this._manuallyDisconnected=!0,this.ws.close()}close(){this.ws.close()}};export{u as GLC,u as GlovesLinkClient,u as client,u as default};
2
2
  //# sourceMappingURL=GlovesLinkClient.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../node_modules/@wxn0brp/event-emitter/dist/index.js", "../src/universal.ts", "../src/index.ts"],
4
- "sourcesContent": ["export class VEE {\n _events = {};\n /**\n * Registers an event listener\n * @param {K} event - event name\n * @param {Function} listener - function to be called when event occurs\n */\n on(event, listener) {\n const _event = event;\n if (!this._events[_event])\n this._events[_event] = [];\n this._events[_event].push(listener);\n }\n /**\n * Registers a one-time event listener\n * @param {K} event - event name\n * @param {Function} listener - function to be called once\n */\n once(event, listener) {\n const onceListener = (...args) => {\n this.off(event, onceListener);\n listener(...args);\n };\n this.on(event, onceListener);\n }\n /**\n * Removes an event listener.\n * @param {K} event - event name\n * @param {Function} listener - listener to remove\n */\n off(event, listener) {\n const _event = event;\n if (!this._events[_event])\n return;\n this._events[_event] = this._events[_event].filter(l => l !== listener);\n }\n /**\n * Emits an event\n * @param {K} event - event name\n * @param {...EventArgs<T, K>} args - arguments to be passed to listeners\n */\n emit(event, ...args) {\n const listeners = this._events[event];\n if (listeners && listeners.length > 0) {\n listeners.forEach(listener => {\n listener(...args);\n });\n }\n }\n /**\n * Returns the number of listeners for the given event\n * @param {K} event - event name\n */\n listenerCount(event) {\n return this._events[event]?.length || 0;\n }\n}\nexport default VEE;\nexport { VEE as EventEmitter };\n", "let WebSocketImpl: any;\n\nif (typeof window === \"undefined\") {\n const { WebSocket } = await import(\"ws\");\n WebSocketImpl = WebSocket;\n} else {\n WebSocketImpl = window.WebSocket;\n}\n\nexport default WebSocketImpl;", "import VEE, { EventArgs, EventMap, EventName } from \"@wxn0brp/event-emitter\";\nimport WebSocketImpl from \"./universal\";\n\nexport interface GLC_Opts {\n reConnect: boolean,\n reConnectInterval: number,\n logs: boolean;\n token: string;\n}\n\nexport interface GLC_DataEvent {\n evt: string;\n data: any[];\n ackI?: number[];\n}\n\nexport interface GLC_AckEvent {\n ack: number;\n data: any[];\n}\n\nexport type InternalEvents = {\n connect: (ws: WebSocket) => void;\n error: (...err: any[]) => void;\n disconnect: (ws: WebSocket, event: CloseEvent) => void;\n unauthorized: (ws: WebSocket) => void;\n forbidden: (ws: WebSocket) => void;\n serverError: (ws: WebSocket) => void;\n}\n\nexport class GlovesLinkClient<InputEvents extends EventMap = {}, OutputEvents extends EventMap = {}> {\n public ws: WebSocket;\n public ackIdCounter: number;\n public ackCallbacks: Map<number, Function>;\n public handlers = new VEE<InputEvents>();\n public opts: GLC_Opts;\n public url: URL;\n\n constructor(url: string, opts: Partial<GLC_Opts> = {}) {\n this.ackIdCounter = 1;\n this.ackCallbacks = new Map();\n this.opts = {\n logs: false,\n reConnect: true,\n reConnectInterval: 1000,\n token: null,\n ...opts\n }\n\n this.url = new URL(url, window ? window.location.href.replace(\"http\", \"ws\") : \"ws://localhost\");\n if (this.opts.token) this.url.searchParams.set(\"token\", this.opts.token);\n\n this._connect();\n }\n\n _connect() {\n const id = Date.now().toString(36) + Math.random().toString(36).substring(2, 10);\n this.url.searchParams.set(\"id\", id);\n this.ws = new WebSocketImpl(this.url.href);\n\n this.ws.onopen = () => {\n if (this.opts.logs) console.log(\"[ws] Connected\");\n // @ts-ignore\n this.handlers.emit(\"connect\", this.ws);\n }\n\n this.ws.onerror = (...err: any) => {\n if (this.opts.logs) console.warn(\"[ws] Error:\", err);\n // @ts-ignore\n this.handlers.emit(\"error\", ...err);\n }\n\n this.ws.onmessage = (_data) => {\n const raw = _data?.data?.toString() || _data?.toString() || \"\";\n let msg: GLC_DataEvent | GLC_AckEvent;\n\n try {\n msg = JSON.parse(raw);\n } catch {\n if (this.opts.logs) console.warn(\"[ws] Invalid JSON:\", raw);\n return;\n }\n\n if (\"ack\" in msg) {\n const ackId = msg.ack;\n const ackCallback = this.ackCallbacks.get(ackId);\n if (ackCallback) {\n this.ackCallbacks.delete(ackId);\n ackCallback(...msg.data);\n }\n return;\n }\n\n const { evt, data, ackI } = msg;\n if (!evt || (data && !Array.isArray(data))) return;\n\n if (Array.isArray(ackI)) {\n for (let i = 0; i < ackI.length; i++) {\n const ackIndex = ackI[i];\n if (!data[ackIndex]) break;\n\n const ackId = data[ackIndex];\n data[ackIndex] = (...res: any) => {\n this.ws.send(JSON.stringify({\n ack: ackId,\n data: res\n }));\n };\n }\n }\n\n // @ts-ignore\n this.handlers.emit(evt, ...data);\n }\n\n this.ws.onclose = (event: CloseEvent) => {\n if (this.opts.logs) console.log(\"[ws] Disconnected\", event);\n // @ts-ignore\n this.handlers.emit(\"disconnect\", this.ws, event);\n\n if (event.code === 1006) {\n if (this.opts.logs) console.log(\"[ws] Connection closed by server\");\n fetch(\"/gloves-link/status?id=\" + id).then(res => res.json()).then(data => {\n if (data.err) {\n if (this.opts.logs) console.log(\"[ws] Status error\", data.msg);\n return;\n }\n const status = data.status as number;\n if (this.opts.logs) console.log(\"[ws] Status\", status);\n // @ts-ignore\n if (status === 401) this.handlers.emit(\"unauthorized\", this.ws);\n // @ts-ignore\n else if (status === 403) this.handlers.emit(\"forbidden\", this.ws);\n // @ts-ignore\n else if (status === 500) this.handlers.emit(\"serverError\", this.ws);\n })\n return;\n }\n if (!this.opts.reConnect) return;\n\n setTimeout(() => {\n this._connect();\n }, this.opts.reConnectInterval);\n }\n }\n\n on<K extends EventName<InputEvents & InternalEvents>>(event: K, listener: (InputEvents & InternalEvents)[K]) {\n this.handlers.on(event, listener as any);\n }\n\n once<K extends EventName<InputEvents & InternalEvents>>(event: K, listener: (InputEvents & InternalEvents)[K]) {\n this.handlers.once(event, listener as any);\n }\n\n emit<K extends EventName<OutputEvents>>(evt: K, ...args: EventArgs<OutputEvents, K>) {\n const ackI = args.map((data, i) => {\n if (typeof data === \"function\") return i;\n }).filter(i => i !== undefined);\n\n for (let i = 0; i < ackI.length; i++) {\n const ackIndex = ackI[i];\n const ackId = this.ackIdCounter++;\n this.ackCallbacks.set(ackId, args[ackIndex]);\n args[ackIndex] = ackId;\n }\n\n this.ws.send(JSON.stringify({\n evt,\n data: args || undefined,\n ackI: ackI.length ? ackI : undefined\n }));\n }\n\n send<K extends EventName<OutputEvents>>(evt: K, ...args: EventArgs<OutputEvents, K>) {\n return this.emit(evt, ...args);\n }\n\n close() {\n this.ws.close();\n }\n}\n\nexport {\n GlovesLinkClient as default,\n GlovesLinkClient as GLC,\n GlovesLinkClient as client,\n}"],
5
- "mappings": "AAAO,IAAMA,EAAN,KAAU,CACb,QAAU,CAAC,EAMX,GAAGC,EAAOC,EAAU,CAChB,IAAMC,EAASF,EACV,KAAK,QAAQE,CAAM,IACpB,KAAK,QAAQA,CAAM,EAAI,CAAC,GAC5B,KAAK,QAAQA,CAAM,EAAE,KAAKD,CAAQ,CACtC,CAMA,KAAKD,EAAOC,EAAU,CAClB,IAAME,EAAe,IAAIC,IAAS,CAC9B,KAAK,IAAIJ,EAAOG,CAAY,EAC5BF,EAAS,GAAGG,CAAI,CACpB,EACA,KAAK,GAAGJ,EAAOG,CAAY,CAC/B,CAMA,IAAIH,EAAOC,EAAU,CACjB,IAAMC,EAASF,EACV,KAAK,QAAQE,CAAM,IAExB,KAAK,QAAQA,CAAM,EAAI,KAAK,QAAQA,CAAM,EAAE,OAAOG,GAAKA,IAAMJ,CAAQ,EAC1E,CAMA,KAAKD,KAAUI,EAAM,CACjB,IAAME,EAAY,KAAK,QAAQN,CAAK,EAChCM,GAAaA,EAAU,OAAS,GAChCA,EAAU,QAAQL,GAAY,CAC1BA,EAAS,GAAGG,CAAI,CACpB,CAAC,CAET,CAKA,cAAcJ,EAAO,CACjB,OAAO,KAAK,QAAQA,CAAK,GAAG,QAAU,CAC1C,CACJ,EACOO,EAAQR,ECzDf,IAAIS,EAEJ,GAAI,OAAO,OAAW,IAAa,CAC/B,GAAM,CAAE,UAAAC,CAAU,EAAI,KAAM,QAAO,IAAI,EACvCD,EAAgBC,CACpB,MACID,EAAgB,OAAO,UAG3B,IAAOE,EAAQF,ECqBR,IAAMG,EAAN,KAA8F,CAC1F,GACA,aACA,aACA,SAAW,IAAIC,EACf,KACA,IAEP,YAAYC,EAAaC,EAA0B,CAAC,EAAG,CACnD,KAAK,aAAe,EACpB,KAAK,aAAe,IAAI,IACxB,KAAK,KAAO,CACR,KAAM,GACN,UAAW,GACX,kBAAmB,IACnB,MAAO,KACP,GAAGA,CACP,EAEA,KAAK,IAAM,IAAI,IAAID,EAAK,OAAS,OAAO,SAAS,KAAK,QAAQ,OAAQ,IAAI,EAAI,gBAAgB,EAC1F,KAAK,KAAK,OAAO,KAAK,IAAI,aAAa,IAAI,QAAS,KAAK,KAAK,KAAK,EAEvE,KAAK,SAAS,CAClB,CAEA,UAAW,CACP,IAAME,EAAK,KAAK,IAAI,EAAE,SAAS,EAAE,EAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,EAC/E,KAAK,IAAI,aAAa,IAAI,KAAMA,CAAE,EAClC,KAAK,GAAK,IAAIC,EAAc,KAAK,IAAI,IAAI,EAEzC,KAAK,GAAG,OAAS,IAAM,CACf,KAAK,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAEhD,KAAK,SAAS,KAAK,UAAW,KAAK,EAAE,CACzC,EAEA,KAAK,GAAG,QAAU,IAAIC,IAAa,CAC3B,KAAK,KAAK,MAAM,QAAQ,KAAK,cAAeA,CAAG,EAEnD,KAAK,SAAS,KAAK,QAAS,GAAGA,CAAG,CACtC,EAEA,KAAK,GAAG,UAAaC,GAAU,CAC3B,IAAMC,EAAMD,GAAO,MAAM,SAAS,GAAKA,GAAO,SAAS,GAAK,GACxDE,EAEJ,GAAI,CACAA,EAAM,KAAK,MAAMD,CAAG,CACxB,MAAQ,CACA,KAAK,KAAK,MAAM,QAAQ,KAAK,qBAAsBA,CAAG,EAC1D,MACJ,CAEA,GAAI,QAASC,EAAK,CACd,IAAMC,EAAQD,EAAI,IACZE,EAAc,KAAK,aAAa,IAAID,CAAK,EAC3CC,IACA,KAAK,aAAa,OAAOD,CAAK,EAC9BC,EAAY,GAAGF,EAAI,IAAI,GAE3B,MACJ,CAEA,GAAM,CAAE,IAAAG,EAAK,KAAAC,EAAM,KAAAC,CAAK,EAAIL,EAC5B,GAAI,GAACG,GAAQC,GAAQ,CAAC,MAAM,QAAQA,CAAI,GAExC,IAAI,MAAM,QAAQC,CAAI,EAClB,QAASC,EAAI,EAAGA,EAAID,EAAK,OAAQC,IAAK,CAClC,IAAMC,EAAWF,EAAKC,CAAC,EACvB,GAAI,CAACF,EAAKG,CAAQ,EAAG,MAErB,IAAMN,EAAQG,EAAKG,CAAQ,EAC3BH,EAAKG,CAAQ,EAAI,IAAIC,IAAa,CAC9B,KAAK,GAAG,KAAK,KAAK,UAAU,CACxB,IAAKP,EACL,KAAMO,CACV,CAAC,CAAC,CACN,CACJ,CAIJ,KAAK,SAAS,KAAKL,EAAK,GAAGC,CAAI,EACnC,EAEA,KAAK,GAAG,QAAWK,GAAsB,CAKrC,GAJI,KAAK,KAAK,MAAM,QAAQ,IAAI,oBAAqBA,CAAK,EAE1D,KAAK,SAAS,KAAK,aAAc,KAAK,GAAIA,CAAK,EAE3CA,EAAM,OAAS,KAAM,CACjB,KAAK,KAAK,MAAM,QAAQ,IAAI,kCAAkC,EAClE,MAAM,0BAA4Bd,CAAE,EAAE,KAAKa,GAAOA,EAAI,KAAK,CAAC,EAAE,KAAKJ,GAAQ,CACvE,GAAIA,EAAK,IAAK,CACN,KAAK,KAAK,MAAM,QAAQ,IAAI,oBAAqBA,EAAK,GAAG,EAC7D,MACJ,CACA,IAAMM,EAASN,EAAK,OAChB,KAAK,KAAK,MAAM,QAAQ,IAAI,cAAeM,CAAM,EAEjDA,IAAW,IAAK,KAAK,SAAS,KAAK,eAAgB,KAAK,EAAE,EAErDA,IAAW,IAAK,KAAK,SAAS,KAAK,YAAa,KAAK,EAAE,EAEvDA,IAAW,KAAK,KAAK,SAAS,KAAK,cAAe,KAAK,EAAE,CACtE,CAAC,EACD,MACJ,CACK,KAAK,KAAK,WAEf,WAAW,IAAM,CACb,KAAK,SAAS,CAClB,EAAG,KAAK,KAAK,iBAAiB,CAClC,CACJ,CAEA,GAAsDD,EAAUE,EAA6C,CACzG,KAAK,SAAS,GAAGF,EAAOE,CAAe,CAC3C,CAEA,KAAwDF,EAAUE,EAA6C,CAC3G,KAAK,SAAS,KAAKF,EAAOE,CAAe,CAC7C,CAEA,KAAwCR,KAAWS,EAAkC,CACjF,IAAMP,EAAOO,EAAK,IAAI,CAACR,EAAM,IAAM,CAC/B,GAAI,OAAOA,GAAS,WAAY,OAAO,CAC3C,CAAC,EAAE,OAAOE,GAAKA,IAAM,MAAS,EAE9B,QAASA,EAAI,EAAGA,EAAID,EAAK,OAAQC,IAAK,CAClC,IAAMC,EAAWF,EAAKC,CAAC,EACjBL,EAAQ,KAAK,eACnB,KAAK,aAAa,IAAIA,EAAOW,EAAKL,CAAQ,CAAC,EAC3CK,EAAKL,CAAQ,EAAIN,CACrB,CAEA,KAAK,GAAG,KAAK,KAAK,UAAU,CACxB,IAAAE,EACA,KAAMS,GAAQ,OACd,KAAMP,EAAK,OAASA,EAAO,MAC/B,CAAC,CAAC,CACN,CAEA,KAAwCF,KAAWS,EAAkC,CACjF,OAAO,KAAK,KAAKT,EAAK,GAAGS,CAAI,CACjC,CAEA,OAAQ,CACJ,KAAK,GAAG,MAAM,CAClB,CACJ",
6
- "names": ["VEE", "event", "listener", "_event", "onceListener", "args", "l", "listeners", "dist_default", "WebSocketImpl", "WebSocket", "universal_default", "GlovesLinkClient", "dist_default", "url", "opts", "id", "universal_default", "err", "_data", "raw", "msg", "ackId", "ackCallback", "evt", "data", "ackI", "i", "ackIndex", "res", "event", "status", "listener", "args"]
3
+ "sources": ["../node_modules/@wxn0brp/event-emitter/dist/index.js", "../src/index.ts"],
4
+ "sourcesContent": ["export class VEE {\n _events = {};\n /**\n * Registers an event listener\n * @param {K} event - event name\n * @param {Function} listener - function to be called when event occurs\n */\n on(event, listener) {\n const _event = event;\n if (!this._events[_event])\n this._events[_event] = [];\n this._events[_event].push(listener);\n }\n /**\n * Registers a one-time event listener\n * @param {K} event - event name\n * @param {Function} listener - function to be called once\n */\n once(event, listener) {\n const onceListener = (...args) => {\n this.off(event, onceListener);\n listener(...args);\n };\n this.on(event, onceListener);\n }\n /**\n * Removes an event listener.\n * @param {K} event - event name\n * @param {Function} listener - listener to remove\n */\n off(event, listener) {\n const _event = event;\n if (!this._events[_event])\n return;\n this._events[_event] = this._events[_event].filter(l => l !== listener);\n }\n /**\n * Emits an event\n * @param {K} event - event name\n * @param {...EventArgs<T, K>} args - arguments to be passed to listeners\n */\n emit(event, ...args) {\n const listeners = this._events[event];\n if (listeners && listeners.length > 0) {\n listeners.forEach(listener => {\n listener(...args);\n });\n }\n }\n /**\n * Returns the number of listeners for the given event\n * @param {K} event - event name\n */\n listenerCount(event) {\n return this._events[event]?.length || 0;\n }\n}\nexport default VEE;\nexport { VEE as EventEmitter };\n", "import VEE, { EventArgs, EventMap, EventName } from \"@wxn0brp/event-emitter\";\n\nexport interface GLC_Opts {\n reConnect: boolean,\n reConnectInterval: number,\n logs: boolean;\n token: string;\n autoConnect: boolean;\n}\n\nexport interface GLC_DataEvent {\n evt: string;\n data: any[];\n ackI?: number[];\n}\n\nexport interface GLC_AckEvent {\n ack: number;\n data: any[];\n}\n\nexport type InternalEvents = {\n connect: (ws: WebSocket) => void;\n error: (...err: any[]) => void;\n disconnect: (ws: WebSocket, event: CloseEvent) => void;\n unauthorized: (ws: WebSocket) => void;\n forbidden: (ws: WebSocket) => void;\n serverError: (ws: WebSocket) => void;\n}\n\nexport class GlovesLinkClient<InputEvents extends EventMap = {}, OutputEvents extends EventMap = {}> {\n public ws: WebSocket;\n public ackIdCounter: number;\n public ackCallbacks: Map<number, Function>;\n public handlers = new VEE<InputEvents>();\n public opts: GLC_Opts;\n public url: URL;\n public connected: boolean = false;\n private _manuallyDisconnected: boolean = false;\n\n constructor(url: string, opts: Partial<GLC_Opts> = {}) {\n this.ackIdCounter = 1;\n this.ackCallbacks = new Map();\n this.opts = {\n logs: false,\n reConnect: true,\n reConnectInterval: 1000,\n token: null,\n autoConnect: true,\n ...opts\n }\n\n this.url = new URL(url, window ? window.location.href.replace(\"http\", \"ws\") : \"ws://localhost\");\n if (this.opts.token) this.url.searchParams.set(\"token\", this.opts.token);\n\n if (this.opts.autoConnect) this.connect();\n }\n\n connect() {\n this._manuallyDisconnected = false;\n const id = Date.now().toString(36) + Math.random().toString(36).substring(2, 10);\n this.url.searchParams.set(\"id\", id);\n this.ws = new WebSocket(this.url.href);\n\n this.ws.onopen = () => {\n this.connected = true;\n if (this.opts.logs) console.log(\"[ws] Connected\");\n // @ts-ignore\n this.handlers.emit(\"connect\", this.ws);\n }\n\n this.ws.onerror = (...err: any) => {\n if (this.opts.logs) console.warn(\"[ws] Error:\", err);\n // @ts-ignore\n this.handlers.emit(\"error\", ...err);\n }\n\n this.ws.onmessage = (_data) => {\n const raw = _data?.data?.toString() || _data?.toString() || \"\";\n let msg: GLC_DataEvent | GLC_AckEvent;\n\n try {\n msg = JSON.parse(raw);\n } catch {\n if (this.opts.logs) console.warn(\"[ws] Invalid JSON:\", raw);\n return;\n }\n\n if (\"ack\" in msg) {\n const ackId = msg.ack;\n const ackCallback = this.ackCallbacks.get(ackId);\n if (ackCallback) {\n this.ackCallbacks.delete(ackId);\n ackCallback(...msg.data);\n }\n return;\n }\n\n const { evt, data, ackI } = msg;\n if (!evt || (data && !Array.isArray(data))) return;\n\n if (Array.isArray(ackI)) {\n for (let i = 0; i < ackI.length; i++) {\n const ackIndex = ackI[i];\n if (!data[ackIndex]) break;\n\n const ackId = data[ackIndex];\n data[ackIndex] = (...res: any) => {\n this.ws.send(JSON.stringify({\n ack: ackId,\n data: res\n }));\n };\n }\n }\n\n // @ts-ignore\n this.handlers.emit(evt, ...data);\n }\n\n this.ws.onclose = async (event: CloseEvent) => {\n this.connected = false;\n if (this.opts.logs) console.log(\"[ws] Disconnected\", event);\n // @ts-ignore\n this.handlers.emit(\"disconnect\", this.ws, event);\n\n if (this._manuallyDisconnected) {\n this._manuallyDisconnected = false;\n return;\n }\n\n if (event.code === 1006) {\n if (this.opts.logs) console.log(\"[ws] Connection closed by server\");\n\n const params = new URLSearchParams();\n params.set(\"id\", id);\n params.set(\"path\", this.url.pathname);\n\n const data = await fetch(\"/gloves-link/status?\" + params.toString()).then(res => res.json());\n if (data.err) {\n if (this.opts.logs) console.log(\"[ws] Status error\", data.msg);\n return;\n }\n\n const status = data.status as { status: number, msg?: string };\n if (this.opts.logs) console.log(\"[ws] Status\", status);\n // @ts-ignore\n if (status.status === 401) this.handlers.emit(\"unauthorized\", this.ws);\n // @ts-ignore\n else if (status.status === 403) this.handlers.emit(\"forbidden\", this.ws);\n // @ts-ignore\n else if (status.status === 500) this.handlers.emit(\"serverError\", this.ws);\n\n return;\n }\n if (!this.opts.reConnect) return;\n\n setTimeout(() => {\n this.connect();\n }, this.opts.reConnectInterval);\n }\n }\n\n on<K extends EventName<InputEvents & InternalEvents>>(event: K, listener: (InputEvents & InternalEvents)[K]) {\n this.handlers.on(event, listener as any);\n }\n\n once<K extends EventName<InputEvents & InternalEvents>>(event: K, listener: (InputEvents & InternalEvents)[K]) {\n this.handlers.once(event, listener as any);\n }\n\n emit<K extends EventName<OutputEvents>>(evt: K, ...args: EventArgs<OutputEvents, K>) {\n const ackI = args.map((data, i) => {\n if (typeof data === \"function\") return i;\n }).filter(i => i !== undefined);\n\n for (let i = 0; i < ackI.length; i++) {\n const ackIndex = ackI[i];\n const ackId = this.ackIdCounter++;\n this.ackCallbacks.set(ackId, args[ackIndex]);\n args[ackIndex] = ackId;\n }\n\n this.ws.send(JSON.stringify({\n evt,\n data: args || undefined,\n ackI: ackI.length ? ackI : undefined\n }));\n }\n\n send<K extends EventName<OutputEvents>>(evt: K, ...args: EventArgs<OutputEvents, K>) {\n return this.emit(evt, ...args);\n }\n\n disconnect() {\n this._manuallyDisconnected = true;\n this.ws.close();\n }\n\n close() {\n this.ws.close();\n }\n}\n\nexport {\n GlovesLinkClient as default,\n GlovesLinkClient as GLC,\n GlovesLinkClient as client,\n}"],
5
+ "mappings": "AAAO,IAAMA,EAAN,KAAU,CACb,QAAU,CAAC,EAMX,GAAGC,EAAOC,EAAU,CAChB,IAAMC,EAASF,EACV,KAAK,QAAQE,CAAM,IACpB,KAAK,QAAQA,CAAM,EAAI,CAAC,GAC5B,KAAK,QAAQA,CAAM,EAAE,KAAKD,CAAQ,CACtC,CAMA,KAAKD,EAAOC,EAAU,CAClB,IAAME,EAAe,IAAIC,IAAS,CAC9B,KAAK,IAAIJ,EAAOG,CAAY,EAC5BF,EAAS,GAAGG,CAAI,CACpB,EACA,KAAK,GAAGJ,EAAOG,CAAY,CAC/B,CAMA,IAAIH,EAAOC,EAAU,CACjB,IAAMC,EAASF,EACV,KAAK,QAAQE,CAAM,IAExB,KAAK,QAAQA,CAAM,EAAI,KAAK,QAAQA,CAAM,EAAE,OAAOG,GAAKA,IAAMJ,CAAQ,EAC1E,CAMA,KAAKD,KAAUI,EAAM,CACjB,IAAME,EAAY,KAAK,QAAQN,CAAK,EAChCM,GAAaA,EAAU,OAAS,GAChCA,EAAU,QAAQL,GAAY,CAC1BA,EAAS,GAAGG,CAAI,CACpB,CAAC,CAET,CAKA,cAAcJ,EAAO,CACjB,OAAO,KAAK,QAAQA,CAAK,GAAG,QAAU,CAC1C,CACJ,EACOO,EAAQR,EC3BR,IAAMS,EAAN,KAA8F,CAC1F,GACA,aACA,aACA,SAAW,IAAIC,EACf,KACA,IACA,UAAqB,GACpB,sBAAiC,GAEzC,YAAYC,EAAaC,EAA0B,CAAC,EAAG,CACnD,KAAK,aAAe,EACpB,KAAK,aAAe,IAAI,IACxB,KAAK,KAAO,CACR,KAAM,GACN,UAAW,GACX,kBAAmB,IACnB,MAAO,KACP,YAAa,GACb,GAAGA,CACP,EAEA,KAAK,IAAM,IAAI,IAAID,EAAK,OAAS,OAAO,SAAS,KAAK,QAAQ,OAAQ,IAAI,EAAI,gBAAgB,EAC1F,KAAK,KAAK,OAAO,KAAK,IAAI,aAAa,IAAI,QAAS,KAAK,KAAK,KAAK,EAEnE,KAAK,KAAK,aAAa,KAAK,QAAQ,CAC5C,CAEA,SAAU,CACN,KAAK,sBAAwB,GAC7B,IAAME,EAAK,KAAK,IAAI,EAAE,SAAS,EAAE,EAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,EAC/E,KAAK,IAAI,aAAa,IAAI,KAAMA,CAAE,EAClC,KAAK,GAAK,IAAI,UAAU,KAAK,IAAI,IAAI,EAErC,KAAK,GAAG,OAAS,IAAM,CACnB,KAAK,UAAY,GACb,KAAK,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAEhD,KAAK,SAAS,KAAK,UAAW,KAAK,EAAE,CACzC,EAEA,KAAK,GAAG,QAAU,IAAIC,IAAa,CAC3B,KAAK,KAAK,MAAM,QAAQ,KAAK,cAAeA,CAAG,EAEnD,KAAK,SAAS,KAAK,QAAS,GAAGA,CAAG,CACtC,EAEA,KAAK,GAAG,UAAaC,GAAU,CAC3B,IAAMC,EAAMD,GAAO,MAAM,SAAS,GAAKA,GAAO,SAAS,GAAK,GACxDE,EAEJ,GAAI,CACAA,EAAM,KAAK,MAAMD,CAAG,CACxB,MAAQ,CACA,KAAK,KAAK,MAAM,QAAQ,KAAK,qBAAsBA,CAAG,EAC1D,MACJ,CAEA,GAAI,QAASC,EAAK,CACd,IAAMC,EAAQD,EAAI,IACZE,EAAc,KAAK,aAAa,IAAID,CAAK,EAC3CC,IACA,KAAK,aAAa,OAAOD,CAAK,EAC9BC,EAAY,GAAGF,EAAI,IAAI,GAE3B,MACJ,CAEA,GAAM,CAAE,IAAAG,EAAK,KAAAC,EAAM,KAAAC,CAAK,EAAIL,EAC5B,GAAI,GAACG,GAAQC,GAAQ,CAAC,MAAM,QAAQA,CAAI,GAExC,IAAI,MAAM,QAAQC,CAAI,EAClB,QAAS,EAAI,EAAG,EAAIA,EAAK,OAAQ,IAAK,CAClC,IAAMC,EAAWD,EAAK,CAAC,EACvB,GAAI,CAACD,EAAKE,CAAQ,EAAG,MAErB,IAAML,EAAQG,EAAKE,CAAQ,EAC3BF,EAAKE,CAAQ,EAAI,IAAIC,IAAa,CAC9B,KAAK,GAAG,KAAK,KAAK,UAAU,CACxB,IAAKN,EACL,KAAMM,CACV,CAAC,CAAC,CACN,CACJ,CAIJ,KAAK,SAAS,KAAKJ,EAAK,GAAGC,CAAI,EACnC,EAEA,KAAK,GAAG,QAAU,MAAOI,GAAsB,CAM3C,GALA,KAAK,UAAY,GACb,KAAK,KAAK,MAAM,QAAQ,IAAI,oBAAqBA,CAAK,EAE1D,KAAK,SAAS,KAAK,aAAc,KAAK,GAAIA,CAAK,EAE3C,KAAK,sBAAuB,CAC5B,KAAK,sBAAwB,GAC7B,MACJ,CAEA,GAAIA,EAAM,OAAS,KAAM,CACjB,KAAK,KAAK,MAAM,QAAQ,IAAI,kCAAkC,EAElE,IAAMC,EAAS,IAAI,gBACnBA,EAAO,IAAI,KAAMb,CAAE,EACnBa,EAAO,IAAI,OAAQ,KAAK,IAAI,QAAQ,EAEpC,IAAML,EAAO,MAAM,MAAM,uBAAyBK,EAAO,SAAS,CAAC,EAAE,KAAKF,GAAOA,EAAI,KAAK,CAAC,EAC3F,GAAIH,EAAK,IAAK,CACN,KAAK,KAAK,MAAM,QAAQ,IAAI,oBAAqBA,EAAK,GAAG,EAC7D,MACJ,CAEA,IAAMM,EAASN,EAAK,OAChB,KAAK,KAAK,MAAM,QAAQ,IAAI,cAAeM,CAAM,EAEjDA,EAAO,SAAW,IAAK,KAAK,SAAS,KAAK,eAAgB,KAAK,EAAE,EAE5DA,EAAO,SAAW,IAAK,KAAK,SAAS,KAAK,YAAa,KAAK,EAAE,EAE9DA,EAAO,SAAW,KAAK,KAAK,SAAS,KAAK,cAAe,KAAK,EAAE,EAEzE,MACJ,CACK,KAAK,KAAK,WAEf,WAAW,IAAM,CACb,KAAK,QAAQ,CACjB,EAAG,KAAK,KAAK,iBAAiB,CAClC,CACJ,CAEA,GAAsDF,EAAUG,EAA6C,CACzG,KAAK,SAAS,GAAGH,EAAOG,CAAe,CAC3C,CAEA,KAAwDH,EAAUG,EAA6C,CAC3G,KAAK,SAAS,KAAKH,EAAOG,CAAe,CAC7C,CAEA,KAAwCR,KAAWS,EAAkC,CACjF,IAAMP,EAAOO,EAAK,IAAI,CAACR,EAAMS,IAAM,CAC/B,GAAI,OAAOT,GAAS,WAAY,OAAOS,CAC3C,CAAC,EAAE,OAAOA,GAAKA,IAAM,MAAS,EAE9B,QAASA,EAAI,EAAGA,EAAIR,EAAK,OAAQQ,IAAK,CAClC,IAAMP,EAAWD,EAAKQ,CAAC,EACjBZ,EAAQ,KAAK,eACnB,KAAK,aAAa,IAAIA,EAAOW,EAAKN,CAAQ,CAAC,EAC3CM,EAAKN,CAAQ,EAAIL,CACrB,CAEA,KAAK,GAAG,KAAK,KAAK,UAAU,CACxB,IAAAE,EACA,KAAMS,GAAQ,OACd,KAAMP,EAAK,OAASA,EAAO,MAC/B,CAAC,CAAC,CACN,CAEA,KAAwCF,KAAWS,EAAkC,CACjF,OAAO,KAAK,KAAKT,EAAK,GAAGS,CAAI,CACjC,CAEA,YAAa,CACT,KAAK,sBAAwB,GAC7B,KAAK,GAAG,MAAM,CAClB,CAEA,OAAQ,CACJ,KAAK,GAAG,MAAM,CAClB,CACJ",
6
+ "names": ["VEE", "event", "listener", "_event", "onceListener", "args", "l", "listeners", "dist_default", "GlovesLinkClient", "dist_default", "url", "opts", "id", "err", "_data", "raw", "msg", "ackId", "ackCallback", "evt", "data", "ackI", "ackIndex", "res", "event", "params", "status", "listener", "args", "i"]
7
7
  }
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export interface GLC_Opts {
4
4
  reConnectInterval: number;
5
5
  logs: boolean;
6
6
  token: string;
7
+ autoConnect: boolean;
7
8
  }
8
9
  export interface GLC_DataEvent {
9
10
  evt: string;
@@ -29,12 +30,15 @@ export declare class GlovesLinkClient<InputEvents extends EventMap = {}, OutputE
29
30
  handlers: VEE<InputEvents>;
30
31
  opts: GLC_Opts;
31
32
  url: URL;
33
+ connected: boolean;
34
+ private _manuallyDisconnected;
32
35
  constructor(url: string, opts?: Partial<GLC_Opts>);
33
- _connect(): void;
36
+ connect(): void;
34
37
  on<K extends EventName<InputEvents & InternalEvents>>(event: K, listener: (InputEvents & InternalEvents)[K]): void;
35
38
  once<K extends EventName<InputEvents & InternalEvents>>(event: K, listener: (InputEvents & InternalEvents)[K]): void;
36
39
  emit<K extends EventName<OutputEvents>>(evt: K, ...args: EventArgs<OutputEvents, K>): void;
37
40
  send<K extends EventName<OutputEvents>>(evt: K, ...args: EventArgs<OutputEvents, K>): void;
41
+ disconnect(): void;
38
42
  close(): void;
39
43
  }
40
44
  export { GlovesLinkClient as default, GlovesLinkClient as GLC, GlovesLinkClient as client, };
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import VEE from "@wxn0brp/event-emitter";
2
- import WebSocketImpl from "./universal.js";
3
2
  export class GlovesLinkClient {
4
3
  ws;
5
4
  ackIdCounter;
@@ -7,6 +6,8 @@ export class GlovesLinkClient {
7
6
  handlers = new VEE();
8
7
  opts;
9
8
  url;
9
+ connected = false;
10
+ _manuallyDisconnected = false;
10
11
  constructor(url, opts = {}) {
11
12
  this.ackIdCounter = 1;
12
13
  this.ackCallbacks = new Map();
@@ -15,18 +16,22 @@ export class GlovesLinkClient {
15
16
  reConnect: true,
16
17
  reConnectInterval: 1000,
17
18
  token: null,
19
+ autoConnect: true,
18
20
  ...opts
19
21
  };
20
22
  this.url = new URL(url, window ? window.location.href.replace("http", "ws") : "ws://localhost");
21
23
  if (this.opts.token)
22
24
  this.url.searchParams.set("token", this.opts.token);
23
- this._connect();
25
+ if (this.opts.autoConnect)
26
+ this.connect();
24
27
  }
25
- _connect() {
28
+ connect() {
29
+ this._manuallyDisconnected = false;
26
30
  const id = Date.now().toString(36) + Math.random().toString(36).substring(2, 10);
27
31
  this.url.searchParams.set("id", id);
28
- this.ws = new WebSocketImpl(this.url.href);
32
+ this.ws = new WebSocket(this.url.href);
29
33
  this.ws.onopen = () => {
34
+ this.connected = true;
30
35
  if (this.opts.logs)
31
36
  console.log("[ws] Connected");
32
37
  // @ts-ignore
@@ -78,39 +83,46 @@ export class GlovesLinkClient {
78
83
  // @ts-ignore
79
84
  this.handlers.emit(evt, ...data);
80
85
  };
81
- this.ws.onclose = (event) => {
86
+ this.ws.onclose = async (event) => {
87
+ this.connected = false;
82
88
  if (this.opts.logs)
83
89
  console.log("[ws] Disconnected", event);
84
90
  // @ts-ignore
85
91
  this.handlers.emit("disconnect", this.ws, event);
92
+ if (this._manuallyDisconnected) {
93
+ this._manuallyDisconnected = false;
94
+ return;
95
+ }
86
96
  if (event.code === 1006) {
87
97
  if (this.opts.logs)
88
98
  console.log("[ws] Connection closed by server");
89
- fetch("/gloves-link/status?id=" + id).then(res => res.json()).then(data => {
90
- if (data.err) {
91
- if (this.opts.logs)
92
- console.log("[ws] Status error", data.msg);
93
- return;
94
- }
95
- const status = data.status;
99
+ const params = new URLSearchParams();
100
+ params.set("id", id);
101
+ params.set("path", this.url.pathname);
102
+ const data = await fetch("/gloves-link/status?" + params.toString()).then(res => res.json());
103
+ if (data.err) {
96
104
  if (this.opts.logs)
97
- console.log("[ws] Status", status);
98
- // @ts-ignore
99
- if (status === 401)
100
- this.handlers.emit("unauthorized", this.ws);
101
- // @ts-ignore
102
- else if (status === 403)
103
- this.handlers.emit("forbidden", this.ws);
104
- // @ts-ignore
105
- else if (status === 500)
106
- this.handlers.emit("serverError", this.ws);
107
- });
105
+ console.log("[ws] Status error", data.msg);
106
+ return;
107
+ }
108
+ const status = data.status;
109
+ if (this.opts.logs)
110
+ console.log("[ws] Status", status);
111
+ // @ts-ignore
112
+ if (status.status === 401)
113
+ this.handlers.emit("unauthorized", this.ws);
114
+ // @ts-ignore
115
+ else if (status.status === 403)
116
+ this.handlers.emit("forbidden", this.ws);
117
+ // @ts-ignore
118
+ else if (status.status === 500)
119
+ this.handlers.emit("serverError", this.ws);
108
120
  return;
109
121
  }
110
122
  if (!this.opts.reConnect)
111
123
  return;
112
124
  setTimeout(() => {
113
- this._connect();
125
+ this.connect();
114
126
  }, this.opts.reConnectInterval);
115
127
  };
116
128
  }
@@ -140,6 +152,10 @@ export class GlovesLinkClient {
140
152
  send(evt, ...args) {
141
153
  return this.emit(evt, ...args);
142
154
  }
155
+ disconnect() {
156
+ this._manuallyDisconnected = true;
157
+ this.ws.close();
158
+ }
143
159
  close() {
144
160
  this.ws.close();
145
161
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wxn0brp/gloves-link-client",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "author": "wxn0brP",
@@ -13,14 +13,12 @@
13
13
  "homepage": "https://github.com/wxn0brP/GlovesLink",
14
14
  "devDependencies": {
15
15
  "@types/bun": "*",
16
- "@types/ws": "^8.18.1",
17
- "esbuild": "^*",
16
+ "esbuild": "*",
18
17
  "tsc-alias": "*",
19
18
  "typescript": "*"
20
19
  },
21
20
  "dependencies": {
22
- "@wxn0brp/event-emitter": "^0.0.4",
23
- "ws": "^8.18.3"
21
+ "@wxn0brp/event-emitter": "^0.0.4"
24
22
  },
25
23
  "files": [
26
24
  "dist"
@@ -36,5 +34,8 @@
36
34
  "import": "./dist/*.js",
37
35
  "default": "./dist/*.js"
38
36
  }
37
+ },
38
+ "engines": {
39
+ "node": ">=22.0.0"
39
40
  }
40
41
  }
@@ -1,2 +0,0 @@
1
- declare let WebSocketImpl: any;
2
- export default WebSocketImpl;
package/dist/universal.js DELETED
@@ -1,9 +0,0 @@
1
- let WebSocketImpl;
2
- if (typeof window === "undefined") {
3
- const { WebSocket } = await import("ws");
4
- WebSocketImpl = WebSocket;
5
- }
6
- else {
7
- WebSocketImpl = window.WebSocket;
8
- }
9
- export default WebSocketImpl;