teckos-client 0.2.3 → 0.3.0

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 (55) hide show
  1. package/dist/index.js +456 -5
  2. package/dist/index.min.js +1 -0
  3. package/es/index.js +459 -0
  4. package/es/index.mjs +1 -0
  5. package/lib/index.js +484 -0
  6. package/package.json +63 -44
  7. package/src/ITeckosClient.js +2 -0
  8. package/src/ITeckosClient.js.map +1 -0
  9. package/src/ITeckosClient.ts +3 -3
  10. package/src/TeckosClient.js +235 -0
  11. package/src/TeckosClient.js.map +1 -0
  12. package/src/TeckosClient.ts +40 -32
  13. package/src/TeckosClientWithJWT.js +63 -0
  14. package/src/TeckosClientWithJWT.js.map +1 -0
  15. package/src/TeckosClientWithJWT.ts +8 -10
  16. package/src/index.js +8 -0
  17. package/src/index.js.map +1 -0
  18. package/src/index.ts +3 -3
  19. package/src/types/ConnectionState.js +9 -0
  20. package/src/types/ConnectionState.js.map +1 -0
  21. package/src/types/Options.js +2 -0
  22. package/src/types/Options.js.map +1 -0
  23. package/src/types/Packet.js +2 -0
  24. package/src/types/Packet.js.map +1 -0
  25. package/src/types/PacketType.js +7 -0
  26. package/src/types/PacketType.js.map +1 -0
  27. package/src/types/SocketEvent.js +2 -0
  28. package/src/types/SocketEvent.js.map +1 -0
  29. package/src/types/index.js +4 -0
  30. package/src/types/index.js.map +1 -0
  31. package/src/util/Converter.js +6 -0
  32. package/src/util/Converter.js.map +1 -0
  33. package/src/util/SocketEventEmitter.js +99 -0
  34. package/src/util/SocketEventEmitter.js.map +1 -0
  35. package/src/util/formatProdErrorMessage.ts +16 -0
  36. package/{dist → types}/ITeckosClient.d.ts +3 -3
  37. package/{dist → types}/TeckosClient.d.ts +6 -6
  38. package/{dist → types}/TeckosClientWithJWT.d.ts +0 -0
  39. package/types/index.d.ts +9 -0
  40. package/{dist → types}/types/ConnectionState.d.ts +0 -0
  41. package/{dist → types}/types/Options.d.ts +0 -0
  42. package/{dist → types}/types/Packet.d.ts +0 -0
  43. package/{dist → types}/types/PacketType.d.ts +0 -0
  44. package/{dist → types}/types/SocketEvent.d.ts +0 -0
  45. package/{dist → types}/types/index.d.ts +0 -0
  46. package/{dist → types}/util/Converter.d.ts +0 -0
  47. package/{dist → types}/util/SocketEventEmitter.d.ts +1 -1
  48. package/types/util/formatProdErrorMessage.d.ts +9 -0
  49. package/dist/index.d.ts +0 -9
  50. package/dist/teckos-client.cjs.development.js +0 -614
  51. package/dist/teckos-client.cjs.development.js.map +0 -1
  52. package/dist/teckos-client.cjs.production.min.js +0 -2
  53. package/dist/teckos-client.cjs.production.min.js.map +0 -1
  54. package/dist/teckos-client.esm.js +0 -611
  55. package/dist/teckos-client.esm.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,8 +1,459 @@
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';
1
6
 
2
- 'use strict'
7
+ module.exports = require('ws');
3
8
 
4
- if (process.env.NODE_ENV === 'production') {
5
- module.exports = require('./teckos-client.cjs.production.min.js')
6
- } else {
7
- module.exports = require('./teckos-client.cjs.development.js')
9
+ const enc = new TextEncoder();
10
+ const dec = new TextDecoder();
11
+
12
+ const encodePacket = packet => enc.encode(JSON.stringify(packet));
13
+
14
+ const decodePacket = buffer => JSON.parse(dec.decode(buffer).toString());
15
+
16
+ class SocketEventEmitter {
17
+ maxListeners = 50;
18
+ handlers = {};
19
+ addListener = (event, listener) => {
20
+ if (Object.keys(this.handlers).length === this.maxListeners) {
21
+ throw new Error('Max listeners reached');
22
+ }
23
+
24
+ if (typeof listener !== 'function') {
25
+ throw new Error('The given listener is not a function');
26
+ }
27
+
28
+ this.handlers[event] = this.handlers[event] || [];
29
+ this.handlers[event].push(listener);
30
+ return this;
31
+ };
32
+ once = (event, listener) => {
33
+ if (Object.keys(this.handlers).length === this.maxListeners) {
34
+ throw new Error('Max listeners reached');
35
+ }
36
+
37
+ if (typeof listener !== 'function') {
38
+ throw new Error('The given listener is not a function');
39
+ }
40
+
41
+ this.handlers[event] = this.handlers[event] || [];
42
+
43
+ const onceWrapper = () => {
44
+ listener();
45
+ this.off(event, onceWrapper);
46
+ };
47
+
48
+ this.handlers[event].push(onceWrapper);
49
+ return this;
50
+ };
51
+ removeListener = (event, listener) => {
52
+ if (this.handlers[event]) {
53
+ this.handlers[event] = this.handlers[event].filter(handler => handler !== listener);
54
+ }
55
+
56
+ return this;
57
+ };
58
+ off = (event, listener) => this.removeListener(event, listener);
59
+ removeAllListeners = event => {
60
+ if (event) {
61
+ delete this.handlers[event];
62
+ } else {
63
+ this.handlers = {};
64
+ }
65
+
66
+ return this;
67
+ };
68
+ setMaxListeners = n => {
69
+ this.maxListeners = n;
70
+ return this;
71
+ };
72
+ getMaxListeners = () => this.maxListeners;
73
+ listeners = event => {
74
+ if (this.handlers[event]) {
75
+ return [...this.handlers[event]];
76
+ }
77
+
78
+ return [];
79
+ };
80
+ rawListeners = event => [...this.handlers[event]];
81
+ listenerCount = event => {
82
+ if (this.handlers[event]) {
83
+ return Object.keys(this.handlers[event]).length;
84
+ }
85
+
86
+ return 0;
87
+ };
88
+ prependListener = (event, listener) => {
89
+ if (Object.keys(this.handlers).length === this.maxListeners) {
90
+ throw new Error('Max listeners reached');
91
+ }
92
+
93
+ this.handlers[event] = this.handlers[event] || [];
94
+ this.handlers[event].unshift(listener);
95
+ return this;
96
+ };
97
+ prependOnceListener = (event, listener) => {
98
+ if (Object.keys(this.handlers).length === this.maxListeners) {
99
+ throw new Error('Max listeners reached');
100
+ }
101
+
102
+ this.handlers[event] = this.handlers[event] || [];
103
+
104
+ const onceWrapper = () => {
105
+ listener();
106
+ this.off(event, onceWrapper);
107
+ };
108
+
109
+ this.handlers[event].unshift(onceWrapper);
110
+ return this;
111
+ };
112
+ eventNames = () => Object.keys(this.handlers);
113
+ on = (event, listener) => this.addListener(event, listener);
114
+ emit = (event, ...args) => {
115
+ const listeners = this.listeners(event);
116
+
117
+ if (listeners.length > 0) {
118
+ listeners.forEach(listener => {
119
+ if (listener) listener(args);
120
+ });
121
+ return true;
122
+ }
123
+
124
+ return false;
125
+ };
8
126
  }
127
+
128
+ exports.PacketType = void 0;
129
+
130
+ (function (PacketType) {
131
+ PacketType[PacketType["EVENT"] = 0] = "EVENT";
132
+ PacketType[PacketType["ACK"] = 1] = "ACK";
133
+ })(exports.PacketType || (exports.PacketType = {}));
134
+
135
+ exports.ConnectionState = void 0;
136
+
137
+ (function (ConnectionState) {
138
+ ConnectionState["DISCONNECTED"] = "disconnected";
139
+ ConnectionState["CONNECTING"] = "connecting";
140
+ ConnectionState["CONNECTED"] = "connected";
141
+ ConnectionState["DISCONNECTING"] = "disconnecting";
142
+ })(exports.ConnectionState || (exports.ConnectionState = {}));
143
+
144
+ const DEFAULT_OPTIONS = {
145
+ reconnection: true,
146
+ reconnectionDelay: 1000,
147
+ reconnectionDelayMax: 5000,
148
+ reconnectionAttempts: Infinity,
149
+ randomizationFactor: 0.5,
150
+ timeout: 5000,
151
+ debug: false
152
+ };
153
+
154
+ class TeckosClient extends SocketEventEmitter {
155
+ url;
156
+ options;
157
+ ws;
158
+ currentReconnectDelay;
159
+ currentReconnectionAttempts = 0;
160
+ acks = new Map();
161
+ fnId = 0;
162
+ connectionTimeout;
163
+ reconnectionTimeout;
164
+
165
+ constructor(url, options) {
166
+ super();
167
+ this.options = { ...DEFAULT_OPTIONS,
168
+ ...options
169
+ };
170
+ this.currentReconnectDelay = this.options.reconnectionDelay;
171
+ this.url = url;
172
+ }
173
+
174
+ 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;
180
+ }
181
+ };
182
+
183
+ get webSocket() {
184
+ return this.ws;
185
+ }
186
+
187
+ connect = () => {
188
+ if (this.options.debug) console.log(`(teckos:client) Connecting to ${this.url}...`); // This will try to connect immediately
189
+ // eslint-disable-next-line new-cap
190
+
191
+ this.ws = new undefined(this.url); // Attach handlers
192
+
193
+ this.attachHandler(); // Handle timeout
194
+
195
+ this.connectionTimeout = setTimeout(() => {
196
+ if (this.ws && this.ws.readyState === 0
197
+ /* = CONNECTING */
198
+ ) {
199
+ this.ws.close();
200
+ }
201
+ }, this.options.timeout);
202
+ };
203
+ reconnect = () => {
204
+ this.listeners('reconnect_attempt').forEach(listener => listener());
205
+ this.connect();
206
+ };
207
+
208
+ 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
+ :
219
+ return exports.ConnectionState.CONNECTED;
220
+
221
+ case 2
222
+ /* = CLOSING */
223
+ :
224
+ return exports.ConnectionState.DISCONNECTING;
225
+
226
+ default:
227
+ /* 3 = CLOSED */
228
+ return exports.ConnectionState.DISCONNECTED;
229
+ }
230
+ }
231
+
232
+ return exports.ConnectionState.DISCONNECTED;
233
+ }
234
+
235
+ get state() {
236
+ return this.getConnectionState();
237
+ }
238
+
239
+ get connected() {
240
+ return this.getConnectionState() === exports.ConnectionState.CONNECTED;
241
+ }
242
+
243
+ get disconnected() {
244
+ return this.getConnectionState() === exports.ConnectionState.DISCONNECTED;
245
+ }
246
+
247
+ emit = (event, ...args) => {
248
+ args.unshift(event);
249
+ const packet = {
250
+ type: exports.PacketType.EVENT,
251
+ data: args
252
+ };
253
+
254
+ if (typeof args[args.length - 1] === 'function') {
255
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
256
+ this.acks.set(this.fnId, args.pop());
257
+ packet.id = this.fnId;
258
+ this.fnId += 1;
259
+ }
260
+
261
+ return this.sendPackage(packet);
262
+ };
263
+ send = (...args) => {
264
+ args.unshift('message');
265
+ return this.sendPackage({
266
+ type: exports.PacketType.EVENT,
267
+ data: args
268
+ });
269
+ };
270
+ sendPackage = packet => {
271
+ if (this.ws !== undefined && this.ws.readyState === 1
272
+ /* = OPEN */
273
+ ) {
274
+ const buffer = encodePacket(packet);
275
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Send packet: ${JSON.stringify(packet)}`);
276
+ this.ws.send(buffer);
277
+ return true;
278
+ }
279
+
280
+ return false;
281
+ };
282
+ handleMessage = msg => {
283
+ const packet = typeof msg.data === 'string' ? JSON.parse(msg.data) : decodePacket(msg.data);
284
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Got packet: ${JSON.stringify(packet)}`);
285
+
286
+ if (packet.type === exports.PacketType.EVENT) {
287
+ const event = packet.data[0];
288
+ const args = packet.data.slice(1);
289
+
290
+ if (event) {
291
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
292
+ this.listeners(event).forEach(listener => listener(...args));
293
+ } else {
294
+ throw new Error(`(teckos-client) [${this.url}] Got invalid event message: ${JSON.stringify(msg.data)}`);
295
+ }
296
+ } else if (packet.type === exports.PacketType.ACK && packet.id !== undefined) {
297
+ // Call assigned function
298
+ const ack = this.acks.get(packet.id);
299
+
300
+ if (typeof ack === 'function') {
301
+ ack.apply(this, packet.data);
302
+ this.acks.delete(packet.id);
303
+ }
304
+ } else {
305
+ throw new Error(`(teckos-client) [${this.url}] Got invalid message type: ${packet.type}`);
306
+ }
307
+ };
308
+ handleOpen = () => {
309
+ if (this.currentReconnectionAttempts > 0) {
310
+ // Reset reconnection settings to default
311
+ this.currentReconnectDelay = this.options.reconnectionDelay;
312
+ this.currentReconnectionAttempts = 0; // Inform listeners
313
+
314
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Reconnected!`); // eslint-disable-next-line @typescript-eslint/no-unsafe-return
315
+
316
+ this.listeners('reconnect').forEach(listener => listener());
317
+ } // Inform listeners
318
+
319
+
320
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Connected!`);
321
+ this.listeners('connect').forEach(listener => listener());
322
+ };
323
+ handleError = error => {
324
+ if (this.handlers && this.handlers.error) {
325
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Got error from server: ${JSON.stringify(error)}`);
326
+ this.handlers.error.forEach(listener => listener(error));
327
+ }
328
+ };
329
+ handleClose = () => {
330
+ // Stop connection timeout
331
+ if (this.connectionTimeout) {
332
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
333
+ clearTimeout(this.connectionTimeout);
334
+ } // Stop reconnection timeout
335
+
336
+
337
+ if (this.reconnectionTimeout) {
338
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
339
+ clearTimeout(this.reconnectionTimeout);
340
+ } // Inform listeners
341
+
342
+
343
+ if (this.currentReconnectionAttempts > 0) {
344
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Reconnect #${this.currentReconnectionAttempts} failed!`);
345
+ this.listeners('reconnect_error').forEach(listener => {
346
+ if (listener) listener();
347
+ });
348
+ } else {
349
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Disconnected!`);
350
+ this.listeners('disconnect').forEach(listener => {
351
+ if (listener) listener();
352
+ });
353
+ }
354
+
355
+ if (this.options.reconnection) {
356
+ // Apply reconnection logic
357
+ this.currentReconnectionAttempts += 1;
358
+
359
+ if (this.options.reconnectionAttempts === Infinity || this.currentReconnectionAttempts <= this.options.reconnectionAttempts) {
360
+ const timeout = Math.min(this.options.reconnectionDelayMax, this.currentReconnectDelay); // Increase reconnection delay
361
+
362
+ this.currentReconnectDelay = Math.round(this.currentReconnectDelay + this.currentReconnectDelay * this.options.randomizationFactor);
363
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Try reconnecting (${this.currentReconnectionAttempts}/${this.options.reconnectionAttempts}) in ${timeout}ms to ${this.url}...`);
364
+ this.reconnectionTimeout = setTimeout(() => {
365
+ this.reconnect();
366
+ }, timeout);
367
+ } else {
368
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Reconnection maximum of ${this.options.reconnectionAttempts} reached`);
369
+ this.listeners('reconnect_failed').forEach(listener => listener());
370
+ }
371
+ }
372
+ };
373
+ close = () => {
374
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Closing connection (client-side)`);
375
+
376
+ if (this.ws !== undefined) {
377
+ this.ws.onclose = () => {};
378
+
379
+ this.ws.close();
380
+ this.listeners('disconnect').forEach(listener => listener());
381
+ }
382
+ };
383
+ disconnect = () => {
384
+ this.close();
385
+ };
386
+ }
387
+
388
+ /* eslint-disable no-console */
389
+
390
+ class TeckosClientWithJWT extends TeckosClient {
391
+ token;
392
+ initialData;
393
+ receivedReady = false; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
394
+
395
+ constructor(url, options, token, initialData) {
396
+ super(url, options);
397
+ this.token = token; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
398
+
399
+ this.initialData = initialData;
400
+ this.on('disconnect', () => {
401
+ this.receivedReady = false;
402
+ });
403
+ }
404
+
405
+ getConnectionState() {
406
+ if (this.ws) {
407
+ switch (this.ws.readyState) {
408
+ case undefined:
409
+ if (this.receivedReady) {
410
+ return exports.ConnectionState.CONNECTED;
411
+ }
412
+
413
+ return exports.ConnectionState.CONNECTING;
414
+
415
+ case undefined:
416
+ return exports.ConnectionState.CONNECTING;
417
+
418
+ case undefined:
419
+ return exports.ConnectionState.DISCONNECTING;
420
+
421
+ default:
422
+ return exports.ConnectionState.DISCONNECTED;
423
+ }
424
+ }
425
+
426
+ return exports.ConnectionState.DISCONNECTED;
427
+ }
428
+
429
+ handleReadyEvent = () => {
430
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Connected!`);
431
+ this.receivedReady = true;
432
+
433
+ if (this.currentReconnectionAttempts > 0) {
434
+ if (this.options.debug) console.log(`(teckos:client) [${this.url}] Reconnected!`);
435
+ this.listeners('reconnect').forEach(listener => listener()); // Reset reconnection settings to default
436
+
437
+ this.currentReconnectDelay = this.options.reconnectionDelay;
438
+ this.currentReconnectionAttempts = 0;
439
+ }
440
+
441
+ this.listeners('connect').forEach(listener => listener());
442
+ };
443
+ handleOpen = () => {
444
+ this.receivedReady = false;
445
+ this.once('ready', this.handleReadyEvent);
446
+ if (this.options.debug) console.log(`(teckos:client) Connection opened, sending token now`);
447
+ this.emit('token', {
448
+ token: this.token,
449
+ ...this.initialData
450
+ });
451
+ };
452
+ }
453
+
454
+ exports.TeckosClient = TeckosClient;
455
+ exports.TeckosClientWithJWT = TeckosClientWithJWT;
456
+
457
+ Object.defineProperty(exports, '__esModule', { value: true });
458
+
459
+ }));
@@ -0,0 +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})}));