@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.
- package/dist/data-channel.d.ts +33 -0
- package/dist/data-channel.d.ts.map +1 -0
- package/dist/data-channel.js +138 -0
- package/dist/data-channel.js.map +1 -0
- package/dist/ice-candidate.d.ts +30 -0
- package/dist/ice-candidate.d.ts.map +1 -0
- package/dist/ice-candidate.js +78 -0
- package/dist/ice-candidate.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/peer-internals.d.ts +55 -0
- package/dist/internal/peer-internals.d.ts.map +1 -0
- package/dist/internal/peer-internals.js +412 -0
- package/dist/internal/peer-internals.js.map +1 -0
- package/dist/internal/sdp-factory.d.ts +9 -0
- package/dist/internal/sdp-factory.d.ts.map +1 -0
- package/dist/internal/sdp-factory.js +58 -0
- package/dist/internal/sdp-factory.js.map +1 -0
- package/dist/internal/sdp-parser.d.ts +15 -0
- package/dist/internal/sdp-parser.d.ts.map +1 -0
- package/dist/internal/sdp-parser.js +70 -0
- package/dist/internal/sdp-parser.js.map +1 -0
- package/dist/peer-connection.d.ts +72 -0
- package/dist/peer-connection.d.ts.map +1 -0
- package/dist/peer-connection.js +198 -0
- package/dist/peer-connection.js.map +1 -0
- package/dist/rtp-receiver.d.ts +28 -0
- package/dist/rtp-receiver.d.ts.map +1 -0
- package/dist/rtp-receiver.js +39 -0
- package/dist/rtp-receiver.js.map +1 -0
- package/dist/rtp-sender.d.ts +29 -0
- package/dist/rtp-sender.d.ts.map +1 -0
- package/dist/rtp-sender.js +58 -0
- package/dist/rtp-sender.js.map +1 -0
- package/dist/rtp-transceiver.d.ts +25 -0
- package/dist/rtp-transceiver.d.ts.map +1 -0
- package/dist/rtp-transceiver.js +28 -0
- package/dist/rtp-transceiver.js.map +1 -0
- package/dist/session-description.d.ts +8 -0
- package/dist/session-description.d.ts.map +1 -0
- package/dist/session-description.js +12 -0
- package/dist/session-description.js.map +1 -0
- package/dist/stats.d.ts +16 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +22 -0
- package/dist/stats.js.map +1 -0
- package/dist/types.d.ts +113 -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 +68 -0
- package/src/data-channel.ts +165 -0
- package/src/ice-candidate.ts +91 -0
- package/src/index.ts +8 -0
- package/src/internal/peer-internals.ts +477 -0
- package/src/internal/sdp-factory.ts +81 -0
- package/src/internal/sdp-parser.ts +69 -0
- package/src/peer-connection.ts +253 -0
- package/src/rtp-receiver.ts +51 -0
- package/src/rtp-sender.ts +77 -0
- package/src/rtp-transceiver.ts +40 -0
- package/src/session-description.ts +15 -0
- package/src/stats.ts +35 -0
- package/src/types.ts +156 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { RTCConfiguration, RTCSessionDescriptionInit, RTCSessionDescription, RTCIceCandidateInit, RTCOfferOptions, RTCAnswerOptions, RTCSignalingState, RTCPeerConnectionState, RTCIceConnectionState, RTCIceGatheringState, RTCDataChannelInit, RTCRtpTransceiverDirection } from './types.js';
|
|
3
|
+
import { RTCDataChannel as _RTCDataChannel } from './data-channel.js';
|
|
4
|
+
import { RTCRtpTransceiver as _RTCRtpTransceiver } from './rtp-transceiver.js';
|
|
5
|
+
export { RTCSessionDescription } from './session-description.js';
|
|
6
|
+
export { RTCIceCandidate } from './ice-candidate.js';
|
|
7
|
+
export { RTCDataChannel } from './data-channel.js';
|
|
8
|
+
export { RTCRtpSender } from './rtp-sender.js';
|
|
9
|
+
export { RTCRtpReceiver } from './rtp-receiver.js';
|
|
10
|
+
export { RTCRtpTransceiver } from './rtp-transceiver.js';
|
|
11
|
+
export * from './types.js';
|
|
12
|
+
export declare interface RTCPeerConnection {
|
|
13
|
+
on(event: 'icecandidate', listener: (init: RTCIceCandidateInit | null) => void): this;
|
|
14
|
+
on(event: 'icecandidateerror', listener: (ev: {
|
|
15
|
+
errorCode: number;
|
|
16
|
+
errorText: string;
|
|
17
|
+
}) => void): this;
|
|
18
|
+
on(event: 'iceconnectionstatechange', listener: () => void): this;
|
|
19
|
+
on(event: 'icegatheringstatechange', listener: () => void): this;
|
|
20
|
+
on(event: 'connectionstatechange', listener: () => void): this;
|
|
21
|
+
on(event: 'signalingstatechange', listener: () => void): this;
|
|
22
|
+
on(event: 'negotiationneeded', listener: () => void): this;
|
|
23
|
+
on(event: 'datachannel', listener: (channel: import('./data-channel.js').RTCDataChannel) => void): this;
|
|
24
|
+
on(event: 'track', listener: (ev: RTCTrackEvent) => void): this;
|
|
25
|
+
}
|
|
26
|
+
export interface RTCTrackEvent {
|
|
27
|
+
receiver: import('./rtp-receiver.js').RTCRtpReceiver;
|
|
28
|
+
track: {
|
|
29
|
+
kind: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export declare class RTCPeerConnection extends EventEmitter {
|
|
33
|
+
readonly localDescription: RTCSessionDescription | null;
|
|
34
|
+
readonly remoteDescription: RTCSessionDescription | null;
|
|
35
|
+
readonly currentLocalDescription: RTCSessionDescription | null;
|
|
36
|
+
readonly currentRemoteDescription: RTCSessionDescription | null;
|
|
37
|
+
readonly pendingLocalDescription: RTCSessionDescription | null;
|
|
38
|
+
readonly pendingRemoteDescription: RTCSessionDescription | null;
|
|
39
|
+
signalingState: RTCSignalingState;
|
|
40
|
+
connectionState: RTCPeerConnectionState;
|
|
41
|
+
iceConnectionState: RTCIceConnectionState;
|
|
42
|
+
iceGatheringState: RTCIceGatheringState;
|
|
43
|
+
private _config;
|
|
44
|
+
private _isClosed;
|
|
45
|
+
private _transceivers;
|
|
46
|
+
private _dataChannels;
|
|
47
|
+
private _pendingChannels;
|
|
48
|
+
private _internals;
|
|
49
|
+
constructor(config?: RTCConfiguration);
|
|
50
|
+
createOffer(options?: RTCOfferOptions): Promise<RTCSessionDescriptionInit>;
|
|
51
|
+
createAnswer(options?: RTCAnswerOptions): Promise<RTCSessionDescriptionInit>;
|
|
52
|
+
setLocalDescription(description: RTCSessionDescriptionInit): Promise<void>;
|
|
53
|
+
setRemoteDescription(description: RTCSessionDescriptionInit): Promise<void>;
|
|
54
|
+
addIceCandidate(candidate: RTCIceCandidateInit | null): Promise<void>;
|
|
55
|
+
createDataChannel(label: string, init?: RTCDataChannelInit): _RTCDataChannel;
|
|
56
|
+
addTransceiver(kind: 'audio' | 'video', init?: {
|
|
57
|
+
direction?: RTCRtpTransceiverDirection;
|
|
58
|
+
}): _RTCRtpTransceiver;
|
|
59
|
+
getTransceivers(): _RTCRtpTransceiver[];
|
|
60
|
+
getSenders(): import('./rtp-sender.js').RTCRtpSender[];
|
|
61
|
+
getReceivers(): import('./rtp-receiver.js').RTCRtpReceiver[];
|
|
62
|
+
getStats(): Promise<import('./stats.js').RTCStatsReport>;
|
|
63
|
+
close(): void;
|
|
64
|
+
restartIce(): void;
|
|
65
|
+
private _getOrCreateInternals;
|
|
66
|
+
private _assertNotClosed;
|
|
67
|
+
private _updateSignalingState;
|
|
68
|
+
_updateConnectionState(state: RTCPeerConnectionState): void;
|
|
69
|
+
_updateIceConnectionState(state: RTCIceConnectionState): void;
|
|
70
|
+
_updateIceGatheringState(state: RTCIceGatheringState): void;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=peer-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-connection.d.ts","sourceRoot":"","sources":["../src/peer-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { RTCDataChannel as _RTCDataChannel } from './data-channel.js';
|
|
3
|
+
import { RTCRtpTransceiver as _RTCRtpTransceiver } from './rtp-transceiver.js';
|
|
4
|
+
export { RTCSessionDescription } from './session-description.js';
|
|
5
|
+
export { RTCIceCandidate } from './ice-candidate.js';
|
|
6
|
+
export { RTCDataChannel } from './data-channel.js';
|
|
7
|
+
export { RTCRtpSender } from './rtp-sender.js';
|
|
8
|
+
export { RTCRtpReceiver } from './rtp-receiver.js';
|
|
9
|
+
export { RTCRtpTransceiver } from './rtp-transceiver.js';
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
export class RTCPeerConnection extends EventEmitter {
|
|
12
|
+
localDescription = null;
|
|
13
|
+
remoteDescription = null;
|
|
14
|
+
currentLocalDescription = null;
|
|
15
|
+
currentRemoteDescription = null;
|
|
16
|
+
pendingLocalDescription = null;
|
|
17
|
+
pendingRemoteDescription = null;
|
|
18
|
+
signalingState = 'stable';
|
|
19
|
+
connectionState = 'new';
|
|
20
|
+
iceConnectionState = 'new';
|
|
21
|
+
iceGatheringState = 'new';
|
|
22
|
+
_config;
|
|
23
|
+
_isClosed = false;
|
|
24
|
+
_transceivers = [];
|
|
25
|
+
_dataChannels = new Map();
|
|
26
|
+
_pendingChannels = [];
|
|
27
|
+
// Protocol stack (initialized lazily)
|
|
28
|
+
_internals;
|
|
29
|
+
constructor(config = {}) {
|
|
30
|
+
super();
|
|
31
|
+
this._config = {
|
|
32
|
+
iceServers: config.iceServers ?? [{ urls: 'stun:stun.l.google.com:19302' }],
|
|
33
|
+
iceTransportPolicy: config.iceTransportPolicy ?? 'all',
|
|
34
|
+
bundlePolicy: config.bundlePolicy ?? 'max-bundle',
|
|
35
|
+
rtcpMuxPolicy: config.rtcpMuxPolicy ?? 'require',
|
|
36
|
+
iceCandidatePoolSize: config.iceCandidatePoolSize ?? 0,
|
|
37
|
+
certificates: config.certificates ?? [],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async createOffer(options) {
|
|
41
|
+
this._assertNotClosed();
|
|
42
|
+
const internals = await this._getOrCreateInternals();
|
|
43
|
+
return internals.createOffer(options ?? {});
|
|
44
|
+
}
|
|
45
|
+
async createAnswer(options) {
|
|
46
|
+
this._assertNotClosed();
|
|
47
|
+
const internals = await this._getOrCreateInternals();
|
|
48
|
+
return internals.createAnswer(options ?? {});
|
|
49
|
+
}
|
|
50
|
+
async setLocalDescription(description) {
|
|
51
|
+
this._assertNotClosed();
|
|
52
|
+
const internals = await this._getOrCreateInternals();
|
|
53
|
+
await internals.setLocalDescription(description);
|
|
54
|
+
this.localDescription = {
|
|
55
|
+
type: description.type,
|
|
56
|
+
sdp: description.sdp,
|
|
57
|
+
};
|
|
58
|
+
this._updateSignalingState(description.type, 'local');
|
|
59
|
+
}
|
|
60
|
+
async setRemoteDescription(description) {
|
|
61
|
+
this._assertNotClosed();
|
|
62
|
+
const internals = await this._getOrCreateInternals();
|
|
63
|
+
await internals.setRemoteDescription(description);
|
|
64
|
+
this.remoteDescription = {
|
|
65
|
+
type: description.type,
|
|
66
|
+
sdp: description.sdp,
|
|
67
|
+
};
|
|
68
|
+
this._updateSignalingState(description.type, 'remote');
|
|
69
|
+
}
|
|
70
|
+
async addIceCandidate(candidate) {
|
|
71
|
+
const internals = this._internals;
|
|
72
|
+
if (!internals)
|
|
73
|
+
return;
|
|
74
|
+
// null or empty candidate string = end-of-candidates signal (RFC 8840 §4.4)
|
|
75
|
+
if (!candidate || !candidate.candidate) {
|
|
76
|
+
internals.iceAgent?.remoteGatheringComplete();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
await internals.addIceCandidate(candidate);
|
|
80
|
+
}
|
|
81
|
+
createDataChannel(label, init) {
|
|
82
|
+
this._assertNotClosed();
|
|
83
|
+
const channel = new _RTCDataChannel(label, init ?? {}, null);
|
|
84
|
+
// Use a unique key: label + id (if specified) + random suffix to avoid collisions
|
|
85
|
+
const key = label + ':' + (init?.id ?? '') + ':' + Math.random().toString(36).slice(2);
|
|
86
|
+
this._dataChannels.set(key, channel);
|
|
87
|
+
if (this._internals?.sctpAssociation?.state === 'connected') {
|
|
88
|
+
// SCTP is ready now — open immediately
|
|
89
|
+
this._internals.openDataChannel(channel);
|
|
90
|
+
}
|
|
91
|
+
else if (this._internals) {
|
|
92
|
+
// Internals exist but SCTP not ready — hand off to internals pending queue
|
|
93
|
+
this._internals.openDataChannel(channel);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Internals not yet created — store locally until SCTP is ready
|
|
97
|
+
this._pendingChannels.push(channel);
|
|
98
|
+
}
|
|
99
|
+
// Clean up the map when the channel closes
|
|
100
|
+
channel.on('close', () => {
|
|
101
|
+
this._dataChannels.delete(key);
|
|
102
|
+
});
|
|
103
|
+
return channel;
|
|
104
|
+
}
|
|
105
|
+
addTransceiver(kind, init) {
|
|
106
|
+
this._assertNotClosed();
|
|
107
|
+
const transceiver = new _RTCRtpTransceiver(kind, init?.direction ?? 'sendrecv');
|
|
108
|
+
this._transceivers.push(transceiver);
|
|
109
|
+
this.emit('negotiationneeded');
|
|
110
|
+
return transceiver;
|
|
111
|
+
}
|
|
112
|
+
getTransceivers() {
|
|
113
|
+
return [...this._transceivers];
|
|
114
|
+
}
|
|
115
|
+
getSenders() {
|
|
116
|
+
return this._transceivers
|
|
117
|
+
.map((t) => t.sender)
|
|
118
|
+
.filter(Boolean);
|
|
119
|
+
}
|
|
120
|
+
getReceivers() {
|
|
121
|
+
return this._transceivers
|
|
122
|
+
.map((t) => t.receiver)
|
|
123
|
+
.filter(Boolean);
|
|
124
|
+
}
|
|
125
|
+
async getStats() {
|
|
126
|
+
const { RTCStatsReportImpl } = await import('./stats.js');
|
|
127
|
+
const internals = this._internals;
|
|
128
|
+
if (!internals)
|
|
129
|
+
return new RTCStatsReportImpl(new Map());
|
|
130
|
+
return internals.getStats();
|
|
131
|
+
}
|
|
132
|
+
close() {
|
|
133
|
+
if (this._isClosed)
|
|
134
|
+
return;
|
|
135
|
+
this._isClosed = true;
|
|
136
|
+
this._internals?.close();
|
|
137
|
+
this._updateConnectionState('closed');
|
|
138
|
+
this.signalingState = 'closed';
|
|
139
|
+
}
|
|
140
|
+
restartIce() {
|
|
141
|
+
this._internals?.restartIce();
|
|
142
|
+
}
|
|
143
|
+
async _getOrCreateInternals() {
|
|
144
|
+
if (!this._internals) {
|
|
145
|
+
const { PeerInternals } = await import('./internal/peer-internals.js');
|
|
146
|
+
this._internals = new PeerInternals(this._config, this);
|
|
147
|
+
// Transfer any channels created before internals existed
|
|
148
|
+
for (const channel of this._pendingChannels) {
|
|
149
|
+
this._internals.openDataChannel(channel);
|
|
150
|
+
}
|
|
151
|
+
this._pendingChannels = [];
|
|
152
|
+
}
|
|
153
|
+
return this._internals;
|
|
154
|
+
}
|
|
155
|
+
_assertNotClosed() {
|
|
156
|
+
if (this._isClosed)
|
|
157
|
+
throw new Error('RTCPeerConnection is closed');
|
|
158
|
+
}
|
|
159
|
+
_updateSignalingState(type, side) {
|
|
160
|
+
const prev = this.signalingState;
|
|
161
|
+
let next = prev;
|
|
162
|
+
if (type === 'rollback') {
|
|
163
|
+
next = 'stable';
|
|
164
|
+
}
|
|
165
|
+
else if (type === 'offer') {
|
|
166
|
+
next = side === 'local' ? 'have-local-offer' : 'have-remote-offer';
|
|
167
|
+
}
|
|
168
|
+
else if (type === 'answer') {
|
|
169
|
+
next = 'stable';
|
|
170
|
+
}
|
|
171
|
+
else if (type === 'pranswer') {
|
|
172
|
+
next = side === 'local' ? 'have-local-pranswer' : 'have-remote-pranswer';
|
|
173
|
+
}
|
|
174
|
+
if (next !== prev) {
|
|
175
|
+
this.signalingState = next;
|
|
176
|
+
this.emit('signalingstatechange');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
_updateConnectionState(state) {
|
|
180
|
+
if (this.connectionState !== state) {
|
|
181
|
+
this.connectionState = state;
|
|
182
|
+
this.emit('connectionstatechange');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
_updateIceConnectionState(state) {
|
|
186
|
+
if (this.iceConnectionState !== state) {
|
|
187
|
+
this.iceConnectionState = state;
|
|
188
|
+
this.emit('iceconnectionstatechange');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
_updateIceGatheringState(state) {
|
|
192
|
+
if (this.iceGatheringState !== state) {
|
|
193
|
+
this.iceGatheringState = state;
|
|
194
|
+
this.emit('icegatheringstatechange');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=peer-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-connection.js","sourceRoot":"","sources":["../src/peer-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { RTCRtpReceiveParameters } from './types.js';
|
|
3
|
+
import type { MediaStreamTrack } from './rtp-sender.js';
|
|
4
|
+
export declare class RTCRtpReceiver extends EventEmitter {
|
|
5
|
+
readonly track: MediaStreamTrack | null;
|
|
6
|
+
readonly transport: RTCDtlsTransport | null;
|
|
7
|
+
getParameters(): RTCRtpReceiveParameters;
|
|
8
|
+
getStats(): Promise<RTCStatsReport>;
|
|
9
|
+
getContributingSources(): RTCRtpContributingSource[];
|
|
10
|
+
getSynchronizationSources(): RTCRtpSynchronizationSource[];
|
|
11
|
+
static getCapabilities(kind: string): {
|
|
12
|
+
codecs: unknown[];
|
|
13
|
+
headerExtensions: unknown[];
|
|
14
|
+
} | null;
|
|
15
|
+
}
|
|
16
|
+
interface RTCDtlsTransport {
|
|
17
|
+
}
|
|
18
|
+
interface RTCStatsReport {
|
|
19
|
+
}
|
|
20
|
+
interface RTCRtpContributingSource {
|
|
21
|
+
source: number;
|
|
22
|
+
timestamp: number;
|
|
23
|
+
audioLevel?: number;
|
|
24
|
+
}
|
|
25
|
+
interface RTCRtpSynchronizationSource extends RTCRtpContributingSource {
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=rtp-receiver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp-receiver.d.ts","sourceRoot":"","sources":["../src/rtp-receiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC/C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAEnD,aAAa,IAAI,uBAAuB;IAIlC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAIzC,sBAAsB,IAAI,wBAAwB,EAAE;IAIpD,yBAAyB,IAAI,2BAA2B,EAAE;IAI1D,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAAC,gBAAgB,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG,IAAI;CAoBhG;AAGD,UAAU,gBAAgB;CAAG;AAC7B,UAAU,cAAc;CAAG;AAC3B,UAAU,wBAAwB;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAAE;AAC9F,UAAU,2BAA4B,SAAQ,wBAAwB;CAAG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export class RTCRtpReceiver extends EventEmitter {
|
|
3
|
+
track = null;
|
|
4
|
+
transport = null;
|
|
5
|
+
getParameters() {
|
|
6
|
+
return { codecs: [], headerExtensions: [] };
|
|
7
|
+
}
|
|
8
|
+
async getStats() {
|
|
9
|
+
return new Map();
|
|
10
|
+
}
|
|
11
|
+
getContributingSources() {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
getSynchronizationSources() {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
static getCapabilities(kind) {
|
|
18
|
+
if (kind === 'audio') {
|
|
19
|
+
return {
|
|
20
|
+
codecs: [
|
|
21
|
+
{ mimeType: 'audio/opus', clockRate: 48000, channels: 2 },
|
|
22
|
+
{ mimeType: 'audio/PCMU', clockRate: 8000 },
|
|
23
|
+
],
|
|
24
|
+
headerExtensions: [],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
else if (kind === 'video') {
|
|
28
|
+
return {
|
|
29
|
+
codecs: [
|
|
30
|
+
{ mimeType: 'video/VP8', clockRate: 90000 },
|
|
31
|
+
{ mimeType: 'video/VP9', clockRate: 90000 },
|
|
32
|
+
],
|
|
33
|
+
headerExtensions: [],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=rtp-receiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp-receiver.js","sourceRoot":"","sources":["../src/rtp-receiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,OAAO,cAAe,SAAQ,YAAY;IACrC,KAAK,GAA4B,IAAI,CAAC;IACtC,SAAS,GAA4B,IAAI,CAAC;IAEnD,aAAa;QACX,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,GAAG,EAA+B,CAAC;IAChD,CAAC;IAED,sBAAsB;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,yBAAyB;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,IAAY;QACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO;gBACL,MAAM,EAAE;oBACN,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;oBACzD,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;iBAC5C;gBACD,gBAAgB,EAAE,EAAE;aACrB,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO;gBACL,MAAM,EAAE;oBACN,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE;oBAC3C,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE;iBAC5C;gBACD,gBAAgB,EAAE,EAAE;aACrB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { RTCRtpSendParameters } from './types.js';
|
|
3
|
+
export interface MediaStreamTrack {
|
|
4
|
+
kind: string;
|
|
5
|
+
id: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
muted: boolean;
|
|
8
|
+
readyState: 'live' | 'ended';
|
|
9
|
+
}
|
|
10
|
+
export declare class RTCRtpSender extends EventEmitter {
|
|
11
|
+
readonly track: MediaStreamTrack | null;
|
|
12
|
+
readonly transport: RTCDtlsTransport | null;
|
|
13
|
+
private _parameters;
|
|
14
|
+
constructor(track: MediaStreamTrack | null);
|
|
15
|
+
getStats(): Promise<RTCStatsReport>;
|
|
16
|
+
getParameters(): RTCRtpSendParameters;
|
|
17
|
+
setParameters(params: RTCRtpSendParameters): Promise<void>;
|
|
18
|
+
replaceTrack(withTrack: MediaStreamTrack | null): Promise<void>;
|
|
19
|
+
static getCapabilities(kind: string): {
|
|
20
|
+
codecs: unknown[];
|
|
21
|
+
headerExtensions: unknown[];
|
|
22
|
+
} | null;
|
|
23
|
+
}
|
|
24
|
+
interface RTCDtlsTransport {
|
|
25
|
+
}
|
|
26
|
+
interface RTCStatsReport {
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=rtp-sender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp-sender.d.ts","sourceRoot":"","sources":["../src/rtp-sender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAA4B,MAAM,YAAY,CAAC;AAGjF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACnD,OAAO,CAAC,WAAW,CAAuB;gBAE9B,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAWpC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAIzC,aAAa,IAAI,oBAAoB;IAI/B,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAAC,gBAAgB,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG,IAAI;CA2BhG;AAGD,UAAU,gBAAgB;CAAG;AAC7B,UAAU,cAAc;CAAG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export class RTCRtpSender extends EventEmitter {
|
|
3
|
+
track;
|
|
4
|
+
transport = null;
|
|
5
|
+
_parameters;
|
|
6
|
+
constructor(track) {
|
|
7
|
+
super();
|
|
8
|
+
this.track = track;
|
|
9
|
+
this._parameters = {
|
|
10
|
+
codecs: [],
|
|
11
|
+
headerExtensions: [],
|
|
12
|
+
encodings: [],
|
|
13
|
+
transactionId: '',
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async getStats() {
|
|
17
|
+
return new Map();
|
|
18
|
+
}
|
|
19
|
+
getParameters() {
|
|
20
|
+
return { ...this._parameters };
|
|
21
|
+
}
|
|
22
|
+
async setParameters(params) {
|
|
23
|
+
this._parameters = params;
|
|
24
|
+
}
|
|
25
|
+
replaceTrack(withTrack) {
|
|
26
|
+
this.track = withTrack;
|
|
27
|
+
return Promise.resolve();
|
|
28
|
+
}
|
|
29
|
+
static getCapabilities(kind) {
|
|
30
|
+
// Return default codec capabilities
|
|
31
|
+
if (kind === 'audio') {
|
|
32
|
+
return {
|
|
33
|
+
codecs: [
|
|
34
|
+
{ mimeType: 'audio/opus', clockRate: 48000, channels: 2 },
|
|
35
|
+
{ mimeType: 'audio/PCMU', clockRate: 8000 },
|
|
36
|
+
{ mimeType: 'audio/PCMA', clockRate: 8000 },
|
|
37
|
+
],
|
|
38
|
+
headerExtensions: [
|
|
39
|
+
{ uri: 'urn:ietf:params:rtp-hdrext:ssrc-audio-level', id: 1 },
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
else if (kind === 'video') {
|
|
44
|
+
return {
|
|
45
|
+
codecs: [
|
|
46
|
+
{ mimeType: 'video/VP8', clockRate: 90000 },
|
|
47
|
+
{ mimeType: 'video/VP9', clockRate: 90000 },
|
|
48
|
+
{ mimeType: 'video/H264', clockRate: 90000 },
|
|
49
|
+
],
|
|
50
|
+
headerExtensions: [
|
|
51
|
+
{ uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time', id: 2 },
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=rtp-sender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp-sender.js","sourceRoot":"","sources":["../src/rtp-sender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAYtC,MAAM,OAAO,YAAa,SAAQ,YAAY;IACnC,KAAK,CAA0B;IAC/B,SAAS,GAA4B,IAAI,CAAC;IAC3C,WAAW,CAAuB;IAE1C,YAAY,KAA8B;QACxC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG;YACjB,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,EAAE;YACpB,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,EAAE;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,GAAG,EAA+B,CAAC;IAChD,CAAC;IAED,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAA4B;QAC9C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;IAC5B,CAAC;IAED,YAAY,CAAC,SAAkC;QAC5C,IAAsD,CAAC,KAAK,GAAG,SAAS,CAAC;QAC1E,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,IAAY;QACjC,oCAAoC;QACpC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO;gBACL,MAAM,EAAE;oBACN,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;oBACzD,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;oBAC3C,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;iBAC5C;gBACD,gBAAgB,EAAE;oBAChB,EAAE,GAAG,EAAE,6CAA6C,EAAE,EAAE,EAAE,CAAC,EAAE;iBAC9D;aACF,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO;gBACL,MAAM,EAAE;oBACN,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE;oBAC3C,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE;oBAC3C,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE;iBAC7C;gBACD,gBAAgB,EAAE;oBAChB,EAAE,GAAG,EAAE,4DAA4D,EAAE,EAAE,EAAE,CAAC,EAAE;iBAC7E;aACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { RTCRtpTransceiverDirection } from './types.js';
|
|
3
|
+
import { RTCRtpSender } from './rtp-sender.js';
|
|
4
|
+
import { RTCRtpReceiver } from './rtp-receiver.js';
|
|
5
|
+
export declare class RTCRtpTransceiver extends EventEmitter {
|
|
6
|
+
readonly kind: 'audio' | 'video';
|
|
7
|
+
readonly sender: RTCRtpSender;
|
|
8
|
+
readonly receiver: RTCRtpReceiver;
|
|
9
|
+
readonly mid: string | null;
|
|
10
|
+
direction: RTCRtpTransceiverDirection;
|
|
11
|
+
currentDirection: RTCRtpTransceiverDirection | null;
|
|
12
|
+
stopped: boolean;
|
|
13
|
+
constructor(kind: 'audio' | 'video', direction: RTCRtpTransceiverDirection);
|
|
14
|
+
stop(): void;
|
|
15
|
+
setCodecPreferences(codecs: RTCRtpCodecParameters[]): void;
|
|
16
|
+
}
|
|
17
|
+
interface RTCRtpCodecParameters {
|
|
18
|
+
mimeType: string;
|
|
19
|
+
clockRate: number;
|
|
20
|
+
channels?: number;
|
|
21
|
+
sdpFmtpLine?: string;
|
|
22
|
+
payloadType: number;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=rtp-transceiver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp-transceiver.d.ts","sourceRoot":"","sources":["../src/rtp-transceiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,SAAS,EAAE,0BAA0B,CAAC;IACtC,gBAAgB,EAAE,0BAA0B,GAAG,IAAI,CAAQ;IAC3D,OAAO,UAAS;gBAEJ,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,0BAA0B;IAQ1E,IAAI,IAAI,IAAI;IAMZ,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,IAAI;CAG3D;AAED,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { RTCRtpSender } from './rtp-sender.js';
|
|
3
|
+
import { RTCRtpReceiver } from './rtp-receiver.js';
|
|
4
|
+
export class RTCRtpTransceiver extends EventEmitter {
|
|
5
|
+
kind;
|
|
6
|
+
sender;
|
|
7
|
+
receiver;
|
|
8
|
+
mid = null;
|
|
9
|
+
direction;
|
|
10
|
+
currentDirection = null;
|
|
11
|
+
stopped = false;
|
|
12
|
+
constructor(kind, direction) {
|
|
13
|
+
super();
|
|
14
|
+
this.kind = kind;
|
|
15
|
+
this.sender = new RTCRtpSender(null);
|
|
16
|
+
this.receiver = new RTCRtpReceiver();
|
|
17
|
+
this.direction = direction;
|
|
18
|
+
}
|
|
19
|
+
stop() {
|
|
20
|
+
this.stopped = true;
|
|
21
|
+
this.direction = 'stopped';
|
|
22
|
+
this.currentDirection = 'stopped';
|
|
23
|
+
}
|
|
24
|
+
setCodecPreferences(codecs) {
|
|
25
|
+
// Store codec preferences for SDP generation
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=rtp-transceiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp-transceiver.js","sourceRoot":"","sources":["../src/rtp-transceiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACxC,IAAI,CAAoB;IACxB,MAAM,CAAe;IACrB,QAAQ,CAAiB;IACzB,GAAG,GAAkB,IAAI,CAAC;IACnC,SAAS,CAA6B;IACtC,gBAAgB,GAAsC,IAAI,CAAC;IAC3D,OAAO,GAAG,KAAK,CAAC;IAEhB,YAAY,IAAuB,EAAE,SAAqC;QACxE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,mBAAmB,CAAC,MAA+B;QACjD,6CAA6C;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RTCSessionDescriptionInit, RTCSdpType } from './types.js';
|
|
2
|
+
export declare class RTCSessionDescription implements RTCSessionDescriptionInit {
|
|
3
|
+
readonly type: RTCSdpType;
|
|
4
|
+
readonly sdp: string;
|
|
5
|
+
constructor(init: RTCSessionDescriptionInit);
|
|
6
|
+
toJSON(): RTCSessionDescriptionInit;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=session-description.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-description.d.ts","sourceRoot":"","sources":["../src/session-description.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,qBAAsB,YAAW,yBAAyB;IACrE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAET,IAAI,EAAE,yBAAyB;IAK3C,MAAM,IAAI,yBAAyB;CAGpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-description.js","sourceRoot":"","sources":["../src/session-description.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,qBAAqB;IACvB,IAAI,CAAa;IACjB,GAAG,CAAS;IAErB,YAAY,IAA+B;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;CACF"}
|
package/dist/stats.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface RTCStats {
|
|
2
|
+
id: string;
|
|
3
|
+
type: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
}
|
|
6
|
+
export type RTCStatsReport = RTCStatsReportImpl;
|
|
7
|
+
export declare class RTCStatsReportImpl {
|
|
8
|
+
private readonly _map;
|
|
9
|
+
constructor(map: Map<string, RTCStats>);
|
|
10
|
+
entries(): IterableIterator<[string, RTCStats]>;
|
|
11
|
+
get(id: string): RTCStats | undefined;
|
|
12
|
+
has(id: string): boolean;
|
|
13
|
+
forEach(callbackfn: (value: RTCStats, key: string) => void): void;
|
|
14
|
+
[Symbol.iterator](): IterableIterator<[string, RTCStats]>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEhD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;gBAEjC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;IAItC,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAI/C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIjE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAG1D"}
|
package/dist/stats.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export class RTCStatsReportImpl {
|
|
2
|
+
_map;
|
|
3
|
+
constructor(map) {
|
|
4
|
+
this._map = map;
|
|
5
|
+
}
|
|
6
|
+
entries() {
|
|
7
|
+
return this._map.entries();
|
|
8
|
+
}
|
|
9
|
+
get(id) {
|
|
10
|
+
return this._map.get(id);
|
|
11
|
+
}
|
|
12
|
+
has(id) {
|
|
13
|
+
return this._map.has(id);
|
|
14
|
+
}
|
|
15
|
+
forEach(callbackfn) {
|
|
16
|
+
this._map.forEach(callbackfn);
|
|
17
|
+
}
|
|
18
|
+
[Symbol.iterator]() {
|
|
19
|
+
return this._map.entries();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,kBAAkB;IACZ,IAAI,CAAwB;IAE7C,YAAY,GAA0B;QACpC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,UAAkD;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACF"}
|