diff --git a/lib/tasks/say.js b/lib/tasks/say.js index dc25245c..7e95f77b 100644 --- a/lib/tasks/say.js +++ b/lib/tasks/say.js @@ -51,6 +51,7 @@ class TaskSay extends Task { alert_type: AlertType.TTS_NOT_PROVISIONED, vendor }).catch((err) => this.logger.info({err}, 'Error generating alert for no tts')); + this.notifyError(`No speech credentials have been provisioned for ${vendor}`); throw new Error('no provisioned speech credentials for TTS'); } // synthesize all of the text elements @@ -96,6 +97,7 @@ class TaskSay extends Task { vendor, detail: err.message }).catch((err) => this.logger.info({err}, 'Error generating alert for tts failure')); + this.notifyError(err.message || err); return; } }; diff --git a/lib/tasks/task.js b/lib/tasks/task.js index ebe8d087..4bcabcfc 100644 --- a/lib/tasks/task.js +++ b/lib/tasks/task.js @@ -137,6 +137,12 @@ class Task extends Emitter { return this.callSession.normalizeUrl(url, method, auth); } + notifyError(errMsg) { + const params = {error: errMsg, ...this.cs.callInfo.toJSON()}; + this.cs.requestor.request('jambonz:error', '/error', params) + .catch((err) => this.logger.info({err}, 'Task:notifyError error sending error')); + } + async performAction(results, expectResponse = true) { if (this.actionHook) { const params = results ? Object.assign(results, this.cs.callInfo.toJSON()) : this.cs.callInfo.toJSON(); diff --git a/lib/utils/http-requestor.js b/lib/utils/http-requestor.js index 50ab80d4..805c2093 100644 --- a/lib/utils/http-requestor.js +++ b/lib/utils/http-requestor.js @@ -50,7 +50,11 @@ class HttpRequestor extends BaseRequestor { * @param {object} [params] - request parameters */ async request(type, hook, params, httpHeaders = {}) { + /* jambonz:error only sent over ws */ + if (type === 'jambonz:error') return; + assert(HookMsgTypes.includes(type)); + const payload = params ? snakeCaseKeys(params, ['customerData', 'sip']) : null; const url = hook.url || hook; const method = hook.method || 'POST';