@agentdance/node-webrtc 1.0.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 (66) hide show
  1. package/dist/data-channel.d.ts +33 -0
  2. package/dist/data-channel.d.ts.map +1 -0
  3. package/dist/data-channel.js +138 -0
  4. package/dist/data-channel.js.map +1 -0
  5. package/dist/ice-candidate.d.ts +30 -0
  6. package/dist/ice-candidate.d.ts.map +1 -0
  7. package/dist/ice-candidate.js +78 -0
  8. package/dist/ice-candidate.js.map +1 -0
  9. package/dist/index.d.ts +9 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +9 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/internal/peer-internals.d.ts +55 -0
  14. package/dist/internal/peer-internals.d.ts.map +1 -0
  15. package/dist/internal/peer-internals.js +412 -0
  16. package/dist/internal/peer-internals.js.map +1 -0
  17. package/dist/internal/sdp-factory.d.ts +9 -0
  18. package/dist/internal/sdp-factory.d.ts.map +1 -0
  19. package/dist/internal/sdp-factory.js +58 -0
  20. package/dist/internal/sdp-factory.js.map +1 -0
  21. package/dist/internal/sdp-parser.d.ts +15 -0
  22. package/dist/internal/sdp-parser.d.ts.map +1 -0
  23. package/dist/internal/sdp-parser.js +70 -0
  24. package/dist/internal/sdp-parser.js.map +1 -0
  25. package/dist/peer-connection.d.ts +72 -0
  26. package/dist/peer-connection.d.ts.map +1 -0
  27. package/dist/peer-connection.js +198 -0
  28. package/dist/peer-connection.js.map +1 -0
  29. package/dist/rtp-receiver.d.ts +28 -0
  30. package/dist/rtp-receiver.d.ts.map +1 -0
  31. package/dist/rtp-receiver.js +39 -0
  32. package/dist/rtp-receiver.js.map +1 -0
  33. package/dist/rtp-sender.d.ts +29 -0
  34. package/dist/rtp-sender.d.ts.map +1 -0
  35. package/dist/rtp-sender.js +58 -0
  36. package/dist/rtp-sender.js.map +1 -0
  37. package/dist/rtp-transceiver.d.ts +25 -0
  38. package/dist/rtp-transceiver.d.ts.map +1 -0
  39. package/dist/rtp-transceiver.js +28 -0
  40. package/dist/rtp-transceiver.js.map +1 -0
  41. package/dist/session-description.d.ts +8 -0
  42. package/dist/session-description.d.ts.map +1 -0
  43. package/dist/session-description.js +12 -0
  44. package/dist/session-description.js.map +1 -0
  45. package/dist/stats.d.ts +16 -0
  46. package/dist/stats.d.ts.map +1 -0
  47. package/dist/stats.js +22 -0
  48. package/dist/stats.js.map +1 -0
  49. package/dist/types.d.ts +113 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +68 -0
  54. package/src/data-channel.ts +165 -0
  55. package/src/ice-candidate.ts +91 -0
  56. package/src/index.ts +8 -0
  57. package/src/internal/peer-internals.ts +477 -0
  58. package/src/internal/sdp-factory.ts +81 -0
  59. package/src/internal/sdp-parser.ts +69 -0
  60. package/src/peer-connection.ts +253 -0
  61. package/src/rtp-receiver.ts +51 -0
  62. package/src/rtp-sender.ts +77 -0
  63. package/src/rtp-transceiver.ts +40 -0
  64. package/src/session-description.ts +15 -0
  65. package/src/stats.ts +35 -0
  66. package/src/types.ts +156 -0
@@ -0,0 +1,33 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { RTCDataChannelInit, RTCDataChannelState } from './types.js';
3
+ import type { SctpDataChannel } from '@agentdance/node-webrtc-sctp';
4
+ export declare interface RTCDataChannel {
5
+ on(event: 'open', listener: () => void): this;
6
+ on(event: 'message', listener: (data: Buffer | string | ArrayBuffer) => void): this;
7
+ on(event: 'close', listener: () => void): this;
8
+ on(event: 'closing', listener: () => void): this;
9
+ on(event: 'error', listener: (err: Error) => void): this;
10
+ on(event: 'bufferedamountlow', listener: () => void): this;
11
+ }
12
+ export declare class RTCDataChannel extends EventEmitter {
13
+ readonly label: string;
14
+ readonly ordered: boolean;
15
+ readonly maxPacketLifeTime: number | null;
16
+ readonly maxRetransmits: number | null;
17
+ readonly protocol: string;
18
+ readonly negotiated: boolean;
19
+ id: number | null;
20
+ readyState: RTCDataChannelState;
21
+ binaryType: 'blob' | 'arraybuffer';
22
+ private _bufferedAmount;
23
+ private _bufferedAmountLowThreshold;
24
+ _sctpChannel: SctpDataChannel | null;
25
+ constructor(label: string, init: RTCDataChannelInit, sctpChannel: SctpDataChannel | null);
26
+ get bufferedAmount(): number;
27
+ get bufferedAmountLowThreshold(): number;
28
+ set bufferedAmountLowThreshold(value: number);
29
+ _bindSctpChannel(channel: SctpDataChannel): void;
30
+ send(data: string | Buffer | ArrayBuffer | ArrayBufferView): void;
31
+ close(): void;
32
+ }
33
+ //# sourceMappingURL=data-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-channel.d.ts","sourceRoot":"","sources":["../src/data-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,CAAC,OAAO,WAAW,cAAc;IACrC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC9C,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;IACpF,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC/C,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACjD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACzD,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC5D;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,UAAU,EAAE,mBAAmB,CAAgB;IAC/C,UAAU,EAAE,MAAM,GAAG,aAAa,CAAiB;IAGnD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,2BAA2B,CAAK;IAGxC,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;gBAGnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,eAAe,GAAG,IAAI;IAiBrC,IAAI,cAAc,IAAI,MAAM,CAS3B;IAED,IAAI,0BAA0B,IAAI,MAAM,CAEvC;IAED,IAAI,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAM3C;IAED,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IA4ChD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,eAAe,GAAG,IAAI;IAiCjE,KAAK,IAAI,IAAI;CAad"}
@@ -0,0 +1,138 @@
1
+ import { EventEmitter } from 'events';
2
+ export class RTCDataChannel extends EventEmitter {
3
+ label;
4
+ ordered;
5
+ maxPacketLifeTime;
6
+ maxRetransmits;
7
+ protocol;
8
+ negotiated;
9
+ id;
10
+ readyState = 'connecting';
11
+ binaryType = 'arraybuffer';
12
+ // bufferedAmount tracks bytes enqueued but not yet acknowledged
13
+ _bufferedAmount = 0;
14
+ _bufferedAmountLowThreshold = 0;
15
+ // Internal reference to the SCTP layer channel
16
+ _sctpChannel;
17
+ constructor(label, init, sctpChannel) {
18
+ super();
19
+ this.label = label;
20
+ this.ordered = init.ordered ?? true;
21
+ this.maxPacketLifeTime = init.maxPacketLifeTime ?? null;
22
+ this.maxRetransmits = init.maxRetransmits ?? null;
23
+ this.protocol = init.protocol ?? '';
24
+ this.negotiated = init.negotiated ?? false;
25
+ this.id = init.id ?? null;
26
+ this._sctpChannel = sctpChannel;
27
+ if (sctpChannel) {
28
+ this._bindSctpChannel(sctpChannel);
29
+ }
30
+ }
31
+ get bufferedAmount() {
32
+ // Delegate to the underlying SCTP channel so that bufferedAmount tracks
33
+ // only bytes that have been enqueued but not yet acknowledged by the remote
34
+ // peer. This allows backpressure checks (channel.bufferedAmount >
35
+ // HIGH_WATERMARK) to work correctly.
36
+ if (this._sctpChannel) {
37
+ return this._sctpChannel.bufferedAmount;
38
+ }
39
+ return this._bufferedAmount;
40
+ }
41
+ get bufferedAmountLowThreshold() {
42
+ return this._bufferedAmountLowThreshold;
43
+ }
44
+ set bufferedAmountLowThreshold(value) {
45
+ this._bufferedAmountLowThreshold = value;
46
+ // Propagate to underlying SCTP channel if bound
47
+ if (this._sctpChannel) {
48
+ this._sctpChannel.bufferedAmountLowThreshold = value;
49
+ }
50
+ }
51
+ _bindSctpChannel(channel) {
52
+ this._sctpChannel = channel;
53
+ this.id = channel.id;
54
+ // Sync threshold
55
+ channel.bufferedAmountLowThreshold = this._bufferedAmountLowThreshold;
56
+ channel.on('open', () => {
57
+ console.log(`[RTCDataChannel] SCTP 'open' for label="${this.label}" (streamId=${this.id})`);
58
+ this.readyState = 'open';
59
+ this.emit('open');
60
+ });
61
+ channel.on('message', (data) => {
62
+ if (data instanceof Buffer && this.binaryType === 'arraybuffer') {
63
+ // Expose as ArrayBuffer to match browser behaviour
64
+ const ab = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
65
+ this.emit('message', ab);
66
+ }
67
+ else {
68
+ this.emit('message', data);
69
+ }
70
+ });
71
+ channel.on('close', () => {
72
+ this.readyState = 'closed';
73
+ this._bufferedAmount = 0;
74
+ this.emit('close');
75
+ });
76
+ channel.on('error', (err) => {
77
+ this.emit('error', err);
78
+ });
79
+ // Relay bufferedamountlow from SCTP layer
80
+ channel.on('bufferedamountlow', () => {
81
+ this.emit('bufferedamountlow');
82
+ });
83
+ // If already open (e.g. negotiated channel)
84
+ if (channel.state === 'open') {
85
+ this.readyState = 'open';
86
+ }
87
+ }
88
+ send(data) {
89
+ if (this.readyState !== 'open') {
90
+ const err = new Error(`DataChannel "${this.label}" is not open (state: ${this.readyState})`);
91
+ err.code = 'InvalidStateError';
92
+ throw err;
93
+ }
94
+ if (!this._sctpChannel) {
95
+ throw new Error(`DataChannel "${this.label}" has no underlying SCTP channel`);
96
+ }
97
+ let buf;
98
+ if (typeof data === 'string') {
99
+ // Track buffered bytes (UTF-8 encoded size)
100
+ buf = Buffer.from(data, 'utf8');
101
+ this._bufferedAmount += buf.byteLength;
102
+ this._sctpChannel.send(data);
103
+ }
104
+ else if (data instanceof Buffer) {
105
+ buf = data;
106
+ this._bufferedAmount += buf.byteLength;
107
+ this._sctpChannel.send(buf);
108
+ }
109
+ else if (data instanceof ArrayBuffer) {
110
+ buf = Buffer.from(data);
111
+ this._bufferedAmount += buf.byteLength;
112
+ this._sctpChannel.send(buf);
113
+ }
114
+ else {
115
+ // ArrayBufferView
116
+ const view = data;
117
+ buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);
118
+ this._bufferedAmount += buf.byteLength;
119
+ this._sctpChannel.send(buf);
120
+ }
121
+ }
122
+ close() {
123
+ if (this.readyState === 'closed' || this.readyState === 'closing')
124
+ return;
125
+ this.readyState = 'closing';
126
+ this.emit('closing');
127
+ if (this._sctpChannel) {
128
+ this._sctpChannel.close();
129
+ // The 'close' event on _sctpChannel transitions us to 'closed'
130
+ }
131
+ else {
132
+ // No underlying channel – transition immediately
133
+ this.readyState = 'closed';
134
+ this.emit('close');
135
+ }
136
+ }
137
+ }
138
+ //# sourceMappingURL=data-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-channel.js","sourceRoot":"","sources":["../src/data-channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export declare class RTCIceCandidate {
2
+ readonly candidate: string;
3
+ readonly sdpMid: string | null;
4
+ readonly sdpMLineIndex: number | null;
5
+ readonly usernameFragment: string | null;
6
+ readonly foundation: string | null;
7
+ readonly component: 'rtp' | 'rtcp' | null;
8
+ readonly protocol: 'udp' | 'tcp' | null;
9
+ readonly priority: number | null;
10
+ readonly address: string | null;
11
+ readonly port: number | null;
12
+ readonly type: 'host' | 'srflx' | 'relay' | 'prflx' | null;
13
+ relatedAddress: string | null;
14
+ relatedPort: number | null;
15
+ tcpType: string | null;
16
+ constructor(init: {
17
+ candidate: string;
18
+ sdpMid?: string;
19
+ sdpMLineIndex?: number;
20
+ usernameFragment?: string;
21
+ });
22
+ private _parse;
23
+ toJSON(): {
24
+ candidate: string;
25
+ sdpMid: string | null;
26
+ sdpMLineIndex: number | null;
27
+ usernameFragment: string | null;
28
+ };
29
+ }
30
+ //# sourceMappingURL=ice-candidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ice-candidate.d.ts","sourceRoot":"","sources":["../src/ice-candidate.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAQ;IACjD,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAAQ;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAQ;IAClE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAElB,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE;IAsB3G,OAAO,CAAC,MAAM;IA0Cd,MAAM;;;;;;CAQP"}
@@ -0,0 +1,78 @@
1
+ export class RTCIceCandidate {
2
+ candidate;
3
+ sdpMid;
4
+ sdpMLineIndex;
5
+ usernameFragment;
6
+ // Parsed fields
7
+ foundation = null;
8
+ component = null;
9
+ protocol = null;
10
+ priority = null;
11
+ address = null;
12
+ port = null;
13
+ type = null;
14
+ relatedAddress = null;
15
+ relatedPort = null;
16
+ tcpType = null;
17
+ constructor(init) {
18
+ this.candidate = init.candidate ?? '';
19
+ this.sdpMid = init.sdpMid ?? null;
20
+ this.sdpMLineIndex = init.sdpMLineIndex ?? null;
21
+ this.usernameFragment = init.usernameFragment ?? null;
22
+ // Parse candidate string
23
+ const parsed = this._parse(this.candidate);
24
+ if (parsed) {
25
+ this.foundation = parsed.foundation;
26
+ this.component = parsed.component;
27
+ this.protocol = parsed.protocol;
28
+ this.priority = parsed.priority;
29
+ this.address = parsed.address;
30
+ this.port = parsed.port;
31
+ this.type = parsed.type;
32
+ this.relatedAddress = parsed.relatedAddress;
33
+ this.relatedPort = parsed.relatedPort;
34
+ this.tcpType = parsed.tcpType;
35
+ }
36
+ }
37
+ _parse(candidateStr) {
38
+ // "candidate:foundation component protocol priority address port typ type ..."
39
+ const str = candidateStr.replace(/^candidate:/, '');
40
+ const parts = str.split(' ');
41
+ if (parts.length < 8)
42
+ return null;
43
+ const [foundation, componentStr, protocol, priorityStr, address, portStr, , type, ...rest] = parts;
44
+ const result = {
45
+ foundation: foundation ?? null,
46
+ component: (componentStr === '1' ? 'rtp' : 'rtcp'),
47
+ protocol: protocol?.toLowerCase() ?? null,
48
+ priority: priorityStr ? parseInt(priorityStr, 10) : null,
49
+ address: address ?? null,
50
+ port: portStr ? parseInt(portStr, 10) : null,
51
+ type: type ?? null,
52
+ relatedAddress: null,
53
+ relatedPort: null,
54
+ tcpType: null,
55
+ };
56
+ // Parse extensions
57
+ for (let i = 0; i < rest.length - 1; i += 2) {
58
+ const key = rest[i];
59
+ const val = rest[i + 1];
60
+ if (key === 'raddr')
61
+ result.relatedAddress = val ?? null;
62
+ else if (key === 'rport')
63
+ result.relatedPort = val ? parseInt(val, 10) : null;
64
+ else if (key === 'tcptype')
65
+ result.tcpType = val ?? null;
66
+ }
67
+ return result;
68
+ }
69
+ toJSON() {
70
+ return {
71
+ candidate: this.candidate,
72
+ sdpMid: this.sdpMid,
73
+ sdpMLineIndex: this.sdpMLineIndex,
74
+ usernameFragment: this.usernameFragment,
75
+ };
76
+ }
77
+ }
78
+ //# sourceMappingURL=ice-candidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ice-candidate.js","sourceRoot":"","sources":["../src/ice-candidate.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IACjB,SAAS,CAAS;IAClB,MAAM,CAAgB;IACtB,aAAa,CAAgB;IAC7B,gBAAgB,CAAgB;IAEzC,gBAAgB;IACP,UAAU,GAAkB,IAAI,CAAC;IACjC,SAAS,GAA0B,IAAI,CAAC;IACxC,QAAQ,GAAyB,IAAI,CAAC;IACtC,QAAQ,GAAkB,IAAI,CAAC;IAC/B,OAAO,GAAkB,IAAI,CAAC;IAC9B,IAAI,GAAkB,IAAI,CAAC;IAC3B,IAAI,GAAgD,IAAI,CAAC;IAClE,cAAc,GAAkB,IAAI,CAAC;IACrC,WAAW,GAAkB,IAAI,CAAC;IAClC,OAAO,GAAkB,IAAI,CAAC;IAE9B,YAAY,IAA+F;QACzG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;QAEtD,yBAAyB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACV,IAAsC,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACtE,IAA6C,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAC3E,IAA2C,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACvE,IAAoC,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAChE,IAAmC,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC7D,IAAgC,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACpD,IAA8D,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACnF,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;YAC5C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,YAAoB;QAYjC,+EAA+E;QAC/E,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,AAAD,EAAG,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;QAEnG,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,UAAU,IAAI,IAAI;YAC9B,SAAS,EAAE,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAA0B;YAC3E,QAAQ,EAAG,QAAQ,EAAE,WAAW,EAAoB,IAAI,IAAI;YAC5D,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YACxD,OAAO,EAAE,OAAO,IAAI,IAAI;YACxB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YAC5C,IAAI,EAAG,IAA6C,IAAI,IAAI;YAC5D,cAAc,EAAE,IAAqB;YACrC,WAAW,EAAE,IAAqB;YAClC,OAAO,EAAE,IAAqB;SAC/B,CAAC;QAEF,mBAAmB;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,IAAI,GAAG,KAAK,OAAO;gBAAE,MAAM,CAAC,cAAc,GAAG,GAAG,IAAI,IAAI,CAAC;iBACpD,IAAI,GAAG,KAAK,OAAO;gBAAE,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;iBACzE,IAAI,GAAG,KAAK,SAAS;gBAAE,MAAM,CAAC,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC;QAC3D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export { RTCPeerConnection } from './peer-connection.js';
2
+ export { RTCSessionDescription } from './session-description.js';
3
+ export { RTCIceCandidate } from './ice-candidate.js';
4
+ export { RTCDataChannel } from './data-channel.js';
5
+ export { RTCRtpSender } from './rtp-sender.js';
6
+ export { RTCRtpReceiver } from './rtp-receiver.js';
7
+ export { RTCRtpTransceiver } from './rtp-transceiver.js';
8
+ export * from './types.js';
9
+ //# 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,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { RTCPeerConnection } from './peer-connection.js';
2
+ export { RTCSessionDescription } from './session-description.js';
3
+ export { RTCIceCandidate } from './ice-candidate.js';
4
+ export { RTCDataChannel } from './data-channel.js';
5
+ export { RTCRtpSender } from './rtp-sender.js';
6
+ export { RTCRtpReceiver } from './rtp-receiver.js';
7
+ export { RTCRtpTransceiver } from './rtp-transceiver.js';
8
+ export * from './types.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,cAAc,YAAY,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * PeerInternals - The glue layer connecting ICE, DTLS, SRTP, SCTP and SDP
3
+ * for the RTCPeerConnection implementation.
4
+ *
5
+ * Connection flow:
6
+ * 1. createOffer/createAnswer → SDP generation
7
+ * 2. setLocalDescription → start ICE gathering
8
+ * 3. setRemoteDescription → parse remote SDP, set remote ICE params
9
+ * 4. addIceCandidate → feed candidates to ICE agent
10
+ * 5. ICE connects → start DTLS handshake
11
+ * 6. DTLS connects → extract SRTP keying material + start SCTP
12
+ * 7. SCTP connects → DataChannels available
13
+ */
14
+ import { EventEmitter } from 'events';
15
+ import type { RTCConfiguration, RTCOfferOptions, RTCAnswerOptions, RTCSessionDescriptionInit, RTCIceCandidateInit } from '../types.js';
16
+ import type { RTCPeerConnection } from '../peer-connection.js';
17
+ import type { RTCDataChannel } from '../data-channel.js';
18
+ import { RTCStatsReportImpl } from '../stats.js';
19
+ type IceAgent = import('@agentdance/node-webrtc-ice').IceAgent;
20
+ type DtlsTransport = import('@agentdance/node-webrtc-dtls').DtlsTransport;
21
+ type DtlsCertificate = import('@agentdance/node-webrtc-dtls').DtlsCertificate;
22
+ type SctpAssociation = import('@agentdance/node-webrtc-sctp').SctpAssociation;
23
+ export declare class PeerInternals extends EventEmitter {
24
+ private readonly _pc;
25
+ private readonly _config;
26
+ iceAgent: IceAgent | undefined;
27
+ dtlsTransport: DtlsTransport | undefined;
28
+ sctpAssociation: SctpAssociation | undefined;
29
+ localCertificate: DtlsCertificate | undefined;
30
+ private _localSdp;
31
+ private _remoteSdp;
32
+ private _remoteFingerprint;
33
+ private _remoteSctpPort;
34
+ private _iceRole;
35
+ private _dtlsRole;
36
+ private readonly _pendingDataChannels;
37
+ private readonly _stunServers;
38
+ constructor(config: Required<RTCConfiguration>, pc: RTCPeerConnection);
39
+ createOffer(_options: RTCOfferOptions): Promise<RTCSessionDescriptionInit>;
40
+ createAnswer(_options: RTCAnswerOptions): Promise<RTCSessionDescriptionInit>;
41
+ setLocalDescription(desc: RTCSessionDescriptionInit): Promise<void>;
42
+ setRemoteDescription(desc: RTCSessionDescriptionInit): Promise<void>;
43
+ addIceCandidate(init: RTCIceCandidateInit): Promise<void>;
44
+ openDataChannel(channel: RTCDataChannel): void;
45
+ restartIce(): void;
46
+ close(): void;
47
+ getStats(): Promise<RTCStatsReportImpl>;
48
+ private _ensureCertificate;
49
+ private _ensureIceAgent;
50
+ private _startConnectivity;
51
+ private _startSctp;
52
+ private _openDataChannelOnSctp;
53
+ }
54
+ export {};
55
+ //# sourceMappingURL=peer-internals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-internals.d.ts","sourceRoot":"","sources":["../../src/internal/peer-internals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIjD,KAAK,QAAQ,GAAG,OAAO,6BAA6B,EAAE,QAAQ,CAAC;AAC/D,KAAK,aAAa,GAAG,OAAO,8BAA8B,EAAE,aAAa,CAAC;AAC1E,KAAK,eAAe,GAAG,OAAO,8BAA8B,EAAE,eAAe,CAAC;AAC9E,KAAK,eAAe,GAAG,OAAO,8BAA8B,EAAE,eAAe,CAAC;AAE9E,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IACzC,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,gBAAgB,EAAE,eAAe,GAAG,SAAS,CAAC;IAE9C,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,kBAAkB,CAAqD;IAC/E,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwB;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;gBAE9D,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,iBAAiB;IAiB/D,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAS1E,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAS5E,mBAAmB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBnE,oBAAoB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDpE,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/D,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAQ9C,UAAU,IAAI,IAAI;IAWlB,KAAK,IAAI,IAAI;IAMP,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC;YA2F/B,kBAAkB;YAMlB,eAAe;YAuDf,kBAAkB;YAmElB,UAAU;IA4CxB,OAAO,CAAC,sBAAsB;CAgB/B"}