werift 0.20.1 → 0.21.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/lib/common/src/event.js +0 -3
- package/lib/common/src/event.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js +5 -3
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/index.d.ts +1 -1
- package/lib/dtls/src/index.js.map +1 -1
- package/lib/dtls/src/record/receive.js +1 -1
- package/lib/dtls/src/record/receive.js.map +1 -1
- package/lib/ice/src/candidate.d.ts +2 -1
- package/lib/ice/src/candidate.js +17 -4
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/helper.d.ts +6 -6
- package/lib/ice/src/helper.js +18 -15
- package/lib/ice/src/helper.js.map +1 -1
- package/lib/ice/src/ice.d.ts +28 -75
- package/lib/ice/src/ice.js +388 -418
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +109 -0
- package/lib/ice/src/iceBase.js +166 -0
- package/lib/ice/src/iceBase.js.map +1 -0
- package/lib/ice/src/index.d.ts +1 -0
- package/lib/ice/src/index.js +1 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +6 -0
- package/lib/ice/src/stun/message.js +4 -0
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +5 -6
- package/lib/ice/src/stun/protocol.js +18 -18
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/transaction.js +6 -1
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +6 -5
- package/lib/ice/src/turn/protocol.js +54 -36
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +4 -0
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/container.d.ts +3 -1
- package/lib/rtp/src/extra/container/webm/container.js +8 -2
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +6 -0
- package/lib/rtp/src/extra/container/webm/ebml/id.js +6 -0
- package/lib/rtp/src/extra/container/webm/ebml/id.js.map +1 -1
- package/lib/rtp/src/extra/processor/webm.d.ts +11 -16
- package/lib/rtp/src/extra/processor/webm.js.map +1 -1
- package/lib/rtp/src/extra/processor/webmCallback.d.ts +1 -10
- package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
- package/lib/rtp/src/rtp/headerExtension.d.ts +45 -3
- package/lib/rtp/src/rtp/headerExtension.js +15 -0
- package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
- package/lib/sctp/src/index.d.ts +1 -1
- package/lib/sctp/src/index.js.map +1 -1
- package/lib/webrtc/src/const.d.ts +2 -2
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/media/extension/rtpExtension.d.ts +1 -0
- package/lib/webrtc/src/media/extension/rtpExtension.js +6 -0
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +0 -3
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -2
- package/lib/webrtc/src/media/rtpReceiver.js +2 -2
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +2 -2
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/index.d.ts +1 -0
- package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +1 -0
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +12 -6
- package/lib/webrtc/src/peerConnection.js +94 -82
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.js +15 -3
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +5 -5
- package/lib/webrtc/src/transport/dtls.js +7 -18
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +20 -9
- package/lib/webrtc/src/transport/ice.js +97 -32
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/package.json +1 -1
- package/src/const.ts +2 -2
- package/src/media/extension/rtpExtension.ts +6 -0
- package/src/media/router.ts +2 -3
- package/src/media/rtpReceiver.ts +4 -3
- package/src/media/track.ts +7 -2
- package/src/nonstandard/recorder/index.ts +1 -0
- package/src/nonstandard/recorder/writer/webm.ts +47 -43
- package/src/peerConnection.ts +118 -88
- package/src/sdp.ts +16 -3
- package/src/transport/dtls.ts +11 -9
- package/src/transport/ice.ts +73 -26
|
@@ -13,12 +13,12 @@ const src_1 = require("../../../ice/src");
|
|
|
13
13
|
const sdp_1 = require("../sdp");
|
|
14
14
|
const log = (0, debug_1.default)("werift:packages/webrtc/src/transport/ice.ts");
|
|
15
15
|
class RTCIceTransport {
|
|
16
|
-
constructor(
|
|
17
|
-
Object.defineProperty(this, "
|
|
16
|
+
constructor(iceGather) {
|
|
17
|
+
Object.defineProperty(this, "iceGather", {
|
|
18
18
|
enumerable: true,
|
|
19
19
|
configurable: true,
|
|
20
20
|
writable: true,
|
|
21
|
-
value:
|
|
21
|
+
value: iceGather
|
|
22
22
|
});
|
|
23
23
|
Object.defineProperty(this, "id", {
|
|
24
24
|
enumerable: true,
|
|
@@ -38,17 +38,35 @@ class RTCIceTransport {
|
|
|
38
38
|
writable: true,
|
|
39
39
|
value: "new"
|
|
40
40
|
});
|
|
41
|
+
Object.defineProperty(this, "waitStart", {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
configurable: true,
|
|
44
|
+
writable: true,
|
|
45
|
+
value: void 0
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(this, "renominating", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: false
|
|
52
|
+
});
|
|
41
53
|
Object.defineProperty(this, "onStateChange", {
|
|
42
54
|
enumerable: true,
|
|
43
55
|
configurable: true,
|
|
44
56
|
writable: true,
|
|
45
57
|
value: new common_1.Event()
|
|
46
58
|
});
|
|
47
|
-
Object.defineProperty(this, "
|
|
59
|
+
Object.defineProperty(this, "onIceCandidate", {
|
|
48
60
|
enumerable: true,
|
|
49
61
|
configurable: true,
|
|
50
62
|
writable: true,
|
|
51
|
-
value:
|
|
63
|
+
value: new common_1.Event()
|
|
64
|
+
});
|
|
65
|
+
Object.defineProperty(this, "onNegotiationNeeded", {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
configurable: true,
|
|
68
|
+
writable: true,
|
|
69
|
+
value: new common_1.Event()
|
|
52
70
|
});
|
|
53
71
|
Object.defineProperty(this, "addRemoteCandidate", {
|
|
54
72
|
enumerable: true,
|
|
@@ -65,13 +83,13 @@ class RTCIceTransport {
|
|
|
65
83
|
}
|
|
66
84
|
}
|
|
67
85
|
});
|
|
68
|
-
this.connection = this.
|
|
86
|
+
this.connection = this.iceGather.connection;
|
|
69
87
|
this.connection.stateChanged.subscribe((state) => {
|
|
70
88
|
this.setState(state);
|
|
71
89
|
});
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
90
|
+
this.iceGather.onIceCandidate = (candidate) => {
|
|
91
|
+
this.onIceCandidate.execute(candidate);
|
|
92
|
+
};
|
|
75
93
|
}
|
|
76
94
|
get role() {
|
|
77
95
|
if (this.connection.iceControlling)
|
|
@@ -79,30 +97,51 @@ class RTCIceTransport {
|
|
|
79
97
|
else
|
|
80
98
|
return "controlled";
|
|
81
99
|
}
|
|
100
|
+
get gatheringState() {
|
|
101
|
+
return this.iceGather.gatheringState;
|
|
102
|
+
}
|
|
103
|
+
get localCandidates() {
|
|
104
|
+
return this.iceGather.localCandidates;
|
|
105
|
+
}
|
|
106
|
+
get localParameters() {
|
|
107
|
+
return this.iceGather.localParameters;
|
|
108
|
+
}
|
|
82
109
|
setState(state) {
|
|
83
110
|
if (state !== this.state) {
|
|
84
111
|
this.state = state;
|
|
85
|
-
|
|
86
|
-
return;
|
|
87
|
-
if (state === "closed") {
|
|
88
|
-
this.onStateChange.execute(state);
|
|
89
|
-
this.onStateChange.complete();
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
this.onStateChange.execute(state);
|
|
93
|
-
}
|
|
112
|
+
this.onStateChange.execute(state);
|
|
94
113
|
}
|
|
95
114
|
}
|
|
96
|
-
|
|
115
|
+
gather() {
|
|
116
|
+
return this.iceGather.gather();
|
|
117
|
+
}
|
|
118
|
+
setRemoteParams(remoteParameters, renomination = false) {
|
|
119
|
+
if (renomination) {
|
|
120
|
+
this.renominating = true;
|
|
121
|
+
}
|
|
97
122
|
if (this.connection.remoteUsername &&
|
|
98
123
|
this.connection.remotePassword &&
|
|
99
124
|
(this.connection.remoteUsername !== remoteParameters.usernameFragment ||
|
|
100
125
|
this.connection.remotePassword !== remoteParameters.password)) {
|
|
101
|
-
|
|
102
|
-
|
|
126
|
+
if (this.renominating) {
|
|
127
|
+
log("renomination", remoteParameters);
|
|
128
|
+
this.connection.resetNominatedPair();
|
|
129
|
+
this.renominating = false;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
log("restart", remoteParameters);
|
|
133
|
+
this.restart();
|
|
134
|
+
}
|
|
103
135
|
}
|
|
104
136
|
this.connection.setRemoteParams(remoteParameters);
|
|
105
137
|
}
|
|
138
|
+
restart() {
|
|
139
|
+
this.connection.restart();
|
|
140
|
+
this.setState("new");
|
|
141
|
+
this.iceGather.gatheringState = "new";
|
|
142
|
+
this.waitStart = undefined;
|
|
143
|
+
this.onNegotiationNeeded.execute();
|
|
144
|
+
}
|
|
106
145
|
async start() {
|
|
107
146
|
if (this.state === "closed") {
|
|
108
147
|
throw new Error("RTCIceTransport is closed");
|
|
@@ -122,13 +161,18 @@ class RTCIceTransport {
|
|
|
122
161
|
this.setState("failed");
|
|
123
162
|
throw error;
|
|
124
163
|
}
|
|
164
|
+
this.waitStart.execute();
|
|
125
165
|
this.waitStart.complete();
|
|
166
|
+
this.waitStart = undefined;
|
|
126
167
|
}
|
|
127
168
|
async stop() {
|
|
128
169
|
if (this.state !== "closed") {
|
|
129
170
|
this.setState("closed");
|
|
130
171
|
await this.connection.close();
|
|
131
172
|
}
|
|
173
|
+
this.onStateChange.complete();
|
|
174
|
+
this.onIceCandidate.complete();
|
|
175
|
+
this.onNegotiationNeeded.complete();
|
|
132
176
|
}
|
|
133
177
|
}
|
|
134
178
|
exports.RTCIceTransport = RTCIceTransport;
|
|
@@ -162,26 +206,27 @@ class RTCIceGatherer {
|
|
|
162
206
|
writable: true,
|
|
163
207
|
value: "new"
|
|
164
208
|
});
|
|
165
|
-
Object.defineProperty(this, "
|
|
209
|
+
Object.defineProperty(this, "connection", {
|
|
166
210
|
enumerable: true,
|
|
167
211
|
configurable: true,
|
|
168
212
|
writable: true,
|
|
169
|
-
value:
|
|
213
|
+
value: void 0
|
|
170
214
|
});
|
|
171
|
-
Object.defineProperty(this, "
|
|
215
|
+
Object.defineProperty(this, "onGatheringStateChange", {
|
|
172
216
|
enumerable: true,
|
|
173
217
|
configurable: true,
|
|
174
218
|
writable: true,
|
|
175
|
-
value:
|
|
219
|
+
value: new common_1.Event()
|
|
176
220
|
});
|
|
177
221
|
this.connection = new src_1.Connection(false, this.options);
|
|
222
|
+
this.connection.onIceCandidate.subscribe((candidate) => {
|
|
223
|
+
this.onIceCandidate(candidateFromIce(candidate));
|
|
224
|
+
});
|
|
178
225
|
}
|
|
179
226
|
async gather() {
|
|
180
227
|
if (this.gatheringState === "new") {
|
|
181
228
|
this.setState("gathering");
|
|
182
|
-
await this.connection.gatherCandidates(
|
|
183
|
-
this.onIceCandidate(candidateFromIce(candidate));
|
|
184
|
-
});
|
|
229
|
+
await this.connection.gatherCandidates();
|
|
185
230
|
this.onIceCandidate(undefined);
|
|
186
231
|
this.setState("complete");
|
|
187
232
|
}
|
|
@@ -191,7 +236,7 @@ class RTCIceGatherer {
|
|
|
191
236
|
}
|
|
192
237
|
get localParameters() {
|
|
193
238
|
const params = new RTCIceParameters({
|
|
194
|
-
usernameFragment: this.connection.
|
|
239
|
+
usernameFragment: this.connection.localUsername,
|
|
195
240
|
password: this.connection.localPassword,
|
|
196
241
|
});
|
|
197
242
|
return params;
|
|
@@ -205,14 +250,14 @@ class RTCIceGatherer {
|
|
|
205
250
|
}
|
|
206
251
|
exports.RTCIceGatherer = RTCIceGatherer;
|
|
207
252
|
function candidateFromIce(c) {
|
|
208
|
-
const candidate = new IceCandidate(c.component, c.foundation, c.host, c.port, c.priority, c.transport, c.type);
|
|
253
|
+
const candidate = new IceCandidate(c.component, c.foundation, c.host, c.port, c.priority, c.transport, c.type, c.generation, c.ufrag);
|
|
209
254
|
candidate.relatedAddress = c.relatedAddress;
|
|
210
255
|
candidate.relatedPort = c.relatedPort;
|
|
211
256
|
candidate.tcpType = c.tcptype;
|
|
212
257
|
return candidate;
|
|
213
258
|
}
|
|
214
259
|
function candidateToIce(x) {
|
|
215
|
-
return new src_1.Candidate(x.foundation, x.component, x.protocol, x.priority, x.ip, x.port, x.type, x.relatedAddress, x.relatedPort, x.tcpType);
|
|
260
|
+
return new src_1.Candidate(x.foundation, x.component, x.protocol, x.priority, x.ip, x.port, x.type, x.relatedAddress, x.relatedPort, x.tcpType, x.generation, x.ufrag);
|
|
216
261
|
}
|
|
217
262
|
class RTCIceCandidate {
|
|
218
263
|
constructor(props) {
|
|
@@ -234,6 +279,12 @@ class RTCIceCandidate {
|
|
|
234
279
|
writable: true,
|
|
235
280
|
value: void 0
|
|
236
281
|
});
|
|
282
|
+
Object.defineProperty(this, "usernameFragment", {
|
|
283
|
+
enumerable: true,
|
|
284
|
+
configurable: true,
|
|
285
|
+
writable: true,
|
|
286
|
+
value: void 0
|
|
287
|
+
});
|
|
237
288
|
Object.assign(this, props);
|
|
238
289
|
}
|
|
239
290
|
static isThis(o) {
|
|
@@ -245,12 +296,13 @@ class RTCIceCandidate {
|
|
|
245
296
|
candidate: this.candidate,
|
|
246
297
|
sdpMid: this.sdpMid,
|
|
247
298
|
sdpMLineIndex: this.sdpMLineIndex,
|
|
299
|
+
usernameFragment: this.usernameFragment,
|
|
248
300
|
};
|
|
249
301
|
}
|
|
250
302
|
}
|
|
251
303
|
exports.RTCIceCandidate = RTCIceCandidate;
|
|
252
304
|
class IceCandidate {
|
|
253
|
-
constructor(component, foundation, ip, port, priority, protocol, type) {
|
|
305
|
+
constructor(component, foundation, ip, port, priority, protocol, type, generation, ufrag) {
|
|
254
306
|
Object.defineProperty(this, "component", {
|
|
255
307
|
enumerable: true,
|
|
256
308
|
configurable: true,
|
|
@@ -293,6 +345,18 @@ class IceCandidate {
|
|
|
293
345
|
writable: true,
|
|
294
346
|
value: type
|
|
295
347
|
});
|
|
348
|
+
Object.defineProperty(this, "generation", {
|
|
349
|
+
enumerable: true,
|
|
350
|
+
configurable: true,
|
|
351
|
+
writable: true,
|
|
352
|
+
value: generation
|
|
353
|
+
});
|
|
354
|
+
Object.defineProperty(this, "ufrag", {
|
|
355
|
+
enumerable: true,
|
|
356
|
+
configurable: true,
|
|
357
|
+
writable: true,
|
|
358
|
+
value: ufrag
|
|
359
|
+
});
|
|
296
360
|
// """
|
|
297
361
|
// The :class:`RTCIceCandidate` interface represents a candidate Interactive
|
|
298
362
|
// Connectivity Establishment (ICE) configuration which may be used to
|
|
@@ -334,6 +398,7 @@ class IceCandidate {
|
|
|
334
398
|
candidate: (0, sdp_1.candidateToSdp)(this),
|
|
335
399
|
sdpMLineIndex: this.sdpMLineIndex,
|
|
336
400
|
sdpMid: this.sdpMid,
|
|
401
|
+
usernameFragment: this.ufrag,
|
|
337
402
|
});
|
|
338
403
|
}
|
|
339
404
|
static fromJSON(data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { v4 } from \"uuid\";\nimport { Event } from \"../imports/common\";\n\nimport { Candidate, Connection, type IceOptions } from \"../../../ice/src\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nexport class RTCIceTransport {\n readonly id = v4();\n connection: Connection;\n state: RTCIceConnectionState = \"new\";\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n\n private waitStart?: Event<[]>;\n\n constructor(private gather: RTCIceGatherer) {\n this.connection = this.gather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n }\n\n get iceGather() {\n return this.gather;\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n if (this.onStateChange.ended) return;\n\n if (state === \"closed\") {\n this.onStateChange.execute(state);\n this.onStateChange.complete();\n } else {\n this.onStateChange.execute(state);\n }\n }\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters) {\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n log(\"restartIce\", remoteParameters);\n this.connection.resetNominatedPair();\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n async start() {\n if (this.state === \"closed\") {\n throw new Error(\"RTCIceTransport is closed\");\n }\n if (!this.connection.remotePassword || !this.connection.remoteUsername) {\n throw new Error(\"remoteParams missing\");\n }\n\n if (this.waitStart) {\n await this.waitStart.asPromise();\n }\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.complete();\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n readonly connection: Connection;\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUserName,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n );\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n });\n }\n\n static fromJSON(data: RTCIceCandidate) {\n try {\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex;\n candidate.sdpMid = data.sdpMid;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { v4 } from \"uuid\";\nimport { Event } from \"../imports/common\";\n\nimport {\n Candidate,\n Connection,\n type IceConnection,\n type IceOptions,\n} from \"../../../ice/src\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nexport class RTCIceTransport {\n readonly id = v4();\n connection: IceConnection;\n state: RTCIceConnectionState = \"new\";\n private waitStart?: Event<[]>;\n private renominating = false;\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(private iceGather: RTCIceGatherer) {\n this.connection = this.iceGather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n this.iceGather.onIceCandidate = (candidate) => {\n this.onIceCandidate.execute(candidate);\n };\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n get gatheringState() {\n return this.iceGather.gatheringState;\n }\n\n get localCandidates() {\n return this.iceGather.localCandidates;\n }\n\n get localParameters() {\n return this.iceGather.localParameters;\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n this.onStateChange.execute(state);\n }\n }\n\n gather() {\n return this.iceGather.gather();\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters, renomination = false) {\n if (renomination) {\n this.renominating = true;\n }\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n if (this.renominating) {\n log(\"renomination\", remoteParameters);\n this.connection.resetNominatedPair();\n this.renominating = false;\n } else {\n log(\"restart\", remoteParameters);\n this.restart();\n }\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n restart() {\n this.connection.restart();\n this.setState(\"new\");\n this.iceGather.gatheringState = \"new\";\n this.waitStart = undefined;\n this.onNegotiationNeeded.execute();\n }\n\n async start() {\n if (this.state === \"closed\") {\n throw new Error(\"RTCIceTransport is closed\");\n }\n if (!this.connection.remotePassword || !this.connection.remoteUsername) {\n throw new Error(\"remoteParams missing\");\n }\n\n if (this.waitStart) {\n await this.waitStart.asPromise();\n }\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.execute();\n this.waitStart.complete();\n this.waitStart = undefined;\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n this.onStateChange.complete();\n this.onIceCandidate.complete();\n this.onNegotiationNeeded.complete();\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n readonly connection: IceConnection;\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n this.connection.onIceCandidate.subscribe((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates();\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUsername,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n c.generation,\n c.ufrag,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n x.generation,\n x.ufrag,\n );\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n usernameFragment?: string;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n usernameFragment: this.usernameFragment,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n public generation?: number,\n public ufrag?: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n usernameFragment: this.ufrag,\n });\n }\n\n static fromJSON(data: RTCIceCandidate) {\n try {\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex;\n candidate.sdpMid = data.sdpMid;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
package/package.json
CHANGED
package/src/const.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
-
HashAlgorithms,
|
|
2
|
+
type HashAlgorithms,
|
|
3
3
|
SignatureAlgorithm,
|
|
4
4
|
} from "../../dtls/src/cipher/const";
|
|
5
5
|
import {
|
|
@@ -63,4 +63,4 @@ export const SRTP_PROFILE = {
|
|
|
63
63
|
export const SenderDirections = ["sendonly", "sendrecv"];
|
|
64
64
|
export const ReceiverDirection = ["sendrecv", "recvonly"];
|
|
65
65
|
|
|
66
|
-
export { HashAlgorithms, SignatureAlgorithm };
|
|
66
|
+
export { type HashAlgorithms, SignatureAlgorithm };
|
package/src/media/router.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import debug from "debug";
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
type Extensions,
|
|
4
5
|
RTP_EXTENSION_URI,
|
|
5
6
|
ReceiverEstimatedMaxBitrate,
|
|
6
7
|
type RtcpPacket,
|
|
@@ -23,8 +24,6 @@ import { MediaStreamTrack } from "./track";
|
|
|
23
24
|
|
|
24
25
|
const log = debug("werift:packages/webrtc/src/media/router.ts");
|
|
25
26
|
|
|
26
|
-
export type Extensions = { [uri: string]: number | string };
|
|
27
|
-
|
|
28
27
|
export class RtpRouter {
|
|
29
28
|
ssrcTable: { [ssrc: number]: RTCRtpReceiver | RTCRtpSender } = {};
|
|
30
29
|
ridTable: { [rid: string]: RTCRtpReceiver | RTCRtpSender } = {};
|
|
@@ -92,7 +91,7 @@ export class RtpRouter {
|
|
|
92
91
|
}
|
|
93
92
|
|
|
94
93
|
routeRtp = (packet: RtpPacket) => {
|
|
95
|
-
const extensions = rtpHeaderExtensionsParser(
|
|
94
|
+
const extensions: Extensions = rtpHeaderExtensionsParser(
|
|
96
95
|
packet.header.extensions,
|
|
97
96
|
this.extIdUriMap,
|
|
98
97
|
);
|
package/src/media/rtpReceiver.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "..";
|
|
12
12
|
import { int } from "../../../common/src";
|
|
13
13
|
import {
|
|
14
|
+
type Extensions,
|
|
14
15
|
PictureLossIndication,
|
|
15
16
|
RTP_EXTENSION_URI,
|
|
16
17
|
Red,
|
|
@@ -34,7 +35,7 @@ import type {
|
|
|
34
35
|
import { NackHandler } from "./receiver/nack";
|
|
35
36
|
import { ReceiverTWCC } from "./receiver/receiverTwcc";
|
|
36
37
|
import { StreamStatistics } from "./receiver/statistics";
|
|
37
|
-
|
|
38
|
+
|
|
38
39
|
import type { MediaStreamTrack } from "./track";
|
|
39
40
|
|
|
40
41
|
const log = debug("werift:packages/webrtc/src/media/rtpReceiver.ts");
|
|
@@ -342,12 +343,12 @@ export class RTCRtpReceiver {
|
|
|
342
343
|
if (track.kind === "audio") {
|
|
343
344
|
const payloads = this.audioRedHandler.push(red, packet);
|
|
344
345
|
for (const packet of payloads) {
|
|
345
|
-
track.onReceiveRtp.execute(packet.clone());
|
|
346
|
+
track.onReceiveRtp.execute(packet.clone(), extensions);
|
|
346
347
|
}
|
|
347
348
|
} else {
|
|
348
349
|
}
|
|
349
350
|
} else {
|
|
350
|
-
track.onReceiveRtp.execute(packet.clone());
|
|
351
|
+
track.onReceiveRtp.execute(packet.clone(), extensions);
|
|
351
352
|
}
|
|
352
353
|
}
|
|
353
354
|
|
package/src/media/track.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { v4 } from "uuid";
|
|
2
2
|
import { Event } from "../imports/common";
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
type Extensions,
|
|
6
|
+
type RtcpPacket,
|
|
7
|
+
type RtpHeader,
|
|
8
|
+
RtpPacket,
|
|
9
|
+
} from "../../../rtp/src";
|
|
5
10
|
import { EventTarget } from "../helper";
|
|
6
11
|
import type { Kind } from "../types/domain";
|
|
7
12
|
import type { RTCRtpCodecParameters } from "./parameters";
|
|
@@ -22,7 +27,7 @@ export class MediaStreamTrack extends EventTarget {
|
|
|
22
27
|
/**todo impl */
|
|
23
28
|
enabled = true;
|
|
24
29
|
|
|
25
|
-
readonly onReceiveRtp = new Event<[RtpPacket]>();
|
|
30
|
+
readonly onReceiveRtp = new Event<[RtpPacket, Extensions?]>();
|
|
26
31
|
readonly onReceiveRtcp = new Event<[RtcpPacket]>();
|
|
27
32
|
readonly onSourceChanged = new Event<
|
|
28
33
|
[Pick<RtpHeader, "sequenceNumber" | "timestamp">]
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
RtpTimeCallback,
|
|
14
14
|
type SupportedCodec,
|
|
15
15
|
WebmCallback,
|
|
16
|
+
type WebmTrack,
|
|
16
17
|
saveToFileSystem,
|
|
17
18
|
} from "../../../../../rtp/src/extra";
|
|
18
19
|
|
|
@@ -28,49 +29,52 @@ export class WebmFactory extends MediaWriter {
|
|
|
28
29
|
await unlink(this.props.path).catch((e) => e);
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
const inputTracks = tracks.map(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
32
|
+
const inputTracks: (WebmTrack & { track: MediaStreamTrack })[] = tracks.map(
|
|
33
|
+
(track, i) => {
|
|
34
|
+
const trackNumber = i + 1;
|
|
35
|
+
const payloadType = track.codec!.payloadType;
|
|
36
|
+
|
|
37
|
+
if (track.kind === "video") {
|
|
38
|
+
const codec = ((): SupportedCodec => {
|
|
39
|
+
switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {
|
|
40
|
+
case "vp8":
|
|
41
|
+
return "VP8";
|
|
42
|
+
case "vp9":
|
|
43
|
+
return "VP9";
|
|
44
|
+
case "h264":
|
|
45
|
+
return "MPEG4/ISO/AVC";
|
|
46
|
+
case "av1x":
|
|
47
|
+
return "AV1";
|
|
48
|
+
default:
|
|
49
|
+
throw new WeriftError({
|
|
50
|
+
message: "unsupported codec",
|
|
51
|
+
payload: { track, path: sourcePath },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
})();
|
|
55
|
+
return {
|
|
56
|
+
kind: "video" as const,
|
|
57
|
+
codec,
|
|
58
|
+
clockRate: 90000,
|
|
59
|
+
trackNumber,
|
|
60
|
+
width: this.props.width ?? 640,
|
|
61
|
+
height: this.props.height ?? 360,
|
|
62
|
+
roll: this.props.roll,
|
|
63
|
+
payloadType,
|
|
64
|
+
track,
|
|
65
|
+
};
|
|
66
|
+
} else {
|
|
67
|
+
return {
|
|
68
|
+
kind: "audio" as const,
|
|
69
|
+
codec: "OPUS" as const,
|
|
70
|
+
clockRate: 48000,
|
|
71
|
+
trackNumber,
|
|
72
|
+
payloadType,
|
|
73
|
+
track,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
);
|
|
74
78
|
|
|
75
79
|
const webm = new WebmCallback(inputTracks, {
|
|
76
80
|
duration: this.props.defaultDuration ?? 1000 * 60 * 60 * 24,
|