Files
jambonz-node/lib/utils.js
2025-04-09 18:34:35 -07:00

92 lines
3.2 KiB
JavaScript

const assert = require('assert');
/**
* end of copy
*/
/**
* Validate the payload for an updateCall request
*/
const validateCallUpdate = (opts) => {
const {
call_hook,
child_call_hook,
call_status,
listen_status,
mute_status,
conf_mute_status,
whisper,
conf_hold_status,
sip_request,
dub,
media_path
} = opts;
assert.ok(call_hook || child_call_hook || call_status ||
listen_status || mute_status || conf_mute_status || whisper || dub ||
conf_hold_status || sip_request, `calls.update: invalid request ${JSON.stringify(opts)}`);
if (call_status) assert.ok(['completed', 'no-answer'].includes(call_status),
`invalid call_status: ${call_status}, must be 'completed' or 'no-answer'`);
if (mute_status) assert.ok(['mute', 'unmute'].includes(mute_status),
`invalid mute_status: ${mute_status}, must be 'mute' or 'unmute'`);
if (conf_mute_status) assert.ok(['mute', 'unmute'].includes(conf_mute_status),
`invalid conf_mute_status: ${conf_mute_status}, must be 'mute' or 'unmute'`);
if (conf_hold_status) assert.ok(['hold', 'unhold'].includes(conf_hold_status),
`invalid conf_hold_status: ${conf_hold_status}, must be 'hold' or 'unhold'`);
if (media_path) assert.ok(['no-media', 'partial-media', 'full-media'].includes(media_path),
`invalid media_path: ${media_path}, must be 'no-media', 'partial-media' or 'full-media'`);
if (whisper) assert.ok(whisper.verb,
`invalid whisper: ${JSON.stringify(whisper)}, must be a 'play' or 'say' verb`);
if (sip_request) assert.ok(sip_request.method,
`invalid sip_request: ${JSON.stringify(whisper)}, must include a 'method' property`);
};
/**
* Validate the payload for a createCall request
*/
const validateCallCreate = (opts) => {
const {application_sid, call_hook, call_status_hook, from, to} = opts;
assert.ok(from && typeof from === 'string', 'calls.create: from property is required');
assert.ok(to && typeof to === 'object', 'calls.create: to property is required');
assert.ok(application_sid || call_hook, 'calls.create: application_sid or call_hook is required');
assert.ok(call_status_hook || !call_hook, 'calls.create: call_status_hook is required when call_hook is used');
const hookUrl = typeof call_hook === 'object' ? call_hook.url : call_hook;
if (hookUrl) assert.ok(/^(http|ws)s?:/.test(hookUrl), 'call_hook must be an absolute url');
const hookStatusUrl = typeof call_status_hook === 'object' ? call_status_hook.url : call_status_hook;
if (hookStatusUrl) assert.ok(/^https?:/.test(hookStatusUrl), 'call_status_hook must be an absolute url');
};
const validateCallList = (opts) => {
};
const validateMessageCreate = (opts) => {
const {from, to, text} = opts;
assert.ok(from && typeof from === 'string', 'messages.create: from property is required');
assert.ok(to && typeof to === 'object', 'message.create: to property is required');
assert.ok(text && typeof text === 'object', 'message.create: text property is required');
};
module.exports = {
validators: {
Calls: {
create: validateCallCreate,
update: validateCallUpdate,
list: validateCallList
},
Messages: {
validateMessageCreate
}
}
};