@ipcom/asterisk-ari 0.0.164 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -115,7 +115,7 @@ var require_delay_base = __commonJS({
115
115
  var jitter_factory_1 = require_jitter_factory();
116
116
  var Delay = (
117
117
  /** @class */
118
- function() {
118
+ (function() {
119
119
  function Delay2(options) {
120
120
  this.options = options;
121
121
  this.attempt = 0;
@@ -156,7 +156,7 @@ var require_delay_base = __commonJS({
156
156
  configurable: true
157
157
  });
158
158
  return Delay2;
159
- }()
159
+ })()
160
160
  );
161
161
  exports.Delay = Delay;
162
162
  }
@@ -166,7 +166,7 @@ var require_delay_base = __commonJS({
166
166
  var require_skip_first_delay = __commonJS({
167
167
  "node_modules/exponential-backoff/dist/delay/skip-first/skip-first.delay.js"(exports) {
168
168
  "use strict";
169
- var __extends = exports && exports.__extends || /* @__PURE__ */ function() {
169
+ var __extends = exports && exports.__extends || /* @__PURE__ */ (function() {
170
170
  var extendStatics = function(d, b) {
171
171
  extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
172
172
  d2.__proto__ = b2;
@@ -182,7 +182,7 @@ var require_skip_first_delay = __commonJS({
182
182
  }
183
183
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
184
184
  };
185
- }();
185
+ })();
186
186
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) {
187
187
  function adopt(value) {
188
188
  return value instanceof P ? value : new P(function(resolve) {
@@ -283,7 +283,7 @@ var require_skip_first_delay = __commonJS({
283
283
  var delay_base_1 = require_delay_base();
284
284
  var SkipFirstDelay = (
285
285
  /** @class */
286
- function(_super) {
286
+ (function(_super) {
287
287
  __extends(SkipFirstDelay2, _super);
288
288
  function SkipFirstDelay2() {
289
289
  return _super !== null && _super.apply(this, arguments) || this;
@@ -310,7 +310,7 @@ var require_skip_first_delay = __commonJS({
310
310
  configurable: true
311
311
  });
312
312
  return SkipFirstDelay2;
313
- }(delay_base_1.Delay)
313
+ })(delay_base_1.Delay)
314
314
  );
315
315
  exports.SkipFirstDelay = SkipFirstDelay;
316
316
  }
@@ -320,7 +320,7 @@ var require_skip_first_delay = __commonJS({
320
320
  var require_always_delay = __commonJS({
321
321
  "node_modules/exponential-backoff/dist/delay/always/always.delay.js"(exports) {
322
322
  "use strict";
323
- var __extends = exports && exports.__extends || /* @__PURE__ */ function() {
323
+ var __extends = exports && exports.__extends || /* @__PURE__ */ (function() {
324
324
  var extendStatics = function(d, b) {
325
325
  extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
326
326
  d2.__proto__ = b2;
@@ -336,18 +336,18 @@ var require_always_delay = __commonJS({
336
336
  }
337
337
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
338
338
  };
339
- }();
339
+ })();
340
340
  Object.defineProperty(exports, "__esModule", { value: true });
341
341
  var delay_base_1 = require_delay_base();
342
342
  var AlwaysDelay = (
343
343
  /** @class */
344
- function(_super) {
344
+ (function(_super) {
345
345
  __extends(AlwaysDelay2, _super);
346
346
  function AlwaysDelay2() {
347
347
  return _super !== null && _super.apply(this, arguments) || this;
348
348
  }
349
349
  return AlwaysDelay2;
350
- }(delay_base_1.Delay)
350
+ })(delay_base_1.Delay)
351
351
  );
352
352
  exports.AlwaysDelay = AlwaysDelay;
353
353
  }
@@ -499,7 +499,7 @@ var require_backoff = __commonJS({
499
499
  exports.backOff = backOff2;
500
500
  var BackOff = (
501
501
  /** @class */
502
- function() {
502
+ (function() {
503
503
  function BackOff2(request, options) {
504
504
  this.request = request;
505
505
  this.options = options;
@@ -565,7 +565,7 @@ var require_backoff = __commonJS({
565
565
  });
566
566
  };
567
567
  return BackOff2;
568
- }()
568
+ })()
569
569
  );
570
570
  }
571
571
  });
@@ -950,8 +950,8 @@ var BridgeInstance = class {
950
950
  this.id = bridgeId || `bridge-${Date.now()}`;
951
951
  }
952
952
  eventEmitter = new EventEmitter();
953
+ // biome-ignore lint/suspicious/noExplicitAny: Maps original listener → wrapped listener per event
953
954
  listenersMap = /* @__PURE__ */ new Map();
954
- // 🔹 Guarda listeners para remoção posterior
955
955
  bridgeData = null;
956
956
  id;
957
957
  /**
@@ -959,30 +959,18 @@ var BridgeInstance = class {
959
959
  *
960
960
  * @param event - The type of event to listen for.
961
961
  * @param listener - The callback function to be called when the event occurs.
962
- */
963
- /**
964
- * Registers a listener for specific bridge events.
965
- *
966
- * This method allows you to attach an event listener to the bridge instance for a specific event type.
967
- * When the specified event occurs, the provided listener function will be called with the event data.
968
- *
969
- * @template T - The specific type of WebSocketEvent to listen for.
970
- * It receives the event data as its parameter.
971
- * @returns {void}
972
962
  *
973
963
  * @example
974
964
  * bridge.on('BridgeCreated', (event) => {
975
965
  *
976
966
  * });
977
- * @param event
978
- * @param listener
979
967
  */
980
968
  on(event, listener) {
981
969
  if (!event) {
982
970
  throw new Error("Event type is required");
983
971
  }
984
- const existingListeners = this.listenersMap.get(event) || [];
985
- if (existingListeners.includes(listener)) {
972
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
973
+ if (eventListeners.has(listener)) {
986
974
  console.warn(
987
975
  `Listener j\xE1 registrado para evento ${event}, reutilizando.`
988
976
  );
@@ -994,10 +982,8 @@ var BridgeInstance = class {
994
982
  }
995
983
  };
996
984
  this.eventEmitter.on(event, wrappedListener);
997
- if (!this.listenersMap.has(event)) {
998
- this.listenersMap.set(event, []);
999
- }
1000
- this.listenersMap.get(event).push(wrappedListener);
985
+ eventListeners.set(listener, wrappedListener);
986
+ this.listenersMap.set(event, eventListeners);
1001
987
  }
1002
988
  /**
1003
989
  * Registers a one-time listener for specific bridge events.
@@ -1009,25 +995,22 @@ var BridgeInstance = class {
1009
995
  if (!event) {
1010
996
  throw new Error("Event type is required");
1011
997
  }
1012
- const eventKey = `${event}-${this.id}`;
1013
- const existingListeners = this.listenersMap.get(eventKey) || [];
1014
- if (existingListeners.includes(listener)) {
998
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
999
+ if (eventListeners.has(listener)) {
1015
1000
  console.warn(
1016
- `One-time listener j\xE1 registrado para evento ${eventKey}, reutilizando.`
1001
+ `One-time listener j\xE1 registrado para evento ${event}, reutilizando.`
1017
1002
  );
1018
1003
  return;
1019
1004
  }
1020
1005
  const wrappedListener = (data) => {
1021
1006
  if ("bridge" in data && data.bridge?.id === this.id) {
1022
1007
  listener(data);
1023
- this.off(event, wrappedListener);
1008
+ this.off(event, listener);
1024
1009
  }
1025
1010
  };
1026
1011
  this.eventEmitter.once(event, wrappedListener);
1027
- if (!this.listenersMap.has(eventKey)) {
1028
- this.listenersMap.set(eventKey, []);
1029
- }
1030
- this.listenersMap.get(eventKey).push(wrappedListener);
1012
+ eventListeners.set(listener, wrappedListener);
1013
+ this.listenersMap.set(event, eventListeners);
1031
1014
  }
1032
1015
  /**
1033
1016
  * Removes event listener(s) from the bridge.
@@ -1040,12 +1023,12 @@ var BridgeInstance = class {
1040
1023
  throw new Error("Event type is required");
1041
1024
  }
1042
1025
  if (listener) {
1043
- this.eventEmitter.off(event, listener);
1044
- const storedListeners = this.listenersMap.get(event) || [];
1045
- this.listenersMap.set(
1046
- event,
1047
- storedListeners.filter((l) => l !== listener)
1048
- );
1026
+ const eventListeners = this.listenersMap.get(event);
1027
+ const wrappedListener = eventListeners?.get(listener);
1028
+ if (wrappedListener) {
1029
+ this.eventEmitter.off(event, wrappedListener);
1030
+ eventListeners.delete(listener);
1031
+ }
1049
1032
  } else {
1050
1033
  this.eventEmitter.removeAllListeners(event);
1051
1034
  this.listenersMap.delete(event);
@@ -1080,11 +1063,8 @@ var BridgeInstance = class {
1080
1063
  removeAllListeners() {
1081
1064
  console.log(`Removing all event listeners for bridge ${this.id}`);
1082
1065
  this.listenersMap.forEach((listeners, event) => {
1083
- listeners.forEach((listener) => {
1084
- this.eventEmitter.off(
1085
- event,
1086
- listener
1087
- );
1066
+ listeners.forEach((wrappedListener) => {
1067
+ this.eventEmitter.off(event, wrappedListener);
1088
1068
  });
1089
1069
  });
1090
1070
  this.listenersMap.clear();
@@ -1725,8 +1705,8 @@ var ChannelInstance = class {
1725
1705
  }
1726
1706
  eventEmitter = new EventEmitter2();
1727
1707
  channelData = null;
1708
+ // biome-ignore lint/suspicious/noExplicitAny: Maps original listener → wrapped listener per event
1728
1709
  listenersMap = /* @__PURE__ */ new Map();
1729
- // 🔹 Guarda listeners para remoção posterior
1730
1710
  id;
1731
1711
  /**
1732
1712
  * Registers an event listener for specific channel events
@@ -1735,8 +1715,8 @@ var ChannelInstance = class {
1735
1715
  if (!event) {
1736
1716
  throw new Error("Event type is required");
1737
1717
  }
1738
- const existingListeners = this.listenersMap.get(event) || [];
1739
- if (existingListeners.includes(listener)) {
1718
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
1719
+ if (eventListeners.has(listener)) {
1740
1720
  console.warn(
1741
1721
  `Listener j\xE1 registrado para evento ${event}, reutilizando.`
1742
1722
  );
@@ -1748,10 +1728,8 @@ var ChannelInstance = class {
1748
1728
  }
1749
1729
  };
1750
1730
  this.eventEmitter.on(event, wrappedListener);
1751
- if (!this.listenersMap.has(event)) {
1752
- this.listenersMap.set(event, []);
1753
- }
1754
- this.listenersMap.get(event).push(wrappedListener);
1731
+ eventListeners.set(listener, wrappedListener);
1732
+ this.listenersMap.set(event, eventListeners);
1755
1733
  }
1756
1734
  /**
1757
1735
  * Registers a one-time event listener
@@ -1760,25 +1738,22 @@ var ChannelInstance = class {
1760
1738
  if (!event) {
1761
1739
  throw new Error("Event type is required");
1762
1740
  }
1763
- const eventKey = `${event}-${this.id}`;
1764
- const existingListeners = this.listenersMap.get(eventKey) || [];
1765
- if (existingListeners.includes(listener)) {
1741
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
1742
+ if (eventListeners.has(listener)) {
1766
1743
  console.warn(
1767
- `One-time listener j\xE1 registrado para evento ${eventKey}, reutilizando.`
1744
+ `One-time listener j\xE1 registrado para evento ${event}, reutilizando.`
1768
1745
  );
1769
1746
  return;
1770
1747
  }
1771
1748
  const wrappedListener = (data) => {
1772
1749
  if ("channel" in data && data.channel?.id === this.id) {
1773
1750
  listener(data);
1774
- this.off(event, wrappedListener);
1751
+ this.off(event, listener);
1775
1752
  }
1776
1753
  };
1777
1754
  this.eventEmitter.once(event, wrappedListener);
1778
- if (!this.listenersMap.has(eventKey)) {
1779
- this.listenersMap.set(eventKey, []);
1780
- }
1781
- this.listenersMap.get(eventKey).push(wrappedListener);
1755
+ eventListeners.set(listener, wrappedListener);
1756
+ this.listenersMap.set(event, eventListeners);
1782
1757
  }
1783
1758
  /**
1784
1759
  * Removes event listener(s) for a specific WebSocket event type.
@@ -1794,12 +1769,12 @@ var ChannelInstance = class {
1794
1769
  throw new Error("Event type is required");
1795
1770
  }
1796
1771
  if (listener) {
1797
- this.eventEmitter.off(event, listener);
1798
- const storedListeners = this.listenersMap.get(event) || [];
1799
- this.listenersMap.set(
1800
- event,
1801
- storedListeners.filter((l) => l !== listener)
1802
- );
1772
+ const eventListeners = this.listenersMap.get(event);
1773
+ const wrappedListener = eventListeners?.get(listener);
1774
+ if (wrappedListener) {
1775
+ this.eventEmitter.off(event, wrappedListener);
1776
+ eventListeners.delete(listener);
1777
+ }
1803
1778
  } else {
1804
1779
  this.eventEmitter.removeAllListeners(event);
1805
1780
  this.listenersMap.delete(event);
@@ -1835,12 +1810,8 @@ var ChannelInstance = class {
1835
1810
  removeAllListeners() {
1836
1811
  console.log(`Removing all event listeners for channel ${this.id}`);
1837
1812
  this.listenersMap.forEach((listeners, event) => {
1838
- listeners.forEach((listener) => {
1839
- this.eventEmitter.off(
1840
- event,
1841
- // biome-ignore lint/suspicious/noExplicitAny: <explanation>
1842
- listener
1843
- );
1813
+ listeners.forEach((wrappedListener) => {
1814
+ this.eventEmitter.off(event, wrappedListener);
1844
1815
  });
1845
1816
  });
1846
1817
  this.listenersMap.clear();
@@ -2816,8 +2787,8 @@ var PlaybackInstance = class {
2816
2787
  this.id = playbackId;
2817
2788
  }
2818
2789
  eventEmitter = new EventEmitter3();
2790
+ // biome-ignore lint/suspicious/noExplicitAny: Maps original listener → wrapped listener per event
2819
2791
  listenersMap = /* @__PURE__ */ new Map();
2820
- // 🔹 Guarda listeners para remoção posterior
2821
2792
  playbackData = null;
2822
2793
  id;
2823
2794
  /**
@@ -2830,8 +2801,8 @@ var PlaybackInstance = class {
2830
2801
  if (!event) {
2831
2802
  throw new Error("Event type is required");
2832
2803
  }
2833
- const existingListeners = this.listenersMap.get(event) || [];
2834
- if (existingListeners.includes(listener)) {
2804
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
2805
+ if (eventListeners.has(listener)) {
2835
2806
  console.warn(
2836
2807
  `Listener j\xE1 registrado para evento ${event}, reutilizando.`
2837
2808
  );
@@ -2843,10 +2814,8 @@ var PlaybackInstance = class {
2843
2814
  }
2844
2815
  };
2845
2816
  this.eventEmitter.on(event, wrappedListener);
2846
- if (!this.listenersMap.has(event)) {
2847
- this.listenersMap.set(event, []);
2848
- }
2849
- this.listenersMap.get(event).push(wrappedListener);
2817
+ eventListeners.set(listener, wrappedListener);
2818
+ this.listenersMap.set(event, eventListeners);
2850
2819
  }
2851
2820
  /**
2852
2821
  * Registers a one-time event listener for a specific WebSocket event type.
@@ -2858,25 +2827,22 @@ var PlaybackInstance = class {
2858
2827
  if (!event) {
2859
2828
  throw new Error("Event type is required");
2860
2829
  }
2861
- const eventKey = `${event}-${this.id}`;
2862
- const existingListeners = this.listenersMap.get(eventKey) || [];
2863
- if (existingListeners.includes(listener)) {
2830
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
2831
+ if (eventListeners.has(listener)) {
2864
2832
  console.warn(
2865
- `One-time listener j\xE1 registrado para evento ${eventKey}, reutilizando.`
2833
+ `One-time listener j\xE1 registrado para evento ${event}, reutilizando.`
2866
2834
  );
2867
2835
  return;
2868
2836
  }
2869
2837
  const wrappedListener = (data) => {
2870
2838
  if ("playback" in data && data.playback?.id === this.id) {
2871
2839
  listener(data);
2872
- this.off(event, wrappedListener);
2840
+ this.off(event, listener);
2873
2841
  }
2874
2842
  };
2875
2843
  this.eventEmitter.once(event, wrappedListener);
2876
- if (!this.listenersMap.has(eventKey)) {
2877
- this.listenersMap.set(eventKey, []);
2878
- }
2879
- this.listenersMap.get(eventKey).push(wrappedListener);
2844
+ eventListeners.set(listener, wrappedListener);
2845
+ this.listenersMap.set(event, eventListeners);
2880
2846
  }
2881
2847
  /**
2882
2848
  * Removes event listener(s) for a specific WebSocket event type.
@@ -2889,12 +2855,12 @@ var PlaybackInstance = class {
2889
2855
  throw new Error("Event type is required");
2890
2856
  }
2891
2857
  if (listener) {
2892
- this.eventEmitter.off(event, listener);
2893
- const storedListeners = this.listenersMap.get(event) || [];
2894
- this.listenersMap.set(
2895
- event,
2896
- storedListeners.filter((l) => l !== listener)
2897
- );
2858
+ const eventListeners = this.listenersMap.get(event);
2859
+ const wrappedListener = eventListeners?.get(listener);
2860
+ if (wrappedListener) {
2861
+ this.eventEmitter.off(event, wrappedListener);
2862
+ eventListeners.delete(listener);
2863
+ }
2898
2864
  } else {
2899
2865
  this.eventEmitter.removeAllListeners(event);
2900
2866
  this.listenersMap.delete(event);
@@ -2997,11 +2963,8 @@ var PlaybackInstance = class {
2997
2963
  removeAllListeners() {
2998
2964
  console.log(`Removing all event listeners for playback ${this.id}`);
2999
2965
  this.listenersMap.forEach((listeners, event) => {
3000
- listeners.forEach((listener) => {
3001
- this.eventEmitter.off(
3002
- event,
3003
- listener
3004
- );
2966
+ listeners.forEach((wrappedListener) => {
2967
+ this.eventEmitter.off(event, wrappedListener);
3005
2968
  });
3006
2969
  });
3007
2970
  this.listenersMap.clear();
@@ -3540,7 +3503,12 @@ var WebSocketClient = class extends EventEmitter4 {
3540
3503
  */
3541
3504
  handleMessage(rawMessage) {
3542
3505
  try {
3543
- const event = JSON.parse(rawMessage);
3506
+ const parsed = JSON.parse(rawMessage);
3507
+ if (!parsed || typeof parsed !== "object" || !("type" in parsed) || typeof parsed.type !== "string") {
3508
+ console.warn("Received malformed WebSocket message (missing type)");
3509
+ return;
3510
+ }
3511
+ const event = parsed;
3544
3512
  const key = this.getEventKey(event);
3545
3513
  const existing = this.eventQueue.get(key);
3546
3514
  if (existing) {
@@ -3975,14 +3943,7 @@ var AriClient = class {
3975
3943
  /**
3976
3944
  * Registers an event listener for WebSocket events.
3977
3945
  *
3978
- * @param {T} event - The event type to listen for
3979
- * @param {Function} listener - Callback function for handling the event
3980
- * @throws {Error} If WebSocket is not connected
3981
- */
3982
- /**
3983
- * Registers an event listener for WebSocket events.
3984
- *
3985
- * @param {T} event - The event type to listen for
3946
+ * @param {K} event - The event type to listen for
3986
3947
  * @param {Function} listener - Callback function for handling the event
3987
3948
  * @throws {Error} If WebSocket is not connected
3988
3949
  */