@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
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @ariaflow/livekit-plugin-transport-sip
|
|
2
|
+
|
|
3
|
+
RTP telephony transport for SIP trunk/PBX integrations (UDP signaling + RTP media).
|
|
4
|
+
|
|
5
|
+
Use this package for:
|
|
6
|
+
- 3CX or PBX SIP trunk integrations
|
|
7
|
+
- SIP over UDP RTP telephony calls
|
|
8
|
+
- G.711 media bridging into AriaFlow voice sessions
|
|
9
|
+
|
|
10
|
+
Current signaling scope:
|
|
11
|
+
- Incoming `INVITE`, `ACK`, `BYE`, `CANCEL`, and `OPTIONS`
|
|
12
|
+
- Final `200 OK` only after call bootstrap succeeds
|
|
13
|
+
- Dialog-correct outbound `BYE` generation with preserved Call-ID and tags
|
|
14
|
+
- G.711 `PCMU` and `PCMA` negotiation
|
|
15
|
+
|
|
16
|
+
Current production boundaries:
|
|
17
|
+
- UDP only
|
|
18
|
+
- No `re-INVITE`, hold/resume, `PRACK`, `REFER`, SRTP, or RTCP yet
|
|
19
|
+
- Best suited today for controlled PBX/SBC deployments rather than arbitrary internet SIP peers
|
|
20
|
+
|
|
21
|
+
For SIP over WebSocket/WebRTC signaling, use:
|
|
22
|
+
- `@ariaflow/livekit-plugin-transport-sip-jssip`
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AudioInput } from '@ariaflow/livekit-plugin';
|
|
2
|
+
import type { RtpSession } from './rtp/rtp_session.js';
|
|
3
|
+
/**
|
|
4
|
+
* Receives audio from an RTP stream and provides it as a
|
|
5
|
+
* ReadableStream<AudioFrame> for the STT pipeline.
|
|
6
|
+
*
|
|
7
|
+
* RTP delivers G.711 at 8kHz. After decode, we upsample to 16kHz
|
|
8
|
+
* to match GeminiLiveSTT's default sample rate expectation.
|
|
9
|
+
*
|
|
10
|
+
* The resampler is allocated once and reused across all frames
|
|
11
|
+
* for the lifetime of this input (Sox sinc via local Rust FFI).
|
|
12
|
+
*/
|
|
13
|
+
export declare class SIPAudioInput extends AudioInput {
|
|
14
|
+
private rtpSession;
|
|
15
|
+
private writer;
|
|
16
|
+
private closed;
|
|
17
|
+
private numChannels;
|
|
18
|
+
private resampler;
|
|
19
|
+
constructor(rtpSession: RtpSession, sampleRate?: number, numChannels?: number);
|
|
20
|
+
private startStream;
|
|
21
|
+
private setupListener;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=audio_input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio_input.d.ts","sourceRoot":"","sources":["../src/audio_input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAc,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD;;;;;;;;;GASG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAOzC,OAAO,CAAC,UAAU;IANpB,OAAO,CAAC,MAAM,CAAwD;IACtE,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAqD;gBAG5D,UAAU,EAAE,UAAU,EAC9B,UAAU,GAAE,MAAwB,EACpC,WAAW,GAAE,MAAU;IASzB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,aAAa;IAiBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAc7B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { AudioInput, AudioFrame } from '@ariaflow/livekit-plugin';
|
|
2
|
+
import { createResampler } from '@ariaflow/livekit-plugin/utils/resample';
|
|
3
|
+
import { TransformStream } from 'node:stream/web';
|
|
4
|
+
const RTP_SAMPLE_RATE = 8000;
|
|
5
|
+
const STT_SAMPLE_RATE = 16000;
|
|
6
|
+
/**
|
|
7
|
+
* Receives audio from an RTP stream and provides it as a
|
|
8
|
+
* ReadableStream<AudioFrame> for the STT pipeline.
|
|
9
|
+
*
|
|
10
|
+
* RTP delivers G.711 at 8kHz. After decode, we upsample to 16kHz
|
|
11
|
+
* to match GeminiLiveSTT's default sample rate expectation.
|
|
12
|
+
*
|
|
13
|
+
* The resampler is allocated once and reused across all frames
|
|
14
|
+
* for the lifetime of this input (Sox sinc via local Rust FFI).
|
|
15
|
+
*/
|
|
16
|
+
export class SIPAudioInput extends AudioInput {
|
|
17
|
+
rtpSession;
|
|
18
|
+
writer = null;
|
|
19
|
+
closed = false;
|
|
20
|
+
numChannels;
|
|
21
|
+
resampler = createResampler(RTP_SAMPLE_RATE, STT_SAMPLE_RATE);
|
|
22
|
+
constructor(rtpSession, sampleRate = RTP_SAMPLE_RATE, numChannels = 1) {
|
|
23
|
+
super();
|
|
24
|
+
this.rtpSession = rtpSession;
|
|
25
|
+
void sampleRate;
|
|
26
|
+
this.numChannels = numChannels;
|
|
27
|
+
this.startStream();
|
|
28
|
+
this.setupListener();
|
|
29
|
+
}
|
|
30
|
+
startStream() {
|
|
31
|
+
const { readable, writable } = new TransformStream();
|
|
32
|
+
this.writer = writable.getWriter();
|
|
33
|
+
this.multiStream.addInputStream(readable);
|
|
34
|
+
}
|
|
35
|
+
setupListener() {
|
|
36
|
+
this.rtpSession.on('audio', (pcm) => {
|
|
37
|
+
if (this.closed || !this.writer)
|
|
38
|
+
return;
|
|
39
|
+
const inputFrame = new AudioFrame(pcm, RTP_SAMPLE_RATE, this.numChannels, pcm.length / this.numChannels);
|
|
40
|
+
for (const frame of this.resampler.push(inputFrame)) {
|
|
41
|
+
this.writer.write(frame).catch(() => { });
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async close() {
|
|
46
|
+
this.closed = true;
|
|
47
|
+
// Flush remaining buffered samples from the resampler
|
|
48
|
+
if (this.writer) {
|
|
49
|
+
for (const frame of this.resampler.flush()) {
|
|
50
|
+
await this.writer.write(frame).catch(() => { });
|
|
51
|
+
}
|
|
52
|
+
await this.writer.close().catch(() => { });
|
|
53
|
+
this.writer = null;
|
|
54
|
+
}
|
|
55
|
+
await super.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=audio_input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio_input.js","sourceRoot":"","sources":["../src/audio_input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B;;;;;;;;;GASG;AACH,MAAM,OAAO,aAAc,SAAQ,UAAU;IAOjC;IANF,MAAM,GAAmD,IAAI,CAAC;IAC9D,MAAM,GAAY,KAAK,CAAC;IACxB,WAAW,CAAS;IACpB,SAAS,GAAG,eAAe,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAEtE,YACU,UAAsB,EAC9B,aAAqB,eAAe,EACpC,cAAsB,CAAC;QAEvB,KAAK,EAAE,CAAC;QAJA,eAAU,GAAV,UAAU,CAAY;QAK9B,KAAK,UAAU,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,WAAW;QACjB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,eAAe,EAAc,CAAC;QACjE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAe,EAAE,EAAE;YAC9C,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAExC,MAAM,UAAU,GAAG,IAAI,UAAU,CAC/B,GAAG,EACH,eAAe,EACf,IAAI,CAAC,WAAW,EAChB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAC9B,CAAC;YAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AudioOutput, AudioFrame } from '@ariaflow/livekit-plugin';
|
|
2
|
+
import type { RtpSession } from './rtp/rtp_session.js';
|
|
3
|
+
/**
|
|
4
|
+
* Sends audio frames from the TTS pipeline to the caller as RTP packets
|
|
5
|
+
* at real-time pace (setInterval at packet duration).
|
|
6
|
+
*
|
|
7
|
+
* TTS emits 24kHz AudioFrames. We downsample to 8kHz before RTP packetization.
|
|
8
|
+
*
|
|
9
|
+
* **Frame accumulation (sip-to-ai `AudioAdapter.feed_ai_audio`):** resampled PCM
|
|
10
|
+
* is merged in `accumulator` until a full 20ms frame exists; remainders are kept
|
|
11
|
+
* (no padding between chunks). Flush pads only the final partial frame.
|
|
12
|
+
*
|
|
13
|
+
* The resampler is allocated once and reused across all frames
|
|
14
|
+
* for the lifetime of this output (Sox sinc via local Rust FFI).
|
|
15
|
+
*/
|
|
16
|
+
export declare class SIPAudioOutput extends AudioOutput {
|
|
17
|
+
private rtpSession;
|
|
18
|
+
private sendQueue;
|
|
19
|
+
private sendTimer;
|
|
20
|
+
private segmentSamplesSent;
|
|
21
|
+
private flushed;
|
|
22
|
+
private closed;
|
|
23
|
+
private samplesPerPacket;
|
|
24
|
+
private packetIntervalMs;
|
|
25
|
+
private resampler;
|
|
26
|
+
constructor(rtpSession: RtpSession, sampleRate?: number, packetDurationMs?: number);
|
|
27
|
+
captureFrame(frame: AudioFrame): Promise<void>;
|
|
28
|
+
private startSendTimer;
|
|
29
|
+
private stopSendTimer;
|
|
30
|
+
flush(): void;
|
|
31
|
+
clearBuffer(): void;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=audio_output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio_output.d.ts","sourceRoot":"","sources":["../src/audio_output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAW3C,OAAO,CAAC,UAAU;IAVpB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,SAAS,CAAqD;gBAG5D,UAAU,EAAE,UAAU,EAC9B,UAAU,GAAE,MAAwB,EACpC,gBAAgB,GAAE,MAAW;IAOzB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAepD,OAAO,CAAC,cAAc;IAwDtB,OAAO,CAAC,aAAa;IAOrB,KAAK,IAAI,IAAI;IAmBb,WAAW,IAAI,IAAI;IAiBb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { AudioOutput } from '@ariaflow/livekit-plugin';
|
|
2
|
+
import { createResampler } from '@ariaflow/livekit-plugin/utils/resample';
|
|
3
|
+
const TTS_SAMPLE_RATE = 24000;
|
|
4
|
+
const RTP_SAMPLE_RATE = 8000;
|
|
5
|
+
/**
|
|
6
|
+
* Sends audio frames from the TTS pipeline to the caller as RTP packets
|
|
7
|
+
* at real-time pace (setInterval at packet duration).
|
|
8
|
+
*
|
|
9
|
+
* TTS emits 24kHz AudioFrames. We downsample to 8kHz before RTP packetization.
|
|
10
|
+
*
|
|
11
|
+
* **Frame accumulation (sip-to-ai `AudioAdapter.feed_ai_audio`):** resampled PCM
|
|
12
|
+
* is merged in `accumulator` until a full 20ms frame exists; remainders are kept
|
|
13
|
+
* (no padding between chunks). Flush pads only the final partial frame.
|
|
14
|
+
*
|
|
15
|
+
* The resampler is allocated once and reused across all frames
|
|
16
|
+
* for the lifetime of this output (Sox sinc via local Rust FFI).
|
|
17
|
+
*/
|
|
18
|
+
export class SIPAudioOutput extends AudioOutput {
|
|
19
|
+
rtpSession;
|
|
20
|
+
sendQueue = [];
|
|
21
|
+
sendTimer = null;
|
|
22
|
+
segmentSamplesSent = 0;
|
|
23
|
+
flushed = false;
|
|
24
|
+
closed = false;
|
|
25
|
+
samplesPerPacket;
|
|
26
|
+
packetIntervalMs;
|
|
27
|
+
resampler = createResampler(TTS_SAMPLE_RATE, RTP_SAMPLE_RATE);
|
|
28
|
+
constructor(rtpSession, sampleRate = RTP_SAMPLE_RATE, packetDurationMs = 20) {
|
|
29
|
+
super(sampleRate);
|
|
30
|
+
this.rtpSession = rtpSession;
|
|
31
|
+
this.packetIntervalMs = packetDurationMs;
|
|
32
|
+
this.samplesPerPacket = (sampleRate * packetDurationMs) / 1000;
|
|
33
|
+
}
|
|
34
|
+
async captureFrame(frame) {
|
|
35
|
+
await super.captureFrame(frame);
|
|
36
|
+
if (this.closed)
|
|
37
|
+
return;
|
|
38
|
+
if (this.segmentSamplesSent === 0) {
|
|
39
|
+
this.onPlaybackStarted(Date.now());
|
|
40
|
+
this.startSendTimer();
|
|
41
|
+
}
|
|
42
|
+
// Push 24kHz frame through the streaming resampler -> 8kHz frames
|
|
43
|
+
for (const outFrame of this.resampler.push(frame)) {
|
|
44
|
+
this.sendQueue.push(new Int16Array(outFrame.data));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
startSendTimer() {
|
|
48
|
+
if (this.sendTimer)
|
|
49
|
+
return;
|
|
50
|
+
let accumulator = new Int16Array(0);
|
|
51
|
+
this.sendTimer = setInterval(() => {
|
|
52
|
+
if (this.closed) {
|
|
53
|
+
this.stopSendTimer();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Merge accumulator with queued chunks
|
|
57
|
+
while (accumulator.length < this.samplesPerPacket &&
|
|
58
|
+
this.sendQueue.length > 0) {
|
|
59
|
+
const next = this.sendQueue.shift();
|
|
60
|
+
const merged = new Int16Array(accumulator.length + next.length);
|
|
61
|
+
merged.set(accumulator);
|
|
62
|
+
merged.set(next, accumulator.length);
|
|
63
|
+
accumulator = merged;
|
|
64
|
+
}
|
|
65
|
+
if (accumulator.length >= this.samplesPerPacket) {
|
|
66
|
+
const packet = accumulator.slice(0, this.samplesPerPacket);
|
|
67
|
+
accumulator = accumulator.slice(this.samplesPerPacket);
|
|
68
|
+
this.rtpSession.sendAudio(packet);
|
|
69
|
+
this.segmentSamplesSent += this.samplesPerPacket;
|
|
70
|
+
}
|
|
71
|
+
else if (this.flushed && this.sendQueue.length === 0) {
|
|
72
|
+
this.stopSendTimer();
|
|
73
|
+
// Send any remaining partial packet padded with silence
|
|
74
|
+
if (accumulator.length > 0) {
|
|
75
|
+
const padded = new Int16Array(this.samplesPerPacket);
|
|
76
|
+
padded.set(accumulator);
|
|
77
|
+
this.rtpSession.sendAudio(padded);
|
|
78
|
+
this.segmentSamplesSent += accumulator.length;
|
|
79
|
+
accumulator = new Int16Array(0);
|
|
80
|
+
}
|
|
81
|
+
const playbackDuration = this.sampleRate
|
|
82
|
+
? this.segmentSamplesSent / this.sampleRate
|
|
83
|
+
: 0;
|
|
84
|
+
this.onPlaybackFinished({
|
|
85
|
+
playbackPosition: playbackDuration,
|
|
86
|
+
interrupted: false,
|
|
87
|
+
});
|
|
88
|
+
this.segmentSamplesSent = 0;
|
|
89
|
+
this.flushed = false;
|
|
90
|
+
}
|
|
91
|
+
}, this.packetIntervalMs);
|
|
92
|
+
}
|
|
93
|
+
stopSendTimer() {
|
|
94
|
+
if (this.sendTimer) {
|
|
95
|
+
clearInterval(this.sendTimer);
|
|
96
|
+
this.sendTimer = null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
flush() {
|
|
100
|
+
super.flush();
|
|
101
|
+
// Drain any buffered samples from the resampler
|
|
102
|
+
for (const outFrame of this.resampler.flush()) {
|
|
103
|
+
this.sendQueue.push(new Int16Array(outFrame.data));
|
|
104
|
+
}
|
|
105
|
+
this.flushed = true;
|
|
106
|
+
if (this.segmentSamplesSent === 0 && this.sendQueue.length === 0) {
|
|
107
|
+
this.onPlaybackFinished({
|
|
108
|
+
playbackPosition: 0,
|
|
109
|
+
interrupted: false,
|
|
110
|
+
});
|
|
111
|
+
this.flushed = false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
clearBuffer() {
|
|
115
|
+
const playbackDuration = this.sampleRate
|
|
116
|
+
? this.segmentSamplesSent / this.sampleRate
|
|
117
|
+
: 0;
|
|
118
|
+
this.sendQueue = [];
|
|
119
|
+
this.stopSendTimer();
|
|
120
|
+
this.onPlaybackFinished({
|
|
121
|
+
playbackPosition: playbackDuration,
|
|
122
|
+
interrupted: true,
|
|
123
|
+
});
|
|
124
|
+
this.segmentSamplesSent = 0;
|
|
125
|
+
this.flushed = false;
|
|
126
|
+
}
|
|
127
|
+
async close() {
|
|
128
|
+
this.closed = true;
|
|
129
|
+
this.stopSendTimer();
|
|
130
|
+
this.sendQueue = [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=audio_output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio_output.js","sourceRoot":"","sources":["../src/audio_output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* G.711 mu-law and A-law codec implementation.
|
|
3
|
+
*
|
|
4
|
+
* Converts between 16-bit signed linear PCM (AudioFrame format) and
|
|
5
|
+
* 8-bit compressed telephony audio. Stateless per-sample operation.
|
|
6
|
+
*/
|
|
7
|
+
export interface Codec {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly payloadType: number;
|
|
10
|
+
readonly sampleRate: number;
|
|
11
|
+
readonly channels: number;
|
|
12
|
+
decode(input: Uint8Array): Int16Array;
|
|
13
|
+
encode(input: Int16Array): Uint8Array;
|
|
14
|
+
}
|
|
15
|
+
export declare const PCMU: Codec;
|
|
16
|
+
export declare const PCMA: Codec;
|
|
17
|
+
//# sourceMappingURL=g711.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"g711.d.ts","sourceRoot":"","sources":["../../src/codec/g711.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwFH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;IACtC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;CACvC;AAED,eAAO,MAAM,IAAI,EAAE,KAqBlB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAqBlB,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* G.711 mu-law and A-law codec implementation.
|
|
3
|
+
*
|
|
4
|
+
* Converts between 16-bit signed linear PCM (AudioFrame format) and
|
|
5
|
+
* 8-bit compressed telephony audio. Stateless per-sample operation.
|
|
6
|
+
*/
|
|
7
|
+
// --- mu-law ---
|
|
8
|
+
const MULAW_BIAS = 33;
|
|
9
|
+
const MULAW_CLIP = 32635;
|
|
10
|
+
const mulawExpTable = new Uint8Array([
|
|
11
|
+
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
12
|
+
4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
13
|
+
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
14
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
15
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
16
|
+
6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
17
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
18
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
19
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
20
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
21
|
+
7, 7, 7, 7, 7, 7,
|
|
22
|
+
]);
|
|
23
|
+
function mulawEncodeSample(sample) {
|
|
24
|
+
const sign = (sample >> 8) & 0x80;
|
|
25
|
+
if (sign !== 0)
|
|
26
|
+
sample = -sample;
|
|
27
|
+
if (sample > MULAW_CLIP)
|
|
28
|
+
sample = MULAW_CLIP;
|
|
29
|
+
sample += MULAW_BIAS;
|
|
30
|
+
const exponent = mulawExpTable[(sample >> 7) & 0xff];
|
|
31
|
+
const mantissa = (sample >> (exponent + 3)) & 0x0f;
|
|
32
|
+
return ~(sign | (exponent << 4) | mantissa) & 0xff;
|
|
33
|
+
}
|
|
34
|
+
function mulawDecodeSample(mulaw) {
|
|
35
|
+
mulaw = ~mulaw & 0xff;
|
|
36
|
+
const sign = mulaw & 0x80;
|
|
37
|
+
const exponent = (mulaw >> 4) & 0x07;
|
|
38
|
+
const mantissa = mulaw & 0x0f;
|
|
39
|
+
let sample = ((mantissa << 3) + MULAW_BIAS) << exponent;
|
|
40
|
+
sample -= MULAW_BIAS;
|
|
41
|
+
return sign !== 0 ? -sample : sample;
|
|
42
|
+
}
|
|
43
|
+
// --- A-law ---
|
|
44
|
+
const alawExpTable = new Uint8Array([
|
|
45
|
+
1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
46
|
+
5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
47
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
48
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
49
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
50
|
+
7, 7, 7,
|
|
51
|
+
]);
|
|
52
|
+
function alawEncodeSample(sample) {
|
|
53
|
+
const sign = (~sample >> 8) & 0x80;
|
|
54
|
+
if (sign === 0)
|
|
55
|
+
sample = -sample;
|
|
56
|
+
if (sample > 32767)
|
|
57
|
+
sample = 32767;
|
|
58
|
+
let compressedByte;
|
|
59
|
+
if (sample >= 256) {
|
|
60
|
+
const exponent = alawExpTable[(sample >> 8) & 0x7f];
|
|
61
|
+
const mantissa = (sample >> (exponent + 3)) & 0x0f;
|
|
62
|
+
compressedByte = (exponent << 4) | mantissa;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
compressedByte = sample >> 4;
|
|
66
|
+
}
|
|
67
|
+
return (compressedByte ^ (sign ^ 0x55)) & 0xff;
|
|
68
|
+
}
|
|
69
|
+
function alawDecodeSample(alaw) {
|
|
70
|
+
alaw ^= 0x55;
|
|
71
|
+
const sign = alaw & 0x80;
|
|
72
|
+
const exponent = (alaw >> 4) & 0x07;
|
|
73
|
+
const mantissa = alaw & 0x0f;
|
|
74
|
+
let sample;
|
|
75
|
+
if (exponent !== 0) {
|
|
76
|
+
sample = ((mantissa << 4) + 0x108) << (exponent - 1);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
sample = (mantissa << 4) + 8;
|
|
80
|
+
}
|
|
81
|
+
return sign !== 0 ? sample : -sample;
|
|
82
|
+
}
|
|
83
|
+
export const PCMU = {
|
|
84
|
+
name: 'PCMU',
|
|
85
|
+
payloadType: 0,
|
|
86
|
+
sampleRate: 8000,
|
|
87
|
+
channels: 1,
|
|
88
|
+
decode(input) {
|
|
89
|
+
const output = new Int16Array(input.length);
|
|
90
|
+
for (let i = 0; i < input.length; i++) {
|
|
91
|
+
output[i] = mulawDecodeSample(input[i]);
|
|
92
|
+
}
|
|
93
|
+
return output;
|
|
94
|
+
},
|
|
95
|
+
encode(input) {
|
|
96
|
+
const output = new Uint8Array(input.length);
|
|
97
|
+
for (let i = 0; i < input.length; i++) {
|
|
98
|
+
output[i] = mulawEncodeSample(input[i]);
|
|
99
|
+
}
|
|
100
|
+
return output;
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
export const PCMA = {
|
|
104
|
+
name: 'PCMA',
|
|
105
|
+
payloadType: 8,
|
|
106
|
+
sampleRate: 8000,
|
|
107
|
+
channels: 1,
|
|
108
|
+
decode(input) {
|
|
109
|
+
const output = new Int16Array(input.length);
|
|
110
|
+
for (let i = 0; i < input.length; i++) {
|
|
111
|
+
output[i] = alawDecodeSample(input[i]);
|
|
112
|
+
}
|
|
113
|
+
return output;
|
|
114
|
+
},
|
|
115
|
+
encode(input) {
|
|
116
|
+
const output = new Uint8Array(input.length);
|
|
117
|
+
for (let i = 0; i < input.length; i++) {
|
|
118
|
+
output[i] = alawEncodeSample(input[i]);
|
|
119
|
+
}
|
|
120
|
+
return output;
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=g711.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"g711.js","sourceRoot":"","sources":["../../src/codec/g711.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iBAAiB;AAEjB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC;IACnC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC,EAAE,C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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { SIPAgentServer } from './server.js';
|
|
2
|
+
export { SIPSignaling } from './sip_signaling.js';
|
|
3
|
+
export type { SIPServerOptions, SIPTransport } from './types.js';
|
|
4
|
+
export { SIPTransportAdapter } from './transport_adapter.js';
|
|
5
|
+
export { SIPAudioInput } from './audio_input.js';
|
|
6
|
+
export { SIPAudioOutput } from './audio_output.js';
|
|
7
|
+
export { SIPTextOutput } from './text_output.js';
|
|
8
|
+
export { PCMU, PCMA, type Codec } from '@ariaflow/livekit-plugin/codec/g711';
|
|
9
|
+
export { RtpSession, type RtpSessionOptions } from './rtp/rtp_session.js';
|
|
10
|
+
export { parseRtpPacket, buildRtpPacket, type RtpPacket } from './rtp/rtp_packet.js';
|
|
11
|
+
export { JitterBuffer } from './rtp/jitter_buffer.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { SIPAgentServer } from './server.js';
|
|
2
|
+
export { SIPSignaling } from './sip_signaling.js';
|
|
3
|
+
export { SIPTransportAdapter } from './transport_adapter.js';
|
|
4
|
+
export { SIPAudioInput } from './audio_input.js';
|
|
5
|
+
export { SIPAudioOutput } from './audio_output.js';
|
|
6
|
+
export { SIPTextOutput } from './text_output.js';
|
|
7
|
+
export { PCMU, PCMA } from '@ariaflow/livekit-plugin/codec/g711';
|
|
8
|
+
export { RtpSession } from './rtp/rtp_session.js';
|
|
9
|
+
export { parseRtpPacket, buildRtpPacket } from './rtp/rtp_packet.js';
|
|
10
|
+
export { JitterBuffer } from './rtp/jitter_buffer.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAc,MAAM,qCAAqC,CAAC;AAE7E,OAAO,EAAE,UAAU,EAA0B,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAkB,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SIP Signaling implementation using JsSIP library for WebSocket transport.
|
|
3
|
+
*
|
|
4
|
+
* @experimental
|
|
5
|
+
*
|
|
6
|
+
* WARNING: JsSIP is a WebRTC-only library. Its `session.answer()` API is a
|
|
7
|
+
* WebRTC API and cannot bridge to the raw RTP pipeline used by `SIPAudioInput`
|
|
8
|
+
* and `SIPAudioOutput`. This file is kept for reference but the WebSocket SIP
|
|
9
|
+
* signaling path is architecturally incompatible with the RTP transport.
|
|
10
|
+
*
|
|
11
|
+
* For production use, use `sip_signaling.ts` (UDP-based, compatible with RTP).
|
|
12
|
+
*
|
|
13
|
+
* JsSIP supports:
|
|
14
|
+
* - SIP over WebSocket (secure WSS and non-secure WS)
|
|
15
|
+
* - WebRTC for media (NOT compatible with raw RTP)
|
|
16
|
+
* - Full SIP protocol compliance (INVITE, ACK, BYE, etc.)
|
|
17
|
+
*/
|
|
18
|
+
import type { SIPServerOptions } from './types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Callback for incoming INVITE requests.
|
|
21
|
+
*/
|
|
22
|
+
export type OnInviteCallback = (callId: string, remoteSdp: string, rtpPort: number) => void;
|
|
23
|
+
/**
|
|
24
|
+
* Callback for BYE requests (remote hangup).
|
|
25
|
+
*/
|
|
26
|
+
export type OnByeCallback = (callId: string) => void;
|
|
27
|
+
/**
|
|
28
|
+
* SIP Signaling handler using JsSIP over WebSocket.
|
|
29
|
+
*
|
|
30
|
+
* This implementation uses the JsSIP library for WebSocket-based SIP
|
|
31
|
+
* signaling, commonly used with WebRTC and modern SIP providers.
|
|
32
|
+
*/
|
|
33
|
+
export declare class JsSIPSignaling {
|
|
34
|
+
private options;
|
|
35
|
+
private ua;
|
|
36
|
+
private activeSessions;
|
|
37
|
+
private nextRtpPort;
|
|
38
|
+
private localAddress;
|
|
39
|
+
constructor(options: SIPServerOptions);
|
|
40
|
+
/**
|
|
41
|
+
* Start the SIP user agent and begin listening for calls over WebSocket.
|
|
42
|
+
*
|
|
43
|
+
* @param onInvite - Callback when a new INVITE is received
|
|
44
|
+
* @param onBye - Callback when a BYE is received (remote hangup)
|
|
45
|
+
*/
|
|
46
|
+
start(onInvite: OnInviteCallback, onBye?: OnByeCallback): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Handle an incoming INVITE request.
|
|
49
|
+
*/
|
|
50
|
+
private handleIncomingInvite;
|
|
51
|
+
/**
|
|
52
|
+
* Hang up an active call.
|
|
53
|
+
*/
|
|
54
|
+
hangup(callId: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Make an outgoing call.
|
|
57
|
+
*/
|
|
58
|
+
makeCall(targetUri: string, onInvite?: OnInviteCallback, onBye?: OnByeCallback): Promise<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Stop the SIP user agent and hang up all active calls.
|
|
61
|
+
*/
|
|
62
|
+
stop(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Get the RTP port allocated for a specific call.
|
|
65
|
+
*/
|
|
66
|
+
getRtpPort(callId: string): number | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Check if the user agent is registered.
|
|
69
|
+
*/
|
|
70
|
+
get isRegistered(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Get the user agent status.
|
|
73
|
+
*/
|
|
74
|
+
get status(): 'disconnected' | 'connecting' | 'connected';
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=jssip_signaling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jssip_signaling.d.ts","sourceRoot":"","sources":["../src/jssip_signaling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5F;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAmBrD;;;;;GAKG;AACH,qBAAa,cAAc;IAMb,OAAO,CAAC,OAAO;IAL3B,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,cAAc,CAAoE;IAC1F,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;gBAET,OAAO,EAAE,gBAAgB;IAK7C;;;;;OAKG;IACG,KAAK,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C7E;;OAEG;YACW,oBAAoB;IA6DlC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C;;OAEG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,gBAAgB,EAC3B,KAAK,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC;IAkDlB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B;;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,CAOxD;CACF"}
|