mirror of
https://github.com/jambonz/jambonz-feature-server.git
synced 2026-02-13 09:49:30 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e7c8f207a | ||
|
|
3397e1cab5 | ||
|
|
e7dbfe755d | ||
|
|
e2ad0dca0e | ||
|
|
e2c99609bf | ||
|
|
4d54aa2666 | ||
|
|
a076fc43b5 | ||
|
|
8592a71978 | ||
|
|
00462b2fd9 | ||
|
|
7c85d6aeca | ||
|
|
cc87b205a2 | ||
|
|
fff556a6c8 | ||
|
|
bb4ca8e467 | ||
|
|
46302703da | ||
|
|
c728417581 | ||
|
|
8853f84f01 | ||
|
|
665d26b6fb | ||
|
|
d69c773de0 |
8
.github/workflows/build.yml
vendored
8
.github/workflows/build.yml
vendored
@@ -5,12 +5,12 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v1
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: lts/*
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: npm run jslint
|
- run: npm run jslint
|
||||||
- run: docker pull drachtio/sipp
|
- run: docker pull drachtio/sipp
|
||||||
|
|||||||
2
.github/workflows/docker-publish.yml
vendored
2
.github/workflows/docker-publish.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
if: github.event_name == 'push'
|
if: github.event_name == 'push'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Build image
|
- name: Build image
|
||||||
run: docker build . --file Dockerfile --tag $IMAGE_NAME
|
run: docker build . --file Dockerfile --tag $IMAGE_NAME
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ const makeTask = require('../../tasks/make_task');
|
|||||||
const RestCallSession = require('../../session/rest-call-session');
|
const RestCallSession = require('../../session/rest-call-session');
|
||||||
const CallInfo = require('../../session/call-info');
|
const CallInfo = require('../../session/call-info');
|
||||||
const {CallDirection, CallStatus} = require('../../utils/constants');
|
const {CallDirection, CallStatus} = require('../../utils/constants');
|
||||||
const { v4: uuidv4 } = require('uuid');
|
const uuidv4 = require('uuid-random');
|
||||||
const SipError = require('drachtio-srf').SipError;
|
const SipError = require('drachtio-srf').SipError;
|
||||||
const sysError = require('./error');
|
const sysError = require('./error');
|
||||||
const HttpRequestor = require('../../utils/http-requestor');
|
const HttpRequestor = require('../../utils/http-requestor');
|
||||||
@@ -136,7 +136,7 @@ router.post('/', async(req, res) => {
|
|||||||
}
|
}
|
||||||
else if (!app.notifier) {
|
else if (!app.notifier) {
|
||||||
logger.debug('creating null call status hook');
|
logger.debug('creating null call status hook');
|
||||||
app.notifier = {request: () => {}};
|
app.notifier = {request: () => {}, close: () => {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now launch the outdial */
|
/* now launch the outdial */
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ router.post('/:partner', async(req, res) => {
|
|||||||
carrier: req.params.partner,
|
carrier: req.params.partner,
|
||||||
messageSid: app.messageSid,
|
messageSid: app.messageSid,
|
||||||
accountSid: app.accountSid,
|
accountSid: app.accountSid,
|
||||||
|
serviceProviderSid: account.service_provider_sid,
|
||||||
applicationSid: app.applicationSid,
|
applicationSid: app.applicationSid,
|
||||||
from: req.body.from,
|
from: req.body.from,
|
||||||
to: req.body.to,
|
to: req.body.to,
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ function retrieveCallSession(callSid, opts) {
|
|||||||
router.post('/:callSid', async(req, res) => {
|
router.post('/:callSid', async(req, res) => {
|
||||||
const logger = req.app.locals.logger;
|
const logger = req.app.locals.logger;
|
||||||
const callSid = req.params.callSid;
|
const callSid = req.params.callSid;
|
||||||
logger.debug({body: req.body}, 'got upateCall request');
|
logger.debug({body: req.body}, 'got updateCall request');
|
||||||
try {
|
try {
|
||||||
const cs = retrieveCallSession(callSid, req.body);
|
const cs = retrieveCallSession(callSid, req.body);
|
||||||
if (!cs) {
|
if (!cs) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const { v4: uuidv4 } = require('uuid');
|
const uuidv4 = require('uuid-random');
|
||||||
const {CallDirection, AllowedSipRecVerbs} = require('./utils/constants');
|
const {CallDirection, AllowedSipRecVerbs} = require('./utils/constants');
|
||||||
const {parseSiprecPayload} = require('./utils/siprec-utils');
|
const {parseSiprecPayload} = require('./utils/siprec-utils');
|
||||||
const CallInfo = require('./session/call-info');
|
const CallInfo = require('./session/call-info');
|
||||||
@@ -118,6 +118,7 @@ module.exports = function(srf, logger) {
|
|||||||
const {span} = rootSpan.startChildSpan('lookupAccountDetails');
|
const {span} = rootSpan.startChildSpan('lookupAccountDetails');
|
||||||
try {
|
try {
|
||||||
req.locals.accountInfo = await lookupAccountDetails(account_sid);
|
req.locals.accountInfo = await lookupAccountDetails(account_sid);
|
||||||
|
req.locals.service_provider_sid = req.locals.accountInfo?.account?.service_provider_sid;
|
||||||
span.end();
|
span.end();
|
||||||
if (!req.locals.accountInfo.account.is_active) {
|
if (!req.locals.accountInfo.account.is_active) {
|
||||||
logger.info(`Account is inactive or suspended ${account_sid}`);
|
logger.info(`Account is inactive or suspended ${account_sid}`);
|
||||||
@@ -224,29 +225,30 @@ module.exports = function(srf, logger) {
|
|||||||
* create a requestor that we will use for all http requests we make during the call.
|
* create a requestor that we will use for all http requests we make during the call.
|
||||||
* also create a notifier for call status events (if not needed, its a no-op).
|
* also create a notifier for call status events (if not needed, its a no-op).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* allow for caching data - when caching treat retrieved data as immutable */
|
||||||
|
const app2 = process.env.JAMBONES_MYSQL_REFRESH_TTL ? JSON.parse(JSON.stringify(app)) : app;
|
||||||
if ('WS' === app.call_hook?.method ||
|
if ('WS' === app.call_hook?.method ||
|
||||||
app.call_hook?.url.startsWith('ws://') || app.call_hook?.url.startsWith('wss://')) {
|
app.call_hook?.url.startsWith('ws://') || app.call_hook?.url.startsWith('wss://')) {
|
||||||
app.requestor = new WsRequestor(logger, account_sid, app.call_hook, accountInfo.account.webhook_secret) ;
|
app2.requestor = new WsRequestor(logger, account_sid, app.call_hook, accountInfo.account.webhook_secret) ;
|
||||||
app.notifier = app.requestor;
|
app2.notifier = app.requestor;
|
||||||
app.call_hook.method = 'WS';
|
app2.call_hook.method = 'WS';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
app.requestor = new HttpRequestor(logger, account_sid, app.call_hook, accountInfo.account.webhook_secret);
|
app2.requestor = new HttpRequestor(logger, account_sid, app.call_hook, accountInfo.account.webhook_secret);
|
||||||
if (app.call_status_hook) app.notifier = new HttpRequestor(logger, account_sid, app.call_status_hook,
|
if (app.call_status_hook) app2.notifier = new HttpRequestor(logger, account_sid, app.call_status_hook,
|
||||||
accountInfo.account.webhook_secret);
|
accountInfo.account.webhook_secret);
|
||||||
else app.notifier = {request: () => {}};
|
else app2.notifier = {request: () => {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
req.locals.application = app;
|
req.locals.application = app2;
|
||||||
const obj = Object.assign({}, app);
|
|
||||||
delete obj.requestor;
|
|
||||||
delete obj.notifier;
|
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
const {call_hook, call_status_hook, ...appInfo} = obj; // mask sensitive data like user/pass on webhook
|
const {call_hook, call_status_hook, ...appInfo} = app; // mask sensitive data like user/pass on webhook
|
||||||
logger.info({app: appInfo}, `retrieved application for incoming call to ${req.locals.calledNumber}`);
|
logger.info({app: appInfo}, `retrieved application for incoming call to ${req.locals.calledNumber}`);
|
||||||
req.locals.callInfo = new CallInfo({
|
req.locals.callInfo = new CallInfo({
|
||||||
req,
|
req,
|
||||||
app,
|
app: app2,
|
||||||
direction: CallDirection.Inbound,
|
direction: CallDirection.Inbound,
|
||||||
traceId: rootSpan.traceId
|
traceId: rootSpan.traceId
|
||||||
});
|
});
|
||||||
@@ -273,7 +275,9 @@ module.exports = function(srf, logger) {
|
|||||||
}
|
}
|
||||||
/* retrieve the application to execute for this inbound call */
|
/* retrieve the application to execute for this inbound call */
|
||||||
const params = Object.assign(['POST', 'WS'].includes(app.call_hook.method) ? {sip: req.msg} : {},
|
const params = Object.assign(['POST', 'WS'].includes(app.call_hook.method) ? {sip: req.msg} : {},
|
||||||
req.locals.callInfo, {
|
req.locals.callInfo,
|
||||||
|
{service_provider_sid: req.locals.service_provider_sid},
|
||||||
|
{
|
||||||
defaults: {
|
defaults: {
|
||||||
synthesizer: {
|
synthesizer: {
|
||||||
vendor: app.speech_synthesis_vendor,
|
vendor: app.speech_synthesis_vendor,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
const {CallDirection, CallStatus} = require('../utils/constants');
|
const {CallDirection, CallStatus} = require('../utils/constants');
|
||||||
const parseUri = require('drachtio-srf').parseUri;
|
const parseUri = require('drachtio-srf').parseUri;
|
||||||
const { v4: uuidv4 } = require('uuid');
|
const uuidv4 = require('uuid-random');
|
||||||
/**
|
/**
|
||||||
* @classdesc Represents the common information for all calls
|
* @classdesc Represents the common information for all calls
|
||||||
* that is provided in call status webhooks
|
* that is provided in call status webhooks
|
||||||
|
|||||||
@@ -83,6 +83,10 @@ class CallSession extends Emitter {
|
|||||||
|
|
||||||
this.requestor.on('command', this._onCommand.bind(this));
|
this.requestor.on('command', this._onCommand.bind(this));
|
||||||
this.requestor.on('connection-dropped', this._onWsConnectionDropped.bind(this));
|
this.requestor.on('connection-dropped', this._onWsConnectionDropped.bind(this));
|
||||||
|
this.requestor.on('handover', (newRequestor) => {
|
||||||
|
this.logger.info(`handover to new base url ${newRequestor.url}`);
|
||||||
|
this.application.requestor = newRequestor;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -588,13 +592,19 @@ class CallSession extends Emitter {
|
|||||||
this.logger.info(`CallSession:exec starting task #${stackNum}:${taskNum}: ${task.name}`);
|
this.logger.info(`CallSession:exec starting task #${stackNum}:${taskNum}: ${task.name}`);
|
||||||
try {
|
try {
|
||||||
const resources = await this._evaluatePreconditions(task);
|
const resources = await this._evaluatePreconditions(task);
|
||||||
|
let skip = false;
|
||||||
this.currentTask = task;
|
this.currentTask = task;
|
||||||
if (TaskName.Gather === task.name && this.isBotModeEnabled) {
|
if (TaskName.Gather === task.name && this.isBotModeEnabled) {
|
||||||
const timeout = task.timeout;
|
if (this.backgroundGatherTask.updateTaskInProgress(task)) {
|
||||||
this.logger.info(`CallSession:exec skipping #${stackNum}:${taskNum}: ${task.name}`);
|
this.logger.info(`CallSession:exec skipping #${stackNum}:${taskNum}: ${task.name}`);
|
||||||
this.backgroundGatherTask.updateTimeout(timeout);
|
skip = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.logger.info('CallSession:exec disabling bot mode to start gather with new options');
|
||||||
|
this.disableBotMode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
if (!skip) {
|
||||||
const {span, ctx} = this.rootSpan.startChildSpan(`verb:${task.summary}`);
|
const {span, ctx} = this.rootSpan.startChildSpan(`verb:${task.summary}`);
|
||||||
task.span = span;
|
task.span = span;
|
||||||
task.ctx = ctx;
|
task.ctx = ctx;
|
||||||
@@ -1276,6 +1286,7 @@ class CallSession extends Emitter {
|
|||||||
}
|
}
|
||||||
this.tmpFiles.clear();
|
this.tmpFiles.clear();
|
||||||
this.requestor && this.requestor.close();
|
this.requestor && this.requestor.close();
|
||||||
|
this.notifier && this.notifier.close();
|
||||||
|
|
||||||
this.rootSpan && this.rootSpan.end();
|
this.rootSpan && this.rootSpan.end();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,7 +186,8 @@ class TaskGather extends Task {
|
|||||||
|
|
||||||
const startListening = (cs, ep) => {
|
const startListening = (cs, ep) => {
|
||||||
this._startTimer();
|
this._startTimer();
|
||||||
if (this.isContinuousAsr && 0 === this.timeout) this._startAsrTimer();
|
// dont start asr timer until we have a transcription
|
||||||
|
//if (this.isContinuousAsr && 0 === this.timeout) this._startAsrTimer();
|
||||||
if (this.input.includes('speech') && !this.listenDuringPrompt) {
|
if (this.input.includes('speech') && !this.listenDuringPrompt) {
|
||||||
this._initSpeech(cs, ep)
|
this._initSpeech(cs, ep)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -259,10 +260,15 @@ class TaskGather extends Task {
|
|||||||
this._resolve('killed');
|
this._resolve('killed');
|
||||||
}
|
}
|
||||||
|
|
||||||
updateTimeout(timeout) {
|
updateTaskInProgress(opts) {
|
||||||
this.logger.info(`TaskGather:updateTimeout - updating timeout to ${timeout}`);
|
if (!this.needsStt && opts.input.includes('speech')) {
|
||||||
|
this.logger.info('TaskGather:updateTaskInProgress - adding speech to a background gather');
|
||||||
|
return false; // this needs be handled by killing the background gather and starting a new one
|
||||||
|
}
|
||||||
|
const {timeout} = opts;
|
||||||
this.timeout = timeout;
|
this.timeout = timeout;
|
||||||
this._startTimer();
|
this._startTimer();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDtmf(cs, ep, evt) {
|
_onDtmf(cs, ep, evt) {
|
||||||
@@ -434,8 +440,7 @@ class TaskGather extends Task {
|
|||||||
if (0 === this.timeout) return;
|
if (0 === this.timeout) return;
|
||||||
this._clearTimer();
|
this._clearTimer();
|
||||||
this._timeoutTimer = setTimeout(() => {
|
this._timeoutTimer = setTimeout(() => {
|
||||||
if (this.isContinuousAsr) this._startAsrTimer();
|
this._resolve(this.digitBuffer.length >= this.minDigits ? 'dtmf-num-digits' : 'timeout');
|
||||||
else this._resolve(this.digitBuffer.length >= this.minDigits ? 'dtmf-num-digits' : 'timeout');
|
|
||||||
}, this.timeout);
|
}, this.timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
const Task = require('./task');
|
const Task = require('./task');
|
||||||
const {TaskName, TaskPreconditions} = require('../utils/constants');
|
const {TaskName, TaskPreconditions} = require('../utils/constants');
|
||||||
const bent = require('bent');
|
const bent = require('bent');
|
||||||
const { v4: uuidv4 } = require('uuid');
|
const uuidv4 = require('uuid-random');
|
||||||
|
|
||||||
class TaskMessage extends Task {
|
class TaskMessage extends Task {
|
||||||
constructor(logger, opts) {
|
constructor(logger, opts) {
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ class TaskSipRefer extends Task {
|
|||||||
method: 'REFER',
|
method: 'REFER',
|
||||||
headers: {
|
headers: {
|
||||||
...this.headers,
|
...this.headers,
|
||||||
|
...(this.referToIsUri && {'X-Refer-To-Leave-Untouched': true}),
|
||||||
'Refer-To': referTo,
|
'Refer-To': referTo,
|
||||||
'Referred-By': referredBy
|
'Referred-By': referredBy
|
||||||
}
|
}
|
||||||
@@ -100,6 +101,7 @@ class TaskSipRefer extends Task {
|
|||||||
/* they may have only provided a phone number/user */
|
/* they may have only provided a phone number/user */
|
||||||
referTo = `sip:${referTo}@${host}`;
|
referTo = `sip:${referTo}@${host}`;
|
||||||
}
|
}
|
||||||
|
else this.referToIsUri = true;
|
||||||
if (!referredBy) {
|
if (!referredBy) {
|
||||||
/* default */
|
/* default */
|
||||||
referredBy = cs.req?.callingNumber || dlg.local.uri;
|
referredBy = cs.req?.callingNumber || dlg.local.uri;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
const Emitter = require('events');
|
const Emitter = require('events');
|
||||||
const { v4: uuidv4 } = require('uuid');
|
const uuidv4 = require('uuid-random');
|
||||||
const debug = require('debug')('jambonz:feature-server');
|
const debug = require('debug')('jambonz:feature-server');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const {TaskPreconditions} = require('../utils/constants');
|
const {TaskPreconditions} = require('../utils/constants');
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ class HttpRequestor extends BaseRequestor {
|
|||||||
if (u.port) this._baseUrl = `${u.protocol}://${u.resource}:${u.port}`;
|
if (u.port) this._baseUrl = `${u.protocol}://${u.resource}:${u.port}`;
|
||||||
else this._baseUrl = `${u.protocol}://${u.resource}`;
|
else this._baseUrl = `${u.protocol}://${u.resource}`;
|
||||||
this._protocol = u.protocol;
|
this._protocol = u.protocol;
|
||||||
|
this._resource = u.resource;
|
||||||
|
this._port = u.port;
|
||||||
this._search = u.search;
|
this._search = u.search;
|
||||||
this._usePools = process.env.HTTP_POOL && parseInt(process.env.HTTP_POOL);
|
this._usePools = process.env.HTTP_POOL && parseInt(process.env.HTTP_POOL);
|
||||||
|
|
||||||
@@ -98,7 +100,7 @@ class HttpRequestor extends BaseRequestor {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const u = parseUrl(url);
|
const u = parseUrl(url);
|
||||||
if (u.resource === this._resource && u.protocol === this._protocol) {
|
if (u.resource === this._resource && u.port === this._port && u.protocol === this._protocol) {
|
||||||
client = this.client;
|
client = this.client;
|
||||||
path = u.pathname;
|
path = u.pathname;
|
||||||
query = u.query;
|
query = u.query;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const deepcopy = require('deepcopy');
|
|||||||
const moment = require('moment');
|
const moment = require('moment');
|
||||||
const stripCodecs = require('./strip-ancillary-codecs');
|
const stripCodecs = require('./strip-ancillary-codecs');
|
||||||
const RootSpan = require('./call-tracer');
|
const RootSpan = require('./call-tracer');
|
||||||
const { v4: uuidv4 } = require('uuid');
|
const uuidv4 = require('uuid-random');
|
||||||
|
|
||||||
class SingleDialer extends Emitter {
|
class SingleDialer extends Emitter {
|
||||||
constructor({logger, sbcAddress, target, opts, application, callInfo, accountInfo, rootSpan, startSpan}) {
|
constructor({logger, sbcAddress, target, opts, application, callInfo, accountInfo, rootSpan, startSpan}) {
|
||||||
@@ -412,7 +412,7 @@ class SingleDialer extends Emitter {
|
|||||||
this.callInfo.updateCallStatus(callStatus, sipStatus, sipReason);
|
this.callInfo.updateCallStatus(callStatus, sipStatus, sipReason);
|
||||||
if (typeof duration === 'number') this.callInfo.duration = duration;
|
if (typeof duration === 'number') this.callInfo.duration = duration;
|
||||||
try {
|
try {
|
||||||
this.requestor.request('call:status', this.application.call_status_hook, this.callInfo.toJSON());
|
this.notifier.request('call:status', this.application.call_status_hook, this.callInfo.toJSON());
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logger.info(err, `SingleDialer:_notifyCallStatusChange error sending ${callStatus} ${sipStatus}`);
|
this.logger.info(err, `SingleDialer:_notifyCallStatusChange error sending ${callStatus} ${sipStatus}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const { v4: uuidv4 } = require('uuid');
|
const uuidv4 = require('uuid-random');
|
||||||
const {LifeCycleEvents, FS_UUID_SET_NAME} = require('./constants');
|
const {LifeCycleEvents, FS_UUID_SET_NAME} = require('./constants');
|
||||||
const Emitter = require('events');
|
const Emitter = require('events');
|
||||||
const debug = require('debug')('jambonz:feature-server');
|
const debug = require('debug')('jambonz:feature-server');
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
const xmlParser = require('xml2js').parseString;
|
const xmlParser = require('xml2js').parseString;
|
||||||
const { v4: uuidv4 } = require('uuid');
|
const uuidv4 = require('uuid-random');
|
||||||
const parseUri = require('drachtio-srf').parseUri;
|
const parseUri = require('drachtio-srf').parseUri;
|
||||||
const transform = require('sdp-transform');
|
const transform = require('sdp-transform');
|
||||||
const debug = require('debug')('jambonz:feature-server');
|
const debug = require('debug')('jambonz:feature-server');
|
||||||
|
|||||||
@@ -54,7 +54,11 @@ class WsRequestor extends BaseRequestor {
|
|||||||
/* if we have an absolute url, and it is http then do a standard webhook */
|
/* if we have an absolute url, and it is http then do a standard webhook */
|
||||||
if (this._isAbsoluteUrl(url) && url.startsWith('http')) {
|
if (this._isAbsoluteUrl(url) && url.startsWith('http')) {
|
||||||
this.logger.debug({hook}, 'WsRequestor: sending a webhook (HTTP)');
|
this.logger.debug({hook}, 'WsRequestor: sending a webhook (HTTP)');
|
||||||
const requestor = new HttpRequestor(this.logger, this.account_sid, hook, this.secret);
|
const requestor = new HttpRequestor(this.logger, this.account_sid, {url: hook}, this.secret);
|
||||||
|
if (type === 'session:redirect') {
|
||||||
|
this.close();
|
||||||
|
this.emit('handover', requestor);
|
||||||
|
}
|
||||||
return requestor.request(type, hook, params, httpHeaders);
|
return requestor.request(type, hook, params, httpHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2869
package-lock.json
generated
2869
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
17
package.json
17
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jambonz-feature-server",
|
"name": "jambonz-feature-server",
|
||||||
"version": "v0.7.7",
|
"version": "v0.7.8",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.16.0"
|
"node": ">= 10.16.0"
|
||||||
@@ -24,9 +24,9 @@
|
|||||||
"jslint": "eslint app.js lib"
|
"jslint": "eslint app.js lib"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jambonz/http-health-check": "^0.0.1",
|
|
||||||
"@jambonz/db-helpers": "^0.7.3",
|
"@jambonz/db-helpers": "^0.7.3",
|
||||||
"@jambonz/realtimedb-helpers": "^0.5.9",
|
"@jambonz/http-health-check": "^0.0.1",
|
||||||
|
"@jambonz/realtimedb-helpers": "^0.6.3",
|
||||||
"@jambonz/stats-collector": "^0.1.6",
|
"@jambonz/stats-collector": "^0.1.6",
|
||||||
"@jambonz/time-series": "^0.2.5",
|
"@jambonz/time-series": "^0.2.5",
|
||||||
"@opentelemetry/api": "^1.1.0",
|
"@opentelemetry/api": "^1.1.0",
|
||||||
@@ -42,10 +42,9 @@
|
|||||||
"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.3",
|
"drachtio-fsmrf": "^3.0.16",
|
||||||
"drachtio-srf": "^4.5.1",
|
"drachtio-srf": "^4.5.21",
|
||||||
"express": "^4.18.1",
|
"express": "^4.18.2",
|
||||||
"helmet": "^5.1.0",
|
|
||||||
"ip": "^1.1.8",
|
"ip": "^1.1.8",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.29.4",
|
||||||
"parse-url": "^8.1.0",
|
"parse-url": "^8.1.0",
|
||||||
@@ -53,8 +52,8 @@
|
|||||||
"sdp-transform": "^2.14.1",
|
"sdp-transform": "^2.14.1",
|
||||||
"short-uuid": "^4.2.0",
|
"short-uuid": "^4.2.0",
|
||||||
"to-snake-case": "^1.0.0",
|
"to-snake-case": "^1.0.0",
|
||||||
"undici": "^5.8.2",
|
"undici": "^5.11.0",
|
||||||
"uuid": "^8.3.2",
|
"uuid-random": "^1.3.2",
|
||||||
"verify-aws-sns-signature": "^0.1.0",
|
"verify-aws-sns-signature": "^0.1.0",
|
||||||
"ws": "^8.8.0",
|
"ws": "^8.8.0",
|
||||||
"xml2js": "^0.4.23"
|
"xml2js": "^0.4.23"
|
||||||
|
|||||||
Reference in New Issue
Block a user