botium-connector-voip 0.0.8 → 0.0.9
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.
- package/dist/botium-connector-voip-cjs.js +55 -52
- package/dist/botium-connector-voip-cjs.js.map +1 -1
- package/dist/botium-connector-voip-es.js +54 -51
- package/dist/botium-connector-voip-es.js.map +1 -1
- package/index.js +4 -0
- package/package.json +1 -1
- package/src/connector.js +21 -31
- package/src/ignore-sd-logichook.js +13 -0
|
@@ -2,26 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var uuid = require('uuid');
|
|
6
5
|
var ws = require('ws');
|
|
7
6
|
var lodash = require('lodash');
|
|
8
7
|
var axios = require('axios');
|
|
9
|
-
var debug$
|
|
8
|
+
var debug$2 = require('debug');
|
|
10
9
|
var path = require('path');
|
|
11
10
|
|
|
12
11
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
12
|
|
|
14
|
-
var uuid__default = /*#__PURE__*/_interopDefaultLegacy(uuid);
|
|
15
13
|
var ws__default = /*#__PURE__*/_interopDefaultLegacy(ws);
|
|
16
14
|
var lodash__default = /*#__PURE__*/_interopDefaultLegacy(lodash);
|
|
17
15
|
var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
|
|
18
|
-
var debug__default = /*#__PURE__*/_interopDefaultLegacy(debug$
|
|
16
|
+
var debug__default = /*#__PURE__*/_interopDefaultLegacy(debug$2);
|
|
19
17
|
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
|
|
20
18
|
|
|
21
|
-
const
|
|
22
|
-
v4: uuidv4
|
|
23
|
-
} = uuid__default["default"];
|
|
24
|
-
const debug = debug__default["default"]('botium-connector-voip');
|
|
19
|
+
const debug$1 = debug__default["default"]('botium-connector-voip');
|
|
25
20
|
const Capabilities = {
|
|
26
21
|
VOIP_STT_URL_STREAM: 'VOIP_STT_URL_STREAM',
|
|
27
22
|
VOIP_STT_PARAMS_STREAM: 'VOIP_STT_PARAMS_STREAM',
|
|
@@ -86,10 +81,8 @@ class BotiumConnectorVoip {
|
|
|
86
81
|
constructor({
|
|
87
82
|
queueBotSays,
|
|
88
83
|
eventEmitter,
|
|
89
|
-
caps
|
|
90
|
-
setAsync
|
|
84
|
+
caps
|
|
91
85
|
}) {
|
|
92
|
-
setAsync(true);
|
|
93
86
|
this.queueBotSays = queueBotSays;
|
|
94
87
|
this.caps = caps;
|
|
95
88
|
this.eventEmitter = eventEmitter;
|
|
@@ -100,8 +93,8 @@ class BotiumConnectorVoip {
|
|
|
100
93
|
}
|
|
101
94
|
|
|
102
95
|
async Validate() {
|
|
103
|
-
debug('Validate called');
|
|
104
|
-
debug(this.caps.VOIP_STT_MESSAGE_HANDLING);
|
|
96
|
+
debug$1('Validate called');
|
|
97
|
+
debug$1(this.caps.VOIP_STT_MESSAGE_HANDLING);
|
|
105
98
|
|
|
106
99
|
if (this.caps.VOIP_TTS_URL) {
|
|
107
100
|
this.axiosTtsParams = {
|
|
@@ -120,7 +113,7 @@ class BotiumConnectorVoip {
|
|
|
120
113
|
});
|
|
121
114
|
|
|
122
115
|
if (data && data.status === 'OK') {
|
|
123
|
-
debug(`Checking TTS Status response: ${this._getAxiosShortenedOutput(data)}`);
|
|
116
|
+
debug$1(`Checking TTS Status response: ${this._getAxiosShortenedOutput(data)}`);
|
|
124
117
|
} else {
|
|
125
118
|
throw new Error(`Checking TTS Status failed, response is: ${this._getAxiosShortenedOutput(data)}`);
|
|
126
119
|
}
|
|
@@ -133,21 +126,13 @@ class BotiumConnectorVoip {
|
|
|
133
126
|
}
|
|
134
127
|
|
|
135
128
|
async Start() {
|
|
136
|
-
debug('Start called');
|
|
137
|
-
debug(this.caps[Capabilities.VOIP_TTS_URL]);
|
|
138
|
-
this.view = {
|
|
139
|
-
container: this,
|
|
140
|
-
context: {},
|
|
141
|
-
msg: {},
|
|
142
|
-
botium: {
|
|
143
|
-
conversationId: uuidv4(),
|
|
144
|
-
stepId: null
|
|
145
|
-
}
|
|
146
|
-
};
|
|
129
|
+
debug$1('Start called');
|
|
130
|
+
debug$1(this.caps[Capabilities.VOIP_TTS_URL]);
|
|
147
131
|
this.stopCalled = false;
|
|
148
132
|
this.fullRecord = '';
|
|
149
133
|
this.end = false;
|
|
150
134
|
this.connected = false;
|
|
135
|
+
this.convoStep = null;
|
|
151
136
|
|
|
152
137
|
const sendBotMsg = botMsg => {
|
|
153
138
|
setTimeout(() => this.queueBotSays(botMsg), 0);
|
|
@@ -242,16 +227,6 @@ class BotiumConnectorVoip {
|
|
|
242
227
|
};
|
|
243
228
|
|
|
244
229
|
connect().then(() => {
|
|
245
|
-
this.eventEmitter.on('RETRY_CONVO_ASYNC_RETRIED', () => {
|
|
246
|
-
debug('Retry event received');
|
|
247
|
-
const request = JSON.stringify({
|
|
248
|
-
METHOD: 'stopCall',
|
|
249
|
-
sessionId: this.sessionId
|
|
250
|
-
});
|
|
251
|
-
this.ws.send(request);
|
|
252
|
-
this.ws.close();
|
|
253
|
-
});
|
|
254
|
-
|
|
255
230
|
if (!lodash__default["default"].isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {
|
|
256
231
|
if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {
|
|
257
232
|
this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = [];
|
|
@@ -260,11 +235,15 @@ class BotiumConnectorVoip {
|
|
|
260
235
|
}
|
|
261
236
|
}
|
|
262
237
|
|
|
238
|
+
this.eventEmitter.on('CONVO_STEP_NEXT', (container, convoStep) => {
|
|
239
|
+
this.convoStep = convoStep;
|
|
240
|
+
});
|
|
263
241
|
this.silence = null;
|
|
264
242
|
this.msgCount = 0;
|
|
265
243
|
this.firstMsg = true;
|
|
244
|
+
this.firstSttInfoReceived = false;
|
|
266
245
|
this.wsOpened = true;
|
|
267
|
-
debug(`Websocket connection to ${wsEndpoint} opened.`);
|
|
246
|
+
debug$1(`Websocket connection to ${wsEndpoint} opened.`);
|
|
268
247
|
const request = {
|
|
269
248
|
METHOD: 'initCall',
|
|
270
249
|
SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],
|
|
@@ -295,10 +274,10 @@ class BotiumConnectorVoip {
|
|
|
295
274
|
tts_body: this.caps[Capabilities.VOIP_TTS_BODY] || null
|
|
296
275
|
}
|
|
297
276
|
};
|
|
298
|
-
debug(JSON.stringify(request, null, 2));
|
|
277
|
+
debug$1(JSON.stringify(request, null, 2));
|
|
299
278
|
this.ws.send(JSON.stringify(request));
|
|
300
279
|
this.ws.on('error', err => {
|
|
301
|
-
debug(err);
|
|
280
|
+
debug$1(err);
|
|
302
281
|
|
|
303
282
|
if (!this.wsOpened) {
|
|
304
283
|
this.end = true;
|
|
@@ -311,7 +290,7 @@ class BotiumConnectorVoip {
|
|
|
311
290
|
const parsedDataLog = lodash__default["default"].cloneDeep(parsedData);
|
|
312
291
|
|
|
313
292
|
parsedDataLog.fullRecord = '<full_record_buffer>';
|
|
314
|
-
debug(JSON.stringify(parsedDataLog, null, 2));
|
|
293
|
+
debug$1(JSON.stringify(parsedDataLog, null, 2));
|
|
315
294
|
|
|
316
295
|
if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {
|
|
317
296
|
this.sessionId = parsedData.voipConfig.sessionId;
|
|
@@ -349,11 +328,9 @@ class BotiumConnectorVoip {
|
|
|
349
328
|
}
|
|
350
329
|
|
|
351
330
|
if (parsedData && parsedData.type === 'silence') {
|
|
352
|
-
this.
|
|
353
|
-
|
|
354
|
-
if (parsedData.data.silence.length > 0) {
|
|
331
|
+
if (this.convoStep && this.convoStep.logicHooks && lodash__default["default"].isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && parsedData.data.silence.length > 0) {
|
|
332
|
+
this.end = true;
|
|
355
333
|
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`));
|
|
356
|
-
this.Stop();
|
|
357
334
|
}
|
|
358
335
|
}
|
|
359
336
|
|
|
@@ -363,14 +340,17 @@ class BotiumConnectorVoip {
|
|
|
363
340
|
mimeType: 'audio/wav',
|
|
364
341
|
base64: parsedData.fullRecord
|
|
365
342
|
});
|
|
343
|
+
this.end = true;
|
|
366
344
|
}
|
|
367
345
|
|
|
368
346
|
if (parsedData && parsedData.data && parsedData.data.final === false) {
|
|
369
|
-
if (this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {
|
|
370
|
-
|
|
371
|
-
this.
|
|
347
|
+
if (!this.firstSttInfoReceived && this.convoStep && this.convoStep.logicHooks && lodash__default["default"].isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {
|
|
348
|
+
this.end = true;
|
|
349
|
+
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`));
|
|
372
350
|
}
|
|
373
351
|
|
|
352
|
+
this.firstSttInfoReceived = true;
|
|
353
|
+
|
|
374
354
|
if (this.prevData) {
|
|
375
355
|
if (!lodash__default["default"].isNil(parsedData.data.start) && parsedData.data.start - this.prevData.data.end > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {
|
|
376
356
|
if (this.botMsgs.length > 0) {
|
|
@@ -458,8 +438,8 @@ class BotiumConnectorVoip {
|
|
|
458
438
|
}
|
|
459
439
|
|
|
460
440
|
async UserSays(msg) {
|
|
461
|
-
debug('UserSays called');
|
|
462
|
-
debug(msg);
|
|
441
|
+
debug$1('UserSays called');
|
|
442
|
+
debug$1(msg);
|
|
463
443
|
|
|
464
444
|
if (!msg.attachments) {
|
|
465
445
|
msg.attachments = [];
|
|
@@ -565,7 +545,7 @@ class BotiumConnectorVoip {
|
|
|
565
545
|
}
|
|
566
546
|
|
|
567
547
|
async Stop() {
|
|
568
|
-
debug(`${this.sessionId} - Stop called`);
|
|
548
|
+
debug$1(`${this.sessionId} - Stop called`);
|
|
569
549
|
|
|
570
550
|
if (this.ws && this.ws.readyState !== ws__default["default"].CLOSED) {
|
|
571
551
|
const request = JSON.stringify({
|
|
@@ -579,15 +559,19 @@ class BotiumConnectorVoip {
|
|
|
579
559
|
if (this.end) {
|
|
580
560
|
this.wsOpened = false;
|
|
581
561
|
this.ws = null;
|
|
582
|
-
this.
|
|
562
|
+
this.end = false;
|
|
563
|
+
this.convoStep = null;
|
|
564
|
+
this.firstSttInfoReceived = false;
|
|
583
565
|
resolve();
|
|
584
566
|
}
|
|
585
|
-
},
|
|
567
|
+
}, 100);
|
|
586
568
|
});
|
|
587
569
|
} else {
|
|
588
570
|
this.wsOpened = false;
|
|
589
571
|
this.ws = null;
|
|
590
|
-
this.
|
|
572
|
+
this.end = false;
|
|
573
|
+
this.convoStep = null;
|
|
574
|
+
this.firstSttInfoReceived = false;
|
|
591
575
|
}
|
|
592
576
|
}
|
|
593
577
|
|
|
@@ -651,6 +635,20 @@ class BotiumConnectorVoip {
|
|
|
651
635
|
|
|
652
636
|
var connector = BotiumConnectorVoip;
|
|
653
637
|
|
|
638
|
+
const debug = debug__default["default"]('botium-voip-logichook-ignore-silence-duration');
|
|
639
|
+
var ignoreSdLogichook = class IgnoreSilenceDurationLogicHook {
|
|
640
|
+
constructor(context, caps = {}, args = {}) {
|
|
641
|
+
this.context = context;
|
|
642
|
+
this.caps = caps;
|
|
643
|
+
this.globalArgs = args;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
async onBotPrepare(props) {
|
|
647
|
+
debug('Silence duration assertion ignored by logic hook');
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
};
|
|
651
|
+
|
|
654
652
|
var botiumConnectorVoip = {
|
|
655
653
|
PluginVersion: 1,
|
|
656
654
|
PluginClass: connector,
|
|
@@ -672,14 +670,19 @@ var botiumConnectorVoip = {
|
|
|
672
670
|
type: 'speechsynthesisprofile',
|
|
673
671
|
required: true
|
|
674
672
|
}]
|
|
673
|
+
},
|
|
674
|
+
PluginLogicHooks: {
|
|
675
|
+
VOIP_IGNORE_SILENCE_DURATION: ignoreSdLogichook
|
|
675
676
|
}
|
|
676
677
|
};
|
|
677
678
|
var botiumConnectorVoip_1 = botiumConnectorVoip.PluginVersion;
|
|
678
679
|
var botiumConnectorVoip_2 = botiumConnectorVoip.PluginClass;
|
|
679
680
|
var botiumConnectorVoip_3 = botiumConnectorVoip.PluginDesc;
|
|
681
|
+
var botiumConnectorVoip_4 = botiumConnectorVoip.PluginLogicHooks;
|
|
680
682
|
|
|
681
683
|
exports.PluginClass = botiumConnectorVoip_2;
|
|
682
684
|
exports.PluginDesc = botiumConnectorVoip_3;
|
|
685
|
+
exports.PluginLogicHooks = botiumConnectorVoip_4;
|
|
683
686
|
exports.PluginVersion = botiumConnectorVoip_1;
|
|
684
687
|
exports["default"] = botiumConnectorVoip;
|
|
685
688
|
//# sourceMappingURL=botium-connector-voip-cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"botium-connector-voip-cjs.js","sources":["../src/connector.js","../index.js"],"sourcesContent":["const { v4: uuidv4 } = require('uuid')\nconst 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: 500,\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, setAsync }) {\n setAsync(true)\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.view = {\n container: this,\n context: {},\n msg: {},\n botium: {\n conversationId: uuidv4(),\n stepId: null\n }\n }\n\n this.stopCalled = false\n\n this.fullRecord = ''\n this.end = false\n this.connected = false\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 this.eventEmitter.on('RETRY_CONVO_ASYNC_RETRIED', () => {\n debug('Retry event received')\n const request = JSON.stringify({\n METHOD: 'stopCall',\n sessionId: this.sessionId\n })\n this.ws.send(request)\n this.ws.close()\n })\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.silence = null\n this.msgCount = 0\n this.firstMsg = true\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 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 this.end = true\n if (parsedData.data.silence.length > 0) {\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 this.Stop()\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 }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (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 sendBotMsg(new Error(`Silence Duration of ${parsedData.data.start}s exceeded Start Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START] / 1000}s`))\n this.Stop()\n }\n if (this.prevData) {\n if (!_.isNil(parsedData.data.start) && parsedData.data.start - this.prevData.data.end > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {\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 }\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') {\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') {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n this.prevData = parsedData\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, 10000)\n setInterval(() => {\n if (this.end) {\n this.wsOpened = false\n this.ws = null\n this.view = {}\n resolve()\n }\n }, 1000)\n })\n } else {\n this.wsOpened = false\n this.ws = null\n this.view = {}\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\nmodule.exports = BotiumConnectorVoip\n","const BotiumConnectorVoip = require('./src/connector')\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}\n"],"names":["v4","uuidv4","require$$0","debug","require$$1","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","setAsync","botMsgs","sentencesBuilding","sentencesFinal","sentenceBuilding","Validate","axiosTtsParams","url","params","_getParams","method","timeout","headers","_getHeaders","data","axios","_getAxiosUrl","status","_getAxiosShortenedOutput","Error","err","_getAxiosErrOutput","Object","assign","Start","view","container","context","msg","botium","conversationId","stepId","stopCalled","fullRecord","end","connected","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","request","JSON","stringify","METHOD","sessionId","send","close","isArray","split","silence","msgCount","firstMsg","wsOpened","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","parsedData","parse","parsedDataLog","cloneDeep","type","voipConfig","event","apiKey","_extractApiKey","_getBody","connectDuration","emit","metricName","credits","toFixed","Stop","name","mimeType","base64","final","prevData","parseInt","forEach","botMsgsExpanded","UserSays","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","media","buffer","mediaUri","maxContentLength","Infinity","maxBodyLength","readyState","CLOSED","setInterval","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","body","get","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,MAAM;AAAEA,EAAAA,EAAE,EAAEC;AAAN,IAAiBC,wBAAvB;AAIA,MAAMC,KAAK,GAAGC,yBAAgB,CAAC,uBAAD,CAA9B;AAGA,MAAMC,YAAY,GAAG;AACnBC,EAAAA,mBAAmB,EAAE,qBADF;AAEnBC,EAAAA,sBAAsB,EAAE,wBAFL;AAGnBC,EAAAA,sBAAsB,EAAE,wBAHL;AAInBC,EAAAA,oBAAoB,EAAE,sBAJH;AAKnBC,EAAAA,aAAa,EAAE,eALI;AAMnBC,EAAAA,gBAAgB,EAAE,kBANC;AAOnBC,EAAAA,gBAAgB,EAAE,kBAPC;AAQnBC,EAAAA,yBAAyB,EAAE,2BARR;AASnBC,EAAAA,iCAAiC,EAAE,mCAThB;AAUnBC,EAAAA,mCAAmC,EAAE,qCAVlB;AAWnBC,EAAAA,qCAAqC,EAAE,uCAXpB;AAYnBC,EAAAA,YAAY,EAAE,cAZK;AAanBC,EAAAA,eAAe,EAAE,iBAbE;AAcnBC,EAAAA,eAAe,EAAE,iBAdE;AAenBC,EAAAA,aAAa,EAAE,eAfI;AAgBnBC,EAAAA,gBAAgB,EAAE,kBAhBC;AAiBnBC,EAAAA,gBAAgB,EAAE,kBAjBC;AAkBnBC,EAAAA,eAAe,EAAE,iBAlBE;AAmBnBC,EAAAA,kBAAkB,EAAE,oBAnBD;AAoBnBC,EAAAA,2BAA2B,EAAE,6BApBV;AAqBnBC,EAAAA,6BAA6B,EAAE,+BArBZ;AAsBnBC,EAAAA,uBAAuB,EAAE,yBAtBN;AAuBnBC,EAAAA,wBAAwB,EAAE,0BAvBP;AAwBnBC,EAAAA,wBAAwB,EAAE,0BAxBP;AAyBnBC,EAAAA,cAAc,EAAE,gBAzBG;AA0BnBC,EAAAA,oBAAoB,EAAE,sBA1BH;AA2BnBC,EAAAA,uBAAuB,EAAE,yBA3BN;AA4BnBC,EAAAA,mBAAmB,EAAE,qBA5BF;AA6BnBC,EAAAA,eAAe,EAAE,iBA7BE;AA8BnBC,EAAAA,qBAAqB,EAAE,uBA9BJ;AA+BnBC,EAAAA,oBAAoB,EAAE,sBA/BH;AAgCnBC,EAAAA,oBAAoB,EAAE,sBAhCH;AAiCnBC,EAAAA,kBAAkB,EAAE,oBAjCD;AAkCnBC,EAAAA,sBAAsB,EAAE,wBAlCL;AAmCnBC,EAAAA,sBAAsB,EAAE,wBAnCL;AAoCnBC,EAAAA,iCAAiC,EAAE,mCApChB;AAqCnBC,EAAAA,8BAA8B,EAAE,gCArCb;AAsCnBC,EAAAA,oCAAoC,EAAE,sCAtCnB;AAuCnBC,EAAAA,6BAA6B,EAAE,+BAvCZ;AAwCnBC,EAAAA,0CAA0C,EAAE,4CAxCzB;AAyCnBC,EAAAA,mCAAmC,EAAE;AAzClB,CAArB;AA4CA,MAAMC,QAAQ,GAAG;AACfC,EAAAA,eAAe,EAAE,MADF;AAEfpC,EAAAA,gBAAgB,EAAE,KAFH;AAGfO,EAAAA,eAAe,EAAE,KAHF;AAIfG,EAAAA,gBAAgB,EAAE,KAJH;AAKfT,EAAAA,yBAAyB,EAAE,UALZ;AAMfC,EAAAA,iCAAiC,EAAE,GANpB;AAOfC,EAAAA,mCAAmC,EAAE,IAPtB;AAQfC,EAAAA,qCAAqC,EAAE,KARxB;AASf0B,EAAAA,8BAA8B,EAAE,IATjB;AAUfD,EAAAA,iCAAiC,EAAE,EAVpB;AAWfG,EAAAA,6BAA6B,EAAE,IAXhB;AAYfD,EAAAA,oCAAoC,EAAE,KAZvB;AAafG,EAAAA,mCAAmC,EAAE,IAbtB;AAcfD,EAAAA,0CAA0C,EAAE;AAd7B,CAAjB;;AAiBA,MAAMI,mBAAN,CAA0B;AACxBC,EAAAA,WAAW,CAAE;AAAEC,IAAAA,YAAF;AAAgBC,IAAAA,YAAhB;AAA8BC,IAAAA,IAA9B;AAAoCC,IAAAA;AAApC,GAAF,EAAkD;AAC3DA,IAAAA,QAAQ,CAAC,IAAD,CAAR;AACA,SAAKH,YAAL,GAAoBA,YAApB;AACA,SAAKE,IAAL,GAAYA,IAAZ;AACA,SAAKD,YAAL,GAAoBA,YAApB;AACA,SAAKG,OAAL,GAAe,EAAf;AACA,SAAKC,iBAAL,GAAyB,CAAzB;AACA,SAAKC,cAAL,GAAsB,CAAtB;AACA,SAAKC,gBAAL,GAAwB,KAAxB;AACD;;AAEa,QAARC,QAAQ,GAAI;AAChBxD,IAAAA,KAAK,CAAC,iBAAD,CAAL;AACAA,IAAAA,KAAK,CAAC,KAAKkD,IAAL,CAAUxC,yBAAX,CAAL;;AAEA,QAAI,KAAKwC,IAAL,CAAUpC,YAAd,EAA4B;AAC1B,WAAK2C,cAAL,GAAsB;AACpBC,QAAAA,GAAG,EAAE,KAAKR,IAAL,CAAUpC,YADK;AAEpB6C,QAAAA,MAAM,EAAE,KAAKC,UAAL,CAAgB1D,YAAY,CAACa,eAA7B,CAFY;AAGpB8C,QAAAA,MAAM,EAAE,KAAKX,IAAL,CAAUlC,eAHE;AAIpB8C,QAAAA,OAAO,EAAE,KAAKZ,IAAL,CAAU/B,gBAJC;AAKpB4C,QAAAA,OAAO,EAAE,KAAKC,WAAL,CAAiB9D,YAAY,CAACgB,gBAA9B;AALW,OAAtB;;AAOA,UAAI;AACF,cAAM;AAAE+C,UAAAA;AAAF,YAAW,MAAMC,yBAAK,CAAC,EAC3B,GAAG,KAAKT,cADmB;AAE3BC,UAAAA,GAAG,EAAE,KAAKS,YAAL,CAAkB,KAAKjB,IAAL,CAAUpC,YAA5B,EAA0C,aAA1C;AAFsB,SAAD,CAA5B;;AAIA,YAAImD,IAAI,IAAIA,IAAI,CAACG,MAAL,KAAgB,IAA5B,EAAkC;AAChCpE,UAAAA,KAAK,CAAE,iCAAgC,KAAKqE,wBAAL,CAA8BJ,IAA9B,CAAoC,EAAtE,CAAL;AACD,SAFD,MAEO;AACL,gBAAM,IAAIK,KAAJ,CAAW,4CAA2C,KAAKD,wBAAL,CAA8BJ,IAA9B,CAAoC,EAA1F,CAAN;AACD;AACF,OAVD,CAUE,OAAOM,GAAP,EAAY;AACZ,cAAM,IAAID,KAAJ,CAAW,gCAA+B,KAAKE,kBAAL,CAAwBD,GAAxB,CAA6B,EAAvE,CAAN;AACD;AACF;;AAED,SAAKrB,IAAL,GAAYuB,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkB9B,QAAlB,EAA4B,KAAKM,IAAjC,CAAZ;AACD;;AAEU,QAALyB,KAAK,GAAI;AACb3E,IAAAA,KAAK,CAAC,cAAD,CAAL;AACAA,IAAAA,KAAK,CAAC,KAAKkD,IAAL,CAAUhD,YAAY,CAACY,YAAvB,CAAD,CAAL;AAEA,SAAK8D,IAAL,GAAY;AACVC,MAAAA,SAAS,EAAE,IADD;AAEVC,MAAAA,OAAO,EAAE,EAFC;AAGVC,MAAAA,GAAG,EAAE,EAHK;AAIVC,MAAAA,MAAM,EAAE;AACNC,QAAAA,cAAc,EAAEnF,MAAM,EADhB;AAENoF,QAAAA,MAAM,EAAE;AAFF;AAJE,KAAZ;AAUA,SAAKC,UAAL,GAAkB,KAAlB;AAEA,SAAKC,UAAL,GAAkB,EAAlB;AACA,SAAKC,GAAL,GAAW,KAAX;AACA,SAAKC,SAAL,GAAiB,KAAjB;;AAEA,UAAMC,UAAU,GAAIC,MAAD,IAAY;AAAEC,MAAAA,UAAU,CAAC,MAAM,KAAKzC,YAAL,CAAkBwC,MAAlB,CAAP,EAAkC,CAAlC,CAAV;AAAgD,KAAjF;;AAEA,UAAME,UAAU,GAAG,CAACtC,OAAD,EAAUuC,eAAV,KAA8B;AAC/C,YAAMH,MAAM,GAAG,EAAf;AACAA,MAAAA,MAAM,CAACI,WAAP,GAAqBxC,OAAO,CAACyC,GAAR,CAAYC,CAAC,IAAIA,CAAC,CAACF,WAAnB,EAAgCG,IAAhC,CAAqC,KAAK7C,IAAL,CAAUhD,YAAY,CAACU,mCAAvB,CAArC,CAArB;AACA4E,MAAAA,MAAM,CAACQ,UAAP,GAAoB5C,OAAO,CAACyC,GAAR,CAAYC,CAAC,IAAIA,CAAC,CAACE,UAAnB,CAApB;;AACA,UAAIC,0BAAC,CAACC,KAAF,CAAQP,eAAR,CAAJ,EAA8B;AAC5BH,QAAAA,MAAM,CAACQ,UAAP,CAAkB,CAAlB,EAAqBG,eAArB,GAAuC/C,OAAO,CAAC,CAAD,CAAP,CAAW4C,UAAX,CAAsB/B,IAAtB,CAA2BmC,KAAlE;AACAZ,QAAAA,MAAM,CAACQ,UAAP,CAAkB,CAAlB,EAAqBK,aAArB,GAAqCjD,OAAO,CAACA,OAAO,CAACkD,MAAR,GAAiB,CAAlB,CAAP,CAA4BN,UAA5B,CAAuC/B,IAAvC,CAA4CoB,GAA5C,GAAkDjC,OAAO,CAAC,CAAD,CAAP,CAAW4C,UAAX,CAAsB/B,IAAtB,CAA2BmC,KAAlH;AACD,OAHD,MAGO;AACLZ,QAAAA,MAAM,CAACQ,UAAP,CAAkB,CAAlB,EAAqBG,eAArB,GAAuC/C,OAAO,CAAC,CAAD,CAAP,CAAW4C,UAAX,CAAsB/B,IAAtB,CAA2BmC,KAA3B,GAAmCT,eAAe,CAACK,UAAhB,CAA2B/B,IAA3B,CAAgCoB,GAA1G;AACAG,QAAAA,MAAM,CAACQ,UAAP,CAAkB,CAAlB,EAAqBK,aAArB,GAAqCjD,OAAO,CAACA,OAAO,CAACkD,MAAR,GAAiB,CAAlB,CAAP,CAA4BN,UAA5B,CAAuC/B,IAAvC,CAA4CoB,GAA5C,GAAkDjC,OAAO,CAAC,CAAD,CAAP,CAAW4C,UAAX,CAAsB/B,IAAtB,CAA2BmC,KAAlH;AACD;;AACD,aAAOZ,MAAP;AACD,KAZD;;AAcA,UAAMe,YAAY,GAAGnD,OAAO,IAAI;AAC9B,YAAMoD,cAAc,GAAGC,CAAC,IAAIA,CAAC,CAACC,KAAF,CAAQ,IAAIC,MAAJ,CAAY,KAAI,KAAKzD,IAAL,CAAUhD,YAAY,CAACW,qCAAvB,CAA8D,MAAK,KAAKqC,IAAL,CAAUhD,YAAY,CAACW,qCAAvB,CAA8D,IAAjJ,EAAsJ,GAAtJ,CAAR,CAA5B;;AACA,YAAM+F,YAAY,GAAG,EAArB;;AACA,WAAK,MAAMpB,MAAX,IAAqBpC,OAArB,EAA8B;AAC5B,cAAMyD,SAAS,GAAGL,cAAc,CAAChB,MAAM,CAACI,WAAR,CAAhC;;AACA,YAAIK,0BAAC,CAACC,KAAF,CAAQW,SAAR,CAAJ,EAAwB;AACtBD,UAAAA,YAAY,CAACE,IAAb,CAAkBtB,MAAlB;AACD,SAFD,MAEO;AACL,cAAIuB,WAAW,GAAG,CAAlB;;AACA,eAAK,MAAMC,QAAX,IAAuBH,SAAvB,EAAkC;AAChCD,YAAAA,YAAY,CAACE,IAAb,CAAkB;AAChBlB,cAAAA,WAAW,EAAEoB,QADG;AAEhBhB,cAAAA,UAAU,EAAGe,WAAW,KAAK,CAAjB,GAAsBvB,MAAM,CAACQ,UAA7B,GAA0CC,0BAAC,CAACgB,IAAF,CAAOzB,MAAM,CAACQ,UAAd,EAA0B,CAAC,iBAAD,CAA1B;AAFtC,aAAlB;AAIAe,YAAAA,WAAW;AACZ;AACF;AACF;;AACD,aAAOH,YAAP;AACD,KAnBD;;AAqBA,QAAI3C,IAAI,GAAG,IAAX;AACA,QAAIF,OAAO,GAAG,IAAd;;AACA,QAAI;AACF,YAAMmD,GAAG,GAAG,MAAMhD,yBAAK,CAAC;AACtBL,QAAAA,MAAM,EAAE,MADc;AAEtBI,QAAAA,IAAI,EAAE;AACJkD,UAAAA,OAAO,EAAE,KAAKjE,IAAL,CAAUhD,YAAY,CAACmB,kBAAvB;AADL,SAFgB;AAKtBqC,QAAAA,GAAG,EAAE,IAAI0D,GAAJ,CAAQC,wBAAI,CAACtB,IAAL,CAAW,GAAE,KAAK7C,IAAL,CAAUhD,YAAY,CAACkB,eAAvB,EAAwCkG,OAAxC,CAAgD,KAAhD,EAAuD,OAAvD,EAAgEA,OAAhE,CAAwE,IAAxE,EAA8E,MAA9E,CAAsF,EAAnG,EAAsG,UAAtG,CAAR,EAA2HC,QAA3H;AALiB,OAAD,CAAvB;AAOAtD,MAAAA,IAAI,GAAGiD,GAAG,CAACjD,IAAX;AACAF,MAAAA,OAAO,GAAGmD,GAAG,CAACnD,OAAd;AACD,KAVD,CAUE,OAAOQ,GAAP,EAAY;AACZ,aAAOiD,OAAO,CAACC,MAAR,CAAe,IAAInD,KAAJ,CAAW,qCAAoCC,GAAG,CAACmD,QAAJ,CAAazD,IAAb,CAAkB0D,OAAlB,IAA6B,eAAgB,EAA5F,CAAf,CAAP;AACD;;AAED,WAAO,IAAIH,OAAJ,CAAY,CAACI,OAAD,EAAUH,MAAV,KAAqB;AACtC,YAAMI,UAAU,GAAI,GAAE,KAAK3E,IAAL,CAAUhD,YAAY,CAACkB,eAAvB,CAAwC,OAAM6C,IAAI,CAAC6D,IAAK,EAA9E;;AACA,YAAMC,OAAO,GAAIC,UAAD,IAAgB;AAC9BA,QAAAA,UAAU,GAAGA,UAAU,IAAI,CAA3B;AACA,eAAO,IAAIR,OAAJ,CAAY,CAACI,OAAD,EAAUH,MAAV,KAAqB;AACtC,cAAI,gBAAgB1D,OAApB,EAA6B;AAC3B,iBAAKkE,EAAL,GAAU,IAAIC,sBAAJ,CAAcL,UAAd,EAA0B;AAClC9D,cAAAA,OAAO,EAAE;AACPoE,gBAAAA,MAAM,EAAEpE,OAAO,CAAC,YAAD;AADR;AADyB,aAA1B,CAAV;AAKD,WAND,MAMO;AACL,iBAAKkE,EAAL,GAAU,IAAIC,sBAAJ,CAAcL,UAAd,CAAV;AACD;;AACD,eAAKI,EAAL,CAAQG,EAAR,CAAW,MAAX,EAAmB,MAAM;AACvBR,YAAAA,OAAO;AACR,WAFD;AAGA,eAAKK,EAAL,CAAQG,EAAR,CAAW,OAAX,EAAoB,MAAM;AACxB,gBAAIJ,UAAU,KAAK,KAAK9E,IAAL,CAAUhD,YAAY,CAACoC,iCAAvB,CAAnB,EAA8E;AAC5EmF,cAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAW,kCAAiCuD,UAAW,EAAvD,CAAD,CAAN;AACD;;AACDpC,YAAAA,UAAU,CAAC,MAAMsC,OAAO,CAACC,UAAU,GAAG,CAAd,CAAP,CAAwBK,IAAxB,CAA6BT,OAA7B,EAAsCU,KAAtC,CAA4Cb,MAA5C,CAAP,EAA4D,KAAKvE,IAAL,CAAUhD,YAAY,CAACqC,8BAAvB,CAA5D,CAAV;AACD,WALD;AAMD,SAnBM,CAAP;AAoBD,OAtBD;;AAuBAwF,MAAAA,OAAO,GAAGM,IAAV,CAAe,MAAM;AACnB,aAAKpF,YAAL,CAAkBmF,EAAlB,CAAqB,2BAArB,EAAkD,MAAM;AACtDpI,UAAAA,KAAK,CAAC,sBAAD,CAAL;AACA,gBAAMuI,OAAO,GAAGC,IAAI,CAACC,SAAL,CAAe;AAC7BC,YAAAA,MAAM,EAAE,UADqB;AAE7BC,YAAAA,SAAS,EAAE,KAAKA;AAFa,WAAf,CAAhB;AAIA,eAAKV,EAAL,CAAQW,IAAR,CAAaL,OAAb;AACA,eAAKN,EAAL,CAAQY,KAAR;AACD,SARD;;AASA,YAAI,CAAC5C,0BAAC,CAAC6C,OAAF,CAAU,KAAK5F,IAAL,CAAUhD,YAAY,CAAC8B,qBAAvB,CAAV,CAAL,EAA+D;AAC7D,cAAI,KAAKkB,IAAL,CAAUhD,YAAY,CAAC8B,qBAAvB,MAAkD,EAAtD,EAA0D;AACxD,iBAAKkB,IAAL,CAAUhD,YAAY,CAAC8B,qBAAvB,IAAgD,EAAhD;AACD,WAFD,MAEO;AACL,iBAAKkB,IAAL,CAAUhD,YAAY,CAAC8B,qBAAvB,IAAgD,KAAKkB,IAAL,CAAUhD,YAAY,CAAC8B,qBAAvB,EAA8C+G,KAA9C,CAAoD,GAApD,CAAhD;AACD;AACF;;AAED,aAAKC,OAAL,GAAe,IAAf;AACA,aAAKC,QAAL,GAAgB,CAAhB;AACA,aAAKC,QAAL,GAAgB,IAAhB;AAEA,aAAKC,QAAL,GAAgB,IAAhB;AACAnJ,QAAAA,KAAK,CAAE,2BAA0B6H,UAAW,UAAvC,CAAL;AACA,cAAMU,OAAO,GAAG;AACdG,UAAAA,MAAM,EAAE,UADM;AAEdU,UAAAA,eAAe,EAAE,KAAKlG,IAAL,CAAUhD,YAAY,CAACoB,2BAAvB,CAFH;AAGd+H,UAAAA,SAAS,EAAE,KAAKnG,IAAL,CAAUhD,YAAY,CAACyB,cAAvB,CAHG;AAId2H,UAAAA,cAAc,EAAE,KAAKpG,IAAL,CAAUhD,YAAY,CAACqJ,mBAAvB,CAJF;AAKdC,UAAAA,mBAAmB,EAAE,KAAKtG,IAAL,CAAUhD,YAAY,CAACuB,wBAAvB,CALP;AAMdgI,UAAAA,mBAAmB,EAAE,KAAKvG,IAAL,CAAUhD,YAAY,CAACwB,wBAAvB,CANP;AAOdgI,UAAAA,kBAAkB,EAAE,KAAKxG,IAAL,CAAUhD,YAAY,CAACsB,uBAAvB,CAPN;AAQdmI,UAAAA,wBAAwB,EAAE,KAAKzG,IAAL,CAAUhD,YAAY,CAACqB,6BAAvB,CARZ;AASdqI,UAAAA,cAAc,EAAE,KAAK1G,IAAL,CAAUhD,YAAY,CAAC4B,mBAAvB,CATF;AAUd+H,UAAAA,eAAe,EAAE,KAAK3G,IAAL,CAAUhD,YAAY,CAAC0B,oBAAvB,CAVH;AAWdkI,UAAAA,kBAAkB,EAAE,KAAK5G,IAAL,CAAUhD,YAAY,CAAC2B,uBAAvB,CAXN;AAYdkI,UAAAA,UAAU,EAAE,KAAK7G,IAAL,CAAUhD,YAAY,CAAC6B,eAAvB,CAZE;AAadiI,UAAAA,gBAAgB,EAAE,KAAK9G,IAAL,CAAUhD,YAAY,CAAC8B,qBAAvB,CAbJ;AAcdiI,UAAAA,eAAe,EAAE,KAAK/G,IAAL,CAAUhD,YAAY,CAACgC,oBAAvB,CAdH;AAedgI,UAAAA,iBAAiB,EAAE,KAAKhH,IAAL,CAAUhD,YAAY,CAACiC,kBAAvB,CAfL;AAgBdgI,UAAAA,iBAAiB,EAAE,KAAKjH,IAAL,CAAUhD,YAAY,CAACkC,sBAAvB,CAhBL;AAiBdgI,UAAAA,iBAAiB,EAAE,KAAKlH,IAAL,CAAUhD,YAAY,CAACmC,sBAAvB,KAAkD,KAjBvD;AAkBdgI,UAAAA,oBAAoB,EAAE,KAAKnH,IAAL,CAAUhD,YAAY,CAACsC,oCAAvB,IAA+D,KAAKU,IAAL,CAAUhD,YAAY,CAACuC,6BAAvB,CAA/D,GAAuH,IAlB/H;AAmBd6H,UAAAA,UAAU,EAAE;AACVC,YAAAA,OAAO,EAAE,KAAKrH,IAAL,CAAUhD,YAAY,CAACC,mBAAvB,CADC;AAEVqK,YAAAA,UAAU,EAAE,KAAKtH,IAAL,CAAUhD,YAAY,CAACE,sBAAvB,CAFF;AAGVqK,YAAAA,QAAQ,EAAE,KAAKvH,IAAL,CAAUhD,YAAY,CAACI,oBAAvB,KAAgD;AAHhD,WAnBE;AAwBdoK,UAAAA,UAAU,EAAE;AACVC,YAAAA,OAAO,EAAE,KAAKzH,IAAL,CAAUhD,YAAY,CAACY,YAAvB,CADC;AAEV8J,YAAAA,UAAU,EAAE,KAAK1H,IAAL,CAAUhD,YAAY,CAACa,eAAvB,CAFF;AAGV8J,YAAAA,QAAQ,EAAE,KAAK3H,IAAL,CAAUhD,YAAY,CAACe,aAAvB,KAAyC;AAHzC;AAxBE,SAAhB;AA+BAjB,QAAAA,KAAK,CAACwI,IAAI,CAACC,SAAL,CAAeF,OAAf,EAAwB,IAAxB,EAA8B,CAA9B,CAAD,CAAL;AACA,aAAKN,EAAL,CAAQW,IAAR,CAAaJ,IAAI,CAACC,SAAL,CAAeF,OAAf,CAAb;AAEA,aAAKN,EAAL,CAAQG,EAAR,CAAW,OAAX,EAAqB7D,GAAD,IAAS;AAC3BvE,UAAAA,KAAK,CAACuE,GAAD,CAAL;;AACA,cAAI,CAAC,KAAK4E,QAAV,EAAoB;AAClB,iBAAK9D,GAAL,GAAW,IAAX;AACAoC,YAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAW,GAAE,KAAKqE,SAAU,8BAA6Bd,UAAW,WAAUtD,GAAG,CAACoD,OAAJ,IAAepD,GAAI,EAAjG,CAAD,CAAN;AACD;AACF,SAND;AAOA,aAAK0D,EAAL,CAAQG,EAAR,CAAW,SAAX,EAAsB,MAAOnE,IAAP,IAAgB;AACpC,gBAAM6G,UAAU,GAAGtC,IAAI,CAACuC,KAAL,CAAW9G,IAAX,CAAnB;;AAEA,gBAAM+G,aAAa,GAAG/E,0BAAC,CAACgF,SAAF,CAAYH,UAAZ,CAAtB;;AACAE,UAAAA,aAAa,CAAC5F,UAAd,GAA2B,sBAA3B;AAEApF,UAAAA,KAAK,CAACwI,IAAI,CAACC,SAAL,CAAeuC,aAAf,EAA8B,IAA9B,EAAoC,CAApC,CAAD,CAAL;;AAEA,cAAIF,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAC1G,MAAX,KAAsB,aAA1E,EAAyF;AACvF,iBAAKuE,SAAL,GAAiBmC,UAAU,CAACK,UAAX,CAAsBxC,SAAvC;AACD;;AAED,cAAImC,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAC1G,MAAX,KAAsB,cAA1E,EAA0F;AACxFqD,YAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAU,qDAAV,CAAD,CAAN;AACD;;AAED,cAAIwG,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAC1G,MAAX,KAAsB,WAAtE,IAAqF0G,UAAU,CAACM,KAAX,KAAqB,gBAA9G,EAAgI;AAC9H3D,YAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAU,gCAAV,CAAD,CAAN;AACD;;AAED,cAAIwG,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAC1G,MAAX,KAAsB,WAA1E,EAAuF;AACrFwD,YAAAA,OAAO;AACR;;AAED,cAAIkD,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAC1G,MAAX,KAAsB,cAA1E,EAA0F;AACxF,kBAAMiH,MAAM,GAAG,KAAKC,cAAL,CAAoB,KAAKC,QAAL,CAAcrL,YAAY,CAACK,aAA3B,CAApB,CAAf;;AACA,gBAAIuK,UAAU,CAACU,eAAX,IAA8BV,UAAU,CAACU,eAAX,GAA6B,CAA/D,EAAkE;AAChE,mBAAKvI,YAAL,CAAkBwI,IAAlB,CAAuB,sBAAvB,EAA+C,IAA/C,EAAqD;AACnDP,gBAAAA,IAAI,EAAEjF,0BAAC,CAACC,KAAF,CAAQmF,MAAR,IAAkB,SAAlB,GAA8B,aADe;AAEnDK,gBAAAA,UAAU,EAAE,kCAFuC;AAGnDC,gBAAAA,OAAO,EAAEb,UAAU,CAACU,eAH+B;AAInDH,gBAAAA;AAJmD,eAArD;AAMD;AACF;;AAED,cAAIP,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,OAAtC,EAA+C;AAC7C,iBAAK7F,GAAL,GAAW,IAAX;AACAoC,YAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAW,UAASwG,UAAU,CAACnD,OAAQ,EAAvC,CAAD,CAAN;AACApC,YAAAA,UAAU,CAAC,IAAIjB,KAAJ,CAAW,UAASwG,UAAU,CAACnD,OAAQ,EAAvC,CAAD,CAAV;AACD;;AAED,cAAImD,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,SAAtC,EAAiD;AAC/C,iBAAK7F,GAAL,GAAW,IAAX;;AACA,gBAAIyF,UAAU,CAAC7G,IAAX,CAAgB+E,OAAhB,CAAwB1C,MAAxB,GAAiC,CAArC,EAAwC;AACtCf,cAAAA,UAAU,CAAC,IAAIjB,KAAJ,CAAW,uBAAsBwG,UAAU,CAAC7G,IAAX,CAAgB+E,OAAhB,CAAwB,CAAxB,EAA2B,CAA3B,EAA8B4C,OAA9B,CAAsC,CAAtC,CAAyC,kDAAiD,KAAK1I,IAAL,CAAUhD,YAAY,CAACuC,6BAAvB,IAAwD,IAAK,GAAxL,CAAD,CAAV;AACA,mBAAKoJ,IAAL;AACD;AACF;;AAED,cAAIf,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,YAAtC,EAAoD;AAClD,iBAAKjI,YAAL,CAAkBwI,IAAlB,CAAuB,oBAAvB,EAA6C,KAAK5G,SAAlD,EAA6D;AAC3DiH,cAAAA,IAAI,EAAE,iBADqD;AAE3DC,cAAAA,QAAQ,EAAE,WAFiD;AAG3DC,cAAAA,MAAM,EAAElB,UAAU,CAAC1F;AAHwC,aAA7D;AAKD;;AAED,cAAI0F,UAAU,IAAIA,UAAU,CAAC7G,IAAzB,IAAiC6G,UAAU,CAAC7G,IAAX,CAAgBgI,KAAhB,KAA0B,KAA/D,EAAsE;AACpE,gBAAI,KAAK/I,IAAL,CAAUhD,YAAY,CAACwC,0CAAvB,KAAsEoI,UAAU,CAAC7G,IAAX,CAAgBmC,KAAtF,IAA+F0E,UAAU,CAAC7G,IAAX,CAAgBmC,KAAhB,GAAwB,IAAxB,GAA+B,KAAKlD,IAAL,CAAUhD,YAAY,CAACyC,mCAAvB,CAAlI,EAA+L;AAC7L4C,cAAAA,UAAU,CAAC,IAAIjB,KAAJ,CAAW,uBAAsBwG,UAAU,CAAC7G,IAAX,CAAgBmC,KAAM,gDAA+C,KAAKlD,IAAL,CAAUhD,YAAY,CAACyC,mCAAvB,IAA8D,IAAK,GAAzK,CAAD,CAAV;AACA,mBAAKkJ,IAAL;AACD;;AACD,gBAAI,KAAKK,QAAT,EAAmB;AACjB,kBAAI,CAACjG,0BAAC,CAACC,KAAF,CAAQ4E,UAAU,CAAC7G,IAAX,CAAgBmC,KAAxB,CAAD,IAAmC0E,UAAU,CAAC7G,IAAX,CAAgBmC,KAAhB,GAAwB,KAAK8F,QAAL,CAAcjI,IAAd,CAAmBoB,GAA3C,GAAiD8G,QAAQ,CAAC,KAAKjJ,IAAL,CAAUhD,YAAY,CAACS,iCAAvB,CAAD,CAAR,GAAsE,IAA9J,EAAoK;AAClK,oBAAI,KAAKyC,OAAL,CAAakD,MAAb,GAAsB,CAA1B,EAA6B;AAC3Bf,kBAAAA,UAAU,CAACG,UAAU,CAAC,KAAKtC,OAAN,EAAe,KAAKuC,eAApB,CAAX,CAAV;AACA,uBAAKuD,QAAL,GAAgB,KAAhB;AACA,uBAAKvD,eAAL,GAAuB,KAAKvC,OAAL,CAAa,KAAKA,OAAL,CAAakD,MAAb,GAAsB,CAAnC,CAAvB;AACA,uBAAKlD,OAAL,GAAe,EAAf;AACD;AACF;AACF;AACF;;AAED,cAAI0H,UAAU,IAAIA,UAAU,CAAC7G,IAAzB,IAAiC6G,UAAU,CAAC7G,IAAX,CAAgBiH,IAAhB,KAAyB,KAA1D,IAAmEJ,UAAU,CAAC7G,IAAX,CAAgBgI,KAAvF,EAA8F;AAC5F,gBAAI,KAAK/I,IAAL,CAAUhD,YAAY,CAACQ,yBAAvB,MAAsD,UAA1D,EAAsE;AACpE,kBAAI8E,MAAM,GAAG;AAAEI,gBAAAA,WAAW,EAAEkF,UAAU,CAAC7G,IAAX,CAAgB0D;AAA/B,eAAb;;AACA,kBAAI,KAAKuB,QAAT,EAAmB;AACjB,sBAAMlD,UAAU,GAAG8E,UAAnB;AACA9E,gBAAAA,UAAU,CAACG,eAAX,GAA6B2E,UAAU,CAAC7G,IAAX,CAAgBmC,KAA7C;AACAJ,gBAAAA,UAAU,CAACK,aAAX,GAA2ByE,UAAU,CAAC7G,IAAX,CAAgBoB,GAAhB,GAAsByF,UAAU,CAAC7G,IAAX,CAAgBmC,KAAjE;AACAZ,gBAAAA,MAAM,GAAGf,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBc,MAAlB,EAA0B;AAAEQ,kBAAAA;AAAF,iBAA1B,CAAT;AACA,qBAAKkD,QAAL,GAAgB,KAAhB;AACD,eAND,MAMO;AACL,sBAAMlD,UAAU,GAAG8E,UAAnB;AACA9E,gBAAAA,UAAU,CAACG,eAAX,GAA6B2E,UAAU,CAAC7G,IAAX,CAAgBmC,KAAhB,GAAwB,KAAK8F,QAAL,CAAcjI,IAAd,CAAmBoB,GAAxE;AACAW,gBAAAA,UAAU,CAACK,aAAX,GAA2ByE,UAAU,CAAC7G,IAAX,CAAgBoB,GAAhB,GAAsByF,UAAU,CAAC7G,IAAX,CAAgBmC,KAAjE;AACAZ,gBAAAA,MAAM,GAAGf,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBc,MAAlB,EAA0B;AAAEQ,kBAAAA;AAAF,iBAA1B,CAAT;AACD;;AACD,mBAAKkG,QAAL,GAAgBpB,UAAhB;AACA,mBAAK1H,OAAL,CAAa0D,IAAb,CAAkBtB,MAAlB;AACA,mBAAKpC,OAAL,CAAagJ,OAAb,CAAqB5G,MAAM,IAAID,UAAU,CAACC,MAAD,CAAzC;AACA,mBAAKpC,OAAL,GAAe,EAAf;AACD;;AACD,gBAAI,KAAKF,IAAL,CAAUhD,YAAY,CAACQ,yBAAvB,MAAsD,OAAtD,IAAiE,KAAKwC,IAAL,CAAUhD,YAAY,CAACQ,yBAAvB,MAAsD,QAA3H,EAAqI;AACnI,kBAAI8E,MAAM,GAAG;AAAEI,gBAAAA,WAAW,EAAEkF,UAAU,CAAC7G,IAAX,CAAgB0D;AAA/B,eAAb;;AACA,kBAAI,KAAKuB,QAAT,EAAmB;AACjB,sBAAMlD,UAAU,GAAG8E,UAAnB;AACA9E,gBAAAA,UAAU,CAACG,eAAX,GAA6B2E,UAAU,CAAC7G,IAAX,CAAgBmC,KAA7C;AACAJ,gBAAAA,UAAU,CAACK,aAAX,GAA2ByE,UAAU,CAAC7G,IAAX,CAAgBoB,GAAhB,GAAsByF,UAAU,CAAC7G,IAAX,CAAgBmC,KAAjE;AACAZ,gBAAAA,MAAM,GAAGf,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBc,MAAlB,EAA0B;AAAEQ,kBAAAA;AAAF,iBAA1B,CAAT;AACA,qBAAKkD,QAAL,GAAgB,KAAhB;AACD,eAND,MAMO;AACL,sBAAMlD,UAAU,GAAG8E,UAAnB;AACA9E,gBAAAA,UAAU,CAACG,eAAX,GAA6B2E,UAAU,CAAC7G,IAAX,CAAgBmC,KAAhB,GAAwB,KAAK8F,QAAL,CAAcjI,IAAd,CAAmBoB,GAAxE;AACAW,gBAAAA,UAAU,CAACK,aAAX,GAA2ByE,UAAU,CAAC7G,IAAX,CAAgBoB,GAAhB,GAAsByF,UAAU,CAAC7G,IAAX,CAAgBmC,KAAjE;AACAZ,gBAAAA,MAAM,GAAGf,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBc,MAAlB,EAA0B;AAAEQ,kBAAAA;AAAF,iBAA1B,CAAT;AACD;;AACD,mBAAKkG,QAAL,GAAgBpB,UAAhB;AACA,mBAAK1H,OAAL,CAAa0D,IAAb,CAAkBtB,MAAlB;AACA,oBAAM6G,eAAe,GAAG9F,YAAY,CAAC,KAAKnD,OAAN,CAApC;AACAiJ,cAAAA,eAAe,CAACD,OAAhB,CAAwB5G,MAAM,IAAID,UAAU,CAACC,MAAD,CAA5C;AACA,mBAAKpC,OAAL,GAAe,EAAf;AACD;;AACD,gBAAI,KAAKF,IAAL,CAAUhD,YAAY,CAACQ,yBAAvB,MAAsD,MAAtD,IAAgE,KAAKwC,IAAL,CAAUhD,YAAY,CAACQ,yBAAvB,MAAsD,QAA1H,EAAoI;AAClI,oBAAM8E,MAAM,GAAG;AAAEI,gBAAAA,WAAW,EAAEkF,UAAU,CAAC7G,IAAX,CAAgB0D,OAA/B;AAAwC3B,gBAAAA,UAAU,EAAE8E;AAApD,eAAf;AACA,mBAAK1H,OAAL,CAAa0D,IAAb,CAAkBtB,MAAlB;AACA,mBAAK0G,QAAL,GAAgBpB,UAAhB;AACD;AACF;AACF,SAzHD;AA0HD,OA3LD,EA2LGxC,KA3LH,CA2LS/D,GAAG,IAAI;AACdkD,QAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAU,YAAYC,GAAtB,CAAD,CAAN;AACD,OA7LD;AA8LD,KAvNM,CAAP;AAwND;;AAEa,QAAR+H,QAAQ,CAAEvH,GAAF,EAAO;AACnB/E,IAAAA,KAAK,CAAC,iBAAD,CAAL;AAEAA,IAAAA,KAAK,CAAC+E,GAAD,CAAL;;AAEA,QAAI,CAACA,GAAG,CAACwH,WAAT,EAAsB;AACpBxH,MAAAA,GAAG,CAACwH,WAAJ,GAAkB,EAAlB;AACD;;AACD,WAAO,IAAI/E,OAAJ,CAAY,CAACI,OAAD,EAAUH,MAAV,KAAqB;AACtChC,MAAAA,UAAU,CAAC,YAAY;AACrB,YAAI+G,QAAQ,GAAG,CAAf;;AACA,YAAIzH,GAAG,IAAIA,GAAG,CAAC0H,OAAX,IAAsB1H,GAAG,CAAC0H,OAAJ,CAAYnG,MAAZ,GAAqB,CAA/C,EAAkD;AAChD,gBAAMiC,OAAO,GAAGC,IAAI,CAACC,SAAL,CAAe;AAC7BC,YAAAA,MAAM,EAAE,UADqB;AAE7BgE,YAAAA,MAAM,EAAE3H,GAAG,CAAC0H,OAAJ,CAAY,CAAZ,EAAeE,OAFM;AAG7BhE,YAAAA,SAAS,EAAE,KAAKA;AAHa,WAAf,CAAhB;AAKA,eAAKV,EAAL,CAAQW,IAAR,CAAaL,OAAb;AACD,SAPD,MAOO,IAAIxD,GAAG,IAAIA,GAAG,CAACa,WAAf,EAA4B;AACjC,cAAI,CAAC,KAAKnC,cAAV,EAA0BgE,MAAM,CAAC,IAAInD,KAAJ,CAAU,gDAAV,CAAD,CAAN;;AAC1B,cAAI,KAAKb,cAAT,EAAyB;AACvB,kBAAMmJ,UAAU,GAAG,EACjB,GAAG,KAAKnJ,cADS;AAEjBE,cAAAA,MAAM,EAAE,EACN,IAAI,KAAKF,cAAL,CAAoBE,MAApB,IAA8B,EAAlC,CADM;AAENkJ,gBAAAA,IAAI,EAAE9H,GAAG,CAACa;AAFJ,eAFS;AAMjB3B,cAAAA,IAAI,EAAE,KAAKsH,QAAL,CAAcrL,YAAY,CAACe,aAA3B,CANW;AAOjB6L,cAAAA,YAAY,EAAE;AAPG,aAAnB;AASA/H,YAAAA,GAAG,CAACiB,UAAJ,GAAiB4G,UAAjB;AAEA,gBAAIG,WAAW,GAAG,IAAlB;;AACA,gBAAI;AACFA,cAAAA,WAAW,GAAG,MAAM7I,yBAAK,CAAC0I,UAAD,CAAzB;AACD,aAFD,CAEE,OAAOrI,GAAP,EAAY;AACZkD,cAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAW,QAAOS,GAAG,CAACa,WAAY,cAAa,KAAKpB,kBAAL,CAAwBD,GAAxB,CAA6B,EAA5E,CAAD,CAAN;AACD;;AACD,gBAAIQ,GAAG,IAAIA,GAAG,CAACa,WAAX,IAA0Bb,GAAG,CAACa,WAAJ,CAAgBU,MAAhB,GAAyB,CAAvD,EAA0D;AACxD,oBAAM+E,MAAM,GAAG,KAAKC,cAAL,CAAoB,KAAKC,QAAL,CAAcrL,YAAY,CAACe,aAA3B,CAApB,CAAf;;AACA,mBAAKgC,YAAL,CAAkBwI,IAAlB,CAAuB,sBAAvB,EAA+C,KAAK5G,SAApD,EAA+D;AAC7DqG,gBAAAA,IAAI,EAAEjF,0BAAC,CAACC,KAAF,CAAQmF,MAAR,IAAkB,SAAlB,GAA8B,aADyB;AAE7DK,gBAAAA,UAAU,EAAE,qCAFiD;AAG7DC,gBAAAA,OAAO,EAAE5G,GAAG,CAACa,WAAJ,CAAgBU,MAHoC;AAI7D+E,gBAAAA;AAJ6D,eAA/D;AAMD;;AACD,gBAAI2B,MAAM,CAACC,QAAP,CAAgBF,WAAW,CAAC9I,IAA5B,CAAJ,EAAuC;AACrCuI,cAAAA,QAAQ,GAAGO,WAAW,CAAChJ,OAAZ,CAAoB,kBAApB,CAAX;AACA,oBAAMwE,OAAO,GAAGC,IAAI,CAACC,SAAL,CAAe;AAC7BC,gBAAAA,MAAM,EAAE,WADqB;AAE7BwE,gBAAAA,IAAI,EAAE,KAFuB;AAG7BvE,gBAAAA,SAAS,EAAE,KAAKA,SAHa;AAI7BwE,gBAAAA,UAAU,EAAEJ,WAAW,CAAC9I,IAAZ,CAAiBsD,QAAjB,CAA0B,QAA1B;AAJiB,eAAf,CAAhB;AAMAxC,cAAAA,GAAG,CAACwH,WAAJ,CAAgBzF,IAAhB,CAAqB;AACnBgF,gBAAAA,IAAI,EAAE,SADa;AAEnBC,gBAAAA,QAAQ,EAAE,WAFS;AAGnBC,gBAAAA,MAAM,EAAEe,WAAW,CAAC9I,IAAZ,CAAiBsD,QAAjB,CAA0B,QAA1B;AAHW,eAArB;AAKA,mBAAKU,EAAL,CAAQW,IAAR,CAAaL,OAAb;AACD,aAdD,MAcO;AACLd,cAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAW,4BAA2B,KAAKD,wBAAL,CAA8B0I,WAAW,CAAC9I,IAA1C,CAAgD,EAAtF,CAAD,CAAN;AACD;AACF;AACF;;AACD,YAAIc,GAAG,IAAIA,GAAG,CAACqI,KAAX,IAAoBrI,GAAG,CAACqI,KAAJ,CAAU9G,MAAV,GAAmB,CAAvC,IAA4CvB,GAAG,CAACqI,KAAJ,CAAU,CAAV,EAAaC,MAA7D,EAAqE;AACnE,gBAAM9E,OAAO,GAAGC,IAAI,CAACC,SAAL,CAAe;AAC7BC,YAAAA,MAAM,EAAE,WADqB;AAE7BC,YAAAA,SAAS,EAAE,KAAKA,SAFa;AAG7BwE,YAAAA,UAAU,EAAEpI,GAAG,CAACqI,KAAJ,CAAU,CAAV,EAAaC,MAAb,CAAoB9F,QAApB,CAA6B,QAA7B;AAHiB,WAAf,CAAhB;AAKA,eAAKU,EAAL,CAAQW,IAAR,CAAaL,OAAb;AACAxD,UAAAA,GAAG,CAACwH,WAAJ,CAAgBzF,IAAhB,CAAqB;AACnBgF,YAAAA,IAAI,EAAE/G,GAAG,CAACqI,KAAJ,CAAU,CAAV,EAAaE,QADA;AAEnBvB,YAAAA,QAAQ,EAAEhH,GAAG,CAACqI,KAAJ,CAAU,CAAV,EAAarB,QAFJ;AAGnBC,YAAAA,MAAM,EAAEjH,GAAG,CAACqI,KAAJ,CAAU,CAAV,EAAaC,MAAb,CAAoB9F,QAApB,CAA6B,QAA7B;AAHW,WAArB;AAKA,gBAAM;AAAEtD,YAAAA;AAAF,cAAW,MAAMC,yBAAK,CAAC;AAC3BL,YAAAA,MAAM,EAAE,MADmB;AAE3BI,YAAAA,IAAI,EAAEc,GAAG,CAACqI,KAAJ,CAAU,CAAV,EAAaC,MAFQ;AAG3BtJ,YAAAA,OAAO,EAAE,EACP,GAAG,KAAKC,WAAL,CAAiB9D,YAAY,CAACgB,gBAA9B,CADI;AAEP,8BAAgB;AAFT,aAHkB;AAO3BwC,YAAAA,GAAG,EAAE,KAAKS,YAAL,CAAkB,KAAKjB,IAAL,CAAUpC,YAA5B,EAA0C,iBAA1C,CAPsB;AAQ3ByM,YAAAA,gBAAgB,EAAEC,QARS;AAS3BC,YAAAA,aAAa,EAAED;AATY,WAAD,CAA5B;;AAWA,cAAIvJ,IAAI,IAAIA,IAAI,CAACuI,QAAjB,EAA2B;AACzBA,YAAAA,QAAQ,GAAGL,QAAQ,CAAClI,IAAI,CAACuI,QAAN,CAAnB;AACD,WAFD,MAEO;AACL/E,YAAAA,MAAM,CAAC,IAAInD,KAAJ,CAAU,+CAAV,CAAD,CAAN;AACD;AACF;;AACDmB,QAAAA,UAAU,CAACmC,OAAD,EAAU4E,QAAQ,GAAG,IAArB,CAAV;AACD,OAvFS,EAuFP,CAvFO,CAAV;AAwFD,KAzFM,CAAP;AA0FD;;AAES,QAAJX,IAAI,GAAI;AACZ7L,IAAAA,KAAK,CAAE,GAAE,KAAK2I,SAAU,gBAAnB,CAAL;;AACA,QAAI,KAAKV,EAAL,IAAW,KAAKA,EAAL,CAAQyF,UAAR,KAAuBxF,sBAAS,CAACyF,MAAhD,EAAwD;AACtD,YAAMpF,OAAO,GAAGC,IAAI,CAACC,SAAL,CAAe;AAC7BC,QAAAA,MAAM,EAAE,UADqB;AAE7BC,QAAAA,SAAS,EAAE,KAAKA;AAFa,OAAf,CAAhB;AAIA,WAAKV,EAAL,CAAQW,IAAR,CAAaL,OAAb;AACA,YAAM,IAAIf,OAAJ,CAAYI,OAAO,IAAI;AAC3BnC,QAAAA,UAAU,CAACmC,OAAD,EAAU,KAAV,CAAV;AACAgG,QAAAA,WAAW,CAAC,MAAM;AAChB,cAAI,KAAKvI,GAAT,EAAc;AACZ,iBAAK8D,QAAL,GAAgB,KAAhB;AACA,iBAAKlB,EAAL,GAAU,IAAV;AACA,iBAAKrD,IAAL,GAAY,EAAZ;AACAgD,YAAAA,OAAO;AACR;AACF,SAPU,EAOR,IAPQ,CAAX;AAQD,OAVK,CAAN;AAWD,KAjBD,MAiBO;AACL,WAAKuB,QAAL,GAAgB,KAAhB;AACA,WAAKlB,EAAL,GAAU,IAAV;AACA,WAAKrD,IAAL,GAAY,EAAZ;AACD;AACF;;AAEDhB,EAAAA,UAAU,CAAEiK,SAAF,EAAa;AACrB,QAAI,KAAK3K,IAAL,CAAU2K,SAAV,CAAJ,EAA0B;AACxB,UAAI5H,0BAAC,CAAC6H,QAAF,CAAW,KAAK5K,IAAL,CAAU2K,SAAV,CAAX,CAAJ,EAAsC,OAAOrF,IAAI,CAACuC,KAAL,CAAW,KAAK7H,IAAL,CAAU2K,SAAV,CAAX,CAAP,CAAtC,KACK,OAAO,KAAK3K,IAAL,CAAU2K,SAAV,CAAP;AACN;;AACD,WAAO,EAAP;AACD;;AAEDtC,EAAAA,QAAQ,CAAEwC,OAAF,EAAW;AACjB,QAAI,KAAK7K,IAAL,CAAU6K,OAAV,CAAJ,EAAwB;AACtB,UAAI9H,0BAAC,CAAC6H,QAAF,CAAW,KAAK5K,IAAL,CAAU6K,OAAV,CAAX,CAAJ,EAAoC,OAAOvF,IAAI,CAACuC,KAAL,CAAW,KAAK7H,IAAL,CAAU6K,OAAV,CAAX,CAAP,CAApC,KACK,OAAO,KAAK7K,IAAL,CAAU6K,OAAV,CAAP;AACN;;AACD,WAAO,IAAP;AACD;;AAED/J,EAAAA,WAAW,CAAEgK,UAAF,EAAc;AACvB,QAAI,KAAK9K,IAAL,CAAU8K,UAAV,CAAJ,EAA2B;AACzB,UAAI/H,0BAAC,CAAC6H,QAAF,CAAW,KAAK5K,IAAL,CAAU8K,UAAV,CAAX,CAAJ,EAAuC,OAAOxF,IAAI,CAACuC,KAAL,CAAW,KAAK7H,IAAL,CAAU8K,UAAV,CAAX,CAAP,CAAvC,KACK,OAAO,KAAK9K,IAAL,CAAU8K,UAAV,CAAP;AACN;;AACD,WAAO,EAAP;AACD;;AAED7J,EAAAA,YAAY,CAAE8J,OAAF,EAAWC,MAAX,EAAmB;AAC7B,WAAOD,OAAO,CAACE,MAAR,CAAe,CAAf,EAAkBF,OAAO,CAACG,OAAR,CAAgB,GAAhB,EAAqB,CAArB,CAAlB,IAA6CF,MAApD;AACD;;AAED7J,EAAAA,wBAAwB,CAAEJ,IAAF,EAAQ;AAC9B,QAAIA,IAAJ,EAAU;AACR,UAAIgC,0BAAC,CAACgH,QAAF,CAAWhJ,IAAX,CAAJ,EAAsB;AACpB,YAAI;AACFA,UAAAA,IAAI,GAAGA,IAAI,CAACsD,QAAL,EAAP;AACD,SAFD,CAEE,OAAOhD,GAAP,EAAY;AAEf;;AACD,aAAO0B,0BAAC,CAACoI,QAAF,CAAWpI,0BAAC,CAAC6H,QAAF,CAAW7J,IAAX,IAAmBA,IAAnB,GAA0BuE,IAAI,CAACC,SAAL,CAAexE,IAAf,CAArC,EAA2D;AAAEqC,QAAAA,MAAM,EAAE;AAAV,OAA3D,CAAP;AACD,KARD,MAQO;AACL,aAAO,EAAP;AACD;AACF;;AAED9B,EAAAA,kBAAkB,CAAED,GAAF,EAAO;AACvB,QAAIA,GAAG,IAAIA,GAAG,CAACmD,QAAf,EAAyB;AACvB,aAAQ,WAAUnD,GAAG,CAACmD,QAAJ,CAAatD,MAAO,gBAAe,KAAKC,wBAAL,CAA8BE,GAAG,CAACmD,QAAJ,CAAazD,IAA3C,CAAiD,EAAtG;AACD,KAFD,MAEO;AACL,aAAOM,GAAG,CAACoD,OAAX;AACD;AACF;;AAED2D,EAAAA,cAAc,CAAEgD,IAAF,EAAQ;AACpB,WAAOrI,0BAAC,CAACsI,GAAF,CAAMD,IAAN,EAAY,+BAAZ,KACLrI,0BAAC,CAACsI,GAAF,CAAMD,IAAN,EAAY,iCAAZ,CADK,IAELrI,0BAAC,CAACsI,GAAF,CAAMD,IAAN,EAAY,wBAAZ,CAFK,IAGLrI,0BAAC,CAACsI,GAAF,CAAMD,IAAN,EAAY,uCAAZ,CAHK,IAILrI,0BAAC,CAACsI,GAAF,CAAMD,IAAN,EAAY,mCAAZ,CAJK,IAKL,IALF;AAMD;;AApgBuB;;AAugB1B,aAAc,GAAGxL,mBAAjB;;uBCzkBc,GAAG;AACf0L,EAAAA,aAAa,EAAE,CADA;AAEfC,EAAAA,WAAW,EAAE3L,SAFE;AAGf4L,EAAAA,UAAU,EAAE;AACV5C,IAAAA,IAAI,EAAE,eADI;AAEV6C,IAAAA,QAAQ,EAAE,QAFA;AAGVC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,UAAU,EAAE,IADJ;AAERC,MAAAA,UAAU,EAAE;AAFJ,KAHA;AAOVC,IAAAA,YAAY,EAAE,CACZ;AACEjD,MAAAA,IAAI,EAAE,UADR;AAEEkD,MAAAA,KAAK,EAAE,4BAFT;AAGE9D,MAAAA,IAAI,EAAE,0BAHR;AAIE+D,MAAAA,QAAQ,EAAE;AAJZ,KADY,EAOZ;AACEnD,MAAAA,IAAI,EAAE,UADR;AAEEkD,MAAAA,KAAK,EAAE,0BAFT;AAGE9D,MAAAA,IAAI,EAAE,wBAHR;AAIE+D,MAAAA,QAAQ,EAAE;AAJZ,KAPY;AAPJ;AAHG;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"botium-connector-voip-cjs.js","sources":["../src/connector.js","../src/ignore-sd-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: 500,\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\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 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 (this.convoStep && this.convoStep.logicHooks && _.isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && 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 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.firstSttInfoReceived && this.convoStep && this.convoStep.logicHooks && _.isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && 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 this.firstSttInfoReceived = true\n if (this.prevData) {\n if (!_.isNil(parsedData.data.start) && parsedData.data.start - this.prevData.data.end > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {\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 }\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') {\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') {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n this.prevData = parsedData\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, 10000)\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\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 BotiumConnectorVoip = require('./src/connector')\nconst IgnoreSilenceDurationLogicHook = require('./src/ignore-sd-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 }\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","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","metricName","credits","logicHooks","find","lh","name","toFixed","mimeType","base64","final","prevData","parseInt","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","IgnoreSilenceDurationLogicHook","context","args","globalArgs","onBotPrepare","props","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required","PluginLogicHooks","VOIP_IGNORE_SILENCE_DURATION"],"mappings":"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"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import uuid from 'uuid';
|
|
2
1
|
import ws from 'ws';
|
|
3
2
|
import lodash from 'lodash';
|
|
4
3
|
import axios from 'axios';
|
|
5
|
-
import debug$
|
|
4
|
+
import debug$2 from 'debug';
|
|
6
5
|
import path from 'path';
|
|
7
6
|
|
|
8
|
-
const
|
|
9
|
-
v4: uuidv4
|
|
10
|
-
} = uuid;
|
|
11
|
-
const debug = debug$1('botium-connector-voip');
|
|
7
|
+
const debug$1 = debug$2('botium-connector-voip');
|
|
12
8
|
const Capabilities = {
|
|
13
9
|
VOIP_STT_URL_STREAM: 'VOIP_STT_URL_STREAM',
|
|
14
10
|
VOIP_STT_PARAMS_STREAM: 'VOIP_STT_PARAMS_STREAM',
|
|
@@ -73,10 +69,8 @@ class BotiumConnectorVoip {
|
|
|
73
69
|
constructor({
|
|
74
70
|
queueBotSays,
|
|
75
71
|
eventEmitter,
|
|
76
|
-
caps
|
|
77
|
-
setAsync
|
|
72
|
+
caps
|
|
78
73
|
}) {
|
|
79
|
-
setAsync(true);
|
|
80
74
|
this.queueBotSays = queueBotSays;
|
|
81
75
|
this.caps = caps;
|
|
82
76
|
this.eventEmitter = eventEmitter;
|
|
@@ -87,8 +81,8 @@ class BotiumConnectorVoip {
|
|
|
87
81
|
}
|
|
88
82
|
|
|
89
83
|
async Validate() {
|
|
90
|
-
debug('Validate called');
|
|
91
|
-
debug(this.caps.VOIP_STT_MESSAGE_HANDLING);
|
|
84
|
+
debug$1('Validate called');
|
|
85
|
+
debug$1(this.caps.VOIP_STT_MESSAGE_HANDLING);
|
|
92
86
|
|
|
93
87
|
if (this.caps.VOIP_TTS_URL) {
|
|
94
88
|
this.axiosTtsParams = {
|
|
@@ -107,7 +101,7 @@ class BotiumConnectorVoip {
|
|
|
107
101
|
});
|
|
108
102
|
|
|
109
103
|
if (data && data.status === 'OK') {
|
|
110
|
-
debug(`Checking TTS Status response: ${this._getAxiosShortenedOutput(data)}`);
|
|
104
|
+
debug$1(`Checking TTS Status response: ${this._getAxiosShortenedOutput(data)}`);
|
|
111
105
|
} else {
|
|
112
106
|
throw new Error(`Checking TTS Status failed, response is: ${this._getAxiosShortenedOutput(data)}`);
|
|
113
107
|
}
|
|
@@ -120,21 +114,13 @@ class BotiumConnectorVoip {
|
|
|
120
114
|
}
|
|
121
115
|
|
|
122
116
|
async Start() {
|
|
123
|
-
debug('Start called');
|
|
124
|
-
debug(this.caps[Capabilities.VOIP_TTS_URL]);
|
|
125
|
-
this.view = {
|
|
126
|
-
container: this,
|
|
127
|
-
context: {},
|
|
128
|
-
msg: {},
|
|
129
|
-
botium: {
|
|
130
|
-
conversationId: uuidv4(),
|
|
131
|
-
stepId: null
|
|
132
|
-
}
|
|
133
|
-
};
|
|
117
|
+
debug$1('Start called');
|
|
118
|
+
debug$1(this.caps[Capabilities.VOIP_TTS_URL]);
|
|
134
119
|
this.stopCalled = false;
|
|
135
120
|
this.fullRecord = '';
|
|
136
121
|
this.end = false;
|
|
137
122
|
this.connected = false;
|
|
123
|
+
this.convoStep = null;
|
|
138
124
|
|
|
139
125
|
const sendBotMsg = botMsg => {
|
|
140
126
|
setTimeout(() => this.queueBotSays(botMsg), 0);
|
|
@@ -229,16 +215,6 @@ class BotiumConnectorVoip {
|
|
|
229
215
|
};
|
|
230
216
|
|
|
231
217
|
connect().then(() => {
|
|
232
|
-
this.eventEmitter.on('RETRY_CONVO_ASYNC_RETRIED', () => {
|
|
233
|
-
debug('Retry event received');
|
|
234
|
-
const request = JSON.stringify({
|
|
235
|
-
METHOD: 'stopCall',
|
|
236
|
-
sessionId: this.sessionId
|
|
237
|
-
});
|
|
238
|
-
this.ws.send(request);
|
|
239
|
-
this.ws.close();
|
|
240
|
-
});
|
|
241
|
-
|
|
242
218
|
if (!lodash.isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {
|
|
243
219
|
if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {
|
|
244
220
|
this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = [];
|
|
@@ -247,11 +223,15 @@ class BotiumConnectorVoip {
|
|
|
247
223
|
}
|
|
248
224
|
}
|
|
249
225
|
|
|
226
|
+
this.eventEmitter.on('CONVO_STEP_NEXT', (container, convoStep) => {
|
|
227
|
+
this.convoStep = convoStep;
|
|
228
|
+
});
|
|
250
229
|
this.silence = null;
|
|
251
230
|
this.msgCount = 0;
|
|
252
231
|
this.firstMsg = true;
|
|
232
|
+
this.firstSttInfoReceived = false;
|
|
253
233
|
this.wsOpened = true;
|
|
254
|
-
debug(`Websocket connection to ${wsEndpoint} opened.`);
|
|
234
|
+
debug$1(`Websocket connection to ${wsEndpoint} opened.`);
|
|
255
235
|
const request = {
|
|
256
236
|
METHOD: 'initCall',
|
|
257
237
|
SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],
|
|
@@ -282,10 +262,10 @@ class BotiumConnectorVoip {
|
|
|
282
262
|
tts_body: this.caps[Capabilities.VOIP_TTS_BODY] || null
|
|
283
263
|
}
|
|
284
264
|
};
|
|
285
|
-
debug(JSON.stringify(request, null, 2));
|
|
265
|
+
debug$1(JSON.stringify(request, null, 2));
|
|
286
266
|
this.ws.send(JSON.stringify(request));
|
|
287
267
|
this.ws.on('error', err => {
|
|
288
|
-
debug(err);
|
|
268
|
+
debug$1(err);
|
|
289
269
|
|
|
290
270
|
if (!this.wsOpened) {
|
|
291
271
|
this.end = true;
|
|
@@ -298,7 +278,7 @@ class BotiumConnectorVoip {
|
|
|
298
278
|
const parsedDataLog = lodash.cloneDeep(parsedData);
|
|
299
279
|
|
|
300
280
|
parsedDataLog.fullRecord = '<full_record_buffer>';
|
|
301
|
-
debug(JSON.stringify(parsedDataLog, null, 2));
|
|
281
|
+
debug$1(JSON.stringify(parsedDataLog, null, 2));
|
|
302
282
|
|
|
303
283
|
if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'initialized') {
|
|
304
284
|
this.sessionId = parsedData.voipConfig.sessionId;
|
|
@@ -336,11 +316,9 @@ class BotiumConnectorVoip {
|
|
|
336
316
|
}
|
|
337
317
|
|
|
338
318
|
if (parsedData && parsedData.type === 'silence') {
|
|
339
|
-
this.
|
|
340
|
-
|
|
341
|
-
if (parsedData.data.silence.length > 0) {
|
|
319
|
+
if (this.convoStep && this.convoStep.logicHooks && lodash.isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && parsedData.data.silence.length > 0) {
|
|
320
|
+
this.end = true;
|
|
342
321
|
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`));
|
|
343
|
-
this.Stop();
|
|
344
322
|
}
|
|
345
323
|
}
|
|
346
324
|
|
|
@@ -350,14 +328,17 @@ class BotiumConnectorVoip {
|
|
|
350
328
|
mimeType: 'audio/wav',
|
|
351
329
|
base64: parsedData.fullRecord
|
|
352
330
|
});
|
|
331
|
+
this.end = true;
|
|
353
332
|
}
|
|
354
333
|
|
|
355
334
|
if (parsedData && parsedData.data && parsedData.data.final === false) {
|
|
356
|
-
if (this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {
|
|
357
|
-
|
|
358
|
-
this.
|
|
335
|
+
if (!this.firstSttInfoReceived && this.convoStep && this.convoStep.logicHooks && lodash.isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {
|
|
336
|
+
this.end = true;
|
|
337
|
+
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`));
|
|
359
338
|
}
|
|
360
339
|
|
|
340
|
+
this.firstSttInfoReceived = true;
|
|
341
|
+
|
|
361
342
|
if (this.prevData) {
|
|
362
343
|
if (!lodash.isNil(parsedData.data.start) && parsedData.data.start - this.prevData.data.end > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {
|
|
363
344
|
if (this.botMsgs.length > 0) {
|
|
@@ -445,8 +426,8 @@ class BotiumConnectorVoip {
|
|
|
445
426
|
}
|
|
446
427
|
|
|
447
428
|
async UserSays(msg) {
|
|
448
|
-
debug('UserSays called');
|
|
449
|
-
debug(msg);
|
|
429
|
+
debug$1('UserSays called');
|
|
430
|
+
debug$1(msg);
|
|
450
431
|
|
|
451
432
|
if (!msg.attachments) {
|
|
452
433
|
msg.attachments = [];
|
|
@@ -552,7 +533,7 @@ class BotiumConnectorVoip {
|
|
|
552
533
|
}
|
|
553
534
|
|
|
554
535
|
async Stop() {
|
|
555
|
-
debug(`${this.sessionId} - Stop called`);
|
|
536
|
+
debug$1(`${this.sessionId} - Stop called`);
|
|
556
537
|
|
|
557
538
|
if (this.ws && this.ws.readyState !== ws.CLOSED) {
|
|
558
539
|
const request = JSON.stringify({
|
|
@@ -566,15 +547,19 @@ class BotiumConnectorVoip {
|
|
|
566
547
|
if (this.end) {
|
|
567
548
|
this.wsOpened = false;
|
|
568
549
|
this.ws = null;
|
|
569
|
-
this.
|
|
550
|
+
this.end = false;
|
|
551
|
+
this.convoStep = null;
|
|
552
|
+
this.firstSttInfoReceived = false;
|
|
570
553
|
resolve();
|
|
571
554
|
}
|
|
572
|
-
},
|
|
555
|
+
}, 100);
|
|
573
556
|
});
|
|
574
557
|
} else {
|
|
575
558
|
this.wsOpened = false;
|
|
576
559
|
this.ws = null;
|
|
577
|
-
this.
|
|
560
|
+
this.end = false;
|
|
561
|
+
this.convoStep = null;
|
|
562
|
+
this.firstSttInfoReceived = false;
|
|
578
563
|
}
|
|
579
564
|
}
|
|
580
565
|
|
|
@@ -638,6 +623,20 @@ class BotiumConnectorVoip {
|
|
|
638
623
|
|
|
639
624
|
var connector = BotiumConnectorVoip;
|
|
640
625
|
|
|
626
|
+
const debug = debug$2('botium-voip-logichook-ignore-silence-duration');
|
|
627
|
+
var ignoreSdLogichook = class IgnoreSilenceDurationLogicHook {
|
|
628
|
+
constructor(context, caps = {}, args = {}) {
|
|
629
|
+
this.context = context;
|
|
630
|
+
this.caps = caps;
|
|
631
|
+
this.globalArgs = args;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
async onBotPrepare(props) {
|
|
635
|
+
debug('Silence duration assertion ignored by logic hook');
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
};
|
|
639
|
+
|
|
641
640
|
var botiumConnectorVoip = {
|
|
642
641
|
PluginVersion: 1,
|
|
643
642
|
PluginClass: connector,
|
|
@@ -659,11 +658,15 @@ var botiumConnectorVoip = {
|
|
|
659
658
|
type: 'speechsynthesisprofile',
|
|
660
659
|
required: true
|
|
661
660
|
}]
|
|
661
|
+
},
|
|
662
|
+
PluginLogicHooks: {
|
|
663
|
+
VOIP_IGNORE_SILENCE_DURATION: ignoreSdLogichook
|
|
662
664
|
}
|
|
663
665
|
};
|
|
664
666
|
var botiumConnectorVoip_1 = botiumConnectorVoip.PluginVersion;
|
|
665
667
|
var botiumConnectorVoip_2 = botiumConnectorVoip.PluginClass;
|
|
666
668
|
var botiumConnectorVoip_3 = botiumConnectorVoip.PluginDesc;
|
|
669
|
+
var botiumConnectorVoip_4 = botiumConnectorVoip.PluginLogicHooks;
|
|
667
670
|
|
|
668
|
-
export { botiumConnectorVoip_2 as PluginClass, botiumConnectorVoip_3 as PluginDesc, botiumConnectorVoip_1 as PluginVersion, botiumConnectorVoip as default };
|
|
671
|
+
export { botiumConnectorVoip_2 as PluginClass, botiumConnectorVoip_3 as PluginDesc, botiumConnectorVoip_4 as PluginLogicHooks, botiumConnectorVoip_1 as PluginVersion, botiumConnectorVoip as default };
|
|
669
672
|
//# sourceMappingURL=botium-connector-voip-es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"botium-connector-voip-es.js","sources":["../src/connector.js","../index.js"],"sourcesContent":["const { v4: uuidv4 } = require('uuid')\nconst 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: 500,\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, setAsync }) {\n setAsync(true)\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.view = {\n container: this,\n context: {},\n msg: {},\n botium: {\n conversationId: uuidv4(),\n stepId: null\n }\n }\n\n this.stopCalled = false\n\n this.fullRecord = ''\n this.end = false\n this.connected = false\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 this.eventEmitter.on('RETRY_CONVO_ASYNC_RETRIED', () => {\n debug('Retry event received')\n const request = JSON.stringify({\n METHOD: 'stopCall',\n sessionId: this.sessionId\n })\n this.ws.send(request)\n this.ws.close()\n })\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.silence = null\n this.msgCount = 0\n this.firstMsg = true\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 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 this.end = true\n if (parsedData.data.silence.length > 0) {\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 this.Stop()\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 }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (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 sendBotMsg(new Error(`Silence Duration of ${parsedData.data.start}s exceeded Start Silence Duration Timeout of ${this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START] / 1000}s`))\n this.Stop()\n }\n if (this.prevData) {\n if (!_.isNil(parsedData.data.start) && parsedData.data.start - this.prevData.data.end > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {\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 }\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') {\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') {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n this.prevData = parsedData\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, 10000)\n setInterval(() => {\n if (this.end) {\n this.wsOpened = false\n this.ws = null\n this.view = {}\n resolve()\n }\n }, 1000)\n })\n } else {\n this.wsOpened = false\n this.ws = null\n this.view = {}\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\nmodule.exports = BotiumConnectorVoip\n","const BotiumConnectorVoip = require('./src/connector')\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}\n"],"names":["v4","uuidv4","require$$0","debug","require$$1","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","setAsync","botMsgs","sentencesBuilding","sentencesFinal","sentenceBuilding","Validate","axiosTtsParams","url","params","_getParams","method","timeout","headers","_getHeaders","data","axios","_getAxiosUrl","status","_getAxiosShortenedOutput","Error","err","_getAxiosErrOutput","Object","assign","Start","view","container","context","msg","botium","conversationId","stepId","stopCalled","fullRecord","end","connected","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","request","JSON","stringify","METHOD","sessionId","send","close","isArray","split","silence","msgCount","firstMsg","wsOpened","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","parsedData","parse","parsedDataLog","cloneDeep","type","voipConfig","event","apiKey","_extractApiKey","_getBody","connectDuration","emit","metricName","credits","toFixed","Stop","name","mimeType","base64","final","prevData","parseInt","forEach","botMsgsExpanded","UserSays","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","media","buffer","mediaUri","maxContentLength","Infinity","maxBodyLength","readyState","CLOSED","setInterval","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","body","get","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"botium-connector-voip-es.js","sources":["../src/connector.js","../src/ignore-sd-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: 500,\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\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 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 (this.convoStep && this.convoStep.logicHooks && _.isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && 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 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.firstSttInfoReceived && this.convoStep && this.convoStep.logicHooks && _.isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && 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 this.firstSttInfoReceived = true\n if (this.prevData) {\n if (!_.isNil(parsedData.data.start) && parsedData.data.start - this.prevData.data.end > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {\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 }\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') {\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') {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n this.prevData = parsedData\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, 10000)\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\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 BotiumConnectorVoip = require('./src/connector')\nconst IgnoreSilenceDurationLogicHook = require('./src/ignore-sd-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 }\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","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","metricName","credits","logicHooks","find","lh","name","toFixed","mimeType","base64","final","prevData","parseInt","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","IgnoreSilenceDurationLogicHook","context","args","globalArgs","onBotPrepare","props","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required","PluginLogicHooks","VOIP_IGNORE_SILENCE_DURATION"],"mappings":"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"}
|
package/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const BotiumConnectorVoip = require('./src/connector')
|
|
2
|
+
const IgnoreSilenceDurationLogicHook = require('./src/ignore-sd-logichook')
|
|
2
3
|
|
|
3
4
|
module.exports = {
|
|
4
5
|
PluginVersion: 1,
|
|
@@ -24,5 +25,8 @@ module.exports = {
|
|
|
24
25
|
required: true
|
|
25
26
|
}
|
|
26
27
|
]
|
|
28
|
+
},
|
|
29
|
+
PluginLogicHooks: {
|
|
30
|
+
VOIP_IGNORE_SILENCE_DURATION: IgnoreSilenceDurationLogicHook
|
|
27
31
|
}
|
|
28
32
|
}
|
package/package.json
CHANGED
package/src/connector.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const { v4: uuidv4 } = require('uuid')
|
|
2
1
|
const WebSocket = require('ws')
|
|
3
2
|
const _ = require('lodash')
|
|
4
3
|
const axios = require('axios')
|
|
@@ -67,8 +66,7 @@ const Defaults = {
|
|
|
67
66
|
}
|
|
68
67
|
|
|
69
68
|
class BotiumConnectorVoip {
|
|
70
|
-
constructor ({ queueBotSays, eventEmitter, caps
|
|
71
|
-
setAsync(true)
|
|
69
|
+
constructor ({ queueBotSays, eventEmitter, caps }) {
|
|
72
70
|
this.queueBotSays = queueBotSays
|
|
73
71
|
this.caps = caps
|
|
74
72
|
this.eventEmitter = eventEmitter
|
|
@@ -112,21 +110,12 @@ class BotiumConnectorVoip {
|
|
|
112
110
|
debug('Start called')
|
|
113
111
|
debug(this.caps[Capabilities.VOIP_TTS_URL])
|
|
114
112
|
|
|
115
|
-
this.view = {
|
|
116
|
-
container: this,
|
|
117
|
-
context: {},
|
|
118
|
-
msg: {},
|
|
119
|
-
botium: {
|
|
120
|
-
conversationId: uuidv4(),
|
|
121
|
-
stepId: null
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
113
|
this.stopCalled = false
|
|
126
114
|
|
|
127
115
|
this.fullRecord = ''
|
|
128
116
|
this.end = false
|
|
129
117
|
this.connected = false
|
|
118
|
+
this.convoStep = null
|
|
130
119
|
|
|
131
120
|
const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }
|
|
132
121
|
|
|
@@ -207,15 +196,6 @@ class BotiumConnectorVoip {
|
|
|
207
196
|
})
|
|
208
197
|
}
|
|
209
198
|
connect().then(() => {
|
|
210
|
-
this.eventEmitter.on('RETRY_CONVO_ASYNC_RETRIED', () => {
|
|
211
|
-
debug('Retry event received')
|
|
212
|
-
const request = JSON.stringify({
|
|
213
|
-
METHOD: 'stopCall',
|
|
214
|
-
sessionId: this.sessionId
|
|
215
|
-
})
|
|
216
|
-
this.ws.send(request)
|
|
217
|
-
this.ws.close()
|
|
218
|
-
})
|
|
219
199
|
if (!_.isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {
|
|
220
200
|
if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {
|
|
221
201
|
this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] = []
|
|
@@ -224,9 +204,14 @@ class BotiumConnectorVoip {
|
|
|
224
204
|
}
|
|
225
205
|
}
|
|
226
206
|
|
|
207
|
+
this.eventEmitter.on('CONVO_STEP_NEXT', (container, convoStep) => {
|
|
208
|
+
this.convoStep = convoStep
|
|
209
|
+
})
|
|
210
|
+
|
|
227
211
|
this.silence = null
|
|
228
212
|
this.msgCount = 0
|
|
229
213
|
this.firstMsg = true
|
|
214
|
+
this.firstSttInfoReceived = false
|
|
230
215
|
|
|
231
216
|
this.wsOpened = true
|
|
232
217
|
debug(`Websocket connection to ${wsEndpoint} opened.`)
|
|
@@ -314,10 +299,9 @@ class BotiumConnectorVoip {
|
|
|
314
299
|
}
|
|
315
300
|
|
|
316
301
|
if (parsedData && parsedData.type === 'silence') {
|
|
317
|
-
this.
|
|
318
|
-
|
|
302
|
+
if (this.convoStep && this.convoStep.logicHooks && _.isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && parsedData.data.silence.length > 0) {
|
|
303
|
+
this.end = true
|
|
319
304
|
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`))
|
|
320
|
-
this.Stop()
|
|
321
305
|
}
|
|
322
306
|
}
|
|
323
307
|
|
|
@@ -327,13 +311,15 @@ class BotiumConnectorVoip {
|
|
|
327
311
|
mimeType: 'audio/wav',
|
|
328
312
|
base64: parsedData.fullRecord
|
|
329
313
|
})
|
|
314
|
+
this.end = true
|
|
330
315
|
}
|
|
331
316
|
|
|
332
317
|
if (parsedData && parsedData.data && parsedData.data.final === false) {
|
|
333
|
-
if (this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {
|
|
334
|
-
|
|
335
|
-
this.
|
|
318
|
+
if (!this.firstSttInfoReceived && this.convoStep && this.convoStep.logicHooks && _.isNil(this.convoStep.logicHooks.find(lh => lh.name === 'VOIP_IGNORE_SILENCE_DURATION')) && this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START_ENABLE] && parsedData.data.start && parsedData.data.start * 1000 > this.caps[Capabilities.VOIP_SILENCE_DURATION_TIMEOUT_START]) {
|
|
319
|
+
this.end = true
|
|
320
|
+
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`))
|
|
336
321
|
}
|
|
322
|
+
this.firstSttInfoReceived = true
|
|
337
323
|
if (this.prevData) {
|
|
338
324
|
if (!_.isNil(parsedData.data.start) && parsedData.data.start - this.prevData.data.end > parseInt(this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT]) / 1000) {
|
|
339
325
|
if (this.botMsgs.length > 0) {
|
|
@@ -513,15 +499,19 @@ class BotiumConnectorVoip {
|
|
|
513
499
|
if (this.end) {
|
|
514
500
|
this.wsOpened = false
|
|
515
501
|
this.ws = null
|
|
516
|
-
this.
|
|
502
|
+
this.end = false
|
|
503
|
+
this.convoStep = null
|
|
504
|
+
this.firstSttInfoReceived = false
|
|
517
505
|
resolve()
|
|
518
506
|
}
|
|
519
|
-
},
|
|
507
|
+
}, 100)
|
|
520
508
|
})
|
|
521
509
|
} else {
|
|
522
510
|
this.wsOpened = false
|
|
523
511
|
this.ws = null
|
|
524
|
-
this.
|
|
512
|
+
this.end = false
|
|
513
|
+
this.convoStep = null
|
|
514
|
+
this.firstSttInfoReceived = false
|
|
525
515
|
}
|
|
526
516
|
}
|
|
527
517
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const debug = require('debug')('botium-voip-logichook-ignore-silence-duration')
|
|
2
|
+
|
|
3
|
+
module.exports = class IgnoreSilenceDurationLogicHook {
|
|
4
|
+
constructor (context, caps = {}, args = {}) {
|
|
5
|
+
this.context = context
|
|
6
|
+
this.caps = caps
|
|
7
|
+
this.globalArgs = args
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
async onBotPrepare (props) {
|
|
11
|
+
debug('Silence duration assertion ignored by logic hook')
|
|
12
|
+
}
|
|
13
|
+
}
|