mirror of
https://github.com/jambonz/jambonz-feature-server.git
synced 2025-12-20 08:40:38 +00:00
Feat 1179 race issue with play verb (#1183)
* Fixed race issue between queueCommand false and queueCommand true when play task is involved https://github.com/jambonz/jambonz-feature-server/issues/1179 * removed unnecessary emitter * added destroy mechanism for stickyEventEmitter * clearing stickyEventEmitter * memory leak fix
This commit is contained in:
@@ -23,6 +23,7 @@ const HttpRequestor = require('../utils/http-requestor');
|
||||
const WsRequestor = require('../utils/ws-requestor');
|
||||
const ActionHookDelayProcessor = require('../utils/action-hook-delay');
|
||||
const TtsStreamingBuffer = require('../utils/tts-streaming-buffer');
|
||||
const StickyEventEmitter = require('../utils/sticky-event-emitter');
|
||||
const {parseUri} = require('drachtio-srf');
|
||||
const {
|
||||
JAMBONES_INJECT_CONTENT,
|
||||
@@ -79,6 +80,10 @@ class CallSession extends Emitter {
|
||||
this.callGone = false;
|
||||
this.notifiedComplete = false;
|
||||
this.rootSpan = rootSpan;
|
||||
this.stickyEventEmitter = new StickyEventEmitter();
|
||||
this.stickyEventEmitter.onSuccess =() => {
|
||||
this.taskInProgress = null;
|
||||
};
|
||||
this.backgroundTaskManager = new BackgroundTaskManager({
|
||||
cs: this,
|
||||
logger,
|
||||
@@ -1180,7 +1185,9 @@ class CallSession extends Emitter {
|
||||
const taskNum = ++this.taskIdx;
|
||||
const stackNum = this.stackIdx;
|
||||
const task = this.tasks.shift();
|
||||
this.logger.info(`CallSession:exec starting task #${stackNum}:${taskNum}: ${task.name}`);
|
||||
this.isCurTaskPlay = TaskName.Play === task.name;
|
||||
this.taskInProgress = task;
|
||||
this.logger.info(`CallSession:exec starting task #${stackNum}:${taskNum}: ${task.name} : {task.taskId}`);
|
||||
this._notifyTaskStatus(task, {event: 'starting'});
|
||||
// Register verbhook span wait for end
|
||||
task.on('VerbHookSpanWaitForEnd', ({span}) => {
|
||||
@@ -1919,6 +1926,8 @@ Duration=${duration} `
|
||||
this.logger.debug({tasks: listTaskNames(tasks)},
|
||||
`CallSession:replaceApplication reset with ${tasks.length} new tasks, stack depth is ${this.stackIdx}`);
|
||||
if (this.currentTask) {
|
||||
this.logger.debug('CallSession:replaceApplication - killing current task ' +
|
||||
this.currentTask?.name + ', taskId: ' + this.currentTask.taskId);
|
||||
this.currentTask.kill(this, KillReason.Replaced);
|
||||
this.currentTask = null;
|
||||
}
|
||||
@@ -1927,6 +1936,10 @@ Duration=${duration} `
|
||||
this.wakeupResolver({reason: 'new tasks'});
|
||||
this.wakeupResolver = null;
|
||||
}
|
||||
if ((!this.currentTask || this.currentTask === undefined) && this.isCurTaskPlay) {
|
||||
this.logger.debug(`CallSession:replaceApplication - emitting uuid_break, taskId: ${this.taskInProgress?.taskId}`);
|
||||
this.stickyEventEmitter.emit('uuid_break', this.taskInProgress);
|
||||
}
|
||||
}
|
||||
|
||||
kill(onBackgroundGatherBargein = false) {
|
||||
@@ -2387,6 +2400,9 @@ Duration=${duration} `
|
||||
* Hang up the call and free the media endpoint
|
||||
*/
|
||||
async _clearResources() {
|
||||
this.stickyEventEmitter.destroy();
|
||||
this.stickyEventEmitter = null;
|
||||
this.taskInProgress = null;
|
||||
for (const resource of [this.dlg, this.ep, this.ep2]) {
|
||||
try {
|
||||
if (resource && resource.connected) await resource.destroy();
|
||||
|
||||
Reference in New Issue
Block a user