UNPKG

ivr-tester

Version:

An automated testing framework for IVR call flows

68 lines (67 loc) 2.44 kB
"use strict"; 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;