mirror of
https://github.com/jambonz/jambonz-feature-server.git
synced 2025-12-20 08:40:38 +00:00
more queue fixes
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
const Task = require('./task');
|
||||
const {TaskName, TaskPreconditions, DequeueResults} = require('../utils/constants');
|
||||
const {TaskName, TaskPreconditions, DequeueResults, BONG_TONE} = require('../utils/constants');
|
||||
const Emitter = require('events');
|
||||
const bent = require('bent');
|
||||
const assert = require('assert');
|
||||
@@ -15,6 +15,7 @@ class TaskDequeue extends Task {
|
||||
|
||||
this.queueName = this.data.name;
|
||||
this.timeout = this.data.timeout || 0;
|
||||
this.beep = this.data.beep === true;
|
||||
|
||||
this.emitter = new Emitter();
|
||||
this.state = DequeueResults.Timeout;
|
||||
@@ -24,6 +25,7 @@ class TaskDequeue extends Task {
|
||||
|
||||
async exec(cs, ep) {
|
||||
await super.exec(cs);
|
||||
this.ep = ep;
|
||||
this.queueName = `queue:${cs.accountSid}:${this.queueName}`;
|
||||
|
||||
const url = await this._getMemberFromQueue(cs);
|
||||
@@ -64,12 +66,15 @@ class TaskDequeue extends Task {
|
||||
}, this.timeout * 1000);
|
||||
}
|
||||
|
||||
await sleepFor(1000); // to avoid clipping if we dial and immediately connect
|
||||
|
||||
do {
|
||||
try {
|
||||
const url = await popFront(this.queueName);
|
||||
if (url) {
|
||||
found = true;
|
||||
clearTimeout(timer);
|
||||
this.logger.info(`TaskDequeue:_getMemberFromQueue popped ${url} from queue ${this.queueName}`);
|
||||
resolve(url);
|
||||
}
|
||||
} catch (err) {
|
||||
@@ -100,12 +105,14 @@ class TaskDequeue extends Task {
|
||||
|
||||
// now notify partner to bridge to me
|
||||
try {
|
||||
// TODO: if we have a confirmHook, retrieve the app and pass it on
|
||||
await bent('POST', 202)(url, {
|
||||
event: 'dequeue',
|
||||
dequeueSipAddress: cs.srf.locals.localSipAddress,
|
||||
epUuid: ep.uuid,
|
||||
notifyUrl: getUrl(cs)
|
||||
});
|
||||
this.logger.info(`TaskDequeue:_dequeueUrl successfully sent POST to ${url}`);
|
||||
bridgeTimer = setTimeout(() => reject(new Error('bridge timeout')), 20000);
|
||||
} catch (err) {
|
||||
this.logger.info({err, url}, `TaskDequeue:_dequeueUrl error dequeueing from ${this.queueName}, try again`);
|
||||
@@ -114,12 +121,21 @@ class TaskDequeue extends Task {
|
||||
});
|
||||
}
|
||||
|
||||
notifyQueueEvent(cs, opts) {
|
||||
if (opts.event === 'bridged') {
|
||||
assert(opts.notifyUrl);
|
||||
this.logger.info({opts}, `TaskDequeue:notifyDequeueEvent: successfully bridged to member from ${this.queueName}`);
|
||||
async notifyQueueEvent(cs, opts) {
|
||||
if (opts.event === 'ready') {
|
||||
assert(opts.notifyUrl && opts.epUuid);
|
||||
this.partnerUrl = opts.notifyUrl;
|
||||
this.logger.info({opts}, `TaskDequeue:notifyDequeueEvent: about to bridge member from ${this.queueName}`);
|
||||
|
||||
if (this.beep) {
|
||||
this.logger.debug({opts}, `TaskDequeue:notifyDequeueEvent: playing beep tone ${this.queueName}`);
|
||||
await this.ep.play(BONG_TONE).catch((err) => {
|
||||
this.logger.error(err, 'TaskDequeue:notifyDequeueEvent error playing beep');
|
||||
});
|
||||
}
|
||||
await this.ep.bridge(opts.epUuid);
|
||||
this.emitter.emit('bridged');
|
||||
this.logger.info({opts}, `TaskDequeue:notifyDequeueEvent: successfully bridged member from ${this.queueName}`);
|
||||
}
|
||||
else if (opts.event === 'hangup') {
|
||||
this.emitter.emit('hangup');
|
||||
|
||||
Reference in New Issue
Block a user