@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.
@@ -947,9 +947,16 @@ var ChannelInstance = class extends import_events2.EventEmitter {
947
947
  `Nenhum WebSocket conectado dispon\xEDvel para o canal: ${this.id}`
948
948
  );
949
949
  }
950
- wsClient.on("message", (event) => {
950
+ wsClient.addScopedMessageListener(this.id, (event) => {
951
951
  if (isChannelEvent(event, this.id)) {
952
- this.emit(event.type, event);
952
+ const channelEventType = event.type;
953
+ this.emit(channelEventType, event);
954
+ }
955
+ });
956
+ this.on("removeListener", (eventName) => {
957
+ if (this.eventNames().length === 0 || this.listenerCount(eventName) === 0) {
958
+ wsClient.removeScopedMessageListeners(this.id);
959
+ console.log(`Listeners escopados removidos para canal '${this.id}'.`);
953
960
  }
954
961
  });
955
962
  }
@@ -966,6 +973,29 @@ var ChannelInstance = class extends import_events2.EventEmitter {
966
973
  * Adiciona um listener para ser chamado apenas uma vez.
967
974
  */
968
975
  once(event, callback) {
976
+ console.log({
977
+ type: "Adiciona um listener para ser chamado apenas uma vez",
978
+ event
979
+ });
980
+ const wsClients = this.client.getWebSocketClients();
981
+ const wsClient = Array.from(wsClients.values()).find(
982
+ (client) => client.isConnected()
983
+ );
984
+ if (!wsClient) {
985
+ throw new Error(
986
+ `Nenhum WebSocket conectado dispon\xEDvel para '${this.id}'.`
987
+ );
988
+ }
989
+ const globalListener = (webSocketEvent) => {
990
+ if (isChannelEvent(webSocketEvent, this.id) && webSocketEvent.type === event) {
991
+ console.log(`Recebido evento '${event}' para canal '${this.id}'`);
992
+ this.emit(event, webSocketEvent);
993
+ callback(webSocketEvent);
994
+ wsClient.off("message", globalListener);
995
+ console.log(`Listener global para canal '${this.id}' foi removido.`);
996
+ }
997
+ };
998
+ wsClient.on("message", globalListener);
969
999
  super.once(event, callback);
970
1000
  return this;
971
1001
  }
@@ -1408,19 +1438,26 @@ var PlaybackInstance = class extends import_events3.EventEmitter {
1408
1438
  `Nenhum WebSocket conectado dispon\xEDvel para o playback: ${this.id}`
1409
1439
  );
1410
1440
  }
1411
- wsClient.on("message", (event) => {
1441
+ wsClient.addScopedMessageListener(this.id, (event) => {
1412
1442
  if (isPlaybackEvent(event, this.id)) {
1413
1443
  const playbackEventType = event.type;
1414
- if (!this.listenerCount(playbackEventType)) {
1415
- this.emit(playbackEventType, event);
1416
- } else {
1417
- console.log(`Listener para '${playbackEventType}' j\xE1 registrado.`);
1418
- }
1444
+ this.emit(playbackEventType, event);
1445
+ }
1446
+ });
1447
+ this.on("removeListener", (eventName) => {
1448
+ if (this.eventNames().length === 0 || this.listenerCount(eventName) === 0) {
1449
+ wsClient.removeScopedMessageListeners(this.id);
1450
+ console.log(
1451
+ `Listeners escopados removidos para playback '${this.id}'.`
1452
+ );
1419
1453
  }
1420
1454
  });
1421
1455
  }
1422
1456
  playbackData = null;
1423
1457
  id;
1458
+ /**
1459
+ * Adiciona um listener para eventos de playback.
1460
+ */
1424
1461
  /**
1425
1462
  * Adiciona um listener para eventos de playback.
1426
1463
  */
@@ -1450,14 +1487,23 @@ var PlaybackInstance = class extends import_events3.EventEmitter {
1450
1487
  console.log(`Recebido evento '${event}' para playback '${this.id}'`);
1451
1488
  this.emit(event, webSocketEvent);
1452
1489
  callback(webSocketEvent);
1453
- wsClient.off("message", globalListener);
1454
- console.log(`Listener global para playback '${this.id}' foi removido.`);
1490
+ wsClient.removeScopedMessageListeners(this.id);
1491
+ console.log(
1492
+ `Listeners escopados para playback '${this.id}' foram removidos.`
1493
+ );
1455
1494
  }
1456
1495
  };
1457
- wsClient.on("message", globalListener);
1496
+ wsClient.addScopedMessageListener(this.id, globalListener);
1458
1497
  super.once(event, callback);
1459
1498
  return this;
1460
1499
  }
1500
+ /**
1501
+ * Remove um listener específico.
1502
+ */
1503
+ off(event, callback) {
1504
+ super.off(event, callback);
1505
+ return this;
1506
+ }
1461
1507
  /**
1462
1508
  * Obtém os detalhes do playback.
1463
1509
  */
@@ -1492,14 +1538,6 @@ var PlaybackInstance = class extends import_events3.EventEmitter {
1492
1538
  throw new Error("Nenhum playback associado para encerrar.");
1493
1539
  }
1494
1540
  await this.baseClient.delete(`/playbacks/${this.id}`);
1495
- this.emit("PlaybackStopped", this.playbackData);
1496
- }
1497
- /**
1498
- * Remove um listener específico.
1499
- */
1500
- off(event, callback) {
1501
- super.off(event, callback);
1502
- return this;
1503
1541
  }
1504
1542
  };
1505
1543
  var Playbacks = class extends import_events3.EventEmitter {
@@ -1521,19 +1559,6 @@ var Playbacks = class extends import_events3.EventEmitter {
1521
1559
  getWebSocketClients() {
1522
1560
  return this.client.getWebSocketClients();
1523
1561
  }
1524
- /**
1525
- * Emite eventos de playback.
1526
- * Atualizado para gerenciar eventos específicos para `PlaybackInstance`.
1527
- */
1528
- emitPlaybackEvent(eventType, data) {
1529
- if ("playbackId" in data) {
1530
- const playbackId = data.playbackId;
1531
- if (playbackId) {
1532
- this.emit(`${eventType}:${playbackId}`, data);
1533
- }
1534
- }
1535
- this.emit(eventType, data);
1536
- }
1537
1562
  /**
1538
1563
  * Retrieves details of a specific playback.
1539
1564
  *
@@ -1770,6 +1795,33 @@ var WebSocketClient = class extends import_events4.EventEmitter {
1770
1795
  super.removeAllListeners(event);
1771
1796
  return this;
1772
1797
  }
1798
+ /**
1799
+ * Adiciona um listener escopado ao evento "message".
1800
+ * @param instanceId - Identificador único da instância que está registrando o listener.
1801
+ * @param callback - Função de callback para o evento.
1802
+ */
1803
+ addScopedMessageListener(instanceId, callback) {
1804
+ const scopedListener = (data) => {
1805
+ if (data.instanceId === instanceId) {
1806
+ callback(data);
1807
+ }
1808
+ };
1809
+ this.on("message", scopedListener);
1810
+ this.messageListeners.push(scopedListener);
1811
+ }
1812
+ /**
1813
+ * Remove todos os listeners associados a uma instância específica.
1814
+ * @param instanceId - Identificador da instância cujos listeners serão removidos.
1815
+ */
1816
+ removeScopedMessageListeners(instanceId) {
1817
+ this.messageListeners = this.messageListeners.filter((listener) => {
1818
+ const shouldRemove = listener.name === instanceId;
1819
+ if (shouldRemove) {
1820
+ this.off("message", listener);
1821
+ }
1822
+ return !shouldRemove;
1823
+ });
1824
+ }
1773
1825
  /**
1774
1826
  * Handles incoming WebSocket messages.
1775
1827
  * @param rawData - The raw data received from the WebSocket.