teckos-client 0.3.3 → 0.3.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.
Files changed (56) hide show
  1. package/dist/ITeckosClient.d.ts +18 -0
  2. package/dist/TeckosClient.d.ts +35 -0
  3. package/dist/TeckosClientWithJWT.d.ts +12 -0
  4. package/dist/index.d.ts +9 -0
  5. package/dist/index.js +40 -43
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.min.js +1 -1
  8. package/dist/teckos-client.cjs.development.js +611 -0
  9. package/dist/teckos-client.cjs.development.js.map +1 -0
  10. package/dist/teckos-client.cjs.production.min.js +2 -0
  11. package/dist/teckos-client.cjs.production.min.js.map +1 -0
  12. package/dist/teckos-client.esm.js +608 -0
  13. package/dist/teckos-client.esm.js.map +1 -0
  14. package/dist/types/ConnectionState.d.ts +7 -0
  15. package/dist/types/Options.d.ts +10 -0
  16. package/dist/types/Packet.d.ts +6 -0
  17. package/dist/types/PacketType.d.ts +5 -0
  18. package/dist/types/SocketEvent.d.ts +10 -0
  19. package/dist/types/index.d.ts +7 -0
  20. package/dist/util/Converter.d.ts +4 -0
  21. package/dist/util/SocketEventEmitter.d.ts +23 -0
  22. package/es/index.js +34 -39
  23. package/es/index.mjs +1 -1
  24. package/lib/index.js +37 -58
  25. package/package.json +6 -7
  26. package/src/ITeckosClient.ts +2 -3
  27. package/src/TeckosClient.ts +29 -29
  28. package/src/TeckosClientWithJWT.ts +6 -6
  29. package/src/index.ts +3 -3
  30. package/types/ITeckosClient.d.ts +2 -3
  31. package/types/TeckosClient.d.ts +5 -5
  32. package/types/index.d.ts +3 -3
  33. package/src/ITeckosClient.js +0 -2
  34. package/src/ITeckosClient.js.map +0 -1
  35. package/src/TeckosClient.js +0 -235
  36. package/src/TeckosClient.js.map +0 -1
  37. package/src/TeckosClientWithJWT.js +0 -63
  38. package/src/TeckosClientWithJWT.js.map +0 -1
  39. package/src/index.js +0 -8
  40. package/src/index.js.map +0 -1
  41. package/src/types/ConnectionState.js +0 -9
  42. package/src/types/ConnectionState.js.map +0 -1
  43. package/src/types/Options.js +0 -2
  44. package/src/types/Options.js.map +0 -1
  45. package/src/types/Packet.js +0 -2
  46. package/src/types/Packet.js.map +0 -1
  47. package/src/types/PacketType.js +0 -7
  48. package/src/types/PacketType.js.map +0 -1
  49. package/src/types/SocketEvent.js +0 -2
  50. package/src/types/SocketEvent.js.map +0 -1
  51. package/src/types/index.js +0 -4
  52. package/src/types/index.js.map +0 -1
  53. package/src/util/Converter.js +0 -6
  54. package/src/util/Converter.js.map +0 -1
  55. package/src/util/SocketEventEmitter.js +0 -99
  56. package/src/util/SocketEventEmitter.js.map +0 -1
@@ -0,0 +1,18 @@
1
+ /// <reference types="ws" />
2
+ import WebSocket from 'isomorphic-ws';
3
+ import { ConnectionState, Packet, SocketEvent } from './types';
4
+ import { SocketEventEmitter } from './util/SocketEventEmitter';
5
+ interface ITeckosClient extends SocketEventEmitter<SocketEvent> {
6
+ ws: WebSocket | undefined;
7
+ readonly webSocket: WebSocket | undefined;
8
+ readonly state: ConnectionState;
9
+ readonly connected: boolean;
10
+ readonly disconnected: boolean;
11
+ emit: (event: SocketEvent, ...args: any[]) => boolean;
12
+ send: (...args: any[]) => boolean;
13
+ sendPackage: (packet: Packet) => boolean;
14
+ close: () => void;
15
+ connect: () => void;
16
+ disconnect: () => void;
17
+ }
18
+ export type { ITeckosClient };
@@ -0,0 +1,35 @@
1
+ /// <reference types="ws" />
2
+ import WebSocket from 'isomorphic-ws';
3
+ import { ConnectionState, OptionalOptions, Options, Packet, SocketEvent } from './types';
4
+ import { ITeckosClient } from './ITeckosClient';
5
+ import { SocketEventEmitter } from './util/SocketEventEmitter';
6
+ declare class TeckosClient extends SocketEventEmitter<SocketEvent> implements ITeckosClient {
7
+ protected readonly url: string;
8
+ protected readonly options: Options;
9
+ ws: WebSocket | undefined;
10
+ protected currentReconnectDelay: number;
11
+ protected currentReconnectionAttempts: number;
12
+ protected acks: Map<number, (...args: any[]) => void>;
13
+ protected fnId: number;
14
+ protected connectionTimeout: any | undefined;
15
+ protected reconnectionTimeout: any | undefined;
16
+ constructor(url: string, options?: OptionalOptions);
17
+ protected attachHandler: () => void;
18
+ get webSocket(): WebSocket | undefined;
19
+ connect: () => void;
20
+ protected reconnect: () => void;
21
+ protected getConnectionState(): ConnectionState;
22
+ get state(): ConnectionState;
23
+ get connected(): boolean;
24
+ get disconnected(): boolean;
25
+ emit: (event: SocketEvent, ...args: any[]) => boolean;
26
+ send: (...args: any[]) => boolean;
27
+ sendPackage: (packet: Packet) => boolean;
28
+ protected handleMessage: (msg: WebSocket.MessageEvent) => void;
29
+ protected handleOpen: () => void;
30
+ protected handleError: (error: WebSocket.ErrorEvent) => void;
31
+ protected handleClose: () => void;
32
+ close: () => void;
33
+ disconnect: () => void;
34
+ }
35
+ export { TeckosClient };
@@ -0,0 +1,12 @@
1
+ import { TeckosClient } from './TeckosClient';
2
+ import { OptionalOptions, ConnectionState } from './types';
3
+ declare class TeckosClientWithJWT extends TeckosClient {
4
+ protected readonly token: string;
5
+ protected readonly initialData: any;
6
+ protected receivedReady: boolean;
7
+ constructor(url: string, options: OptionalOptions, token: string, initialData?: any);
8
+ protected getConnectionState(): ConnectionState;
9
+ protected handleReadyEvent: () => void;
10
+ protected handleOpen: () => void;
11
+ }
12
+ export { TeckosClientWithJWT };
@@ -0,0 +1,9 @@
1
+ import { TeckosClientWithJWT } from './TeckosClientWithJWT';
2
+ import { TeckosClient } from './TeckosClient';
3
+ import { ITeckosClient } from './ITeckosClient';
4
+ import { ConnectionState, OptionalOptions, Options, Packet, PacketType, SocketEvent } from './types';
5
+ /**
6
+ * Expose all types
7
+ */
8
+ export type { Options, OptionalOptions, Packet, SocketEvent, ITeckosClient };
9
+ export { ConnectionState, PacketType, TeckosClient, TeckosClientWithJWT };
package/dist/index.js CHANGED
@@ -1,10 +1,12 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["Teckos Client"] = {}));
5
- })(this, (function (exports) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('isomorphic-ws')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'isomorphic-ws'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["Teckos Client"] = {}, global["Isomorphic WS"]));
5
+ })(this, (function (exports, WebSocket) { 'use strict';
6
6
 
7
- module.exports = require('ws');
7
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+
9
+ var WebSocket__default = /*#__PURE__*/_interopDefaultLegacy(WebSocket);
8
10
 
9
11
  const enc = new TextEncoder();
10
12
  const dec = new TextDecoder();
@@ -154,7 +156,7 @@ const DEFAULT_OPTIONS = {
154
156
  class TeckosClient extends SocketEventEmitter {
155
157
  url;
156
158
  options;
157
- ws;
159
+ _ws;
158
160
  currentReconnectDelay;
159
161
  currentReconnectionAttempts = 0;
160
162
  acks = new Map();
@@ -172,31 +174,26 @@ class TeckosClient extends SocketEventEmitter {
172
174
  }
173
175
 
174
176
  attachHandler = () => {
175
- if (this.ws) {
176
- this.ws.onopen = this.handleOpen;
177
- this.ws.onerror = this.handleError;
178
- this.ws.onclose = this.handleClose;
179
- this.ws.onmessage = this.handleMessage;
177
+ if (this._ws) {
178
+ this._ws.onopen = this.handleOpen;
179
+ this._ws.onerror = this.handleError;
180
+ this._ws.onclose = this.handleClose;
181
+ this._ws.onmessage = this.handleMessage;
180
182
  }
181
183
  };
182
-
183
- get webSocket() {
184
- return this.ws;
185
- }
186
-
187
184
  connect = () => {
188
185
  if (this.options.debug) console.log(`(teckos:client) Connecting to ${this.url}...`); // This will try to connect immediately
189
186
  // eslint-disable-next-line new-cap
190
187
 
191
- this.ws = new undefined(this.url); // Attach handlers
188
+ this._ws = new WebSocket__default["default"](this.url); // Attach handlers
192
189
 
193
190
  this.attachHandler(); // Handle timeout
194
191
 
195
192
  this.connectionTimeout = setTimeout(() => {
196
- if (this.ws && this.ws.readyState === 0
193
+ if (this._ws && this._ws.readyState === 0
197
194
  /* = CONNECTING */
198
195
  ) {
199
- this.ws.close();
196
+ this._ws.close();
200
197
  }
201
198
  }, this.options.timeout);
202
199
  };
@@ -206,25 +203,18 @@ class TeckosClient extends SocketEventEmitter {
206
203
  };
207
204
 
208
205
  getConnectionState() {
209
- if (this.ws) {
210
- switch (this.ws.readyState) {
211
- case 0
212
- /* = CONNECTING */
213
- :
214
- return exports.ConnectionState.CONNECTING;
215
-
216
- case 1
217
- /* = OPEN */
218
- :
206
+ if (this._ws) {
207
+ switch (this._ws.readyState) {
208
+ case WebSocket__default["default"].OPEN:
219
209
  return exports.ConnectionState.CONNECTED;
220
210
 
221
- case 2
222
- /* = CLOSING */
223
- :
211
+ case WebSocket__default["default"].CONNECTING:
212
+ return exports.ConnectionState.CONNECTING;
213
+
214
+ case WebSocket__default["default"].CLOSING:
224
215
  return exports.ConnectionState.DISCONNECTING;
225
216
 
226
217
  default:
227
- /* 3 = CLOSED */
228
218
  return exports.ConnectionState.DISCONNECTED;
229
219
  }
230
220
  }
@@ -236,6 +226,10 @@ class TeckosClient extends SocketEventEmitter {
236
226
  return this.getConnectionState();
237
227
  }
238
228
 
229
+ get ws() {
230
+ return this._ws;
231
+ }
232
+
239
233
  get connected() {
240
234
  return this.getConnectionState() === exports.ConnectionState.CONNECTED;
241
235
  }
@@ -268,12 +262,14 @@ class TeckosClient extends SocketEventEmitter {
268
262
  });
269
263
  };
270
264
  sendPackage = packet => {
271
- if (this.ws !== undefined && this.ws.readyState === 1
265
+ if (this._ws !== undefined && this._ws.readyState === 1
272
266
  /* = OPEN */
273
267
  ) {
274
268
  const buffer = encodePacket(packet);
275
269
  if (this.options.debug) console.log(`(teckos:client) [${this.url}] Send packet: ${JSON.stringify(packet)}`);
276
- this.ws.send(buffer);
270
+
271
+ this._ws.send(buffer);
272
+
277
273
  return true;
278
274
  }
279
275
 
@@ -373,10 +369,11 @@ class TeckosClient extends SocketEventEmitter {
373
369
  close = () => {
374
370
  if (this.options.debug) console.log(`(teckos:client) [${this.url}] Closing connection (client-side)`);
375
371
 
376
- if (this.ws !== undefined) {
377
- this.ws.onclose = () => {};
372
+ if (this._ws !== undefined) {
373
+ this._ws.onclose = () => {};
374
+
375
+ this._ws.close();
378
376
 
379
- this.ws.close();
380
377
  this.listeners('disconnect').forEach(listener => listener());
381
378
  }
382
379
  };
@@ -403,19 +400,19 @@ class TeckosClientWithJWT extends TeckosClient {
403
400
  }
404
401
 
405
402
  getConnectionState() {
406
- if (this.ws) {
407
- switch (this.ws.readyState) {
408
- case undefined:
403
+ if (this._ws) {
404
+ switch (this._ws.readyState) {
405
+ case WebSocket__default["default"].OPEN:
409
406
  if (this.receivedReady) {
410
407
  return exports.ConnectionState.CONNECTED;
411
408
  }
412
409
 
413
410
  return exports.ConnectionState.CONNECTING;
414
411
 
415
- case undefined:
412
+ case WebSocket__default["default"].CONNECTING:
416
413
  return exports.ConnectionState.CONNECTING;
417
414
 
418
- case undefined:
415
+ case WebSocket__default["default"].CLOSING:
419
416
  return exports.ConnectionState.DISCONNECTING;
420
417
 
421
418
  default:
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../example/node/index.ts"],"names":[],"mappings":"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"}
package/dist/index.min.js CHANGED
@@ -1 +1 @@
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)["Teckos Client"]={})}(this,(function(e){"use strict";function t(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}module.exports=require("ws");const n=new TextEncoder,s=new TextDecoder;var i,o;e.PacketType=void 0,(i=e.PacketType||(e.PacketType={}))[i.EVENT=0]="EVENT",i[i.ACK=1]="ACK",e.ConnectionState=void 0,(o=e.ConnectionState||(e.ConnectionState={})).DISCONNECTED="disconnected",o.CONNECTING="connecting",o.CONNECTED="connected",o.DISCONNECTING="disconnecting";const c={reconnection:!0,reconnectionDelay:1e3,reconnectionDelayMax:5e3,reconnectionAttempts:1/0,randomizationFactor:.5,timeout:5e3,debug:!1};class r extends class{maxListeners=50;handlers={};addListener=(e,n)=>{if(Object.keys(this.handlers).length===this.maxListeners)throw Error(t(2));if("function"!=typeof n)throw Error(t(3));return this.handlers[e]=this.handlers[e]||[],this.handlers[e].push(n),this};once=(e,n)=>{if(Object.keys(this.handlers).length===this.maxListeners)throw Error(t(2));if("function"!=typeof n)throw Error(t(3));this.handlers[e]=this.handlers[e]||[];const s=()=>{n(),this.off(e,s)};return this.handlers[e].push(s),this};removeListener=(e,t)=>(this.handlers[e]&&(this.handlers[e]=this.handlers[e].filter((e=>e!==t))),this);off=(e,t)=>this.removeListener(e,t);removeAllListeners=e=>(e?delete this.handlers[e]:this.handlers={},this);setMaxListeners=e=>(this.maxListeners=e,this);getMaxListeners=()=>this.maxListeners;listeners=e=>this.handlers[e]?[...this.handlers[e]]:[];rawListeners=e=>[...this.handlers[e]];listenerCount=e=>this.handlers[e]?Object.keys(this.handlers[e]).length:0;prependListener=(e,n)=>{if(Object.keys(this.handlers).length===this.maxListeners)throw Error(t(2));return this.handlers[e]=this.handlers[e]||[],this.handlers[e].unshift(n),this};prependOnceListener=(e,n)=>{if(Object.keys(this.handlers).length===this.maxListeners)throw Error(t(2));this.handlers[e]=this.handlers[e]||[];const s=()=>{n(),this.off(e,s)};return this.handlers[e].unshift(s),this};eventNames=()=>Object.keys(this.handlers);on=(e,t)=>this.addListener(e,t);emit=(e,...t)=>{const n=this.listeners(e);return n.length>0&&(n.forEach((e=>{e&&e(t)})),!0)}}{url;options;ws;currentReconnectDelay;currentReconnectionAttempts=0;acks=new Map;fnId=0;connectionTimeout;reconnectionTimeout;constructor(e,t){super(),this.options={...c,...t},this.currentReconnectDelay=this.options.reconnectionDelay,this.url=e}attachHandler=()=>{this.ws&&(this.ws.onopen=this.handleOpen,this.ws.onerror=this.handleError,this.ws.onclose=this.handleClose,this.ws.onmessage=this.handleMessage)};get webSocket(){return this.ws}connect=()=>{this.options.debug&&console.log(`(teckos:client) Connecting to ${this.url}...`),this.ws=new(void 0)(this.url),this.attachHandler(),this.connectionTimeout=setTimeout((()=>{this.ws&&0===this.ws.readyState&&this.ws.close()}),this.options.timeout)};reconnect=()=>{this.listeners("reconnect_attempt").forEach((e=>e())),this.connect()};getConnectionState(){if(this.ws)switch(this.ws.readyState){case 0:return e.ConnectionState.CONNECTING;case 1:return e.ConnectionState.CONNECTED;case 2:return e.ConnectionState.DISCONNECTING;default:return e.ConnectionState.DISCONNECTED}return e.ConnectionState.DISCONNECTED}get state(){return this.getConnectionState()}get connected(){return this.getConnectionState()===e.ConnectionState.CONNECTED}get disconnected(){return this.getConnectionState()===e.ConnectionState.DISCONNECTED}emit=(t,...n)=>{n.unshift(t);const s={type:e.PacketType.EVENT,data:n};return"function"==typeof n[n.length-1]&&(this.acks.set(this.fnId,n.pop()),s.id=this.fnId,this.fnId+=1),this.sendPackage(s)};send=(...t)=>(t.unshift("message"),this.sendPackage({type:e.PacketType.EVENT,data:t}));sendPackage=e=>{if(void 0!==this.ws&&1===this.ws.readyState){const t=(e=>n.encode(JSON.stringify(e)))(e);return this.options.debug&&console.log(`(teckos:client) [${this.url}] Send packet: ${JSON.stringify(e)}`),this.ws.send(t),!0}return!1};handleMessage=n=>{const i="string"==typeof n.data?JSON.parse(n.data):JSON.parse(""+s.decode(n.data));if(this.options.debug&&console.log(`(teckos:client) [${this.url}] Got packet: ${JSON.stringify(i)}`),i.type===e.PacketType.EVENT){const e=i.data[0],n=i.data.slice(1);if(!e)throw Error(t(0));this.listeners(e).forEach((e=>e(...n)))}else{if(i.type!==e.PacketType.ACK||void 0===i.id)throw Error(t(1));{const e=this.acks.get(i.id);"function"==typeof e&&(e.apply(this,i.data),this.acks.delete(i.id))}}};handleOpen=()=>{this.currentReconnectionAttempts>0&&(this.currentReconnectDelay=this.options.reconnectionDelay,this.currentReconnectionAttempts=0,this.options.debug&&console.log(`(teckos:client) [${this.url}] Reconnected!`),this.listeners("reconnect").forEach((e=>e()))),this.options.debug&&console.log(`(teckos:client) [${this.url}] Connected!`),this.listeners("connect").forEach((e=>e()))};handleError=e=>{this.handlers&&this.handlers.error&&(this.options.debug&&console.log(`(teckos:client) [${this.url}] Got error from server: ${JSON.stringify(e)}`),this.handlers.error.forEach((t=>t(e))))};handleClose=()=>{if(this.connectionTimeout&&clearTimeout(this.connectionTimeout),this.reconnectionTimeout&&clearTimeout(this.reconnectionTimeout),this.currentReconnectionAttempts>0?(this.options.debug&&console.log(`(teckos:client) [${this.url}] Reconnect #${this.currentReconnectionAttempts} failed!`),this.listeners("reconnect_error").forEach((e=>{e&&e()}))):(this.options.debug&&console.log(`(teckos:client) [${this.url}] Disconnected!`),this.listeners("disconnect").forEach((e=>{e&&e()}))),this.options.reconnection)if(this.currentReconnectionAttempts+=1,this.options.reconnectionAttempts!==1/0&&this.currentReconnectionAttempts>this.options.reconnectionAttempts)this.options.debug&&console.log(`(teckos:client) [${this.url}] Reconnection maximum of ${this.options.reconnectionAttempts} reached`),this.listeners("reconnect_failed").forEach((e=>e()));else{const e=Math.min(this.options.reconnectionDelayMax,this.currentReconnectDelay);this.currentReconnectDelay=Math.round(this.currentReconnectDelay+this.currentReconnectDelay*this.options.randomizationFactor),this.options.debug&&console.log(`(teckos:client) [${this.url}] Try reconnecting (${this.currentReconnectionAttempts}/${this.options.reconnectionAttempts}) in ${e}ms to ${this.url}...`),this.reconnectionTimeout=setTimeout((()=>{this.reconnect()}),e)}};close=()=>{this.options.debug&&console.log(`(teckos:client) [${this.url}] Closing connection (client-side)`),void 0!==this.ws&&(this.ws.onclose=()=>{},this.ws.close(),this.listeners("disconnect").forEach((e=>e())))};disconnect=()=>{this.close()}}e.TeckosClient=r,e.TeckosClientWithJWT=class extends r{token;initialData;receivedReady=!1;constructor(e,t,n,s){super(e,t),this.token=n,this.initialData=s,this.on("disconnect",(()=>{this.receivedReady=!1}))}getConnectionState(){if(this.ws)switch(this.ws.readyState){case void 0:return this.receivedReady?e.ConnectionState.CONNECTED:e.ConnectionState.CONNECTING;case void 0:return e.ConnectionState.CONNECTING;case void 0:return e.ConnectionState.DISCONNECTING;default:return e.ConnectionState.DISCONNECTED}return e.ConnectionState.DISCONNECTED}handleReadyEvent=()=>{this.options.debug&&console.log(`(teckos:client) [${this.url}] Connected!`),this.receivedReady=!0,this.currentReconnectionAttempts>0&&(this.options.debug&&console.log(`(teckos:client) [${this.url}] Reconnected!`),this.listeners("reconnect").forEach((e=>e())),this.currentReconnectDelay=this.options.reconnectionDelay,this.currentReconnectionAttempts=0),this.listeners("connect").forEach((e=>e()))};handleOpen=()=>{this.receivedReady=!1,this.once("ready",this.handleReadyEvent),this.options.debug&&console.log("(teckos:client) Connection opened, sending token now"),this.emit("token",{token:this.token,...this.initialData})}},Object.defineProperty(e,"__esModule",{value:!0})}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("isomorphic-ws")):"function"==typeof define&&define.amd?define(["exports","isomorphic-ws"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["Teckos Client"]={},e["Isomorphic WS"])}(this,(function(e,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=n(t);function i(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}const o=new TextEncoder,c=new TextDecoder;var r,h;e.PacketType=void 0,(r=e.PacketType||(e.PacketType={}))[r.EVENT=0]="EVENT",r[r.ACK=1]="ACK",e.ConnectionState=void 0,(h=e.ConnectionState||(e.ConnectionState={})).DISCONNECTED="disconnected",h.CONNECTING="connecting",h.CONNECTED="connected",h.DISCONNECTING="disconnecting";const a={reconnection:!0,reconnectionDelay:1e3,reconnectionDelayMax:5e3,reconnectionAttempts:1/0,randomizationFactor:.5,timeout:5e3,debug:!1};class l extends class{maxListeners=50;handlers={};addListener=(e,t)=>{if(Object.keys(this.handlers).length===this.maxListeners)throw Error(i(2));if("function"!=typeof t)throw Error(i(3));return this.handlers[e]=this.handlers[e]||[],this.handlers[e].push(t),this};once=(e,t)=>{if(Object.keys(this.handlers).length===this.maxListeners)throw Error(i(2));if("function"!=typeof t)throw Error(i(3));this.handlers[e]=this.handlers[e]||[];const n=()=>{t(),this.off(e,n)};return this.handlers[e].push(n),this};removeListener=(e,t)=>(this.handlers[e]&&(this.handlers[e]=this.handlers[e].filter((e=>e!==t))),this);off=(e,t)=>this.removeListener(e,t);removeAllListeners=e=>(e?delete this.handlers[e]:this.handlers={},this);setMaxListeners=e=>(this.maxListeners=e,this);getMaxListeners=()=>this.maxListeners;listeners=e=>this.handlers[e]?[...this.handlers[e]]:[];rawListeners=e=>[...this.handlers[e]];listenerCount=e=>this.handlers[e]?Object.keys(this.handlers[e]).length:0;prependListener=(e,t)=>{if(Object.keys(this.handlers).length===this.maxListeners)throw Error(i(2));return this.handlers[e]=this.handlers[e]||[],this.handlers[e].unshift(t),this};prependOnceListener=(e,t)=>{if(Object.keys(this.handlers).length===this.maxListeners)throw Error(i(2));this.handlers[e]=this.handlers[e]||[];const n=()=>{t(),this.off(e,n)};return this.handlers[e].unshift(n),this};eventNames=()=>Object.keys(this.handlers);on=(e,t)=>this.addListener(e,t);emit=(e,...t)=>{const n=this.listeners(e);return n.length>0&&(n.forEach((e=>{e&&e(t)})),!0)}}{url;options;_ws;currentReconnectDelay;currentReconnectionAttempts=0;acks=new Map;fnId=0;connectionTimeout;reconnectionTimeout;constructor(e,t){super(),this.options={...a,...t},this.currentReconnectDelay=this.options.reconnectionDelay,this.url=e}attachHandler=()=>{this._ws&&(this._ws.onopen=this.handleOpen,this._ws.onerror=this.handleError,this._ws.onclose=this.handleClose,this._ws.onmessage=this.handleMessage)};connect=()=>{this.options.debug&&console.log(`(teckos:client) Connecting to ${this.url}...`),this._ws=new s.default(this.url),this.attachHandler(),this.connectionTimeout=setTimeout((()=>{this._ws&&0===this._ws.readyState&&this._ws.close()}),this.options.timeout)};reconnect=()=>{this.listeners("reconnect_attempt").forEach((e=>e())),this.connect()};getConnectionState(){if(this._ws)switch(this._ws.readyState){case s.default.OPEN:return e.ConnectionState.CONNECTED;case s.default.CONNECTING:return e.ConnectionState.CONNECTING;case s.default.CLOSING:return e.ConnectionState.DISCONNECTING;default:return e.ConnectionState.DISCONNECTED}return e.ConnectionState.DISCONNECTED}get state(){return this.getConnectionState()}get ws(){return this._ws}get connected(){return this.getConnectionState()===e.ConnectionState.CONNECTED}get disconnected(){return this.getConnectionState()===e.ConnectionState.DISCONNECTED}emit=(t,...n)=>{n.unshift(t);const s={type:e.PacketType.EVENT,data:n};return"function"==typeof n[n.length-1]&&(this.acks.set(this.fnId,n.pop()),s.id=this.fnId,this.fnId+=1),this.sendPackage(s)};send=(...t)=>(t.unshift("message"),this.sendPackage({type:e.PacketType.EVENT,data:t}));sendPackage=e=>{if(void 0!==this._ws&&1===this._ws.readyState){const t=(e=>o.encode(JSON.stringify(e)))(e);return this.options.debug&&console.log(`(teckos:client) [${this.url}] Send packet: ${JSON.stringify(e)}`),this._ws.send(t),!0}return!1};handleMessage=t=>{const n="string"==typeof t.data?JSON.parse(t.data):JSON.parse(""+c.decode(t.data));if(this.options.debug&&console.log(`(teckos:client) [${this.url}] Got packet: ${JSON.stringify(n)}`),n.type===e.PacketType.EVENT){const e=n.data[0],t=n.data.slice(1);if(!e)throw Error(i(0));this.listeners(e).forEach((e=>e(...t)))}else{if(n.type!==e.PacketType.ACK||void 0===n.id)throw Error(i(1));{const e=this.acks.get(n.id);"function"==typeof e&&(e.apply(this,n.data),this.acks.delete(n.id))}}};handleOpen=()=>{this.currentReconnectionAttempts>0&&(this.currentReconnectDelay=this.options.reconnectionDelay,this.currentReconnectionAttempts=0,this.options.debug&&console.log(`(teckos:client) [${this.url}] Reconnected!`),this.listeners("reconnect").forEach((e=>e()))),this.options.debug&&console.log(`(teckos:client) [${this.url}] Connected!`),this.listeners("connect").forEach((e=>e()))};handleError=e=>{this.handlers&&this.handlers.error&&(this.options.debug&&console.log(`(teckos:client) [${this.url}] Got error from server: ${JSON.stringify(e)}`),this.handlers.error.forEach((t=>t(e))))};handleClose=()=>{if(this.connectionTimeout&&clearTimeout(this.connectionTimeout),this.reconnectionTimeout&&clearTimeout(this.reconnectionTimeout),this.currentReconnectionAttempts>0?(this.options.debug&&console.log(`(teckos:client) [${this.url}] Reconnect #${this.currentReconnectionAttempts} failed!`),this.listeners("reconnect_error").forEach((e=>{e&&e()}))):(this.options.debug&&console.log(`(teckos:client) [${this.url}] Disconnected!`),this.listeners("disconnect").forEach((e=>{e&&e()}))),this.options.reconnection)if(this.currentReconnectionAttempts+=1,this.options.reconnectionAttempts!==1/0&&this.currentReconnectionAttempts>this.options.reconnectionAttempts)this.options.debug&&console.log(`(teckos:client) [${this.url}] Reconnection maximum of ${this.options.reconnectionAttempts} reached`),this.listeners("reconnect_failed").forEach((e=>e()));else{const e=Math.min(this.options.reconnectionDelayMax,this.currentReconnectDelay);this.currentReconnectDelay=Math.round(this.currentReconnectDelay+this.currentReconnectDelay*this.options.randomizationFactor),this.options.debug&&console.log(`(teckos:client) [${this.url}] Try reconnecting (${this.currentReconnectionAttempts}/${this.options.reconnectionAttempts}) in ${e}ms to ${this.url}...`),this.reconnectionTimeout=setTimeout((()=>{this.reconnect()}),e)}};close=()=>{this.options.debug&&console.log(`(teckos:client) [${this.url}] Closing connection (client-side)`),void 0!==this._ws&&(this._ws.onclose=()=>{},this._ws.close(),this.listeners("disconnect").forEach((e=>e())))};disconnect=()=>{this.close()}}e.TeckosClient=l,e.TeckosClientWithJWT=class extends l{token;initialData;receivedReady=!1;constructor(e,t,n,s){super(e,t),this.token=n,this.initialData=s,this.on("disconnect",(()=>{this.receivedReady=!1}))}getConnectionState(){if(this._ws)switch(this._ws.readyState){case s.default.OPEN:return this.receivedReady?e.ConnectionState.CONNECTED:e.ConnectionState.CONNECTING;case s.default.CONNECTING:return e.ConnectionState.CONNECTING;case s.default.CLOSING:return e.ConnectionState.DISCONNECTING;default:return e.ConnectionState.DISCONNECTED}return e.ConnectionState.DISCONNECTED}handleReadyEvent=()=>{this.options.debug&&console.log(`(teckos:client) [${this.url}] Connected!`),this.receivedReady=!0,this.currentReconnectionAttempts>0&&(this.options.debug&&console.log(`(teckos:client) [${this.url}] Reconnected!`),this.listeners("reconnect").forEach((e=>e())),this.currentReconnectDelay=this.options.reconnectionDelay,this.currentReconnectionAttempts=0),this.listeners("connect").forEach((e=>e()))};handleOpen=()=>{this.receivedReady=!1,this.once("ready",this.handleReadyEvent),this.options.debug&&console.log("(teckos:client) Connection opened, sending token now"),this.emit("token",{token:this.token,...this.initialData})}},Object.defineProperty(e,"__esModule",{value:!0})}));