mirror of
https://github.com/jambonz/jambonz-feature-server.git
synced 2025-12-20 08:40:38 +00:00
bugfix: db caching had side affects of using closed http requestors
This commit is contained in:
@@ -225,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
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1308,6 +1308,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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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}`);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user