Class: TelephonyStreamTransport
Defined in: packages/agentos/src/io/channels/telephony/TelephonyStreamTransport.ts:134
Adapts a telephony provider WebSocket media stream to the
IStreamTransport interface consumed by the AgentOS voice pipeline.
Inbound path (phone -> pipeline)
- Provider WebSocket frames arrive as raw
Bufferor JSONstring. - MediaStreamParser.parseIncoming normalises them to MediaStreamIncoming events.
'audio'events: mu-law 8 kHz -> Int16 PCM -> resample -> Float32 ->'audio'emit.'dtmf'/'mark'events are re-emitted as-is for higher-layer handling.'start'transitions the transport to'open'and sends the optional connection acknowledgment from the parser.'stop'or WebSocket close transitions to'closed'and emits'close'.
Outbound path (pipeline -> phone)
sendAudio()receives anEncodedAudioChunk(PCM Int16 format assumed).- Chunk is resampled from
chunk.sampleRate-> 8 kHz via linear interpolation. - Resampled PCM is mu-law encoded via convertPcmToMulaw8k.
- MediaStreamParser.formatOutgoing wraps the bytes for the provider.
- The formatted payload is sent over the WebSocket.
Events emitted
'audio'(AudioFrame) -- inbound decoded audio for STT / VAD.'dtmf'({ digit: string; durationMs?: number }) -- caller key-press.'mark'({ name: string }) -- named stream marker.'close'() -- transport has been fully closed.'error'(Error) -- unrecoverable WebSocket or parsing error.
Example
const parser = new TwilioMediaStreamParser();
const transport = new TelephonyStreamTransport(ws, parser, { outputSampleRate: 16000 });
transport.on('audio', (frame: AudioFrame) => {
// Feed to STT engine
sttEngine.pushAudio(frame.samples, frame.sampleRate);
});
transport.on('dtmf', ({ digit }) => {
console.log(`Caller pressed: ${digit}`);
});
Extends
EventEmitter
Implements
IStreamTransport
Constructors
Constructor
new TelephonyStreamTransport(
ws,parser,config?):TelephonyStreamTransport
Defined in: packages/agentos/src/io/channels/telephony/TelephonyStreamTransport.ts:183
Create a new telephony stream transport.
Wires up WebSocket event handlers immediately. The transport starts in
'connecting' state and transitions to 'open' when the provider sends
its start event through the media stream.
Parameters
ws
any
WebSocket-like object (must emit 'message', 'close', 'error'
and expose send(data) and close(code?, reason?) methods).
parser
Provider-specific message parser/formatter.
config?
TelephonyStreamTransportConfig
Optional configuration overrides.
Returns
TelephonyStreamTransport
Overrides
EventEmitter.constructor
Properties
id
readonlyid:string
Defined in: packages/agentos/src/io/channels/telephony/TelephonyStreamTransport.ts:140
Stable UUID for this transport connection.
Implementation of
IStreamTransport.id
captureRejections
staticcaptureRejections:boolean
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:426
Value: boolean
Change the default captureRejections option on all new EventEmitter objects.
Since
v13.4.0, v12.16.0
Inherited from
EventEmitter.captureRejections
captureRejectionSymbol
readonlystaticcaptureRejectionSymbol: typeofcaptureRejectionSymbol
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:419
Value: Symbol.for('nodejs.rejection')
See how to write a custom rejection handler.
Since
v13.4.0, v12.16.0
Inherited from
EventEmitter.captureRejectionSymbol
defaultMaxListeners
staticdefaultMaxListeners:number
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:465
By default, a maximum of 10 listeners can be registered for any single
event. This limit can be changed for individual EventEmitter instances
using the emitter.setMaxListeners(n) method. To change the default
for allEventEmitter instances, the events.defaultMaxListeners property
can be used. If this value is not a positive number, a RangeError is thrown.
Take caution when setting the events.defaultMaxListeners because the
change affects all EventEmitter instances, including those created before
the change is made. However, calling emitter.setMaxListeners(n) still has
precedence over events.defaultMaxListeners.
This is not a hard limit. The EventEmitter instance will allow
more listeners to be added but will output a trace warning to stderr indicating
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to
temporarily avoid this warning:
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings command-line flag can be used to display the
stack trace for such warnings.
The emitted warning can be inspected with process.on('warning') and will
have the additional emitter, type, and count properties, referring to
the event emitter instance, the event's name and the number of attached
listeners, respectively.
Its name property is set to 'MaxListenersExceededWarning'.
Since
v0.11.2
Inherited from
EventEmitter.defaultMaxListeners
errorMonitor
readonlystaticerrorMonitor: typeoferrorMonitor
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:412
This symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.
Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no
regular 'error' listener is installed.
Since
v13.6.0, v12.17.0
Inherited from
EventEmitter.errorMonitor
Accessors
state
Get Signature
get state():
"connecting"|"open"|"closed"|"closing"
Defined in: packages/agentos/src/io/channels/telephony/TelephonyStreamTransport.ts:153
Current connection lifecycle state.
connecting-- WebSocket is open but the provider'sstartevent has not arrived yet.open-- Stream is active; audio can be sent and received.closing-- close was called; waiting for WS to finish closing.closed-- Stream is fully terminated; no further I/O.
Returns
"connecting" | "open" | "closed" | "closing"
Implementation of
IStreamTransport.state
Methods
[captureRejectionSymbol]()?
optional[captureRejectionSymbol]<K>(error,event, ...args):void
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:103
Type Parameters
K
K
Parameters
error
Error
event
string | symbol
args
...AnyRest
Returns
void
Implementation of
IStreamTransport.[captureRejectionSymbol]
Inherited from
EventEmitter.[captureRejectionSymbol]
addListener()
addListener<
K>(eventName,listener):this
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:643
Alias for emitter.on(eventName, listener).
Type Parameters
K
K
Parameters
eventName
string | symbol
listener
(...args) => void
Returns
this
Since
v0.1.26
Implementation of
IStreamTransport.addListener
Inherited from
EventEmitter.addListener
close()
close(
code?,reason?):void
Defined in: packages/agentos/src/io/channels/telephony/TelephonyStreamTransport.ts:336
Initiate graceful closure of the transport.
Sets state to 'closing' and delegates to the underlying WebSocket's
close() method. The actual transition to 'closed' happens when the
WebSocket's 'close' event fires.
Parameters
code?
number
Optional WebSocket close code (default 1000).
reason?
string
Optional human-readable close reason.
Returns
void
Implementation of
IStreamTransport.close
emit()
emit<
K>(eventName, ...args):boolean
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:905
Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments
to each.
Returns true if the event had listeners, false otherwise.
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
K
K
Parameters
eventName
string | symbol
args
...AnyRest
Returns
boolean
Since
v0.1.26
Implementation of
IStreamTransport.emit
Inherited from
EventEmitter.emit
eventNames()
eventNames(): (
string|symbol)[]
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:968
Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbols.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns
(string | symbol)[]
Since
v6.0.0
Implementation of
IStreamTransport.eventNames
Inherited from
EventEmitter.eventNames
getMaxListeners()
getMaxListeners():
number
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:820
Returns the current max listener value for the EventEmitter which is either
set by emitter.setMaxListeners(n) or defaults to EventEmitter.defaultMaxListeners.
Returns
number
Since
v1.0.0
Implementation of
IStreamTransport.getMaxListeners
Inherited from
EventEmitter.getMaxListeners
listenerCount()
listenerCount<
K>(eventName,listener?):number
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:914
Returns the number of listeners listening for the event named eventName.
If listener is provided, it will return how many times the listener is found
in the list of the listeners of the event.
Type Parameters
K
K
Parameters
eventName
The name of the event being listened for
string | symbol
listener?
Function
The event handler function
Returns
number
Since
v3.2.0
Implementation of
IStreamTransport.listenerCount
Inherited from
EventEmitter.listenerCount
listeners()
listeners<
K>(eventName):Function[]
Defined in: packages/agentos/node_modules/@types/node/events.d.ts:833
Returns a copy of the array of listeners for the event named eventName.
server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
K
K