mirror of
https://github.com/jambonz/jambonz-feature-server.git
synced 2025-12-20 16:50:39 +00:00
feat: play verb support seekOffset and actionHook (#160)
* feat: play verb support seekOffset and actionHook * add testcase * fix: testcase
This commit is contained in:
@@ -7,6 +7,8 @@ class TaskPlay extends Task {
|
|||||||
this.preconditions = TaskPreconditions.Endpoint;
|
this.preconditions = TaskPreconditions.Endpoint;
|
||||||
|
|
||||||
this.url = this.data.url;
|
this.url = this.data.url;
|
||||||
|
this.seekOffset = this.data.seekOffset || -1;
|
||||||
|
this.timeoutSecs = this.data.timeoutSecs || -1;
|
||||||
this.loop = this.data.loop || 1;
|
this.loop = this.data.loop || 1;
|
||||||
this.earlyMedia = this.data.earlyMedia === true;
|
this.earlyMedia = this.data.earlyMedia === true;
|
||||||
}
|
}
|
||||||
@@ -31,8 +33,13 @@ class TaskPlay extends Task {
|
|||||||
} else {
|
} else {
|
||||||
await this.playToConfMember(this.ep, memberId, confName, confUuid, this.url);
|
await this.playToConfMember(this.ep, memberId, confName, confUuid, this.url);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
const file = (this.timeoutSecs >= 0 || this.seekOffset >= 0) ?
|
||||||
|
{file: this.url, seekOffset: this.seekOffset, timeoutSecs: this.timeoutSecs} : this.url;
|
||||||
|
const result = await ep.play(file);
|
||||||
|
await this.performAction(Object.assign(result, {reason: 'playCompleted'}),
|
||||||
|
!(this.parentTask || cs.isConfirmCallSession));
|
||||||
}
|
}
|
||||||
else await ep.play(this.url);
|
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logger.info(err, `TaskPlay:exec - error playing ${this.url}`);
|
this.logger.info(err, `TaskPlay:exec - error playing ${this.url}`);
|
||||||
|
|||||||
@@ -98,7 +98,10 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"url": "string|array",
|
"url": "string|array",
|
||||||
"loop": "number|string",
|
"loop": "number|string",
|
||||||
"earlyMedia": "boolean"
|
"earlyMedia": "boolean",
|
||||||
|
"seekOffset": "number|string",
|
||||||
|
"timeoutSecs": "number|string",
|
||||||
|
"actionHook": "object|string"
|
||||||
},
|
},
|
||||||
"required": [
|
"required": [
|
||||||
"url"
|
"url"
|
||||||
|
|||||||
14
package-lock.json
generated
14
package-lock.json
generated
@@ -27,7 +27,7 @@
|
|||||||
"bent": "^7.3.12",
|
"bent": "^7.3.12",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"deepcopy": "^2.1.0",
|
"deepcopy": "^2.1.0",
|
||||||
"drachtio-fsmrf": "^3.0.2",
|
"drachtio-fsmrf": "^3.0.3",
|
||||||
"drachtio-srf": "^4.5.1",
|
"drachtio-srf": "^4.5.1",
|
||||||
"express": "^4.18.1",
|
"express": "^4.18.1",
|
||||||
"helmet": "^5.1.0",
|
"helmet": "^5.1.0",
|
||||||
@@ -1992,9 +1992,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/drachtio-fsmrf": {
|
"node_modules/drachtio-fsmrf": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/drachtio-fsmrf/-/drachtio-fsmrf-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/drachtio-fsmrf/-/drachtio-fsmrf-3.0.3.tgz",
|
||||||
"integrity": "sha512-Daub8hXFVNr8OTc7HnkdusNFjpgBavLYr+0TVTu9q5eemum7lgmnrCY3qKfSnPDEb24TpLbZarFa4NWPFYoqNQ==",
|
"integrity": "sha512-RJpGS+lX3Cmqd725zJGf1KvONH38/9YDHkPxXevmiVBp+iD/EbRps/ze5wpE0MKbjEA93DOmiXGTWqsOChWttw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"camel-case": "^4.1.2",
|
"camel-case": "^4.1.2",
|
||||||
"debug": "^2.6.9",
|
"debug": "^2.6.9",
|
||||||
@@ -7791,9 +7791,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"drachtio-fsmrf": {
|
"drachtio-fsmrf": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/drachtio-fsmrf/-/drachtio-fsmrf-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/drachtio-fsmrf/-/drachtio-fsmrf-3.0.3.tgz",
|
||||||
"integrity": "sha512-Daub8hXFVNr8OTc7HnkdusNFjpgBavLYr+0TVTu9q5eemum7lgmnrCY3qKfSnPDEb24TpLbZarFa4NWPFYoqNQ==",
|
"integrity": "sha512-RJpGS+lX3Cmqd725zJGf1KvONH38/9YDHkPxXevmiVBp+iD/EbRps/ze5wpE0MKbjEA93DOmiXGTWqsOChWttw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"camel-case": "^4.1.2",
|
"camel-case": "^4.1.2",
|
||||||
"debug": "^2.6.9",
|
"debug": "^2.6.9",
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
"bent": "^7.3.12",
|
"bent": "^7.3.12",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"deepcopy": "^2.1.0",
|
"deepcopy": "^2.1.0",
|
||||||
"drachtio-fsmrf": "^3.0.2",
|
"drachtio-fsmrf": "^3.0.3",
|
||||||
"drachtio-srf": "^4.5.1",
|
"drachtio-srf": "^4.5.1",
|
||||||
"express": "^4.18.1",
|
"express": "^4.18.1",
|
||||||
"helmet": "^5.1.0",
|
"helmet": "^5.1.0",
|
||||||
|
|||||||
@@ -156,3 +156,43 @@ test('\'play\' tests multi links in array in conference', async(t) => {
|
|||||||
t.error(err);
|
t.error(err);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('\'play\' tests with seekOffset and actionHook', async(t) => {
|
||||||
|
clearModule.all();
|
||||||
|
const {srf, disconnect} = require('../app');
|
||||||
|
|
||||||
|
try {
|
||||||
|
await connect(srf);
|
||||||
|
|
||||||
|
// GIVEN
|
||||||
|
const verbs = [
|
||||||
|
{
|
||||||
|
verb: 'play',
|
||||||
|
url: 'silence_stream://5000',
|
||||||
|
seekOffset: 8000,
|
||||||
|
timeoutSecs: 2,
|
||||||
|
actionHook: '/customHook'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const waitHookVerbs = [];
|
||||||
|
|
||||||
|
const from = 'play_action_hook';
|
||||||
|
provisionCallHook(from, verbs)
|
||||||
|
provisionCustomHook(from, waitHookVerbs)
|
||||||
|
|
||||||
|
// THEN
|
||||||
|
await sippUac('uac-success-received-bye.xml', '172.38.0.10', from);
|
||||||
|
t.pass('play: succeeds');
|
||||||
|
const obj = await getJSON(`http:127.0.0.1:3100/lastRequest/${from}_customHook`)
|
||||||
|
t.ok(obj.body.reason === "playCompleted", "play: actionHook success received")
|
||||||
|
t.ok(obj.body.playback_seconds === "2", "playback_seconds: actionHook success received")
|
||||||
|
t.ok(obj.body.playback_milliseconds === "2048", "playback_milliseconds: actionHook success received")
|
||||||
|
t.ok(obj.body.playback_last_offset_pos === "16000", "playback_last_offset_pos: actionHook success received")
|
||||||
|
disconnect();
|
||||||
|
} catch (err) {
|
||||||
|
console.log(`error received: ${err}`);
|
||||||
|
disconnect();
|
||||||
|
t.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user