@ariaflowagents/livekit-plugin-transport-sip 0.9.5 → 0.9.7

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/dist/index.d.ts CHANGED
@@ -9,4 +9,5 @@ export { PCMU, PCMA, type Codec } from '@ariaflowagents/livekit-plugin/codec/g71
9
9
  export { RtpSession, type RtpSessionOptions } from './rtp/rtp_session.js';
10
10
  export { parseRtpPacket, buildRtpPacket, type RtpPacket } from './rtp/rtp_packet.js';
11
11
  export { JitterBuffer } from './rtp/jitter_buffer.js';
12
+ export { createSipNativeAudioTransport } from './native_bridge.js';
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,2CAA2C,CAAC;AAEnF,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"}
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,2CAA2C,CAAC;AAEnF,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;AAEtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -8,4 +8,5 @@ export { PCMU, PCMA } from '@ariaflowagents/livekit-plugin/codec/g711';
8
8
  export { RtpSession } from './rtp/rtp_session.js';
9
9
  export { parseRtpPacket, buildRtpPacket } from './rtp/rtp_packet.js';
10
10
  export { JitterBuffer } from './rtp/jitter_buffer.js';
11
+ export { createSipNativeAudioTransport } from './native_bridge.js';
11
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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,2CAA2C,CAAC;AAEnF,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"}
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,2CAA2C,CAAC;AAEnF,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;AAEtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { NativeAudioTransport } from '@ariaflowagents/livekit-plugin';
2
+ import type { RtpSession } from './rtp/rtp_session.js';
3
+ /**
4
+ * RTP (G.711 payload) session ↔ PCM s16le for the native LiveKit runner.
5
+ * Decoded RTP PCM is 8 kHz; resampled to the runner rate (default 24 kHz).
6
+ */
7
+ export declare function createSipNativeAudioTransport(rtpSession: RtpSession, options?: {
8
+ runnerSampleRate?: number;
9
+ codecSampleRate?: number;
10
+ packetDurationMs?: number;
11
+ }): NativeAudioTransport;
12
+ //# sourceMappingURL=native_bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_bridge.d.ts","sourceRoot":"","sources":["../src/native_bridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AA0BvD;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE;IACR,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,oBAAoB,CAqGtB"}
@@ -0,0 +1,130 @@
1
+ import { AudioFrame } from '@ariaflowagents/livekit-plugin';
2
+ import { createResampler } from '@ariaflowagents/livekit-plugin/utils/resample';
3
+ const RTP_PCM_RATE = 8000;
4
+ const RUNNER_DEFAULT_RATE = 24000;
5
+ function bytesToInt16Le(bytes) {
6
+ const n = Math.floor(bytes.byteLength / 2);
7
+ const out = new Int16Array(n);
8
+ for (let i = 0; i < n; i++) {
9
+ out[i] = bytes[i * 2] | (bytes[i * 2 + 1] << 8);
10
+ }
11
+ return out;
12
+ }
13
+ /** Copy PCM samples into a plain array (avoids TS 5.9 Int16Array<ArrayBuffer> vs ArrayBufferLike issues). */
14
+ function pcmToNumbers(data) {
15
+ const len = data.length;
16
+ const out = new Array(len);
17
+ for (let i = 0; i < len; i++)
18
+ out[i] = data[i];
19
+ return out;
20
+ }
21
+ function appendPcm(dst, data) {
22
+ for (let i = 0; i < data.length; i++)
23
+ dst.push(data[i]);
24
+ }
25
+ /**
26
+ * RTP (G.711 payload) session ↔ PCM s16le for the native LiveKit runner.
27
+ * Decoded RTP PCM is 8 kHz; resampled to the runner rate (default 24 kHz).
28
+ */
29
+ export function createSipNativeAudioTransport(rtpSession, options) {
30
+ const runnerRate = options?.runnerSampleRate ?? RUNNER_DEFAULT_RATE;
31
+ const codecRate = options?.codecSampleRate ?? RTP_PCM_RATE;
32
+ const packetDurationMs = options?.packetDurationMs ?? 20;
33
+ const samplesPerPacket = (codecRate * packetDurationMs) / 1000;
34
+ const toRunner = createResampler(codecRate, runnerRate);
35
+ const fromRunner = createResampler(runnerRate, codecRate);
36
+ const audioHandlers = new Set();
37
+ const closeHandlers = new Set();
38
+ let outboundRemainder = [];
39
+ const emitClose = () => {
40
+ for (const h of closeHandlers) {
41
+ try {
42
+ h();
43
+ }
44
+ catch {
45
+ /* ignore */
46
+ }
47
+ }
48
+ };
49
+ const onRtpPcm = (pcm) => {
50
+ const inFrame = new AudioFrame(pcm, codecRate, 1, pcm.length);
51
+ try {
52
+ for (const outFrame of toRunner.push(inFrame)) {
53
+ const samples = pcmToNumbers(outFrame.data);
54
+ const bytes = new Uint8Array(samples.length * 2);
55
+ const view = new DataView(bytes.buffer);
56
+ for (let i = 0; i < samples.length; i++)
57
+ view.setInt16(i * 2, samples[i], true);
58
+ for (const h of audioHandlers) {
59
+ try {
60
+ h(bytes);
61
+ }
62
+ catch {
63
+ /* ignore */
64
+ }
65
+ }
66
+ }
67
+ }
68
+ catch {
69
+ /* ignore */
70
+ }
71
+ };
72
+ rtpSession.on('audio', onRtpPcm);
73
+ const flushOutbound = () => {
74
+ for (const outFrame of fromRunner.flush()) {
75
+ appendPcm(outboundRemainder, outFrame.data);
76
+ }
77
+ while (outboundRemainder.length >= samplesPerPacket) {
78
+ const chunk = outboundRemainder.splice(0, samplesPerPacket);
79
+ rtpSession.sendAudio(new Int16Array(chunk));
80
+ }
81
+ if (outboundRemainder.length > 0) {
82
+ const padded = new Int16Array(samplesPerPacket);
83
+ padded.set(outboundRemainder);
84
+ rtpSession.sendAudio(padded);
85
+ outboundRemainder = [];
86
+ }
87
+ };
88
+ return {
89
+ sendAudio(data) {
90
+ let int16;
91
+ try {
92
+ int16 = bytesToInt16Le(data);
93
+ }
94
+ catch {
95
+ return;
96
+ }
97
+ const inFrame = new AudioFrame(int16, runnerRate, 1, int16.length);
98
+ try {
99
+ for (const outFrame of fromRunner.push(inFrame)) {
100
+ appendPcm(outboundRemainder, outFrame.data);
101
+ while (outboundRemainder.length >= samplesPerPacket) {
102
+ const chunk = outboundRemainder.splice(0, samplesPerPacket);
103
+ rtpSession.sendAudio(new Int16Array(chunk));
104
+ }
105
+ }
106
+ }
107
+ catch {
108
+ /* ignore */
109
+ }
110
+ },
111
+ onAudio(handler) {
112
+ audioHandlers.add(handler);
113
+ },
114
+ onClose(handler) {
115
+ closeHandlers.add(handler);
116
+ },
117
+ close() {
118
+ try {
119
+ flushOutbound();
120
+ }
121
+ catch {
122
+ /* ignore */
123
+ }
124
+ rtpSession.off('audio', onRtpPcm);
125
+ emitClose();
126
+ rtpSession.close();
127
+ },
128
+ };
129
+ }
130
+ //# sourceMappingURL=native_bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_bridge.js","sourceRoot":"","sources":["../src/native_bridge.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ariaflowagents/livekit-plugin-transport-sip",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "description": "SIP/RTP transport adapter for LiveKit Agents. Run voice agents over traditional telephony with G.711 codec support.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "peerDependencies": {
21
21
  "@livekit/agents": ">=1.0.0",
22
- "@ariaflowagents/livekit-plugin": "0.9.5"
22
+ "@ariaflowagents/livekit-plugin": "0.9.7"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "^22.10.0",