@ariaflowagents/livekit-plugin-transport-sip 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/audio_input.d.ts +24 -0
- package/dist/audio_input.d.ts.map +1 -0
- package/dist/audio_input.js +58 -0
- package/dist/audio_input.js.map +1 -0
- package/dist/audio_output.d.ts +34 -0
- package/dist/audio_output.d.ts.map +1 -0
- package/dist/audio_output.js +133 -0
- package/dist/audio_output.js.map +1 -0
- package/dist/codec/g711.d.ts +17 -0
- package/dist/codec/g711.d.ts.map +1 -0
- package/dist/codec/g711.js +123 -0
- package/dist/codec/g711.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/jssip_signaling.d.ts +76 -0
- package/dist/jssip_signaling.d.ts.map +1 -0
- package/dist/jssip_signaling.js +255 -0
- package/dist/jssip_signaling.js.map +1 -0
- package/dist/rtp/jitter_buffer.d.ts +19 -0
- package/dist/rtp/jitter_buffer.d.ts.map +1 -0
- package/dist/rtp/jitter_buffer.js +51 -0
- package/dist/rtp/jitter_buffer.js.map +1 -0
- package/dist/rtp/rtp_packet.d.ts +23 -0
- package/dist/rtp/rtp_packet.d.ts.map +1 -0
- package/dist/rtp/rtp_packet.js +63 -0
- package/dist/rtp/rtp_packet.js.map +1 -0
- package/dist/rtp/rtp_session.d.ts +54 -0
- package/dist/rtp/rtp_session.d.ts.map +1 -0
- package/dist/rtp/rtp_session.js +162 -0
- package/dist/rtp/rtp_session.js.map +1 -0
- package/dist/sdp_g711.d.ts +18 -0
- package/dist/sdp_g711.d.ts.map +1 -0
- package/dist/sdp_g711.js +74 -0
- package/dist/sdp_g711.js.map +1 -0
- package/dist/server.d.ts +76 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +197 -0
- package/dist/server.js.map +1 -0
- package/dist/sip_signaling.d.ts +73 -0
- package/dist/sip_signaling.d.ts.map +1 -0
- package/dist/sip_signaling.js +553 -0
- package/dist/sip_signaling.js.map +1 -0
- package/dist/text_output.d.ts +16 -0
- package/dist/text_output.d.ts.map +1 -0
- package/dist/text_output.js +35 -0
- package/dist/text_output.js.map +1 -0
- package/dist/transport_adapter.d.ts +22 -0
- package/dist/transport_adapter.d.ts.map +1 -0
- package/dist/transport_adapter.js +44 -0
- package/dist/transport_adapter.js.map +1 -0
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp_session.js","sourceRoot":"","sources":["../../src/rtp/rtp_session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* G.711 (PCMU/PCMA) SDP negotiation for SIP UAS answers.
|
|
3
|
+
*
|
|
4
|
+
* Parses the remote offer’s m=audio payload type list (preference order).
|
|
5
|
+
* PT 0 and PT 8 are the static assignments for PCMU and PCMA (RFC 3551).
|
|
6
|
+
*/
|
|
7
|
+
import { type Codec } from '@ariaflow/livekit-plugin/codec/g711';
|
|
8
|
+
/**
|
|
9
|
+
* Choose G.711 codec for this call from the remote SDP offer.
|
|
10
|
+
* Respects remote m= line preference order; if both PCMU and PCMA are offered,
|
|
11
|
+
* uses `fallback` (server preferred codec) when that codec appears in the offer.
|
|
12
|
+
*/
|
|
13
|
+
export declare function negotiateG711FromRemoteOffer(remoteSdp: string, fallback: 'PCMU' | 'PCMA'): Codec;
|
|
14
|
+
/**
|
|
15
|
+
* SDP answer body advertising a single negotiated G.711 codec (RFC 3264).
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildG711SdpAnswer(localAddress: string, rtpPort: number, codec: Codec): string;
|
|
18
|
+
//# sourceMappingURL=sdp_g711.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdp_g711.d.ts","sourceRoot":"","sources":["../src/sdp_g711.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAsB7E;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,GACxB,KAAK,CAqBP;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,GACX,MAAM,CAmBR"}
|
package/dist/sdp_g711.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* G.711 (PCMU/PCMA) SDP negotiation for SIP UAS answers.
|
|
3
|
+
*
|
|
4
|
+
* Parses the remote offer’s m=audio payload type list (preference order).
|
|
5
|
+
* PT 0 and PT 8 are the static assignments for PCMU and PCMA (RFC 3551).
|
|
6
|
+
*/
|
|
7
|
+
import { PCMU, PCMA } from '@ariaflow/livekit-plugin/codec/g711';
|
|
8
|
+
function parseAudioPayloadTypesFromMLine(remoteSdp) {
|
|
9
|
+
const lines = remoteSdp.split(/\r?\n/);
|
|
10
|
+
for (const line of lines) {
|
|
11
|
+
const m = line.match(/^m=audio\s+\d+\s+\S+\s+(.+)$/i);
|
|
12
|
+
if (!m)
|
|
13
|
+
continue;
|
|
14
|
+
return m[1]
|
|
15
|
+
.trim()
|
|
16
|
+
.split(/\s+/)
|
|
17
|
+
.map((t) => parseInt(t, 10))
|
|
18
|
+
.filter((n) => !Number.isNaN(n));
|
|
19
|
+
}
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
function codecFromStaticPt(pt) {
|
|
23
|
+
if (pt === 0)
|
|
24
|
+
return PCMU;
|
|
25
|
+
if (pt === 8)
|
|
26
|
+
return PCMA;
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Choose G.711 codec for this call from the remote SDP offer.
|
|
31
|
+
* Respects remote m= line preference order; if both PCMU and PCMA are offered,
|
|
32
|
+
* uses `fallback` (server preferred codec) when that codec appears in the offer.
|
|
33
|
+
*/
|
|
34
|
+
export function negotiateG711FromRemoteOffer(remoteSdp, fallback) {
|
|
35
|
+
fallback = fallback === 'PCMA' ? 'PCMA' : 'PCMU';
|
|
36
|
+
const mPts = parseAudioPayloadTypesFromMLine(remoteSdp);
|
|
37
|
+
const fallbackCodec = fallback === 'PCMA' ? PCMA : PCMU;
|
|
38
|
+
const g711InOrder = [];
|
|
39
|
+
for (const pt of mPts) {
|
|
40
|
+
const c = codecFromStaticPt(pt);
|
|
41
|
+
if (c && !g711InOrder.some((x) => x.payloadType === c.payloadType)) {
|
|
42
|
+
g711InOrder.push(c);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (g711InOrder.length === 0)
|
|
46
|
+
return fallbackCodec;
|
|
47
|
+
if (g711InOrder.length === 1)
|
|
48
|
+
return g711InOrder[0];
|
|
49
|
+
const preferred = fallbackCodec;
|
|
50
|
+
if (g711InOrder.some((c) => c.payloadType === preferred.payloadType)) {
|
|
51
|
+
return preferred;
|
|
52
|
+
}
|
|
53
|
+
return g711InOrder[0];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* SDP answer body advertising a single negotiated G.711 codec (RFC 3264).
|
|
57
|
+
*/
|
|
58
|
+
export function buildG711SdpAnswer(localAddress, rtpPort, codec) {
|
|
59
|
+
const pt = codec.payloadType;
|
|
60
|
+
const rtpmapLine = codec.payloadType === 0
|
|
61
|
+
? `a=rtpmap:0 PCMU/8000\r\n`
|
|
62
|
+
: `a=rtpmap:8 PCMA/8000\r\n`;
|
|
63
|
+
return (`v=0\r\n` +
|
|
64
|
+
`o=- ${Date.now()} ${Date.now()} IN IP4 ${localAddress}\r\n` +
|
|
65
|
+
`s=AriaFlow Voice Agent\r\n` +
|
|
66
|
+
`c=IN IP4 ${localAddress}\r\n` +
|
|
67
|
+
`t=0 0\r\n` +
|
|
68
|
+
`m=audio ${rtpPort} RTP/AVP ${pt}\r\n` +
|
|
69
|
+
rtpmapLine +
|
|
70
|
+
`a=fmtp:${pt}\r\n` +
|
|
71
|
+
`a=ptime:20\r\n` +
|
|
72
|
+
`a=sendrecv\r\n`);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=sdp_g711.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdp_g711.js","sourceRoot":"","sources":["../src/sdp_g711.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SIP Agent Server for AriaFlow Voice Agents.
|
|
3
|
+
*
|
|
4
|
+
* Production SIP server for SIP trunking and RTP telephony.
|
|
5
|
+
*
|
|
6
|
+
* UDP Transport:
|
|
7
|
+
* - Direct SIP signaling over UDP (port 5060)
|
|
8
|
+
* - Works with PBX systems and SIP gateways
|
|
9
|
+
* - G.711 codec negotiation
|
|
10
|
+
*
|
|
11
|
+
* For WebSocket/WebRTC SIP signaling, use
|
|
12
|
+
* `@ariaflow/livekit-plugin-transport-sip-jssip`.
|
|
13
|
+
*/
|
|
14
|
+
import { SessionManager, type AriaFlowVoiceSession } from '@ariaflow/livekit-plugin';
|
|
15
|
+
import type { voice } from '@livekit/agents';
|
|
16
|
+
import { SIPTransportAdapter } from './transport_adapter.js';
|
|
17
|
+
import type { SIPServerOptions } from './types.js';
|
|
18
|
+
/**
|
|
19
|
+
* A SIP server that accepts incoming calls and creates agent sessions.
|
|
20
|
+
*
|
|
21
|
+
* This server handles SIP signaling (via UDP or WebSocket) and manages
|
|
22
|
+
* RTP sessions for audio transmission.
|
|
23
|
+
*
|
|
24
|
+
* UDP Example:
|
|
25
|
+
* const server = new SIPAgentServer({
|
|
26
|
+
* transport: 'udp',
|
|
27
|
+
* localAddress: '10.0.0.5',
|
|
28
|
+
* sipPort: 5060,
|
|
29
|
+
* rtpPortStart: 10000,
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
export declare class SIPAgentServer {
|
|
34
|
+
private options;
|
|
35
|
+
private sessionManager;
|
|
36
|
+
private callHandler;
|
|
37
|
+
private signaling;
|
|
38
|
+
private nextRtpPort;
|
|
39
|
+
private activeTransports;
|
|
40
|
+
private transportType;
|
|
41
|
+
private activeVoiceSessions;
|
|
42
|
+
constructor(options: SIPServerOptions);
|
|
43
|
+
onCall(handler: (adapter: SIPTransportAdapter, callId: string) => void | Promise<void>): void;
|
|
44
|
+
startSession(callId: string, voiceSession: AriaFlowVoiceSession): Promise<voice.AgentSession>;
|
|
45
|
+
/**
|
|
46
|
+
* Allocate a local RTP port and create a transport adapter.
|
|
47
|
+
* This is called internally when a SIP INVITE is received.
|
|
48
|
+
*/
|
|
49
|
+
private createTransport;
|
|
50
|
+
/**
|
|
51
|
+
* Start listening for SIP INVITE requests.
|
|
52
|
+
*
|
|
53
|
+
* For UDP transport: Binds UDP socket and listens for SIP messages.
|
|
54
|
+
* For WebSocket transport: Connects to WebSocket server and listens for SIP messages.
|
|
55
|
+
*/
|
|
56
|
+
listen(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Hang up an active call.
|
|
59
|
+
*/
|
|
60
|
+
hangup(callId: string): Promise<void>;
|
|
61
|
+
get sessions(): SessionManager;
|
|
62
|
+
/**
|
|
63
|
+
* Get the RTP port for a specific call.
|
|
64
|
+
*/
|
|
65
|
+
getRtpPort(callId: string): number | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* SIP trunk server is connectionless once listening on UDP.
|
|
68
|
+
*/
|
|
69
|
+
get isRegistered(): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* SIP trunk server status.
|
|
72
|
+
*/
|
|
73
|
+
get status(): 'disconnected' | 'connecting' | 'connected';
|
|
74
|
+
close(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,YAAY,CAAC;AAoBjE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,cAAc;IAWb,OAAO,CAAC,OAAO;IAV3B,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,WAAW,CAEH;IAChB,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAA+C;IACvE,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,mBAAmB,CAAgD;gBAEvD,OAAO,EAAE,gBAAgB;IAa7C,MAAM,CACJ,OAAO,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC9E,IAAI;IAID,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;IAU9B;;;OAGG;IACH,OAAO,CAAC,eAAe;IA4BvB;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD7B;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3C,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,cAAc,GAAG,YAAY,GAAG,WAAW,CAExD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAc7B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SIP Agent Server for AriaFlow Voice Agents.
|
|
3
|
+
*
|
|
4
|
+
* Production SIP server for SIP trunking and RTP telephony.
|
|
5
|
+
*
|
|
6
|
+
* UDP Transport:
|
|
7
|
+
* - Direct SIP signaling over UDP (port 5060)
|
|
8
|
+
* - Works with PBX systems and SIP gateways
|
|
9
|
+
* - G.711 codec negotiation
|
|
10
|
+
*
|
|
11
|
+
* For WebSocket/WebRTC SIP signaling, use
|
|
12
|
+
* `@ariaflow/livekit-plugin-transport-sip-jssip`.
|
|
13
|
+
*/
|
|
14
|
+
import { SessionManager } from '@ariaflow/livekit-plugin';
|
|
15
|
+
import { SIPTransportAdapter } from './transport_adapter.js';
|
|
16
|
+
import { RtpSession } from './rtp/rtp_session.js';
|
|
17
|
+
import { SIPSignaling } from './sip_signaling.js';
|
|
18
|
+
/**
|
|
19
|
+
* Parse the remote RTP endpoint from an SDP body.
|
|
20
|
+
* Extracts the connection address (c= line) and audio port (m= line).
|
|
21
|
+
*/
|
|
22
|
+
function parseSdpRemoteEndpoint(sdp) {
|
|
23
|
+
const connectionMatch = sdp.match(/c=IN\s+IP[46]\s+(\S+)/);
|
|
24
|
+
if (!connectionMatch)
|
|
25
|
+
return null;
|
|
26
|
+
const host = connectionMatch[1];
|
|
27
|
+
const mediaMatch = sdp.match(/m=audio\s+(\d+)/);
|
|
28
|
+
if (!mediaMatch)
|
|
29
|
+
return null;
|
|
30
|
+
const port = parseInt(mediaMatch[1], 10);
|
|
31
|
+
if (isNaN(port) || port <= 0 || port > 65535)
|
|
32
|
+
return null;
|
|
33
|
+
return { host, port };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A SIP server that accepts incoming calls and creates agent sessions.
|
|
37
|
+
*
|
|
38
|
+
* This server handles SIP signaling (via UDP or WebSocket) and manages
|
|
39
|
+
* RTP sessions for audio transmission.
|
|
40
|
+
*
|
|
41
|
+
* UDP Example:
|
|
42
|
+
* const server = new SIPAgentServer({
|
|
43
|
+
* transport: 'udp',
|
|
44
|
+
* localAddress: '10.0.0.5',
|
|
45
|
+
* sipPort: 5060,
|
|
46
|
+
* rtpPortStart: 10000,
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
*/
|
|
50
|
+
export class SIPAgentServer {
|
|
51
|
+
options;
|
|
52
|
+
sessionManager = new SessionManager();
|
|
53
|
+
callHandler = null;
|
|
54
|
+
signaling;
|
|
55
|
+
nextRtpPort;
|
|
56
|
+
activeTransports = new Map();
|
|
57
|
+
transportType;
|
|
58
|
+
activeVoiceSessions = new Map();
|
|
59
|
+
constructor(options) {
|
|
60
|
+
this.options = options;
|
|
61
|
+
this.transportType = options.transport ?? 'udp';
|
|
62
|
+
this.nextRtpPort = options.rtpPortStart ?? 10000;
|
|
63
|
+
if (this.transportType === 'websocket') {
|
|
64
|
+
throw new Error('[SIPAgentServer] WebSocket SIP signaling was moved to @ariaflow/livekit-plugin-transport-sip-jssip. ' +
|
|
65
|
+
'Use transport: "udp" in this package for RTP telephony.');
|
|
66
|
+
}
|
|
67
|
+
this.signaling = new SIPSignaling(options);
|
|
68
|
+
}
|
|
69
|
+
onCall(handler) {
|
|
70
|
+
this.callHandler = handler;
|
|
71
|
+
}
|
|
72
|
+
async startSession(callId, voiceSession) {
|
|
73
|
+
const transport = this.activeTransports.get(callId);
|
|
74
|
+
if (!transport) {
|
|
75
|
+
throw new Error(`Transport not found for call: ${callId}`);
|
|
76
|
+
}
|
|
77
|
+
const agentSession = await this.sessionManager.startSession(transport, voiceSession);
|
|
78
|
+
this.activeVoiceSessions.set(callId, voiceSession);
|
|
79
|
+
return agentSession;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Allocate a local RTP port and create a transport adapter.
|
|
83
|
+
* This is called internally when a SIP INVITE is received.
|
|
84
|
+
*/
|
|
85
|
+
createTransport(callId, rtpPort, remoteSdp, negotiatedCodec) {
|
|
86
|
+
const rtpSession = new RtpSession(negotiatedCodec, {
|
|
87
|
+
localPort: rtpPort,
|
|
88
|
+
continuousPacing: this.options.continuousPacing === true,
|
|
89
|
+
});
|
|
90
|
+
// Parse the remote SDP to extract RTP endpoint so the agent can
|
|
91
|
+
// send audio before the remote sends first (e.g., greeting).
|
|
92
|
+
const remoteEndpoint = parseSdpRemoteEndpoint(remoteSdp);
|
|
93
|
+
if (remoteEndpoint) {
|
|
94
|
+
rtpSession.setRemote(remoteEndpoint.host, remoteEndpoint.port);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.warn(`[SIPAgentServer] Could not parse remote RTP endpoint from SDP for call ${callId}. ` +
|
|
98
|
+
'Agent-initiated audio will not work until the remote sends first.');
|
|
99
|
+
}
|
|
100
|
+
return new SIPTransportAdapter(rtpSession, negotiatedCodec, {
|
|
101
|
+
id: callId,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Start listening for SIP INVITE requests.
|
|
106
|
+
*
|
|
107
|
+
* For UDP transport: Binds UDP socket and listens for SIP messages.
|
|
108
|
+
* For WebSocket transport: Connects to WebSocket server and listens for SIP messages.
|
|
109
|
+
*/
|
|
110
|
+
async listen() {
|
|
111
|
+
const transportName = this.transportType === 'websocket' ? 'WebSocket' : 'UDP';
|
|
112
|
+
console.log(`[SIPAgentServer] Starting SIP server using ${transportName} transport`);
|
|
113
|
+
await this.signaling.start(async (callId, remoteSdp, rtpPort, negotiatedCodec) => {
|
|
114
|
+
console.log(`[SIPAgentServer] Creating transport for call: ${callId} on RTP port ${rtpPort}`);
|
|
115
|
+
// Create transport with the allocated RTP port and remote SDP
|
|
116
|
+
const transport = this.createTransport(callId, rtpPort, remoteSdp, negotiatedCodec);
|
|
117
|
+
this.activeTransports.set(callId, transport);
|
|
118
|
+
// Invoke the call handler
|
|
119
|
+
if (this.callHandler) {
|
|
120
|
+
try {
|
|
121
|
+
await this.callHandler(transport, callId);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error(`[SIPAgentServer] Error in call handler for ${callId}:`, error);
|
|
125
|
+
this.activeTransports.delete(callId);
|
|
126
|
+
await transport.close();
|
|
127
|
+
this.activeVoiceSessions.delete(callId);
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}, async (callId) => {
|
|
132
|
+
// Handle BYE from remote party
|
|
133
|
+
console.log(`[SIPAgentServer] Remote party hung up call: ${callId}`);
|
|
134
|
+
const transport = this.activeTransports.get(callId);
|
|
135
|
+
if (transport) {
|
|
136
|
+
await transport.close();
|
|
137
|
+
this.activeTransports.delete(callId);
|
|
138
|
+
}
|
|
139
|
+
const voiceSession = this.activeVoiceSessions.get(callId);
|
|
140
|
+
if (voiceSession) {
|
|
141
|
+
await voiceSession.close();
|
|
142
|
+
this.activeVoiceSessions.delete(callId);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
console.log(`[SIPAgentServer] Listening for calls (${transportName})`);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Hang up an active call.
|
|
149
|
+
*/
|
|
150
|
+
async hangup(callId) {
|
|
151
|
+
const transport = this.activeTransports.get(callId);
|
|
152
|
+
if (transport) {
|
|
153
|
+
await transport.close();
|
|
154
|
+
this.activeTransports.delete(callId);
|
|
155
|
+
}
|
|
156
|
+
const voiceSession = this.activeVoiceSessions.get(callId);
|
|
157
|
+
if (voiceSession) {
|
|
158
|
+
await voiceSession.close();
|
|
159
|
+
this.activeVoiceSessions.delete(callId);
|
|
160
|
+
}
|
|
161
|
+
await this.signaling.hangup(callId);
|
|
162
|
+
}
|
|
163
|
+
get sessions() {
|
|
164
|
+
return this.sessionManager;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get the RTP port for a specific call.
|
|
168
|
+
*/
|
|
169
|
+
getRtpPort(callId) {
|
|
170
|
+
return this.signaling.getRtpPort?.(callId);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* SIP trunk server is connectionless once listening on UDP.
|
|
174
|
+
*/
|
|
175
|
+
get isRegistered() {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* SIP trunk server status.
|
|
180
|
+
*/
|
|
181
|
+
get status() {
|
|
182
|
+
return 'connected';
|
|
183
|
+
}
|
|
184
|
+
async close() {
|
|
185
|
+
// Close all active voice sessions
|
|
186
|
+
const voiceSessionPromises = Array.from(this.activeVoiceSessions.values()).map((s) => s.close());
|
|
187
|
+
await Promise.allSettled(voiceSessionPromises);
|
|
188
|
+
this.activeVoiceSessions.clear();
|
|
189
|
+
// Close all active transports
|
|
190
|
+
const closePromises = Array.from(this.activeTransports.values()).map((t) => t.close());
|
|
191
|
+
await Promise.allSettled(closePromises);
|
|
192
|
+
this.activeTransports.clear();
|
|
193
|
+
await this.sessionManager.closeAll();
|
|
194
|
+
await this.signaling.stop();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SIP signaling implementation using node.js-sip as a parser/transport shim.
|
|
3
|
+
*
|
|
4
|
+
* We intentionally construct server-side SIP responses and in-dialog requests
|
|
5
|
+
* ourselves rather than relying on node.js-sip's higher-level UAS helpers.
|
|
6
|
+
* Those helpers assume a different server/auth flow than this package uses,
|
|
7
|
+
* while this transport needs explicit control over provisional responses,
|
|
8
|
+
* pending INVITE cancellation, and dialog-correct BYE generation.
|
|
9
|
+
*/
|
|
10
|
+
import type { Codec } from '@ariaflow/livekit-plugin/codec/g711';
|
|
11
|
+
import type { SIPServerOptions } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Callback for incoming INVITE requests.
|
|
14
|
+
*
|
|
15
|
+
* The callback must finish transport/session bootstrap before the final 200 OK
|
|
16
|
+
* is emitted. Throwing rejects the INVITE with a 500 response.
|
|
17
|
+
*/
|
|
18
|
+
export type OnInviteCallback = (callId: string, remoteSdp: string, rtpPort: number, negotiatedCodec: Codec) => void | Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Callback for call termination (remote BYE, local CANCEL unwind, etc.).
|
|
21
|
+
*/
|
|
22
|
+
export type OnByeCallback = (callId: string) => void | Promise<void>;
|
|
23
|
+
export declare class SIPSignaling {
|
|
24
|
+
private options;
|
|
25
|
+
private voip;
|
|
26
|
+
private activeCalls;
|
|
27
|
+
private pendingInvites;
|
|
28
|
+
private nextRtpPort;
|
|
29
|
+
private localAddress;
|
|
30
|
+
private localPort;
|
|
31
|
+
private g711Preferred;
|
|
32
|
+
private ready;
|
|
33
|
+
private readyResolve;
|
|
34
|
+
private transportMessageListener;
|
|
35
|
+
private static readonly MIN_RTP_PORT;
|
|
36
|
+
private static readonly MAX_RTP_PORT;
|
|
37
|
+
private onInviteCallback;
|
|
38
|
+
private onByeCallback;
|
|
39
|
+
constructor(options: SIPServerOptions);
|
|
40
|
+
start(onInvite: OnInviteCallback, onBye?: OnByeCallback): Promise<void>;
|
|
41
|
+
private handleTransportMessage;
|
|
42
|
+
private handleInviteRequest;
|
|
43
|
+
private handleByeRequest;
|
|
44
|
+
private handleCancelRequest;
|
|
45
|
+
private handleOptionsRequest;
|
|
46
|
+
private handleRegisterRequest;
|
|
47
|
+
hangup(callId: string): Promise<void>;
|
|
48
|
+
stop(): Promise<void>;
|
|
49
|
+
getRtpPort(callId: string): number | undefined;
|
|
50
|
+
private sendResponse;
|
|
51
|
+
private buildResponseMessage;
|
|
52
|
+
private buildRequestMessage;
|
|
53
|
+
private sendToPeer;
|
|
54
|
+
private allocateRtpPort;
|
|
55
|
+
private parseHeaders;
|
|
56
|
+
private isSocketBound;
|
|
57
|
+
private getResponseTarget;
|
|
58
|
+
private extractCallId;
|
|
59
|
+
private extractCseq;
|
|
60
|
+
private buildLocalUri;
|
|
61
|
+
private buildLocalContactUri;
|
|
62
|
+
private extractRemoteUri;
|
|
63
|
+
private extractRemoteTargetUri;
|
|
64
|
+
private buildFallbackRemoteUri;
|
|
65
|
+
private extractHeaderUri;
|
|
66
|
+
private normalizeSipUri;
|
|
67
|
+
private buildAddressHeader;
|
|
68
|
+
private ensureTag;
|
|
69
|
+
private toPort;
|
|
70
|
+
private generateTag;
|
|
71
|
+
private generateBranch;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=sip_signaling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sip_signaling.d.ts","sourceRoot":"","sources":["../src/sip_signaling.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA2GnD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,KAAK,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE,qBAAa,YAAY;IAoBX,OAAO,CAAC,OAAO;IAnB3B,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,wBAAwB,CAEhB;IAEhB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAS;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAS;IAE7C,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,aAAa,CAA2B;gBAE5B,OAAO,EAAE,gBAAgB;IAcvC,KAAK,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAmE/D,sBAAsB;YA0CtB,mBAAmB;YA8GnB,gBAAgB;YA2BhB,mBAAmB;IAyCjC,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,qBAAqB;IAcvB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC3B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C,OAAO,CAAC,YAAY;IA4CpB,OAAO,CAAC,oBAAoB;IA6C5B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,cAAc;CAGvB"}
|