ivr-tester
Version:
An automated testing framework for IVR call flows
68 lines (67 loc) • 2.44 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AudioPlaybackCaller = void 0;
const ws_1 = __importDefault(require("ws"));
const twilio_1 = require("./twilio");
class AudioPlaybackCaller {
constructor() {
this.streamCounter = 0;
}
async call(mulawAudio, streamUrl) {
this.streamCounter++;
const streamSid = `audio-stream-${this.streamCounter}`;
const ws = new ws_1.default(streamUrl);
ws.on("open", async () => {
ws.send(AudioPlaybackCaller.createTwilioMediaStreamStartEvent(streamSid));
// Kludge to slowdown the rate at which data is sent to AWS
let buffer = [];
for (const item of mulawAudio) {
buffer.push(item);
if (buffer.length >= AudioPlaybackCaller.bufferSize) {
ws.send(AudioPlaybackCaller.createMediaEvent(streamSid, Buffer.from(buffer)));
buffer = [];
await new Promise((resolve) => setTimeout(resolve, AudioPlaybackCaller.msBetweenSendingBuffer));
}
}
ws.send(AudioPlaybackCaller.createCallEndedEvent());
ws.removeAllListeners();
ws.close();
});
return Promise.resolve({
type: "audio-playback",
call: mulawAudio,
});
}
static createTwilioMediaStreamStartEvent(sid) {
return JSON.stringify({
event: twilio_1.TwilioConnectionEvents.MediaStreamStart,
streamSid: sid,
start: {
customParameters: {
from: "audio",
to: "playback",
},
},
});
}
static createMediaEvent(sid, payload) {
return JSON.stringify({
event: twilio_1.TwilioConnectionEvents.Media,
streamSid: sid,
media: {
payload: payload.toString("base64"),
},
});
}
static createCallEndedEvent() {
return JSON.stringify({
event: twilio_1.TwilioConnectionEvents.CallEnded,
});
}
}
exports.AudioPlaybackCaller = AudioPlaybackCaller;
AudioPlaybackCaller.msBetweenSendingBuffer = 250;
AudioPlaybackCaller.bufferSize = 1000;