@wxn0brp/gloves-link-client 0.0.4 → 0.0.6

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.
package/README.md CHANGED
@@ -28,7 +28,7 @@ npm i @wxn0brp/gloves-link-client
28
28
  ## Usage
29
29
 
30
30
  ```typescript
31
- import GlovesLinkClient from '@wxn0brp/gloves-link/client';
31
+ import GlovesLinkClient from '@wxn0brp/gloves-link-client';
32
32
  //or browser
33
33
  import GlovesLinkClient from 'path/to/your/GlovesLinkClient.js';
34
34
  // if you use falcon-frame
@@ -1,2 +1,2 @@
1
- var l;if(typeof window>"u"){let{WebSocket:h}=await import("ws");l=h}else l=window.WebSocket;var u=l;var f=class{ws;ackIdCounter;ackCallbacks;handlers;opts;url;constructor(n,t={}){this.ackIdCounter=1,this.ackCallbacks=new Map,this.handlers={},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 u(this.url.href),this.ws.onopen=()=>{this.opts.logs&&console.log("[ws] Connected"),this.handlers.connect?.(this.ws)},this.ws.onerror=(...t)=>{this.opts.logs&&console.warn("[ws] Error:",t),this.handlers.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:c}=s;if(!i||o&&!Array.isArray(o))return;if(Array.isArray(c))for(let r=0;r<c.length;r++){let a=c[r];if(!o[a])break;let k=o[a];o[a]=(...p)=>{this.ws.send(JSON.stringify({ack:k,data:p}))}}let d=this.handlers[i];d&&d(...o)},this.ws.onclose=t=>{if(this.opts.logs&&console.log("[ws] Disconnected",t),this.handlers.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.unauthorized?.(this.ws):s===403?this.handlers.forbidden?.(this.ws):s===500&&this.handlers.serverError?.(this.ws)});return}this.opts.reConnect&&setTimeout(()=>{this._connect()},this.opts.reConnectInterval)}}on(n,t){this.handlers[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{f as GLC,f as GlovesLinkClient,f as client,f as default};
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};
2
2
  //# sourceMappingURL=GlovesLinkClient.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/universal.ts", "../src/index.ts"],
4
- "sourcesContent": ["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 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 class GlovesLinkClient {\n public ws: WebSocket;\n public ackIdCounter: number;\n public ackCallbacks: Map<number, Function>;\n public handlers: { [key: string]: Function };\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.handlers = {};\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 this.handlers.connect?.(this.ws);\n }\n\n this.ws.onerror = (...err: any) => {\n if (this.opts.logs) console.warn(\"[ws] Error:\", err);\n this.handlers.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 const handler = this.handlers[evt];\n if (!handler) return;\n\n handler(...data);\n }\n\n this.ws.onclose = (event: CloseEvent) => {\n if (this.opts.logs) console.log(\"[ws] Disconnected\", event);\n this.handlers.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 if (status === 401) this.handlers.unauthorized?.(this.ws);\n else if (status === 403) this.handlers.forbidden?.(this.ws);\n else if (status === 500) this.handlers.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(evt: string, handler: (...args: any[]) => void | any) {\n this.handlers[evt] = handler;\n }\n\n emit(evt: string, ...args: any[]) {\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(evt: string, ...args: any[]) {\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": "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",
6
- "names": ["WebSocketImpl", "WebSocket", "universal_default", "GlovesLinkClient", "url", "opts", "id", "universal_default", "err", "_data", "raw", "msg", "ackId", "ackCallback", "evt", "data", "ackI", "i", "ackIndex", "res", "handler", "event", "status", "args"]
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": "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",
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"]
7
7
  }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import VEE, { EventArgs, EventMap, EventName } from "@wxn0brp/event-emitter";
1
2
  export interface GLC_Opts {
2
3
  reConnect: boolean;
3
4
  reConnectInterval: number;
@@ -13,20 +14,27 @@ export interface GLC_AckEvent {
13
14
  ack: number;
14
15
  data: any[];
15
16
  }
16
- export declare class GlovesLinkClient {
17
+ export type InternalEvents = {
18
+ connect: (ws: WebSocket) => void;
19
+ error: (...err: any[]) => void;
20
+ disconnect: (ws: WebSocket, event: CloseEvent) => void;
21
+ unauthorized: (ws: WebSocket) => void;
22
+ forbidden: (ws: WebSocket) => void;
23
+ serverError: (ws: WebSocket) => void;
24
+ };
25
+ export declare class GlovesLinkClient<InputEvents extends EventMap = {}, OutputEvents extends EventMap = {}> {
17
26
  ws: WebSocket;
18
27
  ackIdCounter: number;
19
28
  ackCallbacks: Map<number, Function>;
20
- handlers: {
21
- [key: string]: Function;
22
- };
29
+ handlers: VEE<InputEvents>;
23
30
  opts: GLC_Opts;
24
31
  url: URL;
25
32
  constructor(url: string, opts?: Partial<GLC_Opts>);
26
33
  _connect(): void;
27
- on(evt: string, handler: (...args: any[]) => void | any): void;
28
- emit(evt: string, ...args: any[]): void;
29
- send(evt: string, ...args: any[]): void;
34
+ on<K extends EventName<InputEvents & InternalEvents>>(event: K, listener: (InputEvents & InternalEvents)[K]): void;
35
+ once<K extends EventName<InputEvents & InternalEvents>>(event: K, listener: (InputEvents & InternalEvents)[K]): void;
36
+ emit<K extends EventName<OutputEvents>>(evt: K, ...args: EventArgs<OutputEvents, K>): void;
37
+ send<K extends EventName<OutputEvents>>(evt: K, ...args: EventArgs<OutputEvents, K>): void;
30
38
  close(): void;
31
39
  }
32
40
  export { GlovesLinkClient as default, GlovesLinkClient as GLC, GlovesLinkClient as client, };
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
+ import VEE from "@wxn0brp/event-emitter";
1
2
  import WebSocketImpl from "./universal.js";
2
3
  export class GlovesLinkClient {
3
4
  ws;
4
5
  ackIdCounter;
5
6
  ackCallbacks;
6
- handlers;
7
+ handlers = new VEE();
7
8
  opts;
8
9
  url;
9
10
  constructor(url, opts = {}) {
10
11
  this.ackIdCounter = 1;
11
12
  this.ackCallbacks = new Map();
12
- this.handlers = {};
13
13
  this.opts = {
14
14
  logs: false,
15
15
  reConnect: true,
@@ -29,12 +29,14 @@ export class GlovesLinkClient {
29
29
  this.ws.onopen = () => {
30
30
  if (this.opts.logs)
31
31
  console.log("[ws] Connected");
32
- this.handlers.connect?.(this.ws);
32
+ // @ts-ignore
33
+ this.handlers.emit("connect", this.ws);
33
34
  };
34
35
  this.ws.onerror = (...err) => {
35
36
  if (this.opts.logs)
36
37
  console.warn("[ws] Error:", err);
37
- this.handlers.error?.(...err);
38
+ // @ts-ignore
39
+ this.handlers.emit("error", ...err);
38
40
  };
39
41
  this.ws.onmessage = (_data) => {
40
42
  const raw = _data?.data?.toString() || _data?.toString() || "";
@@ -73,15 +75,14 @@ export class GlovesLinkClient {
73
75
  };
74
76
  }
75
77
  }
76
- const handler = this.handlers[evt];
77
- if (!handler)
78
- return;
79
- handler(...data);
78
+ // @ts-ignore
79
+ this.handlers.emit(evt, ...data);
80
80
  };
81
81
  this.ws.onclose = (event) => {
82
82
  if (this.opts.logs)
83
83
  console.log("[ws] Disconnected", event);
84
- this.handlers.disconnect?.(this.ws, event);
84
+ // @ts-ignore
85
+ this.handlers.emit("disconnect", this.ws, event);
85
86
  if (event.code === 1006) {
86
87
  if (this.opts.logs)
87
88
  console.log("[ws] Connection closed by server");
@@ -94,12 +95,15 @@ export class GlovesLinkClient {
94
95
  const status = data.status;
95
96
  if (this.opts.logs)
96
97
  console.log("[ws] Status", status);
98
+ // @ts-ignore
97
99
  if (status === 401)
98
- this.handlers.unauthorized?.(this.ws);
100
+ this.handlers.emit("unauthorized", this.ws);
101
+ // @ts-ignore
99
102
  else if (status === 403)
100
- this.handlers.forbidden?.(this.ws);
103
+ this.handlers.emit("forbidden", this.ws);
104
+ // @ts-ignore
101
105
  else if (status === 500)
102
- this.handlers.serverError?.(this.ws);
106
+ this.handlers.emit("serverError", this.ws);
103
107
  });
104
108
  return;
105
109
  }
@@ -110,8 +114,11 @@ export class GlovesLinkClient {
110
114
  }, this.opts.reConnectInterval);
111
115
  };
112
116
  }
113
- on(evt, handler) {
114
- this.handlers[evt] = handler;
117
+ on(event, listener) {
118
+ this.handlers.on(event, listener);
119
+ }
120
+ once(event, listener) {
121
+ this.handlers.once(event, listener);
115
122
  }
116
123
  emit(evt, ...args) {
117
124
  const ackI = args.map((data, i) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wxn0brp/gloves-link-client",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "author": "wxn0brP",
@@ -19,6 +19,7 @@
19
19
  "typescript": "*"
20
20
  },
21
21
  "dependencies": {
22
+ "@wxn0brp/event-emitter": "^0.0.4",
22
23
  "ws": "^8.18.3"
23
24
  },
24
25
  "files": [