botium-connector-voip 0.0.13 → 0.0.15
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.
|
@@ -58,7 +58,8 @@ const Capabilities = {
|
|
|
58
58
|
VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_ENABLE',
|
|
59
59
|
VOIP_SILENCE_DURATION_TIMEOUT: 'VOIP_SILENCE_DURATION_TIMEOUT',
|
|
60
60
|
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE',
|
|
61
|
-
VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START'
|
|
61
|
+
VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START',
|
|
62
|
+
VOIP_STT_CONFIDENCE_THRESHOLD: 'VOIP_STT_CONFIDENCE_THRESHOLD'
|
|
62
63
|
};
|
|
63
64
|
const Defaults = {
|
|
64
65
|
VOIP_STT_METHOD: 'POST',
|
|
@@ -70,11 +71,12 @@ const Defaults = {
|
|
|
70
71
|
VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',
|
|
71
72
|
VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?',
|
|
72
73
|
VOIP_WEBSOCKET_CONNECT_TIMEOUT: 4000,
|
|
73
|
-
VOIP_WEBSOCKET_CONNECT_MAXRETRIES:
|
|
74
|
+
VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 5,
|
|
74
75
|
VOIP_SILENCE_DURATION_TIMEOUT: 2500,
|
|
75
76
|
VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: false,
|
|
76
77
|
VOIP_SILENCE_DURATION_TIMEOUT_START: 1000,
|
|
77
|
-
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false
|
|
78
|
+
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false,
|
|
79
|
+
VOIP_STT_CONFIDENCE_THRESHOLD: 0.5
|
|
78
80
|
};
|
|
79
81
|
|
|
80
82
|
class BotiumConnectorVoip {
|
|
@@ -183,20 +185,37 @@ class BotiumConnectorVoip {
|
|
|
183
185
|
let data = null;
|
|
184
186
|
let headers = null;
|
|
185
187
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
188
|
+
const connect = async retryIndex => {
|
|
189
|
+
retryIndex = retryIndex || 0;
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
const res = await axios__default["default"]({
|
|
193
|
+
method: 'post',
|
|
194
|
+
data: {
|
|
195
|
+
API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]
|
|
196
|
+
},
|
|
197
|
+
url: new URL(path__default["default"].join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
if (res) {
|
|
201
|
+
data = res.data;
|
|
202
|
+
headers = res.headers;
|
|
203
|
+
}
|
|
204
|
+
} catch (err) {
|
|
205
|
+
debug$2(`Retry ${retryIndex} / ${this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]}: Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`);
|
|
199
206
|
|
|
207
|
+
if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {
|
|
208
|
+
throw new Error(`Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`);
|
|
209
|
+
} // Retry after the defined timeout
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
await new Promise(resolve => setTimeout(resolve, this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT])); // Retry the connection
|
|
213
|
+
|
|
214
|
+
await connect(retryIndex + 1);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
await connect();
|
|
200
219
|
return new Promise((resolve, reject) => {
|
|
201
220
|
const wsEndpoint = `${this.caps[Capabilities.VOIP_WORKER_URL]}/ws/${data.port}`;
|
|
202
221
|
|
|
@@ -290,8 +309,7 @@ class BotiumConnectorVoip {
|
|
|
290
309
|
|
|
291
310
|
const parsedDataLog = lodash__default["default"].cloneDeep(parsedData);
|
|
292
311
|
|
|
293
|
-
parsedDataLog.fullRecord = '<full_record_buffer>';
|
|
294
|
-
debug$2(JSON.stringify(parsedDataLog, null, 2));
|
|
312
|
+
parsedDataLog.fullRecord = '<full_record_buffer>'; // debug(JSON.stringify(parsedDataLog, null, 2))
|
|
295
313
|
|
|
296
314
|
if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {
|
|
297
315
|
this.sessionId = parsedData.voipConfig.sessionId;
|
|
@@ -370,7 +388,7 @@ class BotiumConnectorVoip {
|
|
|
370
388
|
const isJoinMethod = this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN';
|
|
371
389
|
let matched = false;
|
|
372
390
|
|
|
373
|
-
if ((!lodash__default["default"].isNil(joinLogicHook) && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {
|
|
391
|
+
if ((!lodash__default["default"].isNil(joinLogicHook) && isJoinMethod && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {
|
|
374
392
|
matched = true;
|
|
375
393
|
} else if (lodash__default["default"].isNil(joinLogicHook) && isJoinMethod && silenceDuration > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {
|
|
376
394
|
matched = true;
|
|
@@ -387,6 +405,9 @@ class BotiumConnectorVoip {
|
|
|
387
405
|
}
|
|
388
406
|
|
|
389
407
|
if (parsedData && parsedData.data && parsedData.data.type === 'stt' && parsedData.data.final) {
|
|
408
|
+
const successfulConfidenceScore = this._getConfidenceScore(parsedData) >= this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD];
|
|
409
|
+
debug$2(`Message: ${parsedData.data.message} / Confidence Score: ${this._getConfidenceScore(parsedData)} (Threshold: ${this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD]})`);
|
|
410
|
+
|
|
390
411
|
if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL' && lodash__default["default"].isNil(this._getJoinLogicHook(this.convoStep))) {
|
|
391
412
|
let botMsg = {
|
|
392
413
|
messageText: parsedData.data.message
|
|
@@ -410,8 +431,12 @@ class BotiumConnectorVoip {
|
|
|
410
431
|
}
|
|
411
432
|
|
|
412
433
|
this.prevData = parsedData;
|
|
413
|
-
|
|
414
|
-
|
|
434
|
+
|
|
435
|
+
if (successfulConfidenceScore) {
|
|
436
|
+
this.botMsgs.push(botMsg);
|
|
437
|
+
this.botMsgs.forEach(botMsg => sendBotMsg(botMsg));
|
|
438
|
+
}
|
|
439
|
+
|
|
415
440
|
this.botMsgs = [];
|
|
416
441
|
}
|
|
417
442
|
|
|
@@ -438,9 +463,13 @@ class BotiumConnectorVoip {
|
|
|
438
463
|
}
|
|
439
464
|
|
|
440
465
|
this.prevData = parsedData;
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
466
|
+
|
|
467
|
+
if (successfulConfidenceScore) {
|
|
468
|
+
this.botMsgs.push(botMsg);
|
|
469
|
+
const botMsgsExpanded = splitBotMsgs(this.botMsgs);
|
|
470
|
+
botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg));
|
|
471
|
+
}
|
|
472
|
+
|
|
444
473
|
this.botMsgs = [];
|
|
445
474
|
}
|
|
446
475
|
|
|
@@ -449,16 +478,20 @@ class BotiumConnectorVoip {
|
|
|
449
478
|
messageText: parsedData.data.message,
|
|
450
479
|
sourceData: parsedData
|
|
451
480
|
};
|
|
452
|
-
this.botMsgs.push(botMsg);
|
|
453
481
|
this.prevData = parsedData;
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
482
|
+
|
|
483
|
+
if (successfulConfidenceScore) {
|
|
484
|
+
this.botMsgs.push(botMsg);
|
|
485
|
+
this.silenceTimeout = setTimeout(() => {
|
|
486
|
+
if (this.botMsgs.length > 0) {
|
|
487
|
+
debug$2(this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0]) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]);
|
|
488
|
+
sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg));
|
|
489
|
+
this.firstMsg = false;
|
|
490
|
+
this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1];
|
|
491
|
+
this.botMsgs = [];
|
|
492
|
+
}
|
|
493
|
+
}, this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0]) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]);
|
|
494
|
+
}
|
|
462
495
|
}
|
|
463
496
|
}
|
|
464
497
|
});
|
|
@@ -674,6 +707,19 @@ class BotiumConnectorVoip {
|
|
|
674
707
|
return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION');
|
|
675
708
|
}
|
|
676
709
|
|
|
710
|
+
_getConfidenceScore(parsedData) {
|
|
711
|
+
// Azure Speech Service
|
|
712
|
+
if (parsedData?.data?.source?.debug?.privJson) {
|
|
713
|
+
const privJson = JSON.parse(parsedData?.data?.source?.debug?.privJson);
|
|
714
|
+
|
|
715
|
+
if (privJson && privJson.NBest && privJson.NBest.length > 0) {
|
|
716
|
+
return Math.max(...privJson.NBest.map(n => n.Confidence));
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
return null;
|
|
721
|
+
}
|
|
722
|
+
|
|
677
723
|
}
|
|
678
724
|
|
|
679
725
|
var connector = BotiumConnectorVoip;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"botium-connector-voip-cjs.js","sources":["../src/connector.js","../src/ignore-sd-logichook.js","../src/join-logichook.js","../index.js"],"sourcesContent":["const WebSocket = require('ws')\nconst _ = require('lodash')\nconst axios = require('axios')\nconst debug = require('debug')('botium-connector-voip')\nconst path = require('path')\n\nconst Capabilities = {\n VOIP_STT_URL_STREAM: 'VOIP_STT_URL_STREAM',\n VOIP_STT_PARAMS_STREAM: 'VOIP_STT_PARAMS_STREAM',\n VOIP_STT_METHOD_STREAM: 'VOIP_STT_METHOD_STREAM',\n VOIP_STT_BODY_STREAM: 'VOIP_STT_BODY_STREAM',\n VOIP_STT_BODY: 'VOIP_STT_BODY',\n VOIP_STT_HEADERS: 'VOIP_STT_HEADERS',\n VOIP_STT_TIMEOUT: 'VOIP_STT_TIMEOUT',\n VOIP_STT_MESSAGE_HANDLING: 'VOIP_STT_MESSAGE_HANDLING',\n VOIP_STT_MESSAGE_HANDLING_TIMEOUT: 'VOIP_STT_MESSAGE_HANDLING_TIMEOUT',\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: 'VOIP_STT_MESSAGE_HANDLING_DELIMITER',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: 'VOIP_STT_MESSAGE_HANDLING_PUNCTUATION',\n VOIP_TTS_URL: 'VOIP_TTS_URL',\n VOIP_TTS_PARAMS: 'VOIP_TTS_PARAMS',\n VOIP_TTS_METHOD: 'VOIP_TTS_METHOD',\n VOIP_TTS_BODY: 'VOIP_TTS_BODY',\n VOIP_TTS_HEADERS: 'VOIP_TTS_HEADERS',\n VOIP_TTS_TIMEOUT: 'VOIP_TTS_TIMEOUT',\n VOIP_WORKER_URL: 'VOIP_WORKER_URL',\n VOIP_WORKER_APIKEY: 'VOIP_WORKER_APIKEY',\n VOIP_SIP_POOL_CALLER_ENABLE: 'VOIP_SIP_POOL_CALLER_ENABLE',\n VOIP_SIP_CALLER_REGISTRAR_URI: 'VOIP_SIP_CALLER_REGISTRAR_URI',\n VOIP_SIP_CALLER_ADDRESS: 'VOIP_SIP_CALLER_ADDRESS',\n VOIP_SIP_CALLER_USERNAME: 'VOIP_SIP_CALLER_USERNAME',\n VOIP_SIP_CALLER_PASSWORD: 'VOIP_SIP_CALLER_PASSWORD',\n VOIP_SIP_PROXY: 'VOIP_SIP_PROXY',\n VOIP_SIP_REG_HEADERS: 'VOIP_SIP_REG_HEADERS',\n VOIP_SIP_INVITE_HEADERS: 'VOIP_SIP_INVITE_HEADERS',\n VOIP_SIP_CALLEE_URI: 'VOIP_SIP_CALLEE_URI',\n VOIP_ICE_ENABLE: 'VOIP_ICE_ENABLE',\n VOIP_ICE_STUN_SERVERS: 'VOIP_ICE_STUN_SERVERS',\n VOIP_ICE_TURN_ENABLE: 'VOIP_ICE_TURN_ENABLE',\n VOIP_ICE_TURN_SERVER: 'VOIP_ICE_TURN_SERVER',\n VOIP_ICE_TURN_USER: 'VOIP_ICE_TURN_USER',\n VOIP_ICE_TURN_PASSWORD: 'VOIP_ICE_TURN_PASSWORD',\n VOIP_ICE_TURN_PROTOCOL: 'VOIP_ICE_TURN_PROTOCOL',\n VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 'VOIP_WEBSOCKET_CONNECT_MAXRETRIES',\n VOIP_WEBSOCKET_CONNECT_TIMEOUT: 'VOIP_WEBSOCKET_CONNECT_TIMEOUT',\n VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_ENABLE',\n VOIP_SILENCE_DURATION_TIMEOUT: 'VOIP_SILENCE_DURATION_TIMEOUT',\n VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE',\n VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START'\n}\n\nconst Defaults = {\n VOIP_STT_METHOD: 'POST',\n VOIP_STT_TIMEOUT: 10000,\n VOIP_TTS_METHOD: 'GET',\n VOIP_TTS_TIMEOUT: 10000,\n VOIP_STT_MESSAGE_HANDLING: 'ORIGINAL',\n VOIP_STT_MESSAGE_HANDLING_TIMEOUT: 2500,\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?',\n VOIP_WEBSOCKET_CONNECT_TIMEOUT: 4000,\n VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 20,\n VOIP_SILENCE_DURATION_TIMEOUT: 2500,\n VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: false,\n VOIP_SILENCE_DURATION_TIMEOUT_START: 1000,\n VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false\n}\n\nclass BotiumConnectorVoip {\n constructor ({ queueBotSays, eventEmitter, caps }) {\n this.queueBotSays = queueBotSays\n this.caps = caps\n this.eventEmitter = eventEmitter\n this.botMsgs = []\n this.sentencesBuilding = 0\n this.sentencesFinal = 0\n this.sentenceBuilding = false\n }\n\n async Validate () {\n debug('Validate called')\n debug(this.caps.VOIP_STT_MESSAGE_HANDLING)\n\n if (this.caps.VOIP_TTS_URL) {\n this.axiosTtsParams = {\n url: this.caps.VOIP_TTS_URL,\n params: this._getParams(Capabilities.VOIP_TTS_PARAMS),\n method: this.caps.VOIP_TTS_METHOD,\n timeout: this.caps.VOIP_TTS_TIMEOUT,\n headers: this._getHeaders(Capabilities.VOIP_TTS_HEADERS)\n }\n try {\n const { data } = await axios({\n ...this.axiosTtsParams,\n url: this._getAxiosUrl(this.caps.VOIP_TTS_URL, '/api/status')\n })\n if (data && data.status === 'OK') {\n debug(`Checking TTS Status response: ${this._getAxiosShortenedOutput(data)}`)\n } else {\n throw new Error(`Checking TTS Status failed, response is: ${this._getAxiosShortenedOutput(data)}`)\n }\n } catch (err) {\n throw new Error(`Checking TTS Status failed - ${this._getAxiosErrOutput(err)}`)\n }\n }\n\n this.caps = Object.assign({}, Defaults, this.caps)\n }\n\n async Start () {\n debug('Start called')\n debug(this.caps[Capabilities.VOIP_TTS_URL])\n\n this.stopCalled = false\n\n this.fullRecord = ''\n this.end = false\n this.connected = false\n this.convoStep = null\n\n const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }\n\n const joinBotMsg = (botMsgs, joinLastPrevMsg) => {\n const botMsg = {}\n botMsg.messageText = botMsgs.map(m => m.messageText).join(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_DELIMITER])\n botMsg.sourceData = botMsgs.map(m => m.sourceData)\n if (_.isNil(joinLastPrevMsg)) {\n botMsg.sourceData[0].silenceDuration = botMsgs[0].sourceData.data.start\n botMsg.sourceData[0].voiceDuration = botMsgs[botMsgs.length - 1].sourceData.data.end - botMsgs[0].sourceData.data.start\n } else {\n botMsg.sourceData[0].silenceDuration = botMsgs[0].sourceData.data.start - joinLastPrevMsg.sourceData.data.end\n botMsg.sourceData[0].voiceDuration = botMsgs[botMsgs.length - 1].sourceData.data.end - botMsgs[0].sourceData.data.start\n }\n return botMsg\n }\n\n const splitBotMsgs = botMsgs => {\n const splitSentences = s => s.match(new RegExp(`[^${this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_PUNCTUATION]}]+[${this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_PUNCTUATION]}]+`, 'g'))\n const botMsgsFinal = []\n for (const botMsg of botMsgs) {\n const sentences = splitSentences(botMsg.messageText)\n if (_.isNil(sentences)) {\n botMsgsFinal.push(botMsg)\n } else {\n let botMsgCount = 0\n for (const sentence of sentences) {\n botMsgsFinal.push({\n messageText: sentence,\n sourceData: (botMsgCount === 0) ? botMsg.sourceData : _.omit(botMsg.sourceData, ['silenceDuration'])\n })\n botMsgCount++\n }\n }\n }\n return botMsgsFinal\n }\n\n let data = null\n let headers = null\n try {\n const res = await axios({\n method: 'post',\n data: {\n API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]\n },\n url: new URL(path.join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()\n })\n data = res.data\n headers = res.headers\n } catch (err) {\n return Promise.reject(new Error(`Connecting to VOIP Worker failed: ${err.response.data.message || 'Not reachable'}`))\n }\n\n return new Promise((resolve, reject) => {\n const wsEndpoint = `${this.caps[Capabilities.VOIP_WORKER_URL]}/ws/${data.port}`\n const connect = (retryIndex) => {\n retryIndex = retryIndex || 0\n return new Promise((resolve, reject) => {\n if ('set-cookie' in headers) {\n this.ws = new WebSocket(wsEndpoint, {\n headers: {\n Cookie: headers['set-cookie']\n }\n })\n } else {\n this.ws = new WebSocket(wsEndpoint)\n }\n this.ws.on('open', () => {\n resolve()\n })\n this.ws.on('error', () => {\n if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {\n reject(new Error(`Websocket connection failed to ${wsEndpoint}`))\n }\n setTimeout(() => connect(retryIndex + 1).then(resolve).catch(reject), this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT])\n })\n })\n }\n connect().then(() => {\n if (!_.isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {\n if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {\n this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = []\n } else {\n this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = this.caps[Capabilities.VOIP_ICE_STUN_SERVERS].split(',')\n }\n }\n\n this.eventEmitter.on('CONVO_STEP_NEXT', (container, convoStep) => {\n this.convoStep = convoStep\n })\n\n this.silence = null\n this.msgCount = 0\n this.firstMsg = true\n this.firstSttInfoReceived = false\n this.silenceTimeout = null\n\n this.wsOpened = true\n debug(`Websocket connection to ${wsEndpoint} opened.`)\n const request = {\n METHOD: 'initCall',\n SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],\n SIP_PROXY: this.caps[Capabilities.VOIP_SIP_PROXY],\n SIP_CALLER_URI: this.caps[Capabilities.VOIP_SIP_CALLER_URI],\n SIP_CALLER_USERNAME: this.caps[Capabilities.VOIP_SIP_CALLER_USERNAME],\n SIP_CALLER_PASSWORD: this.caps[Capabilities.VOIP_SIP_CALLER_PASSWORD],\n SIP_CALLER_ADDRESS: this.caps[Capabilities.VOIP_SIP_CALLER_ADDRESS],\n SIP_CALLER_REGISTRAR_URI: this.caps[Capabilities.VOIP_SIP_CALLER_REGISTRAR_URI],\n SIP_CALLEE_URI: this.caps[Capabilities.VOIP_SIP_CALLEE_URI],\n SIP_REG_HEADERS: this.caps[Capabilities.VOIP_SIP_REG_HEADERS],\n SIP_INVITE_HEADERS: this.caps[Capabilities.VOIP_SIP_INVITE_HEADERS],\n ICE_ENABLE: this.caps[Capabilities.VOIP_ICE_ENABLE],\n ICE_STUN_SERVERS: this.caps[Capabilities.VOIP_ICE_STUN_SERVERS],\n ICE_TURN_SERVER: this.caps[Capabilities.VOIP_ICE_TURN_SERVER],\n ICE_TURN_USERNAME: this.caps[Capabilities.VOIP_ICE_TURN_USER],\n ICE_TURN_PASSWORD: this.caps[Capabilities.VOIP_ICE_TURN_PASSWORD],\n ICE_TURN_PROTOCOL: this.caps[Capabilities.VOIP_ICE_TURN_PROTOCOL] || 'TCP',\n MIN_SILENCE_DURATION: this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_ENABLE] ? this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT] : null,\n STT_CONFIG: {\n stt_url: this.caps[Capabilities.VOIP_STT_URL_STREAM],\n stt_params: this.caps[Capabilities.VOIP_STT_PARAMS_STREAM],\n stt_body: this.caps[Capabilities.VOIP_STT_BODY_STREAM] || null\n },\n TTS_CONFIG: {\n tts_url: this.caps[Capabilities.VOIP_TTS_URL],\n tts_params: this.caps[Capabilities.VOIP_TTS_PARAMS],\n tts_body: this.caps[Capabilities.VOIP_TTS_BODY] || null\n }\n }\n\n debug(JSON.stringify(request, null, 2))\n this.ws.send(JSON.stringify(request))\n\n this.ws.on('error', (err) => {\n debug(err)\n if (!this.wsOpened) {\n this.end = true\n reject(new Error(`${this.sessionId} - Websocket connection to ${wsEndpoint} error: ${err.message || err}`))\n }\n })\n this.ws.on('message', async (data) => {\n const parsedData = JSON.parse(data)\n\n const parsedDataLog = _.cloneDeep(parsedData)\n parsedDataLog.fullRecord = '<full_record_buffer>'\n\n debug(JSON.stringify(parsedDataLog, null, 2))\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {\n this.sessionId = parsedData.voipConfig.sessionId\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'unauthorized') {\n reject(new Error('Error: Cannot open a call: SIP Authorization failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event === 'onCallRegState') {\n reject(new Error('Error: Sip Registration failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {\n resolve()\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'disconnected') {\n const apiKey = this._extractApiKey(this._getBody(Capabilities.VOIP_STT_BODY))\n if (parsedData.connectDuration && parsedData.connectDuration > 0) {\n this.eventEmitter.emit('CONSUMPTION_METADATA', this, {\n type: _.isNil(apiKey) ? 'INBUILT' : 'THIRD_PARTY',\n category: 'e2eVoiceIvr',\n metricName: 'consumption.e2e.voip.stt.seconds',\n credits: parsedData.connectDuration,\n apiKey\n })\n }\n }\n\n if (parsedData && parsedData.type === 'error') {\n this.end = true\n reject(new Error(`Error: ${parsedData.message}`))\n sendBotMsg(new Error(`Error: ${parsedData.message}`))\n }\n\n if (parsedData && parsedData.type === 'silence') {\n if (_.isNil(this._getIgnoreSilenceDurationAsserterLogicHook(this.convoStep))) {\n if (_.isNil(this._getJoinLogicHook(this.convoStep)) && parsedData.data.silence.length > 0) {\n this.end = true\n sendBotMsg(new Error(`Silence Duration of ${parsedData.data.silence[0][2].toFixed(2)}s exceeded General Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT] / 1000}s`))\n }\n }\n }\n\n if (parsedData && parsedData.type === 'fullRecord') {\n this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {\n name: 'full_record.wav',\n mimeType: 'audio/wav',\n base64: parsedData.fullRecord\n })\n this.end = true\n }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (this.silenceTimeout) {\n clearTimeout(this.silenceTimeout)\n }\n if (_.isNil(this._getIgnoreSilenceDurationAsserterLogicHook(this.convoStep))) {\n if (!this.firstSttInfoReceived && _.isNil(this._getJoinLogicHook(this.convoStep)) && this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {\n this.end = true\n sendBotMsg(new Error(`Silence Duration of ${parsedData.data.start}s exceeded Initial Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START] / 1000}s`))\n }\n }\n this.firstSttInfoReceived = true\n if (this.prevData) {\n if (!_.isNil(parsedData.data.start)) {\n const silenceDuration = parsedData.data.start - this.prevData.data.end\n const joinLogicHook = this._getJoinLogicHook(this.convoStep)\n const isJoinMethod = this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN'\n let matched = false\n if ((!_.isNil(joinLogicHook) && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {\n matched = true\n } else if ((_.isNil(joinLogicHook) && isJoinMethod && (silenceDuration > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000))) {\n matched = true\n }\n if (matched && this.botMsgs.length > 0) {\n sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))\n this.firstMsg = false\n this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]\n this.botMsgs = []\n }\n }\n }\n }\n\n if (parsedData && parsedData.data && parsedData.data.type === 'stt' && parsedData.data.final) {\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL' && (_.isNil(this._getJoinLogicHook(this.convoStep)))) {\n let botMsg = { messageText: parsedData.data.message }\n if (this.firstMsg) {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n this.firstMsg = false\n } else {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start - this.prevData.data.end\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n }\n this.prevData = parsedData\n this.botMsgs.push(botMsg)\n this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'SPLIT' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {\n let botMsg = { messageText: parsedData.data.message }\n if (this.firstMsg) {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n this.firstMsg = false\n } else {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start - this.prevData.data.end\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n }\n this.prevData = parsedData\n this.botMsgs.push(botMsg)\n const botMsgsExpanded = splitBotMsgs(this.botMsgs)\n botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT' || !_.isNil(this._getJoinLogicHook(this.convoStep))) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n this.prevData = parsedData\n this.silenceTimeout = setTimeout(() => {\n if (this.botMsgs.length > 0) {\n sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))\n this.firstMsg = false\n this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]\n this.botMsgs = []\n }\n }, (this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0])) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n }\n }\n })\n }).catch(err => {\n reject(new Error('Error: ' + err))\n })\n })\n }\n\n async UserSays (msg) {\n debug('UserSays called')\n\n debug(msg)\n\n if (!msg.attachments) {\n msg.attachments = []\n }\n return new Promise((resolve, reject) => {\n setTimeout(async () => {\n let duration = 0\n if (msg && msg.buttons && msg.buttons.length > 0) {\n const request = JSON.stringify({\n METHOD: 'sendDtmf',\n digits: msg.buttons[0].payload,\n sessionId: this.sessionId\n })\n this.ws.send(request)\n } else if (msg && msg.messageText) {\n if (!this.axiosTtsParams) reject(new Error('TTS not configured, only audio input supported'))\n if (this.axiosTtsParams) {\n const ttsRequest = {\n ...this.axiosTtsParams,\n params: {\n ...(this.axiosTtsParams.params || {}),\n text: msg.messageText\n },\n data: this._getBody(Capabilities.VOIP_TTS_BODY),\n responseType: 'arraybuffer'\n }\n msg.sourceData = ttsRequest\n\n let ttsResponse = null\n try {\n ttsResponse = await axios(ttsRequest)\n } catch (err) {\n reject(new Error(`TTS \"${msg.messageText}\" failed - ${this._getAxiosErrOutput(err)}`))\n }\n if (msg && msg.messageText && msg.messageText.length > 0) {\n const apiKey = this._extractApiKey(this._getBody(Capabilities.VOIP_TTS_BODY))\n this.eventEmitter.emit('CONSUMPTION_METADATA', this.container, {\n type: _.isNil(apiKey) ? 'INBUILT' : 'THIRD_PARTY',\n metricName: 'consumption.e2e.voip.tts.characters',\n credits: msg.messageText.length,\n apiKey\n })\n }\n if (Buffer.isBuffer(ttsResponse.data)) {\n duration = ttsResponse.headers['content-duration']\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n PESQ: false,\n sessionId: this.sessionId,\n b64_buffer: ttsResponse.data.toString('base64')\n })\n msg.attachments.push({\n name: 'tts.wav',\n mimeType: 'audio/wav',\n base64: ttsResponse.data.toString('base64')\n })\n this.ws.send(request)\n } else {\n reject(new Error(`TTS failed, response is: ${this._getAxiosShortenedOutput(ttsResponse.data)}`))\n }\n }\n }\n if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n sessionId: this.sessionId,\n b64_buffer: msg.media[0].buffer.toString('base64')\n })\n this.ws.send(request)\n msg.attachments.push({\n name: msg.media[0].mediaUri,\n mimeType: msg.media[0].mimeType,\n base64: msg.media[0].buffer.toString('base64')\n })\n const { data } = await axios({\n method: 'post',\n data: msg.media[0].buffer,\n headers: {\n ...this._getHeaders(Capabilities.VOIP_TTS_HEADERS),\n 'Content-Type': 'audio/wave'\n },\n url: this._getAxiosUrl(this.caps.VOIP_TTS_URL, '/api/audio/info'),\n maxContentLength: Infinity,\n maxBodyLength: Infinity\n })\n if (data && data.duration) {\n duration = parseInt(data.duration)\n } else {\n reject(new Error('Getting audio duration from Speech Api failed'))\n }\n }\n setTimeout(resolve, duration * 1000)\n }, 0)\n })\n }\n\n async Stop () {\n debug(`${this.sessionId} - Stop called`)\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n const request = JSON.stringify({\n METHOD: 'stopCall',\n sessionId: this.sessionId\n })\n this.ws.send(request)\n await new Promise(resolve => {\n setTimeout(resolve, 100000)\n setInterval(() => {\n if (this.end) {\n this.wsOpened = false\n this.ws = null\n this.end = false\n this.convoStep = null\n this.firstSttInfoReceived = false\n resolve()\n }\n }, 100)\n })\n } else {\n this.wsOpened = false\n this.ws = null\n this.end = false\n this.convoStep = null\n this.firstSttInfoReceived = false\n }\n }\n\n _getParams (capParams) {\n if (this.caps[capParams]) {\n if (_.isString(this.caps[capParams])) return JSON.parse(this.caps[capParams])\n else return this.caps[capParams]\n }\n return {}\n }\n\n _getBody (capBody) {\n if (this.caps[capBody]) {\n if (_.isString(this.caps[capBody])) return JSON.parse(this.caps[capBody])\n else return this.caps[capBody]\n }\n return null\n }\n\n _getHeaders (capHeaders) {\n if (this.caps[capHeaders]) {\n if (_.isString(this.caps[capHeaders])) return JSON.parse(this.caps[capHeaders])\n else return this.caps[capHeaders]\n }\n return {}\n }\n\n _getAxiosUrl (baseUrl, extUrl) {\n return baseUrl.substr(0, baseUrl.indexOf('/', 8)) + extUrl\n }\n\n _getAxiosShortenedOutput (data) {\n if (data) {\n if (_.isBuffer(data)) {\n try {\n data = data.toString()\n } catch (err) {\n }\n }\n return _.truncate(_.isString(data) ? data : JSON.stringify(data), { length: 200 })\n } else {\n return ''\n }\n }\n\n _getAxiosErrOutput (err) {\n if (err && err.response) {\n return `Status: ${err.response.status} / Response: ${this._getAxiosShortenedOutput(err.response.data)}`\n } else {\n return err.message\n }\n }\n\n _extractApiKey (body) {\n return _.get(body, 'polly.credentials.accessKeyId') ||\n _.get(body, 'google.credentials.client_email') ||\n _.get(body, 'ibm.credentials.apikey') ||\n _.get(body, 'awstranscribe.credentials.accessKeyId') ||\n _.get(body, 'azure.credentials.subscriptionKey') ||\n null\n }\n\n _getJoinLogicHook (convoStep) {\n if (_.isNil(convoStep)) return null\n if (_.isNil(convoStep.logicHooks)) return null\n return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_JOIN_SILENCE_DURATION')\n }\n\n _getIgnoreSilenceDurationAsserterLogicHook (convoStep) {\n if (_.isNil(convoStep)) return null\n if (_.isNil(convoStep.logicHooks)) return null\n return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')\n }\n}\n\nmodule.exports = BotiumConnectorVoip\n","const debug = require('debug')('botium-voip-logichook-ignore-silence-duration')\n\nmodule.exports = class IgnoreSilenceDurationLogicHook {\n constructor (context, caps = {}, args = {}) {\n this.context = context\n this.caps = caps\n this.globalArgs = args\n }\n\n async onBotPrepare (props) {\n debug('Silence duration assertion ignored by logic hook')\n }\n}\n","const debug = require('debug')('botium-voip-logichook-join-silence-duration')\n\nmodule.exports = class JoinLogicHook {\n constructor (context, caps = {}, args = {}) {\n this.context = context\n this.caps = caps\n this.globalArgs = args\n }\n\n async onBotPrepare (props) {\n debug('Joined bot messages because of JOIN logic hook')\n }\n}\n","const BotiumConnectorVoip = require('./src/connector')\nconst IgnoreSilenceDurationLogicHook = require('./src/ignore-sd-logichook')\nconst JoinLogicHook = require('./src/join-logichook')\n\nmodule.exports = {\n PluginVersion: 1,\n PluginClass: BotiumConnectorVoip,\n PluginDesc: {\n name: 'Voice over IP',\n provider: 'Botium',\n features: {\n audioInput: true,\n e2eTesting: true\n },\n capabilities: [\n {\n name: 'VOIP_STT',\n label: 'Speech Recognition Profile',\n type: 'speechrecognitionprofile',\n required: true\n },\n {\n name: 'VOIP_TTS',\n label: 'Speech Synthesis Profile',\n type: 'speechsynthesisprofile',\n required: true\n }\n ]\n },\n PluginLogicHooks: {\n VOIP_IGNORE_SILENCE_DURATION: IgnoreSilenceDurationLogicHook,\n VOIP_JOIN_SILENCE_DURATION: JoinLogicHook\n }\n}\n"],"names":["debug","require$$0","Capabilities","VOIP_STT_URL_STREAM","VOIP_STT_PARAMS_STREAM","VOIP_STT_METHOD_STREAM","VOIP_STT_BODY_STREAM","VOIP_STT_BODY","VOIP_STT_HEADERS","VOIP_STT_TIMEOUT","VOIP_STT_MESSAGE_HANDLING","VOIP_STT_MESSAGE_HANDLING_TIMEOUT","VOIP_STT_MESSAGE_HANDLING_DELIMITER","VOIP_STT_MESSAGE_HANDLING_PUNCTUATION","VOIP_TTS_URL","VOIP_TTS_PARAMS","VOIP_TTS_METHOD","VOIP_TTS_BODY","VOIP_TTS_HEADERS","VOIP_TTS_TIMEOUT","VOIP_WORKER_URL","VOIP_WORKER_APIKEY","VOIP_SIP_POOL_CALLER_ENABLE","VOIP_SIP_CALLER_REGISTRAR_URI","VOIP_SIP_CALLER_ADDRESS","VOIP_SIP_CALLER_USERNAME","VOIP_SIP_CALLER_PASSWORD","VOIP_SIP_PROXY","VOIP_SIP_REG_HEADERS","VOIP_SIP_INVITE_HEADERS","VOIP_SIP_CALLEE_URI","VOIP_ICE_ENABLE","VOIP_ICE_STUN_SERVERS","VOIP_ICE_TURN_ENABLE","VOIP_ICE_TURN_SERVER","VOIP_ICE_TURN_USER","VOIP_ICE_TURN_PASSWORD","VOIP_ICE_TURN_PROTOCOL","VOIP_WEBSOCKET_CONNECT_MAXRETRIES","VOIP_WEBSOCKET_CONNECT_TIMEOUT","VOIP_SILENCE_DURATION_TIMEOUT_ENABLE","VOIP_SILENCE_DURATION_TIMEOUT","VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE","VOIP_SILENCE_DURATION_TIMEOUT_START","Defaults","VOIP_STT_METHOD","BotiumConnectorVoip","constructor","queueBotSays","eventEmitter","caps","botMsgs","sentencesBuilding","sentencesFinal","sentenceBuilding","Validate","axiosTtsParams","url","params","_getParams","method","timeout","headers","_getHeaders","data","axios","_getAxiosUrl","status","_getAxiosShortenedOutput","Error","err","_getAxiosErrOutput","Object","assign","Start","stopCalled","fullRecord","end","connected","convoStep","sendBotMsg","botMsg","setTimeout","joinBotMsg","joinLastPrevMsg","messageText","map","m","join","sourceData","_","isNil","silenceDuration","start","voiceDuration","length","splitBotMsgs","splitSentences","s","match","RegExp","botMsgsFinal","sentences","push","botMsgCount","sentence","omit","res","API_KEY","URL","path","replace","toString","Promise","reject","response","message","resolve","wsEndpoint","port","connect","retryIndex","ws","WebSocket","Cookie","on","then","catch","isArray","split","container","silence","msgCount","firstMsg","firstSttInfoReceived","silenceTimeout","wsOpened","request","METHOD","SIP_CALLER_AUTO","SIP_PROXY","SIP_CALLER_URI","VOIP_SIP_CALLER_URI","SIP_CALLER_USERNAME","SIP_CALLER_PASSWORD","SIP_CALLER_ADDRESS","SIP_CALLER_REGISTRAR_URI","SIP_CALLEE_URI","SIP_REG_HEADERS","SIP_INVITE_HEADERS","ICE_ENABLE","ICE_STUN_SERVERS","ICE_TURN_SERVER","ICE_TURN_USERNAME","ICE_TURN_PASSWORD","ICE_TURN_PROTOCOL","MIN_SILENCE_DURATION","STT_CONFIG","stt_url","stt_params","stt_body","TTS_CONFIG","tts_url","tts_params","tts_body","JSON","stringify","send","sessionId","parsedData","parse","parsedDataLog","cloneDeep","type","voipConfig","event","apiKey","_extractApiKey","_getBody","connectDuration","emit","category","metricName","credits","_getIgnoreSilenceDurationAsserterLogicHook","_getJoinLogicHook","toFixed","name","mimeType","base64","final","clearTimeout","prevData","joinLogicHook","isJoinMethod","matched","parseInt","args","forEach","botMsgsExpanded","UserSays","msg","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","media","buffer","mediaUri","maxContentLength","Infinity","maxBodyLength","Stop","readyState","CLOSED","setInterval","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","body","get","logicHooks","find","lh","IgnoreSilenceDurationLogicHook","context","globalArgs","onBotPrepare","props","JoinLogicHook","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required","PluginLogicHooks","VOIP_IGNORE_SILENCE_DURATION","VOIP_JOIN_SILENCE_DURATION"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"botium-connector-voip-cjs.js","sources":["../src/connector.js","../src/ignore-sd-logichook.js","../src/join-logichook.js","../index.js"],"sourcesContent":["const WebSocket = require('ws')\nconst _ = require('lodash')\nconst axios = require('axios')\nconst debug = require('debug')('botium-connector-voip')\nconst path = require('path')\n\nconst Capabilities = {\n VOIP_STT_URL_STREAM: 'VOIP_STT_URL_STREAM',\n VOIP_STT_PARAMS_STREAM: 'VOIP_STT_PARAMS_STREAM',\n VOIP_STT_METHOD_STREAM: 'VOIP_STT_METHOD_STREAM',\n VOIP_STT_BODY_STREAM: 'VOIP_STT_BODY_STREAM',\n VOIP_STT_BODY: 'VOIP_STT_BODY',\n VOIP_STT_HEADERS: 'VOIP_STT_HEADERS',\n VOIP_STT_TIMEOUT: 'VOIP_STT_TIMEOUT',\n VOIP_STT_MESSAGE_HANDLING: 'VOIP_STT_MESSAGE_HANDLING',\n VOIP_STT_MESSAGE_HANDLING_TIMEOUT: 'VOIP_STT_MESSAGE_HANDLING_TIMEOUT',\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: 'VOIP_STT_MESSAGE_HANDLING_DELIMITER',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: 'VOIP_STT_MESSAGE_HANDLING_PUNCTUATION',\n VOIP_TTS_URL: 'VOIP_TTS_URL',\n VOIP_TTS_PARAMS: 'VOIP_TTS_PARAMS',\n VOIP_TTS_METHOD: 'VOIP_TTS_METHOD',\n VOIP_TTS_BODY: 'VOIP_TTS_BODY',\n VOIP_TTS_HEADERS: 'VOIP_TTS_HEADERS',\n VOIP_TTS_TIMEOUT: 'VOIP_TTS_TIMEOUT',\n VOIP_WORKER_URL: 'VOIP_WORKER_URL',\n VOIP_WORKER_APIKEY: 'VOIP_WORKER_APIKEY',\n VOIP_SIP_POOL_CALLER_ENABLE: 'VOIP_SIP_POOL_CALLER_ENABLE',\n VOIP_SIP_CALLER_REGISTRAR_URI: 'VOIP_SIP_CALLER_REGISTRAR_URI',\n VOIP_SIP_CALLER_ADDRESS: 'VOIP_SIP_CALLER_ADDRESS',\n VOIP_SIP_CALLER_USERNAME: 'VOIP_SIP_CALLER_USERNAME',\n VOIP_SIP_CALLER_PASSWORD: 'VOIP_SIP_CALLER_PASSWORD',\n VOIP_SIP_PROXY: 'VOIP_SIP_PROXY',\n VOIP_SIP_REG_HEADERS: 'VOIP_SIP_REG_HEADERS',\n VOIP_SIP_INVITE_HEADERS: 'VOIP_SIP_INVITE_HEADERS',\n VOIP_SIP_CALLEE_URI: 'VOIP_SIP_CALLEE_URI',\n VOIP_ICE_ENABLE: 'VOIP_ICE_ENABLE',\n VOIP_ICE_STUN_SERVERS: 'VOIP_ICE_STUN_SERVERS',\n VOIP_ICE_TURN_ENABLE: 'VOIP_ICE_TURN_ENABLE',\n VOIP_ICE_TURN_SERVER: 'VOIP_ICE_TURN_SERVER',\n VOIP_ICE_TURN_USER: 'VOIP_ICE_TURN_USER',\n VOIP_ICE_TURN_PASSWORD: 'VOIP_ICE_TURN_PASSWORD',\n VOIP_ICE_TURN_PROTOCOL: 'VOIP_ICE_TURN_PROTOCOL',\n VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 'VOIP_WEBSOCKET_CONNECT_MAXRETRIES',\n VOIP_WEBSOCKET_CONNECT_TIMEOUT: 'VOIP_WEBSOCKET_CONNECT_TIMEOUT',\n VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_ENABLE',\n VOIP_SILENCE_DURATION_TIMEOUT: 'VOIP_SILENCE_DURATION_TIMEOUT',\n VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE',\n VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START',\n VOIP_STT_CONFIDENCE_THRESHOLD: 'VOIP_STT_CONFIDENCE_THRESHOLD'\n}\n\nconst Defaults = {\n VOIP_STT_METHOD: 'POST',\n VOIP_STT_TIMEOUT: 10000,\n VOIP_TTS_METHOD: 'GET',\n VOIP_TTS_TIMEOUT: 10000,\n VOIP_STT_MESSAGE_HANDLING: 'ORIGINAL',\n VOIP_STT_MESSAGE_HANDLING_TIMEOUT: 2500,\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?',\n VOIP_WEBSOCKET_CONNECT_TIMEOUT: 4000,\n VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 5,\n VOIP_SILENCE_DURATION_TIMEOUT: 2500,\n VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: false,\n VOIP_SILENCE_DURATION_TIMEOUT_START: 1000,\n VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false,\n VOIP_STT_CONFIDENCE_THRESHOLD: 0.5\n}\n\nclass BotiumConnectorVoip {\n constructor ({ queueBotSays, eventEmitter, caps }) {\n this.queueBotSays = queueBotSays\n this.caps = caps\n this.eventEmitter = eventEmitter\n this.botMsgs = []\n this.sentencesBuilding = 0\n this.sentencesFinal = 0\n this.sentenceBuilding = false\n }\n\n async Validate () {\n debug('Validate called')\n debug(this.caps.VOIP_STT_MESSAGE_HANDLING)\n\n if (this.caps.VOIP_TTS_URL) {\n this.axiosTtsParams = {\n url: this.caps.VOIP_TTS_URL,\n params: this._getParams(Capabilities.VOIP_TTS_PARAMS),\n method: this.caps.VOIP_TTS_METHOD,\n timeout: this.caps.VOIP_TTS_TIMEOUT,\n headers: this._getHeaders(Capabilities.VOIP_TTS_HEADERS)\n }\n try {\n const { data } = await axios({\n ...this.axiosTtsParams,\n url: this._getAxiosUrl(this.caps.VOIP_TTS_URL, '/api/status')\n })\n if (data && data.status === 'OK') {\n debug(`Checking TTS Status response: ${this._getAxiosShortenedOutput(data)}`)\n } else {\n throw new Error(`Checking TTS Status failed, response is: ${this._getAxiosShortenedOutput(data)}`)\n }\n } catch (err) {\n throw new Error(`Checking TTS Status failed - ${this._getAxiosErrOutput(err)}`)\n }\n }\n\n this.caps = Object.assign({}, Defaults, this.caps)\n }\n\n async Start () {\n debug('Start called')\n debug(this.caps[Capabilities.VOIP_TTS_URL])\n\n this.stopCalled = false\n\n this.fullRecord = ''\n this.end = false\n this.connected = false\n this.convoStep = null\n\n const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }\n\n const joinBotMsg = (botMsgs, joinLastPrevMsg) => {\n const botMsg = {}\n botMsg.messageText = botMsgs.map(m => m.messageText).join(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_DELIMITER])\n botMsg.sourceData = botMsgs.map(m => m.sourceData)\n if (_.isNil(joinLastPrevMsg)) {\n botMsg.sourceData[0].silenceDuration = botMsgs[0].sourceData.data.start\n botMsg.sourceData[0].voiceDuration = botMsgs[botMsgs.length - 1].sourceData.data.end - botMsgs[0].sourceData.data.start\n } else {\n botMsg.sourceData[0].silenceDuration = botMsgs[0].sourceData.data.start - joinLastPrevMsg.sourceData.data.end\n botMsg.sourceData[0].voiceDuration = botMsgs[botMsgs.length - 1].sourceData.data.end - botMsgs[0].sourceData.data.start\n }\n return botMsg\n }\n\n const splitBotMsgs = botMsgs => {\n const splitSentences = s => s.match(new RegExp(`[^${this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_PUNCTUATION]}]+[${this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_PUNCTUATION]}]+`, 'g'))\n const botMsgsFinal = []\n for (const botMsg of botMsgs) {\n const sentences = splitSentences(botMsg.messageText)\n if (_.isNil(sentences)) {\n botMsgsFinal.push(botMsg)\n } else {\n let botMsgCount = 0\n for (const sentence of sentences) {\n botMsgsFinal.push({\n messageText: sentence,\n sourceData: (botMsgCount === 0) ? botMsg.sourceData : _.omit(botMsg.sourceData, ['silenceDuration'])\n })\n botMsgCount++\n }\n }\n }\n return botMsgsFinal\n }\n\n let data = null\n let headers = null\n const connect = async (retryIndex) => {\n retryIndex = retryIndex || 0\n try {\n const res = await axios({\n method: 'post',\n data: {\n API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]\n },\n url: new URL(path.join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()\n })\n if (res) {\n data = res.data\n headers = res.headers\n }\n } catch (err) {\n debug(`Retry ${retryIndex} / ${this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]}: Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`)\n if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {\n throw new Error(`Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`)\n }\n // Retry after the defined timeout\n await new Promise(resolve => setTimeout(resolve, this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT]))\n\n // Retry the connection\n await connect(retryIndex + 1)\n }\n }\n await connect()\n\n return new Promise((resolve, reject) => {\n const wsEndpoint = `${this.caps[Capabilities.VOIP_WORKER_URL]}/ws/${data.port}`\n const connect = (retryIndex) => {\n retryIndex = retryIndex || 0\n return new Promise((resolve, reject) => {\n if ('set-cookie' in headers) {\n this.ws = new WebSocket(wsEndpoint, {\n headers: {\n Cookie: headers['set-cookie']\n }\n })\n } else {\n this.ws = new WebSocket(wsEndpoint)\n }\n this.ws.on('open', () => {\n resolve()\n })\n this.ws.on('error', () => {\n if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {\n reject(new Error(`Websocket connection failed to ${wsEndpoint}`))\n }\n setTimeout(() => connect(retryIndex + 1).then(resolve).catch(reject), this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT])\n })\n })\n }\n connect().then(() => {\n if (!_.isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {\n if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {\n this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = []\n } else {\n this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = this.caps[Capabilities.VOIP_ICE_STUN_SERVERS].split(',')\n }\n }\n\n this.eventEmitter.on('CONVO_STEP_NEXT', (container, convoStep) => {\n this.convoStep = convoStep\n })\n\n this.silence = null\n this.msgCount = 0\n this.firstMsg = true\n this.firstSttInfoReceived = false\n this.silenceTimeout = null\n\n this.wsOpened = true\n debug(`Websocket connection to ${wsEndpoint} opened.`)\n const request = {\n METHOD: 'initCall',\n SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],\n SIP_PROXY: this.caps[Capabilities.VOIP_SIP_PROXY],\n SIP_CALLER_URI: this.caps[Capabilities.VOIP_SIP_CALLER_URI],\n SIP_CALLER_USERNAME: this.caps[Capabilities.VOIP_SIP_CALLER_USERNAME],\n SIP_CALLER_PASSWORD: this.caps[Capabilities.VOIP_SIP_CALLER_PASSWORD],\n SIP_CALLER_ADDRESS: this.caps[Capabilities.VOIP_SIP_CALLER_ADDRESS],\n SIP_CALLER_REGISTRAR_URI: this.caps[Capabilities.VOIP_SIP_CALLER_REGISTRAR_URI],\n SIP_CALLEE_URI: this.caps[Capabilities.VOIP_SIP_CALLEE_URI],\n SIP_REG_HEADERS: this.caps[Capabilities.VOIP_SIP_REG_HEADERS],\n SIP_INVITE_HEADERS: this.caps[Capabilities.VOIP_SIP_INVITE_HEADERS],\n ICE_ENABLE: this.caps[Capabilities.VOIP_ICE_ENABLE],\n ICE_STUN_SERVERS: this.caps[Capabilities.VOIP_ICE_STUN_SERVERS],\n ICE_TURN_SERVER: this.caps[Capabilities.VOIP_ICE_TURN_SERVER],\n ICE_TURN_USERNAME: this.caps[Capabilities.VOIP_ICE_TURN_USER],\n ICE_TURN_PASSWORD: this.caps[Capabilities.VOIP_ICE_TURN_PASSWORD],\n ICE_TURN_PROTOCOL: this.caps[Capabilities.VOIP_ICE_TURN_PROTOCOL] || 'TCP',\n MIN_SILENCE_DURATION: this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_ENABLE] ? this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT] : null,\n STT_CONFIG: {\n stt_url: this.caps[Capabilities.VOIP_STT_URL_STREAM],\n stt_params: this.caps[Capabilities.VOIP_STT_PARAMS_STREAM],\n stt_body: this.caps[Capabilities.VOIP_STT_BODY_STREAM] || null\n },\n TTS_CONFIG: {\n tts_url: this.caps[Capabilities.VOIP_TTS_URL],\n tts_params: this.caps[Capabilities.VOIP_TTS_PARAMS],\n tts_body: this.caps[Capabilities.VOIP_TTS_BODY] || null\n }\n }\n\n debug(JSON.stringify(request, null, 2))\n this.ws.send(JSON.stringify(request))\n\n this.ws.on('error', (err) => {\n debug(err)\n if (!this.wsOpened) {\n this.end = true\n reject(new Error(`${this.sessionId} - Websocket connection to ${wsEndpoint} error: ${err.message || err}`))\n }\n })\n this.ws.on('message', async (data) => {\n const parsedData = JSON.parse(data)\n\n const parsedDataLog = _.cloneDeep(parsedData)\n parsedDataLog.fullRecord = '<full_record_buffer>'\n\n // debug(JSON.stringify(parsedDataLog, null, 2))\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {\n this.sessionId = parsedData.voipConfig.sessionId\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'unauthorized') {\n reject(new Error('Error: Cannot open a call: SIP Authorization failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event === 'onCallRegState') {\n reject(new Error('Error: Sip Registration failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {\n resolve()\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'disconnected') {\n const apiKey = this._extractApiKey(this._getBody(Capabilities.VOIP_STT_BODY))\n if (parsedData.connectDuration && parsedData.connectDuration > 0) {\n this.eventEmitter.emit('CONSUMPTION_METADATA', this, {\n type: _.isNil(apiKey) ? 'INBUILT' : 'THIRD_PARTY',\n category: 'e2eVoiceIvr',\n metricName: 'consumption.e2e.voip.stt.seconds',\n credits: parsedData.connectDuration,\n apiKey\n })\n }\n }\n\n if (parsedData && parsedData.type === 'error') {\n this.end = true\n reject(new Error(`Error: ${parsedData.message}`))\n sendBotMsg(new Error(`Error: ${parsedData.message}`))\n }\n\n if (parsedData && parsedData.type === 'silence') {\n if (_.isNil(this._getIgnoreSilenceDurationAsserterLogicHook(this.convoStep))) {\n if (_.isNil(this._getJoinLogicHook(this.convoStep)) && parsedData.data.silence.length > 0) {\n this.end = true\n sendBotMsg(new Error(`Silence Duration of ${parsedData.data.silence[0][2].toFixed(2)}s exceeded General Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT] / 1000}s`))\n }\n }\n }\n\n if (parsedData && parsedData.type === 'fullRecord') {\n this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {\n name: 'full_record.wav',\n mimeType: 'audio/wav',\n base64: parsedData.fullRecord\n })\n this.end = true\n }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (this.silenceTimeout) {\n clearTimeout(this.silenceTimeout)\n }\n if (_.isNil(this._getIgnoreSilenceDurationAsserterLogicHook(this.convoStep))) {\n if (!this.firstSttInfoReceived && _.isNil(this._getJoinLogicHook(this.convoStep)) && this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {\n this.end = true\n sendBotMsg(new Error(`Silence Duration of ${parsedData.data.start}s exceeded Initial Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START] / 1000}s`))\n }\n }\n this.firstSttInfoReceived = true\n if (this.prevData) {\n if (!_.isNil(parsedData.data.start)) {\n const silenceDuration = parsedData.data.start - this.prevData.data.end\n const joinLogicHook = this._getJoinLogicHook(this.convoStep)\n const isJoinMethod = this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN'\n let matched = false\n if ((!_.isNil(joinLogicHook) && isJoinMethod && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {\n matched = true\n } else if ((_.isNil(joinLogicHook) && isJoinMethod && (silenceDuration > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000))) {\n matched = true\n }\n if (matched && this.botMsgs.length > 0) {\n sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))\n this.firstMsg = false\n this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]\n this.botMsgs = []\n }\n }\n }\n }\n\n if (parsedData && parsedData.data && parsedData.data.type === 'stt' && parsedData.data.final) {\n const successfulConfidenceScore = this._getConfidenceScore(parsedData) >= this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD]\n debug(`Message: ${parsedData.data.message} / Confidence Score: ${this._getConfidenceScore(parsedData)} (Threshold: ${this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD]})`)\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL' && (_.isNil(this._getJoinLogicHook(this.convoStep)))) {\n let botMsg = { messageText: parsedData.data.message }\n if (this.firstMsg) {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n this.firstMsg = false\n } else {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start - this.prevData.data.end\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n }\n this.prevData = parsedData\n if (successfulConfidenceScore) {\n this.botMsgs.push(botMsg)\n this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))\n }\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'SPLIT' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {\n let botMsg = { messageText: parsedData.data.message }\n if (this.firstMsg) {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n this.firstMsg = false\n } else {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start - this.prevData.data.end\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n }\n this.prevData = parsedData\n if (successfulConfidenceScore) {\n this.botMsgs.push(botMsg)\n const botMsgsExpanded = splitBotMsgs(this.botMsgs)\n botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))\n }\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT' || !_.isNil(this._getJoinLogicHook(this.convoStep))) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.prevData = parsedData\n if (successfulConfidenceScore) {\n this.botMsgs.push(botMsg)\n this.silenceTimeout = setTimeout(() => {\n if (this.botMsgs.length > 0) {\n debug((this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0])) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))\n this.firstMsg = false\n this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]\n this.botMsgs = []\n }\n }, (this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0])) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n }\n }\n }\n })\n }).catch(err => {\n reject(new Error('Error: ' + err))\n })\n })\n }\n\n async UserSays (msg) {\n debug('UserSays called')\n\n debug(msg)\n\n if (!msg.attachments) {\n msg.attachments = []\n }\n return new Promise((resolve, reject) => {\n setTimeout(async () => {\n let duration = 0\n if (msg && msg.buttons && msg.buttons.length > 0) {\n const request = JSON.stringify({\n METHOD: 'sendDtmf',\n digits: msg.buttons[0].payload,\n sessionId: this.sessionId\n })\n this.ws.send(request)\n } else if (msg && msg.messageText) {\n if (!this.axiosTtsParams) reject(new Error('TTS not configured, only audio input supported'))\n if (this.axiosTtsParams) {\n const ttsRequest = {\n ...this.axiosTtsParams,\n params: {\n ...(this.axiosTtsParams.params || {}),\n text: msg.messageText\n },\n data: this._getBody(Capabilities.VOIP_TTS_BODY),\n responseType: 'arraybuffer'\n }\n msg.sourceData = ttsRequest\n\n let ttsResponse = null\n try {\n ttsResponse = await axios(ttsRequest)\n } catch (err) {\n reject(new Error(`TTS \"${msg.messageText}\" failed - ${this._getAxiosErrOutput(err)}`))\n }\n if (msg && msg.messageText && msg.messageText.length > 0) {\n const apiKey = this._extractApiKey(this._getBody(Capabilities.VOIP_TTS_BODY))\n this.eventEmitter.emit('CONSUMPTION_METADATA', this.container, {\n type: _.isNil(apiKey) ? 'INBUILT' : 'THIRD_PARTY',\n metricName: 'consumption.e2e.voip.tts.characters',\n credits: msg.messageText.length,\n apiKey\n })\n }\n if (Buffer.isBuffer(ttsResponse.data)) {\n duration = ttsResponse.headers['content-duration']\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n PESQ: false,\n sessionId: this.sessionId,\n b64_buffer: ttsResponse.data.toString('base64')\n })\n msg.attachments.push({\n name: 'tts.wav',\n mimeType: 'audio/wav',\n base64: ttsResponse.data.toString('base64')\n })\n this.ws.send(request)\n } else {\n reject(new Error(`TTS failed, response is: ${this._getAxiosShortenedOutput(ttsResponse.data)}`))\n }\n }\n }\n if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n sessionId: this.sessionId,\n b64_buffer: msg.media[0].buffer.toString('base64')\n })\n this.ws.send(request)\n msg.attachments.push({\n name: msg.media[0].mediaUri,\n mimeType: msg.media[0].mimeType,\n base64: msg.media[0].buffer.toString('base64')\n })\n const { data } = await axios({\n method: 'post',\n data: msg.media[0].buffer,\n headers: {\n ...this._getHeaders(Capabilities.VOIP_TTS_HEADERS),\n 'Content-Type': 'audio/wave'\n },\n url: this._getAxiosUrl(this.caps.VOIP_TTS_URL, '/api/audio/info'),\n maxContentLength: Infinity,\n maxBodyLength: Infinity\n })\n if (data && data.duration) {\n duration = parseInt(data.duration)\n } else {\n reject(new Error('Getting audio duration from Speech Api failed'))\n }\n }\n setTimeout(resolve, duration * 1000)\n }, 0)\n })\n }\n\n async Stop () {\n debug(`${this.sessionId} - Stop called`)\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n const request = JSON.stringify({\n METHOD: 'stopCall',\n sessionId: this.sessionId\n })\n this.ws.send(request)\n await new Promise(resolve => {\n setTimeout(resolve, 100000)\n setInterval(() => {\n if (this.end) {\n this.wsOpened = false\n this.ws = null\n this.end = false\n this.convoStep = null\n this.firstSttInfoReceived = false\n resolve()\n }\n }, 100)\n })\n } else {\n this.wsOpened = false\n this.ws = null\n this.end = false\n this.convoStep = null\n this.firstSttInfoReceived = false\n }\n }\n\n _getParams (capParams) {\n if (this.caps[capParams]) {\n if (_.isString(this.caps[capParams])) return JSON.parse(this.caps[capParams])\n else return this.caps[capParams]\n }\n return {}\n }\n\n _getBody (capBody) {\n if (this.caps[capBody]) {\n if (_.isString(this.caps[capBody])) return JSON.parse(this.caps[capBody])\n else return this.caps[capBody]\n }\n return null\n }\n\n _getHeaders (capHeaders) {\n if (this.caps[capHeaders]) {\n if (_.isString(this.caps[capHeaders])) return JSON.parse(this.caps[capHeaders])\n else return this.caps[capHeaders]\n }\n return {}\n }\n\n _getAxiosUrl (baseUrl, extUrl) {\n return baseUrl.substr(0, baseUrl.indexOf('/', 8)) + extUrl\n }\n\n _getAxiosShortenedOutput (data) {\n if (data) {\n if (_.isBuffer(data)) {\n try {\n data = data.toString()\n } catch (err) {\n }\n }\n return _.truncate(_.isString(data) ? data : JSON.stringify(data), { length: 200 })\n } else {\n return ''\n }\n }\n\n _getAxiosErrOutput (err) {\n if (err && err.response) {\n return `Status: ${err.response.status} / Response: ${this._getAxiosShortenedOutput(err.response.data)}`\n } else {\n return err.message\n }\n }\n\n _extractApiKey (body) {\n return _.get(body, 'polly.credentials.accessKeyId') ||\n _.get(body, 'google.credentials.client_email') ||\n _.get(body, 'ibm.credentials.apikey') ||\n _.get(body, 'awstranscribe.credentials.accessKeyId') ||\n _.get(body, 'azure.credentials.subscriptionKey') ||\n null\n }\n\n _getJoinLogicHook (convoStep) {\n if (_.isNil(convoStep)) return null\n if (_.isNil(convoStep.logicHooks)) return null\n return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_JOIN_SILENCE_DURATION')\n }\n\n _getIgnoreSilenceDurationAsserterLogicHook (convoStep) {\n if (_.isNil(convoStep)) return null\n if (_.isNil(convoStep.logicHooks)) return null\n return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')\n }\n\n _getConfidenceScore (parsedData) {\n // Azure Speech Service\n if (parsedData?.data?.source?.debug?.privJson) {\n const privJson = JSON.parse(parsedData?.data?.source?.debug?.privJson)\n if (privJson && privJson.NBest && privJson.NBest.length > 0) {\n return Math.max(...privJson.NBest.map(n => n.Confidence))\n }\n }\n return null\n }\n}\n\nmodule.exports = BotiumConnectorVoip\n","const debug = require('debug')('botium-voip-logichook-ignore-silence-duration')\n\nmodule.exports = class IgnoreSilenceDurationLogicHook {\n constructor (context, caps = {}, args = {}) {\n this.context = context\n this.caps = caps\n this.globalArgs = args\n }\n\n async onBotPrepare (props) {\n debug('Silence duration assertion ignored by logic hook')\n }\n}\n","const debug = require('debug')('botium-voip-logichook-join-silence-duration')\n\nmodule.exports = class JoinLogicHook {\n constructor (context, caps = {}, args = {}) {\n this.context = context\n this.caps = caps\n this.globalArgs = args\n }\n\n async onBotPrepare (props) {\n debug('Joined bot messages because of JOIN logic hook')\n }\n}\n","const BotiumConnectorVoip = require('./src/connector')\nconst IgnoreSilenceDurationLogicHook = require('./src/ignore-sd-logichook')\nconst JoinLogicHook = require('./src/join-logichook')\n\nmodule.exports = {\n PluginVersion: 1,\n PluginClass: BotiumConnectorVoip,\n PluginDesc: {\n name: 'Voice over IP',\n provider: 'Botium',\n features: {\n audioInput: true,\n e2eTesting: true\n },\n capabilities: [\n {\n name: 'VOIP_STT',\n label: 'Speech Recognition Profile',\n type: 'speechrecognitionprofile',\n required: true\n },\n {\n name: 'VOIP_TTS',\n label: 'Speech Synthesis Profile',\n type: 'speechsynthesisprofile',\n required: true\n }\n ]\n },\n PluginLogicHooks: {\n VOIP_IGNORE_SILENCE_DURATION: IgnoreSilenceDurationLogicHook,\n VOIP_JOIN_SILENCE_DURATION: JoinLogicHook\n }\n}\n"],"names":["debug","require$$0","Capabilities","VOIP_STT_URL_STREAM","VOIP_STT_PARAMS_STREAM","VOIP_STT_METHOD_STREAM","VOIP_STT_BODY_STREAM","VOIP_STT_BODY","VOIP_STT_HEADERS","VOIP_STT_TIMEOUT","VOIP_STT_MESSAGE_HANDLING","VOIP_STT_MESSAGE_HANDLING_TIMEOUT","VOIP_STT_MESSAGE_HANDLING_DELIMITER","VOIP_STT_MESSAGE_HANDLING_PUNCTUATION","VOIP_TTS_URL","VOIP_TTS_PARAMS","VOIP_TTS_METHOD","VOIP_TTS_BODY","VOIP_TTS_HEADERS","VOIP_TTS_TIMEOUT","VOIP_WORKER_URL","VOIP_WORKER_APIKEY","VOIP_SIP_POOL_CALLER_ENABLE","VOIP_SIP_CALLER_REGISTRAR_URI","VOIP_SIP_CALLER_ADDRESS","VOIP_SIP_CALLER_USERNAME","VOIP_SIP_CALLER_PASSWORD","VOIP_SIP_PROXY","VOIP_SIP_REG_HEADERS","VOIP_SIP_INVITE_HEADERS","VOIP_SIP_CALLEE_URI","VOIP_ICE_ENABLE","VOIP_ICE_STUN_SERVERS","VOIP_ICE_TURN_ENABLE","VOIP_ICE_TURN_SERVER","VOIP_ICE_TURN_USER","VOIP_ICE_TURN_PASSWORD","VOIP_ICE_TURN_PROTOCOL","VOIP_WEBSOCKET_CONNECT_MAXRETRIES","VOIP_WEBSOCKET_CONNECT_TIMEOUT","VOIP_SILENCE_DURATION_TIMEOUT_ENABLE","VOIP_SILENCE_DURATION_TIMEOUT","VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE","VOIP_SILENCE_DURATION_TIMEOUT_START","VOIP_STT_CONFIDENCE_THRESHOLD","Defaults","VOIP_STT_METHOD","BotiumConnectorVoip","constructor","queueBotSays","eventEmitter","caps","botMsgs","sentencesBuilding","sentencesFinal","sentenceBuilding","Validate","axiosTtsParams","url","params","_getParams","method","timeout","headers","_getHeaders","data","axios","_getAxiosUrl","status","_getAxiosShortenedOutput","Error","err","_getAxiosErrOutput","Object","assign","Start","stopCalled","fullRecord","end","connected","convoStep","sendBotMsg","botMsg","setTimeout","joinBotMsg","joinLastPrevMsg","messageText","map","m","join","sourceData","_","isNil","silenceDuration","start","voiceDuration","length","splitBotMsgs","splitSentences","s","match","RegExp","botMsgsFinal","sentences","push","botMsgCount","sentence","omit","connect","retryIndex","res","API_KEY","URL","path","replace","toString","message","Promise","resolve","reject","wsEndpoint","port","ws","WebSocket","Cookie","on","then","catch","isArray","split","container","silence","msgCount","firstMsg","firstSttInfoReceived","silenceTimeout","wsOpened","request","METHOD","SIP_CALLER_AUTO","SIP_PROXY","SIP_CALLER_URI","VOIP_SIP_CALLER_URI","SIP_CALLER_USERNAME","SIP_CALLER_PASSWORD","SIP_CALLER_ADDRESS","SIP_CALLER_REGISTRAR_URI","SIP_CALLEE_URI","SIP_REG_HEADERS","SIP_INVITE_HEADERS","ICE_ENABLE","ICE_STUN_SERVERS","ICE_TURN_SERVER","ICE_TURN_USERNAME","ICE_TURN_PASSWORD","ICE_TURN_PROTOCOL","MIN_SILENCE_DURATION","STT_CONFIG","stt_url","stt_params","stt_body","TTS_CONFIG","tts_url","tts_params","tts_body","JSON","stringify","send","sessionId","parsedData","parse","parsedDataLog","cloneDeep","type","voipConfig","event","apiKey","_extractApiKey","_getBody","connectDuration","emit","category","metricName","credits","_getIgnoreSilenceDurationAsserterLogicHook","_getJoinLogicHook","toFixed","name","mimeType","base64","final","clearTimeout","prevData","joinLogicHook","isJoinMethod","matched","parseInt","args","successfulConfidenceScore","_getConfidenceScore","forEach","botMsgsExpanded","UserSays","msg","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","media","buffer","mediaUri","maxContentLength","Infinity","maxBodyLength","Stop","readyState","CLOSED","setInterval","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","body","get","logicHooks","find","lh","source","privJson","NBest","Math","max","n","Confidence","IgnoreSilenceDurationLogicHook","context","globalArgs","onBotPrepare","props","JoinLogicHook","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required","PluginLogicHooks","VOIP_IGNORE_SILENCE_DURATION","VOIP_JOIN_SILENCE_DURATION"],"mappings":"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"}
|
|
@@ -46,7 +46,8 @@ const Capabilities = {
|
|
|
46
46
|
VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_ENABLE',
|
|
47
47
|
VOIP_SILENCE_DURATION_TIMEOUT: 'VOIP_SILENCE_DURATION_TIMEOUT',
|
|
48
48
|
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE',
|
|
49
|
-
VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START'
|
|
49
|
+
VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START',
|
|
50
|
+
VOIP_STT_CONFIDENCE_THRESHOLD: 'VOIP_STT_CONFIDENCE_THRESHOLD'
|
|
50
51
|
};
|
|
51
52
|
const Defaults = {
|
|
52
53
|
VOIP_STT_METHOD: 'POST',
|
|
@@ -58,11 +59,12 @@ const Defaults = {
|
|
|
58
59
|
VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',
|
|
59
60
|
VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?',
|
|
60
61
|
VOIP_WEBSOCKET_CONNECT_TIMEOUT: 4000,
|
|
61
|
-
VOIP_WEBSOCKET_CONNECT_MAXRETRIES:
|
|
62
|
+
VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 5,
|
|
62
63
|
VOIP_SILENCE_DURATION_TIMEOUT: 2500,
|
|
63
64
|
VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: false,
|
|
64
65
|
VOIP_SILENCE_DURATION_TIMEOUT_START: 1000,
|
|
65
|
-
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false
|
|
66
|
+
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false,
|
|
67
|
+
VOIP_STT_CONFIDENCE_THRESHOLD: 0.5
|
|
66
68
|
};
|
|
67
69
|
|
|
68
70
|
class BotiumConnectorVoip {
|
|
@@ -171,20 +173,37 @@ class BotiumConnectorVoip {
|
|
|
171
173
|
let data = null;
|
|
172
174
|
let headers = null;
|
|
173
175
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
176
|
+
const connect = async retryIndex => {
|
|
177
|
+
retryIndex = retryIndex || 0;
|
|
178
|
+
|
|
179
|
+
try {
|
|
180
|
+
const res = await axios({
|
|
181
|
+
method: 'post',
|
|
182
|
+
data: {
|
|
183
|
+
API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]
|
|
184
|
+
},
|
|
185
|
+
url: new URL(path.join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
if (res) {
|
|
189
|
+
data = res.data;
|
|
190
|
+
headers = res.headers;
|
|
191
|
+
}
|
|
192
|
+
} catch (err) {
|
|
193
|
+
debug$2(`Retry ${retryIndex} / ${this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]}: Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`);
|
|
187
194
|
|
|
195
|
+
if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {
|
|
196
|
+
throw new Error(`Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`);
|
|
197
|
+
} // Retry after the defined timeout
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
await new Promise(resolve => setTimeout(resolve, this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT])); // Retry the connection
|
|
201
|
+
|
|
202
|
+
await connect(retryIndex + 1);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
await connect();
|
|
188
207
|
return new Promise((resolve, reject) => {
|
|
189
208
|
const wsEndpoint = `${this.caps[Capabilities.VOIP_WORKER_URL]}/ws/${data.port}`;
|
|
190
209
|
|
|
@@ -278,8 +297,7 @@ class BotiumConnectorVoip {
|
|
|
278
297
|
|
|
279
298
|
const parsedDataLog = lodash.cloneDeep(parsedData);
|
|
280
299
|
|
|
281
|
-
parsedDataLog.fullRecord = '<full_record_buffer>';
|
|
282
|
-
debug$2(JSON.stringify(parsedDataLog, null, 2));
|
|
300
|
+
parsedDataLog.fullRecord = '<full_record_buffer>'; // debug(JSON.stringify(parsedDataLog, null, 2))
|
|
283
301
|
|
|
284
302
|
if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {
|
|
285
303
|
this.sessionId = parsedData.voipConfig.sessionId;
|
|
@@ -358,7 +376,7 @@ class BotiumConnectorVoip {
|
|
|
358
376
|
const isJoinMethod = this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN';
|
|
359
377
|
let matched = false;
|
|
360
378
|
|
|
361
|
-
if ((!lodash.isNil(joinLogicHook) && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {
|
|
379
|
+
if ((!lodash.isNil(joinLogicHook) && isJoinMethod && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {
|
|
362
380
|
matched = true;
|
|
363
381
|
} else if (lodash.isNil(joinLogicHook) && isJoinMethod && silenceDuration > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {
|
|
364
382
|
matched = true;
|
|
@@ -375,6 +393,9 @@ class BotiumConnectorVoip {
|
|
|
375
393
|
}
|
|
376
394
|
|
|
377
395
|
if (parsedData && parsedData.data && parsedData.data.type === 'stt' && parsedData.data.final) {
|
|
396
|
+
const successfulConfidenceScore = this._getConfidenceScore(parsedData) >= this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD];
|
|
397
|
+
debug$2(`Message: ${parsedData.data.message} / Confidence Score: ${this._getConfidenceScore(parsedData)} (Threshold: ${this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD]})`);
|
|
398
|
+
|
|
378
399
|
if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL' && lodash.isNil(this._getJoinLogicHook(this.convoStep))) {
|
|
379
400
|
let botMsg = {
|
|
380
401
|
messageText: parsedData.data.message
|
|
@@ -398,8 +419,12 @@ class BotiumConnectorVoip {
|
|
|
398
419
|
}
|
|
399
420
|
|
|
400
421
|
this.prevData = parsedData;
|
|
401
|
-
|
|
402
|
-
|
|
422
|
+
|
|
423
|
+
if (successfulConfidenceScore) {
|
|
424
|
+
this.botMsgs.push(botMsg);
|
|
425
|
+
this.botMsgs.forEach(botMsg => sendBotMsg(botMsg));
|
|
426
|
+
}
|
|
427
|
+
|
|
403
428
|
this.botMsgs = [];
|
|
404
429
|
}
|
|
405
430
|
|
|
@@ -426,9 +451,13 @@ class BotiumConnectorVoip {
|
|
|
426
451
|
}
|
|
427
452
|
|
|
428
453
|
this.prevData = parsedData;
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
454
|
+
|
|
455
|
+
if (successfulConfidenceScore) {
|
|
456
|
+
this.botMsgs.push(botMsg);
|
|
457
|
+
const botMsgsExpanded = splitBotMsgs(this.botMsgs);
|
|
458
|
+
botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg));
|
|
459
|
+
}
|
|
460
|
+
|
|
432
461
|
this.botMsgs = [];
|
|
433
462
|
}
|
|
434
463
|
|
|
@@ -437,16 +466,20 @@ class BotiumConnectorVoip {
|
|
|
437
466
|
messageText: parsedData.data.message,
|
|
438
467
|
sourceData: parsedData
|
|
439
468
|
};
|
|
440
|
-
this.botMsgs.push(botMsg);
|
|
441
469
|
this.prevData = parsedData;
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
470
|
+
|
|
471
|
+
if (successfulConfidenceScore) {
|
|
472
|
+
this.botMsgs.push(botMsg);
|
|
473
|
+
this.silenceTimeout = setTimeout(() => {
|
|
474
|
+
if (this.botMsgs.length > 0) {
|
|
475
|
+
debug$2(this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0]) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]);
|
|
476
|
+
sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg));
|
|
477
|
+
this.firstMsg = false;
|
|
478
|
+
this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1];
|
|
479
|
+
this.botMsgs = [];
|
|
480
|
+
}
|
|
481
|
+
}, this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0]) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]);
|
|
482
|
+
}
|
|
450
483
|
}
|
|
451
484
|
}
|
|
452
485
|
});
|
|
@@ -662,6 +695,19 @@ class BotiumConnectorVoip {
|
|
|
662
695
|
return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION');
|
|
663
696
|
}
|
|
664
697
|
|
|
698
|
+
_getConfidenceScore(parsedData) {
|
|
699
|
+
// Azure Speech Service
|
|
700
|
+
if (parsedData?.data?.source?.debug?.privJson) {
|
|
701
|
+
const privJson = JSON.parse(parsedData?.data?.source?.debug?.privJson);
|
|
702
|
+
|
|
703
|
+
if (privJson && privJson.NBest && privJson.NBest.length > 0) {
|
|
704
|
+
return Math.max(...privJson.NBest.map(n => n.Confidence));
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
return null;
|
|
709
|
+
}
|
|
710
|
+
|
|
665
711
|
}
|
|
666
712
|
|
|
667
713
|
var connector = BotiumConnectorVoip;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"botium-connector-voip-es.js","sources":["../src/connector.js","../src/ignore-sd-logichook.js","../src/join-logichook.js","../index.js"],"sourcesContent":["const WebSocket = require('ws')\nconst _ = require('lodash')\nconst axios = require('axios')\nconst debug = require('debug')('botium-connector-voip')\nconst path = require('path')\n\nconst Capabilities = {\n VOIP_STT_URL_STREAM: 'VOIP_STT_URL_STREAM',\n VOIP_STT_PARAMS_STREAM: 'VOIP_STT_PARAMS_STREAM',\n VOIP_STT_METHOD_STREAM: 'VOIP_STT_METHOD_STREAM',\n VOIP_STT_BODY_STREAM: 'VOIP_STT_BODY_STREAM',\n VOIP_STT_BODY: 'VOIP_STT_BODY',\n VOIP_STT_HEADERS: 'VOIP_STT_HEADERS',\n VOIP_STT_TIMEOUT: 'VOIP_STT_TIMEOUT',\n VOIP_STT_MESSAGE_HANDLING: 'VOIP_STT_MESSAGE_HANDLING',\n VOIP_STT_MESSAGE_HANDLING_TIMEOUT: 'VOIP_STT_MESSAGE_HANDLING_TIMEOUT',\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: 'VOIP_STT_MESSAGE_HANDLING_DELIMITER',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: 'VOIP_STT_MESSAGE_HANDLING_PUNCTUATION',\n VOIP_TTS_URL: 'VOIP_TTS_URL',\n VOIP_TTS_PARAMS: 'VOIP_TTS_PARAMS',\n VOIP_TTS_METHOD: 'VOIP_TTS_METHOD',\n VOIP_TTS_BODY: 'VOIP_TTS_BODY',\n VOIP_TTS_HEADERS: 'VOIP_TTS_HEADERS',\n VOIP_TTS_TIMEOUT: 'VOIP_TTS_TIMEOUT',\n VOIP_WORKER_URL: 'VOIP_WORKER_URL',\n VOIP_WORKER_APIKEY: 'VOIP_WORKER_APIKEY',\n VOIP_SIP_POOL_CALLER_ENABLE: 'VOIP_SIP_POOL_CALLER_ENABLE',\n VOIP_SIP_CALLER_REGISTRAR_URI: 'VOIP_SIP_CALLER_REGISTRAR_URI',\n VOIP_SIP_CALLER_ADDRESS: 'VOIP_SIP_CALLER_ADDRESS',\n VOIP_SIP_CALLER_USERNAME: 'VOIP_SIP_CALLER_USERNAME',\n VOIP_SIP_CALLER_PASSWORD: 'VOIP_SIP_CALLER_PASSWORD',\n VOIP_SIP_PROXY: 'VOIP_SIP_PROXY',\n VOIP_SIP_REG_HEADERS: 'VOIP_SIP_REG_HEADERS',\n VOIP_SIP_INVITE_HEADERS: 'VOIP_SIP_INVITE_HEADERS',\n VOIP_SIP_CALLEE_URI: 'VOIP_SIP_CALLEE_URI',\n VOIP_ICE_ENABLE: 'VOIP_ICE_ENABLE',\n VOIP_ICE_STUN_SERVERS: 'VOIP_ICE_STUN_SERVERS',\n VOIP_ICE_TURN_ENABLE: 'VOIP_ICE_TURN_ENABLE',\n VOIP_ICE_TURN_SERVER: 'VOIP_ICE_TURN_SERVER',\n VOIP_ICE_TURN_USER: 'VOIP_ICE_TURN_USER',\n VOIP_ICE_TURN_PASSWORD: 'VOIP_ICE_TURN_PASSWORD',\n VOIP_ICE_TURN_PROTOCOL: 'VOIP_ICE_TURN_PROTOCOL',\n VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 'VOIP_WEBSOCKET_CONNECT_MAXRETRIES',\n VOIP_WEBSOCKET_CONNECT_TIMEOUT: 'VOIP_WEBSOCKET_CONNECT_TIMEOUT',\n VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_ENABLE',\n VOIP_SILENCE_DURATION_TIMEOUT: 'VOIP_SILENCE_DURATION_TIMEOUT',\n VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE',\n VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START'\n}\n\nconst Defaults = {\n VOIP_STT_METHOD: 'POST',\n VOIP_STT_TIMEOUT: 10000,\n VOIP_TTS_METHOD: 'GET',\n VOIP_TTS_TIMEOUT: 10000,\n VOIP_STT_MESSAGE_HANDLING: 'ORIGINAL',\n VOIP_STT_MESSAGE_HANDLING_TIMEOUT: 2500,\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?',\n VOIP_WEBSOCKET_CONNECT_TIMEOUT: 4000,\n VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 20,\n VOIP_SILENCE_DURATION_TIMEOUT: 2500,\n VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: false,\n VOIP_SILENCE_DURATION_TIMEOUT_START: 1000,\n VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false\n}\n\nclass BotiumConnectorVoip {\n constructor ({ queueBotSays, eventEmitter, caps }) {\n this.queueBotSays = queueBotSays\n this.caps = caps\n this.eventEmitter = eventEmitter\n this.botMsgs = []\n this.sentencesBuilding = 0\n this.sentencesFinal = 0\n this.sentenceBuilding = false\n }\n\n async Validate () {\n debug('Validate called')\n debug(this.caps.VOIP_STT_MESSAGE_HANDLING)\n\n if (this.caps.VOIP_TTS_URL) {\n this.axiosTtsParams = {\n url: this.caps.VOIP_TTS_URL,\n params: this._getParams(Capabilities.VOIP_TTS_PARAMS),\n method: this.caps.VOIP_TTS_METHOD,\n timeout: this.caps.VOIP_TTS_TIMEOUT,\n headers: this._getHeaders(Capabilities.VOIP_TTS_HEADERS)\n }\n try {\n const { data } = await axios({\n ...this.axiosTtsParams,\n url: this._getAxiosUrl(this.caps.VOIP_TTS_URL, '/api/status')\n })\n if (data && data.status === 'OK') {\n debug(`Checking TTS Status response: ${this._getAxiosShortenedOutput(data)}`)\n } else {\n throw new Error(`Checking TTS Status failed, response is: ${this._getAxiosShortenedOutput(data)}`)\n }\n } catch (err) {\n throw new Error(`Checking TTS Status failed - ${this._getAxiosErrOutput(err)}`)\n }\n }\n\n this.caps = Object.assign({}, Defaults, this.caps)\n }\n\n async Start () {\n debug('Start called')\n debug(this.caps[Capabilities.VOIP_TTS_URL])\n\n this.stopCalled = false\n\n this.fullRecord = ''\n this.end = false\n this.connected = false\n this.convoStep = null\n\n const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }\n\n const joinBotMsg = (botMsgs, joinLastPrevMsg) => {\n const botMsg = {}\n botMsg.messageText = botMsgs.map(m => m.messageText).join(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_DELIMITER])\n botMsg.sourceData = botMsgs.map(m => m.sourceData)\n if (_.isNil(joinLastPrevMsg)) {\n botMsg.sourceData[0].silenceDuration = botMsgs[0].sourceData.data.start\n botMsg.sourceData[0].voiceDuration = botMsgs[botMsgs.length - 1].sourceData.data.end - botMsgs[0].sourceData.data.start\n } else {\n botMsg.sourceData[0].silenceDuration = botMsgs[0].sourceData.data.start - joinLastPrevMsg.sourceData.data.end\n botMsg.sourceData[0].voiceDuration = botMsgs[botMsgs.length - 1].sourceData.data.end - botMsgs[0].sourceData.data.start\n }\n return botMsg\n }\n\n const splitBotMsgs = botMsgs => {\n const splitSentences = s => s.match(new RegExp(`[^${this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_PUNCTUATION]}]+[${this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_PUNCTUATION]}]+`, 'g'))\n const botMsgsFinal = []\n for (const botMsg of botMsgs) {\n const sentences = splitSentences(botMsg.messageText)\n if (_.isNil(sentences)) {\n botMsgsFinal.push(botMsg)\n } else {\n let botMsgCount = 0\n for (const sentence of sentences) {\n botMsgsFinal.push({\n messageText: sentence,\n sourceData: (botMsgCount === 0) ? botMsg.sourceData : _.omit(botMsg.sourceData, ['silenceDuration'])\n })\n botMsgCount++\n }\n }\n }\n return botMsgsFinal\n }\n\n let data = null\n let headers = null\n try {\n const res = await axios({\n method: 'post',\n data: {\n API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]\n },\n url: new URL(path.join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()\n })\n data = res.data\n headers = res.headers\n } catch (err) {\n return Promise.reject(new Error(`Connecting to VOIP Worker failed: ${err.response.data.message || 'Not reachable'}`))\n }\n\n return new Promise((resolve, reject) => {\n const wsEndpoint = `${this.caps[Capabilities.VOIP_WORKER_URL]}/ws/${data.port}`\n const connect = (retryIndex) => {\n retryIndex = retryIndex || 0\n return new Promise((resolve, reject) => {\n if ('set-cookie' in headers) {\n this.ws = new WebSocket(wsEndpoint, {\n headers: {\n Cookie: headers['set-cookie']\n }\n })\n } else {\n this.ws = new WebSocket(wsEndpoint)\n }\n this.ws.on('open', () => {\n resolve()\n })\n this.ws.on('error', () => {\n if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {\n reject(new Error(`Websocket connection failed to ${wsEndpoint}`))\n }\n setTimeout(() => connect(retryIndex + 1).then(resolve).catch(reject), this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT])\n })\n })\n }\n connect().then(() => {\n if (!_.isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {\n if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {\n this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = []\n } else {\n this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = this.caps[Capabilities.VOIP_ICE_STUN_SERVERS].split(',')\n }\n }\n\n this.eventEmitter.on('CONVO_STEP_NEXT', (container, convoStep) => {\n this.convoStep = convoStep\n })\n\n this.silence = null\n this.msgCount = 0\n this.firstMsg = true\n this.firstSttInfoReceived = false\n this.silenceTimeout = null\n\n this.wsOpened = true\n debug(`Websocket connection to ${wsEndpoint} opened.`)\n const request = {\n METHOD: 'initCall',\n SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],\n SIP_PROXY: this.caps[Capabilities.VOIP_SIP_PROXY],\n SIP_CALLER_URI: this.caps[Capabilities.VOIP_SIP_CALLER_URI],\n SIP_CALLER_USERNAME: this.caps[Capabilities.VOIP_SIP_CALLER_USERNAME],\n SIP_CALLER_PASSWORD: this.caps[Capabilities.VOIP_SIP_CALLER_PASSWORD],\n SIP_CALLER_ADDRESS: this.caps[Capabilities.VOIP_SIP_CALLER_ADDRESS],\n SIP_CALLER_REGISTRAR_URI: this.caps[Capabilities.VOIP_SIP_CALLER_REGISTRAR_URI],\n SIP_CALLEE_URI: this.caps[Capabilities.VOIP_SIP_CALLEE_URI],\n SIP_REG_HEADERS: this.caps[Capabilities.VOIP_SIP_REG_HEADERS],\n SIP_INVITE_HEADERS: this.caps[Capabilities.VOIP_SIP_INVITE_HEADERS],\n ICE_ENABLE: this.caps[Capabilities.VOIP_ICE_ENABLE],\n ICE_STUN_SERVERS: this.caps[Capabilities.VOIP_ICE_STUN_SERVERS],\n ICE_TURN_SERVER: this.caps[Capabilities.VOIP_ICE_TURN_SERVER],\n ICE_TURN_USERNAME: this.caps[Capabilities.VOIP_ICE_TURN_USER],\n ICE_TURN_PASSWORD: this.caps[Capabilities.VOIP_ICE_TURN_PASSWORD],\n ICE_TURN_PROTOCOL: this.caps[Capabilities.VOIP_ICE_TURN_PROTOCOL] || 'TCP',\n MIN_SILENCE_DURATION: this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_ENABLE] ? this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT] : null,\n STT_CONFIG: {\n stt_url: this.caps[Capabilities.VOIP_STT_URL_STREAM],\n stt_params: this.caps[Capabilities.VOIP_STT_PARAMS_STREAM],\n stt_body: this.caps[Capabilities.VOIP_STT_BODY_STREAM] || null\n },\n TTS_CONFIG: {\n tts_url: this.caps[Capabilities.VOIP_TTS_URL],\n tts_params: this.caps[Capabilities.VOIP_TTS_PARAMS],\n tts_body: this.caps[Capabilities.VOIP_TTS_BODY] || null\n }\n }\n\n debug(JSON.stringify(request, null, 2))\n this.ws.send(JSON.stringify(request))\n\n this.ws.on('error', (err) => {\n debug(err)\n if (!this.wsOpened) {\n this.end = true\n reject(new Error(`${this.sessionId} - Websocket connection to ${wsEndpoint} error: ${err.message || err}`))\n }\n })\n this.ws.on('message', async (data) => {\n const parsedData = JSON.parse(data)\n\n const parsedDataLog = _.cloneDeep(parsedData)\n parsedDataLog.fullRecord = '<full_record_buffer>'\n\n debug(JSON.stringify(parsedDataLog, null, 2))\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {\n this.sessionId = parsedData.voipConfig.sessionId\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'unauthorized') {\n reject(new Error('Error: Cannot open a call: SIP Authorization failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event === 'onCallRegState') {\n reject(new Error('Error: Sip Registration failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {\n resolve()\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'disconnected') {\n const apiKey = this._extractApiKey(this._getBody(Capabilities.VOIP_STT_BODY))\n if (parsedData.connectDuration && parsedData.connectDuration > 0) {\n this.eventEmitter.emit('CONSUMPTION_METADATA', this, {\n type: _.isNil(apiKey) ? 'INBUILT' : 'THIRD_PARTY',\n category: 'e2eVoiceIvr',\n metricName: 'consumption.e2e.voip.stt.seconds',\n credits: parsedData.connectDuration,\n apiKey\n })\n }\n }\n\n if (parsedData && parsedData.type === 'error') {\n this.end = true\n reject(new Error(`Error: ${parsedData.message}`))\n sendBotMsg(new Error(`Error: ${parsedData.message}`))\n }\n\n if (parsedData && parsedData.type === 'silence') {\n if (_.isNil(this._getIgnoreSilenceDurationAsserterLogicHook(this.convoStep))) {\n if (_.isNil(this._getJoinLogicHook(this.convoStep)) && parsedData.data.silence.length > 0) {\n this.end = true\n sendBotMsg(new Error(`Silence Duration of ${parsedData.data.silence[0][2].toFixed(2)}s exceeded General Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT] / 1000}s`))\n }\n }\n }\n\n if (parsedData && parsedData.type === 'fullRecord') {\n this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {\n name: 'full_record.wav',\n mimeType: 'audio/wav',\n base64: parsedData.fullRecord\n })\n this.end = true\n }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (this.silenceTimeout) {\n clearTimeout(this.silenceTimeout)\n }\n if (_.isNil(this._getIgnoreSilenceDurationAsserterLogicHook(this.convoStep))) {\n if (!this.firstSttInfoReceived && _.isNil(this._getJoinLogicHook(this.convoStep)) && this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {\n this.end = true\n sendBotMsg(new Error(`Silence Duration of ${parsedData.data.start}s exceeded Initial Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START] / 1000}s`))\n }\n }\n this.firstSttInfoReceived = true\n if (this.prevData) {\n if (!_.isNil(parsedData.data.start)) {\n const silenceDuration = parsedData.data.start - this.prevData.data.end\n const joinLogicHook = this._getJoinLogicHook(this.convoStep)\n const isJoinMethod = this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN'\n let matched = false\n if ((!_.isNil(joinLogicHook) && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {\n matched = true\n } else if ((_.isNil(joinLogicHook) && isJoinMethod && (silenceDuration > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000))) {\n matched = true\n }\n if (matched && this.botMsgs.length > 0) {\n sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))\n this.firstMsg = false\n this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]\n this.botMsgs = []\n }\n }\n }\n }\n\n if (parsedData && parsedData.data && parsedData.data.type === 'stt' && parsedData.data.final) {\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL' && (_.isNil(this._getJoinLogicHook(this.convoStep)))) {\n let botMsg = { messageText: parsedData.data.message }\n if (this.firstMsg) {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n this.firstMsg = false\n } else {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start - this.prevData.data.end\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n }\n this.prevData = parsedData\n this.botMsgs.push(botMsg)\n this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'SPLIT' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {\n let botMsg = { messageText: parsedData.data.message }\n if (this.firstMsg) {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n this.firstMsg = false\n } else {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start - this.prevData.data.end\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n }\n this.prevData = parsedData\n this.botMsgs.push(botMsg)\n const botMsgsExpanded = splitBotMsgs(this.botMsgs)\n botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT' || !_.isNil(this._getJoinLogicHook(this.convoStep))) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n this.prevData = parsedData\n this.silenceTimeout = setTimeout(() => {\n if (this.botMsgs.length > 0) {\n sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))\n this.firstMsg = false\n this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]\n this.botMsgs = []\n }\n }, (this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0])) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n }\n }\n })\n }).catch(err => {\n reject(new Error('Error: ' + err))\n })\n })\n }\n\n async UserSays (msg) {\n debug('UserSays called')\n\n debug(msg)\n\n if (!msg.attachments) {\n msg.attachments = []\n }\n return new Promise((resolve, reject) => {\n setTimeout(async () => {\n let duration = 0\n if (msg && msg.buttons && msg.buttons.length > 0) {\n const request = JSON.stringify({\n METHOD: 'sendDtmf',\n digits: msg.buttons[0].payload,\n sessionId: this.sessionId\n })\n this.ws.send(request)\n } else if (msg && msg.messageText) {\n if (!this.axiosTtsParams) reject(new Error('TTS not configured, only audio input supported'))\n if (this.axiosTtsParams) {\n const ttsRequest = {\n ...this.axiosTtsParams,\n params: {\n ...(this.axiosTtsParams.params || {}),\n text: msg.messageText\n },\n data: this._getBody(Capabilities.VOIP_TTS_BODY),\n responseType: 'arraybuffer'\n }\n msg.sourceData = ttsRequest\n\n let ttsResponse = null\n try {\n ttsResponse = await axios(ttsRequest)\n } catch (err) {\n reject(new Error(`TTS \"${msg.messageText}\" failed - ${this._getAxiosErrOutput(err)}`))\n }\n if (msg && msg.messageText && msg.messageText.length > 0) {\n const apiKey = this._extractApiKey(this._getBody(Capabilities.VOIP_TTS_BODY))\n this.eventEmitter.emit('CONSUMPTION_METADATA', this.container, {\n type: _.isNil(apiKey) ? 'INBUILT' : 'THIRD_PARTY',\n metricName: 'consumption.e2e.voip.tts.characters',\n credits: msg.messageText.length,\n apiKey\n })\n }\n if (Buffer.isBuffer(ttsResponse.data)) {\n duration = ttsResponse.headers['content-duration']\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n PESQ: false,\n sessionId: this.sessionId,\n b64_buffer: ttsResponse.data.toString('base64')\n })\n msg.attachments.push({\n name: 'tts.wav',\n mimeType: 'audio/wav',\n base64: ttsResponse.data.toString('base64')\n })\n this.ws.send(request)\n } else {\n reject(new Error(`TTS failed, response is: ${this._getAxiosShortenedOutput(ttsResponse.data)}`))\n }\n }\n }\n if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n sessionId: this.sessionId,\n b64_buffer: msg.media[0].buffer.toString('base64')\n })\n this.ws.send(request)\n msg.attachments.push({\n name: msg.media[0].mediaUri,\n mimeType: msg.media[0].mimeType,\n base64: msg.media[0].buffer.toString('base64')\n })\n const { data } = await axios({\n method: 'post',\n data: msg.media[0].buffer,\n headers: {\n ...this._getHeaders(Capabilities.VOIP_TTS_HEADERS),\n 'Content-Type': 'audio/wave'\n },\n url: this._getAxiosUrl(this.caps.VOIP_TTS_URL, '/api/audio/info'),\n maxContentLength: Infinity,\n maxBodyLength: Infinity\n })\n if (data && data.duration) {\n duration = parseInt(data.duration)\n } else {\n reject(new Error('Getting audio duration from Speech Api failed'))\n }\n }\n setTimeout(resolve, duration * 1000)\n }, 0)\n })\n }\n\n async Stop () {\n debug(`${this.sessionId} - Stop called`)\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n const request = JSON.stringify({\n METHOD: 'stopCall',\n sessionId: this.sessionId\n })\n this.ws.send(request)\n await new Promise(resolve => {\n setTimeout(resolve, 100000)\n setInterval(() => {\n if (this.end) {\n this.wsOpened = false\n this.ws = null\n this.end = false\n this.convoStep = null\n this.firstSttInfoReceived = false\n resolve()\n }\n }, 100)\n })\n } else {\n this.wsOpened = false\n this.ws = null\n this.end = false\n this.convoStep = null\n this.firstSttInfoReceived = false\n }\n }\n\n _getParams (capParams) {\n if (this.caps[capParams]) {\n if (_.isString(this.caps[capParams])) return JSON.parse(this.caps[capParams])\n else return this.caps[capParams]\n }\n return {}\n }\n\n _getBody (capBody) {\n if (this.caps[capBody]) {\n if (_.isString(this.caps[capBody])) return JSON.parse(this.caps[capBody])\n else return this.caps[capBody]\n }\n return null\n }\n\n _getHeaders (capHeaders) {\n if (this.caps[capHeaders]) {\n if (_.isString(this.caps[capHeaders])) return JSON.parse(this.caps[capHeaders])\n else return this.caps[capHeaders]\n }\n return {}\n }\n\n _getAxiosUrl (baseUrl, extUrl) {\n return baseUrl.substr(0, baseUrl.indexOf('/', 8)) + extUrl\n }\n\n _getAxiosShortenedOutput (data) {\n if (data) {\n if (_.isBuffer(data)) {\n try {\n data = data.toString()\n } catch (err) {\n }\n }\n return _.truncate(_.isString(data) ? data : JSON.stringify(data), { length: 200 })\n } else {\n return ''\n }\n }\n\n _getAxiosErrOutput (err) {\n if (err && err.response) {\n return `Status: ${err.response.status} / Response: ${this._getAxiosShortenedOutput(err.response.data)}`\n } else {\n return err.message\n }\n }\n\n _extractApiKey (body) {\n return _.get(body, 'polly.credentials.accessKeyId') ||\n _.get(body, 'google.credentials.client_email') ||\n _.get(body, 'ibm.credentials.apikey') ||\n _.get(body, 'awstranscribe.credentials.accessKeyId') ||\n _.get(body, 'azure.credentials.subscriptionKey') ||\n null\n }\n\n _getJoinLogicHook (convoStep) {\n if (_.isNil(convoStep)) return null\n if (_.isNil(convoStep.logicHooks)) return null\n return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_JOIN_SILENCE_DURATION')\n }\n\n _getIgnoreSilenceDurationAsserterLogicHook (convoStep) {\n if (_.isNil(convoStep)) return null\n if (_.isNil(convoStep.logicHooks)) return null\n return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')\n }\n}\n\nmodule.exports = BotiumConnectorVoip\n","const debug = require('debug')('botium-voip-logichook-ignore-silence-duration')\n\nmodule.exports = class IgnoreSilenceDurationLogicHook {\n constructor (context, caps = {}, args = {}) {\n this.context = context\n this.caps = caps\n this.globalArgs = args\n }\n\n async onBotPrepare (props) {\n debug('Silence duration assertion ignored by logic hook')\n }\n}\n","const debug = require('debug')('botium-voip-logichook-join-silence-duration')\n\nmodule.exports = class JoinLogicHook {\n constructor (context, caps = {}, args = {}) {\n this.context = context\n this.caps = caps\n this.globalArgs = args\n }\n\n async onBotPrepare (props) {\n debug('Joined bot messages because of JOIN logic hook')\n }\n}\n","const BotiumConnectorVoip = require('./src/connector')\nconst IgnoreSilenceDurationLogicHook = require('./src/ignore-sd-logichook')\nconst JoinLogicHook = require('./src/join-logichook')\n\nmodule.exports = {\n PluginVersion: 1,\n PluginClass: BotiumConnectorVoip,\n PluginDesc: {\n name: 'Voice over IP',\n provider: 'Botium',\n features: {\n audioInput: true,\n e2eTesting: true\n },\n capabilities: [\n {\n name: 'VOIP_STT',\n label: 'Speech Recognition Profile',\n type: 'speechrecognitionprofile',\n required: true\n },\n {\n name: 'VOIP_TTS',\n label: 'Speech Synthesis Profile',\n type: 'speechsynthesisprofile',\n required: true\n }\n ]\n },\n PluginLogicHooks: {\n VOIP_IGNORE_SILENCE_DURATION: IgnoreSilenceDurationLogicHook,\n VOIP_JOIN_SILENCE_DURATION: JoinLogicHook\n }\n}\n"],"names":["debug","require$$0","Capabilities","VOIP_STT_URL_STREAM","VOIP_STT_PARAMS_STREAM","VOIP_STT_METHOD_STREAM","VOIP_STT_BODY_STREAM","VOIP_STT_BODY","VOIP_STT_HEADERS","VOIP_STT_TIMEOUT","VOIP_STT_MESSAGE_HANDLING","VOIP_STT_MESSAGE_HANDLING_TIMEOUT","VOIP_STT_MESSAGE_HANDLING_DELIMITER","VOIP_STT_MESSAGE_HANDLING_PUNCTUATION","VOIP_TTS_URL","VOIP_TTS_PARAMS","VOIP_TTS_METHOD","VOIP_TTS_BODY","VOIP_TTS_HEADERS","VOIP_TTS_TIMEOUT","VOIP_WORKER_URL","VOIP_WORKER_APIKEY","VOIP_SIP_POOL_CALLER_ENABLE","VOIP_SIP_CALLER_REGISTRAR_URI","VOIP_SIP_CALLER_ADDRESS","VOIP_SIP_CALLER_USERNAME","VOIP_SIP_CALLER_PASSWORD","VOIP_SIP_PROXY","VOIP_SIP_REG_HEADERS","VOIP_SIP_INVITE_HEADERS","VOIP_SIP_CALLEE_URI","VOIP_ICE_ENABLE","VOIP_ICE_STUN_SERVERS","VOIP_ICE_TURN_ENABLE","VOIP_ICE_TURN_SERVER","VOIP_ICE_TURN_USER","VOIP_ICE_TURN_PASSWORD","VOIP_ICE_TURN_PROTOCOL","VOIP_WEBSOCKET_CONNECT_MAXRETRIES","VOIP_WEBSOCKET_CONNECT_TIMEOUT","VOIP_SILENCE_DURATION_TIMEOUT_ENABLE","VOIP_SILENCE_DURATION_TIMEOUT","VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE","VOIP_SILENCE_DURATION_TIMEOUT_START","Defaults","VOIP_STT_METHOD","BotiumConnectorVoip","constructor","queueBotSays","eventEmitter","caps","botMsgs","sentencesBuilding","sentencesFinal","sentenceBuilding","Validate","axiosTtsParams","url","params","_getParams","method","timeout","headers","_getHeaders","data","axios","_getAxiosUrl","status","_getAxiosShortenedOutput","Error","err","_getAxiosErrOutput","Object","assign","Start","stopCalled","fullRecord","end","connected","convoStep","sendBotMsg","botMsg","setTimeout","joinBotMsg","joinLastPrevMsg","messageText","map","m","join","sourceData","_","isNil","silenceDuration","start","voiceDuration","length","splitBotMsgs","splitSentences","s","match","RegExp","botMsgsFinal","sentences","push","botMsgCount","sentence","omit","res","API_KEY","URL","path","replace","toString","Promise","reject","response","message","resolve","wsEndpoint","port","connect","retryIndex","ws","WebSocket","Cookie","on","then","catch","isArray","split","container","silence","msgCount","firstMsg","firstSttInfoReceived","silenceTimeout","wsOpened","request","METHOD","SIP_CALLER_AUTO","SIP_PROXY","SIP_CALLER_URI","VOIP_SIP_CALLER_URI","SIP_CALLER_USERNAME","SIP_CALLER_PASSWORD","SIP_CALLER_ADDRESS","SIP_CALLER_REGISTRAR_URI","SIP_CALLEE_URI","SIP_REG_HEADERS","SIP_INVITE_HEADERS","ICE_ENABLE","ICE_STUN_SERVERS","ICE_TURN_SERVER","ICE_TURN_USERNAME","ICE_TURN_PASSWORD","ICE_TURN_PROTOCOL","MIN_SILENCE_DURATION","STT_CONFIG","stt_url","stt_params","stt_body","TTS_CONFIG","tts_url","tts_params","tts_body","JSON","stringify","send","sessionId","parsedData","parse","parsedDataLog","cloneDeep","type","voipConfig","event","apiKey","_extractApiKey","_getBody","connectDuration","emit","category","metricName","credits","_getIgnoreSilenceDurationAsserterLogicHook","_getJoinLogicHook","toFixed","name","mimeType","base64","final","clearTimeout","prevData","joinLogicHook","isJoinMethod","matched","parseInt","args","forEach","botMsgsExpanded","UserSays","msg","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","media","buffer","mediaUri","maxContentLength","Infinity","maxBodyLength","Stop","readyState","CLOSED","setInterval","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","body","get","logicHooks","find","lh","IgnoreSilenceDurationLogicHook","context","globalArgs","onBotPrepare","props","JoinLogicHook","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required","PluginLogicHooks","VOIP_IGNORE_SILENCE_DURATION","VOIP_JOIN_SILENCE_DURATION"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"botium-connector-voip-es.js","sources":["../src/connector.js","../src/ignore-sd-logichook.js","../src/join-logichook.js","../index.js"],"sourcesContent":["const WebSocket = require('ws')\nconst _ = require('lodash')\nconst axios = require('axios')\nconst debug = require('debug')('botium-connector-voip')\nconst path = require('path')\n\nconst Capabilities = {\n VOIP_STT_URL_STREAM: 'VOIP_STT_URL_STREAM',\n VOIP_STT_PARAMS_STREAM: 'VOIP_STT_PARAMS_STREAM',\n VOIP_STT_METHOD_STREAM: 'VOIP_STT_METHOD_STREAM',\n VOIP_STT_BODY_STREAM: 'VOIP_STT_BODY_STREAM',\n VOIP_STT_BODY: 'VOIP_STT_BODY',\n VOIP_STT_HEADERS: 'VOIP_STT_HEADERS',\n VOIP_STT_TIMEOUT: 'VOIP_STT_TIMEOUT',\n VOIP_STT_MESSAGE_HANDLING: 'VOIP_STT_MESSAGE_HANDLING',\n VOIP_STT_MESSAGE_HANDLING_TIMEOUT: 'VOIP_STT_MESSAGE_HANDLING_TIMEOUT',\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: 'VOIP_STT_MESSAGE_HANDLING_DELIMITER',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: 'VOIP_STT_MESSAGE_HANDLING_PUNCTUATION',\n VOIP_TTS_URL: 'VOIP_TTS_URL',\n VOIP_TTS_PARAMS: 'VOIP_TTS_PARAMS',\n VOIP_TTS_METHOD: 'VOIP_TTS_METHOD',\n VOIP_TTS_BODY: 'VOIP_TTS_BODY',\n VOIP_TTS_HEADERS: 'VOIP_TTS_HEADERS',\n VOIP_TTS_TIMEOUT: 'VOIP_TTS_TIMEOUT',\n VOIP_WORKER_URL: 'VOIP_WORKER_URL',\n VOIP_WORKER_APIKEY: 'VOIP_WORKER_APIKEY',\n VOIP_SIP_POOL_CALLER_ENABLE: 'VOIP_SIP_POOL_CALLER_ENABLE',\n VOIP_SIP_CALLER_REGISTRAR_URI: 'VOIP_SIP_CALLER_REGISTRAR_URI',\n VOIP_SIP_CALLER_ADDRESS: 'VOIP_SIP_CALLER_ADDRESS',\n VOIP_SIP_CALLER_USERNAME: 'VOIP_SIP_CALLER_USERNAME',\n VOIP_SIP_CALLER_PASSWORD: 'VOIP_SIP_CALLER_PASSWORD',\n VOIP_SIP_PROXY: 'VOIP_SIP_PROXY',\n VOIP_SIP_REG_HEADERS: 'VOIP_SIP_REG_HEADERS',\n VOIP_SIP_INVITE_HEADERS: 'VOIP_SIP_INVITE_HEADERS',\n VOIP_SIP_CALLEE_URI: 'VOIP_SIP_CALLEE_URI',\n VOIP_ICE_ENABLE: 'VOIP_ICE_ENABLE',\n VOIP_ICE_STUN_SERVERS: 'VOIP_ICE_STUN_SERVERS',\n VOIP_ICE_TURN_ENABLE: 'VOIP_ICE_TURN_ENABLE',\n VOIP_ICE_TURN_SERVER: 'VOIP_ICE_TURN_SERVER',\n VOIP_ICE_TURN_USER: 'VOIP_ICE_TURN_USER',\n VOIP_ICE_TURN_PASSWORD: 'VOIP_ICE_TURN_PASSWORD',\n VOIP_ICE_TURN_PROTOCOL: 'VOIP_ICE_TURN_PROTOCOL',\n VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 'VOIP_WEBSOCKET_CONNECT_MAXRETRIES',\n VOIP_WEBSOCKET_CONNECT_TIMEOUT: 'VOIP_WEBSOCKET_CONNECT_TIMEOUT',\n VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_ENABLE',\n VOIP_SILENCE_DURATION_TIMEOUT: 'VOIP_SILENCE_DURATION_TIMEOUT',\n VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE',\n VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START',\n VOIP_STT_CONFIDENCE_THRESHOLD: 'VOIP_STT_CONFIDENCE_THRESHOLD'\n}\n\nconst Defaults = {\n VOIP_STT_METHOD: 'POST',\n VOIP_STT_TIMEOUT: 10000,\n VOIP_TTS_METHOD: 'GET',\n VOIP_TTS_TIMEOUT: 10000,\n VOIP_STT_MESSAGE_HANDLING: 'ORIGINAL',\n VOIP_STT_MESSAGE_HANDLING_TIMEOUT: 2500,\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?',\n VOIP_WEBSOCKET_CONNECT_TIMEOUT: 4000,\n VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 5,\n VOIP_SILENCE_DURATION_TIMEOUT: 2500,\n VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: false,\n VOIP_SILENCE_DURATION_TIMEOUT_START: 1000,\n VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false,\n VOIP_STT_CONFIDENCE_THRESHOLD: 0.5\n}\n\nclass BotiumConnectorVoip {\n constructor ({ queueBotSays, eventEmitter, caps }) {\n this.queueBotSays = queueBotSays\n this.caps = caps\n this.eventEmitter = eventEmitter\n this.botMsgs = []\n this.sentencesBuilding = 0\n this.sentencesFinal = 0\n this.sentenceBuilding = false\n }\n\n async Validate () {\n debug('Validate called')\n debug(this.caps.VOIP_STT_MESSAGE_HANDLING)\n\n if (this.caps.VOIP_TTS_URL) {\n this.axiosTtsParams = {\n url: this.caps.VOIP_TTS_URL,\n params: this._getParams(Capabilities.VOIP_TTS_PARAMS),\n method: this.caps.VOIP_TTS_METHOD,\n timeout: this.caps.VOIP_TTS_TIMEOUT,\n headers: this._getHeaders(Capabilities.VOIP_TTS_HEADERS)\n }\n try {\n const { data } = await axios({\n ...this.axiosTtsParams,\n url: this._getAxiosUrl(this.caps.VOIP_TTS_URL, '/api/status')\n })\n if (data && data.status === 'OK') {\n debug(`Checking TTS Status response: ${this._getAxiosShortenedOutput(data)}`)\n } else {\n throw new Error(`Checking TTS Status failed, response is: ${this._getAxiosShortenedOutput(data)}`)\n }\n } catch (err) {\n throw new Error(`Checking TTS Status failed - ${this._getAxiosErrOutput(err)}`)\n }\n }\n\n this.caps = Object.assign({}, Defaults, this.caps)\n }\n\n async Start () {\n debug('Start called')\n debug(this.caps[Capabilities.VOIP_TTS_URL])\n\n this.stopCalled = false\n\n this.fullRecord = ''\n this.end = false\n this.connected = false\n this.convoStep = null\n\n const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }\n\n const joinBotMsg = (botMsgs, joinLastPrevMsg) => {\n const botMsg = {}\n botMsg.messageText = botMsgs.map(m => m.messageText).join(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_DELIMITER])\n botMsg.sourceData = botMsgs.map(m => m.sourceData)\n if (_.isNil(joinLastPrevMsg)) {\n botMsg.sourceData[0].silenceDuration = botMsgs[0].sourceData.data.start\n botMsg.sourceData[0].voiceDuration = botMsgs[botMsgs.length - 1].sourceData.data.end - botMsgs[0].sourceData.data.start\n } else {\n botMsg.sourceData[0].silenceDuration = botMsgs[0].sourceData.data.start - joinLastPrevMsg.sourceData.data.end\n botMsg.sourceData[0].voiceDuration = botMsgs[botMsgs.length - 1].sourceData.data.end - botMsgs[0].sourceData.data.start\n }\n return botMsg\n }\n\n const splitBotMsgs = botMsgs => {\n const splitSentences = s => s.match(new RegExp(`[^${this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_PUNCTUATION]}]+[${this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_PUNCTUATION]}]+`, 'g'))\n const botMsgsFinal = []\n for (const botMsg of botMsgs) {\n const sentences = splitSentences(botMsg.messageText)\n if (_.isNil(sentences)) {\n botMsgsFinal.push(botMsg)\n } else {\n let botMsgCount = 0\n for (const sentence of sentences) {\n botMsgsFinal.push({\n messageText: sentence,\n sourceData: (botMsgCount === 0) ? botMsg.sourceData : _.omit(botMsg.sourceData, ['silenceDuration'])\n })\n botMsgCount++\n }\n }\n }\n return botMsgsFinal\n }\n\n let data = null\n let headers = null\n const connect = async (retryIndex) => {\n retryIndex = retryIndex || 0\n try {\n const res = await axios({\n method: 'post',\n data: {\n API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]\n },\n url: new URL(path.join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()\n })\n if (res) {\n data = res.data\n headers = res.headers\n }\n } catch (err) {\n debug(`Retry ${retryIndex} / ${this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]}: Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`)\n if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {\n throw new Error(`Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`)\n }\n // Retry after the defined timeout\n await new Promise(resolve => setTimeout(resolve, this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT]))\n\n // Retry the connection\n await connect(retryIndex + 1)\n }\n }\n await connect()\n\n return new Promise((resolve, reject) => {\n const wsEndpoint = `${this.caps[Capabilities.VOIP_WORKER_URL]}/ws/${data.port}`\n const connect = (retryIndex) => {\n retryIndex = retryIndex || 0\n return new Promise((resolve, reject) => {\n if ('set-cookie' in headers) {\n this.ws = new WebSocket(wsEndpoint, {\n headers: {\n Cookie: headers['set-cookie']\n }\n })\n } else {\n this.ws = new WebSocket(wsEndpoint)\n }\n this.ws.on('open', () => {\n resolve()\n })\n this.ws.on('error', () => {\n if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {\n reject(new Error(`Websocket connection failed to ${wsEndpoint}`))\n }\n setTimeout(() => connect(retryIndex + 1).then(resolve).catch(reject), this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT])\n })\n })\n }\n connect().then(() => {\n if (!_.isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {\n if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {\n this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = []\n } else {\n this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = this.caps[Capabilities.VOIP_ICE_STUN_SERVERS].split(',')\n }\n }\n\n this.eventEmitter.on('CONVO_STEP_NEXT', (container, convoStep) => {\n this.convoStep = convoStep\n })\n\n this.silence = null\n this.msgCount = 0\n this.firstMsg = true\n this.firstSttInfoReceived = false\n this.silenceTimeout = null\n\n this.wsOpened = true\n debug(`Websocket connection to ${wsEndpoint} opened.`)\n const request = {\n METHOD: 'initCall',\n SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],\n SIP_PROXY: this.caps[Capabilities.VOIP_SIP_PROXY],\n SIP_CALLER_URI: this.caps[Capabilities.VOIP_SIP_CALLER_URI],\n SIP_CALLER_USERNAME: this.caps[Capabilities.VOIP_SIP_CALLER_USERNAME],\n SIP_CALLER_PASSWORD: this.caps[Capabilities.VOIP_SIP_CALLER_PASSWORD],\n SIP_CALLER_ADDRESS: this.caps[Capabilities.VOIP_SIP_CALLER_ADDRESS],\n SIP_CALLER_REGISTRAR_URI: this.caps[Capabilities.VOIP_SIP_CALLER_REGISTRAR_URI],\n SIP_CALLEE_URI: this.caps[Capabilities.VOIP_SIP_CALLEE_URI],\n SIP_REG_HEADERS: this.caps[Capabilities.VOIP_SIP_REG_HEADERS],\n SIP_INVITE_HEADERS: this.caps[Capabilities.VOIP_SIP_INVITE_HEADERS],\n ICE_ENABLE: this.caps[Capabilities.VOIP_ICE_ENABLE],\n ICE_STUN_SERVERS: this.caps[Capabilities.VOIP_ICE_STUN_SERVERS],\n ICE_TURN_SERVER: this.caps[Capabilities.VOIP_ICE_TURN_SERVER],\n ICE_TURN_USERNAME: this.caps[Capabilities.VOIP_ICE_TURN_USER],\n ICE_TURN_PASSWORD: this.caps[Capabilities.VOIP_ICE_TURN_PASSWORD],\n ICE_TURN_PROTOCOL: this.caps[Capabilities.VOIP_ICE_TURN_PROTOCOL] || 'TCP',\n MIN_SILENCE_DURATION: this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_ENABLE] ? this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT] : null,\n STT_CONFIG: {\n stt_url: this.caps[Capabilities.VOIP_STT_URL_STREAM],\n stt_params: this.caps[Capabilities.VOIP_STT_PARAMS_STREAM],\n stt_body: this.caps[Capabilities.VOIP_STT_BODY_STREAM] || null\n },\n TTS_CONFIG: {\n tts_url: this.caps[Capabilities.VOIP_TTS_URL],\n tts_params: this.caps[Capabilities.VOIP_TTS_PARAMS],\n tts_body: this.caps[Capabilities.VOIP_TTS_BODY] || null\n }\n }\n\n debug(JSON.stringify(request, null, 2))\n this.ws.send(JSON.stringify(request))\n\n this.ws.on('error', (err) => {\n debug(err)\n if (!this.wsOpened) {\n this.end = true\n reject(new Error(`${this.sessionId} - Websocket connection to ${wsEndpoint} error: ${err.message || err}`))\n }\n })\n this.ws.on('message', async (data) => {\n const parsedData = JSON.parse(data)\n\n const parsedDataLog = _.cloneDeep(parsedData)\n parsedDataLog.fullRecord = '<full_record_buffer>'\n\n // debug(JSON.stringify(parsedDataLog, null, 2))\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {\n this.sessionId = parsedData.voipConfig.sessionId\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'unauthorized') {\n reject(new Error('Error: Cannot open a call: SIP Authorization failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event === 'onCallRegState') {\n reject(new Error('Error: Sip Registration failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {\n resolve()\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'disconnected') {\n const apiKey = this._extractApiKey(this._getBody(Capabilities.VOIP_STT_BODY))\n if (parsedData.connectDuration && parsedData.connectDuration > 0) {\n this.eventEmitter.emit('CONSUMPTION_METADATA', this, {\n type: _.isNil(apiKey) ? 'INBUILT' : 'THIRD_PARTY',\n category: 'e2eVoiceIvr',\n metricName: 'consumption.e2e.voip.stt.seconds',\n credits: parsedData.connectDuration,\n apiKey\n })\n }\n }\n\n if (parsedData && parsedData.type === 'error') {\n this.end = true\n reject(new Error(`Error: ${parsedData.message}`))\n sendBotMsg(new Error(`Error: ${parsedData.message}`))\n }\n\n if (parsedData && parsedData.type === 'silence') {\n if (_.isNil(this._getIgnoreSilenceDurationAsserterLogicHook(this.convoStep))) {\n if (_.isNil(this._getJoinLogicHook(this.convoStep)) && parsedData.data.silence.length > 0) {\n this.end = true\n sendBotMsg(new Error(`Silence Duration of ${parsedData.data.silence[0][2].toFixed(2)}s exceeded General Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT] / 1000}s`))\n }\n }\n }\n\n if (parsedData && parsedData.type === 'fullRecord') {\n this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {\n name: 'full_record.wav',\n mimeType: 'audio/wav',\n base64: parsedData.fullRecord\n })\n this.end = true\n }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (this.silenceTimeout) {\n clearTimeout(this.silenceTimeout)\n }\n if (_.isNil(this._getIgnoreSilenceDurationAsserterLogicHook(this.convoStep))) {\n if (!this.firstSttInfoReceived && _.isNil(this._getJoinLogicHook(this.convoStep)) && this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {\n this.end = true\n sendBotMsg(new Error(`Silence Duration of ${parsedData.data.start}s exceeded Initial Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START] / 1000}s`))\n }\n }\n this.firstSttInfoReceived = true\n if (this.prevData) {\n if (!_.isNil(parsedData.data.start)) {\n const silenceDuration = parsedData.data.start - this.prevData.data.end\n const joinLogicHook = this._getJoinLogicHook(this.convoStep)\n const isJoinMethod = this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN'\n let matched = false\n if ((!_.isNil(joinLogicHook) && isJoinMethod && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {\n matched = true\n } else if ((_.isNil(joinLogicHook) && isJoinMethod && (silenceDuration > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000))) {\n matched = true\n }\n if (matched && this.botMsgs.length > 0) {\n sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))\n this.firstMsg = false\n this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]\n this.botMsgs = []\n }\n }\n }\n }\n\n if (parsedData && parsedData.data && parsedData.data.type === 'stt' && parsedData.data.final) {\n const successfulConfidenceScore = this._getConfidenceScore(parsedData) >= this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD]\n debug(`Message: ${parsedData.data.message} / Confidence Score: ${this._getConfidenceScore(parsedData)} (Threshold: ${this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD]})`)\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL' && (_.isNil(this._getJoinLogicHook(this.convoStep)))) {\n let botMsg = { messageText: parsedData.data.message }\n if (this.firstMsg) {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n this.firstMsg = false\n } else {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start - this.prevData.data.end\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n }\n this.prevData = parsedData\n if (successfulConfidenceScore) {\n this.botMsgs.push(botMsg)\n this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))\n }\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'SPLIT' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {\n let botMsg = { messageText: parsedData.data.message }\n if (this.firstMsg) {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n this.firstMsg = false\n } else {\n const sourceData = parsedData\n sourceData.silenceDuration = parsedData.data.start - this.prevData.data.end\n sourceData.voiceDuration = parsedData.data.end - parsedData.data.start\n botMsg = Object.assign({}, botMsg, { sourceData })\n }\n this.prevData = parsedData\n if (successfulConfidenceScore) {\n this.botMsgs.push(botMsg)\n const botMsgsExpanded = splitBotMsgs(this.botMsgs)\n botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))\n }\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT' || !_.isNil(this._getJoinLogicHook(this.convoStep))) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.prevData = parsedData\n if (successfulConfidenceScore) {\n this.botMsgs.push(botMsg)\n this.silenceTimeout = setTimeout(() => {\n if (this.botMsgs.length > 0) {\n debug((this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0])) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))\n this.firstMsg = false\n this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]\n this.botMsgs = []\n }\n }, (this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0])) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n }\n }\n }\n })\n }).catch(err => {\n reject(new Error('Error: ' + err))\n })\n })\n }\n\n async UserSays (msg) {\n debug('UserSays called')\n\n debug(msg)\n\n if (!msg.attachments) {\n msg.attachments = []\n }\n return new Promise((resolve, reject) => {\n setTimeout(async () => {\n let duration = 0\n if (msg && msg.buttons && msg.buttons.length > 0) {\n const request = JSON.stringify({\n METHOD: 'sendDtmf',\n digits: msg.buttons[0].payload,\n sessionId: this.sessionId\n })\n this.ws.send(request)\n } else if (msg && msg.messageText) {\n if (!this.axiosTtsParams) reject(new Error('TTS not configured, only audio input supported'))\n if (this.axiosTtsParams) {\n const ttsRequest = {\n ...this.axiosTtsParams,\n params: {\n ...(this.axiosTtsParams.params || {}),\n text: msg.messageText\n },\n data: this._getBody(Capabilities.VOIP_TTS_BODY),\n responseType: 'arraybuffer'\n }\n msg.sourceData = ttsRequest\n\n let ttsResponse = null\n try {\n ttsResponse = await axios(ttsRequest)\n } catch (err) {\n reject(new Error(`TTS \"${msg.messageText}\" failed - ${this._getAxiosErrOutput(err)}`))\n }\n if (msg && msg.messageText && msg.messageText.length > 0) {\n const apiKey = this._extractApiKey(this._getBody(Capabilities.VOIP_TTS_BODY))\n this.eventEmitter.emit('CONSUMPTION_METADATA', this.container, {\n type: _.isNil(apiKey) ? 'INBUILT' : 'THIRD_PARTY',\n metricName: 'consumption.e2e.voip.tts.characters',\n credits: msg.messageText.length,\n apiKey\n })\n }\n if (Buffer.isBuffer(ttsResponse.data)) {\n duration = ttsResponse.headers['content-duration']\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n PESQ: false,\n sessionId: this.sessionId,\n b64_buffer: ttsResponse.data.toString('base64')\n })\n msg.attachments.push({\n name: 'tts.wav',\n mimeType: 'audio/wav',\n base64: ttsResponse.data.toString('base64')\n })\n this.ws.send(request)\n } else {\n reject(new Error(`TTS failed, response is: ${this._getAxiosShortenedOutput(ttsResponse.data)}`))\n }\n }\n }\n if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n sessionId: this.sessionId,\n b64_buffer: msg.media[0].buffer.toString('base64')\n })\n this.ws.send(request)\n msg.attachments.push({\n name: msg.media[0].mediaUri,\n mimeType: msg.media[0].mimeType,\n base64: msg.media[0].buffer.toString('base64')\n })\n const { data } = await axios({\n method: 'post',\n data: msg.media[0].buffer,\n headers: {\n ...this._getHeaders(Capabilities.VOIP_TTS_HEADERS),\n 'Content-Type': 'audio/wave'\n },\n url: this._getAxiosUrl(this.caps.VOIP_TTS_URL, '/api/audio/info'),\n maxContentLength: Infinity,\n maxBodyLength: Infinity\n })\n if (data && data.duration) {\n duration = parseInt(data.duration)\n } else {\n reject(new Error('Getting audio duration from Speech Api failed'))\n }\n }\n setTimeout(resolve, duration * 1000)\n }, 0)\n })\n }\n\n async Stop () {\n debug(`${this.sessionId} - Stop called`)\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n const request = JSON.stringify({\n METHOD: 'stopCall',\n sessionId: this.sessionId\n })\n this.ws.send(request)\n await new Promise(resolve => {\n setTimeout(resolve, 100000)\n setInterval(() => {\n if (this.end) {\n this.wsOpened = false\n this.ws = null\n this.end = false\n this.convoStep = null\n this.firstSttInfoReceived = false\n resolve()\n }\n }, 100)\n })\n } else {\n this.wsOpened = false\n this.ws = null\n this.end = false\n this.convoStep = null\n this.firstSttInfoReceived = false\n }\n }\n\n _getParams (capParams) {\n if (this.caps[capParams]) {\n if (_.isString(this.caps[capParams])) return JSON.parse(this.caps[capParams])\n else return this.caps[capParams]\n }\n return {}\n }\n\n _getBody (capBody) {\n if (this.caps[capBody]) {\n if (_.isString(this.caps[capBody])) return JSON.parse(this.caps[capBody])\n else return this.caps[capBody]\n }\n return null\n }\n\n _getHeaders (capHeaders) {\n if (this.caps[capHeaders]) {\n if (_.isString(this.caps[capHeaders])) return JSON.parse(this.caps[capHeaders])\n else return this.caps[capHeaders]\n }\n return {}\n }\n\n _getAxiosUrl (baseUrl, extUrl) {\n return baseUrl.substr(0, baseUrl.indexOf('/', 8)) + extUrl\n }\n\n _getAxiosShortenedOutput (data) {\n if (data) {\n if (_.isBuffer(data)) {\n try {\n data = data.toString()\n } catch (err) {\n }\n }\n return _.truncate(_.isString(data) ? data : JSON.stringify(data), { length: 200 })\n } else {\n return ''\n }\n }\n\n _getAxiosErrOutput (err) {\n if (err && err.response) {\n return `Status: ${err.response.status} / Response: ${this._getAxiosShortenedOutput(err.response.data)}`\n } else {\n return err.message\n }\n }\n\n _extractApiKey (body) {\n return _.get(body, 'polly.credentials.accessKeyId') ||\n _.get(body, 'google.credentials.client_email') ||\n _.get(body, 'ibm.credentials.apikey') ||\n _.get(body, 'awstranscribe.credentials.accessKeyId') ||\n _.get(body, 'azure.credentials.subscriptionKey') ||\n null\n }\n\n _getJoinLogicHook (convoStep) {\n if (_.isNil(convoStep)) return null\n if (_.isNil(convoStep.logicHooks)) return null\n return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_JOIN_SILENCE_DURATION')\n }\n\n _getIgnoreSilenceDurationAsserterLogicHook (convoStep) {\n if (_.isNil(convoStep)) return null\n if (_.isNil(convoStep.logicHooks)) return null\n return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')\n }\n\n _getConfidenceScore (parsedData) {\n // Azure Speech Service\n if (parsedData?.data?.source?.debug?.privJson) {\n const privJson = JSON.parse(parsedData?.data?.source?.debug?.privJson)\n if (privJson && privJson.NBest && privJson.NBest.length > 0) {\n return Math.max(...privJson.NBest.map(n => n.Confidence))\n }\n }\n return null\n }\n}\n\nmodule.exports = BotiumConnectorVoip\n","const debug = require('debug')('botium-voip-logichook-ignore-silence-duration')\n\nmodule.exports = class IgnoreSilenceDurationLogicHook {\n constructor (context, caps = {}, args = {}) {\n this.context = context\n this.caps = caps\n this.globalArgs = args\n }\n\n async onBotPrepare (props) {\n debug('Silence duration assertion ignored by logic hook')\n }\n}\n","const debug = require('debug')('botium-voip-logichook-join-silence-duration')\n\nmodule.exports = class JoinLogicHook {\n constructor (context, caps = {}, args = {}) {\n this.context = context\n this.caps = caps\n this.globalArgs = args\n }\n\n async onBotPrepare (props) {\n debug('Joined bot messages because of JOIN logic hook')\n }\n}\n","const BotiumConnectorVoip = require('./src/connector')\nconst IgnoreSilenceDurationLogicHook = require('./src/ignore-sd-logichook')\nconst JoinLogicHook = require('./src/join-logichook')\n\nmodule.exports = {\n PluginVersion: 1,\n PluginClass: BotiumConnectorVoip,\n PluginDesc: {\n name: 'Voice over IP',\n provider: 'Botium',\n features: {\n audioInput: true,\n e2eTesting: true\n },\n capabilities: [\n {\n name: 'VOIP_STT',\n label: 'Speech Recognition Profile',\n type: 'speechrecognitionprofile',\n required: true\n },\n {\n name: 'VOIP_TTS',\n label: 'Speech Synthesis Profile',\n type: 'speechsynthesisprofile',\n required: true\n }\n ]\n },\n PluginLogicHooks: {\n VOIP_IGNORE_SILENCE_DURATION: IgnoreSilenceDurationLogicHook,\n VOIP_JOIN_SILENCE_DURATION: JoinLogicHook\n }\n}\n"],"names":["debug","require$$0","Capabilities","VOIP_STT_URL_STREAM","VOIP_STT_PARAMS_STREAM","VOIP_STT_METHOD_STREAM","VOIP_STT_BODY_STREAM","VOIP_STT_BODY","VOIP_STT_HEADERS","VOIP_STT_TIMEOUT","VOIP_STT_MESSAGE_HANDLING","VOIP_STT_MESSAGE_HANDLING_TIMEOUT","VOIP_STT_MESSAGE_HANDLING_DELIMITER","VOIP_STT_MESSAGE_HANDLING_PUNCTUATION","VOIP_TTS_URL","VOIP_TTS_PARAMS","VOIP_TTS_METHOD","VOIP_TTS_BODY","VOIP_TTS_HEADERS","VOIP_TTS_TIMEOUT","VOIP_WORKER_URL","VOIP_WORKER_APIKEY","VOIP_SIP_POOL_CALLER_ENABLE","VOIP_SIP_CALLER_REGISTRAR_URI","VOIP_SIP_CALLER_ADDRESS","VOIP_SIP_CALLER_USERNAME","VOIP_SIP_CALLER_PASSWORD","VOIP_SIP_PROXY","VOIP_SIP_REG_HEADERS","VOIP_SIP_INVITE_HEADERS","VOIP_SIP_CALLEE_URI","VOIP_ICE_ENABLE","VOIP_ICE_STUN_SERVERS","VOIP_ICE_TURN_ENABLE","VOIP_ICE_TURN_SERVER","VOIP_ICE_TURN_USER","VOIP_ICE_TURN_PASSWORD","VOIP_ICE_TURN_PROTOCOL","VOIP_WEBSOCKET_CONNECT_MAXRETRIES","VOIP_WEBSOCKET_CONNECT_TIMEOUT","VOIP_SILENCE_DURATION_TIMEOUT_ENABLE","VOIP_SILENCE_DURATION_TIMEOUT","VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE","VOIP_SILENCE_DURATION_TIMEOUT_START","VOIP_STT_CONFIDENCE_THRESHOLD","Defaults","VOIP_STT_METHOD","BotiumConnectorVoip","constructor","queueBotSays","eventEmitter","caps","botMsgs","sentencesBuilding","sentencesFinal","sentenceBuilding","Validate","axiosTtsParams","url","params","_getParams","method","timeout","headers","_getHeaders","data","axios","_getAxiosUrl","status","_getAxiosShortenedOutput","Error","err","_getAxiosErrOutput","Object","assign","Start","stopCalled","fullRecord","end","connected","convoStep","sendBotMsg","botMsg","setTimeout","joinBotMsg","joinLastPrevMsg","messageText","map","m","join","sourceData","_","isNil","silenceDuration","start","voiceDuration","length","splitBotMsgs","splitSentences","s","match","RegExp","botMsgsFinal","sentences","push","botMsgCount","sentence","omit","connect","retryIndex","res","API_KEY","URL","path","replace","toString","message","Promise","resolve","reject","wsEndpoint","port","ws","WebSocket","Cookie","on","then","catch","isArray","split","container","silence","msgCount","firstMsg","firstSttInfoReceived","silenceTimeout","wsOpened","request","METHOD","SIP_CALLER_AUTO","SIP_PROXY","SIP_CALLER_URI","VOIP_SIP_CALLER_URI","SIP_CALLER_USERNAME","SIP_CALLER_PASSWORD","SIP_CALLER_ADDRESS","SIP_CALLER_REGISTRAR_URI","SIP_CALLEE_URI","SIP_REG_HEADERS","SIP_INVITE_HEADERS","ICE_ENABLE","ICE_STUN_SERVERS","ICE_TURN_SERVER","ICE_TURN_USERNAME","ICE_TURN_PASSWORD","ICE_TURN_PROTOCOL","MIN_SILENCE_DURATION","STT_CONFIG","stt_url","stt_params","stt_body","TTS_CONFIG","tts_url","tts_params","tts_body","JSON","stringify","send","sessionId","parsedData","parse","parsedDataLog","cloneDeep","type","voipConfig","event","apiKey","_extractApiKey","_getBody","connectDuration","emit","category","metricName","credits","_getIgnoreSilenceDurationAsserterLogicHook","_getJoinLogicHook","toFixed","name","mimeType","base64","final","clearTimeout","prevData","joinLogicHook","isJoinMethod","matched","parseInt","args","successfulConfidenceScore","_getConfidenceScore","forEach","botMsgsExpanded","UserSays","msg","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","media","buffer","mediaUri","maxContentLength","Infinity","maxBodyLength","Stop","readyState","CLOSED","setInterval","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","body","get","logicHooks","find","lh","source","privJson","NBest","Math","max","n","Confidence","IgnoreSilenceDurationLogicHook","context","globalArgs","onBotPrepare","props","JoinLogicHook","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required","PluginLogicHooks","VOIP_IGNORE_SILENCE_DURATION","VOIP_JOIN_SILENCE_DURATION"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "botium-connector-voip",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"description": "Botium Voice over IP Connector",
|
|
5
5
|
"main": "dist/botium-connector-voip-cjs.js",
|
|
6
6
|
"module": "dist/botium-connector-voip-es.js",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "npm run eslint && rollup -c",
|
|
9
9
|
"eslint": "eslint index.js src",
|
|
10
|
-
"eslint-fix": "eslint --fix index.js src"
|
|
10
|
+
"eslint-fix": "eslint --fix index.js src",
|
|
11
|
+
"test": "echo Just placeholder, no tests here yet"
|
|
11
12
|
},
|
|
12
13
|
"author": "Botium GmbH",
|
|
13
14
|
"license": "MIT",
|
package/src/connector.js
CHANGED
|
@@ -45,7 +45,8 @@ const Capabilities = {
|
|
|
45
45
|
VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_ENABLE',
|
|
46
46
|
VOIP_SILENCE_DURATION_TIMEOUT: 'VOIP_SILENCE_DURATION_TIMEOUT',
|
|
47
47
|
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: 'VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE',
|
|
48
|
-
VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START'
|
|
48
|
+
VOIP_SILENCE_DURATION_TIMEOUT_START: 'VOIP_SILENCE_DURATION_TIMEOUT_START',
|
|
49
|
+
VOIP_STT_CONFIDENCE_THRESHOLD: 'VOIP_STT_CONFIDENCE_THRESHOLD'
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
const Defaults = {
|
|
@@ -58,11 +59,12 @@ const Defaults = {
|
|
|
58
59
|
VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',
|
|
59
60
|
VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?',
|
|
60
61
|
VOIP_WEBSOCKET_CONNECT_TIMEOUT: 4000,
|
|
61
|
-
VOIP_WEBSOCKET_CONNECT_MAXRETRIES:
|
|
62
|
+
VOIP_WEBSOCKET_CONNECT_MAXRETRIES: 5,
|
|
62
63
|
VOIP_SILENCE_DURATION_TIMEOUT: 2500,
|
|
63
64
|
VOIP_SILENCE_DURATION_TIMEOUT_ENABLE: false,
|
|
64
65
|
VOIP_SILENCE_DURATION_TIMEOUT_START: 1000,
|
|
65
|
-
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false
|
|
66
|
+
VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE: false,
|
|
67
|
+
VOIP_STT_CONFIDENCE_THRESHOLD: 0.5
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
class BotiumConnectorVoip {
|
|
@@ -156,19 +158,33 @@ class BotiumConnectorVoip {
|
|
|
156
158
|
|
|
157
159
|
let data = null
|
|
158
160
|
let headers = null
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
161
|
+
const connect = async (retryIndex) => {
|
|
162
|
+
retryIndex = retryIndex || 0
|
|
163
|
+
try {
|
|
164
|
+
const res = await axios({
|
|
165
|
+
method: 'post',
|
|
166
|
+
data: {
|
|
167
|
+
API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]
|
|
168
|
+
},
|
|
169
|
+
url: new URL(path.join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()
|
|
170
|
+
})
|
|
171
|
+
if (res) {
|
|
172
|
+
data = res.data
|
|
173
|
+
headers = res.headers
|
|
174
|
+
}
|
|
175
|
+
} catch (err) {
|
|
176
|
+
debug(`Retry ${retryIndex} / ${this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]}: Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`)
|
|
177
|
+
if (retryIndex === this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_MAXRETRIES]) {
|
|
178
|
+
throw new Error(`Connecting to VOIP Worker failed: ${err.message || 'Not reachable'}`)
|
|
179
|
+
}
|
|
180
|
+
// Retry after the defined timeout
|
|
181
|
+
await new Promise(resolve => setTimeout(resolve, this.caps[Capabilities.VOIP_WEBSOCKET_CONNECT_TIMEOUT]))
|
|
182
|
+
|
|
183
|
+
// Retry the connection
|
|
184
|
+
await connect(retryIndex + 1)
|
|
185
|
+
}
|
|
171
186
|
}
|
|
187
|
+
await connect()
|
|
172
188
|
|
|
173
189
|
return new Promise((resolve, reject) => {
|
|
174
190
|
const wsEndpoint = `${this.caps[Capabilities.VOIP_WORKER_URL]}/ws/${data.port}`
|
|
@@ -263,7 +279,7 @@ class BotiumConnectorVoip {
|
|
|
263
279
|
const parsedDataLog = _.cloneDeep(parsedData)
|
|
264
280
|
parsedDataLog.fullRecord = '<full_record_buffer>'
|
|
265
281
|
|
|
266
|
-
debug(JSON.stringify(parsedDataLog, null, 2))
|
|
282
|
+
// debug(JSON.stringify(parsedDataLog, null, 2))
|
|
267
283
|
|
|
268
284
|
if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {
|
|
269
285
|
this.sessionId = parsedData.voipConfig.sessionId
|
|
@@ -335,7 +351,7 @@ class BotiumConnectorVoip {
|
|
|
335
351
|
const joinLogicHook = this._getJoinLogicHook(this.convoStep)
|
|
336
352
|
const isJoinMethod = this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN'
|
|
337
353
|
let matched = false
|
|
338
|
-
if ((!_.isNil(joinLogicHook) && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {
|
|
354
|
+
if ((!_.isNil(joinLogicHook) && isJoinMethod && silenceDuration > parseInt(joinLogicHook.args[0])) / 1000) {
|
|
339
355
|
matched = true
|
|
340
356
|
} else if ((_.isNil(joinLogicHook) && isJoinMethod && (silenceDuration > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000))) {
|
|
341
357
|
matched = true
|
|
@@ -351,6 +367,8 @@ class BotiumConnectorVoip {
|
|
|
351
367
|
}
|
|
352
368
|
|
|
353
369
|
if (parsedData && parsedData.data && parsedData.data.type === 'stt' && parsedData.data.final) {
|
|
370
|
+
const successfulConfidenceScore = this._getConfidenceScore(parsedData) >= this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD]
|
|
371
|
+
debug(`Message: ${parsedData.data.message} / Confidence Score: ${this._getConfidenceScore(parsedData)} (Threshold: ${this.caps[Capabilities.VOIP_STT_CONFIDENCE_THRESHOLD]})`)
|
|
354
372
|
if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL' && (_.isNil(this._getJoinLogicHook(this.convoStep)))) {
|
|
355
373
|
let botMsg = { messageText: parsedData.data.message }
|
|
356
374
|
if (this.firstMsg) {
|
|
@@ -366,8 +384,10 @@ class BotiumConnectorVoip {
|
|
|
366
384
|
botMsg = Object.assign({}, botMsg, { sourceData })
|
|
367
385
|
}
|
|
368
386
|
this.prevData = parsedData
|
|
369
|
-
|
|
370
|
-
|
|
387
|
+
if (successfulConfidenceScore) {
|
|
388
|
+
this.botMsgs.push(botMsg)
|
|
389
|
+
this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))
|
|
390
|
+
}
|
|
371
391
|
this.botMsgs = []
|
|
372
392
|
}
|
|
373
393
|
if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'SPLIT' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {
|
|
@@ -385,23 +405,28 @@ class BotiumConnectorVoip {
|
|
|
385
405
|
botMsg = Object.assign({}, botMsg, { sourceData })
|
|
386
406
|
}
|
|
387
407
|
this.prevData = parsedData
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
408
|
+
if (successfulConfidenceScore) {
|
|
409
|
+
this.botMsgs.push(botMsg)
|
|
410
|
+
const botMsgsExpanded = splitBotMsgs(this.botMsgs)
|
|
411
|
+
botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))
|
|
412
|
+
}
|
|
391
413
|
this.botMsgs = []
|
|
392
414
|
}
|
|
393
415
|
if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'JOIN' || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT' || !_.isNil(this._getJoinLogicHook(this.convoStep))) {
|
|
394
416
|
const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }
|
|
395
|
-
this.botMsgs.push(botMsg)
|
|
396
417
|
this.prevData = parsedData
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
this.
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
418
|
+
if (successfulConfidenceScore) {
|
|
419
|
+
this.botMsgs.push(botMsg)
|
|
420
|
+
this.silenceTimeout = setTimeout(() => {
|
|
421
|
+
if (this.botMsgs.length > 0) {
|
|
422
|
+
debug((this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0])) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])
|
|
423
|
+
sendBotMsg(joinBotMsg(this.botMsgs, this.joinLastPrevMsg))
|
|
424
|
+
this.firstMsg = false
|
|
425
|
+
this.joinLastPrevMsg = this.botMsgs[this.botMsgs.length - 1]
|
|
426
|
+
this.botMsgs = []
|
|
427
|
+
}
|
|
428
|
+
}, (this._getJoinLogicHook(this.convoStep) && parseInt(this._getJoinLogicHook(this.convoStep).args[0])) || this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])
|
|
429
|
+
}
|
|
405
430
|
}
|
|
406
431
|
}
|
|
407
432
|
})
|
|
@@ -611,6 +636,17 @@ class BotiumConnectorVoip {
|
|
|
611
636
|
if (_.isNil(convoStep.logicHooks)) return null
|
|
612
637
|
return convoStep && convoStep.logicHooks && convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')
|
|
613
638
|
}
|
|
639
|
+
|
|
640
|
+
_getConfidenceScore (parsedData) {
|
|
641
|
+
// Azure Speech Service
|
|
642
|
+
if (parsedData?.data?.source?.debug?.privJson) {
|
|
643
|
+
const privJson = JSON.parse(parsedData?.data?.source?.debug?.privJson)
|
|
644
|
+
if (privJson && privJson.NBest && privJson.NBest.length > 0) {
|
|
645
|
+
return Math.max(...privJson.NBest.map(n => n.Confidence))
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
return null
|
|
649
|
+
}
|
|
614
650
|
}
|
|
615
651
|
|
|
616
652
|
module.exports = BotiumConnectorVoip
|