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.
Files changed (90) hide show
  1. package/lib/common/src/event.js +0 -3
  2. package/lib/common/src/event.js.map +1 -1
  3. package/lib/dtls/src/flight/server/flight2.js +5 -3
  4. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  5. package/lib/dtls/src/index.d.ts +1 -1
  6. package/lib/dtls/src/index.js.map +1 -1
  7. package/lib/dtls/src/record/receive.js +1 -1
  8. package/lib/dtls/src/record/receive.js.map +1 -1
  9. package/lib/ice/src/candidate.d.ts +2 -1
  10. package/lib/ice/src/candidate.js +17 -4
  11. package/lib/ice/src/candidate.js.map +1 -1
  12. package/lib/ice/src/helper.d.ts +6 -6
  13. package/lib/ice/src/helper.js +18 -15
  14. package/lib/ice/src/helper.js.map +1 -1
  15. package/lib/ice/src/ice.d.ts +28 -75
  16. package/lib/ice/src/ice.js +388 -418
  17. package/lib/ice/src/ice.js.map +1 -1
  18. package/lib/ice/src/iceBase.d.ts +109 -0
  19. package/lib/ice/src/iceBase.js +166 -0
  20. package/lib/ice/src/iceBase.js.map +1 -0
  21. package/lib/ice/src/index.d.ts +1 -0
  22. package/lib/ice/src/index.js +1 -0
  23. package/lib/ice/src/index.js.map +1 -1
  24. package/lib/ice/src/stun/message.d.ts +6 -0
  25. package/lib/ice/src/stun/message.js +4 -0
  26. package/lib/ice/src/stun/message.js.map +1 -1
  27. package/lib/ice/src/stun/protocol.d.ts +5 -6
  28. package/lib/ice/src/stun/protocol.js +18 -18
  29. package/lib/ice/src/stun/protocol.js.map +1 -1
  30. package/lib/ice/src/stun/transaction.js +6 -1
  31. package/lib/ice/src/stun/transaction.js.map +1 -1
  32. package/lib/ice/src/turn/protocol.d.ts +6 -5
  33. package/lib/ice/src/turn/protocol.js +54 -36
  34. package/lib/ice/src/turn/protocol.js.map +1 -1
  35. package/lib/ice/src/types/model.d.ts +4 -0
  36. package/lib/ice/src/types/model.js.map +1 -1
  37. package/lib/rtp/src/extra/container/webm/container.d.ts +3 -1
  38. package/lib/rtp/src/extra/container/webm/container.js +8 -2
  39. package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
  40. package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +6 -0
  41. package/lib/rtp/src/extra/container/webm/ebml/id.js +6 -0
  42. package/lib/rtp/src/extra/container/webm/ebml/id.js.map +1 -1
  43. package/lib/rtp/src/extra/processor/webm.d.ts +11 -16
  44. package/lib/rtp/src/extra/processor/webm.js.map +1 -1
  45. package/lib/rtp/src/extra/processor/webmCallback.d.ts +1 -10
  46. package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
  47. package/lib/rtp/src/rtp/headerExtension.d.ts +45 -3
  48. package/lib/rtp/src/rtp/headerExtension.js +15 -0
  49. package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
  50. package/lib/sctp/src/index.d.ts +1 -1
  51. package/lib/sctp/src/index.js.map +1 -1
  52. package/lib/webrtc/src/const.d.ts +2 -2
  53. package/lib/webrtc/src/const.js.map +1 -1
  54. package/lib/webrtc/src/media/extension/rtpExtension.d.ts +1 -0
  55. package/lib/webrtc/src/media/extension/rtpExtension.js +6 -0
  56. package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
  57. package/lib/webrtc/src/media/router.d.ts +0 -3
  58. package/lib/webrtc/src/media/router.js.map +1 -1
  59. package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -2
  60. package/lib/webrtc/src/media/rtpReceiver.js +2 -2
  61. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  62. package/lib/webrtc/src/media/track.d.ts +2 -2
  63. package/lib/webrtc/src/media/track.js.map +1 -1
  64. package/lib/webrtc/src/nonstandard/recorder/index.d.ts +1 -0
  65. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  66. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +1 -0
  67. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  68. package/lib/webrtc/src/peerConnection.d.ts +12 -6
  69. package/lib/webrtc/src/peerConnection.js +94 -82
  70. package/lib/webrtc/src/peerConnection.js.map +1 -1
  71. package/lib/webrtc/src/sdp.js +15 -3
  72. package/lib/webrtc/src/sdp.js.map +1 -1
  73. package/lib/webrtc/src/transport/dtls.d.ts +5 -5
  74. package/lib/webrtc/src/transport/dtls.js +7 -18
  75. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  76. package/lib/webrtc/src/transport/ice.d.ts +20 -9
  77. package/lib/webrtc/src/transport/ice.js +97 -32
  78. package/lib/webrtc/src/transport/ice.js.map +1 -1
  79. package/package.json +1 -1
  80. package/src/const.ts +2 -2
  81. package/src/media/extension/rtpExtension.ts +6 -0
  82. package/src/media/router.ts +2 -3
  83. package/src/media/rtpReceiver.ts +4 -3
  84. package/src/media/track.ts +7 -2
  85. package/src/nonstandard/recorder/index.ts +1 -0
  86. package/src/nonstandard/recorder/writer/webm.ts +47 -43
  87. package/src/peerConnection.ts +118 -88
  88. package/src/sdp.ts +16 -3
  89. package/src/transport/dtls.ts +11 -9
  90. 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(gather) {
17
- Object.defineProperty(this, "gather", {
16
+ constructor(iceGather) {
17
+ Object.defineProperty(this, "iceGather", {
18
18
  enumerable: true,
19
19
  configurable: true,
20
20
  writable: true,
21
- value: gather
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, "waitStart", {
59
+ Object.defineProperty(this, "onIceCandidate", {
48
60
  enumerable: true,
49
61
  configurable: true,
50
62
  writable: true,
51
- value: void 0
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.gather.connection;
86
+ this.connection = this.iceGather.connection;
69
87
  this.connection.stateChanged.subscribe((state) => {
70
88
  this.setState(state);
71
89
  });
72
- }
73
- get iceGather() {
74
- return this.gather;
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
- if (this.onStateChange.ended)
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
- setRemoteParams(remoteParameters) {
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
- log("restartIce", remoteParameters);
102
- this.connection.resetNominatedPair();
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, "onGatheringStateChange", {
209
+ Object.defineProperty(this, "connection", {
166
210
  enumerable: true,
167
211
  configurable: true,
168
212
  writable: true,
169
- value: new common_1.Event()
213
+ value: void 0
170
214
  });
171
- Object.defineProperty(this, "connection", {
215
+ Object.defineProperty(this, "onGatheringStateChange", {
172
216
  enumerable: true,
173
217
  configurable: true,
174
218
  writable: true,
175
- value: void 0
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((candidate) => {
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.localUserName,
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "werift",
3
- "version": "0.20.1",
3
+ "version": "0.21.0",
4
4
  "description": "WebRTC Implementation for TypeScript (Node.js)",
5
5
  "keywords": [
6
6
  "WebRTC",
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 };
@@ -42,3 +42,9 @@ export function useAudioLevelIndication() {
42
42
  uri: RTP_EXTENSION_URI.audioLevelIndication,
43
43
  });
44
44
  }
45
+
46
+ export function useVideoOrientation() {
47
+ return new RTCRtpHeaderExtensionParameters({
48
+ uri: RTP_EXTENSION_URI.videoOrientation,
49
+ });
50
+ }
@@ -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
  );
@@ -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
- import type { Extensions } from "./router";
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
 
@@ -1,7 +1,12 @@
1
1
  import { v4 } from "uuid";
2
2
  import { Event } from "../imports/common";
3
3
 
4
- import { type RtcpPacket, type RtpHeader, RtpPacket } from "../../../rtp/src";
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">]
@@ -92,6 +92,7 @@ export class MediaRecorder {
92
92
  export interface MediaRecorderOptions {
93
93
  width: number;
94
94
  height: number;
95
+ roll: number;
95
96
  jitterBufferLatency: number;
96
97
  jitterBufferSize: number;
97
98
  disableLipSync: boolean;
@@ -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((track, i) => {
32
- const trackNumber = i + 1;
33
- const payloadType = track.codec!.payloadType;
34
-
35
- if (track.kind === "video") {
36
- const codec = ((): SupportedCodec => {
37
- switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {
38
- case "vp8":
39
- return "VP8";
40
- case "vp9":
41
- return "VP9";
42
- case "h264":
43
- return "MPEG4/ISO/AVC";
44
- case "av1x":
45
- return "AV1";
46
- default:
47
- throw new WeriftError({
48
- message: "unsupported codec",
49
- payload: { track, path: sourcePath },
50
- });
51
- }
52
- })();
53
- return {
54
- kind: "video" as const,
55
- codec,
56
- clockRate: 90000,
57
- trackNumber,
58
- width: this.props.width ?? 640,
59
- height: this.props.height ?? 360,
60
- payloadType,
61
- track,
62
- };
63
- } else {
64
- return {
65
- kind: "audio" as const,
66
- codec: "OPUS" as const,
67
- clockRate: 48000,
68
- trackNumber,
69
- payloadType,
70
- track,
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,