@ipcom/asterisk-ari 0.0.28 → 0.0.29

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.
@@ -863,9 +863,10 @@ function toQueryParams2(options) {
863
863
  ).toString();
864
864
  }
865
865
  var ChannelInstance = class extends import_events.EventEmitter {
866
- constructor(client, channelId) {
866
+ constructor(client, baseClient, channelId) {
867
867
  super();
868
868
  this.client = client;
869
+ this.baseClient = baseClient;
869
870
  this.channelId = channelId;
870
871
  }
871
872
  channelData = null;
@@ -876,7 +877,7 @@ var ChannelInstance = class extends import_events.EventEmitter {
876
877
  if (this.channelData) {
877
878
  throw new Error("O canal j\xE1 foi criado.");
878
879
  }
879
- const channel = await this.client.post("/channels", data);
880
+ const channel = await this.baseClient.post("/channels", data);
880
881
  this.channelData = channel;
881
882
  this.emit("ChannelCreated", channel, this);
882
883
  return channel;
@@ -889,7 +890,7 @@ var ChannelInstance = class extends import_events.EventEmitter {
889
890
  throw new Error("Nenhum canal est\xE1 associado a esta inst\xE2ncia.");
890
891
  }
891
892
  const id = this.channelId || this.channelData?.id;
892
- const details = await this.client.get(`/channels/${id}`);
893
+ const details = await this.baseClient.get(`/channels/${id}`);
893
894
  this.channelData = details;
894
895
  return details;
895
896
  }
@@ -900,9 +901,27 @@ var ChannelInstance = class extends import_events.EventEmitter {
900
901
  if (!this.channelData) {
901
902
  throw new Error("O canal ainda n\xE3o foi criado.");
902
903
  }
903
- await this.client.delete(`/channels/${this.channelData.id}`);
904
+ await this.baseClient.delete(`/channels/${this.channelData.id}`);
904
905
  this.emit("ChannelHungUp", this.channelData);
905
906
  }
907
+ /**
908
+ * Toca um arquivo de mídia no canal.
909
+ *
910
+ * @param options - Opções para o playback, incluindo mídia e idioma.
911
+ * @param playback - (Opcional) Uma instância de `PlaybackInstance` para gerenciar o playback. Se não fornecido, será criada uma nova.
912
+ * @returns Uma instância de `PlaybackInstance` associada ao playback.
913
+ */
914
+ async play(options, playback) {
915
+ if (!playback) {
916
+ playback = this.client.Playback();
917
+ }
918
+ await this.baseClient.post(
919
+ `/channels/${this.channelData?.id}/play/${playback.id}`,
920
+ // Agora o ID é garantido
921
+ options
922
+ );
923
+ return playback;
924
+ }
906
925
  /**
907
926
  * Adiciona um listener para eventos de canal.
908
927
  */
@@ -926,21 +945,23 @@ var ChannelInstance = class extends import_events.EventEmitter {
926
945
  }
927
946
  };
928
947
  var Channels = class extends import_events.EventEmitter {
929
- constructor(client) {
948
+ constructor(baseClient, client, channelId) {
930
949
  super();
950
+ this.baseClient = baseClient;
931
951
  this.client = client;
952
+ this.channelId = channelId;
932
953
  }
933
954
  /**
934
955
  * Cria uma nova instância de `ChannelInstance` sem originar um canal físico.
935
956
  */
936
957
  createChannelInstance(channelId) {
937
- return new ChannelInstance(this.client, channelId);
958
+ return new ChannelInstance(this.client, this.baseClient, channelId);
938
959
  }
939
960
  /**
940
961
  * Origina um canal físico diretamente, sem uma instância de `ChannelInstance`.
941
962
  */
942
963
  async originate(data) {
943
- return this.client.post("/channels", data);
964
+ return this.baseClient.post("/channels", data);
944
965
  }
945
966
  /**
946
967
  * Lida com eventos relacionados ao canal e os emite para listeners registrados.
@@ -976,7 +997,7 @@ var Channels = class extends import_events.EventEmitter {
976
997
  * Lista todos os canais ativos.
977
998
  */
978
999
  async list() {
979
- const channels = await this.client.get("/channels");
1000
+ const channels = await this.baseClient.get("/channels");
980
1001
  if (!Array.isArray(channels)) {
981
1002
  throw new Error("Resposta da API /channels n\xE3o \xE9 um array.");
982
1003
  }
@@ -986,14 +1007,14 @@ var Channels = class extends import_events.EventEmitter {
986
1007
  * Obtém detalhes de um canal específico.
987
1008
  */
988
1009
  async getDetails(channelId) {
989
- return this.client.get(`/channels/${channelId}`);
1010
+ return this.baseClient.get(`/channels/${channelId}`);
990
1011
  }
991
1012
  /**
992
1013
  * Reproduz mídia em um canal.
993
1014
  */
994
1015
  async playMedia(channelId, media, options) {
995
1016
  const queryParams = options ? `?${new URLSearchParams(options).toString()}` : "";
996
- return this.client.post(
1017
+ return this.baseClient.post(
997
1018
  `/channels/${channelId}/play${queryParams}`,
998
1019
  { media }
999
1020
  );
@@ -1006,7 +1027,7 @@ var Channels = class extends import_events.EventEmitter {
1006
1027
  ...options?.reason_code && { reason_code: options.reason_code },
1007
1028
  ...options?.reason && { reason: options.reason }
1008
1029
  });
1009
- return this.client.delete(
1030
+ return this.baseClient.delete(
1010
1031
  `/channels/${channelId}?${queryParams.toString()}`
1011
1032
  );
1012
1033
  }
@@ -1015,41 +1036,45 @@ var Channels = class extends import_events.EventEmitter {
1015
1036
  */
1016
1037
  async snoopChannel(channelId, options) {
1017
1038
  const queryParams = toQueryParams2(options);
1018
- return this.client.post(
1039
+ return this.baseClient.post(
1019
1040
  `/channels/${channelId}/snoop?${queryParams}`
1020
1041
  );
1021
1042
  }
1022
1043
  async startSilence(channelId) {
1023
- return this.client.post(`/channels/${channelId}/silence`);
1044
+ return this.baseClient.post(`/channels/${channelId}/silence`);
1024
1045
  }
1025
1046
  async stopSilence(channelId) {
1026
- return this.client.delete(`/channels/${channelId}/silence`);
1047
+ return this.baseClient.delete(`/channels/${channelId}/silence`);
1027
1048
  }
1028
1049
  async getRTPStatistics(channelId) {
1029
- return this.client.get(`/channels/${channelId}/rtp_statistics`);
1050
+ return this.baseClient.get(
1051
+ `/channels/${channelId}/rtp_statistics`
1052
+ );
1030
1053
  }
1031
1054
  async createExternalMedia(options) {
1032
1055
  const queryParams = new URLSearchParams(options);
1033
- return this.client.post(
1056
+ return this.baseClient.post(
1034
1057
  `/channels/externalMedia?${queryParams.toString()}`
1035
1058
  );
1036
1059
  }
1037
1060
  async playWithId(channelId, playbackId, media, options) {
1038
1061
  const queryParams = options ? `?${new URLSearchParams(options).toString()}` : "";
1039
- return this.client.post(
1062
+ return this.baseClient.post(
1040
1063
  `/channels/${channelId}/play/${playbackId}${queryParams}`,
1041
1064
  { media }
1042
1065
  );
1043
1066
  }
1044
1067
  async snoopChannelWithId(channelId, snoopId, options) {
1045
1068
  const queryParams = new URLSearchParams(options);
1046
- return this.client.post(
1069
+ return this.baseClient.post(
1047
1070
  `/channels/${channelId}/snoop/${snoopId}?${queryParams.toString()}`
1048
1071
  );
1049
1072
  }
1050
1073
  async startMohWithClass(channelId, mohClass) {
1051
1074
  const queryParams = `mohClass=${encodeURIComponent(mohClass)}`;
1052
- return this.client.post(`/channels/${channelId}/moh?${queryParams}`);
1075
+ return this.baseClient.post(
1076
+ `/channels/${channelId}/moh?${queryParams}`
1077
+ );
1053
1078
  }
1054
1079
  /**
1055
1080
  * Gets the value of a channel variable or function.
@@ -1063,7 +1088,7 @@ var Channels = class extends import_events.EventEmitter {
1063
1088
  if (!variable) {
1064
1089
  throw new Error("The 'variable' parameter is required.");
1065
1090
  }
1066
- return this.client.get(
1091
+ return this.baseClient.get(
1067
1092
  `/channels/${channelId}/variable?variable=${encodeURIComponent(variable)}`
1068
1093
  );
1069
1094
  }
@@ -1084,7 +1109,7 @@ var Channels = class extends import_events.EventEmitter {
1084
1109
  variable,
1085
1110
  ...value && { value }
1086
1111
  });
1087
- await this.client.post(
1112
+ await this.baseClient.post(
1088
1113
  `/channels/${channelId}/variable?${queryParams.toString()}`
1089
1114
  );
1090
1115
  }
@@ -1092,7 +1117,7 @@ var Channels = class extends import_events.EventEmitter {
1092
1117
  * Moves the channel to another Stasis application.
1093
1118
  */
1094
1119
  async moveToApplication(channelId, app, appArgs) {
1095
- return this.client.post(`/channels/${channelId}/move`, {
1120
+ return this.baseClient.post(`/channels/${channelId}/move`, {
1096
1121
  app,
1097
1122
  appArgs
1098
1123
  });
@@ -1101,7 +1126,7 @@ var Channels = class extends import_events.EventEmitter {
1101
1126
  * Continues the dialplan for a specific channel.
1102
1127
  */
1103
1128
  async continueDialplan(channelId, context, extension, priority, label) {
1104
- return this.client.post(`/channels/${channelId}/continue`, {
1129
+ return this.baseClient.post(`/channels/${channelId}/continue`, {
1105
1130
  context,
1106
1131
  extension,
1107
1132
  priority,
@@ -1112,13 +1137,13 @@ var Channels = class extends import_events.EventEmitter {
1112
1137
  * Stops music on hold (MOH) for a channel.
1113
1138
  */
1114
1139
  async stopMusicOnHold(channelId) {
1115
- return this.client.delete(`/channels/${channelId}/moh`);
1140
+ return this.baseClient.delete(`/channels/${channelId}/moh`);
1116
1141
  }
1117
1142
  /**
1118
1143
  * Starts music on hold (MOH) for a channel.
1119
1144
  */
1120
1145
  async startMusicOnHold(channelId) {
1121
- return this.client.post(`/channels/${channelId}/moh`);
1146
+ return this.baseClient.post(`/channels/${channelId}/moh`);
1122
1147
  }
1123
1148
  /**
1124
1149
  * Starts playback of a media file on a channel.
@@ -1128,7 +1153,7 @@ var Channels = class extends import_events.EventEmitter {
1128
1153
  */
1129
1154
  async startPlayback(channelId, media, options) {
1130
1155
  const queryParams = options ? `?${new URLSearchParams(options).toString()}` : "";
1131
- return this.client.post(
1156
+ return this.baseClient.post(
1132
1157
  `/channels/${channelId}/play${queryParams}`,
1133
1158
  { media }
1134
1159
  );
@@ -1137,7 +1162,7 @@ var Channels = class extends import_events.EventEmitter {
1137
1162
  * Stops playback of a media file on a channel.
1138
1163
  */
1139
1164
  async stopPlayback(channelId, playbackId) {
1140
- return this.client.delete(
1165
+ return this.baseClient.delete(
1141
1166
  `/channels/${channelId}/play/${playbackId}`
1142
1167
  );
1143
1168
  }
@@ -1145,7 +1170,7 @@ var Channels = class extends import_events.EventEmitter {
1145
1170
  * Pauses playback of a media file on a channel.
1146
1171
  */
1147
1172
  async pausePlayback(channelId, playbackId) {
1148
- return this.client.post(
1173
+ return this.baseClient.post(
1149
1174
  `/channels/${channelId}/play/${playbackId}/pause`
1150
1175
  );
1151
1176
  }
@@ -1153,7 +1178,7 @@ var Channels = class extends import_events.EventEmitter {
1153
1178
  * Resumes playback of a media file on a channel.
1154
1179
  */
1155
1180
  async resumePlayback(channelId, playbackId) {
1156
- return this.client.delete(
1181
+ return this.baseClient.delete(
1157
1182
  `/channels/${channelId}/play/${playbackId}/pause`
1158
1183
  );
1159
1184
  }
@@ -1161,7 +1186,7 @@ var Channels = class extends import_events.EventEmitter {
1161
1186
  * Rewinds playback of a media file on a channel.
1162
1187
  */
1163
1188
  async rewindPlayback(channelId, playbackId, skipMs) {
1164
- return this.client.post(
1189
+ return this.baseClient.post(
1165
1190
  `/channels/${channelId}/play/${playbackId}/rewind`,
1166
1191
  { skipMs }
1167
1192
  );
@@ -1170,7 +1195,7 @@ var Channels = class extends import_events.EventEmitter {
1170
1195
  * Fast-forwards playback of a media file on a channel.
1171
1196
  */
1172
1197
  async fastForwardPlayback(channelId, playbackId, skipMs) {
1173
- return this.client.post(
1198
+ return this.baseClient.post(
1174
1199
  `/channels/${channelId}/play/${playbackId}/forward`,
1175
1200
  { skipMs }
1176
1201
  );
@@ -1184,7 +1209,7 @@ var Channels = class extends import_events.EventEmitter {
1184
1209
  ([, value]) => value !== void 0
1185
1210
  )
1186
1211
  );
1187
- return this.client.post(
1212
+ return this.baseClient.post(
1188
1213
  `/channels/${channelId}/record?${queryParams.toString()}`
1189
1214
  );
1190
1215
  }
@@ -1196,7 +1221,7 @@ var Channels = class extends import_events.EventEmitter {
1196
1221
  ...caller && { caller },
1197
1222
  ...timeout && { timeout: timeout.toString() }
1198
1223
  });
1199
- return this.client.post(
1224
+ return this.baseClient.post(
1200
1225
  `/channels/${channelId}/dial?${queryParams.toString()}`
1201
1226
  );
1202
1227
  }
@@ -1204,7 +1229,7 @@ var Channels = class extends import_events.EventEmitter {
1204
1229
  * Redirects the channel to a different location.
1205
1230
  */
1206
1231
  async redirectChannel(channelId, endpoint) {
1207
- return this.client.post(
1232
+ return this.baseClient.post(
1208
1233
  `/channels/${channelId}/redirect?endpoint=${encodeURIComponent(endpoint)}`
1209
1234
  );
1210
1235
  }
@@ -1212,19 +1237,19 @@ var Channels = class extends import_events.EventEmitter {
1212
1237
  * Answers a channel.
1213
1238
  */
1214
1239
  async answerChannel(channelId) {
1215
- return this.client.post(`/channels/${channelId}/answer`);
1240
+ return this.baseClient.post(`/channels/${channelId}/answer`);
1216
1241
  }
1217
1242
  /**
1218
1243
  * Sends a ringing indication to a channel.
1219
1244
  */
1220
1245
  async ringChannel(channelId) {
1221
- return this.client.post(`/channels/${channelId}/ring`);
1246
+ return this.baseClient.post(`/channels/${channelId}/ring`);
1222
1247
  }
1223
1248
  /**
1224
1249
  * Stops ringing indication on a channel.
1225
1250
  */
1226
1251
  async stopRingChannel(channelId) {
1227
- return this.client.delete(`/channels/${channelId}/ring`);
1252
+ return this.baseClient.delete(`/channels/${channelId}/ring`);
1228
1253
  }
1229
1254
  /**
1230
1255
  * Sends DTMF to a channel.
@@ -1237,7 +1262,7 @@ var Channels = class extends import_events.EventEmitter {
1237
1262
  ...options?.duration && { duration: options.duration.toString() },
1238
1263
  ...options?.after && { after: options.after.toString() }
1239
1264
  });
1240
- return this.client.post(
1265
+ return this.baseClient.post(
1241
1266
  `/channels/${channelId}/dtmf?${queryParams.toString()}`
1242
1267
  );
1243
1268
  }
@@ -1245,7 +1270,7 @@ var Channels = class extends import_events.EventEmitter {
1245
1270
  * Mutes a channel.
1246
1271
  */
1247
1272
  async muteChannel(channelId, direction = "both") {
1248
- return this.client.post(
1273
+ return this.baseClient.post(
1249
1274
  `/channels/${channelId}/mute?direction=${direction}`
1250
1275
  );
1251
1276
  }
@@ -1253,7 +1278,7 @@ var Channels = class extends import_events.EventEmitter {
1253
1278
  * Unmutes a channel.
1254
1279
  */
1255
1280
  async unmuteChannel(channelId, direction = "both") {
1256
- return this.client.delete(
1281
+ return this.baseClient.delete(
1257
1282
  `/channels/${channelId}/mute?direction=${direction}`
1258
1283
  );
1259
1284
  }
@@ -1261,25 +1286,25 @@ var Channels = class extends import_events.EventEmitter {
1261
1286
  * Puts a channel on hold.
1262
1287
  */
1263
1288
  async holdChannel(channelId) {
1264
- return this.client.post(`/channels/${channelId}/hold`);
1289
+ return this.baseClient.post(`/channels/${channelId}/hold`);
1265
1290
  }
1266
1291
  /**
1267
1292
  * Removes a channel from hold.
1268
1293
  */
1269
1294
  async unholdChannel(channelId) {
1270
- return this.client.delete(`/channels/${channelId}/hold`);
1295
+ return this.baseClient.delete(`/channels/${channelId}/hold`);
1271
1296
  }
1272
1297
  /**
1273
1298
  * Creates a channel and places it in a Stasis app without dialing it.
1274
1299
  */
1275
1300
  async createChannel(data) {
1276
- return this.client.post("/channels/create", data);
1301
+ return this.baseClient.post("/channels/create", data);
1277
1302
  }
1278
1303
  /**
1279
1304
  * Creates a new channel with a specific ID and originates a call.
1280
1305
  */
1281
1306
  async originateWithId(channelId, data) {
1282
- return this.client.post(`/channels/${channelId}`, data);
1307
+ return this.baseClient.post(`/channels/${channelId}`, data);
1283
1308
  }
1284
1309
  };
1285
1310
 
@@ -1332,12 +1357,15 @@ var Endpoints = class {
1332
1357
  // src/ari-client/resources/playbacks.ts
1333
1358
  var import_events2 = require("events");
1334
1359
  var PlaybackInstance = class extends import_events2.EventEmitter {
1335
- constructor(client, playbackId) {
1360
+ // Garantimos que o ID esteja disponível
1361
+ constructor(baseClient, playbackId) {
1336
1362
  super();
1337
- this.client = client;
1363
+ this.baseClient = baseClient;
1338
1364
  this.playbackId = playbackId;
1365
+ this.id = playbackId || `playback-${Date.now()}`;
1339
1366
  }
1340
1367
  playbackData = null;
1368
+ id;
1341
1369
  /**
1342
1370
  * Obtém os detalhes do playback.
1343
1371
  */
@@ -1346,7 +1374,7 @@ var PlaybackInstance = class extends import_events2.EventEmitter {
1346
1374
  throw new Error("Nenhum playback associado a esta inst\xE2ncia.");
1347
1375
  }
1348
1376
  const id = this.playbackId || this.playbackData?.id;
1349
- const details = await this.client.get(`/playbacks/${id}`);
1377
+ const details = await this.baseClient.get(`/playbacks/${id}`);
1350
1378
  this.playbackData = details;
1351
1379
  return details;
1352
1380
  }
@@ -1357,7 +1385,7 @@ var PlaybackInstance = class extends import_events2.EventEmitter {
1357
1385
  if (!this.playbackId) {
1358
1386
  throw new Error("Nenhum playback associado para controlar.");
1359
1387
  }
1360
- await this.client.post(`/playbacks/${this.playbackId}/control`, {
1388
+ await this.baseClient.post(`/playbacks/${this.playbackId}/control`, {
1361
1389
  operation
1362
1390
  });
1363
1391
  }
@@ -1368,7 +1396,7 @@ var PlaybackInstance = class extends import_events2.EventEmitter {
1368
1396
  if (!this.playbackId) {
1369
1397
  throw new Error("Nenhum playback associado para encerrar.");
1370
1398
  }
1371
- await this.client.post(`/playbacks/${this.playbackId}/stop`);
1399
+ await this.baseClient.post(`/playbacks/${this.playbackId}/stop`);
1372
1400
  this.emit("PlaybackStopped", this.playbackData);
1373
1401
  }
1374
1402
  /**
@@ -1402,7 +1430,8 @@ var Playbacks = class extends import_events2.EventEmitter {
1402
1430
  * Inicializa uma nova instância de `PlaybackInstance`.
1403
1431
  */
1404
1432
  Playback(playbackId) {
1405
- return new PlaybackInstance(this.client, playbackId);
1433
+ const id = playbackId || `playback-${Date.now()}`;
1434
+ return new PlaybackInstance(this.client, id);
1406
1435
  }
1407
1436
  /**
1408
1437
  * Emite eventos de playback.
@@ -1648,7 +1677,7 @@ var AriClient = class {
1648
1677
  const normalizedHost = config.host.replace(/^https?:\/\//, "");
1649
1678
  const baseUrl = `${httpProtocol}://${normalizedHost}:${config.port}/ari`;
1650
1679
  this.baseClient = new BaseClient(baseUrl, config.username, config.password);
1651
- this.channels = new Channels(this.baseClient);
1680
+ this.channels = new Channels(this.baseClient, this);
1652
1681
  this.endpoints = new Endpoints(this.baseClient);
1653
1682
  this.applications = new Applications(this.baseClient);
1654
1683
  this.playbacks = new Playbacks(this.baseClient);