From c0a29c7a64fd8c60bd7cc899717aaa44996ec3cd Mon Sep 17 00:00:00 2001 From: Dave Horton Date: Wed, 23 Jun 2021 11:14:19 -0400 Subject: [PATCH] bugfix: if enqeue task is killed because it is being replaced with new app supplied by LCC, ignore any app returned from the actionHook as LCC takes precedence --- lib/session/call-session.js | 8 ++++---- lib/tasks/enqueue.js | 40 ++++++++++++++++++++----------------- lib/utils/constants.json | 4 ++++ 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/lib/session/call-session.js b/lib/session/call-session.js index 09000e0a..4d1861be 100644 --- a/lib/session/call-session.js +++ b/lib/session/call-session.js @@ -1,6 +1,6 @@ const Emitter = require('events'); const fs = require('fs'); -const {CallDirection, TaskPreconditions, CallStatus, TaskName} = require('../utils/constants'); +const {CallDirection, TaskPreconditions, CallStatus, TaskName, KillReason} = require('../utils/constants'); const moment = require('moment'); const assert = require('assert'); const sessionTracker = require('./session-tracker'); @@ -351,7 +351,7 @@ class CallSession extends Emitter { } else { /* we started a new app on the child leg, but nothing given for parent so hang him up */ - this.currentTask.kill(); + this.currentTask.kill(this); } } @@ -488,7 +488,7 @@ class CallSession extends Emitter { this.logger.info({tasks: listTaskNames(tasks)}, `CallSession:replaceApplication reset with ${tasks.length} new tasks, stack depth is ${this.stackIdx}`); if (this.currentTask) { - this.currentTask.kill(); + this.currentTask.kill(this, KillReason.Replaced); this.currentTask = null; } } @@ -497,7 +497,7 @@ class CallSession extends Emitter { if (this.isConfirmCallSession) this.logger.debug('CallSession:kill (ConfirmSession)'); else this.logger.info('CallSession:kill'); if (this.currentTask) { - this.currentTask.kill(); + this.currentTask.kill(this); this.currentTask = null; } this.tasks = []; diff --git a/lib/tasks/enqueue.js b/lib/tasks/enqueue.js index 120ce73f..0bb04e0e 100644 --- a/lib/tasks/enqueue.js +++ b/lib/tasks/enqueue.js @@ -3,7 +3,7 @@ const Emitter = require('events'); const ConfirmCallSession = require('../session/confirm-call-session'); const normalizeJambones = require('../utils/normalize-jambones'); const makeTask = require('./make_task'); -const {TaskName, TaskPreconditions, QueueResults} = require('../utils/constants'); +const {TaskName, TaskPreconditions, QueueResults, KillReason} = require('../utils/constants'); const bent = require('bent'); const assert = require('assert'); @@ -61,10 +61,10 @@ class TaskEnqueue extends Task { } } - async kill(cs) { + async kill(cs, reason) { super.kill(cs); this.logger.info(`TaskEnqueue:kill ${this.queueName}`); - this.emitter.emit('kill'); + this.emitter.emit('kill', reason || KillReason.Hangup); this.notifyTaskDone(); } @@ -98,7 +98,7 @@ class TaskEnqueue extends Task { queueTime: getElapsedTime(this.waitStartTime), queueResult: this.state }; - await super.performAction(params); + await super.performAction(params, this.killReason !== KillReason.Replaced); } /** @@ -119,18 +119,20 @@ class TaskEnqueue extends Task { resolve(this._doBridge(cs, dlg, ep)); }) .once('kill', async() => { - try { - const members = await this._removeFromQueue(cs); - /* invoke account-level webhook for queue event notifications */ - cs.performQueueWebhook({ - event: 'leave', - queue: this.data.name, - length: members, - leaveReason: 'abandoned', - leaveTime: Date.now() - }); - } catch (err) {} + /* invoke account-level webhook for queue event notifications */ + if (!this.dequeued) { + try { + const members = await this._removeFromQueue(cs); + cs.performQueueWebhook({ + event: 'leave', + queue: this.data.name, + length: members, + leaveReason: 'abandoned', + leaveTime: Date.now() + }); + } catch (err) {} + } if (this._playSession) { this.logger.debug('killing waitUrl'); @@ -236,8 +238,9 @@ class TaskEnqueue extends Task { ep.unbridge().catch((err) => {}); resolve(); }) - .on('kill', () => { - this.logger.info('TaskEnqueue:_bridgeLocal ending with hangup from enqeue party'); + .on('kill', (reason) => { + this.killReason = reason; + this.logger.info(`TaskEnqueue:_bridgeLocal ending with ${this.killReason}`); ep.unbridge().catch((err) => {}); // notify partner that we dropped @@ -273,7 +276,8 @@ class TaskEnqueue extends Task { try { const {lengthOfList} = cs.srf.locals.dbHelpers; const members = await lengthOfList(this.queueName); - + this.dequeued = true; + cs.performQueueWebhook({ event: 'leave', queue: this.data.name, diff --git a/lib/utils/constants.json b/lib/utils/constants.json index 06d5cded..4961d9ea 100644 --- a/lib/utils/constants.json +++ b/lib/utils/constants.json @@ -92,6 +92,10 @@ "Hangup": "hangup", "Timeout": "timeout" }, + "KillReason": { + "Hangup": "hangup", + "Replaced": "replaced" + }, "MAX_SIMRINGS": 10, "BONG_TONE": "tone_stream://v=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)" }