@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.
Files changed (58) hide show
  1. package/README.md +22 -0
  2. package/dist/audio_input.d.ts +24 -0
  3. package/dist/audio_input.d.ts.map +1 -0
  4. package/dist/audio_input.js +58 -0
  5. package/dist/audio_input.js.map +1 -0
  6. package/dist/audio_output.d.ts +34 -0
  7. package/dist/audio_output.d.ts.map +1 -0
  8. package/dist/audio_output.js +133 -0
  9. package/dist/audio_output.js.map +1 -0
  10. package/dist/codec/g711.d.ts +17 -0
  11. package/dist/codec/g711.d.ts.map +1 -0
  12. package/dist/codec/g711.js +123 -0
  13. package/dist/codec/g711.js.map +1 -0
  14. package/dist/index.d.ts +12 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +11 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/jssip_signaling.d.ts +76 -0
  19. package/dist/jssip_signaling.d.ts.map +1 -0
  20. package/dist/jssip_signaling.js +255 -0
  21. package/dist/jssip_signaling.js.map +1 -0
  22. package/dist/rtp/jitter_buffer.d.ts +19 -0
  23. package/dist/rtp/jitter_buffer.d.ts.map +1 -0
  24. package/dist/rtp/jitter_buffer.js +51 -0
  25. package/dist/rtp/jitter_buffer.js.map +1 -0
  26. package/dist/rtp/rtp_packet.d.ts +23 -0
  27. package/dist/rtp/rtp_packet.d.ts.map +1 -0
  28. package/dist/rtp/rtp_packet.js +63 -0
  29. package/dist/rtp/rtp_packet.js.map +1 -0
  30. package/dist/rtp/rtp_session.d.ts +54 -0
  31. package/dist/rtp/rtp_session.d.ts.map +1 -0
  32. package/dist/rtp/rtp_session.js +162 -0
  33. package/dist/rtp/rtp_session.js.map +1 -0
  34. package/dist/sdp_g711.d.ts +18 -0
  35. package/dist/sdp_g711.d.ts.map +1 -0
  36. package/dist/sdp_g711.js +74 -0
  37. package/dist/sdp_g711.js.map +1 -0
  38. package/dist/server.d.ts +76 -0
  39. package/dist/server.d.ts.map +1 -0
  40. package/dist/server.js +197 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/sip_signaling.d.ts +73 -0
  43. package/dist/sip_signaling.d.ts.map +1 -0
  44. package/dist/sip_signaling.js +553 -0
  45. package/dist/sip_signaling.js.map +1 -0
  46. package/dist/text_output.d.ts +16 -0
  47. package/dist/text_output.d.ts.map +1 -0
  48. package/dist/text_output.js +35 -0
  49. package/dist/text_output.js.map +1 -0
  50. package/dist/transport_adapter.d.ts +22 -0
  51. package/dist/transport_adapter.d.ts.map +1 -0
  52. package/dist/transport_adapter.js +44 -0
  53. package/dist/transport_adapter.js.map +1 -0
  54. package/dist/types.d.ts +46 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +34 -0
@@ -0,0 +1,553 @@
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 { createRequire } from 'node:module';
11
+ import { buildG711SdpAnswer, negotiateG711FromRemoteOffer, } from './sdp_g711.js';
12
+ const require = createRequire(import.meta.url);
13
+ const VOIP = require('node.js-sip');
14
+ const SIP = require('node.js-sip/SIP/index.js');
15
+ const DEFAULT_SIP_PORT = 5060;
16
+ const USER_AGENT = 'ariaflow-sip';
17
+ const ALLOW_METHODS = 'INVITE, ACK, BYE, CANCEL, OPTIONS';
18
+ export class SIPSignaling {
19
+ options;
20
+ voip = null;
21
+ activeCalls = new Map();
22
+ pendingInvites = new Map();
23
+ nextRtpPort;
24
+ localAddress;
25
+ localPort;
26
+ g711Preferred;
27
+ ready = false;
28
+ readyResolve = null;
29
+ transportMessageListener = null;
30
+ static MIN_RTP_PORT = 10000;
31
+ static MAX_RTP_PORT = 60000;
32
+ onInviteCallback = () => { };
33
+ onByeCallback = () => { };
34
+ constructor(options) {
35
+ this.options = options;
36
+ this.localAddress = options.localAddress;
37
+ this.localPort = options.sipPort ?? DEFAULT_SIP_PORT;
38
+ this.nextRtpPort = options.rtpPortStart ?? 10000;
39
+ this.g711Preferred = options.codec === 'PCMA' ? 'PCMA' : 'PCMU';
40
+ if (options.sipProtocol && options.sipProtocol !== 'udp') {
41
+ throw new Error(`[SIPSignaling] sipProtocol="${options.sipProtocol}" is not supported. ` +
42
+ 'This transport currently supports UDP only.');
43
+ }
44
+ }
45
+ async start(onInvite, onBye) {
46
+ this.onInviteCallback = onInvite;
47
+ this.onByeCallback = onBye ?? (() => { });
48
+ return new Promise((resolve, reject) => {
49
+ const readyTimeout = setTimeout(() => {
50
+ reject(new Error(`[SIPSignaling] Server did not become ready within 10 seconds on ` +
51
+ `${this.localAddress}:${this.localPort}`));
52
+ }, 10_000);
53
+ this.readyResolve = () => {
54
+ clearTimeout(readyTimeout);
55
+ resolve();
56
+ };
57
+ try {
58
+ this.voip = new VOIP({
59
+ type: 'server',
60
+ transport: {
61
+ type: 'UDP',
62
+ port: this.localPort,
63
+ },
64
+ }, (data) => {
65
+ if (data.type === 'UAS_READY') {
66
+ console.log(`[SIPSignaling] UAS_READY - Server ready on ${this.localAddress}:${this.localPort}`);
67
+ }
68
+ });
69
+ if (this.voip?.transport?.socket?.on) {
70
+ const socket = this.voip.transport.socket;
71
+ const markReady = () => {
72
+ if (this.ready)
73
+ return;
74
+ this.ready = true;
75
+ this.readyResolve?.();
76
+ this.readyResolve = null;
77
+ };
78
+ if (this.isSocketBound(socket)) {
79
+ markReady();
80
+ }
81
+ else {
82
+ socket.once('listening', markReady);
83
+ }
84
+ this.transportMessageListener = (msg, rinfo) => {
85
+ this.handleTransportMessage(msg.toString(), rinfo).catch((error) => {
86
+ console.error('[SIPSignaling] Unhandled SIP transport error:', error);
87
+ });
88
+ };
89
+ socket.on('message', this.transportMessageListener);
90
+ }
91
+ }
92
+ catch (error) {
93
+ clearTimeout(readyTimeout);
94
+ this.readyResolve = null;
95
+ console.error('[SIPSignaling] Error starting VOIP server:', error);
96
+ reject(error);
97
+ }
98
+ });
99
+ }
100
+ async handleTransportMessage(rawMessage, rinfo) {
101
+ const message = SIP.Parser.parse(rawMessage);
102
+ if (!message?.headers) {
103
+ return;
104
+ }
105
+ const callId = this.extractCallId(message);
106
+ const method = message.method?.toUpperCase();
107
+ switch (method) {
108
+ case 'INVITE':
109
+ await this.handleInviteRequest(message, callId, rinfo);
110
+ return;
111
+ case 'BYE':
112
+ await this.handleByeRequest(message, callId, rinfo);
113
+ return;
114
+ case 'CANCEL':
115
+ await this.handleCancelRequest(message, callId, rinfo);
116
+ return;
117
+ case 'OPTIONS':
118
+ this.handleOptionsRequest(message, rinfo);
119
+ return;
120
+ case 'ACK':
121
+ console.log(`[SIPSignaling] ACK received for call: ${callId}`);
122
+ return;
123
+ case 'REGISTER':
124
+ this.handleRegisterRequest(message, rinfo);
125
+ return;
126
+ default:
127
+ console.log(`[SIPSignaling] Event: ${method ?? 'UNKNOWN'}`);
128
+ return;
129
+ }
130
+ }
131
+ async handleInviteRequest(message, callId, rinfo) {
132
+ const parsedHeaders = this.parseHeaders(message.headers);
133
+ const responseTarget = this.getResponseTarget(parsedHeaders, rinfo);
134
+ if (!responseTarget) {
135
+ console.warn(`[SIPSignaling] INVITE ${callId} missing routable response target; rejecting`);
136
+ this.sendResponse(message, parsedHeaders, 400, 'Bad Request');
137
+ return;
138
+ }
139
+ if (this.activeCalls.has(callId) || this.pendingInvites.has(callId)) {
140
+ console.warn(`[SIPSignaling] Call ${callId} already exists, sending 486 Busy Here`);
141
+ this.sendResponse(message, parsedHeaders, 486, 'Busy Here');
142
+ return;
143
+ }
144
+ const remoteSdp = message.body || '';
145
+ const negotiatedCodec = negotiateG711FromRemoteOffer(remoteSdp, this.g711Preferred);
146
+ const rtpPort = this.allocateRtpPort();
147
+ const localTag = this.generateTag();
148
+ const localUri = this.buildLocalUri(parsedHeaders, message);
149
+ const localContactUri = this.buildLocalContactUri(parsedHeaders);
150
+ const remoteUri = this.extractRemoteUri(message.headers, parsedHeaders);
151
+ const remoteTargetUri = this.extractRemoteTargetUri(message.headers, parsedHeaders);
152
+ const inviteCseq = this.extractCseq(parsedHeaders);
153
+ const pending = {
154
+ callId,
155
+ rtpPort,
156
+ localTag,
157
+ localUri,
158
+ localContactUri,
159
+ remoteUri,
160
+ remoteTargetUri,
161
+ responseHost: responseTarget.host,
162
+ responsePort: responseTarget.port,
163
+ inviteCseq,
164
+ nextLocalCseq: 0,
165
+ rawHeaders: message.headers,
166
+ canceled: false,
167
+ };
168
+ this.pendingInvites.set(callId, pending);
169
+ const sdpAnswer = buildG711SdpAnswer(this.localAddress, rtpPort, negotiatedCodec).replace(/^[ \t]+/gm, '');
170
+ console.log(`[SIPSignaling] Received INVITE for call: ${callId}`);
171
+ this.sendResponse(message, parsedHeaders, 100, 'Trying');
172
+ this.sendResponse(message, parsedHeaders, 180, 'Ringing', {
173
+ toHeader: this.ensureTag(message.headers.To ?? '', localTag),
174
+ });
175
+ try {
176
+ await this.onInviteCallback(callId, remoteSdp, rtpPort, negotiatedCodec);
177
+ }
178
+ catch (error) {
179
+ this.pendingInvites.delete(callId);
180
+ this.sendResponse(message, parsedHeaders, 500, 'Server Internal Error', {
181
+ toHeader: this.ensureTag(message.headers.To ?? '', localTag),
182
+ });
183
+ throw error;
184
+ }
185
+ const current = this.pendingInvites.get(callId);
186
+ if (!current || current.canceled) {
187
+ if (!current) {
188
+ return;
189
+ }
190
+ this.pendingInvites.delete(callId);
191
+ return;
192
+ }
193
+ this.sendResponse(message, parsedHeaders, 200, 'OK', {
194
+ body: sdpAnswer,
195
+ toHeader: this.ensureTag(message.headers.To ?? '', localTag),
196
+ contactUri: localContactUri,
197
+ });
198
+ this.activeCalls.set(callId, {
199
+ callId,
200
+ rtpPort,
201
+ localTag,
202
+ remoteTag: parsedHeaders.From?.tag ?? '',
203
+ localUri,
204
+ localContactUri,
205
+ remoteUri,
206
+ remoteTargetUri,
207
+ responseHost: responseTarget.host,
208
+ responsePort: responseTarget.port,
209
+ nextLocalCseq: current.nextLocalCseq,
210
+ });
211
+ this.pendingInvites.delete(callId);
212
+ }
213
+ async handleByeRequest(message, callId, rinfo) {
214
+ const parsedHeaders = this.parseHeaders(message.headers);
215
+ console.log(`[SIPSignaling] Received BYE for call: ${callId}`);
216
+ const call = this.activeCalls.get(callId);
217
+ if (!call) {
218
+ console.warn(`[SIPSignaling] Received BYE for unknown call: ${callId}`);
219
+ this.sendResponse(message, parsedHeaders, 481, 'Call/Transaction Does Not Exist', {
220
+ targetHost: rinfo?.address,
221
+ targetPort: rinfo?.port,
222
+ });
223
+ return;
224
+ }
225
+ this.sendResponse(message, parsedHeaders, 200, 'OK', {
226
+ targetHost: rinfo?.address,
227
+ targetPort: rinfo?.port,
228
+ });
229
+ this.activeCalls.delete(callId);
230
+ await this.onByeCallback(callId);
231
+ }
232
+ async handleCancelRequest(message, callId, rinfo) {
233
+ const parsedHeaders = this.parseHeaders(message.headers);
234
+ const pending = this.pendingInvites.get(callId);
235
+ this.sendResponse(message, parsedHeaders, 200, 'OK', {
236
+ targetHost: rinfo?.address,
237
+ targetPort: rinfo?.port,
238
+ });
239
+ if (!pending) {
240
+ console.warn(`[SIPSignaling] CANCEL for unknown or established call: ${callId}`);
241
+ return;
242
+ }
243
+ pending.canceled = true;
244
+ this.pendingInvites.delete(callId);
245
+ const inviteParsed = this.parseHeaders(pending.rawHeaders);
246
+ this.sendResponse({
247
+ headers: pending.rawHeaders,
248
+ body: '',
249
+ }, inviteParsed, 487, 'Request Terminated', {
250
+ toHeader: this.ensureTag(pending.rawHeaders.To ?? '', pending.localTag),
251
+ targetHost: pending.responseHost,
252
+ targetPort: pending.responsePort,
253
+ contactUri: pending.localContactUri,
254
+ });
255
+ await this.onByeCallback(callId);
256
+ }
257
+ handleOptionsRequest(message, rinfo) {
258
+ const parsedHeaders = this.parseHeaders(message.headers);
259
+ this.sendResponse(message, parsedHeaders, 200, 'OK', {
260
+ headers: {
261
+ Allow: ALLOW_METHODS,
262
+ Accept: 'application/sdp',
263
+ },
264
+ targetHost: rinfo?.address,
265
+ targetPort: rinfo?.port,
266
+ });
267
+ }
268
+ handleRegisterRequest(message, rinfo) {
269
+ const parsedHeaders = this.parseHeaders(message.headers);
270
+ this.sendResponse(message, parsedHeaders, 405, 'Method Not Allowed', {
271
+ headers: {
272
+ Allow: ALLOW_METHODS,
273
+ },
274
+ targetHost: rinfo?.address,
275
+ targetPort: rinfo?.port,
276
+ });
277
+ }
278
+ async hangup(callId) {
279
+ const call = this.activeCalls.get(callId);
280
+ if (!call) {
281
+ console.warn(`[SIPSignaling] No active call: ${callId}`);
282
+ return;
283
+ }
284
+ call.nextLocalCseq += 1;
285
+ const branch = this.generateBranch();
286
+ const bye = this.buildRequestMessage({
287
+ method: 'BYE',
288
+ requestUri: call.remoteTargetUri,
289
+ headers: {
290
+ Via: `SIP/2.0/UDP ${this.localAddress}:${this.localPort};branch=${branch};rport`,
291
+ To: this.buildAddressHeader(call.remoteUri, call.remoteTag || undefined),
292
+ From: this.buildAddressHeader(call.localUri, call.localTag),
293
+ 'Call-ID': callId,
294
+ CSeq: `${call.nextLocalCseq} BYE`,
295
+ Contact: `<${call.localContactUri}>`,
296
+ 'Max-Forwards': '70',
297
+ 'User-Agent': USER_AGENT,
298
+ Allow: ALLOW_METHODS,
299
+ 'Content-Length': '0',
300
+ },
301
+ body: '',
302
+ });
303
+ this.sendToPeer(bye, call.responseHost, call.responsePort);
304
+ this.activeCalls.delete(callId);
305
+ console.log(`[SIPSignaling] Sent BYE for call: ${callId}`);
306
+ }
307
+ async stop() {
308
+ if (this.voip) {
309
+ for (const callId of this.activeCalls.keys()) {
310
+ try {
311
+ await this.hangup(callId);
312
+ }
313
+ catch (error) {
314
+ console.error(`[SIPSignaling] Error hanging up ${callId} during shutdown:`, error);
315
+ }
316
+ }
317
+ const transportSocket = this.voip.transport?.socket;
318
+ if (this.transportMessageListener &&
319
+ transportSocket &&
320
+ typeof transportSocket.off === 'function') {
321
+ transportSocket.off('message', this.transportMessageListener);
322
+ this.transportMessageListener = null;
323
+ }
324
+ if (transportSocket && typeof transportSocket.close === 'function') {
325
+ try {
326
+ transportSocket.close();
327
+ }
328
+ catch (error) {
329
+ console.error('[SIPSignaling] Error closing SIP transport socket:', error);
330
+ }
331
+ }
332
+ this.voip = null;
333
+ }
334
+ this.activeCalls.clear();
335
+ this.pendingInvites.clear();
336
+ this.ready = false;
337
+ console.log('[SIPSignaling] Stopped');
338
+ }
339
+ getRtpPort(callId) {
340
+ return this.activeCalls.get(callId)?.rtpPort ?? this.pendingInvites.get(callId)?.rtpPort;
341
+ }
342
+ sendResponse(message, parsedHeaders, statusCode, statusText, options) {
343
+ const responseTarget = options?.targetHost && options?.targetPort
344
+ ? { host: options.targetHost, port: options.targetPort }
345
+ : this.getResponseTarget(parsedHeaders);
346
+ if (!responseTarget) {
347
+ console.warn(`[SIPSignaling] Cannot send ${statusCode} ${statusText}; missing response target`);
348
+ return;
349
+ }
350
+ const body = options?.body ?? '';
351
+ const wire = this.buildResponseMessage({
352
+ statusCode,
353
+ statusText,
354
+ rawHeaders: message.headers,
355
+ parsedHeaders,
356
+ body,
357
+ toHeader: options?.toHeader ??
358
+ message.headers.To ??
359
+ this.buildAddressHeader(this.buildLocalUri(parsedHeaders, message)),
360
+ contactUri: options?.contactUri,
361
+ extraHeaders: options?.headers,
362
+ });
363
+ this.sendToPeer(wire, responseTarget.host, responseTarget.port);
364
+ }
365
+ buildResponseMessage(args) {
366
+ const headers = {
367
+ Via: args.rawHeaders.Via ?? '',
368
+ To: args.toHeader,
369
+ From: args.rawHeaders.From ?? '',
370
+ 'Call-ID': args.rawHeaders['Call-ID'] ?? '',
371
+ CSeq: args.rawHeaders.CSeq ?? '',
372
+ Contact: `<${args.contactUri ?? this.buildLocalContactUri(args.parsedHeaders)}>`,
373
+ 'Max-Forwards': '70',
374
+ 'User-Agent': USER_AGENT,
375
+ Allow: ALLOW_METHODS,
376
+ };
377
+ if (args.extraHeaders) {
378
+ for (const [key, value] of Object.entries(args.extraHeaders)) {
379
+ headers[key] = value;
380
+ }
381
+ }
382
+ if (args.body) {
383
+ headers['Content-Type'] = 'application/sdp';
384
+ headers['Content-Length'] = String(args.body.length);
385
+ }
386
+ else {
387
+ headers['Content-Length'] = '0';
388
+ }
389
+ return {
390
+ isResponse: true,
391
+ protocol: 'SIP/2.0',
392
+ statusCode: args.statusCode,
393
+ statusText: args.statusText,
394
+ headers,
395
+ body: args.body,
396
+ };
397
+ }
398
+ buildRequestMessage(args) {
399
+ return {
400
+ isResponse: false,
401
+ protocol: 'SIP/2.0',
402
+ method: args.method,
403
+ requestUri: args.requestUri,
404
+ headers: args.headers,
405
+ body: args.body,
406
+ };
407
+ }
408
+ sendToPeer(message, host, port) {
409
+ if (!this.voip?.transport?.send) {
410
+ throw new Error('[SIPSignaling] transport.send is unavailable');
411
+ }
412
+ const built = SIP.Builder.Build(message);
413
+ this.voip.transport.send(built, host, port);
414
+ }
415
+ allocateRtpPort() {
416
+ const rtpPort = this.nextRtpPort;
417
+ this.nextRtpPort += 2;
418
+ if (this.nextRtpPort >= SIPSignaling.MAX_RTP_PORT) {
419
+ this.nextRtpPort = SIPSignaling.MIN_RTP_PORT;
420
+ console.warn('[SIPSignaling] RTP port range exhausted, wrapping around to', this.nextRtpPort);
421
+ }
422
+ return rtpPort;
423
+ }
424
+ parseHeaders(headers) {
425
+ return SIP.Parser.ParseHeaders(headers);
426
+ }
427
+ isSocketBound(socket) {
428
+ if (typeof socket.address !== 'function') {
429
+ return false;
430
+ }
431
+ try {
432
+ socket.address();
433
+ return true;
434
+ }
435
+ catch {
436
+ return false;
437
+ }
438
+ }
439
+ getResponseTarget(parsedHeaders, rinfo) {
440
+ if (rinfo?.address && rinfo?.port) {
441
+ return { host: rinfo.address, port: rinfo.port };
442
+ }
443
+ const contactHost = parsedHeaders.Contact?.contact?.ip;
444
+ const contactPort = this.toPort(parsedHeaders.Contact?.contact?.port);
445
+ if (contactHost && contactPort) {
446
+ return { host: contactHost, port: contactPort };
447
+ }
448
+ const viaHost = parsedHeaders.Via?.uri?.ip;
449
+ const viaPort = this.toPort(parsedHeaders.Via?.uri?.port) ?? DEFAULT_SIP_PORT;
450
+ if (viaHost) {
451
+ return { host: viaHost, port: viaPort };
452
+ }
453
+ return null;
454
+ }
455
+ extractCallId(message) {
456
+ if (message.callId)
457
+ return message.callId;
458
+ if (typeof message.headers['Call-ID'] === 'string')
459
+ return message.headers['Call-ID'];
460
+ const parsedHeaders = this.parseHeaders(message.headers);
461
+ if (parsedHeaders['Call-ID'])
462
+ return parsedHeaders['Call-ID'];
463
+ return `call-${Date.now()}`;
464
+ }
465
+ extractCseq(parsedHeaders) {
466
+ const count = parsedHeaders.CSeq?.count;
467
+ if (typeof count === 'number')
468
+ return count;
469
+ if (typeof count === 'string') {
470
+ const parsed = parseInt(count, 10);
471
+ if (!Number.isNaN(parsed))
472
+ return parsed;
473
+ }
474
+ return 0;
475
+ }
476
+ buildLocalUri(parsedHeaders, message) {
477
+ const requestUri = message?.requestUri ??
478
+ this.extractHeaderUri(message?.headers?.To) ??
479
+ undefined;
480
+ if (requestUri) {
481
+ return this.normalizeSipUri(requestUri);
482
+ }
483
+ const user = parsedHeaders.To?.contact?.username ?? 'agent';
484
+ return `sip:${user}@${this.localAddress}`;
485
+ }
486
+ buildLocalContactUri(parsedHeaders) {
487
+ const user = parsedHeaders.To?.contact?.username ?? 'agent';
488
+ return `sip:${user}@${this.localAddress}:${this.localPort}`;
489
+ }
490
+ extractRemoteUri(rawHeaders, parsedHeaders) {
491
+ return (this.normalizeSipUri(this.extractHeaderUri(rawHeaders.From)) ??
492
+ this.buildFallbackRemoteUri(parsedHeaders));
493
+ }
494
+ extractRemoteTargetUri(rawHeaders, parsedHeaders) {
495
+ return (this.normalizeSipUri(this.extractHeaderUri(rawHeaders.Contact)) ??
496
+ this.normalizeSipUri(this.extractHeaderUri(rawHeaders.From)) ??
497
+ this.buildFallbackRemoteUri(parsedHeaders));
498
+ }
499
+ buildFallbackRemoteUri(parsedHeaders) {
500
+ const username = parsedHeaders.From?.contact?.username ?? 'unknown';
501
+ const host = parsedHeaders.Contact?.contact?.ip ?? parsedHeaders.Via?.uri?.ip ?? 'unknown';
502
+ const port = this.toPort(parsedHeaders.Contact?.contact?.port);
503
+ return port ? `sip:${username}@${host}:${port}` : `sip:${username}@${host}`;
504
+ }
505
+ extractHeaderUri(value) {
506
+ if (!value)
507
+ return null;
508
+ const angleMatch = value.match(/<([^>]+)>/);
509
+ if (angleMatch?.[1])
510
+ return angleMatch[1].trim();
511
+ const sipMatch = value.match(/sip:[^;\s]+/i);
512
+ if (sipMatch?.[0])
513
+ return sipMatch[0].trim();
514
+ return null;
515
+ }
516
+ normalizeSipUri(uri) {
517
+ if (!uri) {
518
+ return `sip:unknown@${this.localAddress}`;
519
+ }
520
+ return uri.trim();
521
+ }
522
+ buildAddressHeader(uri, tag) {
523
+ return tag ? `<${uri}>;tag=${tag}` : `<${uri}>`;
524
+ }
525
+ ensureTag(headerValue, tag) {
526
+ if (!headerValue) {
527
+ return this.buildAddressHeader(`sip:agent@${this.localAddress}`, tag);
528
+ }
529
+ if (/(^|;)tag=/i.test(headerValue)) {
530
+ return headerValue;
531
+ }
532
+ return `${headerValue};tag=${tag}`;
533
+ }
534
+ toPort(value) {
535
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
536
+ return value;
537
+ }
538
+ if (typeof value === 'string') {
539
+ const parsed = parseInt(value, 10);
540
+ if (!Number.isNaN(parsed) && parsed > 0) {
541
+ return parsed;
542
+ }
543
+ }
544
+ return null;
545
+ }
546
+ generateTag() {
547
+ return Math.random().toString(36).slice(2, 12);
548
+ }
549
+ generateBranch() {
550
+ return `z9hG4bK${Math.random().toString(36).slice(2, 12)}`;
551
+ }
552
+ }
553
+ //# sourceMappingURL=sip_signaling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sip_signaling.js","sourceRoot":"","sources":["../src/sip_signaling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { TextOutput, type TimedString } from '@ariaflow/livekit-plugin';
2
+ /**
3
+ * Text output for SIP sessions.
4
+ *
5
+ * SIP has no native text channel. This uses a callback pattern so the
6
+ * application can decide how to deliver transcription text (SIP INFO,
7
+ * webhook, parallel WebSocket, or simply discard).
8
+ */
9
+ export declare class SIPTextOutput extends TextOutput {
10
+ private textHandler;
11
+ constructor(nextInChain?: TextOutput);
12
+ onText(handler: (text: string, isFinal: boolean) => void): void;
13
+ captureText(text: string | TimedString): Promise<void>;
14
+ flush(): void;
15
+ }
16
+ //# sourceMappingURL=text_output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text_output.d.ts","sourceRoot":"","sources":["../src/text_output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvF;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAC3C,OAAO,CAAC,WAAW,CAEH;gBAEJ,WAAW,CAAC,EAAE,UAAU;IAIpC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAIzD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,KAAK,IAAI,IAAI;CASd"}
@@ -0,0 +1,35 @@
1
+ import { TextOutput, isTimedString } from '@ariaflow/livekit-plugin';
2
+ /**
3
+ * Text output for SIP sessions.
4
+ *
5
+ * SIP has no native text channel. This uses a callback pattern so the
6
+ * application can decide how to deliver transcription text (SIP INFO,
7
+ * webhook, parallel WebSocket, or simply discard).
8
+ */
9
+ export class SIPTextOutput extends TextOutput {
10
+ textHandler = null;
11
+ constructor(nextInChain) {
12
+ super(nextInChain);
13
+ }
14
+ onText(handler) {
15
+ this.textHandler = handler;
16
+ }
17
+ async captureText(text) {
18
+ const textContent = isTimedString(text) ? text.text : text;
19
+ if (this.textHandler) {
20
+ this.textHandler(textContent, false);
21
+ }
22
+ if (this.nextInChain) {
23
+ await this.nextInChain.captureText(text);
24
+ }
25
+ }
26
+ flush() {
27
+ if (this.textHandler) {
28
+ this.textHandler('', true);
29
+ }
30
+ if (this.nextInChain) {
31
+ this.nextInChain.flush();
32
+ }
33
+ }
34
+ }
35
+ //# sourceMappingURL=text_output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text_output.js","sourceRoot":"","sources":["../src/text_output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAoB,MAAM,0BAA0B,CAAC;AAEvF;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,UAAU;IACnC,WAAW,GAER,IAAI,CAAC;IAEhB,YAAY,WAAwB;QAClC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,OAAiD;QACtD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAA0B;QAC1C,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAO,IAAI,CAAC,WAA0B,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,IAAI,CAAC,WAA0B,CAAC,KAAK,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { TransportAdapter, type TransportAdapterConfig } from '@ariaflow/livekit-plugin';
2
+ import { SIPAudioInput } from './audio_input.js';
3
+ import { SIPAudioOutput } from './audio_output.js';
4
+ import { SIPTextOutput } from './text_output.js';
5
+ import type { RtpSession } from './rtp/rtp_session.js';
6
+ import type { Codec } from '@ariaflow/livekit-plugin/codec/g711';
7
+ export declare class SIPTransportAdapter extends TransportAdapter {
8
+ private rtpSession;
9
+ readonly id: string;
10
+ readonly audioInput: SIPAudioInput;
11
+ readonly audioOutput: SIPAudioOutput;
12
+ readonly textOutput: SIPTextOutput;
13
+ readonly config: TransportAdapterConfig;
14
+ private _isOpen;
15
+ constructor(rtpSession: RtpSession, codec: Codec, options: {
16
+ id: string;
17
+ packetDurationMs?: number;
18
+ });
19
+ get isOpen(): boolean;
20
+ close(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=transport_adapter.d.ts.map