From 54a60e26ced9327e4e89d06d05b3d77c0a670158 Mon Sep 17 00:00:00 2001 From: Quan HL Date: Wed, 2 Oct 2024 12:55:36 +0700 Subject: [PATCH] update pause/resume ongoing transcribe task if re-invite for hold and unhold is received --- lib/session/call-session.js | 45 ++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/session/call-session.js b/lib/session/call-session.js index 1cbd9950..168d9d8e 100644 --- a/lib/session/call-session.js +++ b/lib/session/call-session.js @@ -8,7 +8,8 @@ const { KillReason, RecordState, AllowedSipRecVerbs, - AllowedConfirmSessionVerbs + AllowedConfirmSessionVerbs, + TranscribeStatus } = require('../utils/constants'); const moment = require('moment'); const assert = require('assert'); @@ -29,6 +30,7 @@ const { } = require('../config'); const bent = require('bent'); const BackgroundTaskManager = require('../utils/background-task-manager'); +const { isOnhold } = require('../utils/sdp-utils'); const BADPRECONDITIONS = 'preconditions not met'; const CALLER_CANCELLED_ERR_MSG = 'Response not sent due to unknown transaction'; @@ -1336,6 +1338,40 @@ class CallSession extends Emitter { listenTask.updateListen(opts.listen_status); } + // Jambonz only update transcribe task when receive RE-INVITE: + // 1. Pause transcribe task if it's running and hold RE-INVITE is received + // 2. Resume transcribe task if it was paused by jambonz due to hold and unhold RE-INVITE is received + async pauseOrResumeTranscribeTaskByReInvite(req) { + const task = this.currentTask; + const transcribeTasks = []; + // Gather running transcribe tasks + if (this.backgroundTaskManager.isTaskRunning('transcribe')) { + transcribeTasks.push(this.backgroundTaskManager.getTask('transcribe')); + } + + // Include current task if it is transcribe-related + if (task && [TaskName.Dial, TaskName.Transcribe].includes(task.name)) { + const transcribeTask = task.name === TaskName.Transcribe ? task : task.transcribeTask; + if (transcribeTask) transcribeTasks.push(transcribeTask); + } + + const isHold = isOnhold(req.body); + const opts = { + transcribe_status: isHold ? TranscribeStatus.Pause : TranscribeStatus.Resume + }; + transcribeTasks.forEach((t) => { + if (isHold && !t.paused) { + t.updateTranscribe(opts); + t.pausedByHold = true; + } else if (!isHold && t.pausedByHold) { + if (t.paused) { + t.updateTranscribe(opts); + } + t.pausedByHold = false; + } + }); + } + /** * perform live call control -- change Transcribe status * @param {object} opts @@ -2241,6 +2277,13 @@ Duration=${duration} ` this.logger.info('got reINVITE but no endpoint and media has not been released'); res.send(488); } + + // if there + const opts = { + transcribe_status: isOnhold(req.body) ? TranscribeStatus.Pause : TranscribeStatus.Resume + }; + this.logger.info('Transcribe is'); + this._lccTranscribeStatus(opts); } catch (err) { this.logger.error(err, 'Error handling reinvite'); }