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.
- package/lib/common/src/index.d.ts +2 -0
- package/lib/common/src/index.js +2 -0
- package/lib/common/src/index.js.map +1 -1
- package/lib/common/src/log.d.ts +11 -0
- package/lib/common/src/log.js +17 -0
- package/lib/common/src/log.js.map +1 -0
- package/lib/common/src/network.d.ts +7 -3
- package/lib/common/src/network.js +15 -7
- package/lib/common/src/network.js.map +1 -1
- package/lib/common/src/type.d.ts +3 -0
- package/lib/common/src/type.js +3 -0
- package/lib/common/src/type.js.map +1 -0
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js +10 -0
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/ice/src/ice.d.ts +3 -0
- package/lib/ice/src/ice.js +9 -2
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +2 -1
- package/lib/ice/src/stun/protocol.js +3 -3
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/transport.d.ts +4 -2
- package/lib/ice/src/transport.js +8 -6
- package/lib/ice/src/transport.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +3 -1
- package/lib/ice/src/turn/protocol.js +2 -2
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/utils.d.ts +2 -1
- package/lib/ice/src/utils.js +2 -2
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/rtp/src/codec/index.d.ts +18 -0
- package/lib/rtp/src/codec/index.js +81 -0
- package/lib/rtp/src/codec/index.js.map +1 -0
- package/lib/rtp/src/codec/vp8.d.ts +5 -3
- package/lib/rtp/src/codec/vp8.js +19 -5
- package/lib/rtp/src/codec/vp8.js.map +1 -1
- package/lib/rtp/src/container/webm.d.ts +6 -1
- package/lib/rtp/src/container/webm.js +9 -2
- package/lib/rtp/src/container/webm.js.map +1 -1
- package/lib/rtp/src/index.d.ts +2 -6
- package/lib/rtp/src/index.js +2 -6
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/processor/base.d.ts +3 -1
- package/lib/rtp/src/processor/base.js +19 -6
- package/lib/rtp/src/processor/base.js.map +1 -1
- package/lib/rtp/src/processor/jitterBuffer.js +1 -2
- package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
- package/lib/rtp/src/processor/lipsync.js +22 -2
- package/lib/rtp/src/processor/lipsync.js.map +1 -1
- package/lib/rtp/src/processor/webm.d.ts +11 -7
- package/lib/rtp/src/processor/webm.js +16 -41
- package/lib/rtp/src/processor/webm.js.map +1 -1
- package/lib/rtp/src/processor_v2/depacketizer.d.ts +17 -0
- package/lib/rtp/src/processor_v2/depacketizer.js +84 -0
- package/lib/rtp/src/processor_v2/depacketizer.js.map +1 -0
- package/lib/rtp/src/processor_v2/index.d.ts +4 -0
- package/lib/rtp/src/processor_v2/index.js +21 -0
- package/lib/rtp/src/processor_v2/index.js.map +1 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.d.ts +33 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.js +154 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/base.d.ts +8 -0
- package/lib/rtp/src/processor_v2/source/base.js +16 -0
- package/lib/rtp/src/processor_v2/source/base.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/index.d.ts +2 -0
- package/lib/rtp/src/processor_v2/source/index.js +6 -0
- package/lib/rtp/src/processor_v2/source/index.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/rtp.d.ts +14 -0
- package/lib/rtp/src/processor_v2/source/rtp.js +24 -0
- package/lib/rtp/src/processor_v2/source/rtp.js.map +1 -0
- package/lib/rtp/src/processor_v2/webmLive.d.ts +51 -0
- package/lib/rtp/src/processor_v2/webmLive.js +154 -0
- package/lib/rtp/src/processor_v2/webmLive.js.map +1 -0
- package/lib/rtp/src/rtcp/header.d.ts +2 -1
- package/lib/rtp/src/rtcp/header.js +3 -2
- package/lib/rtp/src/rtcp/header.js.map +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -0
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtcp.js +4 -4
- package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.js +15 -7
- package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
- package/lib/rtp/src/rtp/red/packet.d.ts +1 -0
- package/lib/rtp/src/rtp/red/packet.js.map +1 -1
- package/lib/rtp/src/rtp/rtp.d.ts +1 -0
- package/lib/rtp/src/rtp/rtp.js +27 -26
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.js +14 -20
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
- package/lib/webrtc/src/dataChannel.js +1 -1
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/media/extension/rtpExtension.d.ts +2 -0
- package/lib/webrtc/src/media/extension/rtpExtension.js +8 -1
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
- package/lib/webrtc/src/media/parameters.d.ts +2 -0
- package/lib/webrtc/src/media/parameters.js +1 -0
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.d.ts +10 -5
- package/lib/webrtc/src/media/receiver/nack.js +44 -27
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
- package/lib/webrtc/src/media/receiver/red.d.ts +1 -1
- package/lib/webrtc/src/media/receiver/red.js +14 -3
- package/lib/webrtc/src/media/receiver/red.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +10 -3
- package/lib/webrtc/src/media/router.js +2 -0
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +11 -3
- package/lib/webrtc/src/media/rtpReceiver.js +42 -23
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +23 -2
- package/lib/webrtc/src/media/rtpSender.js +34 -10
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +5 -1
- package/lib/webrtc/src/media/rtpTransceiver.js +9 -9
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.js +4 -2
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/index.d.ts +5 -1
- package/lib/webrtc/src/nonstandard/recorder/index.js +2 -2
- package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.js +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +3 -3
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +61 -41
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +13 -0
- package/lib/webrtc/src/peerConnection.js +40 -3
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -0
- package/lib/webrtc/src/sdp.js +4 -0
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.js +6 -1
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +1 -1
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +7 -2
- package/lib/webrtc/src/utils.js +9 -3
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/dataChannel.ts +1 -1
- package/src/media/extension/rtpExtension.ts +8 -0
- package/src/media/parameters.ts +3 -0
- package/src/media/receiver/nack.ts +45 -26
- package/src/media/receiver/receiverTwcc.ts +1 -1
- package/src/media/receiver/red.ts +14 -1
- package/src/media/router.ts +5 -3
- package/src/media/rtpReceiver.ts +59 -28
- package/src/media/rtpSender.ts +38 -12
- package/src/media/rtpTransceiver.ts +10 -8
- package/src/media/track.ts +6 -2
- package/src/nonstandard/recorder/index.ts +6 -2
- package/src/nonstandard/recorder/writer/index.ts +1 -1
- package/src/nonstandard/recorder/writer/webm.ts +105 -57
- package/src/peerConnection.ts +61 -7
- package/src/sdp.ts +3 -0
- package/src/transport/dtls.ts +5 -1
- package/src/transport/sctp.ts +1 -1
- 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
|
|
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
|
-
|
|
32
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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":"
|
|
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
|
-
|
|
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: {},
|