@ipcom/asterisk-ari 0.0.165 → 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.
@@ -121,7 +121,7 @@ var require_delay_base = __commonJS({
121
121
  var jitter_factory_1 = require_jitter_factory();
122
122
  var Delay = (
123
123
  /** @class */
124
- function() {
124
+ (function() {
125
125
  function Delay2(options) {
126
126
  this.options = options;
127
127
  this.attempt = 0;
@@ -162,7 +162,7 @@ var require_delay_base = __commonJS({
162
162
  configurable: true
163
163
  });
164
164
  return Delay2;
165
- }()
165
+ })()
166
166
  );
167
167
  exports2.Delay = Delay;
168
168
  }
@@ -172,7 +172,7 @@ var require_delay_base = __commonJS({
172
172
  var require_skip_first_delay = __commonJS({
173
173
  "node_modules/exponential-backoff/dist/delay/skip-first/skip-first.delay.js"(exports2) {
174
174
  "use strict";
175
- var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {
175
+ var __extends = exports2 && exports2.__extends || /* @__PURE__ */ (function() {
176
176
  var extendStatics = function(d, b) {
177
177
  extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
178
178
  d2.__proto__ = b2;
@@ -188,7 +188,7 @@ var require_skip_first_delay = __commonJS({
188
188
  }
189
189
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
190
190
  };
191
- }();
191
+ })();
192
192
  var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {
193
193
  function adopt(value) {
194
194
  return value instanceof P ? value : new P(function(resolve) {
@@ -289,7 +289,7 @@ var require_skip_first_delay = __commonJS({
289
289
  var delay_base_1 = require_delay_base();
290
290
  var SkipFirstDelay = (
291
291
  /** @class */
292
- function(_super) {
292
+ (function(_super) {
293
293
  __extends(SkipFirstDelay2, _super);
294
294
  function SkipFirstDelay2() {
295
295
  return _super !== null && _super.apply(this, arguments) || this;
@@ -316,7 +316,7 @@ var require_skip_first_delay = __commonJS({
316
316
  configurable: true
317
317
  });
318
318
  return SkipFirstDelay2;
319
- }(delay_base_1.Delay)
319
+ })(delay_base_1.Delay)
320
320
  );
321
321
  exports2.SkipFirstDelay = SkipFirstDelay;
322
322
  }
@@ -326,7 +326,7 @@ var require_skip_first_delay = __commonJS({
326
326
  var require_always_delay = __commonJS({
327
327
  "node_modules/exponential-backoff/dist/delay/always/always.delay.js"(exports2) {
328
328
  "use strict";
329
- var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {
329
+ var __extends = exports2 && exports2.__extends || /* @__PURE__ */ (function() {
330
330
  var extendStatics = function(d, b) {
331
331
  extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
332
332
  d2.__proto__ = b2;
@@ -342,18 +342,18 @@ var require_always_delay = __commonJS({
342
342
  }
343
343
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
344
344
  };
345
- }();
345
+ })();
346
346
  Object.defineProperty(exports2, "__esModule", { value: true });
347
347
  var delay_base_1 = require_delay_base();
348
348
  var AlwaysDelay = (
349
349
  /** @class */
350
- function(_super) {
350
+ (function(_super) {
351
351
  __extends(AlwaysDelay2, _super);
352
352
  function AlwaysDelay2() {
353
353
  return _super !== null && _super.apply(this, arguments) || this;
354
354
  }
355
355
  return AlwaysDelay2;
356
- }(delay_base_1.Delay)
356
+ })(delay_base_1.Delay)
357
357
  );
358
358
  exports2.AlwaysDelay = AlwaysDelay;
359
359
  }
@@ -505,7 +505,7 @@ var require_backoff = __commonJS({
505
505
  exports2.backOff = backOff2;
506
506
  var BackOff = (
507
507
  /** @class */
508
- function() {
508
+ (function() {
509
509
  function BackOff2(request, options) {
510
510
  this.request = request;
511
511
  this.options = options;
@@ -571,14 +571,14 @@ var require_backoff = __commonJS({
571
571
  });
572
572
  };
573
573
  return BackOff2;
574
- }()
574
+ })()
575
575
  );
576
576
  }
577
577
  });
578
578
 
579
579
  // src/index.ts
580
- var src_exports = {};
581
- __export(src_exports, {
580
+ var index_exports = {};
581
+ __export(index_exports, {
582
582
  Applications: () => Applications,
583
583
  AriClient: () => AriClient,
584
584
  Asterisk: () => Asterisk,
@@ -591,7 +591,7 @@ __export(src_exports, {
591
591
  Playbacks: () => Playbacks,
592
592
  Sounds: () => Sounds
593
593
  });
594
- module.exports = __toCommonJS(src_exports);
594
+ module.exports = __toCommonJS(index_exports);
595
595
 
596
596
  // src/ari-client/baseClient.ts
597
597
  var import_axios = __toESM(require("axios"), 1);
@@ -971,8 +971,8 @@ var BridgeInstance = class {
971
971
  this.id = bridgeId || `bridge-${Date.now()}`;
972
972
  }
973
973
  eventEmitter = new import_events.EventEmitter();
974
+ // biome-ignore lint/suspicious/noExplicitAny: Maps original listener → wrapped listener per event
974
975
  listenersMap = /* @__PURE__ */ new Map();
975
- // 🔹 Guarda listeners para remoção posterior
976
976
  bridgeData = null;
977
977
  id;
978
978
  /**
@@ -980,30 +980,18 @@ var BridgeInstance = class {
980
980
  *
981
981
  * @param event - The type of event to listen for.
982
982
  * @param listener - The callback function to be called when the event occurs.
983
- */
984
- /**
985
- * Registers a listener for specific bridge events.
986
- *
987
- * This method allows you to attach an event listener to the bridge instance for a specific event type.
988
- * When the specified event occurs, the provided listener function will be called with the event data.
989
- *
990
- * @template T - The specific type of WebSocketEvent to listen for.
991
- * It receives the event data as its parameter.
992
- * @returns {void}
993
983
  *
994
984
  * @example
995
985
  * bridge.on('BridgeCreated', (event) => {
996
986
  *
997
987
  * });
998
- * @param event
999
- * @param listener
1000
988
  */
1001
989
  on(event, listener) {
1002
990
  if (!event) {
1003
991
  throw new Error("Event type is required");
1004
992
  }
1005
- const existingListeners = this.listenersMap.get(event) || [];
1006
- if (existingListeners.includes(listener)) {
993
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
994
+ if (eventListeners.has(listener)) {
1007
995
  console.warn(
1008
996
  `Listener j\xE1 registrado para evento ${event}, reutilizando.`
1009
997
  );
@@ -1015,10 +1003,8 @@ var BridgeInstance = class {
1015
1003
  }
1016
1004
  };
1017
1005
  this.eventEmitter.on(event, wrappedListener);
1018
- if (!this.listenersMap.has(event)) {
1019
- this.listenersMap.set(event, []);
1020
- }
1021
- this.listenersMap.get(event).push(wrappedListener);
1006
+ eventListeners.set(listener, wrappedListener);
1007
+ this.listenersMap.set(event, eventListeners);
1022
1008
  }
1023
1009
  /**
1024
1010
  * Registers a one-time listener for specific bridge events.
@@ -1030,25 +1016,22 @@ var BridgeInstance = class {
1030
1016
  if (!event) {
1031
1017
  throw new Error("Event type is required");
1032
1018
  }
1033
- const eventKey = `${event}-${this.id}`;
1034
- const existingListeners = this.listenersMap.get(eventKey) || [];
1035
- if (existingListeners.includes(listener)) {
1019
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
1020
+ if (eventListeners.has(listener)) {
1036
1021
  console.warn(
1037
- `One-time listener j\xE1 registrado para evento ${eventKey}, reutilizando.`
1022
+ `One-time listener j\xE1 registrado para evento ${event}, reutilizando.`
1038
1023
  );
1039
1024
  return;
1040
1025
  }
1041
1026
  const wrappedListener = (data) => {
1042
1027
  if ("bridge" in data && data.bridge?.id === this.id) {
1043
1028
  listener(data);
1044
- this.off(event, wrappedListener);
1029
+ this.off(event, listener);
1045
1030
  }
1046
1031
  };
1047
1032
  this.eventEmitter.once(event, wrappedListener);
1048
- if (!this.listenersMap.has(eventKey)) {
1049
- this.listenersMap.set(eventKey, []);
1050
- }
1051
- this.listenersMap.get(eventKey).push(wrappedListener);
1033
+ eventListeners.set(listener, wrappedListener);
1034
+ this.listenersMap.set(event, eventListeners);
1052
1035
  }
1053
1036
  /**
1054
1037
  * Removes event listener(s) from the bridge.
@@ -1061,12 +1044,12 @@ var BridgeInstance = class {
1061
1044
  throw new Error("Event type is required");
1062
1045
  }
1063
1046
  if (listener) {
1064
- this.eventEmitter.off(event, listener);
1065
- const storedListeners = this.listenersMap.get(event) || [];
1066
- this.listenersMap.set(
1067
- event,
1068
- storedListeners.filter((l) => l !== listener)
1069
- );
1047
+ const eventListeners = this.listenersMap.get(event);
1048
+ const wrappedListener = eventListeners?.get(listener);
1049
+ if (wrappedListener) {
1050
+ this.eventEmitter.off(event, wrappedListener);
1051
+ eventListeners.delete(listener);
1052
+ }
1070
1053
  } else {
1071
1054
  this.eventEmitter.removeAllListeners(event);
1072
1055
  this.listenersMap.delete(event);
@@ -1101,11 +1084,8 @@ var BridgeInstance = class {
1101
1084
  removeAllListeners() {
1102
1085
  console.log(`Removing all event listeners for bridge ${this.id}`);
1103
1086
  this.listenersMap.forEach((listeners, event) => {
1104
- listeners.forEach((listener) => {
1105
- this.eventEmitter.off(
1106
- event,
1107
- listener
1108
- );
1087
+ listeners.forEach((wrappedListener) => {
1088
+ this.eventEmitter.off(event, wrappedListener);
1109
1089
  });
1110
1090
  });
1111
1091
  this.listenersMap.clear();
@@ -1746,8 +1726,8 @@ var ChannelInstance = class {
1746
1726
  }
1747
1727
  eventEmitter = new import_events2.EventEmitter();
1748
1728
  channelData = null;
1729
+ // biome-ignore lint/suspicious/noExplicitAny: Maps original listener → wrapped listener per event
1749
1730
  listenersMap = /* @__PURE__ */ new Map();
1750
- // 🔹 Guarda listeners para remoção posterior
1751
1731
  id;
1752
1732
  /**
1753
1733
  * Registers an event listener for specific channel events
@@ -1756,8 +1736,8 @@ var ChannelInstance = class {
1756
1736
  if (!event) {
1757
1737
  throw new Error("Event type is required");
1758
1738
  }
1759
- const existingListeners = this.listenersMap.get(event) || [];
1760
- if (existingListeners.includes(listener)) {
1739
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
1740
+ if (eventListeners.has(listener)) {
1761
1741
  console.warn(
1762
1742
  `Listener j\xE1 registrado para evento ${event}, reutilizando.`
1763
1743
  );
@@ -1769,10 +1749,8 @@ var ChannelInstance = class {
1769
1749
  }
1770
1750
  };
1771
1751
  this.eventEmitter.on(event, wrappedListener);
1772
- if (!this.listenersMap.has(event)) {
1773
- this.listenersMap.set(event, []);
1774
- }
1775
- this.listenersMap.get(event).push(wrappedListener);
1752
+ eventListeners.set(listener, wrappedListener);
1753
+ this.listenersMap.set(event, eventListeners);
1776
1754
  }
1777
1755
  /**
1778
1756
  * Registers a one-time event listener
@@ -1781,25 +1759,22 @@ var ChannelInstance = class {
1781
1759
  if (!event) {
1782
1760
  throw new Error("Event type is required");
1783
1761
  }
1784
- const eventKey = `${event}-${this.id}`;
1785
- const existingListeners = this.listenersMap.get(eventKey) || [];
1786
- if (existingListeners.includes(listener)) {
1762
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
1763
+ if (eventListeners.has(listener)) {
1787
1764
  console.warn(
1788
- `One-time listener j\xE1 registrado para evento ${eventKey}, reutilizando.`
1765
+ `One-time listener j\xE1 registrado para evento ${event}, reutilizando.`
1789
1766
  );
1790
1767
  return;
1791
1768
  }
1792
1769
  const wrappedListener = (data) => {
1793
1770
  if ("channel" in data && data.channel?.id === this.id) {
1794
1771
  listener(data);
1795
- this.off(event, wrappedListener);
1772
+ this.off(event, listener);
1796
1773
  }
1797
1774
  };
1798
1775
  this.eventEmitter.once(event, wrappedListener);
1799
- if (!this.listenersMap.has(eventKey)) {
1800
- this.listenersMap.set(eventKey, []);
1801
- }
1802
- this.listenersMap.get(eventKey).push(wrappedListener);
1776
+ eventListeners.set(listener, wrappedListener);
1777
+ this.listenersMap.set(event, eventListeners);
1803
1778
  }
1804
1779
  /**
1805
1780
  * Removes event listener(s) for a specific WebSocket event type.
@@ -1815,12 +1790,12 @@ var ChannelInstance = class {
1815
1790
  throw new Error("Event type is required");
1816
1791
  }
1817
1792
  if (listener) {
1818
- this.eventEmitter.off(event, listener);
1819
- const storedListeners = this.listenersMap.get(event) || [];
1820
- this.listenersMap.set(
1821
- event,
1822
- storedListeners.filter((l) => l !== listener)
1823
- );
1793
+ const eventListeners = this.listenersMap.get(event);
1794
+ const wrappedListener = eventListeners?.get(listener);
1795
+ if (wrappedListener) {
1796
+ this.eventEmitter.off(event, wrappedListener);
1797
+ eventListeners.delete(listener);
1798
+ }
1824
1799
  } else {
1825
1800
  this.eventEmitter.removeAllListeners(event);
1826
1801
  this.listenersMap.delete(event);
@@ -1856,12 +1831,8 @@ var ChannelInstance = class {
1856
1831
  removeAllListeners() {
1857
1832
  console.log(`Removing all event listeners for channel ${this.id}`);
1858
1833
  this.listenersMap.forEach((listeners, event) => {
1859
- listeners.forEach((listener) => {
1860
- this.eventEmitter.off(
1861
- event,
1862
- // biome-ignore lint/suspicious/noExplicitAny: <explanation>
1863
- listener
1864
- );
1834
+ listeners.forEach((wrappedListener) => {
1835
+ this.eventEmitter.off(event, wrappedListener);
1865
1836
  });
1866
1837
  });
1867
1838
  this.listenersMap.clear();
@@ -2837,8 +2808,8 @@ var PlaybackInstance = class {
2837
2808
  this.id = playbackId;
2838
2809
  }
2839
2810
  eventEmitter = new import_events3.EventEmitter();
2811
+ // biome-ignore lint/suspicious/noExplicitAny: Maps original listener → wrapped listener per event
2840
2812
  listenersMap = /* @__PURE__ */ new Map();
2841
- // 🔹 Guarda listeners para remoção posterior
2842
2813
  playbackData = null;
2843
2814
  id;
2844
2815
  /**
@@ -2851,8 +2822,8 @@ var PlaybackInstance = class {
2851
2822
  if (!event) {
2852
2823
  throw new Error("Event type is required");
2853
2824
  }
2854
- const existingListeners = this.listenersMap.get(event) || [];
2855
- if (existingListeners.includes(listener)) {
2825
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
2826
+ if (eventListeners.has(listener)) {
2856
2827
  console.warn(
2857
2828
  `Listener j\xE1 registrado para evento ${event}, reutilizando.`
2858
2829
  );
@@ -2864,10 +2835,8 @@ var PlaybackInstance = class {
2864
2835
  }
2865
2836
  };
2866
2837
  this.eventEmitter.on(event, wrappedListener);
2867
- if (!this.listenersMap.has(event)) {
2868
- this.listenersMap.set(event, []);
2869
- }
2870
- this.listenersMap.get(event).push(wrappedListener);
2838
+ eventListeners.set(listener, wrappedListener);
2839
+ this.listenersMap.set(event, eventListeners);
2871
2840
  }
2872
2841
  /**
2873
2842
  * Registers a one-time event listener for a specific WebSocket event type.
@@ -2879,25 +2848,22 @@ var PlaybackInstance = class {
2879
2848
  if (!event) {
2880
2849
  throw new Error("Event type is required");
2881
2850
  }
2882
- const eventKey = `${event}-${this.id}`;
2883
- const existingListeners = this.listenersMap.get(eventKey) || [];
2884
- if (existingListeners.includes(listener)) {
2851
+ const eventListeners = this.listenersMap.get(event) ?? /* @__PURE__ */ new Map();
2852
+ if (eventListeners.has(listener)) {
2885
2853
  console.warn(
2886
- `One-time listener j\xE1 registrado para evento ${eventKey}, reutilizando.`
2854
+ `One-time listener j\xE1 registrado para evento ${event}, reutilizando.`
2887
2855
  );
2888
2856
  return;
2889
2857
  }
2890
2858
  const wrappedListener = (data) => {
2891
2859
  if ("playback" in data && data.playback?.id === this.id) {
2892
2860
  listener(data);
2893
- this.off(event, wrappedListener);
2861
+ this.off(event, listener);
2894
2862
  }
2895
2863
  };
2896
2864
  this.eventEmitter.once(event, wrappedListener);
2897
- if (!this.listenersMap.has(eventKey)) {
2898
- this.listenersMap.set(eventKey, []);
2899
- }
2900
- this.listenersMap.get(eventKey).push(wrappedListener);
2865
+ eventListeners.set(listener, wrappedListener);
2866
+ this.listenersMap.set(event, eventListeners);
2901
2867
  }
2902
2868
  /**
2903
2869
  * Removes event listener(s) for a specific WebSocket event type.
@@ -2910,12 +2876,12 @@ var PlaybackInstance = class {
2910
2876
  throw new Error("Event type is required");
2911
2877
  }
2912
2878
  if (listener) {
2913
- this.eventEmitter.off(event, listener);
2914
- const storedListeners = this.listenersMap.get(event) || [];
2915
- this.listenersMap.set(
2916
- event,
2917
- storedListeners.filter((l) => l !== listener)
2918
- );
2879
+ const eventListeners = this.listenersMap.get(event);
2880
+ const wrappedListener = eventListeners?.get(listener);
2881
+ if (wrappedListener) {
2882
+ this.eventEmitter.off(event, wrappedListener);
2883
+ eventListeners.delete(listener);
2884
+ }
2919
2885
  } else {
2920
2886
  this.eventEmitter.removeAllListeners(event);
2921
2887
  this.listenersMap.delete(event);
@@ -3018,11 +2984,8 @@ var PlaybackInstance = class {
3018
2984
  removeAllListeners() {
3019
2985
  console.log(`Removing all event listeners for playback ${this.id}`);
3020
2986
  this.listenersMap.forEach((listeners, event) => {
3021
- listeners.forEach((listener) => {
3022
- this.eventEmitter.off(
3023
- event,
3024
- listener
3025
- );
2987
+ listeners.forEach((wrappedListener) => {
2988
+ this.eventEmitter.off(event, wrappedListener);
3026
2989
  });
3027
2990
  });
3028
2991
  this.listenersMap.clear();
@@ -3561,7 +3524,12 @@ var WebSocketClient = class extends import_events4.EventEmitter {
3561
3524
  */
3562
3525
  handleMessage(rawMessage) {
3563
3526
  try {
3564
- const event = JSON.parse(rawMessage);
3527
+ const parsed = JSON.parse(rawMessage);
3528
+ if (!parsed || typeof parsed !== "object" || !("type" in parsed) || typeof parsed.type !== "string") {
3529
+ console.warn("Received malformed WebSocket message (missing type)");
3530
+ return;
3531
+ }
3532
+ const event = parsed;
3565
3533
  const key = this.getEventKey(event);
3566
3534
  const existing = this.eventQueue.get(key);
3567
3535
  if (existing) {
@@ -3996,14 +3964,7 @@ var AriClient = class {
3996
3964
  /**
3997
3965
  * Registers an event listener for WebSocket events.
3998
3966
  *
3999
- * @param {T} event - The event type to listen for
4000
- * @param {Function} listener - Callback function for handling the event
4001
- * @throws {Error} If WebSocket is not connected
4002
- */
4003
- /**
4004
- * Registers an event listener for WebSocket events.
4005
- *
4006
- * @param {T} event - The event type to listen for
3967
+ * @param {K} event - The event type to listen for
4007
3968
  * @param {Function} listener - Callback function for handling the event
4008
3969
  * @throws {Error} If WebSocket is not connected
4009
3970
  */