teckos-client 0.2.0 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  /// <reference types="ws" />
2
2
  import WebSocket from 'isomorphic-ws';
3
3
  import { ConnectionState, Packet, SocketEvent } from './types';
4
- import SocketEventEmitter from './util/SocketEventEmitter';
4
+ import { SocketEventEmitter } from './util/SocketEventEmitter';
5
5
  interface ITeckosClient extends SocketEventEmitter<SocketEvent> {
6
6
  ws: WebSocket | undefined;
7
7
  readonly webSocket: WebSocket | undefined;
@@ -15,4 +15,4 @@ interface ITeckosClient extends SocketEventEmitter<SocketEvent> {
15
15
  connect: () => void;
16
16
  disconnect: () => void;
17
17
  }
18
- export default ITeckosClient;
18
+ export type { ITeckosClient };
@@ -1,8 +1,8 @@
1
1
  /// <reference types="ws" />
2
2
  import WebSocket from 'isomorphic-ws';
3
3
  import { ConnectionState, OptionalOptions, Options, Packet, SocketEvent } from './types';
4
- import ITeckosClient from './ITeckosClient';
5
- import SocketEventEmitter from './util/SocketEventEmitter';
4
+ import { ITeckosClient } from './ITeckosClient';
5
+ import { SocketEventEmitter } from './util/SocketEventEmitter';
6
6
  declare class TeckosClient extends SocketEventEmitter<SocketEvent> implements ITeckosClient {
7
7
  protected readonly url: string;
8
8
  protected readonly options: Options;
@@ -32,4 +32,4 @@ declare class TeckosClient extends SocketEventEmitter<SocketEvent> implements IT
32
32
  close: () => void;
33
33
  disconnect: () => void;
34
34
  }
35
- export default TeckosClient;
35
+ export { TeckosClient };
@@ -1,4 +1,4 @@
1
- import TeckosClient from './TeckosClient';
1
+ import { TeckosClient } from './TeckosClient';
2
2
  import { OptionalOptions, ConnectionState } from './types';
3
3
  declare class TeckosClientWithJWT extends TeckosClient {
4
4
  protected readonly token: string;
@@ -9,4 +9,4 @@ declare class TeckosClientWithJWT extends TeckosClient {
9
9
  protected handleReadyEvent: () => void;
10
10
  protected handleOpen: () => void;
11
11
  }
12
- export default TeckosClientWithJWT;
12
+ export { TeckosClientWithJWT };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import TeckosClientWithJWT from './TeckosClientWithJWT';
2
- import TeckosClient from './TeckosClient';
3
- import ITeckosClient from './ITeckosClient';
4
- import * as types from './types';
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
5
  /**
6
6
  * Expose all types
7
7
  */
8
- export type { ITeckosClient };
9
- export { types, TeckosClient, TeckosClientWithJWT };
8
+ export type { Options, OptionalOptions, Packet, SocketEvent, ITeckosClient };
9
+ export { ConnectionState, PacketType, TeckosClient, TeckosClientWithJWT };
@@ -76,33 +76,17 @@ var decodePacket = function decodePacket(buffer) {
76
76
  return JSON.parse(dec.decode(buffer).toString());
77
77
  };
78
78
 
79
- var PacketType;
80
-
81
79
  (function (PacketType) {
82
80
  PacketType[PacketType["EVENT"] = 0] = "EVENT";
83
81
  PacketType[PacketType["ACK"] = 1] = "ACK";
84
- })(PacketType || (PacketType = {}));
85
-
86
- var PacketType$1 = PacketType;
87
-
88
- var ConnectionState;
82
+ })(exports.PacketType || (exports.PacketType = {}));
89
83
 
90
84
  (function (ConnectionState) {
91
85
  ConnectionState["DISCONNECTED"] = "disconnected";
92
86
  ConnectionState["CONNECTING"] = "connecting";
93
87
  ConnectionState["CONNECTED"] = "connected";
94
88
  ConnectionState["DISCONNECTING"] = "disconnecting";
95
- })(ConnectionState || (ConnectionState = {}));
96
-
97
- var ConnectionState$1 = ConnectionState;
98
-
99
-
100
-
101
- var index = {
102
- __proto__: null,
103
- ConnectionState: ConnectionState$1,
104
- PacketType: PacketType$1
105
- };
89
+ })(exports.ConnectionState || (exports.ConnectionState = {}));
106
90
 
107
91
  var SocketEventEmitter = function SocketEventEmitter() {
108
92
  var _this = this;
@@ -318,11 +302,12 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
318
302
 
319
303
  args.unshift(event);
320
304
  var packet = {
321
- type: PacketType$1.EVENT,
305
+ type: exports.PacketType.EVENT,
322
306
  data: args
323
307
  };
324
308
 
325
309
  if (typeof args[args.length - 1] === 'function') {
310
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
326
311
  _this.acks.set(_this.fnId, args.pop());
327
312
 
328
313
  packet.id = _this.fnId;
@@ -339,7 +324,7 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
339
324
 
340
325
  args.unshift('message');
341
326
  return _this.sendPackage({
342
- type: PacketType$1.EVENT,
327
+ type: exports.PacketType.EVENT,
343
328
  data: args
344
329
  });
345
330
  };
@@ -361,18 +346,19 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
361
346
  var packet = typeof msg.data === 'string' ? JSON.parse(msg.data) : decodePacket(msg.data);
362
347
  if (_this.options.debug) d("[" + _this.url + "] Got packet: " + JSON.stringify(packet));
363
348
 
364
- if (packet.type === PacketType$1.EVENT) {
349
+ if (packet.type === exports.PacketType.EVENT) {
365
350
  var event = packet.data[0];
366
351
  var args = packet.data.slice(1);
367
352
 
368
353
  if (event) {
354
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
369
355
  _this.listeners(event).forEach(function (listener) {
370
356
  return listener.apply(void 0, args);
371
357
  });
372
358
  } else {
373
- throw new Error("[teckos-client@" + _this.url + "] Got invalid event message: " + msg.data);
359
+ throw new Error("[teckos-client@" + _this.url + "] Got invalid event message: " + JSON.stringify(msg.data));
374
360
  }
375
- } else if (packet.type === PacketType$1.ACK && packet.id !== undefined) {
361
+ } else if (packet.type === exports.PacketType.ACK && packet.id !== undefined) {
376
362
  // Call assigned function
377
363
  var ack = _this.acks.get(packet.id);
378
364
 
@@ -392,7 +378,7 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
392
378
  _this.currentReconnectDelay = _this.options.reconnectionDelay;
393
379
  _this.currentReconnectionAttempts = 0; // Inform listeners
394
380
 
395
- if (_this.options.debug) d("[" + _this.url + "] Reconnected!");
381
+ if (_this.options.debug) d("[" + _this.url + "] Reconnected!"); // eslint-disable-next-line @typescript-eslint/no-unsafe-return
396
382
 
397
383
  _this.listeners('reconnect').forEach(function (listener) {
398
384
  return listener();
@@ -409,7 +395,7 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
409
395
 
410
396
  _this.handleError = function (error) {
411
397
  if (_this.handlers && _this.handlers.error) {
412
- if (_this.options.debug) d("[" + _this.url + "] Got error from server: " + error);
398
+ if (_this.options.debug) d("[" + _this.url + "] Got error from server: " + JSON.stringify(error));
413
399
 
414
400
  _this.handlers.error.forEach(function (listener) {
415
401
  return listener(error);
@@ -420,11 +406,13 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
420
406
  _this.handleClose = function () {
421
407
  // Stop connection timeout
422
408
  if (_this.connectionTimeout) {
409
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
423
410
  clearTimeout(_this.connectionTimeout);
424
411
  } // Stop reconnection timeout
425
412
 
426
413
 
427
414
  if (_this.reconnectionTimeout) {
415
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
428
416
  clearTimeout(_this.reconnectionTimeout);
429
417
  } // Inform listeners
430
418
 
@@ -472,6 +460,10 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
472
460
  _this.ws.onclose = function () {};
473
461
 
474
462
  _this.ws.close();
463
+
464
+ _this.listeners('disconnect').forEach(function (listener) {
465
+ return listener();
466
+ });
475
467
  }
476
468
  };
477
469
 
@@ -491,20 +483,20 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
491
483
  if (this.ws) {
492
484
  switch (this.ws.readyState) {
493
485
  case WebSocket.OPEN:
494
- return ConnectionState$1.CONNECTED;
486
+ return exports.ConnectionState.CONNECTED;
495
487
 
496
488
  case WebSocket.CONNECTING:
497
- return ConnectionState$1.CONNECTING;
489
+ return exports.ConnectionState.CONNECTING;
498
490
 
499
491
  case WebSocket.CLOSING:
500
- return ConnectionState$1.DISCONNECTING;
492
+ return exports.ConnectionState.DISCONNECTING;
501
493
 
502
494
  default:
503
- return ConnectionState$1.DISCONNECTED;
495
+ return exports.ConnectionState.DISCONNECTED;
504
496
  }
505
497
  }
506
498
 
507
- return ConnectionState$1.DISCONNECTED;
499
+ return exports.ConnectionState.DISCONNECTED;
508
500
  };
509
501
 
510
502
  _createClass(TeckosClient, [{
@@ -520,12 +512,12 @@ var TeckosClient = /*#__PURE__*/function (_SocketEventEmitter) {
520
512
  }, {
521
513
  key: "connected",
522
514
  get: function get() {
523
- return this.getConnectionState() === ConnectionState$1.CONNECTED;
515
+ return this.getConnectionState() === exports.ConnectionState.CONNECTED;
524
516
  }
525
517
  }, {
526
518
  key: "disconnected",
527
519
  get: function get() {
528
- return this.getConnectionState() === ConnectionState$1.DISCONNECTED;
520
+ return this.getConnectionState() === exports.ConnectionState.DISCONNECTED;
529
521
  }
530
522
  }]);
531
523
 
@@ -537,6 +529,7 @@ var d$1 = /*#__PURE__*/debug('teckos:client');
537
529
  var TeckosClientWithJWT = /*#__PURE__*/function (_TeckosClient) {
538
530
  _inheritsLoose(TeckosClientWithJWT, _TeckosClient);
539
531
 
532
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
540
533
  function TeckosClientWithJWT(url, options, token, initialData) {
541
534
  var _this;
542
535
 
@@ -545,7 +538,7 @@ var TeckosClientWithJWT = /*#__PURE__*/function (_TeckosClient) {
545
538
 
546
539
  _this.handleReadyEvent = function () {
547
540
  if (_this.options.debug) d$1("[" + _this.url + "] Connected!");
548
- _this.receivedReady = false;
541
+ _this.receivedReady = true;
549
542
 
550
543
  if (_this.currentReconnectionAttempts > 0) {
551
544
  if (_this.options.debug) d$1("[" + _this.url + "] Reconnected!");
@@ -576,8 +569,14 @@ var TeckosClientWithJWT = /*#__PURE__*/function (_TeckosClient) {
576
569
  }, _this.initialData));
577
570
  };
578
571
 
579
- _this.token = token;
572
+ _this.token = token; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
573
+
580
574
  _this.initialData = initialData;
575
+
576
+ _this.on('disconnect', function () {
577
+ _this.receivedReady = false;
578
+ });
579
+
581
580
  return _this;
582
581
  }
583
582
 
@@ -588,23 +587,23 @@ var TeckosClientWithJWT = /*#__PURE__*/function (_TeckosClient) {
588
587
  switch (this.ws.readyState) {
589
588
  case WebSocket.OPEN:
590
589
  if (this.receivedReady) {
591
- return ConnectionState$1.CONNECTED;
590
+ return exports.ConnectionState.CONNECTED;
592
591
  }
593
592
 
594
- return ConnectionState$1.CONNECTING;
593
+ return exports.ConnectionState.CONNECTING;
595
594
 
596
595
  case WebSocket.CONNECTING:
597
- return ConnectionState$1.CONNECTING;
596
+ return exports.ConnectionState.CONNECTING;
598
597
 
599
598
  case WebSocket.CLOSING:
600
- return ConnectionState$1.DISCONNECTING;
599
+ return exports.ConnectionState.DISCONNECTING;
601
600
 
602
601
  default:
603
- return ConnectionState$1.DISCONNECTED;
602
+ return exports.ConnectionState.DISCONNECTED;
604
603
  }
605
604
  }
606
605
 
607
- return ConnectionState$1.DISCONNECTED;
606
+ return exports.ConnectionState.DISCONNECTED;
608
607
  };
609
608
 
610
609
  return TeckosClientWithJWT;
@@ -612,5 +611,4 @@ var TeckosClientWithJWT = /*#__PURE__*/function (_TeckosClient) {
612
611
 
613
612
  exports.TeckosClient = TeckosClient;
614
613
  exports.TeckosClientWithJWT = TeckosClientWithJWT;
615
- exports.types = index;
616
614
  //# sourceMappingURL=teckos-client.cjs.development.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"teckos-client.cjs.development.js","sources":["../src/util/Converter.ts","../src/types/PacketType.ts","../src/types/ConnectionState.ts","../src/util/SocketEventEmitter.ts","../src/TeckosClient.ts","../src/TeckosClientWithJWT.ts"],"sourcesContent":["import { Packet } from '../types'\n\nconst enc = new TextEncoder()\nconst dec = new TextDecoder()\n\nconst encodePacket = (packet: Packet): ArrayBufferLike => enc.encode(JSON.stringify(packet))\nconst decodePacket = (buffer: ArrayBuffer): Packet => JSON.parse(dec.decode(buffer).toString())\nexport { encodePacket, decodePacket }\n","enum PacketType {\n EVENT,\n ACK,\n}\nexport default PacketType\n","enum ConnectionState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n DISCONNECTING = 'disconnecting',\n}\nexport default ConnectionState\n","class SocketEventEmitter<T extends string> {\n protected maxListeners: number = 50\n\n protected handlers: {\n [event: string]: ((...args: any[]) => void)[]\n } = {}\n\n public addListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n if (typeof listener !== 'function') {\n throw new Error('The given listener is not a function')\n }\n this.handlers[event] = this.handlers[event] || []\n this.handlers[event].push(listener)\n return this\n }\n\n public once = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n if (typeof listener !== 'function') {\n throw new Error('The given listener is not a function')\n }\n this.handlers[event] = this.handlers[event] || []\n const onceWrapper = () => {\n listener()\n this.off(event, onceWrapper)\n }\n this.handlers[event].push(onceWrapper)\n return this\n }\n\n public removeListener = (event: T, listener: (...args: any[]) => void): this => {\n if (this.handlers[event]) {\n this.handlers[event] = this.handlers[event].filter((handler) => handler !== listener)\n }\n return this\n }\n\n public off = (event: T, listener: (...args: any[]) => void): this =>\n this.removeListener(event, listener)\n\n public removeAllListeners = (event?: T): this => {\n if (event) {\n delete this.handlers[event]\n } else {\n this.handlers = {}\n }\n return this\n }\n\n public setMaxListeners = (n: number): this => {\n this.maxListeners = n\n return this\n }\n\n public getMaxListeners = (): number => this.maxListeners\n\n public listeners = (event: T): Function[] => {\n if (this.handlers[event]) {\n return [...this.handlers[event]]\n }\n return []\n }\n\n public rawListeners = (event: T): Function[] => [...this.handlers[event]]\n\n public listenerCount = (event: T): number => {\n if (this.handlers[event]) {\n return Object.keys(this.handlers[event]).length\n }\n return 0\n }\n\n public prependListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n this.handlers[event] = this.handlers[event] || []\n this.handlers[event].unshift(listener)\n return this\n }\n\n public prependOnceListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n this.handlers[event] = this.handlers[event] || []\n const onceWrapper = () => {\n listener()\n this.off(event, onceWrapper)\n }\n this.handlers[event].unshift(onceWrapper)\n return this\n }\n\n public eventNames = (): T[] => Object.keys(this.handlers) as T[]\n\n public on = (event: T, listener: (...args: any[]) => void): this =>\n this.addListener(event, listener)\n\n public emit = (event: T, ...args: any[]): boolean => {\n const listeners = this.listeners(event)\n if (listeners.length > 0) {\n listeners.forEach((listener) => {\n if (listener) listener(args)\n })\n return true\n }\n return false\n }\n}\n\nexport default SocketEventEmitter\n","import debug from 'debug'\nimport WebSocket from 'isomorphic-ws'\nimport { decodePacket, encodePacket } from './util/Converter'\nimport { ConnectionState, OptionalOptions, Options, Packet, PacketType, SocketEvent } from './types'\nimport ITeckosClient from './ITeckosClient'\nimport SocketEventEmitter from './util/SocketEventEmitter'\n\nconst d = debug('teckos:client')\n\nconst DEFAULT_OPTIONS: Options = {\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 5000,\n reconnectionAttempts: Infinity,\n randomizationFactor: 0.5,\n timeout: 5000,\n debug: false,\n}\n\nclass TeckosClient extends SocketEventEmitter<SocketEvent> implements ITeckosClient {\n protected readonly url: string\n\n protected readonly options: Options\n\n ws: WebSocket | undefined\n\n protected currentReconnectDelay: number\n\n protected currentReconnectionAttempts: number = 0\n\n protected acks: Map<number, (...args: any[]) => void> = new Map()\n\n protected fnId: number = 0\n\n protected connectionTimeout: any | undefined\n\n protected reconnectionTimeout: any | undefined\n\n constructor(url: string, options?: OptionalOptions) {\n super()\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n }\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.url = url\n }\n\n protected attachHandler = () => {\n if (this.ws) {\n this.ws.onopen = this.handleOpen\n this.ws.onerror = this.handleError\n this.ws.onclose = this.handleClose\n this.ws.onmessage = this.handleMessage\n }\n }\n\n public get webSocket() {\n return this.ws\n }\n\n public connect = () => {\n if (this.options.debug) d(`Connecting to ${this.url}...`)\n\n // This will try to connect immediately\n this.ws = new WebSocket(this.url)\n // Attach handlers\n this.attachHandler()\n // Handle timeout\n this.connectionTimeout = setTimeout(() => {\n if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close()\n }\n }, this.options.timeout)\n }\n\n protected reconnect = () => {\n this.listeners('reconnect_attempt').forEach((listener) => listener())\n this.connect()\n }\n\n protected getConnectionState(): ConnectionState {\n if (this.ws) {\n switch (this.ws.readyState) {\n case WebSocket.OPEN:\n return ConnectionState.CONNECTED\n case WebSocket.CONNECTING:\n return ConnectionState.CONNECTING\n case WebSocket.CLOSING:\n return ConnectionState.DISCONNECTING\n default:\n return ConnectionState.DISCONNECTED\n }\n }\n return ConnectionState.DISCONNECTED\n }\n\n public get state(): ConnectionState {\n return this.getConnectionState()\n }\n\n get connected(): boolean {\n return this.getConnectionState() === ConnectionState.CONNECTED\n }\n\n get disconnected(): boolean {\n return this.getConnectionState() === ConnectionState.DISCONNECTED\n }\n\n public emit = (event: SocketEvent, ...args: any[]): boolean => {\n args.unshift(event)\n\n const packet: Packet = {\n type: PacketType.EVENT,\n data: args,\n }\n\n if (typeof args[args.length - 1] === 'function') {\n this.acks.set(this.fnId, args.pop())\n packet.id = this.fnId\n this.fnId += 1\n }\n\n return this.sendPackage(packet)\n }\n\n public send = (...args: any[]): boolean => {\n args.unshift('message')\n return this.sendPackage({\n type: PacketType.EVENT,\n data: args,\n })\n }\n\n public sendPackage = (packet: Packet): boolean => {\n if (this.ws !== undefined && this.ws.readyState === WebSocket.OPEN) {\n const buffer = encodePacket(packet)\n if (this.options.debug) d(`[${this.url}] Send packet: ${JSON.stringify(packet)}`)\n this.ws.send(buffer)\n return true\n }\n return false\n }\n\n protected handleMessage = (msg: WebSocket.MessageEvent) => {\n const packet =\n typeof msg.data === 'string'\n ? JSON.parse(msg.data)\n : decodePacket(msg.data as ArrayBuffer)\n if (this.options.debug) d(`[${this.url}] Got packet: ${JSON.stringify(packet)}`)\n if (packet.type === PacketType.EVENT) {\n const event = packet.data[0]\n const args = packet.data.slice(1)\n if (event) {\n this.listeners(event).forEach((listener) => listener(...args))\n } else {\n throw new Error(\n `[teckos-client@${this.url}] Got invalid event message: ${msg.data}`\n )\n }\n } else if (packet.type === PacketType.ACK && packet.id !== undefined) {\n // Call assigned function\n const ack = this.acks.get(packet.id)\n if (typeof ack === 'function') {\n ack.apply(this, packet.data)\n this.acks.delete(packet.id)\n }\n } else {\n throw new Error(`[teckos-client@${this.url}] Got invalid message type: ${packet.type}`)\n }\n }\n\n protected handleOpen = () => {\n if (this.currentReconnectionAttempts > 0) {\n // Reset reconnection settings to default\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.currentReconnectionAttempts = 0\n\n // Inform listeners\n if (this.options.debug) d(`[${this.url}] Reconnected!`)\n this.listeners('reconnect').forEach((listener) => listener())\n }\n // Inform listeners\n if (this.options.debug) d(`[${this.url}] Connected!`)\n this.listeners('connect').forEach((listener) => listener())\n }\n\n protected handleError = (error: WebSocket.ErrorEvent) => {\n if (this.handlers && this.handlers.error) {\n if (this.options.debug) d(`[${this.url}] Got error from server: ${error}`)\n this.handlers.error.forEach((listener) => listener(error))\n }\n }\n\n protected handleClose = () => {\n // Stop connection timeout\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout)\n }\n // Stop reconnection timeout\n if (this.reconnectionTimeout) {\n clearTimeout(this.reconnectionTimeout)\n }\n\n // Inform listeners\n if (this.currentReconnectionAttempts > 0) {\n if (this.options.debug)\n d(`[${this.url}] Reconnect #${this.currentReconnectionAttempts} failed!`)\n this.listeners('reconnect_error').forEach((listener) => {\n if (listener) listener()\n })\n } else {\n if (this.options.debug) d(`[${this.url}] Disconnected!`)\n this.listeners('disconnect').forEach((listener) => {\n if (listener) listener()\n })\n }\n\n if (this.options.reconnection) {\n // Apply reconnection logic\n this.currentReconnectionAttempts += 1\n\n if (\n this.options.reconnectionAttempts === Infinity ||\n this.currentReconnectionAttempts <= this.options.reconnectionAttempts\n ) {\n const timeout = Math.min(\n this.options.reconnectionDelayMax,\n this.currentReconnectDelay\n )\n // Increase reconnection delay\n this.currentReconnectDelay = Math.round(\n this.currentReconnectDelay +\n this.currentReconnectDelay * this.options.randomizationFactor\n )\n\n if (this.options.debug)\n d(\n `[${this.url}] Try reconnecting (${this.currentReconnectionAttempts}/${this.options.reconnectionAttempts}) in ${timeout}ms to ${this.url}...`\n )\n this.reconnectionTimeout = setTimeout(() => {\n this.reconnect()\n }, timeout)\n } else {\n if (this.options.debug)\n d(\n `[${this.url}] Reconnection maximum of ${this.options.reconnectionAttempts} reached`\n )\n this.listeners('reconnect_failed').forEach((listener) => listener())\n }\n }\n }\n\n public close = () => {\n if (this.options.debug) d(`[${this.url}] Closing connection (client-side)`)\n if (this.ws !== undefined) {\n this.ws.onclose = () => {}\n this.ws.close()\n }\n }\n\n public disconnect = () => {\n this.close()\n }\n}\n\nexport default TeckosClient\n","import debug from 'debug'\nimport WebSocket from 'isomorphic-ws'\nimport TeckosClient from './TeckosClient'\nimport { OptionalOptions, ConnectionState } from './types'\n\nconst d = debug('teckos:client')\n\nclass TeckosClientWithJWT extends TeckosClient {\n protected readonly token: string\n\n protected readonly initialData: any\n\n protected receivedReady: boolean = false\n\n constructor(url: string, options: OptionalOptions, token: string, initialData?: any) {\n super(url, options)\n this.token = token\n this.initialData = initialData\n }\n\n protected getConnectionState(): ConnectionState {\n if (this.ws) {\n switch (this.ws.readyState) {\n case WebSocket.OPEN:\n if (this.receivedReady) {\n return ConnectionState.CONNECTED\n }\n return ConnectionState.CONNECTING\n case WebSocket.CONNECTING:\n return ConnectionState.CONNECTING\n case WebSocket.CLOSING:\n return ConnectionState.DISCONNECTING\n default:\n return ConnectionState.DISCONNECTED\n }\n }\n return ConnectionState.DISCONNECTED\n }\n\n protected handleReadyEvent = () => {\n if (this.options.debug) d(`[${this.url}] Connected!`)\n this.receivedReady = false\n if (this.currentReconnectionAttempts > 0) {\n if (this.options.debug) d(`[${this.url}] Reconnected!`)\n this.listeners('reconnect').forEach((listener) => listener())\n // Reset reconnection settings to default\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.currentReconnectionAttempts = 0\n }\n this.listeners('connect').forEach((listener) => listener())\n }\n\n protected handleOpen = () => {\n this.receivedReady = false\n this.once('ready', this.handleReadyEvent)\n if (this.options.debug) d('Connection opened, sending token now')\n this.emit('token', {\n token: this.token,\n ...this.initialData,\n })\n }\n}\n\nexport default TeckosClientWithJWT\n"],"names":["enc","TextEncoder","dec","TextDecoder","encodePacket","packet","encode","JSON","stringify","decodePacket","buffer","parse","decode","toString","PacketType","ConnectionState","SocketEventEmitter","event","listener","Object","keys","handlers","length","maxListeners","Error","push","onceWrapper","off","filter","handler","removeListener","n","unshift","addListener","args","listeners","forEach","d","debug","DEFAULT_OPTIONS","reconnection","reconnectionDelay","reconnectionDelayMax","reconnectionAttempts","Infinity","randomizationFactor","timeout","TeckosClient","url","options","Map","ws","onopen","handleOpen","onerror","handleError","onclose","handleClose","onmessage","handleMessage","WebSocket","attachHandler","connectionTimeout","setTimeout","readyState","CONNECTING","close","connect","type","EVENT","data","acks","set","fnId","pop","id","sendPackage","undefined","OPEN","send","msg","slice","ACK","ack","get","apply","currentReconnectionAttempts","currentReconnectDelay","error","clearTimeout","reconnectionTimeout","Math","min","round","reconnect","getConnectionState","CONNECTED","CLOSING","DISCONNECTING","DISCONNECTED","TeckosClientWithJWT","token","initialData","receivedReady","once","handleReadyEvent","emit"],"mappings":"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"}
1
+ {"version":3,"file":"teckos-client.cjs.development.js","sources":["../src/util/Converter.ts","../src/types/PacketType.ts","../src/types/ConnectionState.ts","../src/util/SocketEventEmitter.ts","../src/TeckosClient.ts","../src/TeckosClientWithJWT.ts"],"sourcesContent":["import { Packet } from '../types'\n\nconst enc = new TextEncoder()\nconst dec = new TextDecoder()\n\nconst encodePacket = (packet: Packet): ArrayBufferLike => enc.encode(JSON.stringify(packet))\nconst decodePacket = (buffer: ArrayBuffer): Packet =>\n JSON.parse(dec.decode(buffer).toString()) as Packet\n\nexport { encodePacket, decodePacket }\n","enum PacketType {\n EVENT,\n ACK,\n}\nexport { PacketType }\n","enum ConnectionState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n DISCONNECTING = 'disconnecting',\n}\nexport { ConnectionState }\n","export type Listener = (...args: any[]) => void\n\nclass SocketEventEmitter<T extends string> {\n protected maxListeners = 50\n\n protected handlers: {\n [event: string]: ((...args: any[]) => void)[]\n } = {}\n\n public addListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n if (typeof listener !== 'function') {\n throw new Error('The given listener is not a function')\n }\n this.handlers[event] = this.handlers[event] || []\n this.handlers[event].push(listener)\n return this\n }\n\n public once = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n if (typeof listener !== 'function') {\n throw new Error('The given listener is not a function')\n }\n this.handlers[event] = this.handlers[event] || []\n const onceWrapper = () => {\n listener()\n this.off(event, onceWrapper)\n }\n this.handlers[event].push(onceWrapper)\n return this\n }\n\n public removeListener = (event: T, listener: (...args: any[]) => void): this => {\n if (this.handlers[event]) {\n this.handlers[event] = this.handlers[event].filter((handler) => handler !== listener)\n }\n return this\n }\n\n public off = (event: T, listener: (...args: any[]) => void): this =>\n this.removeListener(event, listener)\n\n public removeAllListeners = (event?: T): this => {\n if (event) {\n delete this.handlers[event]\n } else {\n this.handlers = {}\n }\n return this\n }\n\n public setMaxListeners = (n: number): this => {\n this.maxListeners = n\n return this\n }\n\n public getMaxListeners = (): number => this.maxListeners\n\n public listeners = (event: T): Listener[] => {\n if (this.handlers[event]) {\n return [...this.handlers[event]]\n }\n return []\n }\n\n public rawListeners = (event: T): Listener[] => [...this.handlers[event]]\n\n public listenerCount = (event: T): number => {\n if (this.handlers[event]) {\n return Object.keys(this.handlers[event]).length\n }\n return 0\n }\n\n public prependListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n this.handlers[event] = this.handlers[event] || []\n this.handlers[event].unshift(listener)\n return this\n }\n\n public prependOnceListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n this.handlers[event] = this.handlers[event] || []\n const onceWrapper = () => {\n listener()\n this.off(event, onceWrapper)\n }\n this.handlers[event].unshift(onceWrapper)\n return this\n }\n\n public eventNames = (): T[] => Object.keys(this.handlers) as T[]\n\n public on = (event: T, listener: (...args: any[]) => void): this =>\n this.addListener(event, listener)\n\n public emit = (event: T, ...args: any[]): boolean => {\n const listeners = this.listeners(event)\n if (listeners.length > 0) {\n listeners.forEach((listener) => {\n if (listener) listener(args)\n })\n return true\n }\n return false\n }\n}\n\nexport { SocketEventEmitter }\n","import debug from 'debug'\nimport WebSocket from 'isomorphic-ws'\nimport { decodePacket, encodePacket } from './util/Converter'\nimport { ConnectionState, OptionalOptions, Options, Packet, PacketType, SocketEvent } from './types'\nimport { ITeckosClient } from './ITeckosClient'\nimport { SocketEventEmitter } from './util/SocketEventEmitter'\n\nconst d = debug('teckos:client')\n\nconst DEFAULT_OPTIONS: Options = {\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 5000,\n reconnectionAttempts: Infinity,\n randomizationFactor: 0.5,\n timeout: 5000,\n debug: false,\n}\n\nclass TeckosClient extends SocketEventEmitter<SocketEvent> implements ITeckosClient {\n protected readonly url: string\n\n protected readonly options: Options\n\n ws: WebSocket | undefined\n\n protected currentReconnectDelay: number\n\n protected currentReconnectionAttempts = 0\n\n protected acks: Map<number, (...args: any[]) => void> = new Map()\n\n protected fnId = 0\n\n protected connectionTimeout: any | undefined\n\n protected reconnectionTimeout: any | undefined\n\n constructor(url: string, options?: OptionalOptions) {\n super()\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n }\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.url = url\n }\n\n protected attachHandler = (): void => {\n if (this.ws) {\n this.ws.onopen = this.handleOpen\n this.ws.onerror = this.handleError\n this.ws.onclose = this.handleClose\n this.ws.onmessage = this.handleMessage\n }\n }\n\n public get webSocket(): WebSocket | undefined {\n return this.ws\n }\n\n public connect = (): void => {\n if (this.options.debug) d(`Connecting to ${this.url}...`)\n\n // This will try to connect immediately\n this.ws = new WebSocket(this.url)\n // Attach handlers\n this.attachHandler()\n // Handle timeout\n this.connectionTimeout = setTimeout(() => {\n if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close()\n }\n }, this.options.timeout)\n }\n\n protected reconnect = (): void => {\n this.listeners('reconnect_attempt').forEach((listener) => listener())\n this.connect()\n }\n\n protected getConnectionState(): ConnectionState {\n if (this.ws) {\n switch (this.ws.readyState) {\n case WebSocket.OPEN:\n return ConnectionState.CONNECTED\n case WebSocket.CONNECTING:\n return ConnectionState.CONNECTING\n case WebSocket.CLOSING:\n return ConnectionState.DISCONNECTING\n default:\n return ConnectionState.DISCONNECTED\n }\n }\n return ConnectionState.DISCONNECTED\n }\n\n public get state(): ConnectionState {\n return this.getConnectionState()\n }\n\n get connected(): boolean {\n return this.getConnectionState() === ConnectionState.CONNECTED\n }\n\n get disconnected(): boolean {\n return this.getConnectionState() === ConnectionState.DISCONNECTED\n }\n\n public emit = (event: SocketEvent, ...args: any[]): boolean => {\n args.unshift(event)\n\n const packet: Packet = {\n type: PacketType.EVENT,\n data: args,\n }\n\n if (typeof args[args.length - 1] === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this.acks.set(this.fnId, args.pop())\n packet.id = this.fnId\n this.fnId += 1\n }\n\n return this.sendPackage(packet)\n }\n\n public send = (...args: any[]): boolean => {\n args.unshift('message')\n return this.sendPackage({\n type: PacketType.EVENT,\n data: args,\n })\n }\n\n public sendPackage = (packet: Packet): boolean => {\n if (this.ws !== undefined && this.ws.readyState === WebSocket.OPEN) {\n const buffer = encodePacket(packet)\n if (this.options.debug) d(`[${this.url}] Send packet: ${JSON.stringify(packet)}`)\n this.ws.send(buffer)\n return true\n }\n return false\n }\n\n protected handleMessage = (msg: WebSocket.MessageEvent): void => {\n const packet =\n typeof msg.data === 'string'\n ? (JSON.parse(msg.data) as Packet)\n : decodePacket(msg.data as ArrayBuffer)\n if (this.options.debug) d(`[${this.url}] Got packet: ${JSON.stringify(packet)}`)\n if (packet.type === PacketType.EVENT) {\n const event = packet.data[0] as SocketEvent\n const args = packet.data.slice(1)\n if (event) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this.listeners(event).forEach((listener) => listener(...args))\n } else {\n throw new Error(\n `[teckos-client@${this.url}] Got invalid event message: ${JSON.stringify(\n msg.data\n )}`\n )\n }\n } else if (packet.type === PacketType.ACK && packet.id !== undefined) {\n // Call assigned function\n const ack = this.acks.get(packet.id)\n if (typeof ack === 'function') {\n ack.apply(this, packet.data)\n this.acks.delete(packet.id)\n }\n } else {\n throw new Error(`[teckos-client@${this.url}] Got invalid message type: ${packet.type}`)\n }\n }\n\n protected handleOpen = (): void => {\n if (this.currentReconnectionAttempts > 0) {\n // Reset reconnection settings to default\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.currentReconnectionAttempts = 0\n\n // Inform listeners\n if (this.options.debug) d(`[${this.url}] Reconnected!`)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n this.listeners('reconnect').forEach((listener) => listener())\n }\n // Inform listeners\n if (this.options.debug) d(`[${this.url}] Connected!`)\n this.listeners('connect').forEach((listener) => listener())\n }\n\n protected handleError = (error: WebSocket.ErrorEvent): void => {\n if (this.handlers && this.handlers.error) {\n if (this.options.debug)\n d(`[${this.url}] Got error from server: ${JSON.stringify(error)}`)\n this.handlers.error.forEach((listener) => listener(error))\n }\n }\n\n protected handleClose = (): void => {\n // Stop connection timeout\n if (this.connectionTimeout) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n clearTimeout(this.connectionTimeout)\n }\n // Stop reconnection timeout\n if (this.reconnectionTimeout) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n clearTimeout(this.reconnectionTimeout)\n }\n\n // Inform listeners\n if (this.currentReconnectionAttempts > 0) {\n if (this.options.debug)\n d(`[${this.url}] Reconnect #${this.currentReconnectionAttempts} failed!`)\n this.listeners('reconnect_error').forEach((listener) => {\n if (listener) listener()\n })\n } else {\n if (this.options.debug) d(`[${this.url}] Disconnected!`)\n this.listeners('disconnect').forEach((listener) => {\n if (listener) listener()\n })\n }\n\n if (this.options.reconnection) {\n // Apply reconnection logic\n this.currentReconnectionAttempts += 1\n\n if (\n this.options.reconnectionAttempts === Infinity ||\n this.currentReconnectionAttempts <= this.options.reconnectionAttempts\n ) {\n const timeout = Math.min(\n this.options.reconnectionDelayMax,\n this.currentReconnectDelay\n )\n // Increase reconnection delay\n this.currentReconnectDelay = Math.round(\n this.currentReconnectDelay +\n this.currentReconnectDelay * this.options.randomizationFactor\n )\n\n if (this.options.debug)\n d(\n `[${this.url}] Try reconnecting (${this.currentReconnectionAttempts}/${this.options.reconnectionAttempts}) in ${timeout}ms to ${this.url}...`\n )\n this.reconnectionTimeout = setTimeout(() => {\n this.reconnect()\n }, timeout)\n } else {\n if (this.options.debug)\n d(\n `[${this.url}] Reconnection maximum of ${this.options.reconnectionAttempts} reached`\n )\n this.listeners('reconnect_failed').forEach((listener) => listener())\n }\n }\n }\n\n public close = (): void => {\n if (this.options.debug) d(`[${this.url}] Closing connection (client-side)`)\n if (this.ws !== undefined) {\n this.ws.onclose = () => {}\n this.ws.close()\n this.listeners('disconnect').forEach((listener) => listener())\n }\n }\n\n public disconnect = (): void => {\n this.close()\n }\n}\n\nexport { TeckosClient }\n","import debug from 'debug'\nimport WebSocket from 'isomorphic-ws'\nimport { TeckosClient } from './TeckosClient'\nimport { OptionalOptions, ConnectionState } from './types'\n\nconst d = debug('teckos:client')\n\nclass TeckosClientWithJWT extends TeckosClient {\n protected readonly token: string\n\n protected readonly initialData: any\n\n protected receivedReady = false\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n constructor(url: string, options: OptionalOptions, token: string, initialData?: any) {\n super(url, options)\n this.token = token\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this.initialData = initialData\n this.on('disconnect', () => {\n this.receivedReady = false\n })\n }\n\n protected getConnectionState(): ConnectionState {\n if (this.ws) {\n switch (this.ws.readyState) {\n case WebSocket.OPEN:\n if (this.receivedReady) {\n return ConnectionState.CONNECTED\n }\n return ConnectionState.CONNECTING\n case WebSocket.CONNECTING:\n return ConnectionState.CONNECTING\n case WebSocket.CLOSING:\n return ConnectionState.DISCONNECTING\n default:\n return ConnectionState.DISCONNECTED\n }\n }\n return ConnectionState.DISCONNECTED\n }\n\n protected handleReadyEvent = (): void => {\n if (this.options.debug) d(`[${this.url}] Connected!`)\n this.receivedReady = true\n if (this.currentReconnectionAttempts > 0) {\n if (this.options.debug) d(`[${this.url}] Reconnected!`)\n this.listeners('reconnect').forEach((listener) => listener())\n // Reset reconnection settings to default\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.currentReconnectionAttempts = 0\n }\n this.listeners('connect').forEach((listener) => listener())\n }\n\n protected handleOpen = (): void => {\n this.receivedReady = false\n this.once('ready', this.handleReadyEvent)\n if (this.options.debug) d('Connection opened, sending token now')\n this.emit('token', {\n token: this.token,\n ...this.initialData,\n })\n }\n}\n\nexport { TeckosClientWithJWT }\n"],"names":["enc","TextEncoder","dec","TextDecoder","encodePacket","packet","encode","JSON","stringify","decodePacket","buffer","parse","decode","toString","PacketType","ConnectionState","SocketEventEmitter","event","listener","Object","keys","handlers","length","maxListeners","Error","push","onceWrapper","off","filter","handler","removeListener","n","unshift","addListener","args","listeners","forEach","d","debug","DEFAULT_OPTIONS","reconnection","reconnectionDelay","reconnectionDelayMax","reconnectionAttempts","Infinity","randomizationFactor","timeout","TeckosClient","url","options","Map","ws","onopen","handleOpen","onerror","handleError","onclose","handleClose","onmessage","handleMessage","WebSocket","attachHandler","connectionTimeout","setTimeout","readyState","CONNECTING","close","connect","type","EVENT","data","acks","set","fnId","pop","id","sendPackage","undefined","OPEN","send","msg","slice","ACK","ack","get","apply","currentReconnectionAttempts","currentReconnectDelay","error","clearTimeout","reconnectionTimeout","Math","min","round","reconnect","getConnectionState","CONNECTED","CLOSING","DISCONNECTING","DISCONNECTED","TeckosClientWithJWT","token","initialData","receivedReady","once","handleReadyEvent","emit","on"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var n=e(require("debug")),t=e(require("isomorphic-ws"));function r(){return(r=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e}).apply(this,arguments)}function o(e,n){e.prototype=Object.create(n.prototype),e.prototype.constructor=e,(Object.setPrototypeOf||function(e,n){return e.__proto__=n,e})(e,n)}var i,c=new TextEncoder,s=new TextDecoder;!function(e){e[e.EVENT=0]="EVENT",e[e.ACK=1]="ACK"}(i||(i={}));var a,u=i;!function(e){e.DISCONNECTED="disconnected",e.CONNECTING="connecting",e.CONNECTED="connected",e.DISCONNECTING="disconnecting"}(a||(a={}));var l=a,d={__proto__:null,ConnectionState:l,PacketType:u},f=function(){var e=this;this.maxListeners=50,this.handlers={},this.addListener=function(n,t){if(Object.keys(e.handlers).length===e.maxListeners)throw new Error("Max listeners reached");if("function"!=typeof t)throw new Error("The given listener is not a function");return e.handlers[n]=e.handlers[n]||[],e.handlers[n].push(t),e},this.once=function(n,t){if(Object.keys(e.handlers).length===e.maxListeners)throw new Error("Max listeners reached");if("function"!=typeof t)throw new Error("The given listener is not a function");return e.handlers[n]=e.handlers[n]||[],e.handlers[n].push((function r(){t(),e.off(n,r)})),e},this.removeListener=function(n,t){return e.handlers[n]&&(e.handlers[n]=e.handlers[n].filter((function(e){return e!==t}))),e},this.off=function(n,t){return e.removeListener(n,t)},this.removeAllListeners=function(n){return n?delete e.handlers[n]:e.handlers={},e},this.setMaxListeners=function(n){return e.maxListeners=n,e},this.getMaxListeners=function(){return e.maxListeners},this.listeners=function(n){return e.handlers[n]?[].concat(e.handlers[n]):[]},this.rawListeners=function(n){return[].concat(e.handlers[n])},this.listenerCount=function(n){return e.handlers[n]?Object.keys(e.handlers[n]).length:0},this.prependListener=function(n,t){if(Object.keys(e.handlers).length===e.maxListeners)throw new Error("Max listeners reached");return e.handlers[n]=e.handlers[n]||[],e.handlers[n].unshift(t),e},this.prependOnceListener=function(n,t){if(Object.keys(e.handlers).length===e.maxListeners)throw new Error("Max listeners reached");return e.handlers[n]=e.handlers[n]||[],e.handlers[n].unshift((function r(){t(),e.off(n,r)})),e},this.eventNames=function(){return Object.keys(e.handlers)},this.on=function(n,t){return e.addListener(n,t)},this.emit=function(n){for(var t=arguments.length,r=new Array(t>1?t-1:0),o=1;o<t;o++)r[o-1]=arguments[o];var i=e.listeners(n);return i.length>0&&(i.forEach((function(e){e&&e(r)})),!0)}},h=n("teckos:client"),p={reconnection:!0,reconnectionDelay:1e3,reconnectionDelayMax:5e3,reconnectionAttempts:Infinity,randomizationFactor:.5,timeout:5e3,debug:!1},y=function(e){function n(n,o){var i;return(i=e.call(this)||this).currentReconnectionAttempts=0,i.acks=new Map,i.fnId=0,i.attachHandler=function(){i.ws&&(i.ws.onopen=i.handleOpen,i.ws.onerror=i.handleError,i.ws.onclose=i.handleClose,i.ws.onmessage=i.handleMessage)},i.connect=function(){i.options.debug&&h("Connecting to "+i.url+"..."),i.ws=new t(i.url),i.attachHandler(),i.connectionTimeout=setTimeout((function(){i.ws&&i.ws.readyState===t.CONNECTING&&i.ws.close()}),i.options.timeout)},i.reconnect=function(){i.listeners("reconnect_attempt").forEach((function(e){return e()})),i.connect()},i.emit=function(e){for(var n=arguments.length,t=new Array(n>1?n-1:0),r=1;r<n;r++)t[r-1]=arguments[r];t.unshift(e);var o={type:u.EVENT,data:t};return"function"==typeof t[t.length-1]&&(i.acks.set(i.fnId,t.pop()),o.id=i.fnId,i.fnId+=1),i.sendPackage(o)},i.send=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return n.unshift("message"),i.sendPackage({type:u.EVENT,data:n})},i.sendPackage=function(e){if(void 0!==i.ws&&i.ws.readyState===t.OPEN){var n=function(e){return c.encode(JSON.stringify(e))}(e);return i.options.debug&&h("["+i.url+"] Send packet: "+JSON.stringify(e)),i.ws.send(n),!0}return!1},i.handleMessage=function(e){var n="string"==typeof e.data?JSON.parse(e.data):JSON.parse(s.decode(e.data).toString());if(i.options.debug&&h("["+i.url+"] Got packet: "+JSON.stringify(n)),n.type===u.EVENT){var t=n.data[0],r=n.data.slice(1);if(!t)throw new Error("[teckos-client@"+i.url+"] Got invalid event message: "+e.data);i.listeners(t).forEach((function(e){return e.apply(void 0,r)}))}else{if(n.type!==u.ACK||void 0===n.id)throw new Error("[teckos-client@"+i.url+"] Got invalid message type: "+n.type);var o=i.acks.get(n.id);"function"==typeof o&&(o.apply(function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(i),n.data),i.acks.delete(n.id))}},i.handleOpen=function(){i.currentReconnectionAttempts>0&&(i.currentReconnectDelay=i.options.reconnectionDelay,i.currentReconnectionAttempts=0,i.options.debug&&h("["+i.url+"] Reconnected!"),i.listeners("reconnect").forEach((function(e){return e()}))),i.options.debug&&h("["+i.url+"] Connected!"),i.listeners("connect").forEach((function(e){return e()}))},i.handleError=function(e){i.handlers&&i.handlers.error&&(i.options.debug&&h("["+i.url+"] Got error from server: "+e),i.handlers.error.forEach((function(n){return n(e)})))},i.handleClose=function(){if(i.connectionTimeout&&clearTimeout(i.connectionTimeout),i.reconnectionTimeout&&clearTimeout(i.reconnectionTimeout),i.currentReconnectionAttempts>0?(i.options.debug&&h("["+i.url+"] Reconnect #"+i.currentReconnectionAttempts+" failed!"),i.listeners("reconnect_error").forEach((function(e){e&&e()}))):(i.options.debug&&h("["+i.url+"] Disconnected!"),i.listeners("disconnect").forEach((function(e){e&&e()}))),i.options.reconnection)if(i.currentReconnectionAttempts+=1,Infinity===i.options.reconnectionAttempts||i.currentReconnectionAttempts<=i.options.reconnectionAttempts){var e=Math.min(i.options.reconnectionDelayMax,i.currentReconnectDelay);i.currentReconnectDelay=Math.round(i.currentReconnectDelay+i.currentReconnectDelay*i.options.randomizationFactor),i.options.debug&&h("["+i.url+"] Try reconnecting ("+i.currentReconnectionAttempts+"/"+i.options.reconnectionAttempts+") in "+e+"ms to "+i.url+"..."),i.reconnectionTimeout=setTimeout((function(){i.reconnect()}),e)}else i.options.debug&&h("["+i.url+"] Reconnection maximum of "+i.options.reconnectionAttempts+" reached"),i.listeners("reconnect_failed").forEach((function(e){return e()}))},i.close=function(){i.options.debug&&h("["+i.url+"] Closing connection (client-side)"),void 0!==i.ws&&(i.ws.onclose=function(){},i.ws.close())},i.disconnect=function(){i.close()},i.options=r({},p,o),i.currentReconnectDelay=i.options.reconnectionDelay,i.url=n,i}var i;return o(n,e),n.prototype.getConnectionState=function(){if(this.ws)switch(this.ws.readyState){case t.OPEN:return l.CONNECTED;case t.CONNECTING:return l.CONNECTING;case t.CLOSING:return l.DISCONNECTING;default:return l.DISCONNECTED}return l.DISCONNECTED},(i=[{key:"webSocket",get:function(){return this.ws}},{key:"state",get:function(){return this.getConnectionState()}},{key:"connected",get:function(){return this.getConnectionState()===l.CONNECTED}},{key:"disconnected",get:function(){return this.getConnectionState()===l.DISCONNECTED}}])&&function(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,i),n}(f),E=n("teckos:client"),N=function(e){function n(n,t,o,i){var c;return(c=e.call(this,n,t)||this).receivedReady=!1,c.handleReadyEvent=function(){c.options.debug&&E("["+c.url+"] Connected!"),c.receivedReady=!1,c.currentReconnectionAttempts>0&&(c.options.debug&&E("["+c.url+"] Reconnected!"),c.listeners("reconnect").forEach((function(e){return e()})),c.currentReconnectDelay=c.options.reconnectionDelay,c.currentReconnectionAttempts=0),c.listeners("connect").forEach((function(e){return e()}))},c.handleOpen=function(){c.receivedReady=!1,c.once("ready",c.handleReadyEvent),c.options.debug&&E("Connection opened, sending token now"),c.emit("token",r({token:c.token},c.initialData))},c.token=o,c.initialData=i,c}return o(n,e),n.prototype.getConnectionState=function(){if(this.ws)switch(this.ws.readyState){case t.OPEN:return this.receivedReady?l.CONNECTED:l.CONNECTING;case t.CONNECTING:return l.CONNECTING;case t.CLOSING:return l.DISCONNECTING;default:return l.DISCONNECTED}return l.DISCONNECTED},n}(y);exports.TeckosClient=y,exports.TeckosClientWithJWT=N,exports.types=d;
1
+ "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var n=e(require("debug")),t=e(require("isomorphic-ws"));function r(){return(r=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e}).apply(this,arguments)}function o(e,n){e.prototype=Object.create(n.prototype),e.prototype.constructor=e,(Object.setPrototypeOf||function(e,n){return e.__proto__=n,e})(e,n)}var i,c,s=new TextEncoder,a=new TextDecoder;(i=exports.PacketType||(exports.PacketType={}))[i.EVENT=0]="EVENT",i[i.ACK=1]="ACK",(c=exports.ConnectionState||(exports.ConnectionState={})).DISCONNECTED="disconnected",c.CONNECTING="connecting",c.CONNECTED="connected",c.DISCONNECTING="disconnecting";var u=function(){var e=this;this.maxListeners=50,this.handlers={},this.addListener=function(n,t){if(Object.keys(e.handlers).length===e.maxListeners)throw new Error("Max listeners reached");if("function"!=typeof t)throw new Error("The given listener is not a function");return e.handlers[n]=e.handlers[n]||[],e.handlers[n].push(t),e},this.once=function(n,t){if(Object.keys(e.handlers).length===e.maxListeners)throw new Error("Max listeners reached");if("function"!=typeof t)throw new Error("The given listener is not a function");return e.handlers[n]=e.handlers[n]||[],e.handlers[n].push((function r(){t(),e.off(n,r)})),e},this.removeListener=function(n,t){return e.handlers[n]&&(e.handlers[n]=e.handlers[n].filter((function(e){return e!==t}))),e},this.off=function(n,t){return e.removeListener(n,t)},this.removeAllListeners=function(n){return n?delete e.handlers[n]:e.handlers={},e},this.setMaxListeners=function(n){return e.maxListeners=n,e},this.getMaxListeners=function(){return e.maxListeners},this.listeners=function(n){return e.handlers[n]?[].concat(e.handlers[n]):[]},this.rawListeners=function(n){return[].concat(e.handlers[n])},this.listenerCount=function(n){return e.handlers[n]?Object.keys(e.handlers[n]).length:0},this.prependListener=function(n,t){if(Object.keys(e.handlers).length===e.maxListeners)throw new Error("Max listeners reached");return e.handlers[n]=e.handlers[n]||[],e.handlers[n].unshift(t),e},this.prependOnceListener=function(n,t){if(Object.keys(e.handlers).length===e.maxListeners)throw new Error("Max listeners reached");return e.handlers[n]=e.handlers[n]||[],e.handlers[n].unshift((function r(){t(),e.off(n,r)})),e},this.eventNames=function(){return Object.keys(e.handlers)},this.on=function(n,t){return e.addListener(n,t)},this.emit=function(n){for(var t=arguments.length,r=new Array(t>1?t-1:0),o=1;o<t;o++)r[o-1]=arguments[o];var i=e.listeners(n);return i.length>0&&(i.forEach((function(e){e&&e(r)})),!0)}},l=n("teckos:client"),d={reconnection:!0,reconnectionDelay:1e3,reconnectionDelayMax:5e3,reconnectionAttempts:Infinity,randomizationFactor:.5,timeout:5e3,debug:!1},f=function(e){function n(n,o){var i;return(i=e.call(this)||this).currentReconnectionAttempts=0,i.acks=new Map,i.fnId=0,i.attachHandler=function(){i.ws&&(i.ws.onopen=i.handleOpen,i.ws.onerror=i.handleError,i.ws.onclose=i.handleClose,i.ws.onmessage=i.handleMessage)},i.connect=function(){i.options.debug&&l("Connecting to "+i.url+"..."),i.ws=new t(i.url),i.attachHandler(),i.connectionTimeout=setTimeout((function(){i.ws&&i.ws.readyState===t.CONNECTING&&i.ws.close()}),i.options.timeout)},i.reconnect=function(){i.listeners("reconnect_attempt").forEach((function(e){return e()})),i.connect()},i.emit=function(e){for(var n=arguments.length,t=new Array(n>1?n-1:0),r=1;r<n;r++)t[r-1]=arguments[r];t.unshift(e);var o={type:exports.PacketType.EVENT,data:t};return"function"==typeof t[t.length-1]&&(i.acks.set(i.fnId,t.pop()),o.id=i.fnId,i.fnId+=1),i.sendPackage(o)},i.send=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return n.unshift("message"),i.sendPackage({type:exports.PacketType.EVENT,data:n})},i.sendPackage=function(e){if(void 0!==i.ws&&i.ws.readyState===t.OPEN){var n=function(e){return s.encode(JSON.stringify(e))}(e);return i.options.debug&&l("["+i.url+"] Send packet: "+JSON.stringify(e)),i.ws.send(n),!0}return!1},i.handleMessage=function(e){var n="string"==typeof e.data?JSON.parse(e.data):JSON.parse(a.decode(e.data).toString());if(i.options.debug&&l("["+i.url+"] Got packet: "+JSON.stringify(n)),n.type===exports.PacketType.EVENT){var t=n.data[0],r=n.data.slice(1);if(!t)throw new Error("[teckos-client@"+i.url+"] Got invalid event message: "+JSON.stringify(e.data));i.listeners(t).forEach((function(e){return e.apply(void 0,r)}))}else{if(n.type!==exports.PacketType.ACK||void 0===n.id)throw new Error("[teckos-client@"+i.url+"] Got invalid message type: "+n.type);var o=i.acks.get(n.id);"function"==typeof o&&(o.apply(function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(i),n.data),i.acks.delete(n.id))}},i.handleOpen=function(){i.currentReconnectionAttempts>0&&(i.currentReconnectDelay=i.options.reconnectionDelay,i.currentReconnectionAttempts=0,i.options.debug&&l("["+i.url+"] Reconnected!"),i.listeners("reconnect").forEach((function(e){return e()}))),i.options.debug&&l("["+i.url+"] Connected!"),i.listeners("connect").forEach((function(e){return e()}))},i.handleError=function(e){i.handlers&&i.handlers.error&&(i.options.debug&&l("["+i.url+"] Got error from server: "+JSON.stringify(e)),i.handlers.error.forEach((function(n){return n(e)})))},i.handleClose=function(){if(i.connectionTimeout&&clearTimeout(i.connectionTimeout),i.reconnectionTimeout&&clearTimeout(i.reconnectionTimeout),i.currentReconnectionAttempts>0?(i.options.debug&&l("["+i.url+"] Reconnect #"+i.currentReconnectionAttempts+" failed!"),i.listeners("reconnect_error").forEach((function(e){e&&e()}))):(i.options.debug&&l("["+i.url+"] Disconnected!"),i.listeners("disconnect").forEach((function(e){e&&e()}))),i.options.reconnection)if(i.currentReconnectionAttempts+=1,Infinity===i.options.reconnectionAttempts||i.currentReconnectionAttempts<=i.options.reconnectionAttempts){var e=Math.min(i.options.reconnectionDelayMax,i.currentReconnectDelay);i.currentReconnectDelay=Math.round(i.currentReconnectDelay+i.currentReconnectDelay*i.options.randomizationFactor),i.options.debug&&l("["+i.url+"] Try reconnecting ("+i.currentReconnectionAttempts+"/"+i.options.reconnectionAttempts+") in "+e+"ms to "+i.url+"..."),i.reconnectionTimeout=setTimeout((function(){i.reconnect()}),e)}else i.options.debug&&l("["+i.url+"] Reconnection maximum of "+i.options.reconnectionAttempts+" reached"),i.listeners("reconnect_failed").forEach((function(e){return e()}))},i.close=function(){i.options.debug&&l("["+i.url+"] Closing connection (client-side)"),void 0!==i.ws&&(i.ws.onclose=function(){},i.ws.close(),i.listeners("disconnect").forEach((function(e){return e()})))},i.disconnect=function(){i.close()},i.options=r({},d,o),i.currentReconnectDelay=i.options.reconnectionDelay,i.url=n,i}var i;return o(n,e),n.prototype.getConnectionState=function(){if(this.ws)switch(this.ws.readyState){case t.OPEN:return exports.ConnectionState.CONNECTED;case t.CONNECTING:return exports.ConnectionState.CONNECTING;case t.CLOSING:return exports.ConnectionState.DISCONNECTING;default:return exports.ConnectionState.DISCONNECTED}return exports.ConnectionState.DISCONNECTED},(i=[{key:"webSocket",get:function(){return this.ws}},{key:"state",get:function(){return this.getConnectionState()}},{key:"connected",get:function(){return this.getConnectionState()===exports.ConnectionState.CONNECTED}},{key:"disconnected",get:function(){return this.getConnectionState()===exports.ConnectionState.DISCONNECTED}}])&&function(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,i),n}(u),h=n("teckos:client"),p=function(e){function n(n,t,o,i){var c;return(c=e.call(this,n,t)||this).receivedReady=!1,c.handleReadyEvent=function(){c.options.debug&&h("["+c.url+"] Connected!"),c.receivedReady=!0,c.currentReconnectionAttempts>0&&(c.options.debug&&h("["+c.url+"] Reconnected!"),c.listeners("reconnect").forEach((function(e){return e()})),c.currentReconnectDelay=c.options.reconnectionDelay,c.currentReconnectionAttempts=0),c.listeners("connect").forEach((function(e){return e()}))},c.handleOpen=function(){c.receivedReady=!1,c.once("ready",c.handleReadyEvent),c.options.debug&&h("Connection opened, sending token now"),c.emit("token",r({token:c.token},c.initialData))},c.token=o,c.initialData=i,c.on("disconnect",(function(){c.receivedReady=!1})),c}return o(n,e),n.prototype.getConnectionState=function(){if(this.ws)switch(this.ws.readyState){case t.OPEN:return this.receivedReady?exports.ConnectionState.CONNECTED:exports.ConnectionState.CONNECTING;case t.CONNECTING:return exports.ConnectionState.CONNECTING;case t.CLOSING:return exports.ConnectionState.DISCONNECTING;default:return exports.ConnectionState.DISCONNECTED}return exports.ConnectionState.DISCONNECTED},n}(f);exports.TeckosClient=f,exports.TeckosClientWithJWT=p;
2
2
  //# sourceMappingURL=teckos-client.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"teckos-client.cjs.production.min.js","sources":["../src/util/Converter.ts","../src/types/PacketType.ts","../src/types/ConnectionState.ts","../src/util/SocketEventEmitter.ts","../src/TeckosClient.ts","../src/TeckosClientWithJWT.ts"],"sourcesContent":["import { Packet } from '../types'\n\nconst enc = new TextEncoder()\nconst dec = new TextDecoder()\n\nconst encodePacket = (packet: Packet): ArrayBufferLike => enc.encode(JSON.stringify(packet))\nconst decodePacket = (buffer: ArrayBuffer): Packet => JSON.parse(dec.decode(buffer).toString())\nexport { encodePacket, decodePacket }\n","enum PacketType {\n EVENT,\n ACK,\n}\nexport default PacketType\n","enum ConnectionState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n DISCONNECTING = 'disconnecting',\n}\nexport default ConnectionState\n","class SocketEventEmitter<T extends string> {\n protected maxListeners: number = 50\n\n protected handlers: {\n [event: string]: ((...args: any[]) => void)[]\n } = {}\n\n public addListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n if (typeof listener !== 'function') {\n throw new Error('The given listener is not a function')\n }\n this.handlers[event] = this.handlers[event] || []\n this.handlers[event].push(listener)\n return this\n }\n\n public once = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n if (typeof listener !== 'function') {\n throw new Error('The given listener is not a function')\n }\n this.handlers[event] = this.handlers[event] || []\n const onceWrapper = () => {\n listener()\n this.off(event, onceWrapper)\n }\n this.handlers[event].push(onceWrapper)\n return this\n }\n\n public removeListener = (event: T, listener: (...args: any[]) => void): this => {\n if (this.handlers[event]) {\n this.handlers[event] = this.handlers[event].filter((handler) => handler !== listener)\n }\n return this\n }\n\n public off = (event: T, listener: (...args: any[]) => void): this =>\n this.removeListener(event, listener)\n\n public removeAllListeners = (event?: T): this => {\n if (event) {\n delete this.handlers[event]\n } else {\n this.handlers = {}\n }\n return this\n }\n\n public setMaxListeners = (n: number): this => {\n this.maxListeners = n\n return this\n }\n\n public getMaxListeners = (): number => this.maxListeners\n\n public listeners = (event: T): Function[] => {\n if (this.handlers[event]) {\n return [...this.handlers[event]]\n }\n return []\n }\n\n public rawListeners = (event: T): Function[] => [...this.handlers[event]]\n\n public listenerCount = (event: T): number => {\n if (this.handlers[event]) {\n return Object.keys(this.handlers[event]).length\n }\n return 0\n }\n\n public prependListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n this.handlers[event] = this.handlers[event] || []\n this.handlers[event].unshift(listener)\n return this\n }\n\n public prependOnceListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n this.handlers[event] = this.handlers[event] || []\n const onceWrapper = () => {\n listener()\n this.off(event, onceWrapper)\n }\n this.handlers[event].unshift(onceWrapper)\n return this\n }\n\n public eventNames = (): T[] => Object.keys(this.handlers) as T[]\n\n public on = (event: T, listener: (...args: any[]) => void): this =>\n this.addListener(event, listener)\n\n public emit = (event: T, ...args: any[]): boolean => {\n const listeners = this.listeners(event)\n if (listeners.length > 0) {\n listeners.forEach((listener) => {\n if (listener) listener(args)\n })\n return true\n }\n return false\n }\n}\n\nexport default SocketEventEmitter\n","import debug from 'debug'\nimport WebSocket from 'isomorphic-ws'\nimport { decodePacket, encodePacket } from './util/Converter'\nimport { ConnectionState, OptionalOptions, Options, Packet, PacketType, SocketEvent } from './types'\nimport ITeckosClient from './ITeckosClient'\nimport SocketEventEmitter from './util/SocketEventEmitter'\n\nconst d = debug('teckos:client')\n\nconst DEFAULT_OPTIONS: Options = {\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 5000,\n reconnectionAttempts: Infinity,\n randomizationFactor: 0.5,\n timeout: 5000,\n debug: false,\n}\n\nclass TeckosClient extends SocketEventEmitter<SocketEvent> implements ITeckosClient {\n protected readonly url: string\n\n protected readonly options: Options\n\n ws: WebSocket | undefined\n\n protected currentReconnectDelay: number\n\n protected currentReconnectionAttempts: number = 0\n\n protected acks: Map<number, (...args: any[]) => void> = new Map()\n\n protected fnId: number = 0\n\n protected connectionTimeout: any | undefined\n\n protected reconnectionTimeout: any | undefined\n\n constructor(url: string, options?: OptionalOptions) {\n super()\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n }\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.url = url\n }\n\n protected attachHandler = () => {\n if (this.ws) {\n this.ws.onopen = this.handleOpen\n this.ws.onerror = this.handleError\n this.ws.onclose = this.handleClose\n this.ws.onmessage = this.handleMessage\n }\n }\n\n public get webSocket() {\n return this.ws\n }\n\n public connect = () => {\n if (this.options.debug) d(`Connecting to ${this.url}...`)\n\n // This will try to connect immediately\n this.ws = new WebSocket(this.url)\n // Attach handlers\n this.attachHandler()\n // Handle timeout\n this.connectionTimeout = setTimeout(() => {\n if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close()\n }\n }, this.options.timeout)\n }\n\n protected reconnect = () => {\n this.listeners('reconnect_attempt').forEach((listener) => listener())\n this.connect()\n }\n\n protected getConnectionState(): ConnectionState {\n if (this.ws) {\n switch (this.ws.readyState) {\n case WebSocket.OPEN:\n return ConnectionState.CONNECTED\n case WebSocket.CONNECTING:\n return ConnectionState.CONNECTING\n case WebSocket.CLOSING:\n return ConnectionState.DISCONNECTING\n default:\n return ConnectionState.DISCONNECTED\n }\n }\n return ConnectionState.DISCONNECTED\n }\n\n public get state(): ConnectionState {\n return this.getConnectionState()\n }\n\n get connected(): boolean {\n return this.getConnectionState() === ConnectionState.CONNECTED\n }\n\n get disconnected(): boolean {\n return this.getConnectionState() === ConnectionState.DISCONNECTED\n }\n\n public emit = (event: SocketEvent, ...args: any[]): boolean => {\n args.unshift(event)\n\n const packet: Packet = {\n type: PacketType.EVENT,\n data: args,\n }\n\n if (typeof args[args.length - 1] === 'function') {\n this.acks.set(this.fnId, args.pop())\n packet.id = this.fnId\n this.fnId += 1\n }\n\n return this.sendPackage(packet)\n }\n\n public send = (...args: any[]): boolean => {\n args.unshift('message')\n return this.sendPackage({\n type: PacketType.EVENT,\n data: args,\n })\n }\n\n public sendPackage = (packet: Packet): boolean => {\n if (this.ws !== undefined && this.ws.readyState === WebSocket.OPEN) {\n const buffer = encodePacket(packet)\n if (this.options.debug) d(`[${this.url}] Send packet: ${JSON.stringify(packet)}`)\n this.ws.send(buffer)\n return true\n }\n return false\n }\n\n protected handleMessage = (msg: WebSocket.MessageEvent) => {\n const packet =\n typeof msg.data === 'string'\n ? JSON.parse(msg.data)\n : decodePacket(msg.data as ArrayBuffer)\n if (this.options.debug) d(`[${this.url}] Got packet: ${JSON.stringify(packet)}`)\n if (packet.type === PacketType.EVENT) {\n const event = packet.data[0]\n const args = packet.data.slice(1)\n if (event) {\n this.listeners(event).forEach((listener) => listener(...args))\n } else {\n throw new Error(\n `[teckos-client@${this.url}] Got invalid event message: ${msg.data}`\n )\n }\n } else if (packet.type === PacketType.ACK && packet.id !== undefined) {\n // Call assigned function\n const ack = this.acks.get(packet.id)\n if (typeof ack === 'function') {\n ack.apply(this, packet.data)\n this.acks.delete(packet.id)\n }\n } else {\n throw new Error(`[teckos-client@${this.url}] Got invalid message type: ${packet.type}`)\n }\n }\n\n protected handleOpen = () => {\n if (this.currentReconnectionAttempts > 0) {\n // Reset reconnection settings to default\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.currentReconnectionAttempts = 0\n\n // Inform listeners\n if (this.options.debug) d(`[${this.url}] Reconnected!`)\n this.listeners('reconnect').forEach((listener) => listener())\n }\n // Inform listeners\n if (this.options.debug) d(`[${this.url}] Connected!`)\n this.listeners('connect').forEach((listener) => listener())\n }\n\n protected handleError = (error: WebSocket.ErrorEvent) => {\n if (this.handlers && this.handlers.error) {\n if (this.options.debug) d(`[${this.url}] Got error from server: ${error}`)\n this.handlers.error.forEach((listener) => listener(error))\n }\n }\n\n protected handleClose = () => {\n // Stop connection timeout\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout)\n }\n // Stop reconnection timeout\n if (this.reconnectionTimeout) {\n clearTimeout(this.reconnectionTimeout)\n }\n\n // Inform listeners\n if (this.currentReconnectionAttempts > 0) {\n if (this.options.debug)\n d(`[${this.url}] Reconnect #${this.currentReconnectionAttempts} failed!`)\n this.listeners('reconnect_error').forEach((listener) => {\n if (listener) listener()\n })\n } else {\n if (this.options.debug) d(`[${this.url}] Disconnected!`)\n this.listeners('disconnect').forEach((listener) => {\n if (listener) listener()\n })\n }\n\n if (this.options.reconnection) {\n // Apply reconnection logic\n this.currentReconnectionAttempts += 1\n\n if (\n this.options.reconnectionAttempts === Infinity ||\n this.currentReconnectionAttempts <= this.options.reconnectionAttempts\n ) {\n const timeout = Math.min(\n this.options.reconnectionDelayMax,\n this.currentReconnectDelay\n )\n // Increase reconnection delay\n this.currentReconnectDelay = Math.round(\n this.currentReconnectDelay +\n this.currentReconnectDelay * this.options.randomizationFactor\n )\n\n if (this.options.debug)\n d(\n `[${this.url}] Try reconnecting (${this.currentReconnectionAttempts}/${this.options.reconnectionAttempts}) in ${timeout}ms to ${this.url}...`\n )\n this.reconnectionTimeout = setTimeout(() => {\n this.reconnect()\n }, timeout)\n } else {\n if (this.options.debug)\n d(\n `[${this.url}] Reconnection maximum of ${this.options.reconnectionAttempts} reached`\n )\n this.listeners('reconnect_failed').forEach((listener) => listener())\n }\n }\n }\n\n public close = () => {\n if (this.options.debug) d(`[${this.url}] Closing connection (client-side)`)\n if (this.ws !== undefined) {\n this.ws.onclose = () => {}\n this.ws.close()\n }\n }\n\n public disconnect = () => {\n this.close()\n }\n}\n\nexport default TeckosClient\n","import debug from 'debug'\nimport WebSocket from 'isomorphic-ws'\nimport TeckosClient from './TeckosClient'\nimport { OptionalOptions, ConnectionState } from './types'\n\nconst d = debug('teckos:client')\n\nclass TeckosClientWithJWT extends TeckosClient {\n protected readonly token: string\n\n protected readonly initialData: any\n\n protected receivedReady: boolean = false\n\n constructor(url: string, options: OptionalOptions, token: string, initialData?: any) {\n super(url, options)\n this.token = token\n this.initialData = initialData\n }\n\n protected getConnectionState(): ConnectionState {\n if (this.ws) {\n switch (this.ws.readyState) {\n case WebSocket.OPEN:\n if (this.receivedReady) {\n return ConnectionState.CONNECTED\n }\n return ConnectionState.CONNECTING\n case WebSocket.CONNECTING:\n return ConnectionState.CONNECTING\n case WebSocket.CLOSING:\n return ConnectionState.DISCONNECTING\n default:\n return ConnectionState.DISCONNECTED\n }\n }\n return ConnectionState.DISCONNECTED\n }\n\n protected handleReadyEvent = () => {\n if (this.options.debug) d(`[${this.url}] Connected!`)\n this.receivedReady = false\n if (this.currentReconnectionAttempts > 0) {\n if (this.options.debug) d(`[${this.url}] Reconnected!`)\n this.listeners('reconnect').forEach((listener) => listener())\n // Reset reconnection settings to default\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.currentReconnectionAttempts = 0\n }\n this.listeners('connect').forEach((listener) => listener())\n }\n\n protected handleOpen = () => {\n this.receivedReady = false\n this.once('ready', this.handleReadyEvent)\n if (this.options.debug) d('Connection opened, sending token now')\n this.emit('token', {\n token: this.token,\n ...this.initialData,\n })\n }\n}\n\nexport default TeckosClientWithJWT\n"],"names":["PacketType","enc","TextEncoder","dec","TextDecoder","ConnectionState","SocketEventEmitter","event","listener","Object","keys","_this","handlers","length","maxListeners","Error","push","onceWrapper","off","filter","handler","removeListener","n","unshift","addListener","args","listeners","forEach","d","debug","DEFAULT_OPTIONS","reconnection","reconnectionDelay","reconnectionDelayMax","reconnectionAttempts","Infinity","randomizationFactor","timeout","TeckosClient","url","options","Map","ws","onopen","handleOpen","onerror","handleError","onclose","handleClose","onmessage","handleMessage","WebSocket","attachHandler","connectionTimeout","setTimeout","readyState","CONNECTING","close","connect","packet","type","EVENT","data","acks","set","fnId","pop","id","sendPackage","undefined","OPEN","buffer","encode","JSON","stringify","encodePacket","send","msg","parse","decode","toString","slice","ACK","ack","get","apply","currentReconnectionAttempts","currentReconnectDelay","error","clearTimeout","reconnectionTimeout","Math","min","round","reconnect","getConnectionState","this","CONNECTED","CLOSING","DISCONNECTING","DISCONNECTED","TeckosClientWithJWT","token","initialData","receivedReady","once","handleReadyEvent","emit"],"mappings":"siBAEA,ICFKA,EDECC,EAAM,IAAIC,YACVC,EAAM,IAAIC,aCHhB,SAAKJ,GACDA,qBACAA,iBAFJ,CAAKA,IAAAA,OAIL,ICJKK,IDIUL,GCJf,SAAKK,GACDA,8BACAA,0BACAA,wBACAA,gCAJJ,CAAKA,IAAAA,OAML,MAAeA,oDCNTC,EAAN,wCACqC,iBAI7B,oBAEiB,SAACC,EAAUC,MACxBC,OAAOC,KAAKC,EAAKC,UAAUC,SAAWF,EAAKG,mBACrC,IAAIC,MAAM,4BAEI,mBAAbP,QACD,IAAIO,MAAM,+CAEpBJ,EAAKC,SAASL,GAASI,EAAKC,SAASL,IAAU,GAC/CI,EAAKC,SAASL,GAAOS,KAAKR,GACnBG,aAGG,SAACJ,EAAUC,MACjBC,OAAOC,KAAKC,EAAKC,UAAUC,SAAWF,EAAKG,mBACrC,IAAIC,MAAM,4BAEI,mBAAbP,QACD,IAAIO,MAAM,+CAEpBJ,EAAKC,SAASL,GAASI,EAAKC,SAASL,IAAU,GAK/CI,EAAKC,SAASL,GAAOS,MAJD,SAAdC,IACFT,IACAG,EAAKO,IAAIX,EAAOU,MAGbN,uBAGa,SAACJ,EAAUC,UAC3BG,EAAKC,SAASL,KACdI,EAAKC,SAASL,GAASI,EAAKC,SAASL,GAAOY,QAAO,SAACC,UAAYA,IAAYZ,MAEzEG,YAGE,SAACJ,EAAUC,UACpBG,EAAKU,eAAed,EAAOC,4BAEH,SAACD,UACrBA,SACOI,EAAKC,SAASL,GAErBI,EAAKC,SAAW,GAEbD,wBAGc,SAACW,UACtBX,EAAKG,aAAeQ,EACbX,wBAGc,kBAAcA,EAAKG,6BAEzB,SAACP,UACZI,EAAKC,SAASL,aACHI,EAAKC,SAASL,IAEtB,sBAGW,SAACA,mBAA6BI,EAAKC,SAASL,wBAE3C,SAACA,UAChBI,EAAKC,SAASL,GACPE,OAAOC,KAAKC,EAAKC,SAASL,IAAQM,OAEtC,wBAGc,SAACN,EAAUC,MAC5BC,OAAOC,KAAKC,EAAKC,UAAUC,SAAWF,EAAKG,mBACrC,IAAIC,MAAM,gCAEpBJ,EAAKC,SAASL,GAASI,EAAKC,SAASL,IAAU,GAC/CI,EAAKC,SAASL,GAAOgB,QAAQf,GACtBG,4BAGkB,SAACJ,EAAUC,MAChCC,OAAOC,KAAKC,EAAKC,UAAUC,SAAWF,EAAKG,mBACrC,IAAIC,MAAM,gCAEpBJ,EAAKC,SAASL,GAASI,EAAKC,SAASL,IAAU,GAK/CI,EAAKC,SAASL,GAAOgB,SAJD,SAAdN,IACFT,IACAG,EAAKO,IAAIX,EAAOU,MAGbN,mBAGS,kBAAWF,OAAOC,KAAKC,EAAKC,mBAEpC,SAACL,EAAUC,UACnBG,EAAKa,YAAYjB,EAAOC,cAEd,SAACD,8BAAakB,mCAAAA,wBAClBC,EAAYf,EAAKe,UAAUnB,UAC7BmB,EAAUb,OAAS,IACnBa,EAAUC,SAAQ,SAACnB,GACXA,GAAUA,EAASiB,OAEpB,KCvGbG,EAAIC,EAAM,iBAEVC,EAA2B,CAC7BC,cAAc,EACdC,kBAAmB,IACnBC,qBAAsB,IACtBC,qBAAsBC,SACtBC,oBAAqB,GACrBC,QAAS,IACTR,OAAO,GAGLS,yBAmBUC,EAAaC,kEAVuB,SAEQ,IAAIC,WAEnC,kBAgBC,WAClB9B,EAAK+B,OACAA,GAAGC,OAAShC,EAAKiC,aACjBF,GAAGG,QAAUlC,EAAKmC,cAClBJ,GAAGK,QAAUpC,EAAKqC,cAClBN,GAAGO,UAAYtC,EAAKuC,0BAQhB,WACTvC,EAAK6B,QAAQX,OAAOD,mBAAmBjB,EAAK4B,aAG3CG,GAAK,IAAIS,EAAUxC,EAAK4B,OAExBa,kBAEAC,kBAAoBC,YAAW,WAC5B3C,EAAK+B,IAAM/B,EAAK+B,GAAGa,aAAeJ,EAAUK,cACvCd,GAAGe,UAEb9C,EAAK6B,QAAQH,sBAGE,aACbX,UAAU,qBAAqBC,SAAQ,SAACnB,UAAaA,SACrDkD,kBA+BK,SAACnD,8BAAuBkB,mCAAAA,oBAClCA,EAAKF,QAAQhB,OAEPoD,EAAiB,CACnBC,KAAM5D,EAAW6D,MACjBC,KAAMrC,SAG2B,mBAA1BA,EAAKA,EAAKZ,OAAS,OACrBkD,KAAKC,IAAIrD,EAAKsD,KAAMxC,EAAKyC,OAC9BP,EAAOQ,GAAKxD,EAAKsD,OACZA,MAAQ,GAGVtD,EAAKyD,YAAYT,WAGd,sCAAIlC,2BAAAA,yBACdA,EAAKF,QAAQ,WACNZ,EAAKyD,YAAY,CACpBR,KAAM5D,EAAW6D,MACjBC,KAAMrC,mBAIO,SAACkC,WACFU,IAAZ1D,EAAK+B,IAAoB/B,EAAK+B,GAAGa,aAAeJ,EAAUmB,KAAM,KAC1DC,EJnIG,SAACZ,UAAoC1D,EAAIuE,OAAOC,KAAKC,UAAUf,IImIzDgB,CAAahB,UACxBhD,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,sBAAqBkC,KAAKC,UAAUf,MAClEjB,GAAGkC,KAAKL,IACN,SAEJ,mBAGe,SAACM,OACjBlB,EACkB,iBAAbkB,EAAIf,KACLW,KAAKK,MAAMD,EAAIf,MJ7IqBW,KAAKK,MAAM3E,EAAI4E,OI8ItCF,EAAIf,MJ9IiDkB,eI+IxErE,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,qBAAoBkC,KAAKC,UAAUf,IAClEA,EAAOC,OAAS5D,EAAW6D,MAAO,KAC5BtD,EAAQoD,EAAOG,KAAK,GACpBrC,EAAOkC,EAAOG,KAAKmB,MAAM,OAC3B1E,QAGM,IAAIQ,wBACYJ,EAAK4B,oCAAmCsC,EAAIf,QAH7DpC,UAAUnB,GAAOoB,SAAQ,SAACnB,UAAaA,eAAYiB,UAMzD,CAAA,GAAIkC,EAAOC,OAAS5D,EAAWkF,UAAqBb,IAAdV,EAAOQ,SAQ1C,IAAIpD,wBAAwBJ,EAAK4B,mCAAkCoB,EAAOC,UAN1EuB,EAAMxE,EAAKoD,KAAKqB,IAAIzB,EAAOQ,IACd,mBAARgB,IACPA,EAAIE,mIAAY1B,EAAOG,QAClBC,YAAYJ,EAAOQ,oBAOb,WACfxD,EAAK2E,4BAA8B,MAE9BC,sBAAwB5E,EAAK6B,QAAQR,oBACrCsD,4BAA8B,EAG/B3E,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,wBAC9Bb,UAAU,aAAaC,SAAQ,SAACnB,UAAaA,QAGlDG,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,sBAC9Bb,UAAU,WAAWC,SAAQ,SAACnB,UAAaA,sBAG5B,SAACgF,GACjB7E,EAAKC,UAAYD,EAAKC,SAAS4E,QAC3B7E,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,gCAA+BiD,KAC7D5E,SAAS4E,MAAM7D,SAAQ,SAACnB,UAAaA,EAASgF,sBAInC,cAEhB7E,EAAK0C,mBACLoC,aAAa9E,EAAK0C,mBAGlB1C,EAAK+E,qBACLD,aAAa9E,EAAK+E,qBAIlB/E,EAAK2E,4BAA8B,GAC/B3E,EAAK6B,QAAQX,OACbD,MAAMjB,EAAK4B,oBAAmB5B,EAAK2E,0CAClC5D,UAAU,mBAAmBC,SAAQ,SAACnB,GACnCA,GAAUA,SAGdG,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,yBAC9Bb,UAAU,cAAcC,SAAQ,SAACnB,GAC9BA,GAAUA,QAIlBG,EAAK6B,QAAQT,kBAERuD,6BAA+B,EAGMnD,WAAtCxB,EAAK6B,QAAQN,sBACbvB,EAAK2E,6BAA+B3E,EAAK6B,QAAQN,qBACnD,KACQG,EAAUsD,KAAKC,IACjBjF,EAAK6B,QAAQP,qBACbtB,EAAK4E,yBAGJA,sBAAwBI,KAAKE,MAC9BlF,EAAK4E,sBACD5E,EAAK4E,sBAAwB5E,EAAK6B,QAAQJ,qBAG9CzB,EAAK6B,QAAQX,OACbD,MACQjB,EAAK4B,2BAA0B5B,EAAK2E,gCAA+B3E,EAAK6B,QAAQN,6BAA4BG,WAAgB1B,EAAK4B,aAExImD,oBAAsBpC,YAAW,aAC7BwC,cACNzD,QAEC1B,EAAK6B,QAAQX,OACbD,MACQjB,EAAK4B,iCAAgC5B,EAAK6B,QAAQN,mCAEzDR,UAAU,oBAAoBC,SAAQ,SAACnB,UAAaA,gBAKtD,WACPG,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,+CACnB8B,IAAZ1D,EAAK+B,OACAA,GAAGK,QAAU,eACbL,GAAGe,uBAII,aACXA,WA9NAjB,aACEV,EACAU,KAEF+C,sBAAwB5E,EAAK6B,QAAQR,oBACrCO,IAAMA,oCAoCLwD,mBAAA,cACFC,KAAKtD,UACGsD,KAAKtD,GAAGa,iBACPJ,EAAUmB,YACJjE,EAAgB4F,eACtB9C,EAAUK,kBACJnD,EAAgBmD,gBACtBL,EAAU+C,eACJ7F,EAAgB8F,6BAEhB9F,EAAgB+F,oBAG5B/F,EAAgB+F,uCArC3B,kBACWJ,KAAKtD,sBAuChB,kBACWsD,KAAKD,4CAGhB,kBACWC,KAAKD,uBAAyB1F,EAAgB4F,oCAGzD,kBACWD,KAAKD,uBAAyB1F,EAAgB+F,yMAvFlC9F,GCdrBsB,EAAIC,EAAM,iBAEVwE,yBAOU9D,EAAaC,EAA0B8D,EAAeC,8BACxDhE,EAAKC,yBAHoB,qBA2BN,WACrB7B,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,sBAC9BiE,eAAgB,EACjB7F,EAAK2E,4BAA8B,IAC/B3E,EAAK6B,QAAQX,OAAOD,MAAMjB,EAAK4B,wBAC9Bb,UAAU,aAAaC,SAAQ,SAACnB,UAAaA,SAE7C+E,sBAAwB5E,EAAK6B,QAAQR,oBACrCsD,4BAA8B,KAElC5D,UAAU,WAAWC,SAAQ,SAACnB,UAAaA,qBAG7B,aACdgG,eAAgB,IAChBC,KAAK,QAAS9F,EAAK+F,kBACpB/F,EAAK6B,QAAQX,OAAOD,EAAE,0CACrB+E,KAAK,WACNL,MAAO3F,EAAK2F,OACT3F,EAAK4F,iBA1CPD,MAAQA,IACRC,YAAcA,8BAGbR,mBAAA,cACFC,KAAKtD,UACGsD,KAAKtD,GAAGa,iBACPJ,EAAUmB,YACP0B,KAAKQ,cACEnG,EAAgB4F,UAEpB5F,EAAgBmD,gBACtBL,EAAUK,kBACJnD,EAAgBmD,gBACtBL,EAAU+C,eACJ7F,EAAgB8F,6BAEhB9F,EAAgB+F,oBAG5B/F,EAAgB+F,iBA7BG9D"}
1
+ {"version":3,"file":"teckos-client.cjs.production.min.js","sources":["../src/util/Converter.ts","../src/types/PacketType.ts","../src/types/ConnectionState.ts","../src/util/SocketEventEmitter.ts","../src/TeckosClient.ts","../src/TeckosClientWithJWT.ts"],"sourcesContent":["import { Packet } from '../types'\n\nconst enc = new TextEncoder()\nconst dec = new TextDecoder()\n\nconst encodePacket = (packet: Packet): ArrayBufferLike => enc.encode(JSON.stringify(packet))\nconst decodePacket = (buffer: ArrayBuffer): Packet =>\n JSON.parse(dec.decode(buffer).toString()) as Packet\n\nexport { encodePacket, decodePacket }\n","enum PacketType {\n EVENT,\n ACK,\n}\nexport { PacketType }\n","enum ConnectionState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n DISCONNECTING = 'disconnecting',\n}\nexport { ConnectionState }\n","export type Listener = (...args: any[]) => void\n\nclass SocketEventEmitter<T extends string> {\n protected maxListeners = 50\n\n protected handlers: {\n [event: string]: ((...args: any[]) => void)[]\n } = {}\n\n public addListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n if (typeof listener !== 'function') {\n throw new Error('The given listener is not a function')\n }\n this.handlers[event] = this.handlers[event] || []\n this.handlers[event].push(listener)\n return this\n }\n\n public once = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n if (typeof listener !== 'function') {\n throw new Error('The given listener is not a function')\n }\n this.handlers[event] = this.handlers[event] || []\n const onceWrapper = () => {\n listener()\n this.off(event, onceWrapper)\n }\n this.handlers[event].push(onceWrapper)\n return this\n }\n\n public removeListener = (event: T, listener: (...args: any[]) => void): this => {\n if (this.handlers[event]) {\n this.handlers[event] = this.handlers[event].filter((handler) => handler !== listener)\n }\n return this\n }\n\n public off = (event: T, listener: (...args: any[]) => void): this =>\n this.removeListener(event, listener)\n\n public removeAllListeners = (event?: T): this => {\n if (event) {\n delete this.handlers[event]\n } else {\n this.handlers = {}\n }\n return this\n }\n\n public setMaxListeners = (n: number): this => {\n this.maxListeners = n\n return this\n }\n\n public getMaxListeners = (): number => this.maxListeners\n\n public listeners = (event: T): Listener[] => {\n if (this.handlers[event]) {\n return [...this.handlers[event]]\n }\n return []\n }\n\n public rawListeners = (event: T): Listener[] => [...this.handlers[event]]\n\n public listenerCount = (event: T): number => {\n if (this.handlers[event]) {\n return Object.keys(this.handlers[event]).length\n }\n return 0\n }\n\n public prependListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n this.handlers[event] = this.handlers[event] || []\n this.handlers[event].unshift(listener)\n return this\n }\n\n public prependOnceListener = (event: T, listener: (...args: any[]) => void): this => {\n if (Object.keys(this.handlers).length === this.maxListeners) {\n throw new Error('Max listeners reached')\n }\n this.handlers[event] = this.handlers[event] || []\n const onceWrapper = () => {\n listener()\n this.off(event, onceWrapper)\n }\n this.handlers[event].unshift(onceWrapper)\n return this\n }\n\n public eventNames = (): T[] => Object.keys(this.handlers) as T[]\n\n public on = (event: T, listener: (...args: any[]) => void): this =>\n this.addListener(event, listener)\n\n public emit = (event: T, ...args: any[]): boolean => {\n const listeners = this.listeners(event)\n if (listeners.length > 0) {\n listeners.forEach((listener) => {\n if (listener) listener(args)\n })\n return true\n }\n return false\n }\n}\n\nexport { SocketEventEmitter }\n","import debug from 'debug'\nimport WebSocket from 'isomorphic-ws'\nimport { decodePacket, encodePacket } from './util/Converter'\nimport { ConnectionState, OptionalOptions, Options, Packet, PacketType, SocketEvent } from './types'\nimport { ITeckosClient } from './ITeckosClient'\nimport { SocketEventEmitter } from './util/SocketEventEmitter'\n\nconst d = debug('teckos:client')\n\nconst DEFAULT_OPTIONS: Options = {\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 5000,\n reconnectionAttempts: Infinity,\n randomizationFactor: 0.5,\n timeout: 5000,\n debug: false,\n}\n\nclass TeckosClient extends SocketEventEmitter<SocketEvent> implements ITeckosClient {\n protected readonly url: string\n\n protected readonly options: Options\n\n ws: WebSocket | undefined\n\n protected currentReconnectDelay: number\n\n protected currentReconnectionAttempts = 0\n\n protected acks: Map<number, (...args: any[]) => void> = new Map()\n\n protected fnId = 0\n\n protected connectionTimeout: any | undefined\n\n protected reconnectionTimeout: any | undefined\n\n constructor(url: string, options?: OptionalOptions) {\n super()\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n }\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.url = url\n }\n\n protected attachHandler = (): void => {\n if (this.ws) {\n this.ws.onopen = this.handleOpen\n this.ws.onerror = this.handleError\n this.ws.onclose = this.handleClose\n this.ws.onmessage = this.handleMessage\n }\n }\n\n public get webSocket(): WebSocket | undefined {\n return this.ws\n }\n\n public connect = (): void => {\n if (this.options.debug) d(`Connecting to ${this.url}...`)\n\n // This will try to connect immediately\n this.ws = new WebSocket(this.url)\n // Attach handlers\n this.attachHandler()\n // Handle timeout\n this.connectionTimeout = setTimeout(() => {\n if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close()\n }\n }, this.options.timeout)\n }\n\n protected reconnect = (): void => {\n this.listeners('reconnect_attempt').forEach((listener) => listener())\n this.connect()\n }\n\n protected getConnectionState(): ConnectionState {\n if (this.ws) {\n switch (this.ws.readyState) {\n case WebSocket.OPEN:\n return ConnectionState.CONNECTED\n case WebSocket.CONNECTING:\n return ConnectionState.CONNECTING\n case WebSocket.CLOSING:\n return ConnectionState.DISCONNECTING\n default:\n return ConnectionState.DISCONNECTED\n }\n }\n return ConnectionState.DISCONNECTED\n }\n\n public get state(): ConnectionState {\n return this.getConnectionState()\n }\n\n get connected(): boolean {\n return this.getConnectionState() === ConnectionState.CONNECTED\n }\n\n get disconnected(): boolean {\n return this.getConnectionState() === ConnectionState.DISCONNECTED\n }\n\n public emit = (event: SocketEvent, ...args: any[]): boolean => {\n args.unshift(event)\n\n const packet: Packet = {\n type: PacketType.EVENT,\n data: args,\n }\n\n if (typeof args[args.length - 1] === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this.acks.set(this.fnId, args.pop())\n packet.id = this.fnId\n this.fnId += 1\n }\n\n return this.sendPackage(packet)\n }\n\n public send = (...args: any[]): boolean => {\n args.unshift('message')\n return this.sendPackage({\n type: PacketType.EVENT,\n data: args,\n })\n }\n\n public sendPackage = (packet: Packet): boolean => {\n if (this.ws !== undefined && this.ws.readyState === WebSocket.OPEN) {\n const buffer = encodePacket(packet)\n if (this.options.debug) d(`[${this.url}] Send packet: ${JSON.stringify(packet)}`)\n this.ws.send(buffer)\n return true\n }\n return false\n }\n\n protected handleMessage = (msg: WebSocket.MessageEvent): void => {\n const packet =\n typeof msg.data === 'string'\n ? (JSON.parse(msg.data) as Packet)\n : decodePacket(msg.data as ArrayBuffer)\n if (this.options.debug) d(`[${this.url}] Got packet: ${JSON.stringify(packet)}`)\n if (packet.type === PacketType.EVENT) {\n const event = packet.data[0] as SocketEvent\n const args = packet.data.slice(1)\n if (event) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this.listeners(event).forEach((listener) => listener(...args))\n } else {\n throw new Error(\n `[teckos-client@${this.url}] Got invalid event message: ${JSON.stringify(\n msg.data\n )}`\n )\n }\n } else if (packet.type === PacketType.ACK && packet.id !== undefined) {\n // Call assigned function\n const ack = this.acks.get(packet.id)\n if (typeof ack === 'function') {\n ack.apply(this, packet.data)\n this.acks.delete(packet.id)\n }\n } else {\n throw new Error(`[teckos-client@${this.url}] Got invalid message type: ${packet.type}`)\n }\n }\n\n protected handleOpen = (): void => {\n if (this.currentReconnectionAttempts > 0) {\n // Reset reconnection settings to default\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.currentReconnectionAttempts = 0\n\n // Inform listeners\n if (this.options.debug) d(`[${this.url}] Reconnected!`)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n this.listeners('reconnect').forEach((listener) => listener())\n }\n // Inform listeners\n if (this.options.debug) d(`[${this.url}] Connected!`)\n this.listeners('connect').forEach((listener) => listener())\n }\n\n protected handleError = (error: WebSocket.ErrorEvent): void => {\n if (this.handlers && this.handlers.error) {\n if (this.options.debug)\n d(`[${this.url}] Got error from server: ${JSON.stringify(error)}`)\n this.handlers.error.forEach((listener) => listener(error))\n }\n }\n\n protected handleClose = (): void => {\n // Stop connection timeout\n if (this.connectionTimeout) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n clearTimeout(this.connectionTimeout)\n }\n // Stop reconnection timeout\n if (this.reconnectionTimeout) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n clearTimeout(this.reconnectionTimeout)\n }\n\n // Inform listeners\n if (this.currentReconnectionAttempts > 0) {\n if (this.options.debug)\n d(`[${this.url}] Reconnect #${this.currentReconnectionAttempts} failed!`)\n this.listeners('reconnect_error').forEach((listener) => {\n if (listener) listener()\n })\n } else {\n if (this.options.debug) d(`[${this.url}] Disconnected!`)\n this.listeners('disconnect').forEach((listener) => {\n if (listener) listener()\n })\n }\n\n if (this.options.reconnection) {\n // Apply reconnection logic\n this.currentReconnectionAttempts += 1\n\n if (\n this.options.reconnectionAttempts === Infinity ||\n this.currentReconnectionAttempts <= this.options.reconnectionAttempts\n ) {\n const timeout = Math.min(\n this.options.reconnectionDelayMax,\n this.currentReconnectDelay\n )\n // Increase reconnection delay\n this.currentReconnectDelay = Math.round(\n this.currentReconnectDelay +\n this.currentReconnectDelay * this.options.randomizationFactor\n )\n\n if (this.options.debug)\n d(\n `[${this.url}] Try reconnecting (${this.currentReconnectionAttempts}/${this.options.reconnectionAttempts}) in ${timeout}ms to ${this.url}...`\n )\n this.reconnectionTimeout = setTimeout(() => {\n this.reconnect()\n }, timeout)\n } else {\n if (this.options.debug)\n d(\n `[${this.url}] Reconnection maximum of ${this.options.reconnectionAttempts} reached`\n )\n this.listeners('reconnect_failed').forEach((listener) => listener())\n }\n }\n }\n\n public close = (): void => {\n if (this.options.debug) d(`[${this.url}] Closing connection (client-side)`)\n if (this.ws !== undefined) {\n this.ws.onclose = () => {}\n this.ws.close()\n this.listeners('disconnect').forEach((listener) => listener())\n }\n }\n\n public disconnect = (): void => {\n this.close()\n }\n}\n\nexport { TeckosClient }\n","import debug from 'debug'\nimport WebSocket from 'isomorphic-ws'\nimport { TeckosClient } from './TeckosClient'\nimport { OptionalOptions, ConnectionState } from './types'\n\nconst d = debug('teckos:client')\n\nclass TeckosClientWithJWT extends TeckosClient {\n protected readonly token: string\n\n protected readonly initialData: any\n\n protected receivedReady = false\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n constructor(url: string, options: OptionalOptions, token: string, initialData?: any) {\n super(url, options)\n this.token = token\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this.initialData = initialData\n this.on('disconnect', () => {\n this.receivedReady = false\n })\n }\n\n protected getConnectionState(): ConnectionState {\n if (this.ws) {\n switch (this.ws.readyState) {\n case WebSocket.OPEN:\n if (this.receivedReady) {\n return ConnectionState.CONNECTED\n }\n return ConnectionState.CONNECTING\n case WebSocket.CONNECTING:\n return ConnectionState.CONNECTING\n case WebSocket.CLOSING:\n return ConnectionState.DISCONNECTING\n default:\n return ConnectionState.DISCONNECTED\n }\n }\n return ConnectionState.DISCONNECTED\n }\n\n protected handleReadyEvent = (): void => {\n if (this.options.debug) d(`[${this.url}] Connected!`)\n this.receivedReady = true\n if (this.currentReconnectionAttempts > 0) {\n if (this.options.debug) d(`[${this.url}] Reconnected!`)\n this.listeners('reconnect').forEach((listener) => listener())\n // Reset reconnection settings to default\n this.currentReconnectDelay = this.options.reconnectionDelay\n this.currentReconnectionAttempts = 0\n }\n this.listeners('connect').forEach((listener) => listener())\n }\n\n protected handleOpen = (): void => {\n this.receivedReady = false\n this.once('ready', this.handleReadyEvent)\n if (this.options.debug) d('Connection opened, sending token now')\n this.emit('token', {\n token: this.token,\n ...this.initialData,\n })\n }\n}\n\nexport { TeckosClientWithJWT }\n"],"names":["PacketType","ConnectionState","enc","TextEncoder","dec","TextDecoder","SocketEventEmitter","event","listener","Object","keys","_this","handlers","length","maxListeners","Error","push","onceWrapper","off","filter","handler","removeListener","n","unshift","addListener","args","listeners","forEach","d","debug","DEFAULT_OPTIONS","reconnection","reconnectionDelay","reconnectionDelayMax","reconnectionAttempts","Infinity","randomizationFactor","timeout","TeckosClient","url","options","Map","ws","onopen","handleOpen","onerror","handleError","onclose","handleClose","onmessage","handleMessage","WebSocket","attachHandler","connectionTimeout","setTimeout","readyState","CONNECTING","close","connect","packet","type","EVENT","data","acks","set","fnId","pop","id","sendPackage","undefined","OPEN","buffer","encode","JSON","stringify","encodePacket","send","msg","parse","decode","toString","slice","ACK","ack","get","apply","currentReconnectionAttempts","currentReconnectDelay","error","clearTimeout","reconnectionTimeout","Math","min","round","reconnect","getConnectionState","this","CONNECTED","CLOSING","DISCONNECTING","DISCONNECTED","TeckosClientWithJWT","token","initialData","receivedReady","once","handleReadyEvent","emit","on"],"mappings":"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"}