@ipcom/asterisk-ari 0.0.95 → 0.0.97

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
@@ -925,9 +925,16 @@ var ChannelInstance = class extends EventEmitter2 {
925
925
  `Nenhum WebSocket conectado dispon\xEDvel para o canal: ${this.id}`
926
926
  );
927
927
  }
928
- wsClient.on("message", (event) => {
928
+ wsClient.addScopedMessageListener(this.id, (event) => {
929
929
  if (isChannelEvent(event, this.id)) {
930
- this.emit(event.type, event);
930
+ const channelEventType = event.type;
931
+ this.emit(channelEventType, event);
932
+ }
933
+ });
934
+ this.on("removeListener", (eventName) => {
935
+ if (this.eventNames().length === 0 || this.listenerCount(eventName) === 0) {
936
+ wsClient.removeScopedMessageListeners(this.id);
937
+ console.log(`Listeners escopados removidos para canal '${this.id}'.`);
931
938
  }
932
939
  });
933
940
  }
@@ -944,6 +951,29 @@ var ChannelInstance = class extends EventEmitter2 {
944
951
  * Adiciona um listener para ser chamado apenas uma vez.
945
952
  */
946
953
  once(event, callback) {
954
+ console.log({
955
+ type: "Adiciona um listener para ser chamado apenas uma vez",
956
+ event
957
+ });
958
+ const wsClients = this.client.getWebSocketClients();
959
+ const wsClient = Array.from(wsClients.values()).find(
960
+ (client) => client.isConnected()
961
+ );
962
+ if (!wsClient) {
963
+ throw new Error(
964
+ `Nenhum WebSocket conectado dispon\xEDvel para '${this.id}'.`
965
+ );
966
+ }
967
+ const globalListener = (webSocketEvent) => {
968
+ if (isChannelEvent(webSocketEvent, this.id) && webSocketEvent.type === event) {
969
+ console.log(`Recebido evento '${event}' para canal '${this.id}'`);
970
+ this.emit(event, webSocketEvent);
971
+ callback(webSocketEvent);
972
+ wsClient.off("message", globalListener);
973
+ console.log(`Listener global para canal '${this.id}' foi removido.`);
974
+ }
975
+ };
976
+ wsClient.on("message", globalListener);
947
977
  super.once(event, callback);
948
978
  return this;
949
979
  }
@@ -1386,19 +1416,26 @@ var PlaybackInstance = class extends EventEmitter3 {
1386
1416
  `Nenhum WebSocket conectado dispon\xEDvel para o playback: ${this.id}`
1387
1417
  );
1388
1418
  }
1389
- wsClient.on("message", (event) => {
1419
+ wsClient.addScopedMessageListener(this.id, (event) => {
1390
1420
  if (isPlaybackEvent(event, this.id)) {
1391
1421
  const playbackEventType = event.type;
1392
- if (!this.listenerCount(playbackEventType)) {
1393
- this.emit(playbackEventType, event);
1394
- } else {
1395
- console.log(`Listener para '${playbackEventType}' j\xE1 registrado.`);
1396
- }
1422
+ this.emit(playbackEventType, event);
1423
+ }
1424
+ });
1425
+ this.on("removeListener", (eventName) => {
1426
+ if (this.eventNames().length === 0 || this.listenerCount(eventName) === 0) {
1427
+ wsClient.removeScopedMessageListeners(this.id);
1428
+ console.log(
1429
+ `Listeners escopados removidos para playback '${this.id}'.`
1430
+ );
1397
1431
  }
1398
1432
  });
1399
1433
  }
1400
1434
  playbackData = null;
1401
1435
  id;
1436
+ /**
1437
+ * Adiciona um listener para eventos de playback.
1438
+ */
1402
1439
  /**
1403
1440
  * Adiciona um listener para eventos de playback.
1404
1441
  */
@@ -1428,14 +1465,23 @@ var PlaybackInstance = class extends EventEmitter3 {
1428
1465
  console.log(`Recebido evento '${event}' para playback '${this.id}'`);
1429
1466
  this.emit(event, webSocketEvent);
1430
1467
  callback(webSocketEvent);
1431
- wsClient.off("message", globalListener);
1432
- console.log(`Listener global para playback '${this.id}' foi removido.`);
1468
+ wsClient.removeScopedMessageListeners(this.id);
1469
+ console.log(
1470
+ `Listeners escopados para playback '${this.id}' foram removidos.`
1471
+ );
1433
1472
  }
1434
1473
  };
1435
- wsClient.on("message", globalListener);
1474
+ wsClient.addScopedMessageListener(this.id, globalListener);
1436
1475
  super.once(event, callback);
1437
1476
  return this;
1438
1477
  }
1478
+ /**
1479
+ * Remove um listener específico.
1480
+ */
1481
+ off(event, callback) {
1482
+ super.off(event, callback);
1483
+ return this;
1484
+ }
1439
1485
  /**
1440
1486
  * Obtém os detalhes do playback.
1441
1487
  */
@@ -1470,14 +1516,6 @@ var PlaybackInstance = class extends EventEmitter3 {
1470
1516
  throw new Error("Nenhum playback associado para encerrar.");
1471
1517
  }
1472
1518
  await this.baseClient.delete(`/playbacks/${this.id}`);
1473
- this.emit("PlaybackStopped", this.playbackData);
1474
- }
1475
- /**
1476
- * Remove um listener específico.
1477
- */
1478
- off(event, callback) {
1479
- super.off(event, callback);
1480
- return this;
1481
1519
  }
1482
1520
  };
1483
1521
  var Playbacks = class extends EventEmitter3 {
@@ -1499,19 +1537,6 @@ var Playbacks = class extends EventEmitter3 {
1499
1537
  getWebSocketClients() {
1500
1538
  return this.client.getWebSocketClients();
1501
1539
  }
1502
- /**
1503
- * Emite eventos de playback.
1504
- * Atualizado para gerenciar eventos específicos para `PlaybackInstance`.
1505
- */
1506
- emitPlaybackEvent(eventType, data) {
1507
- if ("playbackId" in data) {
1508
- const playbackId = data.playbackId;
1509
- if (playbackId) {
1510
- this.emit(`${eventType}:${playbackId}`, data);
1511
- }
1512
- }
1513
- this.emit(eventType, data);
1514
- }
1515
1540
  /**
1516
1541
  * Retrieves details of a specific playback.
1517
1542
  *
@@ -1748,6 +1773,33 @@ var WebSocketClient = class extends EventEmitter4 {
1748
1773
  super.removeAllListeners(event);
1749
1774
  return this;
1750
1775
  }
1776
+ /**
1777
+ * Adiciona um listener escopado ao evento "message".
1778
+ * @param instanceId - Identificador único da instância que está registrando o listener.
1779
+ * @param callback - Função de callback para o evento.
1780
+ */
1781
+ addScopedMessageListener(instanceId, callback) {
1782
+ const scopedListener = (data) => {
1783
+ if (data.instanceId === instanceId) {
1784
+ callback(data);
1785
+ }
1786
+ };
1787
+ this.on("message", scopedListener);
1788
+ this.messageListeners.push(scopedListener);
1789
+ }
1790
+ /**
1791
+ * Remove todos os listeners associados a uma instância específica.
1792
+ * @param instanceId - Identificador da instância cujos listeners serão removidos.
1793
+ */
1794
+ removeScopedMessageListeners(instanceId) {
1795
+ this.messageListeners = this.messageListeners.filter((listener) => {
1796
+ const shouldRemove = listener.name === instanceId;
1797
+ if (shouldRemove) {
1798
+ this.off("message", listener);
1799
+ }
1800
+ return !shouldRemove;
1801
+ });
1802
+ }
1751
1803
  /**
1752
1804
  * Handles incoming WebSocket messages.
1753
1805
  * @param rawData - The raw data received from the WebSocket.