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.
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).
* fixed dial transcribe is not able to received final transcribe when close call.
* wip
* fix review comment
* support call session delay detroy ep when current task is transcribe
* wip
* wip
* fixed review comments
* fixed review comments
* support kill dial if sd ep is media timeout
* support kill dial if sd ep is media timeout
* support kill dial if sd ep is media timeout
* add media timeout reason header to bye message
* wip
* wip
* make configuration for freeswitch media timeout
* make configuration for freeswitch media timeout
* wip
* feature server should send USER call to the sbc sip that is connect with the user
* feature server should send USER call to the sbc sip that is connect with the user
* feature server should send USER call to the sbc sip that is connect with the user
* fix review comment
* add env variable to enable the feature
* add env variable to enable the feature
* add env variable to enable the feature
* minor test update
---------
Co-authored-by: Dave Horton <daveh@beachdognet.com>
* add support for aws language model name when transcribing
* wip - from prev branch
* wip
* support both aws grpc and ws api - detect based on transcription payload
* update to drachtio-fsmrf@4.0.0
* fix for grpc compatibility, requires JAMBONES_AWS_TRANSCRIBE_USE_GRPC env
* back out major update to drachtio-srf and fsmrf; that should come in a separate PR
* update drachtio-srf
* update to fsmrf with fix
* changes to support elevenlabs tts streaming
* say: add vendor data to span
* bug: tts spans must include cached property
* add env for JAMBONES_USE_FREESWITCH_TIMER_FD
* fix bug in prev commit
* wip
* linting
* wip - caching files generating by streaming tts
* wip caching
* cleanup some logs
* handle tts streaming failure, write alert
* update node version dependency
* set timerfd on outbound call scenarios
* default model to nova-2-phonecall when using deepgram
---------
Co-authored-by: Dave Horton <daveh@beachdognet.com>