mirror of
https://github.com/jambonz/jambonz-feature-server.git
synced 2026-07-24 21:22:17 +00:00
9973670a6c
Applications currently have no way to observe a mid-call hold/un-hold.
The feature-server handles the in-dialog re-INVITE internally (re-modifies
the endpoint, returns 200) but never notifies the app, so a transcription
or agent-assist app can't pause/resume when a caller is held or retrieved.
This detects the hold state transition on a re-INVITE and delivers it over
the existing sipRequestWithinDialogHook channel as a verb:hook, plus emits
a local 'hold'/'unhold' event so in-process tasks (e.g. transcribe) can react.
- call-session.js: ordinary calls — reuse isOnhold() (a=sendonly/a=inactive).
- siprec-call-session.js: SIPREC overrides _onReinvite, so a separate handler
is required. SIPREC recording streams are sendonly by nature, so a stream
flipping to a=inactive is treated as the hold signal; the full multipart
body (SDP + rs-metadata) is always forwarded. Fires on transition only;
other re-INVITEs are delivered as event:"reinvite".
Delivery uses requestor.request('verb:hook', ...) — the same channel
_handleRefer uses — rather than a task-bound performHook, so events are not
dropped if the current task has ended. Enable per call with:
{"verb":"config","sipRequestWithinDialogHook":"/hold-events"}
Confirmed live against Cisco CUBE (Cisco-SIPGateway/IOS-17.12.7b) over SIPREC:
both recording streams flip sendonly<->inactive on hold/resume, each
transition emitted correctly.
The whole feature is opt-in behind the JAMBONES_HOLD_UNHOLD_EVENTS env var;
when it is unset, _notifyHoldState / _notifySipRecReinvite are no-ops (neither
the local event nor the hook fires).
Reinstates the feature previously reverted in #1563. The revert was due to the
unit test failing in the full suite: lib/config.js captures the env var once at
load time, and earlier suite files require config/session modules (flag unset)
before this test could set it, so the enabled-path assertions saw a disabled
feature. The test now force-reloads config + the session modules with the flag
set (and restores the module cache afterward), so it is robust to suite load order.
29 lines
890 B
JavaScript
29 lines
890 B
JavaScript
require('./ws-requestor-retry-unit-test');
|
|
require('./test_ws_retry_comprehensive');
|
|
require('./ws-requestor-unit-test');
|
|
require('./http-requestor-retry-test');
|
|
require('./http-requestor-unit-test');
|
|
require('./unit-tests');
|
|
require('./hold-unhold-test');
|
|
require('./docker_start');
|
|
require('./create-test-db');
|
|
require('./account-validation-tests');
|
|
require('./dial-tests');
|
|
require('./webhooks-tests');
|
|
require('./say-tests');
|
|
require('./gather-tests');
|
|
require('./transcribe-tests');
|
|
require('./sip-request-tests');
|
|
require('./create-call-test');
|
|
require('./play-tests');
|
|
require('./sip-refer-tests');
|
|
require('./sip-refer-handler-tests');
|
|
require('./listen-tests');
|
|
require('./config-test');
|
|
require('./queue-test');
|
|
require('./in-dialog-test');
|
|
require('./hangup-test');
|
|
require('./sdp-utils-test');
|
|
require('./http-proxy-test');
|
|
require('./remove-test-db');
|
|
require('./docker_stop'); |