werift 0.15.10 → 0.16.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 (164) hide show
  1. package/lib/common/src/index.d.ts +2 -0
  2. package/lib/common/src/index.js +2 -0
  3. package/lib/common/src/index.js.map +1 -1
  4. package/lib/common/src/log.d.ts +11 -0
  5. package/lib/common/src/log.js +17 -0
  6. package/lib/common/src/log.js.map +1 -0
  7. package/lib/common/src/network.d.ts +7 -3
  8. package/lib/common/src/network.js +15 -7
  9. package/lib/common/src/network.js.map +1 -1
  10. package/lib/common/src/type.d.ts +3 -0
  11. package/lib/common/src/type.js +3 -0
  12. package/lib/common/src/type.js.map +1 -0
  13. package/lib/dtls/src/context/cipher.js.map +1 -1
  14. package/lib/dtls/src/flight/server/flight2.js +10 -0
  15. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  16. package/lib/ice/src/ice.d.ts +3 -0
  17. package/lib/ice/src/ice.js +9 -2
  18. package/lib/ice/src/ice.js.map +1 -1
  19. package/lib/ice/src/stun/protocol.d.ts +2 -1
  20. package/lib/ice/src/stun/protocol.js +3 -3
  21. package/lib/ice/src/stun/protocol.js.map +1 -1
  22. package/lib/ice/src/transport.d.ts +4 -2
  23. package/lib/ice/src/transport.js +8 -6
  24. package/lib/ice/src/transport.js.map +1 -1
  25. package/lib/ice/src/turn/protocol.d.ts +3 -1
  26. package/lib/ice/src/turn/protocol.js +2 -2
  27. package/lib/ice/src/turn/protocol.js.map +1 -1
  28. package/lib/ice/src/utils.d.ts +2 -1
  29. package/lib/ice/src/utils.js +2 -2
  30. package/lib/ice/src/utils.js.map +1 -1
  31. package/lib/rtp/src/codec/index.d.ts +18 -0
  32. package/lib/rtp/src/codec/index.js +81 -0
  33. package/lib/rtp/src/codec/index.js.map +1 -0
  34. package/lib/rtp/src/codec/vp8.d.ts +5 -3
  35. package/lib/rtp/src/codec/vp8.js +19 -5
  36. package/lib/rtp/src/codec/vp8.js.map +1 -1
  37. package/lib/rtp/src/container/webm.d.ts +6 -1
  38. package/lib/rtp/src/container/webm.js +9 -2
  39. package/lib/rtp/src/container/webm.js.map +1 -1
  40. package/lib/rtp/src/index.d.ts +2 -6
  41. package/lib/rtp/src/index.js +2 -6
  42. package/lib/rtp/src/index.js.map +1 -1
  43. package/lib/rtp/src/processor/base.d.ts +3 -1
  44. package/lib/rtp/src/processor/base.js +19 -6
  45. package/lib/rtp/src/processor/base.js.map +1 -1
  46. package/lib/rtp/src/processor/jitterBuffer.js +1 -2
  47. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  48. package/lib/rtp/src/processor/lipsync.js +22 -2
  49. package/lib/rtp/src/processor/lipsync.js.map +1 -1
  50. package/lib/rtp/src/processor/webm.d.ts +11 -7
  51. package/lib/rtp/src/processor/webm.js +16 -41
  52. package/lib/rtp/src/processor/webm.js.map +1 -1
  53. package/lib/rtp/src/processor_v2/depacketizer.d.ts +17 -0
  54. package/lib/rtp/src/processor_v2/depacketizer.js +84 -0
  55. package/lib/rtp/src/processor_v2/depacketizer.js.map +1 -0
  56. package/lib/rtp/src/processor_v2/index.d.ts +4 -0
  57. package/lib/rtp/src/processor_v2/index.js +21 -0
  58. package/lib/rtp/src/processor_v2/index.js.map +1 -0
  59. package/lib/rtp/src/processor_v2/jitterBuffer.d.ts +33 -0
  60. package/lib/rtp/src/processor_v2/jitterBuffer.js +154 -0
  61. package/lib/rtp/src/processor_v2/jitterBuffer.js.map +1 -0
  62. package/lib/rtp/src/processor_v2/source/base.d.ts +8 -0
  63. package/lib/rtp/src/processor_v2/source/base.js +16 -0
  64. package/lib/rtp/src/processor_v2/source/base.js.map +1 -0
  65. package/lib/rtp/src/processor_v2/source/index.d.ts +2 -0
  66. package/lib/rtp/src/processor_v2/source/index.js +6 -0
  67. package/lib/rtp/src/processor_v2/source/index.js.map +1 -0
  68. package/lib/rtp/src/processor_v2/source/rtp.d.ts +14 -0
  69. package/lib/rtp/src/processor_v2/source/rtp.js +24 -0
  70. package/lib/rtp/src/processor_v2/source/rtp.js.map +1 -0
  71. package/lib/rtp/src/processor_v2/webmLive.d.ts +51 -0
  72. package/lib/rtp/src/processor_v2/webmLive.js +154 -0
  73. package/lib/rtp/src/processor_v2/webmLive.js.map +1 -0
  74. package/lib/rtp/src/rtcp/header.d.ts +2 -1
  75. package/lib/rtp/src/rtcp/header.js +3 -2
  76. package/lib/rtp/src/rtcp/header.js.map +1 -1
  77. package/lib/rtp/src/rtcp/rr.d.ts +2 -0
  78. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  79. package/lib/rtp/src/rtcp/rtcp.js +4 -4
  80. package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
  81. package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
  82. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  83. package/lib/rtp/src/rtcp/rtpfb/nack.js +15 -7
  84. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  85. package/lib/rtp/src/rtp/red/packet.d.ts +1 -0
  86. package/lib/rtp/src/rtp/red/packet.js.map +1 -1
  87. package/lib/rtp/src/rtp/rtp.d.ts +1 -0
  88. package/lib/rtp/src/rtp/rtp.js +27 -26
  89. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  90. package/lib/rtp/src/srtp/cipher/ctr.d.ts +1 -1
  91. package/lib/rtp/src/srtp/cipher/ctr.js +14 -20
  92. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  93. package/lib/webrtc/src/dataChannel.js +1 -1
  94. package/lib/webrtc/src/dataChannel.js.map +1 -1
  95. package/lib/webrtc/src/media/extension/rtpExtension.d.ts +2 -0
  96. package/lib/webrtc/src/media/extension/rtpExtension.js +8 -1
  97. package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
  98. package/lib/webrtc/src/media/parameters.d.ts +2 -0
  99. package/lib/webrtc/src/media/parameters.js +1 -0
  100. package/lib/webrtc/src/media/parameters.js.map +1 -1
  101. package/lib/webrtc/src/media/receiver/nack.d.ts +10 -5
  102. package/lib/webrtc/src/media/receiver/nack.js +44 -27
  103. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  104. package/lib/webrtc/src/media/receiver/receiverTwcc.js +1 -1
  105. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  106. package/lib/webrtc/src/media/receiver/red.d.ts +1 -1
  107. package/lib/webrtc/src/media/receiver/red.js +14 -3
  108. package/lib/webrtc/src/media/receiver/red.js.map +1 -1
  109. package/lib/webrtc/src/media/router.d.ts +10 -3
  110. package/lib/webrtc/src/media/router.js +2 -0
  111. package/lib/webrtc/src/media/router.js.map +1 -1
  112. package/lib/webrtc/src/media/rtpReceiver.d.ts +11 -3
  113. package/lib/webrtc/src/media/rtpReceiver.js +42 -23
  114. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  115. package/lib/webrtc/src/media/rtpSender.d.ts +23 -2
  116. package/lib/webrtc/src/media/rtpSender.js +34 -10
  117. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  118. package/lib/webrtc/src/media/rtpTransceiver.d.ts +5 -1
  119. package/lib/webrtc/src/media/rtpTransceiver.js +9 -9
  120. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  121. package/lib/webrtc/src/media/track.js +4 -2
  122. package/lib/webrtc/src/media/track.js.map +1 -1
  123. package/lib/webrtc/src/nonstandard/recorder/index.d.ts +5 -1
  124. package/lib/webrtc/src/nonstandard/recorder/index.js +2 -2
  125. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  126. package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
  127. package/lib/webrtc/src/nonstandard/recorder/writer/index.js +1 -1
  128. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  129. package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +3 -3
  130. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +61 -41
  131. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  132. package/lib/webrtc/src/peerConnection.d.ts +13 -0
  133. package/lib/webrtc/src/peerConnection.js +40 -3
  134. package/lib/webrtc/src/peerConnection.js.map +1 -1
  135. package/lib/webrtc/src/sdp.d.ts +1 -0
  136. package/lib/webrtc/src/sdp.js +4 -0
  137. package/lib/webrtc/src/sdp.js.map +1 -1
  138. package/lib/webrtc/src/transport/dtls.js +6 -1
  139. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  140. package/lib/webrtc/src/transport/sctp.js +1 -1
  141. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  142. package/lib/webrtc/src/utils.d.ts +7 -2
  143. package/lib/webrtc/src/utils.js +9 -3
  144. package/lib/webrtc/src/utils.js.map +1 -1
  145. package/package.json +2 -2
  146. package/src/dataChannel.ts +1 -1
  147. package/src/media/extension/rtpExtension.ts +8 -0
  148. package/src/media/parameters.ts +3 -0
  149. package/src/media/receiver/nack.ts +45 -26
  150. package/src/media/receiver/receiverTwcc.ts +1 -1
  151. package/src/media/receiver/red.ts +14 -1
  152. package/src/media/router.ts +5 -3
  153. package/src/media/rtpReceiver.ts +59 -28
  154. package/src/media/rtpSender.ts +38 -12
  155. package/src/media/rtpTransceiver.ts +10 -8
  156. package/src/media/track.ts +6 -2
  157. package/src/nonstandard/recorder/index.ts +6 -2
  158. package/src/nonstandard/recorder/writer/index.ts +1 -1
  159. package/src/nonstandard/recorder/writer/webm.ts +105 -57
  160. package/src/peerConnection.ts +61 -7
  161. package/src/sdp.ts +3 -0
  162. package/src/transport/dtls.ts +5 -1
  163. package/src/transport/sctp.ts +1 -1
  164. package/src/utils.ts +8 -2
@@ -1,35 +1,18 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
3
  exports.WebmFactory = void 0;
27
- const fs = __importStar(require("fs/promises"));
4
+ const promises_1 = require("fs/promises");
28
5
  const __1 = require("../../..");
29
6
  const _1 = require(".");
7
+ const sourcePath = "packages/webrtc/src/nonstandard/recorder/writer/webm.ts";
30
8
  class WebmFactory extends _1.MediaWriter {
31
- start(tracks) {
32
- this.webm = new __1.WebmOutput(fs, this.path, tracks.map((track, i) => {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.rtpSources = [];
12
+ }
13
+ async start(tracks) {
14
+ await (0, promises_1.unlink)(this.path).catch((e) => e);
15
+ const inputTracks = tracks.map((track, i) => {
33
16
  const trackNumber = i + 1;
34
17
  const payloadType = track.codec.payloadType;
35
18
  if (track.kind === "video") {
@@ -44,41 +27,78 @@ class WebmFactory extends _1.MediaWriter {
44
27
  case "av1x":
45
28
  return "AV1";
46
29
  default:
47
- throw new Error();
30
+ throw new __1.WeriftError({
31
+ message: "unsupported codec",
32
+ payload: { track, path: sourcePath },
33
+ });
48
34
  }
49
35
  })();
50
36
  return {
51
37
  kind: "video",
38
+ codec,
52
39
  clockRate: 90000,
53
- payloadType,
54
40
  trackNumber,
55
- codec,
56
41
  width: this.options.width,
57
42
  height: this.options.height,
43
+ payloadType,
44
+ track,
58
45
  };
59
46
  }
60
47
  else {
61
48
  return {
62
49
  kind: "audio",
50
+ codec: "OPUS",
63
51
  clockRate: 48000,
64
- payloadType,
65
52
  trackNumber,
66
- codec: "OPUS",
53
+ payloadType,
54
+ track,
67
55
  };
68
56
  }
69
- }));
70
- tracks.forEach((track) => {
71
- const sampleBuilder = track.kind === "video"
72
- ? new __1.SampleBuilder((h) => !!h.marker).pipe(this.webm)
73
- : new __1.SampleBuilder(() => true).pipe(this.webm);
74
- new __1.JitterBuffer({
75
- rtpStream: track.onReceiveRtp,
76
- rtcpStream: track.onReceiveRtcp,
77
- }).pipe(sampleBuilder);
78
57
  });
58
+ const webm = new __1.WebmLiveSink(inputTracks, {
59
+ duration: this.options.defaultDuration ?? 1000 * 60 * 60 * 24,
60
+ });
61
+ this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {
62
+ const rtpSource = new __1.RtpSourceStream(track.onReceiveRtp);
63
+ const jitterBuffer = (0, __1.jitterBufferTransformer)(clockRate, {
64
+ latency: this.options.jitterBufferLatency,
65
+ bufferSize: this.options.jitterBufferSize,
66
+ });
67
+ if (track.kind === "video") {
68
+ rtpSource.readable
69
+ .pipeThrough(jitterBuffer)
70
+ .pipeThrough((0, __1.depacketizeTransformer)((h) => h.marker, codec, {
71
+ waitForKeyframe: this.options.waitForKeyframe,
72
+ }))
73
+ .pipeTo(webm.videoStream);
74
+ }
75
+ else {
76
+ rtpSource.readable
77
+ .pipeThrough(jitterBuffer)
78
+ .pipeThrough((0, __1.depacketizeTransformer)(() => true, codec))
79
+ .pipeTo(webm.audioStream);
80
+ }
81
+ return rtpSource;
82
+ });
83
+ const reader = webm.webmStream.getReader();
84
+ const readChunk = async ({ value, done, }) => {
85
+ if (done)
86
+ return;
87
+ if (value.packet) {
88
+ await (0, promises_1.appendFile)(this.path, value.packet);
89
+ }
90
+ else if (value.eol) {
91
+ const { durationElement } = value.eol;
92
+ const handler = await (0, promises_1.open)(this.path, "r+");
93
+ await handler.write(durationElement, 0, durationElement.length, 83);
94
+ await handler.close();
95
+ }
96
+ reader.read().then(readChunk);
97
+ };
98
+ reader.read().then(readChunk);
79
99
  }
80
100
  async stop() {
81
- await this.webm.stop();
101
+ await Promise.all(this.rtpSources.map((r) => r.stop()));
82
102
  }
83
103
  }
84
104
  exports.WebmFactory = WebmFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAGlC,gCAKkB;AAClB,wBAAgC;AAEhC,MAAa,WAAY,SAAQ,cAAW;IAG1C,KAAK,CAAC,MAA0B;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,cAAU,CACxB,EAAE,EACF,IAAI,CAAC,IAAI,EACT,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAM,CAAC,WAAW,CAAC;YAE7C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC1B,MAAM,KAAK,GAAG,CAAC,GAAmB,EAAE;oBAClC,QAAQ,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAyB,EAAE;wBAC9D,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC;wBACf,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC;wBACf,KAAK,MAAM;4BACT,OAAO,eAAe,CAAC;wBACzB,KAAK,MAAM;4BACT,OAAO,KAAK,CAAC;wBACf;4BACE,MAAM,IAAI,KAAK,EAAE,CAAC;qBACrB;gBACH,CAAC,CAAC,EAAE,CAAC;gBACL,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK;oBAChB,WAAW;oBACX,WAAW;oBACX,KAAK;oBACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;oBACzB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;iBAC5B,CAAC;aACH;iBAAM;gBACL,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK;oBAChB,WAAW;oBACX,WAAW;oBACX,KAAK,EAAE,MAAM;iBACd,CAAC;aACH;QACH,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,aAAa,GACjB,KAAK,CAAC,IAAI,KAAK,OAAO;gBACpB,CAAC,CAAC,IAAI,iBAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC;gBACvD,CAAC,CAAC,IAAI,iBAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;YACrD,IAAI,gBAAY,CAAC;gBACf,SAAS,EAAE,KAAK,CAAC,YAAY;gBAC7B,UAAU,EAAE,KAAK,CAAC,aAAa;aAChC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;CACF;AA9DD,kCA8DC;AAED,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC","sourcesContent":["import * as fs from \"fs/promises\";\n\nimport { SupportedCodec } from \"../../../../../rtp/src/container/webm\";\nimport {\n JitterBuffer,\n MediaStreamTrack,\n SampleBuilder,\n WebmOutput,\n} from \"../../..\";\nimport { MediaWriter } from \".\";\n\nexport class WebmFactory extends MediaWriter {\n webm?: WebmOutput;\n\n start(tracks: MediaStreamTrack[]) {\n this.webm = new WebmOutput(\n fs,\n this.path,\n tracks.map((track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): SupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new Error();\n }\n })();\n return {\n kind: \"video\",\n clockRate: 90000,\n payloadType,\n trackNumber,\n codec,\n width: this.options.width,\n height: this.options.height,\n };\n } else {\n return {\n kind: \"audio\",\n clockRate: 48000,\n payloadType,\n trackNumber,\n codec: \"OPUS\",\n };\n }\n })\n );\n\n tracks.forEach((track) => {\n const sampleBuilder =\n track.kind === \"video\"\n ? new SampleBuilder((h) => !!h.marker).pipe(this.webm!)\n : new SampleBuilder(() => true).pipe(this.webm!);\n new JitterBuffer({\n rtpStream: track.onReceiveRtp,\n rtcpStream: track.onReceiveRtcp,\n }).pipe(sampleBuilder);\n });\n }\n\n async stop() {\n await this.webm!.stop();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = typeof supportedVideoCodecs[number];\n"]}
1
+ {"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFile, open, unlink } from \"fs/promises\";\nimport { ReadableStreamDefaultReadResult } from \"stream/web\";\n\nimport { SupportedCodec } from \"../../../../../rtp/src/container/webm\";\nimport {\n depacketizeTransformer,\n jitterBufferTransformer,\n MediaStreamTrack,\n RtpSourceStream,\n WebmLiveOutput,\n WebmLiveSink,\n WeriftError,\n} from \"../../..\";\nimport { MediaWriter } from \".\";\n\nconst sourcePath = \"packages/webrtc/src/nonstandard/recorder/writer/webm.ts\";\n\nexport class WebmFactory extends MediaWriter {\n rtpSources: RtpSourceStream[] = [];\n\n async start(tracks: MediaStreamTrack[]) {\n await unlink(this.path).catch((e) => e);\n\n const inputTracks = tracks.map((track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): SupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new WeriftError({\n message: \"unsupported codec\",\n payload: { track, path: sourcePath },\n });\n }\n })();\n return {\n kind: \"video\" as const,\n codec,\n clockRate: 90000,\n trackNumber,\n width: this.options.width,\n height: this.options.height,\n payloadType,\n track,\n };\n } else {\n return {\n kind: \"audio\" as const,\n codec: \"OPUS\" as const,\n clockRate: 48000,\n trackNumber,\n payloadType,\n track,\n };\n }\n });\n\n const webm = new WebmLiveSink(inputTracks, {\n duration: this.options.defaultDuration ?? 1000 * 60 * 60 * 24,\n });\n\n this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {\n const rtpSource = new RtpSourceStream(track.onReceiveRtp);\n\n const jitterBuffer = jitterBufferTransformer(clockRate, {\n latency: this.options.jitterBufferLatency,\n bufferSize: this.options.jitterBufferSize,\n });\n\n if (track.kind === \"video\") {\n rtpSource.readable\n .pipeThrough(jitterBuffer)\n .pipeThrough(\n depacketizeTransformer((h) => h.marker, codec, {\n waitForKeyframe: this.options.waitForKeyframe,\n })\n )\n .pipeTo(webm.videoStream);\n } else {\n rtpSource.readable\n .pipeThrough(jitterBuffer)\n .pipeThrough(depacketizeTransformer(() => true, codec))\n .pipeTo(webm.audioStream);\n }\n\n return rtpSource;\n });\n\n const reader = webm.webmStream.getReader();\n const readChunk = async ({\n value,\n done,\n }: ReadableStreamDefaultReadResult<WebmLiveOutput>) => {\n if (done) return;\n\n if (value.packet) {\n await appendFile(this.path, value.packet);\n } else if (value.eol) {\n const { durationElement } = value.eol;\n const handler = await open(this.path, \"r+\");\n await handler.write(durationElement, 0, durationElement.length, 83);\n await handler.close();\n }\n reader.read().then(readChunk);\n };\n reader.read().then(readChunk);\n }\n\n async stop() {\n await Promise.all(this.rtpSources.map((r) => r.stop()));\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = typeof supportedVideoCodecs[number];\n"]}
@@ -1,4 +1,7 @@
1
1
  import Event from "rx.mini";
2
+ import { Message } from "../../ice/src/stun/message";
3
+ import { Protocol } from "../../ice/src/types/model";
4
+ import { Address, InterfaceAddresses } from ".";
2
5
  import { DtlsKeys } from ".";
3
6
  import { RTCDataChannel } from "./dataChannel";
4
7
  import { EventTarget } from "./helper";
@@ -33,6 +36,7 @@ export declare class RTCPeerConnection extends EventTarget {
33
36
  readonly onTransceiverAdded: Event<[RTCRtpTransceiver]>;
34
37
  readonly onIceCandidate: Event<[RTCIceCandidate]>;
35
38
  readonly onNegotiationneeded: Event<[]>;
39
+ readonly onTrack: Event<[MediaStreamTrack]>;
36
40
  ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;
37
41
  onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;
38
42
  onnegotiationneeded?: CallbackWithValue<any>;
@@ -59,6 +63,7 @@ export declare class RTCPeerConnection extends EventTarget {
59
63
  private getTransceiverByMid;
60
64
  private getTransceiverByMLineIndex;
61
65
  createOffer(): Promise<import("./sdp").RTCSessionDescription>;
66
+ private assignTransceiverCodecs;
62
67
  buildOfferSdp(): SessionDescription;
63
68
  createDataChannel(label: string, options?: Partial<{
64
69
  maxPacketLifeTime?: number;
@@ -132,6 +137,12 @@ export interface PeerConfig {
132
137
  iceServers: RTCIceServer[];
133
138
  /**Minimum port and Maximum port must not be the same value */
134
139
  icePortRange: [number, number] | undefined;
140
+ iceInterfaceAddresses: InterfaceAddresses | undefined;
141
+ iceUseIpv4: boolean;
142
+ iceUseIpv6: boolean;
143
+ /** If provided, is called on each STUN request.
144
+ * Return `true` if a STUN response should be sent, false if it should be skipped. */
145
+ iceFilterStunResponse: ((message: Message, addr: Address, protocol: Protocol) => boolean) | undefined;
135
146
  dtls: Partial<{
136
147
  keys: DtlsKeys;
137
148
  }>;
@@ -143,6 +154,8 @@ export interface PeerConfig {
143
154
  outboundPacketLoss: number;
144
155
  /**ms */
145
156
  receiverReportDelay: number;
157
+ disableSendNack: boolean;
158
+ disableRecvRetransmit: boolean;
146
159
  }>;
147
160
  }
148
161
  export declare const findCodecByMimeType: (codecs: RTCRtpCodecParameters[], target: RTCRtpCodecParameters) => RTCRtpCodecParameters | undefined;
@@ -70,6 +70,7 @@ class RTCPeerConnection extends helper_1.EventTarget {
70
70
  this.onTransceiverAdded = new rx_mini_1.default();
71
71
  this.onIceCandidate = new rx_mini_1.default();
72
72
  this.onNegotiationneeded = new rx_mini_1.default();
73
+ this.onTrack = new rx_mini_1.default();
73
74
  this.router = new router_1.RtpRouter();
74
75
  this.certificates = [];
75
76
  this.seenMid = new Set();
@@ -185,14 +186,41 @@ class RTCPeerConnection extends helper_1.EventTarget {
185
186
  const description = this.buildOfferSdp();
186
187
  return description.toJSON();
187
188
  }
189
+ assignTransceiverCodecs(transceiver) {
190
+ const codecs = this.config.codecs[transceiver.kind].filter((codecCandidate) => {
191
+ switch (codecCandidate.direction) {
192
+ case "recvonly": {
193
+ if ([_1.Recvonly, _1.Sendrecv].includes(transceiver.direction))
194
+ return true;
195
+ return false;
196
+ }
197
+ case "sendonly": {
198
+ if ([_1.Sendonly, _1.Sendrecv].includes(transceiver.direction))
199
+ return true;
200
+ return false;
201
+ }
202
+ case "sendrecv": {
203
+ if ([_1.Sendrecv, _1.Recvonly, _1.Sendonly].includes(transceiver.direction))
204
+ return true;
205
+ return false;
206
+ }
207
+ case "all": {
208
+ return true;
209
+ }
210
+ default:
211
+ return false;
212
+ }
213
+ });
214
+ transceiver.codecs = codecs;
215
+ }
188
216
  buildOfferSdp() {
189
217
  this.transceivers.forEach((transceiver) => {
190
218
  if (transceiver.codecs.length === 0) {
191
- transceiver.codecs = this.config.codecs[transceiver.kind];
219
+ this.assignTransceiverCodecs(transceiver);
192
220
  }
193
221
  if (transceiver.headerExtensions.length === 0) {
194
222
  transceiver.headerExtensions =
195
- this.config.headerExtensions[transceiver.kind];
223
+ this.config.headerExtensions[transceiver.kind] ?? [];
196
224
  }
197
225
  });
198
226
  const description = new sdp_1.SessionDescription();
@@ -311,6 +339,10 @@ class RTCPeerConnection extends helper_1.EventTarget {
311
339
  ...(0, utils_1.parseIceServers)(this.config.iceServers),
312
340
  forceTurn: this.config.iceTransportPolicy === "relay",
313
341
  portRange: this.config.icePortRange,
342
+ interfaceAddresses: this.config.iceInterfaceAddresses,
343
+ filterStunResponse: this.config.iceFilterStunResponse,
344
+ useIpv4: this.config.iceUseIpv4,
345
+ useIpv6: this.config.iceUseIpv6,
314
346
  });
315
347
  if (existing) {
316
348
  iceGatherer.connection.localUserName = existing.connection.localUserName;
@@ -800,6 +832,7 @@ class RTCPeerConnection extends helper_1.EventTarget {
800
832
  transceiver,
801
833
  receiver: transceiver.receiver,
802
834
  };
835
+ this.onTrack.execute(track);
803
836
  this.emit("track", event);
804
837
  if (this.ontrack)
805
838
  this.ontrack(event);
@@ -812,7 +845,7 @@ class RTCPeerConnection extends helper_1.EventTarget {
812
845
  const_1.SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,
813
846
  ]);
814
847
  const sender = new rtpSender_1.RTCRtpSender(trackOrKind);
815
- const receiver = new rtpReceiver_1.RTCRtpReceiver(kind, sender.ssrc);
848
+ const receiver = new rtpReceiver_1.RTCRtpReceiver(this.config, kind, sender.ssrc);
816
849
  const transceiver = new rtpTransceiver_1.RTCRtpTransceiver(kind, dtlsTransport, receiver, sender, direction);
817
850
  transceiver.options = options;
818
851
  this.router.registerRtpSender(transceiver.sender);
@@ -1177,6 +1210,10 @@ exports.defaultPeerConfig = {
1177
1210
  iceTransportPolicy: "all",
1178
1211
  iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
1179
1212
  icePortRange: undefined,
1213
+ iceInterfaceAddresses: undefined,
1214
+ iceUseIpv4: true,
1215
+ iceUseIpv6: true,
1216
+ iceFilterStunResponse: undefined,
1180
1217
  dtls: {},
1181
1218
  bundlePolicy: "max-compat",
1182
1219
  debug: {},