botium-connector-voip 0.0.1 → 0.0.2

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.
@@ -164,7 +164,7 @@ class BotiumConnectorVoip {
164
164
  debug(request);
165
165
  this.ws.send(JSON.stringify(request));
166
166
  });
167
- this.ws.on('close', () => {
167
+ this.ws.on('close', async () => {
168
168
  debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`);
169
169
  });
170
170
  this.ws.on('error', err => {
@@ -183,14 +183,27 @@ class BotiumConnectorVoip {
183
183
  this.sessionId = parsedData.voipConfig.sessionId;
184
184
  }
185
185
 
186
+ if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'unauthorized') {
187
+ reject(new Error('Cannot open a call: SIP Authorization failed'));
188
+ }
189
+
190
+ if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {
191
+ reject(new Error('Cannot connect to VOIP Worker because of wrong API key'));
192
+ }
193
+
186
194
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {
187
- reject(new Error('Cannot connect to VOIP Worker because of wrong APi key'));
195
+ debug('error');
196
+ reject(new Error('Cannot connect to VOIP Worker because of wrong API key'));
188
197
  }
189
198
 
190
199
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {
191
200
  resolve();
192
201
  }
193
202
 
203
+ if (parsedData && parsedData.type === 'error') {
204
+ reject(new Error(parsedData.message));
205
+ }
206
+
194
207
  if (parsedData && parsedData.type === 'fullRecord') {
195
208
  this.end = true;
196
209
  this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {
@@ -266,20 +279,17 @@ class BotiumConnectorVoip {
266
279
  }
267
280
 
268
281
  if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {
269
- msg.userInputs.forEach((userInput, index) => {
270
- const request = JSON.stringify({
271
- METHOD: 'sendAudio',
272
- PESQ: userInput.args.filter(a => a.includes(';PESQ')).length > 0,
273
- sessionId: this.sessionId,
274
- b64_buffer: msg.media[index].buffer.toString('base64')
275
- });
276
- msg.attachments.push({
277
- name: msg.media[index].mediaUri,
278
- mimeType: msg.media[index].mimeType,
279
- base64: msg.media[index].buffer.toString('base64')
280
- });
281
- this.ws.send(request);
282
+ const request = JSON.stringify({
283
+ METHOD: 'sendAudio',
284
+ sessionId: this.sessionId,
285
+ b64_buffer: msg.media[0].buffer.toString('base64')
282
286
  });
287
+ msg.attachments.push({
288
+ name: msg.media[0].mediaUri,
289
+ mimeType: msg.media[0].mimeType,
290
+ base64: msg.media[0].buffer.toString('base64')
291
+ });
292
+ this.ws.send(request);
283
293
  }
284
294
  }, 500);
285
295
  }
@@ -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_HEADERS: 'VOIP_STT_HEADERS',\n VOIP_STT_TIMEOUT: 'VOIP_STT_TIMEOUT',\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}\n\nclass BotiumConnectorVoip {\n constructor ({ queueBotSays, eventEmitter, caps }) {\n this.queueBotSays = queueBotSays\n this.caps = caps\n this.eventEmitter = eventEmitter\n }\n\n async Validate () {\n debug('Validate called')\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 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(request)\n this.ws.send(JSON.stringify(request))\n })\n this.ws.on('close', () => {\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 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 const botMsgs = []\n\n debug(parsedData)\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 === 'forbidden') {\n reject(new Error('Cannot connect to VOIP Worker because of wrong APi key'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {\n resolve()\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 }\n\n if (parsedData && parsedData.data && parsedData.data.final) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n botMsgs.push(botMsg)\n }\n\n botMsgs.forEach(botMsg => setTimeout(() => this.queueBotSays(botMsg), 0))\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 setTimeout(async () => {\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) throw new Error('TTS not configured, only audio input supported')\n\n const ttsRequest = {\n ...this.axiosTtsParams,\n params: {\n ...(this.axiosTtsParams.params || {}),\n text: msg.messageText\n },\n data: this._getBody(Capabilities.BSP_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 throw new Error(`TTS \"${msg.messageText}\" failed - ${this._getAxiosErrOutput(err)}`)\n }\n if (Buffer.isBuffer(ttsResponse.data)) {\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 throw new Error(`TTS failed, response is: ${this._getAxiosShortenedOutput(ttsResponse.data)}`)\n }\n }\n if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {\n msg.userInputs.forEach((userInput, index) => {\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n PESQ: userInput.args.filter(a => a.includes(';PESQ')).length > 0,\n sessionId: this.sessionId,\n b64_buffer: msg.media[index].buffer.toString('base64')\n })\n msg.attachments.push({\n name: msg.media[index].mediaUri,\n mimeType: msg.media[index].mimeType,\n base64: msg.media[index].buffer.toString('base64')\n })\n this.ws.send(request)\n })\n }\n }, 500)\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\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 },\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_HEADERS","VOIP_STT_TIMEOUT","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","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","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","send","JSON","stringify","message","parsedData","parse","botMsgs","type","sessionId","voipConfig","emit","name","mimeType","base64","final","botMsg","messageText","sourceData","push","forEach","setTimeout","UserSays","attachments","buttons","length","digits","payload","ttsRequest","text","_getBody","BSP_TTS_BODY","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","toString","media","buffer","userInputs","userInput","index","args","filter","a","includes","mediaUri","Stop","setInterval","close","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","capabilities","label","required"],"mappings":"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"}
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_HEADERS: 'VOIP_STT_HEADERS',\n VOIP_STT_TIMEOUT: 'VOIP_STT_TIMEOUT',\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}\n\nclass BotiumConnectorVoip {\n constructor ({ queueBotSays, eventEmitter, caps }) {\n this.queueBotSays = queueBotSays\n this.caps = caps\n this.eventEmitter = eventEmitter\n }\n\n async Validate () {\n debug('Validate called')\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 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(request)\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 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 const botMsgs = []\n\n debug(parsedData)\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('Cannot open a call: SIP Authorization failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {\n reject(new Error('Cannot connect to VOIP Worker because of wrong API key'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {\n debug('error')\n reject(new Error('Cannot connect to VOIP Worker because of wrong API key'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {\n resolve()\n }\n\n if (parsedData && parsedData.type === 'error') {\n reject(new 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 }\n\n if (parsedData && parsedData.data && parsedData.data.final) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n botMsgs.push(botMsg)\n }\n\n botMsgs.forEach(botMsg => setTimeout(() => this.queueBotSays(botMsg), 0))\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 setTimeout(async () => {\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) throw new Error('TTS not configured, only audio input supported')\n\n const ttsRequest = {\n ...this.axiosTtsParams,\n params: {\n ...(this.axiosTtsParams.params || {}),\n text: msg.messageText\n },\n data: this._getBody(Capabilities.BSP_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 throw new Error(`TTS \"${msg.messageText}\" failed - ${this._getAxiosErrOutput(err)}`)\n }\n if (Buffer.isBuffer(ttsResponse.data)) {\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 throw new Error(`TTS failed, response is: ${this._getAxiosShortenedOutput(ttsResponse.data)}`)\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 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 }, 500)\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\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 },\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_HEADERS","VOIP_STT_TIMEOUT","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","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","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","send","JSON","stringify","message","parsedData","parse","botMsgs","type","sessionId","voipConfig","emit","name","mimeType","base64","final","botMsg","messageText","sourceData","push","forEach","setTimeout","UserSays","attachments","buttons","length","digits","payload","ttsRequest","text","_getBody","BSP_TTS_BODY","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","toString","media","buffer","mediaUri","Stop","setInterval","close","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","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,gBAAgB,EAAE,kBALC;AAMnBC,EAAAA,gBAAgB,EAAE,kBANC;AAOnBC,EAAAA,YAAY,EAAE,cAPK;AAQnBC,EAAAA,eAAe,EAAE,iBARE;AASnBC,EAAAA,eAAe,EAAE,iBATE;AAUnBC,EAAAA,aAAa,EAAE,eAVI;AAWnBC,EAAAA,gBAAgB,EAAE,kBAXC;AAYnBC,EAAAA,gBAAgB,EAAE,kBAZC;AAanBC,EAAAA,eAAe,EAAE,iBAbE;AAcnBC,EAAAA,kBAAkB,EAAE,oBAdD;AAenBC,EAAAA,2BAA2B,EAAE,6BAfV;AAgBnBC,EAAAA,6BAA6B,EAAE,+BAhBZ;AAiBnBC,EAAAA,uBAAuB,EAAE,yBAjBN;AAkBnBC,EAAAA,wBAAwB,EAAE,0BAlBP;AAmBnBC,EAAAA,wBAAwB,EAAE,0BAnBP;AAoBnBC,EAAAA,cAAc,EAAE,gBApBG;AAqBnBC,EAAAA,oBAAoB,EAAE,sBArBH;AAsBnBC,EAAAA,uBAAuB,EAAE,yBAtBN;AAuBnBC,EAAAA,mBAAmB,EAAE,qBAvBF;AAwBnBC,EAAAA,eAAe,EAAE,iBAxBE;AAyBnBC,EAAAA,qBAAqB,EAAE,uBAzBJ;AA0BnBC,EAAAA,oBAAoB,EAAE,sBA1BH;AA2BnBC,EAAAA,oBAAoB,EAAE,sBA3BH;AA4BnBC,EAAAA,kBAAkB,EAAE,oBA5BD;AA6BnBC,EAAAA,sBAAsB,EAAE,wBA7BL;AA8BnBC,EAAAA,sBAAsB,EAAE;AA9BL,CAArB;AAiCA,MAAMC,QAAQ,GAAG;AACfC,EAAAA,eAAe,EAAE,MADF;AAEf1B,EAAAA,gBAAgB,EAAE,KAFH;AAGfG,EAAAA,eAAe,EAAE,KAHF;AAIfG,EAAAA,gBAAgB,EAAE;AAJH,CAAjB;;AAOA,MAAMqB,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;AACD;;AAEa,QAARE,QAAQ,GAAI;AAChBxC,IAAAA,KAAK,CAAC,iBAAD,CAAL;;AAEA,QAAI,KAAKuC,IAAL,CAAU9B,YAAd,EAA4B;AAC1B,WAAKgC,cAAL,GAAsB;AACpBC,QAAAA,GAAG,EAAE,KAAKH,IAAL,CAAU9B,YADK;AAEpBkC,QAAAA,MAAM,EAAE,KAAKC,UAAL,CAAgB1C,YAAY,CAACQ,eAA7B,CAFY;AAGpBmC,QAAAA,MAAM,EAAE,KAAKN,IAAL,CAAU5B,eAHE;AAIpBmC,QAAAA,OAAO,EAAE,KAAKP,IAAL,CAAUzB,gBAJC;AAKpBiC,QAAAA,OAAO,EAAE,KAAKC,WAAL,CAAiB9C,YAAY,CAACW,gBAA9B;AALW,OAAtB;;AAOA,UAAI;AACF,cAAM;AAAEoC,UAAAA;AAAF,YAAW,MAAMC,yBAAK,CAAC,EAC3B,GAAG,KAAKT,cADmB;AAE3BC,UAAAA,GAAG,EAAE,KAAKS,YAAL,CAAkB,KAAKZ,IAAL,CAAU9B,YAA5B,EAA0C,aAA1C;AAFsB,SAAD,CAA5B;;AAIA,YAAIwC,IAAI,IAAIA,IAAI,CAACG,MAAL,KAAgB,IAA5B,EAAkC;AAChCpD,UAAAA,KAAK,CAAE,iCAAgC,KAAKqD,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,SAAKhB,IAAL,GAAYkB,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBzB,QAAlB,EAA4B,KAAKM,IAAjC,CAAZ;AACD;;AAEU,QAALoB,KAAK,GAAI;AACb3D,IAAAA,KAAK,CAAC,cAAD,CAAL;AACAA,IAAAA,KAAK,CAAC,KAAKuC,IAAL,CAAUrC,YAAY,CAACO,YAAvB,CAAD,CAAL;AAEA,SAAKmD,IAAL,GAAY;AACVC,MAAAA,SAAS,EAAE,IADD;AAEVC,MAAAA,OAAO,EAAE,EAFC;AAGVC,MAAAA,GAAG,EAAE,EAHK;AAIVC,MAAAA,MAAM,EAAE;AACNC,QAAAA,cAAc,EAAEnE,MAAM,EADhB;AAENoE,QAAAA,MAAM,EAAE;AAFF;AAJE,KAAZ;AAUA,SAAKC,UAAL,GAAkB,EAAlB;AACA,SAAKC,GAAL,GAAW,KAAX;AAEA,WAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,WAAKC,EAAL,GAAU,IAAIC,sBAAJ,CAAc,KAAKlC,IAAL,CAAUrC,YAAY,CAACa,eAAvB,CAAd,CAAV;;AAEA,UAAI,CAAC2D,0BAAC,CAACC,OAAF,CAAU,KAAKpC,IAAL,CAAUrC,YAAY,CAACyB,qBAAvB,CAAV,CAAL,EAA+D;AAC7D,YAAI,KAAKY,IAAL,CAAUrC,YAAY,CAACyB,qBAAvB,MAAkD,EAAtD,EAA0D;AACxD,eAAKY,IAAL,CAAUrC,YAAY,CAACyB,qBAAvB,IAAgD,EAAhD;AACD,SAFD,MAEO;AACL,eAAKY,IAAL,CAAUrC,YAAY,CAACyB,qBAAvB,IAAgD,KAAKY,IAAL,CAAUrC,YAAY,CAACyB,qBAAvB,EAA8CiD,KAA9C,CAAoD,GAApD,CAAhD;AACD;AACF;;AAED,WAAKC,QAAL,GAAgB,KAAhB;AACA,WAAKL,EAAL,CAAQM,EAAR,CAAW,MAAX,EAAmB,MAAM;AACvB,aAAKD,QAAL,GAAgB,IAAhB;AACA7E,QAAAA,KAAK,CAAE,2BAA0B,KAAKuC,IAAL,CAAUrC,YAAY,CAAC6E,oBAAvB,CAA6C,UAAzE,CAAL;AACA,cAAMC,OAAO,GAAG;AACdC,UAAAA,MAAM,EAAE,UADM;AAEdC,UAAAA,OAAO,EAAE,KAAK3C,IAAL,CAAUrC,YAAY,CAACc,kBAAvB,CAFK;AAGdmE,UAAAA,eAAe,EAAE,KAAK5C,IAAL,CAAUrC,YAAY,CAACe,2BAAvB,CAHH;AAIdmE,UAAAA,SAAS,EAAE,KAAK7C,IAAL,CAAUrC,YAAY,CAACoB,cAAvB,CAJG;AAKd+D,UAAAA,cAAc,EAAE,KAAK9C,IAAL,CAAUrC,YAAY,CAACoF,mBAAvB,CALF;AAMdC,UAAAA,mBAAmB,EAAE,KAAKhD,IAAL,CAAUrC,YAAY,CAACkB,wBAAvB,CANP;AAOdoE,UAAAA,mBAAmB,EAAE,KAAKjD,IAAL,CAAUrC,YAAY,CAACmB,wBAAvB,CAPP;AAQdoE,UAAAA,kBAAkB,EAAE,KAAKlD,IAAL,CAAUrC,YAAY,CAACiB,uBAAvB,CARN;AASduE,UAAAA,wBAAwB,EAAE,KAAKnD,IAAL,CAAUrC,YAAY,CAACgB,6BAAvB,CATZ;AAUdyE,UAAAA,cAAc,EAAE,KAAKpD,IAAL,CAAUrC,YAAY,CAACuB,mBAAvB,CAVF;AAWdmE,UAAAA,eAAe,EAAE,KAAKrD,IAAL,CAAUrC,YAAY,CAACqB,oBAAvB,CAXH;AAYdsE,UAAAA,kBAAkB,EAAE,KAAKtD,IAAL,CAAUrC,YAAY,CAACsB,uBAAvB,CAZN;AAadsE,UAAAA,UAAU,EAAE,KAAKvD,IAAL,CAAUrC,YAAY,CAACwB,eAAvB,CAbE;AAcdqE,UAAAA,gBAAgB,EAAE,KAAKxD,IAAL,CAAUrC,YAAY,CAACyB,qBAAvB,CAdJ;AAedqE,UAAAA,eAAe,EAAE,KAAKzD,IAAL,CAAUrC,YAAY,CAAC2B,oBAAvB,CAfH;AAgBdoE,UAAAA,iBAAiB,EAAE,KAAK1D,IAAL,CAAUrC,YAAY,CAAC4B,kBAAvB,CAhBL;AAiBdoE,UAAAA,iBAAiB,EAAE,KAAK3D,IAAL,CAAUrC,YAAY,CAAC6B,sBAAvB,CAjBL;AAkBdoE,UAAAA,iBAAiB,EAAE,KAAK5D,IAAL,CAAUrC,YAAY,CAAC8B,sBAAvB,KAAkD,KAlBvD;AAmBdoE,UAAAA,UAAU,EAAE;AACVC,YAAAA,OAAO,EAAE,KAAK9D,IAAL,CAAUrC,YAAY,CAACC,mBAAvB,CADC;AAEVmG,YAAAA,UAAU,EAAE,KAAK/D,IAAL,CAAUrC,YAAY,CAACE,sBAAvB,CAFF;AAGVmG,YAAAA,QAAQ,EAAE,KAAKhE,IAAL,CAAUrC,YAAY,CAACI,oBAAvB,KAAgD;AAHhD,WAnBE;AAwBdkG,UAAAA,UAAU,EAAE;AACVC,YAAAA,OAAO,EAAE,KAAKlE,IAAL,CAAUrC,YAAY,CAACO,YAAvB,CADC;AAEViG,YAAAA,UAAU,EAAE,KAAKnE,IAAL,CAAUrC,YAAY,CAACQ,eAAvB,CAFF;AAGViG,YAAAA,QAAQ,EAAE,KAAKpE,IAAL,CAAUrC,YAAY,CAACU,aAAvB,KAAyC;AAHzC;AAxBE,SAAhB;AA8BAZ,QAAAA,KAAK,CAACgF,OAAD,CAAL;AACA,aAAKR,EAAL,CAAQoC,IAAR,CAAaC,IAAI,CAACC,SAAL,CAAe9B,OAAf,CAAb;AACD,OAnCD;AAoCA,WAAKR,EAAL,CAAQM,EAAR,CAAW,OAAX,EAAoB,YAAY;AAC9B9E,QAAAA,KAAK,CAAE,2BAA0B,KAAKuC,IAAL,CAAUrC,YAAY,CAACa,eAAvB,CAAwC,UAApE,CAAL;AACD,OAFD;AAGA,WAAKyD,EAAL,CAAQM,EAAR,CAAW,OAAX,EAAqBvB,GAAD,IAAS;AAC3BvD,QAAAA,KAAK,CAACuD,GAAD,CAAL;;AACA,YAAI,CAAC,KAAKsB,QAAV,EAAoB;AAClBN,UAAAA,MAAM,CAAC,IAAIjB,KAAJ,CAAW,2BAA0B,KAAKf,IAAL,CAAUrC,YAAY,CAACa,eAAvB,CAAwC,WAAUwC,GAAG,CAACwD,OAAJ,IAAexD,GAAI,EAA1G,CAAD,CAAN;AACD;AACF,OALD;AAMA,WAAKiB,EAAL,CAAQM,EAAR,CAAW,SAAX,EAAsB,MAAO7B,IAAP,IAAgB;AACpC,cAAM+D,UAAU,GAAGH,IAAI,CAACI,KAAL,CAAWhE,IAAX,CAAnB;AACA,cAAMiE,OAAO,GAAG,EAAhB;AAEAlH,QAAAA,KAAK,CAACgH,UAAD,CAAL;;AAEA,YAAIA,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,UAAlC,IAAgDH,UAAU,CAAC5D,MAAX,KAAsB,aAA1E,EAAyF;AACvF,eAAKgE,SAAL,GAAiBJ,UAAU,CAACK,UAAX,CAAsBD,SAAvC;AACD;;AAED,YAAIJ,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,UAAlC,IAAgDH,UAAU,CAAC5D,MAAX,KAAsB,cAA1E,EAA0F;AACxFmB,UAAAA,MAAM,CAAC,IAAIjB,KAAJ,CAAU,8CAAV,CAAD,CAAN;AACD;;AAED,YAAI0D,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,UAAlC,IAAgDH,UAAU,CAAC5D,MAAX,KAAsB,WAA1E,EAAuF;AACrFmB,UAAAA,MAAM,CAAC,IAAIjB,KAAJ,CAAU,wDAAV,CAAD,CAAN;AACD;;AAED,YAAI0D,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,UAAlC,IAAgDH,UAAU,CAAC5D,MAAX,KAAsB,WAA1E,EAAuF;AACrFpD,UAAAA,KAAK,CAAC,OAAD,CAAL;AACAuE,UAAAA,MAAM,CAAC,IAAIjB,KAAJ,CAAU,wDAAV,CAAD,CAAN;AACD;;AAED,YAAI0D,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,UAAlC,IAAgDH,UAAU,CAAC5D,MAAX,KAAsB,WAA1E,EAAuF;AACrFkB,UAAAA,OAAO;AACR;;AAED,YAAI0C,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,OAAtC,EAA+C;AAC7C5C,UAAAA,MAAM,CAAC,IAAIjB,KAAJ,CAAU0D,UAAU,CAACD,OAArB,CAAD,CAAN;AACD;;AAED,YAAIC,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,YAAtC,EAAoD;AAClD,eAAK/C,GAAL,GAAW,IAAX;AACA,eAAK9B,YAAL,CAAkBgF,IAAlB,CAAuB,oBAAvB,EAA6C,KAAKzD,SAAlD,EAA6D;AAC3D0D,YAAAA,IAAI,EAAE,iBADqD;AAE3DC,YAAAA,QAAQ,EAAE,WAFiD;AAG3DC,YAAAA,MAAM,EAAET,UAAU,CAAC7C;AAHwC,WAA7D;AAKD;;AAED,YAAI6C,UAAU,IAAIA,UAAU,CAAC/D,IAAzB,IAAiC+D,UAAU,CAAC/D,IAAX,CAAgByE,KAArD,EAA4D;AAC1D,gBAAMC,MAAM,GAAG;AAAEC,YAAAA,WAAW,EAAEZ,UAAU,CAAC/D,IAAX,CAAgB8D,OAA/B;AAAwCc,YAAAA,UAAU,EAAEb;AAApD,WAAf;AACAE,UAAAA,OAAO,CAACY,IAAR,CAAaH,MAAb;AACD;;AAEDT,QAAAA,OAAO,CAACa,OAAR,CAAgBJ,MAAM,IAAIK,UAAU,CAAC,MAAM,KAAK3F,YAAL,CAAkBsF,MAAlB,CAAP,EAAkC,CAAlC,CAApC;AACD,OA9CD;AA+CD,KAxGM,CAAP;AAyGD;;AAEa,QAARM,QAAQ,CAAElE,GAAF,EAAO;AACnB/D,IAAAA,KAAK,CAAC,iBAAD,CAAL;AAEAA,IAAAA,KAAK,CAAC+D,GAAD,CAAL;;AAEA,QAAI,CAACA,GAAG,CAACmE,WAAT,EAAsB;AACpBnE,MAAAA,GAAG,CAACmE,WAAJ,GAAkB,EAAlB;AACD;;AACDF,IAAAA,UAAU,CAAC,YAAY;AACrB,UAAIjE,GAAG,IAAIA,GAAG,CAACoE,OAAX,IAAsBpE,GAAG,CAACoE,OAAJ,CAAYC,MAAZ,GAAqB,CAA/C,EAAkD;AAChD,cAAMpD,OAAO,GAAG6B,IAAI,CAACC,SAAL,CAAe;AAC7B7B,UAAAA,MAAM,EAAE,UADqB;AAE7BoD,UAAAA,MAAM,EAAEtE,GAAG,CAACoE,OAAJ,CAAY,CAAZ,EAAeG,OAFM;AAG7BlB,UAAAA,SAAS,EAAE,KAAKA;AAHa,SAAf,CAAhB;AAKA,aAAK5C,EAAL,CAAQoC,IAAR,CAAa5B,OAAb;AACD,OAPD,MAOO,IAAIjB,GAAG,IAAIA,GAAG,CAAC6D,WAAf,EAA4B;AACjC,YAAI,CAAC,KAAKnF,cAAV,EAA0B,MAAM,IAAIa,KAAJ,CAAU,gDAAV,CAAN;AAE1B,cAAMiF,UAAU,GAAG,EACjB,GAAG,KAAK9F,cADS;AAEjBE,UAAAA,MAAM,EAAE,EACN,IAAI,KAAKF,cAAL,CAAoBE,MAApB,IAA8B,EAAlC,CADM;AAEN6F,YAAAA,IAAI,EAAEzE,GAAG,CAAC6D;AAFJ,WAFS;AAMjB3E,UAAAA,IAAI,EAAE,KAAKwF,QAAL,CAAcvI,YAAY,CAACwI,YAA3B,CANW;AAOjBC,UAAAA,YAAY,EAAE;AAPG,SAAnB;AASA5E,QAAAA,GAAG,CAAC8D,UAAJ,GAAiBU,UAAjB;AAEA,YAAIK,WAAW,GAAG,IAAlB;;AACA,YAAI;AACFA,UAAAA,WAAW,GAAG,MAAM1F,yBAAK,CAACqF,UAAD,CAAzB;AACD,SAFD,CAEE,OAAOhF,GAAP,EAAY;AACZ,gBAAM,IAAID,KAAJ,CAAW,QAAOS,GAAG,CAAC6D,WAAY,cAAa,KAAKpE,kBAAL,CAAwBD,GAAxB,CAA6B,EAA5E,CAAN;AACD;;AACD,YAAIsF,MAAM,CAACC,QAAP,CAAgBF,WAAW,CAAC3F,IAA5B,CAAJ,EAAuC;AACrC,gBAAM+B,OAAO,GAAG6B,IAAI,CAACC,SAAL,CAAe;AAC7B7B,YAAAA,MAAM,EAAE,WADqB;AAE7B8D,YAAAA,IAAI,EAAE,KAFuB;AAG7B3B,YAAAA,SAAS,EAAE,KAAKA,SAHa;AAI7B4B,YAAAA,UAAU,EAAEJ,WAAW,CAAC3F,IAAZ,CAAiBgG,QAAjB,CAA0B,QAA1B;AAJiB,WAAf,CAAhB;AAMAlF,UAAAA,GAAG,CAACmE,WAAJ,CAAgBJ,IAAhB,CAAqB;AACnBP,YAAAA,IAAI,EAAE,SADa;AAEnBC,YAAAA,QAAQ,EAAE,WAFS;AAGnBC,YAAAA,MAAM,EAAEmB,WAAW,CAAC3F,IAAZ,CAAiBgG,QAAjB,CAA0B,QAA1B;AAHW,WAArB;AAKA,eAAKzE,EAAL,CAAQoC,IAAR,CAAa5B,OAAb;AACD,SAbD,MAaO;AACL,gBAAM,IAAI1B,KAAJ,CAAW,4BAA2B,KAAKD,wBAAL,CAA8BuF,WAAW,CAAC3F,IAA1C,CAAgD,EAAtF,CAAN;AACD;AACF;;AACD,UAAIc,GAAG,IAAIA,GAAG,CAACmF,KAAX,IAAoBnF,GAAG,CAACmF,KAAJ,CAAUd,MAAV,GAAmB,CAAvC,IAA4CrE,GAAG,CAACmF,KAAJ,CAAU,CAAV,EAAaC,MAA7D,EAAqE;AACnE,cAAMnE,OAAO,GAAG6B,IAAI,CAACC,SAAL,CAAe;AAC7B7B,UAAAA,MAAM,EAAE,WADqB;AAE7BmC,UAAAA,SAAS,EAAE,KAAKA,SAFa;AAG7B4B,UAAAA,UAAU,EAAEjF,GAAG,CAACmF,KAAJ,CAAU,CAAV,EAAaC,MAAb,CAAoBF,QAApB,CAA6B,QAA7B;AAHiB,SAAf,CAAhB;AAKAlF,QAAAA,GAAG,CAACmE,WAAJ,CAAgBJ,IAAhB,CAAqB;AACnBP,UAAAA,IAAI,EAAExD,GAAG,CAACmF,KAAJ,CAAU,CAAV,EAAaE,QADA;AAEnB5B,UAAAA,QAAQ,EAAEzD,GAAG,CAACmF,KAAJ,CAAU,CAAV,EAAa1B,QAFJ;AAGnBC,UAAAA,MAAM,EAAE1D,GAAG,CAACmF,KAAJ,CAAU,CAAV,EAAaC,MAAb,CAAoBF,QAApB,CAA6B,QAA7B;AAHW,SAArB;AAKA,aAAKzE,EAAL,CAAQoC,IAAR,CAAa5B,OAAb;AACD;AACF,KA1DS,EA0DP,GA1DO,CAAV;AA2DD;;AAES,QAAJqE,IAAI,GAAI;AACZrJ,IAAAA,KAAK,CAAC,aAAD,CAAL;AACA,UAAMgF,OAAO,GAAG6B,IAAI,CAACC,SAAL,CAAe;AAC7B7B,MAAAA,MAAM,EAAE,UADqB;AAE7BmC,MAAAA,SAAS,EAAE,KAAKA;AAFa,KAAf,CAAhB;AAIA,SAAK5C,EAAL,CAAQoC,IAAR,CAAa5B,OAAb;AACA,UAAM,IAAIX,OAAJ,CAAYC,OAAO,IAAI;AAC3B0D,MAAAA,UAAU,CAAC1D,OAAD,EAAU,KAAV,CAAV;AACAgF,MAAAA,WAAW,CAAC,MAAM;AAChB,YAAI,KAAKlF,GAAT,EAAc;AACZE,UAAAA,OAAO;AACR;AACF,OAJU,EAIR,IAJQ,CAAX;AAKD,KAPK,CAAN;;AASA,QAAI,KAAKE,EAAT,EAAa;AACX,WAAKA,EAAL,CAAQ+E,KAAR;AACD;;AACD,SAAK1E,QAAL,GAAgB,KAAhB;AACA,SAAKL,EAAL,GAAU,IAAV;AACA,SAAKZ,IAAL,GAAY,EAAZ;AACD;;AAEDhB,EAAAA,UAAU,CAAE4G,SAAF,EAAa;AACrB,QAAI,KAAKjH,IAAL,CAAUiH,SAAV,CAAJ,EAA0B;AACxB,UAAI9E,0BAAC,CAAC+E,QAAF,CAAW,KAAKlH,IAAL,CAAUiH,SAAV,CAAX,CAAJ,EAAsC,OAAO3C,IAAI,CAACI,KAAL,CAAW,KAAK1E,IAAL,CAAUiH,SAAV,CAAX,CAAP,CAAtC,KACK,OAAO,KAAKjH,IAAL,CAAUiH,SAAV,CAAP;AACN;;AACD,WAAO,EAAP;AACD;;AAEDf,EAAAA,QAAQ,CAAEiB,OAAF,EAAW;AACjB,QAAI,KAAKnH,IAAL,CAAUmH,OAAV,CAAJ,EAAwB;AACtB,UAAIhF,0BAAC,CAAC+E,QAAF,CAAW,KAAKlH,IAAL,CAAUmH,OAAV,CAAX,CAAJ,EAAoC,OAAO7C,IAAI,CAACI,KAAL,CAAW,KAAK1E,IAAL,CAAUmH,OAAV,CAAX,CAAP,CAApC,KACK,OAAO,KAAKnH,IAAL,CAAUmH,OAAV,CAAP;AACN;;AACD,WAAO,IAAP;AACD;;AAED1G,EAAAA,WAAW,CAAE2G,UAAF,EAAc;AACvB,QAAI,KAAKpH,IAAL,CAAUoH,UAAV,CAAJ,EAA2B;AACzB,UAAIjF,0BAAC,CAAC+E,QAAF,CAAW,KAAKlH,IAAL,CAAUoH,UAAV,CAAX,CAAJ,EAAuC,OAAO9C,IAAI,CAACI,KAAL,CAAW,KAAK1E,IAAL,CAAUoH,UAAV,CAAX,CAAP,CAAvC,KACK,OAAO,KAAKpH,IAAL,CAAUoH,UAAV,CAAP;AACN;;AACD,WAAO,EAAP;AACD;;AAEDxG,EAAAA,YAAY,CAAEyG,OAAF,EAAWC,MAAX,EAAmB;AAC7B,WAAOD,OAAO,CAACE,MAAR,CAAe,CAAf,EAAkBF,OAAO,CAACG,OAAR,CAAgB,GAAhB,EAAqB,CAArB,CAAlB,IAA6CF,MAApD;AACD;;AAEDxG,EAAAA,wBAAwB,CAAEJ,IAAF,EAAQ;AAC9B,QAAIA,IAAJ,EAAU;AACR,UAAIyB,0BAAC,CAACoE,QAAF,CAAW7F,IAAX,CAAJ,EAAsB;AACpB,YAAI;AACFA,UAAAA,IAAI,GAAGA,IAAI,CAACgG,QAAL,EAAP;AACD,SAFD,CAEE,OAAO1F,GAAP,EAAY;AAEf;;AACD,aAAOmB,0BAAC,CAACsF,QAAF,CAAWtF,0BAAC,CAAC+E,QAAF,CAAWxG,IAAX,IAAmBA,IAAnB,GAA0B4D,IAAI,CAACC,SAAL,CAAe7D,IAAf,CAArC,EAA2D;AAAEmF,QAAAA,MAAM,EAAE;AAAV,OAA3D,CAAP;AACD,KARD,MAQO;AACL,aAAO,EAAP;AACD;AACF;;AAED5E,EAAAA,kBAAkB,CAAED,GAAF,EAAO;AACvB,QAAIA,GAAG,IAAIA,GAAG,CAAC0G,QAAf,EAAyB;AACvB,aAAQ,WAAU1G,GAAG,CAAC0G,QAAJ,CAAa7G,MAAO,gBAAe,KAAKC,wBAAL,CAA8BE,GAAG,CAAC0G,QAAJ,CAAahH,IAA3C,CAAiD,EAAtG;AACD,KAFD,MAEO;AACL,aAAOM,GAAG,CAACwD,OAAX;AACD;AACF;;AA7SuB;;AAgT1B,aAAc,GAAG5E,mBAAjB;;uBC5Vc,GAAG;AACf+H,EAAAA,aAAa,EAAE,CADA;AAEfC,EAAAA,WAAW,EAAEhI,SAFE;AAGfiI,EAAAA,UAAU,EAAE;AACV7C,IAAAA,IAAI,EAAE,eADI;AAEV8C,IAAAA,QAAQ,EAAE,QAFA;AAGVC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,UAAU,EAAE;AADJ,KAHA;AAMVC,IAAAA,YAAY,EAAE,CACZ;AACEjD,MAAAA,IAAI,EAAE,UADR;AAEEkD,MAAAA,KAAK,EAAE,4BAFT;AAGEtD,MAAAA,IAAI,EAAE,0BAHR;AAIEuD,MAAAA,QAAQ,EAAE;AAJZ,KADY,EAOZ;AACEnD,MAAAA,IAAI,EAAE,UADR;AAEEkD,MAAAA,KAAK,EAAE,0BAFT;AAGEtD,MAAAA,IAAI,EAAE,wBAHR;AAIEuD,MAAAA,QAAQ,EAAE;AAJZ,KAPY;AANJ;AAHG;;;;;;;;;;"}
@@ -152,7 +152,7 @@ class BotiumConnectorVoip {
152
152
  debug(request);
153
153
  this.ws.send(JSON.stringify(request));
154
154
  });
155
- this.ws.on('close', () => {
155
+ this.ws.on('close', async () => {
156
156
  debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`);
157
157
  });
158
158
  this.ws.on('error', err => {
@@ -171,14 +171,27 @@ class BotiumConnectorVoip {
171
171
  this.sessionId = parsedData.voipConfig.sessionId;
172
172
  }
173
173
 
174
+ if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'unauthorized') {
175
+ reject(new Error('Cannot open a call: SIP Authorization failed'));
176
+ }
177
+
178
+ if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {
179
+ reject(new Error('Cannot connect to VOIP Worker because of wrong API key'));
180
+ }
181
+
174
182
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {
175
- reject(new Error('Cannot connect to VOIP Worker because of wrong APi key'));
183
+ debug('error');
184
+ reject(new Error('Cannot connect to VOIP Worker because of wrong API key'));
176
185
  }
177
186
 
178
187
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {
179
188
  resolve();
180
189
  }
181
190
 
191
+ if (parsedData && parsedData.type === 'error') {
192
+ reject(new Error(parsedData.message));
193
+ }
194
+
182
195
  if (parsedData && parsedData.type === 'fullRecord') {
183
196
  this.end = true;
184
197
  this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {
@@ -254,20 +267,17 @@ class BotiumConnectorVoip {
254
267
  }
255
268
 
256
269
  if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {
257
- msg.userInputs.forEach((userInput, index) => {
258
- const request = JSON.stringify({
259
- METHOD: 'sendAudio',
260
- PESQ: userInput.args.filter(a => a.includes(';PESQ')).length > 0,
261
- sessionId: this.sessionId,
262
- b64_buffer: msg.media[index].buffer.toString('base64')
263
- });
264
- msg.attachments.push({
265
- name: msg.media[index].mediaUri,
266
- mimeType: msg.media[index].mimeType,
267
- base64: msg.media[index].buffer.toString('base64')
268
- });
269
- this.ws.send(request);
270
+ const request = JSON.stringify({
271
+ METHOD: 'sendAudio',
272
+ sessionId: this.sessionId,
273
+ b64_buffer: msg.media[0].buffer.toString('base64')
270
274
  });
275
+ msg.attachments.push({
276
+ name: msg.media[0].mediaUri,
277
+ mimeType: msg.media[0].mimeType,
278
+ base64: msg.media[0].buffer.toString('base64')
279
+ });
280
+ this.ws.send(request);
271
281
  }
272
282
  }, 500);
273
283
  }
@@ -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_HEADERS: 'VOIP_STT_HEADERS',\n VOIP_STT_TIMEOUT: 'VOIP_STT_TIMEOUT',\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}\n\nclass BotiumConnectorVoip {\n constructor ({ queueBotSays, eventEmitter, caps }) {\n this.queueBotSays = queueBotSays\n this.caps = caps\n this.eventEmitter = eventEmitter\n }\n\n async Validate () {\n debug('Validate called')\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 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(request)\n this.ws.send(JSON.stringify(request))\n })\n this.ws.on('close', () => {\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 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 const botMsgs = []\n\n debug(parsedData)\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 === 'forbidden') {\n reject(new Error('Cannot connect to VOIP Worker because of wrong APi key'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {\n resolve()\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 }\n\n if (parsedData && parsedData.data && parsedData.data.final) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n botMsgs.push(botMsg)\n }\n\n botMsgs.forEach(botMsg => setTimeout(() => this.queueBotSays(botMsg), 0))\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 setTimeout(async () => {\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) throw new Error('TTS not configured, only audio input supported')\n\n const ttsRequest = {\n ...this.axiosTtsParams,\n params: {\n ...(this.axiosTtsParams.params || {}),\n text: msg.messageText\n },\n data: this._getBody(Capabilities.BSP_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 throw new Error(`TTS \"${msg.messageText}\" failed - ${this._getAxiosErrOutput(err)}`)\n }\n if (Buffer.isBuffer(ttsResponse.data)) {\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 throw new Error(`TTS failed, response is: ${this._getAxiosShortenedOutput(ttsResponse.data)}`)\n }\n }\n if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {\n msg.userInputs.forEach((userInput, index) => {\n const request = JSON.stringify({\n METHOD: 'sendAudio',\n PESQ: userInput.args.filter(a => a.includes(';PESQ')).length > 0,\n sessionId: this.sessionId,\n b64_buffer: msg.media[index].buffer.toString('base64')\n })\n msg.attachments.push({\n name: msg.media[index].mediaUri,\n mimeType: msg.media[index].mimeType,\n base64: msg.media[index].buffer.toString('base64')\n })\n this.ws.send(request)\n })\n }\n }, 500)\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\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 },\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_HEADERS","VOIP_STT_TIMEOUT","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","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","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","send","JSON","stringify","message","parsedData","parse","botMsgs","type","sessionId","voipConfig","emit","name","mimeType","base64","final","botMsg","messageText","sourceData","push","forEach","setTimeout","UserSays","attachments","buttons","length","digits","payload","ttsRequest","text","_getBody","BSP_TTS_BODY","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","toString","media","buffer","userInputs","userInput","index","args","filter","a","includes","mediaUri","Stop","setInterval","close","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","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')\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_HEADERS: 'VOIP_STT_HEADERS',\n VOIP_STT_TIMEOUT: 'VOIP_STT_TIMEOUT',\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}\n\nclass BotiumConnectorVoip {\n constructor ({ queueBotSays, eventEmitter, caps }) {\n this.queueBotSays = queueBotSays\n this.caps = caps\n this.eventEmitter = eventEmitter\n }\n\n async Validate () {\n debug('Validate called')\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 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(request)\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 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 const botMsgs = []\n\n debug(parsedData)\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('Cannot open a call: SIP Authorization failed'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {\n reject(new Error('Cannot connect to VOIP Worker because of wrong API key'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {\n debug('error')\n reject(new Error('Cannot connect to VOIP Worker because of wrong API key'))\n }\n\n if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {\n resolve()\n }\n\n if (parsedData && parsedData.type === 'error') {\n reject(new 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 }\n\n if (parsedData && parsedData.data && parsedData.data.final) {\n const botMsg = { messageText: parsedData.data.message, sourceData: parsedData }\n botMsgs.push(botMsg)\n }\n\n botMsgs.forEach(botMsg => setTimeout(() => this.queueBotSays(botMsg), 0))\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 setTimeout(async () => {\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) throw new Error('TTS not configured, only audio input supported')\n\n const ttsRequest = {\n ...this.axiosTtsParams,\n params: {\n ...(this.axiosTtsParams.params || {}),\n text: msg.messageText\n },\n data: this._getBody(Capabilities.BSP_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 throw new Error(`TTS \"${msg.messageText}\" failed - ${this._getAxiosErrOutput(err)}`)\n }\n if (Buffer.isBuffer(ttsResponse.data)) {\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 throw new Error(`TTS failed, response is: ${this._getAxiosShortenedOutput(ttsResponse.data)}`)\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 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 }, 500)\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\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 },\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_HEADERS","VOIP_STT_TIMEOUT","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","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","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","send","JSON","stringify","message","parsedData","parse","botMsgs","type","sessionId","voipConfig","emit","name","mimeType","base64","final","botMsg","messageText","sourceData","push","forEach","setTimeout","UserSays","attachments","buttons","length","digits","payload","ttsRequest","text","_getBody","BSP_TTS_BODY","responseType","ttsResponse","Buffer","isBuffer","PESQ","b64_buffer","toString","media","buffer","mediaUri","Stop","setInterval","close","capParams","isString","capBody","capHeaders","baseUrl","extUrl","substr","indexOf","truncate","response","PluginVersion","PluginClass","PluginDesc","provider","features","audioInput","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.1",
3
+ "version": "0.0.2",
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
@@ -145,7 +145,7 @@ class BotiumConnectorVoip {
145
145
  debug(request)
146
146
  this.ws.send(JSON.stringify(request))
147
147
  })
148
- this.ws.on('close', () => {
148
+ this.ws.on('close', async () => {
149
149
  debug(`Websocket connection to ${this.caps[Capabilities.VOIP_WORKER_URL]} closed.`)
150
150
  })
151
151
  this.ws.on('error', (err) => {
@@ -164,14 +164,27 @@ class BotiumConnectorVoip {
164
164
  this.sessionId = parsedData.voipConfig.sessionId
165
165
  }
166
166
 
167
+ if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'unauthorized') {
168
+ reject(new Error('Cannot open a call: SIP Authorization failed'))
169
+ }
170
+
171
+ if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {
172
+ reject(new Error('Cannot connect to VOIP Worker because of wrong API key'))
173
+ }
174
+
167
175
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'forbidden') {
168
- reject(new Error('Cannot connect to VOIP Worker because of wrong APi key'))
176
+ debug('error')
177
+ reject(new Error('Cannot connect to VOIP Worker because of wrong API key'))
169
178
  }
170
179
 
171
180
  if (parsedData && parsedData.type === 'callinfo' && parsedData.status === 'connected') {
172
181
  resolve()
173
182
  }
174
183
 
184
+ if (parsedData && parsedData.type === 'error') {
185
+ reject(new Error(parsedData.message))
186
+ }
187
+
175
188
  if (parsedData && parsedData.type === 'fullRecord') {
176
189
  this.end = true
177
190
  this.eventEmitter.emit('MESSAGE_ATTACHMENT', this.container, {
@@ -245,20 +258,17 @@ class BotiumConnectorVoip {
245
258
  }
246
259
  }
247
260
  if (msg && msg.media && msg.media.length > 0 && msg.media[0].buffer) {
248
- msg.userInputs.forEach((userInput, index) => {
249
- const request = JSON.stringify({
250
- METHOD: 'sendAudio',
251
- PESQ: userInput.args.filter(a => a.includes(';PESQ')).length > 0,
252
- sessionId: this.sessionId,
253
- b64_buffer: msg.media[index].buffer.toString('base64')
254
- })
255
- msg.attachments.push({
256
- name: msg.media[index].mediaUri,
257
- mimeType: msg.media[index].mimeType,
258
- base64: msg.media[index].buffer.toString('base64')
259
- })
260
- this.ws.send(request)
261
+ const request = JSON.stringify({
262
+ METHOD: 'sendAudio',
263
+ sessionId: this.sessionId,
264
+ b64_buffer: msg.media[0].buffer.toString('base64')
261
265
  })
266
+ msg.attachments.push({
267
+ name: msg.media[0].mediaUri,
268
+ mimeType: msg.media[0].mimeType,
269
+ base64: msg.media[0].buffer.toString('base64')
270
+ })
271
+ this.ws.send(request)
262
272
  }
263
273
  }, 500)
264
274
  }