botium-connector-voip 0.0.5 → 0.0.6

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.
@@ -7,6 +7,7 @@ var ws = require('ws');
7
7
  var lodash = require('lodash');
8
8
  var axios = require('axios');
9
9
  var debug$1 = require('debug');
10
+ var path = require('path');
10
11
 
11
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
13
 
@@ -15,6 +16,7 @@ var ws__default = /*#__PURE__*/_interopDefaultLegacy(ws);
15
16
  var lodash__default = /*#__PURE__*/_interopDefaultLegacy(lodash);
16
17
  var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
17
18
  var debug__default = /*#__PURE__*/_interopDefaultLegacy(debug$1);
19
+ var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
18
20
 
19
21
  const {
20
22
  v4: uuidv4
@@ -128,6 +130,7 @@ class BotiumConnectorVoip {
128
130
  stepId: null
129
131
  }
130
132
  };
133
+ this.stopCalled = false;
131
134
  this.fullRecord = '';
132
135
  this.end = false;
133
136
 
@@ -166,8 +169,24 @@ class BotiumConnectorVoip {
166
169
  return botMsgsFinal;
167
170
  };
168
171
 
172
+ const {
173
+ data
174
+ } = await axios__default["default"]({
175
+ method: 'post',
176
+ data: {
177
+ API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]
178
+ },
179
+ url: new URL(path__default["default"].join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()
180
+ });
181
+ await new Promise(resolve => {
182
+ setTimeout(resolve, 2000);
183
+ });
169
184
  return new Promise((resolve, reject) => {
170
- this.ws = new ws__default["default"](this.caps[Capabilities.VOIP_WORKER_URL]);
185
+ if (data.status === 'error') {
186
+ reject(new Error(`Error connecting to VOIP Worker: ${data.message}`));
187
+ }
188
+
189
+ this.ws = new ws__default["default"](this.caps[Capabilities.VOIP_WORKER_URL].replace('8765', data.port));
171
190
 
172
191
  if (!lodash__default["default"].isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {
173
192
  if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {
@@ -183,7 +202,6 @@ class BotiumConnectorVoip {
183
202
  debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_ENDPOINT]} opened.`);
184
203
  const request = {
185
204
  METHOD: 'initCall',
186
- API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY],
187
205
  SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],
188
206
  SIP_PROXY: this.caps[Capabilities.VOIP_SIP_PROXY],
189
207
  SIP_CALLER_URI: this.caps[Capabilities.VOIP_SIP_CALLER_URI],
@@ -215,14 +233,14 @@ class BotiumConnectorVoip {
215
233
  this.ws.send(JSON.stringify(request));
216
234
  });
217
235
  this.ws.on('close', async () => {
218
- debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`);
236
+ debug(`${this.sessionId} - Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`);
219
237
  });
220
238
  this.ws.on('error', err => {
221
239
  debug(err);
222
240
 
223
241
  if (!this.wsOpened) {
224
242
  this.end = true;
225
- reject(new Error(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} error: ${err.message || err}`));
243
+ reject(new Error(`${this.sessionId} - Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} error: ${err.message || err}`));
226
244
  }
227
245
  });
228
246
  this.ws.on('message', async data => {
@@ -241,10 +259,6 @@ class BotiumConnectorVoip {
241
259
  reject(new Error('Error: Cannot open a call: SIP Authorization failed'));
242
260
  }
243
261
 
244
- if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event !== 'onCallRegState') {
245
- reject(new Error('Error: Cannot connect to VOIP Worker because of wrong API key'));
246
- }
247
-
248
262
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event === 'onCallRegState') {
249
263
  reject(new Error('Error: Sip Registration failed'));
250
264
  }
@@ -267,6 +281,8 @@ class BotiumConnectorVoip {
267
281
  }
268
282
 
269
283
  if (parsedData && parsedData.type === 'error') {
284
+ this.end = true;
285
+ this.Stop();
270
286
  reject(new Error(`Error: ${parsedData.message}`));
271
287
  }
272
288
 
@@ -394,6 +410,17 @@ class BotiumConnectorVoip {
394
410
  }
395
411
 
396
412
  if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {
413
+ const request = JSON.stringify({
414
+ METHOD: 'sendAudio',
415
+ sessionId: this.sessionId,
416
+ b64_buffer: msg.media[0].buffer.toString('base64')
417
+ });
418
+ this.ws.send(request);
419
+ msg.attachments.push({
420
+ name: msg.media[0].mediaUri,
421
+ mimeType: msg.media[0].mimeType,
422
+ base64: msg.media[0].buffer.toString('base64')
423
+ });
397
424
  const {
398
425
  data
399
426
  } = await axios__default["default"]({
@@ -409,19 +436,9 @@ class BotiumConnectorVoip {
409
436
 
410
437
  if (data && data.duration) {
411
438
  duration = parseInt(data.duration);
439
+ } else {
440
+ reject(new Error('Getting audio duration from Speech Api failed'));
412
441
  }
413
-
414
- const request = JSON.stringify({
415
- METHOD: 'sendAudio',
416
- sessionId: this.sessionId,
417
- b64_buffer: msg.media[0].buffer.toString('base64')
418
- });
419
- msg.attachments.push({
420
- name: msg.media[0].mediaUri,
421
- mimeType: msg.media[0].mimeType,
422
- base64: msg.media[0].buffer.toString('base64')
423
- });
424
- this.ws.send(request);
425
442
  }
426
443
 
427
444
  setTimeout(resolve, duration * 1000);
@@ -430,28 +447,36 @@ class BotiumConnectorVoip {
430
447
  }
431
448
 
432
449
  async Stop() {
433
- debug('Stop called');
434
- const request = JSON.stringify({
435
- METHOD: 'stopCall',
436
- sessionId: this.sessionId
437
- });
438
- this.ws.send(request);
439
- await new Promise(resolve => {
440
- setTimeout(resolve, 50000);
441
- setInterval(() => {
442
- if (this.end) {
443
- resolve();
444
- }
445
- }, 1000);
446
- });
447
-
448
- if (this.ws) {
449
- this.ws.close();
450
+ if (!this.stopCalled) {
451
+ this.stopCalled = true;
452
+ debug(`${this.sessionId} - Stop called`);
453
+
454
+ if (this.ws && this.ws.readyState !== ws__default["default"].CLOSED) {
455
+ const request = JSON.stringify({
456
+ METHOD: 'stopCall',
457
+ sessionId: this.sessionId
458
+ });
459
+ this.ws.send(request);
460
+ await new Promise(resolve => {
461
+ setTimeout(resolve, 50000);
462
+ setInterval(() => {
463
+ if (this.end) {
464
+ this.wsOpened = false;
465
+ this.ws = null;
466
+ this.view = {};
467
+ resolve();
468
+ }
469
+ }, 1000);
470
+ });
471
+ /* if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {
472
+ this.ws.close()
473
+ } */
474
+ } else {
475
+ this.wsOpened = false;
476
+ this.ws = null;
477
+ this.view = {};
478
+ }
450
479
  }
451
-
452
- this.wsOpened = false;
453
- this.ws = null;
454
- this.view = {};
455
480
  }
456
481
 
457
482
  _getParams(capParams) {
@@ -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')\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}\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: 5000,\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?'\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.view = {\n container: this,\n context: {},\n msg: {},\n botium: {\n conversationId: uuidv4(),\n stepId: null\n }\n }\n\n this.fullRecord = ''\n this.end = false\n\n const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }\n\n const buildBotMsg = botMsgs => {\n if (botMsgs.length === 1) return botMsgs[0]\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 return botMsg\n }\n\n const expandBotMsgs = 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 for (const sentence of sentences) {\n botMsgsFinal.push({\n messageText: sentence,\n sourceData: botMsg.sourceData\n })\n }\n }\n }\n return botMsgsFinal\n }\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.caps[Capabilities.VOIP_WORKER_URL])\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.wsOpened = false\n this.ws.on('open', () => {\n this.wsOpened = true\n debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_ENDPOINT]} opened.`)\n const request = {\n METHOD: 'initCall',\n API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY],\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 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 debug(JSON.stringify(request, null, 2))\n this.ws.send(JSON.stringify(request))\n })\n this.ws.on('close', async () => {\n debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`)\n })\n this.ws.on('error', (err) => {\n debug(err)\n if (!this.wsOpened) {\n this.end = true\n reject(new Error(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} 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: Cannot connect to VOIP Worker because of wrong API key'))\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.container, {\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 reject(new Error(`Error: ${parsedData.message}`))\n }\n\n if (parsedData && parsedData.type === 'fullRecord') {\n this.end = true\n this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {\n name: 'full_record.wav',\n mimeType: 'audio/wav',\n base64: parsedData.fullRecord\n })\n this.Stop()\n }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (!this.sentenceBuilding) {\n this.sentenceBuilding = true\n this.sentencesBuilding++\n }\n }\n\n if (parsedData && parsedData.data && parsedData.data.final) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL') {\n this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {\n const botMsgsExpanded = expandBotMsgs(this.botMsgs)\n botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT') {\n this.sentenceBuilding = false\n this.sentencesFinal++\n\n clearTimeout(this.sendMessageTimeout)\n this.sendMessageTimeout = setTimeout(() => {\n if (this.sentenceBuilding === false && this.sentencesBuilding === this.sentencesFinal) {\n sendBotMsg(buildBotMsg(this.botMsgs))\n this.botMsgs = []\n this.sentencesBuilding = 0\n this.sentencesFinal = 0\n }\n }, this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n }\n }\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 { 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 }\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n sessionId: this.sessionId,\n b64_buffer: msg.media[0].buffer.toString('base64')\n })\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 this.ws.send(request)\n }\n setTimeout(resolve, duration * 1000)\n }, 0)\n })\n }\n\n async Stop () {\n debug('Stop called')\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, 50000)\n setInterval(() => {\n if (this.end) {\n resolve()\n }\n }, 1000)\n })\n\n if (this.ws) {\n this.ws.close()\n }\n this.wsOpened = false\n this.ws = null\n this.view = {}\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","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","view","container","context","msg","botium","conversationId","stepId","fullRecord","end","sendBotMsg","botMsg","setTimeout","buildBotMsg","length","messageText","map","m","join","sourceData","expandBotMsgs","splitSentences","s","match","RegExp","botMsgsFinal","sentences","_","isNil","push","sentence","Promise","resolve","reject","ws","WebSocket","isArray","split","wsOpened","on","VOIP_WORKER_ENDPOINT","request","METHOD","API_KEY","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","STT_CONFIG","stt_url","stt_params","stt_body","TTS_CONFIG","tts_url","tts_params","tts_body","JSON","stringify","send","message","parsedData","parse","parsedDataLog","cloneDeep","type","sessionId","voipConfig","event","apiKey","_extractApiKey","_getBody","connectDuration","emit","metricName","credits","name","mimeType","base64","Stop","final","forEach","botMsgsExpanded","clearTimeout","sendMessageTimeout","UserSays","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","toString","media","buffer","maxContentLength","Infinity","maxBodyLength","parseInt","mediaUri","setInterval","close","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","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;AAEA,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;AAnCL,CAArB;AAsCA,MAAMC,QAAQ,GAAG;AACfC,EAAAA,eAAe,EAAE,MADF;AAEf9B,EAAAA,gBAAgB,EAAE,KAFH;AAGfO,EAAAA,eAAe,EAAE,KAHF;AAIfG,EAAAA,gBAAgB,EAAE,KAJH;AAKfT,EAAAA,yBAAyB,EAAE,UALZ;AAMfC,EAAAA,iCAAiC,EAAE,IANpB;AAOfC,EAAAA,mCAAmC,EAAE,IAPtB;AAQfC,EAAAA,qCAAqC,EAAE;AARxB,CAAjB;;AAWA,MAAM2B,mBAAN,CAA0B;AACxBC,EAAAA,WAAW,CAAE;AAAEC,IAAAA,YAAF;AAAgBC,IAAAA,YAAhB;AAA8BC,IAAAA;AAA9B,GAAF,EAAwC;AACjD,SAAKF,YAAL,GAAoBA,YAApB;AACA,SAAKE,IAAL,GAAYA,IAAZ;AACA,SAAKD,YAAL,GAAoBA,YAApB;AACA,SAAKE,OAAL,GAAe,EAAf;AACA,SAAKC,iBAAL,GAAyB,CAAzB;AACA,SAAKC,cAAL,GAAsB,CAAtB;AACA,SAAKC,gBAAL,GAAwB,KAAxB;AACD;;AAEa,QAARC,QAAQ,GAAI;AAChBjD,IAAAA,KAAK,CAAC,iBAAD,CAAL;AACAA,IAAAA,KAAK,CAAC,KAAK4C,IAAL,CAAUlC,yBAAX,CAAL;;AAEA,QAAI,KAAKkC,IAAL,CAAU9B,YAAd,EAA4B;AAC1B,WAAKoC,cAAL,GAAsB;AACpBC,QAAAA,GAAG,EAAE,KAAKP,IAAL,CAAU9B,YADK;AAEpBsC,QAAAA,MAAM,EAAE,KAAKC,UAAL,CAAgBnD,YAAY,CAACa,eAA7B,CAFY;AAGpBuC,QAAAA,MAAM,EAAE,KAAKV,IAAL,CAAU5B,eAHE;AAIpBuC,QAAAA,OAAO,EAAE,KAAKX,IAAL,CAAUzB,gBAJC;AAKpBqC,QAAAA,OAAO,EAAE,KAAKC,WAAL,CAAiBvD,YAAY,CAACgB,gBAA9B;AALW,OAAtB;;AAOA,UAAI;AACF,cAAM;AAAEwC,UAAAA;AAAF,YAAW,MAAMC,yBAAK,CAAC,EAC3B,GAAG,KAAKT,cADmB;AAE3BC,UAAAA,GAAG,EAAE,KAAKS,YAAL,CAAkB,KAAKhB,IAAL,CAAU9B,YAA5B,EAA0C,aAA1C;AAFsB,SAAD,CAA5B;;AAIA,YAAI4C,IAAI,IAAIA,IAAI,CAACG,MAAL,KAAgB,IAA5B,EAAkC;AAChC7D,UAAAA,KAAK,CAAE,iCAAgC,KAAK8D,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,SAAKpB,IAAL,GAAYsB,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkB7B,QAAlB,EAA4B,KAAKM,IAAjC,CAAZ;AACD;;AAEU,QAALwB,KAAK,GAAI;AACbpE,IAAAA,KAAK,CAAC,cAAD,CAAL;AACAA,IAAAA,KAAK,CAAC,KAAK4C,IAAL,CAAU1C,YAAY,CAACY,YAAvB,CAAD,CAAL;AAEA,SAAKuD,IAAL,GAAY;AACVC,MAAAA,SAAS,EAAE,IADD;AAEVC,MAAAA,OAAO,EAAE,EAFC;AAGVC,MAAAA,GAAG,EAAE,EAHK;AAIVC,MAAAA,MAAM,EAAE;AACNC,QAAAA,cAAc,EAAE5E,MAAM,EADhB;AAEN6E,QAAAA,MAAM,EAAE;AAFF;AAJE,KAAZ;AAUA,SAAKC,UAAL,GAAkB,EAAlB;AACA,SAAKC,GAAL,GAAW,KAAX;;AAEA,UAAMC,UAAU,GAAIC,MAAD,IAAY;AAAEC,MAAAA,UAAU,CAAC,MAAM,KAAKtC,YAAL,CAAkBqC,MAAlB,CAAP,EAAkC,CAAlC,CAAV;AAAgD,KAAjF;;AAEA,UAAME,WAAW,GAAGpC,OAAO,IAAI;AAC7B,UAAIA,OAAO,CAACqC,MAAR,KAAmB,CAAvB,EAA0B,OAAOrC,OAAO,CAAC,CAAD,CAAd;AAC1B,YAAMkC,MAAM,GAAG,EAAf;AACAA,MAAAA,MAAM,CAACI,WAAP,GAAqBtC,OAAO,CAACuC,GAAR,CAAYC,CAAC,IAAIA,CAAC,CAACF,WAAnB,EAAgCG,IAAhC,CAAqC,KAAK1C,IAAL,CAAU1C,YAAY,CAACU,mCAAvB,CAArC,CAArB;AACAmE,MAAAA,MAAM,CAACQ,UAAP,GAAoB1C,OAAO,CAACuC,GAAR,CAAYC,CAAC,IAAIA,CAAC,CAACE,UAAnB,CAApB;AACA,aAAOR,MAAP;AACD,KAND;;AAQA,UAAMS,aAAa,GAAG3C,OAAO,IAAI;AAC/B,YAAM4C,cAAc,GAAGC,CAAC,IAAIA,CAAC,CAACC,KAAF,CAAQ,IAAIC,MAAJ,CAAY,KAAI,KAAKhD,IAAL,CAAU1C,YAAY,CAACW,qCAAvB,CAA8D,MAAK,KAAK+B,IAAL,CAAU1C,YAAY,CAACW,qCAAvB,CAA8D,IAAjJ,EAAsJ,GAAtJ,CAAR,CAA5B;;AACA,YAAMgF,YAAY,GAAG,EAArB;;AACA,WAAK,MAAMd,MAAX,IAAqBlC,OAArB,EAA8B;AAC5B,cAAMiD,SAAS,GAAGL,cAAc,CAACV,MAAM,CAACI,WAAR,CAAhC;;AACA,YAAIY,0BAAC,CAACC,KAAF,CAAQF,SAAR,CAAJ,EAAwB;AACtBD,UAAAA,YAAY,CAACI,IAAb,CAAkBlB,MAAlB;AACD,SAFD,MAEO;AACL,eAAK,MAAMmB,QAAX,IAAuBJ,SAAvB,EAAkC;AAChCD,YAAAA,YAAY,CAACI,IAAb,CAAkB;AAChBd,cAAAA,WAAW,EAAEe,QADG;AAEhBX,cAAAA,UAAU,EAAER,MAAM,CAACQ;AAFH,aAAlB;AAID;AACF;AACF;;AACD,aAAOM,YAAP;AACD,KAjBD;;AAmBA,WAAO,IAAIM,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,WAAKC,EAAL,GAAU,IAAIC,sBAAJ,CAAc,KAAK3D,IAAL,CAAU1C,YAAY,CAACkB,eAAvB,CAAd,CAAV;;AAEA,UAAI,CAAC2E,0BAAC,CAACS,OAAF,CAAU,KAAK5D,IAAL,CAAU1C,YAAY,CAAC8B,qBAAvB,CAAV,CAAL,EAA+D;AAC7D,YAAI,KAAKY,IAAL,CAAU1C,YAAY,CAAC8B,qBAAvB,MAAkD,EAAtD,EAA0D;AACxD,eAAKY,IAAL,CAAU1C,YAAY,CAAC8B,qBAAvB,IAAgD,EAAhD;AACD,SAFD,MAEO;AACL,eAAKY,IAAL,CAAU1C,YAAY,CAAC8B,qBAAvB,IAAgD,KAAKY,IAAL,CAAU1C,YAAY,CAAC8B,qBAAvB,EAA8CyE,KAA9C,CAAoD,GAApD,CAAhD;AACD;AACF;;AAED,WAAKC,QAAL,GAAgB,KAAhB;AACA,WAAKJ,EAAL,CAAQK,EAAR,CAAW,MAAX,EAAmB,MAAM;AACvB,aAAKD,QAAL,GAAgB,IAAhB;AACA1G,QAAAA,KAAK,CAAE,2BAA0B,KAAK4C,IAAL,CAAU1C,YAAY,CAAC0G,oBAAvB,CAA6C,UAAzE,CAAL;AACA,cAAMC,OAAO,GAAG;AACdC,UAAAA,MAAM,EAAE,UADM;AAEdC,UAAAA,OAAO,EAAE,KAAKnE,IAAL,CAAU1C,YAAY,CAACmB,kBAAvB,CAFK;AAGd2F,UAAAA,eAAe,EAAE,KAAKpE,IAAL,CAAU1C,YAAY,CAACoB,2BAAvB,CAHH;AAId2F,UAAAA,SAAS,EAAE,KAAKrE,IAAL,CAAU1C,YAAY,CAACyB,cAAvB,CAJG;AAKduF,UAAAA,cAAc,EAAE,KAAKtE,IAAL,CAAU1C,YAAY,CAACiH,mBAAvB,CALF;AAMdC,UAAAA,mBAAmB,EAAE,KAAKxE,IAAL,CAAU1C,YAAY,CAACuB,wBAAvB,CANP;AAOd4F,UAAAA,mBAAmB,EAAE,KAAKzE,IAAL,CAAU1C,YAAY,CAACwB,wBAAvB,CAPP;AAQd4F,UAAAA,kBAAkB,EAAE,KAAK1E,IAAL,CAAU1C,YAAY,CAACsB,uBAAvB,CARN;AASd+F,UAAAA,wBAAwB,EAAE,KAAK3E,IAAL,CAAU1C,YAAY,CAACqB,6BAAvB,CATZ;AAUdiG,UAAAA,cAAc,EAAE,KAAK5E,IAAL,CAAU1C,YAAY,CAAC4B,mBAAvB,CAVF;AAWd2F,UAAAA,eAAe,EAAE,KAAK7E,IAAL,CAAU1C,YAAY,CAAC0B,oBAAvB,CAXH;AAYd8F,UAAAA,kBAAkB,EAAE,KAAK9E,IAAL,CAAU1C,YAAY,CAAC2B,uBAAvB,CAZN;AAad8F,UAAAA,UAAU,EAAE,KAAK/E,IAAL,CAAU1C,YAAY,CAAC6B,eAAvB,CAbE;AAcd6F,UAAAA,gBAAgB,EAAE,KAAKhF,IAAL,CAAU1C,YAAY,CAAC8B,qBAAvB,CAdJ;AAed6F,UAAAA,eAAe,EAAE,KAAKjF,IAAL,CAAU1C,YAAY,CAACgC,oBAAvB,CAfH;AAgBd4F,UAAAA,iBAAiB,EAAE,KAAKlF,IAAL,CAAU1C,YAAY,CAACiC,kBAAvB,CAhBL;AAiBd4F,UAAAA,iBAAiB,EAAE,KAAKnF,IAAL,CAAU1C,YAAY,CAACkC,sBAAvB,CAjBL;AAkBd4F,UAAAA,iBAAiB,EAAE,KAAKpF,IAAL,CAAU1C,YAAY,CAACmC,sBAAvB,KAAkD,KAlBvD;AAmBd4F,UAAAA,UAAU,EAAE;AACVC,YAAAA,OAAO,EAAE,KAAKtF,IAAL,CAAU1C,YAAY,CAACC,mBAAvB,CADC;AAEVgI,YAAAA,UAAU,EAAE,KAAKvF,IAAL,CAAU1C,YAAY,CAACE,sBAAvB,CAFF;AAGVgI,YAAAA,QAAQ,EAAE,KAAKxF,IAAL,CAAU1C,YAAY,CAACI,oBAAvB,KAAgD;AAHhD,WAnBE;AAwBd+H,UAAAA,UAAU,EAAE;AACVC,YAAAA,OAAO,EAAE,KAAK1F,IAAL,CAAU1C,YAAY,CAACY,YAAvB,CADC;AAEVyH,YAAAA,UAAU,EAAE,KAAK3F,IAAL,CAAU1C,YAAY,CAACa,eAAvB,CAFF;AAGVyH,YAAAA,QAAQ,EAAE,KAAK5F,IAAL,CAAU1C,YAAY,CAACe,aAAvB,KAAyC;AAHzC;AAxBE,SAAhB;AA8BAjB,QAAAA,KAAK,CAACyI,IAAI,CAACC,SAAL,CAAe7B,OAAf,EAAwB,IAAxB,EAA8B,CAA9B,CAAD,CAAL;AACA,aAAKP,EAAL,CAAQqC,IAAR,CAAaF,IAAI,CAACC,SAAL,CAAe7B,OAAf,CAAb;AACD,OAnCD;AAoCA,WAAKP,EAAL,CAAQK,EAAR,CAAW,OAAX,EAAoB,YAAY;AAC9B3G,QAAAA,KAAK,CAAE,2BAA0B,KAAK4C,IAAL,CAAU1C,YAAY,CAACkB,eAAvB,CAAwC,UAApE,CAAL;AACD,OAFD;AAGA,WAAKkF,EAAL,CAAQK,EAAR,CAAW,OAAX,EAAqB3C,GAAD,IAAS;AAC3BhE,QAAAA,KAAK,CAACgE,GAAD,CAAL;;AACA,YAAI,CAAC,KAAK0C,QAAV,EAAoB;AAClB,eAAK7B,GAAL,GAAW,IAAX;AACAwB,UAAAA,MAAM,CAAC,IAAItC,KAAJ,CAAW,2BAA0B,KAAKnB,IAAL,CAAU1C,YAAY,CAACkB,eAAvB,CAAwC,WAAU4C,GAAG,CAAC4E,OAAJ,IAAe5E,GAAI,EAA1G,CAAD,CAAN;AACD;AACF,OAND;AAOA,WAAKsC,EAAL,CAAQK,EAAR,CAAW,SAAX,EAAsB,MAAOjD,IAAP,IAAgB;AACpC,cAAMmF,UAAU,GAAGJ,IAAI,CAACK,KAAL,CAAWpF,IAAX,CAAnB;;AAEA,cAAMqF,aAAa,GAAGhD,0BAAC,CAACiD,SAAF,CAAYH,UAAZ,CAAtB;;AACAE,QAAAA,aAAa,CAACnE,UAAd,GAA2B,sBAA3B;AAEA5E,QAAAA,KAAK,CAACyI,IAAI,CAACC,SAAL,CAAeK,aAAf,EAA8B,IAA9B,EAAoC,CAApC,CAAD,CAAL;;AAEA,YAAIF,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAChF,MAAX,KAAsB,aAA1E,EAAyF;AACvF,eAAKqF,SAAL,GAAiBL,UAAU,CAACM,UAAX,CAAsBD,SAAvC;AACD;;AAED,YAAIL,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAChF,MAAX,KAAsB,cAA1E,EAA0F;AACxFwC,UAAAA,MAAM,CAAC,IAAItC,KAAJ,CAAU,qDAAV,CAAD,CAAN;AACD;;AAED,YAAI8E,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAChF,MAAX,KAAsB,WAAtE,IAAqFgF,UAAU,CAACO,KAAX,KAAqB,gBAA9G,EAAgI;AAC9H/C,UAAAA,MAAM,CAAC,IAAItC,KAAJ,CAAU,+DAAV,CAAD,CAAN;AACD;;AAED,YAAI8E,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAChF,MAAX,KAAsB,WAAtE,IAAqFgF,UAAU,CAACO,KAAX,KAAqB,gBAA9G,EAAgI;AAC9H/C,UAAAA,MAAM,CAAC,IAAItC,KAAJ,CAAU,gCAAV,CAAD,CAAN;AACD;;AAED,YAAI8E,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAChF,MAAX,KAAsB,WAA1E,EAAuF;AACrFuC,UAAAA,OAAO;AACR;;AAED,YAAIyC,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,UAAlC,IAAgDJ,UAAU,CAAChF,MAAX,KAAsB,cAA1E,EAA0F;AACxF,gBAAMwF,MAAM,GAAG,KAAKC,cAAL,CAAoB,KAAKC,QAAL,CAAcrJ,YAAY,CAACK,aAA3B,CAApB,CAAf;;AACA,cAAIsI,UAAU,CAACW,eAAX,IAA8BX,UAAU,CAACW,eAAX,GAA6B,CAA/D,EAAkE;AAChE,iBAAK7G,YAAL,CAAkB8G,IAAlB,CAAuB,sBAAvB,EAA+C,KAAKnF,SAApD,EAA+D;AAC7D2E,cAAAA,IAAI,EAAElD,0BAAC,CAACC,KAAF,CAAQqD,MAAR,IAAkB,SAAlB,GAA8B,aADyB;AAE7DK,cAAAA,UAAU,EAAE,kCAFiD;AAG7DC,cAAAA,OAAO,EAAEd,UAAU,CAACW,eAHyC;AAI7DH,cAAAA;AAJ6D,aAA/D;AAMD;AACF;;AAED,YAAIR,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,OAAtC,EAA+C;AAC7C5C,UAAAA,MAAM,CAAC,IAAItC,KAAJ,CAAW,UAAS8E,UAAU,CAACD,OAAQ,EAAvC,CAAD,CAAN;AACD;;AAED,YAAIC,UAAU,IAAIA,UAAU,CAACI,IAAX,KAAoB,YAAtC,EAAoD;AAClD,eAAKpE,GAAL,GAAW,IAAX;AACA,eAAKlC,YAAL,CAAkB8G,IAAlB,CAAuB,oBAAvB,EAA6C,KAAKnF,SAAlD,EAA6D;AAC3DsF,YAAAA,IAAI,EAAE,iBADqD;AAE3DC,YAAAA,QAAQ,EAAE,WAFiD;AAG3DC,YAAAA,MAAM,EAAEjB,UAAU,CAACjE;AAHwC,WAA7D;AAKA,eAAKmF,IAAL;AACD;;AAED,YAAIlB,UAAU,IAAIA,UAAU,CAACnF,IAAzB,IAAiCmF,UAAU,CAACnF,IAAX,CAAgBsG,KAAhB,KAA0B,KAA/D,EAAsE;AACpE,cAAI,CAAC,KAAKhH,gBAAV,EAA4B;AAC1B,iBAAKA,gBAAL,GAAwB,IAAxB;AACA,iBAAKF,iBAAL;AACD;AACF;;AAED,YAAI+F,UAAU,IAAIA,UAAU,CAACnF,IAAzB,IAAiCmF,UAAU,CAACnF,IAAX,CAAgBsG,KAArD,EAA4D;AAC1D,gBAAMjF,MAAM,GAAG;AAAEI,YAAAA,WAAW,EAAE0D,UAAU,CAACnF,IAAX,CAAgBkF,OAA/B;AAAwCrD,YAAAA,UAAU,EAAEsD;AAApD,WAAf;AACA,eAAKhG,OAAL,CAAaoD,IAAb,CAAkBlB,MAAlB;;AACA,cAAI,KAAKnC,IAAL,CAAU1C,YAAY,CAACQ,yBAAvB,MAAsD,UAA1D,EAAsE;AACpE,iBAAKmC,OAAL,CAAaoH,OAAb,CAAqBlF,MAAM,IAAID,UAAU,CAACC,MAAD,CAAzC;AACA,iBAAKlC,OAAL,GAAe,EAAf;AACD;;AACD,cAAI,KAAKD,IAAL,CAAU1C,YAAY,CAACQ,yBAAvB,MAAsD,QAA1D,EAAoE;AAClE,kBAAMwJ,eAAe,GAAG1E,aAAa,CAAC,KAAK3C,OAAN,CAArC;AACAqH,YAAAA,eAAe,CAACD,OAAhB,CAAwBlF,MAAM,IAAID,UAAU,CAACC,MAAD,CAA5C;AACA,iBAAKlC,OAAL,GAAe,EAAf;AACD;;AACD,cAAI,KAAKD,IAAL,CAAU1C,YAAY,CAACQ,yBAAvB,MAAsD,QAA1D,EAAoE;AAClE,iBAAKsC,gBAAL,GAAwB,KAAxB;AACA,iBAAKD,cAAL;AAEAoH,YAAAA,YAAY,CAAC,KAAKC,kBAAN,CAAZ;AACA,iBAAKA,kBAAL,GAA0BpF,UAAU,CAAC,MAAM;AACzC,kBAAI,KAAKhC,gBAAL,KAA0B,KAA1B,IAAmC,KAAKF,iBAAL,KAA2B,KAAKC,cAAvE,EAAuF;AACrF+B,gBAAAA,UAAU,CAACG,WAAW,CAAC,KAAKpC,OAAN,CAAZ,CAAV;AACA,qBAAKA,OAAL,GAAe,EAAf;AACA,qBAAKC,iBAAL,GAAyB,CAAzB;AACA,qBAAKC,cAAL,GAAsB,CAAtB;AACD;AACF,aAPmC,EAOjC,KAAKH,IAAL,CAAU1C,YAAY,CAACS,iCAAvB,CAPiC,CAApC;AAQD;AACF;AACF,OAxFD;AAyFD,KAnJM,CAAP;AAoJD;;AAEa,QAAR0J,QAAQ,CAAE7F,GAAF,EAAO;AACnBxE,IAAAA,KAAK,CAAC,iBAAD,CAAL;AAEAA,IAAAA,KAAK,CAACwE,GAAD,CAAL;;AAEA,QAAI,CAACA,GAAG,CAAC8F,WAAT,EAAsB;AACpB9F,MAAAA,GAAG,CAAC8F,WAAJ,GAAkB,EAAlB;AACD;;AACD,WAAO,IAAInE,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtCrB,MAAAA,UAAU,CAAC,YAAY;AACrB,YAAIuF,QAAQ,GAAG,CAAf;;AACA,YAAI/F,GAAG,IAAIA,GAAG,CAACgG,OAAX,IAAsBhG,GAAG,CAACgG,OAAJ,CAAYtF,MAAZ,GAAqB,CAA/C,EAAkD;AAChD,gBAAM2B,OAAO,GAAG4B,IAAI,CAACC,SAAL,CAAe;AAC7B5B,YAAAA,MAAM,EAAE,UADqB;AAE7B2D,YAAAA,MAAM,EAAEjG,GAAG,CAACgG,OAAJ,CAAY,CAAZ,EAAeE,OAFM;AAG7BxB,YAAAA,SAAS,EAAE,KAAKA;AAHa,WAAf,CAAhB;AAKA,eAAK5C,EAAL,CAAQqC,IAAR,CAAa9B,OAAb;AACD,SAPD,MAOO,IAAIrC,GAAG,IAAIA,GAAG,CAACW,WAAf,EAA4B;AACjC,cAAI,CAAC,KAAKjC,cAAV,EAA0BmD,MAAM,CAAC,IAAItC,KAAJ,CAAU,gDAAV,CAAD,CAAN;;AAC1B,cAAI,KAAKb,cAAT,EAAyB;AACvB,kBAAMyH,UAAU,GAAG,EACjB,GAAG,KAAKzH,cADS;AAEjBE,cAAAA,MAAM,EAAE,EACN,IAAI,KAAKF,cAAL,CAAoBE,MAApB,IAA8B,EAAlC,CADM;AAENwH,gBAAAA,IAAI,EAAEpG,GAAG,CAACW;AAFJ,eAFS;AAMjBzB,cAAAA,IAAI,EAAE,KAAK6F,QAAL,CAAcrJ,YAAY,CAACe,aAA3B,CANW;AAOjB4J,cAAAA,YAAY,EAAE;AAPG,aAAnB;AASArG,YAAAA,GAAG,CAACe,UAAJ,GAAiBoF,UAAjB;AAEA,gBAAIG,WAAW,GAAG,IAAlB;;AACA,gBAAI;AACFA,cAAAA,WAAW,GAAG,MAAMnH,yBAAK,CAACgH,UAAD,CAAzB;AACD,aAFD,CAEE,OAAO3G,GAAP,EAAY;AACZqC,cAAAA,MAAM,CAAC,IAAItC,KAAJ,CAAW,QAAOS,GAAG,CAACW,WAAY,cAAa,KAAKlB,kBAAL,CAAwBD,GAAxB,CAA6B,EAA5E,CAAD,CAAN;AACD;;AACD,gBAAIQ,GAAG,IAAIA,GAAG,CAACW,WAAX,IAA0BX,GAAG,CAACW,WAAJ,CAAgBD,MAAhB,GAAyB,CAAvD,EAA0D;AACxD,oBAAMmE,MAAM,GAAG,KAAKC,cAAL,CAAoB,KAAKC,QAAL,CAAcrJ,YAAY,CAACe,aAA3B,CAApB,CAAf;;AACA,mBAAK0B,YAAL,CAAkB8G,IAAlB,CAAuB,sBAAvB,EAA+C,KAAKnF,SAApD,EAA+D;AAC7D2E,gBAAAA,IAAI,EAAElD,0BAAC,CAACC,KAAF,CAAQqD,MAAR,IAAkB,SAAlB,GAA8B,aADyB;AAE7DK,gBAAAA,UAAU,EAAE,qCAFiD;AAG7DC,gBAAAA,OAAO,EAAEnF,GAAG,CAACW,WAAJ,CAAgBD,MAHoC;AAI7DmE,gBAAAA;AAJ6D,eAA/D;AAMD;;AACD,gBAAI0B,MAAM,CAACC,QAAP,CAAgBF,WAAW,CAACpH,IAA5B,CAAJ,EAAuC;AACrC6G,cAAAA,QAAQ,GAAGO,WAAW,CAACtH,OAAZ,CAAoB,kBAApB,CAAX;AACA,oBAAMqD,OAAO,GAAG4B,IAAI,CAACC,SAAL,CAAe;AAC7B5B,gBAAAA,MAAM,EAAE,WADqB;AAE7BmE,gBAAAA,IAAI,EAAE,KAFuB;AAG7B/B,gBAAAA,SAAS,EAAE,KAAKA,SAHa;AAI7BgC,gBAAAA,UAAU,EAAEJ,WAAW,CAACpH,IAAZ,CAAiByH,QAAjB,CAA0B,QAA1B;AAJiB,eAAf,CAAhB;AAMA3G,cAAAA,GAAG,CAAC8F,WAAJ,CAAgBrE,IAAhB,CAAqB;AACnB2D,gBAAAA,IAAI,EAAE,SADa;AAEnBC,gBAAAA,QAAQ,EAAE,WAFS;AAGnBC,gBAAAA,MAAM,EAAEgB,WAAW,CAACpH,IAAZ,CAAiByH,QAAjB,CAA0B,QAA1B;AAHW,eAArB;AAKA,mBAAK7E,EAAL,CAAQqC,IAAR,CAAa9B,OAAb;AACD,aAdD,MAcO;AACLR,cAAAA,MAAM,CAAC,IAAItC,KAAJ,CAAW,4BAA2B,KAAKD,wBAAL,CAA8BgH,WAAW,CAACpH,IAA1C,CAAgD,EAAtF,CAAD,CAAN;AACD;AACF;AACF;;AACD,YAAIc,GAAG,IAAIA,GAAG,CAAC4G,KAAX,IAAoB5G,GAAG,CAAC4G,KAAJ,CAAUlG,MAAV,GAAmB,CAAvC,IAA4CV,GAAG,CAAC4G,KAAJ,CAAU,CAAV,EAAaC,MAA7D,EAAqE;AACnE,gBAAM;AAAE3H,YAAAA;AAAF,cAAW,MAAMC,yBAAK,CAAC;AAC3BL,YAAAA,MAAM,EAAE,MADmB;AAE3BI,YAAAA,IAAI,EAAEc,GAAG,CAAC4G,KAAJ,CAAU,CAAV,EAAaC,MAFQ;AAG3B7H,YAAAA,OAAO,EAAE,EACP,GAAG,KAAKC,WAAL,CAAiBvD,YAAY,CAACgB,gBAA9B,CADI;AAEP,8BAAgB;AAFT,aAHkB;AAO3BiC,YAAAA,GAAG,EAAE,KAAKS,YAAL,CAAkB,KAAKhB,IAAL,CAAU9B,YAA5B,EAA0C,iBAA1C,CAPsB;AAQ3BwK,YAAAA,gBAAgB,EAAEC,QARS;AAS3BC,YAAAA,aAAa,EAAED;AATY,WAAD,CAA5B;;AAWA,cAAI7H,IAAI,IAAIA,IAAI,CAAC6G,QAAjB,EAA2B;AACzBA,YAAAA,QAAQ,GAAGkB,QAAQ,CAAC/H,IAAI,CAAC6G,QAAN,CAAnB;AACD;;AACD,gBAAM1D,OAAO,GAAG4B,IAAI,CAACC,SAAL,CAAe;AAC7B5B,YAAAA,MAAM,EAAE,WADqB;AAE7BoC,YAAAA,SAAS,EAAE,KAAKA,SAFa;AAG7BgC,YAAAA,UAAU,EAAE1G,GAAG,CAAC4G,KAAJ,CAAU,CAAV,EAAaC,MAAb,CAAoBF,QAApB,CAA6B,QAA7B;AAHiB,WAAf,CAAhB;AAKA3G,UAAAA,GAAG,CAAC8F,WAAJ,CAAgBrE,IAAhB,CAAqB;AACnB2D,YAAAA,IAAI,EAAEpF,GAAG,CAAC4G,KAAJ,CAAU,CAAV,EAAaM,QADA;AAEnB7B,YAAAA,QAAQ,EAAErF,GAAG,CAAC4G,KAAJ,CAAU,CAAV,EAAavB,QAFJ;AAGnBC,YAAAA,MAAM,EAAEtF,GAAG,CAAC4G,KAAJ,CAAU,CAAV,EAAaC,MAAb,CAAoBF,QAApB,CAA6B,QAA7B;AAHW,WAArB;AAKA,eAAK7E,EAAL,CAAQqC,IAAR,CAAa9B,OAAb;AACD;;AACD7B,QAAAA,UAAU,CAACoB,OAAD,EAAUmE,QAAQ,GAAG,IAArB,CAAV;AACD,OArFS,EAqFP,CArFO,CAAV;AAsFD,KAvFM,CAAP;AAwFD;;AAES,QAAJR,IAAI,GAAI;AACZ/J,IAAAA,KAAK,CAAC,aAAD,CAAL;AACA,UAAM6G,OAAO,GAAG4B,IAAI,CAACC,SAAL,CAAe;AAC7B5B,MAAAA,MAAM,EAAE,UADqB;AAE7BoC,MAAAA,SAAS,EAAE,KAAKA;AAFa,KAAf,CAAhB;AAIA,SAAK5C,EAAL,CAAQqC,IAAR,CAAa9B,OAAb;AACA,UAAM,IAAIV,OAAJ,CAAYC,OAAO,IAAI;AAC3BpB,MAAAA,UAAU,CAACoB,OAAD,EAAU,KAAV,CAAV;AACAuF,MAAAA,WAAW,CAAC,MAAM;AAChB,YAAI,KAAK9G,GAAT,EAAc;AACZuB,UAAAA,OAAO;AACR;AACF,OAJU,EAIR,IAJQ,CAAX;AAKD,KAPK,CAAN;;AASA,QAAI,KAAKE,EAAT,EAAa;AACX,WAAKA,EAAL,CAAQsF,KAAR;AACD;;AACD,SAAKlF,QAAL,GAAgB,KAAhB;AACA,SAAKJ,EAAL,GAAU,IAAV;AACA,SAAKjC,IAAL,GAAY,EAAZ;AACD;;AAEDhB,EAAAA,UAAU,CAAEwI,SAAF,EAAa;AACrB,QAAI,KAAKjJ,IAAL,CAAUiJ,SAAV,CAAJ,EAA0B;AACxB,UAAI9F,0BAAC,CAAC+F,QAAF,CAAW,KAAKlJ,IAAL,CAAUiJ,SAAV,CAAX,CAAJ,EAAsC,OAAOpD,IAAI,CAACK,KAAL,CAAW,KAAKlG,IAAL,CAAUiJ,SAAV,CAAX,CAAP,CAAtC,KACK,OAAO,KAAKjJ,IAAL,CAAUiJ,SAAV,CAAP;AACN;;AACD,WAAO,EAAP;AACD;;AAEDtC,EAAAA,QAAQ,CAAEwC,OAAF,EAAW;AACjB,QAAI,KAAKnJ,IAAL,CAAUmJ,OAAV,CAAJ,EAAwB;AACtB,UAAIhG,0BAAC,CAAC+F,QAAF,CAAW,KAAKlJ,IAAL,CAAUmJ,OAAV,CAAX,CAAJ,EAAoC,OAAOtD,IAAI,CAACK,KAAL,CAAW,KAAKlG,IAAL,CAAUmJ,OAAV,CAAX,CAAP,CAApC,KACK,OAAO,KAAKnJ,IAAL,CAAUmJ,OAAV,CAAP;AACN;;AACD,WAAO,IAAP;AACD;;AAEDtI,EAAAA,WAAW,CAAEuI,UAAF,EAAc;AACvB,QAAI,KAAKpJ,IAAL,CAAUoJ,UAAV,CAAJ,EAA2B;AACzB,UAAIjG,0BAAC,CAAC+F,QAAF,CAAW,KAAKlJ,IAAL,CAAUoJ,UAAV,CAAX,CAAJ,EAAuC,OAAOvD,IAAI,CAACK,KAAL,CAAW,KAAKlG,IAAL,CAAUoJ,UAAV,CAAX,CAAP,CAAvC,KACK,OAAO,KAAKpJ,IAAL,CAAUoJ,UAAV,CAAP;AACN;;AACD,WAAO,EAAP;AACD;;AAEDpI,EAAAA,YAAY,CAAEqI,OAAF,EAAWC,MAAX,EAAmB;AAC7B,WAAOD,OAAO,CAACE,MAAR,CAAe,CAAf,EAAkBF,OAAO,CAACG,OAAR,CAAgB,GAAhB,EAAqB,CAArB,CAAlB,IAA6CF,MAApD;AACD;;AAEDpI,EAAAA,wBAAwB,CAAEJ,IAAF,EAAQ;AAC9B,QAAIA,IAAJ,EAAU;AACR,UAAIqC,0BAAC,CAACiF,QAAF,CAAWtH,IAAX,CAAJ,EAAsB;AACpB,YAAI;AACFA,UAAAA,IAAI,GAAGA,IAAI,CAACyH,QAAL,EAAP;AACD,SAFD,CAEE,OAAOnH,GAAP,EAAY;AAEf;;AACD,aAAO+B,0BAAC,CAACsG,QAAF,CAAWtG,0BAAC,CAAC+F,QAAF,CAAWpI,IAAX,IAAmBA,IAAnB,GAA0B+E,IAAI,CAACC,SAAL,CAAehF,IAAf,CAArC,EAA2D;AAAEwB,QAAAA,MAAM,EAAE;AAAV,OAA3D,CAAP;AACD,KARD,MAQO;AACL,aAAO,EAAP;AACD;AACF;;AAEDjB,EAAAA,kBAAkB,CAAED,GAAF,EAAO;AACvB,QAAIA,GAAG,IAAIA,GAAG,CAACsI,QAAf,EAAyB;AACvB,aAAQ,WAAUtI,GAAG,CAACsI,QAAJ,CAAazI,MAAO,gBAAe,KAAKC,wBAAL,CAA8BE,GAAG,CAACsI,QAAJ,CAAa5I,IAA3C,CAAiD,EAAtG;AACD,KAFD,MAEO;AACL,aAAOM,GAAG,CAAC4E,OAAX;AACD;AACF;;AAEDU,EAAAA,cAAc,CAAEiD,IAAF,EAAQ;AACpB,WAAOxG,0BAAC,CAACyG,GAAF,CAAMD,IAAN,EAAY,+BAAZ,KACLxG,0BAAC,CAACyG,GAAF,CAAMD,IAAN,EAAY,iCAAZ,CADK,IAELxG,0BAAC,CAACyG,GAAF,CAAMD,IAAN,EAAY,wBAAZ,CAFK,IAGLxG,0BAAC,CAACyG,GAAF,CAAMD,IAAN,EAAY,uCAAZ,CAHK,IAILxG,0BAAC,CAACyG,GAAF,CAAMD,IAAN,EAAY,mCAAZ,CAJK,IAKL,IALF;AAMD;;AAhauB;;AAma1B,aAAc,GAAG/J,mBAAjB;;uBCxdc,GAAG;AACfiK,EAAAA,aAAa,EAAE,CADA;AAEfC,EAAAA,WAAW,EAAElK,SAFE;AAGfmK,EAAAA,UAAU,EAAE;AACV/C,IAAAA,IAAI,EAAE,eADI;AAEVgD,IAAAA,QAAQ,EAAE,QAFA;AAGVC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,UAAU,EAAE,IADJ;AAERC,MAAAA,UAAU,EAAE;AAFJ,KAHA;AAOVC,IAAAA,YAAY,EAAE,CACZ;AACEpD,MAAAA,IAAI,EAAE,UADR;AAEEqD,MAAAA,KAAK,EAAE,4BAFT;AAGEhE,MAAAA,IAAI,EAAE,0BAHR;AAIEiE,MAAAA,QAAQ,EAAE;AAJZ,KADY,EAOZ;AACEtD,MAAAA,IAAI,EAAE,UADR;AAEEqD,MAAAA,KAAK,EAAE,0BAFT;AAGEhE,MAAAA,IAAI,EAAE,wBAHR;AAIEiE,MAAAA,QAAQ,EAAE;AAJZ,KAPY;AAPJ;AAHG;;;;;;;;;;"}
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}\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: 5000,\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?'\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.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\n const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }\n\n const buildBotMsg = botMsgs => {\n if (botMsgs.length === 1) return botMsgs[0]\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 return botMsg\n }\n\n const expandBotMsgs = 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 for (const sentence of sentences) {\n botMsgsFinal.push({\n messageText: sentence,\n sourceData: botMsg.sourceData\n })\n }\n }\n }\n return botMsgsFinal\n }\n\n const { data } = 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\n await new Promise(resolve => {\n setTimeout(resolve, 2000)\n })\n\n return new Promise((resolve, reject) => {\n if (data.status === 'error') {\n reject(new Error(`Error connecting to VOIP Worker: ${data.message}`))\n }\n this.ws = new WebSocket(this.caps[Capabilities.VOIP_WORKER_URL].replace('8765', data.port))\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.wsOpened = false\n this.ws.on('open', () => {\n this.wsOpened = true\n debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_ENDPOINT]} 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 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 debug(JSON.stringify(request, null, 2))\n this.ws.send(JSON.stringify(request))\n })\n this.ws.on('close', async () => {\n debug(`${this.sessionId} - Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`)\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 ${this.caps[Capabilities.VOIP_WORKER_URL]} 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.container, {\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 this.Stop()\n reject(new Error(`Error: ${parsedData.message}`))\n }\n\n if (parsedData && parsedData.type === 'fullRecord') {\n this.end = true\n this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {\n name: 'full_record.wav',\n mimeType: 'audio/wav',\n base64: parsedData.fullRecord\n })\n this.Stop()\n }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (!this.sentenceBuilding) {\n this.sentenceBuilding = true\n this.sentencesBuilding++\n }\n }\n\n if (parsedData && parsedData.data && parsedData.data.final) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL') {\n this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {\n const botMsgsExpanded = expandBotMsgs(this.botMsgs)\n botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT') {\n this.sentenceBuilding = false\n this.sentencesFinal++\n\n clearTimeout(this.sendMessageTimeout)\n this.sendMessageTimeout = setTimeout(() => {\n if (this.sentenceBuilding === false && this.sentencesBuilding === this.sentencesFinal) {\n sendBotMsg(buildBotMsg(this.botMsgs))\n this.botMsgs = []\n this.sentencesBuilding = 0\n this.sentencesFinal = 0\n }\n }, this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n }\n }\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 if (!this.stopCalled) {\n this.stopCalled = true\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, 50000)\n setInterval(() => {\n if (this.end) {\n this.wsOpened = false\n this.ws = null\n this.view = {}\n resolve()\n }\n }, 1000)\n })\n /* if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n this.ws.close()\n } */\n } else {\n this.wsOpened = false\n this.ws = null\n this.view = {}\n }\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","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","view","container","context","msg","botium","conversationId","stepId","stopCalled","fullRecord","end","sendBotMsg","botMsg","setTimeout","buildBotMsg","length","messageText","map","m","join","sourceData","expandBotMsgs","splitSentences","s","match","RegExp","botMsgsFinal","sentences","_","isNil","push","sentence","API_KEY","URL","path","replace","toString","Promise","resolve","reject","message","ws","WebSocket","port","isArray","split","wsOpened","on","VOIP_WORKER_ENDPOINT","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","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","Stop","name","mimeType","base64","final","forEach","botMsgsExpanded","clearTimeout","sendMessageTimeout","UserSays","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","media","buffer","mediaUri","maxContentLength","Infinity","maxBodyLength","parseInt","readyState","CLOSED","setInterval","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","body","get","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required"],"mappings":"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"}
@@ -3,6 +3,7 @@ import ws from 'ws';
3
3
  import lodash from 'lodash';
4
4
  import axios from 'axios';
5
5
  import debug$1 from 'debug';
6
+ import path from 'path';
6
7
 
7
8
  const {
8
9
  v4: uuidv4
@@ -116,6 +117,7 @@ class BotiumConnectorVoip {
116
117
  stepId: null
117
118
  }
118
119
  };
120
+ this.stopCalled = false;
119
121
  this.fullRecord = '';
120
122
  this.end = false;
121
123
 
@@ -154,8 +156,24 @@ class BotiumConnectorVoip {
154
156
  return botMsgsFinal;
155
157
  };
156
158
 
159
+ const {
160
+ data
161
+ } = await axios({
162
+ method: 'post',
163
+ data: {
164
+ API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]
165
+ },
166
+ url: new URL(path.join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()
167
+ });
168
+ await new Promise(resolve => {
169
+ setTimeout(resolve, 2000);
170
+ });
157
171
  return new Promise((resolve, reject) => {
158
- this.ws = new ws(this.caps[Capabilities.VOIP_WORKER_URL]);
172
+ if (data.status === 'error') {
173
+ reject(new Error(`Error connecting to VOIP Worker: ${data.message}`));
174
+ }
175
+
176
+ this.ws = new ws(this.caps[Capabilities.VOIP_WORKER_URL].replace('8765', data.port));
159
177
 
160
178
  if (!lodash.isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {
161
179
  if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {
@@ -171,7 +189,6 @@ class BotiumConnectorVoip {
171
189
  debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_ENDPOINT]} opened.`);
172
190
  const request = {
173
191
  METHOD: 'initCall',
174
- API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY],
175
192
  SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],
176
193
  SIP_PROXY: this.caps[Capabilities.VOIP_SIP_PROXY],
177
194
  SIP_CALLER_URI: this.caps[Capabilities.VOIP_SIP_CALLER_URI],
@@ -203,14 +220,14 @@ class BotiumConnectorVoip {
203
220
  this.ws.send(JSON.stringify(request));
204
221
  });
205
222
  this.ws.on('close', async () => {
206
- debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`);
223
+ debug(`${this.sessionId} - Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`);
207
224
  });
208
225
  this.ws.on('error', err => {
209
226
  debug(err);
210
227
 
211
228
  if (!this.wsOpened) {
212
229
  this.end = true;
213
- reject(new Error(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} error: ${err.message || err}`));
230
+ reject(new Error(`${this.sessionId} - Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} error: ${err.message || err}`));
214
231
  }
215
232
  });
216
233
  this.ws.on('message', async data => {
@@ -229,10 +246,6 @@ class BotiumConnectorVoip {
229
246
  reject(new Error('Error: Cannot open a call: SIP Authorization failed'));
230
247
  }
231
248
 
232
- if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event !== 'onCallRegState') {
233
- reject(new Error('Error: Cannot connect to VOIP Worker because of wrong API key'));
234
- }
235
-
236
249
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event === 'onCallRegState') {
237
250
  reject(new Error('Error: Sip Registration failed'));
238
251
  }
@@ -255,6 +268,8 @@ class BotiumConnectorVoip {
255
268
  }
256
269
 
257
270
  if (parsedData && parsedData.type === 'error') {
271
+ this.end = true;
272
+ this.Stop();
258
273
  reject(new Error(`Error: ${parsedData.message}`));
259
274
  }
260
275
 
@@ -382,6 +397,17 @@ class BotiumConnectorVoip {
382
397
  }
383
398
 
384
399
  if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {
400
+ const request = JSON.stringify({
401
+ METHOD: 'sendAudio',
402
+ sessionId: this.sessionId,
403
+ b64_buffer: msg.media[0].buffer.toString('base64')
404
+ });
405
+ this.ws.send(request);
406
+ msg.attachments.push({
407
+ name: msg.media[0].mediaUri,
408
+ mimeType: msg.media[0].mimeType,
409
+ base64: msg.media[0].buffer.toString('base64')
410
+ });
385
411
  const {
386
412
  data
387
413
  } = await axios({
@@ -397,19 +423,9 @@ class BotiumConnectorVoip {
397
423
 
398
424
  if (data && data.duration) {
399
425
  duration = parseInt(data.duration);
426
+ } else {
427
+ reject(new Error('Getting audio duration from Speech Api failed'));
400
428
  }
401
-
402
- const request = JSON.stringify({
403
- METHOD: 'sendAudio',
404
- sessionId: this.sessionId,
405
- b64_buffer: msg.media[0].buffer.toString('base64')
406
- });
407
- msg.attachments.push({
408
- name: msg.media[0].mediaUri,
409
- mimeType: msg.media[0].mimeType,
410
- base64: msg.media[0].buffer.toString('base64')
411
- });
412
- this.ws.send(request);
413
429
  }
414
430
 
415
431
  setTimeout(resolve, duration * 1000);
@@ -418,28 +434,36 @@ class BotiumConnectorVoip {
418
434
  }
419
435
 
420
436
  async Stop() {
421
- debug('Stop called');
422
- const request = JSON.stringify({
423
- METHOD: 'stopCall',
424
- sessionId: this.sessionId
425
- });
426
- this.ws.send(request);
427
- await new Promise(resolve => {
428
- setTimeout(resolve, 50000);
429
- setInterval(() => {
430
- if (this.end) {
431
- resolve();
432
- }
433
- }, 1000);
434
- });
435
-
436
- if (this.ws) {
437
- this.ws.close();
437
+ if (!this.stopCalled) {
438
+ this.stopCalled = true;
439
+ debug(`${this.sessionId} - Stop called`);
440
+
441
+ if (this.ws && this.ws.readyState !== ws.CLOSED) {
442
+ const request = JSON.stringify({
443
+ METHOD: 'stopCall',
444
+ sessionId: this.sessionId
445
+ });
446
+ this.ws.send(request);
447
+ await new Promise(resolve => {
448
+ setTimeout(resolve, 50000);
449
+ setInterval(() => {
450
+ if (this.end) {
451
+ this.wsOpened = false;
452
+ this.ws = null;
453
+ this.view = {};
454
+ resolve();
455
+ }
456
+ }, 1000);
457
+ });
458
+ /* if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {
459
+ this.ws.close()
460
+ } */
461
+ } else {
462
+ this.wsOpened = false;
463
+ this.ws = null;
464
+ this.view = {};
465
+ }
438
466
  }
439
-
440
- this.wsOpened = false;
441
- this.ws = null;
442
- this.view = {};
443
467
  }
444
468
 
445
469
  _getParams(capParams) {
@@ -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')\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}\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: 5000,\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?'\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.view = {\n container: this,\n context: {},\n msg: {},\n botium: {\n conversationId: uuidv4(),\n stepId: null\n }\n }\n\n this.fullRecord = ''\n this.end = false\n\n const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }\n\n const buildBotMsg = botMsgs => {\n if (botMsgs.length === 1) return botMsgs[0]\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 return botMsg\n }\n\n const expandBotMsgs = 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 for (const sentence of sentences) {\n botMsgsFinal.push({\n messageText: sentence,\n sourceData: botMsg.sourceData\n })\n }\n }\n }\n return botMsgsFinal\n }\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.caps[Capabilities.VOIP_WORKER_URL])\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.wsOpened = false\n this.ws.on('open', () => {\n this.wsOpened = true\n debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_ENDPOINT]} opened.`)\n const request = {\n METHOD: 'initCall',\n API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY],\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 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 debug(JSON.stringify(request, null, 2))\n this.ws.send(JSON.stringify(request))\n })\n this.ws.on('close', async () => {\n debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`)\n })\n this.ws.on('error', (err) => {\n debug(err)\n if (!this.wsOpened) {\n this.end = true\n reject(new Error(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} 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: Cannot connect to VOIP Worker because of wrong API key'))\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.container, {\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 reject(new Error(`Error: ${parsedData.message}`))\n }\n\n if (parsedData && parsedData.type === 'fullRecord') {\n this.end = true\n this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {\n name: 'full_record.wav',\n mimeType: 'audio/wav',\n base64: parsedData.fullRecord\n })\n this.Stop()\n }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (!this.sentenceBuilding) {\n this.sentenceBuilding = true\n this.sentencesBuilding++\n }\n }\n\n if (parsedData && parsedData.data && parsedData.data.final) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL') {\n this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {\n const botMsgsExpanded = expandBotMsgs(this.botMsgs)\n botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT') {\n this.sentenceBuilding = false\n this.sentencesFinal++\n\n clearTimeout(this.sendMessageTimeout)\n this.sendMessageTimeout = setTimeout(() => {\n if (this.sentenceBuilding === false && this.sentencesBuilding === this.sentencesFinal) {\n sendBotMsg(buildBotMsg(this.botMsgs))\n this.botMsgs = []\n this.sentencesBuilding = 0\n this.sentencesFinal = 0\n }\n }, this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n }\n }\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 { 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 }\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n sessionId: this.sessionId,\n b64_buffer: msg.media[0].buffer.toString('base64')\n })\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 this.ws.send(request)\n }\n setTimeout(resolve, duration * 1000)\n }, 0)\n })\n }\n\n async Stop () {\n debug('Stop called')\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, 50000)\n setInterval(() => {\n if (this.end) {\n resolve()\n }\n }, 1000)\n })\n\n if (this.ws) {\n this.ws.close()\n }\n this.wsOpened = false\n this.ws = null\n this.view = {}\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","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","view","container","context","msg","botium","conversationId","stepId","fullRecord","end","sendBotMsg","botMsg","setTimeout","buildBotMsg","length","messageText","map","m","join","sourceData","expandBotMsgs","splitSentences","s","match","RegExp","botMsgsFinal","sentences","_","isNil","push","sentence","Promise","resolve","reject","ws","WebSocket","isArray","split","wsOpened","on","VOIP_WORKER_ENDPOINT","request","METHOD","API_KEY","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","STT_CONFIG","stt_url","stt_params","stt_body","TTS_CONFIG","tts_url","tts_params","tts_body","JSON","stringify","send","message","parsedData","parse","parsedDataLog","cloneDeep","type","sessionId","voipConfig","event","apiKey","_extractApiKey","_getBody","connectDuration","emit","metricName","credits","name","mimeType","base64","Stop","final","forEach","botMsgsExpanded","clearTimeout","sendMessageTimeout","UserSays","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","toString","media","buffer","maxContentLength","Infinity","maxBodyLength","parseInt","mediaUri","setInterval","close","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","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","../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}\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: 5000,\n VOIP_STT_MESSAGE_HANDLING_DELIMITER: '. ',\n VOIP_STT_MESSAGE_HANDLING_PUNCTUATION: '.!?'\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.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\n const sendBotMsg = (botMsg) => { setTimeout(() => this.queueBotSays(botMsg), 0) }\n\n const buildBotMsg = botMsgs => {\n if (botMsgs.length === 1) return botMsgs[0]\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 return botMsg\n }\n\n const expandBotMsgs = 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 for (const sentence of sentences) {\n botMsgsFinal.push({\n messageText: sentence,\n sourceData: botMsg.sourceData\n })\n }\n }\n }\n return botMsgsFinal\n }\n\n const { data } = 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\n await new Promise(resolve => {\n setTimeout(resolve, 2000)\n })\n\n return new Promise((resolve, reject) => {\n if (data.status === 'error') {\n reject(new Error(`Error connecting to VOIP Worker: ${data.message}`))\n }\n this.ws = new WebSocket(this.caps[Capabilities.VOIP_WORKER_URL].replace('8765', data.port))\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.wsOpened = false\n this.ws.on('open', () => {\n this.wsOpened = true\n debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_ENDPOINT]} 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 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 debug(JSON.stringify(request, null, 2))\n this.ws.send(JSON.stringify(request))\n })\n this.ws.on('close', async () => {\n debug(`${this.sessionId} - Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`)\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 ${this.caps[Capabilities.VOIP_WORKER_URL]} 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.container, {\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 this.Stop()\n reject(new Error(`Error: ${parsedData.message}`))\n }\n\n if (parsedData && parsedData.type === 'fullRecord') {\n this.end = true\n this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {\n name: 'full_record.wav',\n mimeType: 'audio/wav',\n base64: parsedData.fullRecord\n })\n this.Stop()\n }\n\n if (parsedData && parsedData.data && parsedData.data.final === false) {\n if (!this.sentenceBuilding) {\n this.sentenceBuilding = true\n this.sentencesBuilding++\n }\n }\n\n if (parsedData && parsedData.data && parsedData.data.final) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n this.botMsgs.push(botMsg)\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'ORIGINAL') {\n this.botMsgs.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'EXPAND') {\n const botMsgsExpanded = expandBotMsgs(this.botMsgs)\n botMsgsExpanded.forEach(botMsg => sendBotMsg(botMsg))\n this.botMsgs = []\n }\n if (this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING] === 'CONCAT') {\n this.sentenceBuilding = false\n this.sentencesFinal++\n\n clearTimeout(this.sendMessageTimeout)\n this.sendMessageTimeout = setTimeout(() => {\n if (this.sentenceBuilding === false && this.sentencesBuilding === this.sentencesFinal) {\n sendBotMsg(buildBotMsg(this.botMsgs))\n this.botMsgs = []\n this.sentencesBuilding = 0\n this.sentencesFinal = 0\n }\n }, this.caps[Capabilities.VOIP_STT_MESSAGE_HANDLING_TIMEOUT])\n }\n }\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 if (!this.stopCalled) {\n this.stopCalled = true\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, 50000)\n setInterval(() => {\n if (this.end) {\n this.wsOpened = false\n this.ws = null\n this.view = {}\n resolve()\n }\n }, 1000)\n })\n /* if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n this.ws.close()\n } */\n } else {\n this.wsOpened = false\n this.ws = null\n this.view = {}\n }\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","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","view","container","context","msg","botium","conversationId","stepId","stopCalled","fullRecord","end","sendBotMsg","botMsg","setTimeout","buildBotMsg","length","messageText","map","m","join","sourceData","expandBotMsgs","splitSentences","s","match","RegExp","botMsgsFinal","sentences","_","isNil","push","sentence","API_KEY","URL","path","replace","toString","Promise","resolve","reject","message","ws","WebSocket","port","isArray","split","wsOpened","on","VOIP_WORKER_ENDPOINT","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","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","Stop","name","mimeType","base64","final","forEach","botMsgsExpanded","clearTimeout","sendMessageTimeout","UserSays","attachments","duration","buttons","digits","payload","ttsRequest","text","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","media","buffer","mediaUri","maxContentLength","Infinity","maxBodyLength","parseInt","readyState","CLOSED","setInterval","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","body","get","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","e2eTesting","capabilities","label","required"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botium-connector-voip",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "Botium Voice over IP Connector",
5
5
  "main": "dist/botium-connector-voip-cjs.js",
6
6
  "module": "dist/botium-connector-voip-es.js",
package/src/connector.js CHANGED
@@ -3,6 +3,7 @@ const WebSocket = require('ws')
3
3
  const _ = require('lodash')
4
4
  const axios = require('axios')
5
5
  const debug = require('debug')('botium-connector-voip')
6
+ const path = require('path')
6
7
 
7
8
  const Capabilities = {
8
9
  VOIP_STT_URL_STREAM: 'VOIP_STT_URL_STREAM',
@@ -108,6 +109,8 @@ class BotiumConnectorVoip {
108
109
  }
109
110
  }
110
111
 
112
+ this.stopCalled = false
113
+
111
114
  this.fullRecord = ''
112
115
  this.end = false
113
116
 
@@ -140,8 +143,23 @@ class BotiumConnectorVoip {
140
143
  return botMsgsFinal
141
144
  }
142
145
 
146
+ const { data } = await axios({
147
+ method: 'post',
148
+ data: {
149
+ API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY]
150
+ },
151
+ url: new URL(path.join(`${this.caps[Capabilities.VOIP_WORKER_URL].replace('wss', 'https').replace('ws', 'http')}`, 'initCall')).toString()
152
+ })
153
+
154
+ await new Promise(resolve => {
155
+ setTimeout(resolve, 2000)
156
+ })
157
+
143
158
  return new Promise((resolve, reject) => {
144
- this.ws = new WebSocket(this.caps[Capabilities.VOIP_WORKER_URL])
159
+ if (data.status === 'error') {
160
+ reject(new Error(`Error connecting to VOIP Worker: ${data.message}`))
161
+ }
162
+ this.ws = new WebSocket(this.caps[Capabilities.VOIP_WORKER_URL].replace('8765', data.port))
145
163
 
146
164
  if (!_.isArray(this.caps[Capabilities.VOIP_ICE_STUN_SERVERS])) {
147
165
  if (this.caps[Capabilities.VOIP_ICE_STUN_SERVERS] === '') {
@@ -157,7 +175,6 @@ class BotiumConnectorVoip {
157
175
  debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_ENDPOINT]} opened.`)
158
176
  const request = {
159
177
  METHOD: 'initCall',
160
- API_KEY: this.caps[Capabilities.VOIP_WORKER_APIKEY],
161
178
  SIP_CALLER_AUTO: this.caps[Capabilities.VOIP_SIP_POOL_CALLER_ENABLE],
162
179
  SIP_PROXY: this.caps[Capabilities.VOIP_SIP_PROXY],
163
180
  SIP_CALLER_URI: this.caps[Capabilities.VOIP_SIP_CALLER_URI],
@@ -189,13 +206,13 @@ class BotiumConnectorVoip {
189
206
  this.ws.send(JSON.stringify(request))
190
207
  })
191
208
  this.ws.on('close', async () => {
192
- debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`)
209
+ debug(`${this.sessionId} - Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`)
193
210
  })
194
211
  this.ws.on('error', (err) => {
195
212
  debug(err)
196
213
  if (!this.wsOpened) {
197
214
  this.end = true
198
- reject(new Error(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} error: ${err.message || err}`))
215
+ reject(new Error(`${this.sessionId} - Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} error: ${err.message || err}`))
199
216
  }
200
217
  })
201
218
  this.ws.on('message', async (data) => {
@@ -214,10 +231,6 @@ class BotiumConnectorVoip {
214
231
  reject(new Error('Error: Cannot open a call: SIP Authorization failed'))
215
232
  }
216
233
 
217
- if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event !== 'onCallRegState') {
218
- reject(new Error('Error: Cannot connect to VOIP Worker because of wrong API key'))
219
- }
220
-
221
234
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden' && parsedData.event === 'onCallRegState') {
222
235
  reject(new Error('Error: Sip Registration failed'))
223
236
  }
@@ -239,6 +252,8 @@ class BotiumConnectorVoip {
239
252
  }
240
253
 
241
254
  if (parsedData && parsedData.type === 'error') {
255
+ this.end = true
256
+ this.Stop()
242
257
  reject(new Error(`Error: ${parsedData.message}`))
243
258
  }
244
259
 
@@ -357,6 +372,17 @@ class BotiumConnectorVoip {
357
372
  }
358
373
  }
359
374
  if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {
375
+ const request = JSON.stringify({
376
+ METHOD: 'sendAudio',
377
+ sessionId: this.sessionId,
378
+ b64_buffer: msg.media[0].buffer.toString('base64')
379
+ })
380
+ this.ws.send(request)
381
+ msg.attachments.push({
382
+ name: msg.media[0].mediaUri,
383
+ mimeType: msg.media[0].mimeType,
384
+ base64: msg.media[0].buffer.toString('base64')
385
+ })
360
386
  const { data } = await axios({
361
387
  method: 'post',
362
388
  data: msg.media[0].buffer,
@@ -370,18 +396,9 @@ class BotiumConnectorVoip {
370
396
  })
371
397
  if (data && data.duration) {
372
398
  duration = parseInt(data.duration)
399
+ } else {
400
+ reject(new Error('Getting audio duration from Speech Api failed'))
373
401
  }
374
- const request = JSON.stringify({
375
- METHOD: 'sendAudio',
376
- sessionId: this.sessionId,
377
- b64_buffer: msg.media[0].buffer.toString('base64')
378
- })
379
- msg.attachments.push({
380
- name: msg.media[0].mediaUri,
381
- mimeType: msg.media[0].mimeType,
382
- base64: msg.media[0].buffer.toString('base64')
383
- })
384
- this.ws.send(request)
385
402
  }
386
403
  setTimeout(resolve, duration * 1000)
387
404
  }, 0)
@@ -389,27 +406,35 @@ class BotiumConnectorVoip {
389
406
  }
390
407
 
391
408
  async Stop () {
392
- debug('Stop called')
393
- const request = JSON.stringify({
394
- METHOD: 'stopCall',
395
- sessionId: this.sessionId
396
- })
397
- this.ws.send(request)
398
- await new Promise(resolve => {
399
- setTimeout(resolve, 50000)
400
- setInterval(() => {
401
- if (this.end) {
402
- resolve()
403
- }
404
- }, 1000)
405
- })
406
-
407
- if (this.ws) {
408
- this.ws.close()
409
+ if (!this.stopCalled) {
410
+ this.stopCalled = true
411
+ debug(`${this.sessionId} - Stop called`)
412
+ if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {
413
+ const request = JSON.stringify({
414
+ METHOD: 'stopCall',
415
+ sessionId: this.sessionId
416
+ })
417
+ this.ws.send(request)
418
+ await new Promise(resolve => {
419
+ setTimeout(resolve, 50000)
420
+ setInterval(() => {
421
+ if (this.end) {
422
+ this.wsOpened = false
423
+ this.ws = null
424
+ this.view = {}
425
+ resolve()
426
+ }
427
+ }, 1000)
428
+ })
429
+ /* if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {
430
+ this.ws.close()
431
+ } */
432
+ } else {
433
+ this.wsOpened = false
434
+ this.ws = null
435
+ this.view = {}
436
+ }
409
437
  }
410
- this.wsOpened = false
411
- this.ws = null
412
- this.view = {}
413
438
  }
414
439
 
415
440
  _getParams (capParams) {