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,75 +1,123 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { appendFile, open, unlink } from "fs/promises";
|
|
2
|
+
import { ReadableStreamDefaultReadResult } from "stream/web";
|
|
2
3
|
|
|
3
4
|
import { SupportedCodec } from "../../../../../rtp/src/container/webm";
|
|
4
5
|
import {
|
|
5
|
-
|
|
6
|
+
depacketizeTransformer,
|
|
7
|
+
jitterBufferTransformer,
|
|
6
8
|
MediaStreamTrack,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
RtpSourceStream,
|
|
10
|
+
WebmLiveOutput,
|
|
11
|
+
WebmLiveSink,
|
|
12
|
+
WeriftError,
|
|
9
13
|
} from "../../..";
|
|
10
14
|
import { MediaWriter } from ".";
|
|
11
15
|
|
|
16
|
+
const sourcePath = "packages/webrtc/src/nonstandard/recorder/writer/webm.ts";
|
|
17
|
+
|
|
12
18
|
export class WebmFactory extends MediaWriter {
|
|
13
|
-
|
|
19
|
+
rtpSources: RtpSourceStream[] = [];
|
|
20
|
+
|
|
21
|
+
async start(tracks: MediaStreamTrack[]) {
|
|
22
|
+
await unlink(this.path).catch((e) => e);
|
|
23
|
+
|
|
24
|
+
const inputTracks = tracks.map((track, i) => {
|
|
25
|
+
const trackNumber = i + 1;
|
|
26
|
+
const payloadType = track.codec!.payloadType;
|
|
27
|
+
|
|
28
|
+
if (track.kind === "video") {
|
|
29
|
+
const codec = ((): SupportedCodec => {
|
|
30
|
+
switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {
|
|
31
|
+
case "vp8":
|
|
32
|
+
return "VP8";
|
|
33
|
+
case "vp9":
|
|
34
|
+
return "VP9";
|
|
35
|
+
case "h264":
|
|
36
|
+
return "MPEG4/ISO/AVC";
|
|
37
|
+
case "av1x":
|
|
38
|
+
return "AV1";
|
|
39
|
+
default:
|
|
40
|
+
throw new WeriftError({
|
|
41
|
+
message: "unsupported codec",
|
|
42
|
+
payload: { track, path: sourcePath },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
})();
|
|
46
|
+
return {
|
|
47
|
+
kind: "video" as const,
|
|
48
|
+
codec,
|
|
49
|
+
clockRate: 90000,
|
|
50
|
+
trackNumber,
|
|
51
|
+
width: this.options.width,
|
|
52
|
+
height: this.options.height,
|
|
53
|
+
payloadType,
|
|
54
|
+
track,
|
|
55
|
+
};
|
|
56
|
+
} else {
|
|
57
|
+
return {
|
|
58
|
+
kind: "audio" as const,
|
|
59
|
+
codec: "OPUS" as const,
|
|
60
|
+
clockRate: 48000,
|
|
61
|
+
trackNumber,
|
|
62
|
+
payloadType,
|
|
63
|
+
track,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
});
|
|
14
67
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
68
|
+
const webm = new WebmLiveSink(inputTracks, {
|
|
69
|
+
duration: this.options.defaultDuration ?? 1000 * 60 * 60 * 24,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {
|
|
73
|
+
const rtpSource = new RtpSourceStream(track.onReceiveRtp);
|
|
74
|
+
|
|
75
|
+
const jitterBuffer = jitterBufferTransformer(clockRate, {
|
|
76
|
+
latency: this.options.jitterBufferLatency,
|
|
77
|
+
bufferSize: this.options.jitterBufferSize,
|
|
78
|
+
});
|
|
22
79
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return {
|
|
39
|
-
kind: "video",
|
|
40
|
-
clockRate: 90000,
|
|
41
|
-
payloadType,
|
|
42
|
-
trackNumber,
|
|
43
|
-
codec,
|
|
44
|
-
width: this.options.width,
|
|
45
|
-
height: this.options.height,
|
|
46
|
-
};
|
|
47
|
-
} else {
|
|
48
|
-
return {
|
|
49
|
-
kind: "audio",
|
|
50
|
-
clockRate: 48000,
|
|
51
|
-
payloadType,
|
|
52
|
-
trackNumber,
|
|
53
|
-
codec: "OPUS",
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
})
|
|
57
|
-
);
|
|
80
|
+
if (track.kind === "video") {
|
|
81
|
+
rtpSource.readable
|
|
82
|
+
.pipeThrough(jitterBuffer)
|
|
83
|
+
.pipeThrough(
|
|
84
|
+
depacketizeTransformer((h) => h.marker, codec, {
|
|
85
|
+
waitForKeyframe: this.options.waitForKeyframe,
|
|
86
|
+
})
|
|
87
|
+
)
|
|
88
|
+
.pipeTo(webm.videoStream);
|
|
89
|
+
} else {
|
|
90
|
+
rtpSource.readable
|
|
91
|
+
.pipeThrough(jitterBuffer)
|
|
92
|
+
.pipeThrough(depacketizeTransformer(() => true, codec))
|
|
93
|
+
.pipeTo(webm.audioStream);
|
|
94
|
+
}
|
|
58
95
|
|
|
59
|
-
|
|
60
|
-
const sampleBuilder =
|
|
61
|
-
track.kind === "video"
|
|
62
|
-
? new SampleBuilder((h) => !!h.marker).pipe(this.webm!)
|
|
63
|
-
: new SampleBuilder(() => true).pipe(this.webm!);
|
|
64
|
-
new JitterBuffer({
|
|
65
|
-
rtpStream: track.onReceiveRtp,
|
|
66
|
-
rtcpStream: track.onReceiveRtcp,
|
|
67
|
-
}).pipe(sampleBuilder);
|
|
96
|
+
return rtpSource;
|
|
68
97
|
});
|
|
98
|
+
|
|
99
|
+
const reader = webm.webmStream.getReader();
|
|
100
|
+
const readChunk = async ({
|
|
101
|
+
value,
|
|
102
|
+
done,
|
|
103
|
+
}: ReadableStreamDefaultReadResult<WebmLiveOutput>) => {
|
|
104
|
+
if (done) return;
|
|
105
|
+
|
|
106
|
+
if (value.packet) {
|
|
107
|
+
await appendFile(this.path, value.packet);
|
|
108
|
+
} else if (value.eol) {
|
|
109
|
+
const { durationElement } = value.eol;
|
|
110
|
+
const handler = await open(this.path, "r+");
|
|
111
|
+
await handler.write(durationElement, 0, durationElement.length, 83);
|
|
112
|
+
await handler.close();
|
|
113
|
+
}
|
|
114
|
+
reader.read().then(readChunk);
|
|
115
|
+
};
|
|
116
|
+
reader.read().then(readChunk);
|
|
69
117
|
}
|
|
70
118
|
|
|
71
119
|
async stop() {
|
|
72
|
-
await this.
|
|
120
|
+
await Promise.all(this.rtpSources.map((r) => r.stop()));
|
|
73
121
|
}
|
|
74
122
|
}
|
|
75
123
|
|
package/src/peerConnection.ts
CHANGED
|
@@ -5,11 +5,19 @@ import Event from "rx.mini";
|
|
|
5
5
|
import * as uuid from "uuid";
|
|
6
6
|
|
|
7
7
|
import { Profile } from "../../dtls/src/context/srtp";
|
|
8
|
-
import {
|
|
8
|
+
import { Message } from "../../ice/src/stun/message";
|
|
9
|
+
import { Protocol } from "../../ice/src/types/model";
|
|
10
|
+
import {
|
|
11
|
+
Address,
|
|
12
|
+
deepMerge,
|
|
13
|
+
InterfaceAddresses,
|
|
14
|
+
Recvonly,
|
|
15
|
+
Sendonly,
|
|
16
|
+
Sendrecv,
|
|
17
|
+
} from ".";
|
|
9
18
|
import {
|
|
10
19
|
codecParametersFromString,
|
|
11
20
|
DtlsKeys,
|
|
12
|
-
useAbsSendTime,
|
|
13
21
|
useNACK,
|
|
14
22
|
usePLI,
|
|
15
23
|
useREMB,
|
|
@@ -22,8 +30,6 @@ import {
|
|
|
22
30
|
} from "./const";
|
|
23
31
|
import { RTCDataChannel, RTCDataChannelParameters } from "./dataChannel";
|
|
24
32
|
import { enumerate, EventTarget } from "./helper";
|
|
25
|
-
import { useFIR } from "./media/extension/rtcpFeedback";
|
|
26
|
-
import { useSdesMid, useTransportWideCC } from "./media/extension/rtpExtension";
|
|
27
33
|
import {
|
|
28
34
|
RTCRtpCodecParameters,
|
|
29
35
|
RTCRtpCodingParameters,
|
|
@@ -91,6 +97,7 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
91
97
|
readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();
|
|
92
98
|
readonly onIceCandidate = new Event<[RTCIceCandidate]>();
|
|
93
99
|
readonly onNegotiationneeded = new Event<[]>();
|
|
100
|
+
readonly onTrack = new Event<[MediaStreamTrack]>();
|
|
94
101
|
|
|
95
102
|
ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;
|
|
96
103
|
onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;
|
|
@@ -226,14 +233,42 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
226
233
|
return description.toJSON();
|
|
227
234
|
}
|
|
228
235
|
|
|
236
|
+
private assignTransceiverCodecs(transceiver: RTCRtpTransceiver) {
|
|
237
|
+
const codecs = (
|
|
238
|
+
this.config.codecs[transceiver.kind] as RTCRtpCodecParameters[]
|
|
239
|
+
).filter((codecCandidate) => {
|
|
240
|
+
switch (codecCandidate.direction) {
|
|
241
|
+
case "recvonly": {
|
|
242
|
+
if ([Recvonly, Sendrecv].includes(transceiver.direction)) return true;
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
case "sendonly": {
|
|
246
|
+
if ([Sendonly, Sendrecv].includes(transceiver.direction)) return true;
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
case "sendrecv": {
|
|
250
|
+
if ([Sendrecv, Recvonly, Sendonly].includes(transceiver.direction))
|
|
251
|
+
return true;
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
case "all": {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
default:
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
transceiver.codecs = codecs;
|
|
262
|
+
}
|
|
263
|
+
|
|
229
264
|
buildOfferSdp() {
|
|
230
265
|
this.transceivers.forEach((transceiver) => {
|
|
231
266
|
if (transceiver.codecs.length === 0) {
|
|
232
|
-
|
|
267
|
+
this.assignTransceiverCodecs(transceiver);
|
|
233
268
|
}
|
|
234
269
|
if (transceiver.headerExtensions.length === 0) {
|
|
235
270
|
transceiver.headerExtensions =
|
|
236
|
-
this.config.headerExtensions[transceiver.kind];
|
|
271
|
+
this.config.headerExtensions[transceiver.kind] ?? [];
|
|
237
272
|
}
|
|
238
273
|
});
|
|
239
274
|
|
|
@@ -410,6 +445,10 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
410
445
|
...parseIceServers(this.config.iceServers),
|
|
411
446
|
forceTurn: this.config.iceTransportPolicy === "relay",
|
|
412
447
|
portRange: this.config.icePortRange,
|
|
448
|
+
interfaceAddresses: this.config.iceInterfaceAddresses,
|
|
449
|
+
filterStunResponse: this.config.iceFilterStunResponse,
|
|
450
|
+
useIpv4: this.config.iceUseIpv4,
|
|
451
|
+
useIpv6: this.config.iceUseIpv6,
|
|
413
452
|
});
|
|
414
453
|
if (existing) {
|
|
415
454
|
iceGatherer.connection.localUserName = existing.connection.localUserName;
|
|
@@ -1034,6 +1073,7 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
1034
1073
|
transceiver,
|
|
1035
1074
|
receiver: transceiver.receiver,
|
|
1036
1075
|
};
|
|
1076
|
+
this.onTrack.execute(track);
|
|
1037
1077
|
this.emit("track", event);
|
|
1038
1078
|
if (this.ontrack) this.ontrack(event);
|
|
1039
1079
|
}
|
|
@@ -1053,7 +1093,7 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
1053
1093
|
]);
|
|
1054
1094
|
|
|
1055
1095
|
const sender = new RTCRtpSender(trackOrKind);
|
|
1056
|
-
const receiver = new RTCRtpReceiver(kind, sender.ssrc);
|
|
1096
|
+
const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);
|
|
1057
1097
|
const transceiver = new RTCRtpTransceiver(
|
|
1058
1098
|
kind,
|
|
1059
1099
|
dtlsTransport,
|
|
@@ -1481,6 +1521,14 @@ export interface PeerConfig {
|
|
|
1481
1521
|
iceServers: RTCIceServer[];
|
|
1482
1522
|
/**Minimum port and Maximum port must not be the same value */
|
|
1483
1523
|
icePortRange: [number, number] | undefined;
|
|
1524
|
+
iceInterfaceAddresses: InterfaceAddresses | undefined;
|
|
1525
|
+
iceUseIpv4: boolean;
|
|
1526
|
+
iceUseIpv6: boolean;
|
|
1527
|
+
/** If provided, is called on each STUN request.
|
|
1528
|
+
* Return `true` if a STUN response should be sent, false if it should be skipped. */
|
|
1529
|
+
iceFilterStunResponse:
|
|
1530
|
+
| ((message: Message, addr: Address, protocol: Protocol) => boolean)
|
|
1531
|
+
| undefined;
|
|
1484
1532
|
dtls: Partial<{
|
|
1485
1533
|
keys: DtlsKeys;
|
|
1486
1534
|
}>;
|
|
@@ -1492,6 +1540,8 @@ export interface PeerConfig {
|
|
|
1492
1540
|
outboundPacketLoss: number;
|
|
1493
1541
|
/**ms */
|
|
1494
1542
|
receiverReportDelay: number;
|
|
1543
|
+
disableSendNack: boolean;
|
|
1544
|
+
disableRecvRetransmit: boolean;
|
|
1495
1545
|
}>;
|
|
1496
1546
|
}
|
|
1497
1547
|
|
|
@@ -1542,6 +1592,10 @@ export const defaultPeerConfig: PeerConfig = {
|
|
|
1542
1592
|
iceTransportPolicy: "all",
|
|
1543
1593
|
iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
|
|
1544
1594
|
icePortRange: undefined,
|
|
1595
|
+
iceInterfaceAddresses: undefined,
|
|
1596
|
+
iceUseIpv4: true,
|
|
1597
|
+
iceUseIpv6: true,
|
|
1598
|
+
iceFilterStunResponse: undefined,
|
|
1545
1599
|
dtls: {},
|
|
1546
1600
|
bundlePolicy: "max-compat",
|
|
1547
1601
|
debug: {},
|
package/src/sdp.ts
CHANGED
|
@@ -611,6 +611,9 @@ export function candidateFromSdp(sdp: string) {
|
|
|
611
611
|
|
|
612
612
|
export class RTCSessionDescription {
|
|
613
613
|
constructor(public sdp: string, public type: "offer" | "answer") {}
|
|
614
|
+
static isThis(o: any) {
|
|
615
|
+
if (typeof o?.sdp === "string") return true;
|
|
616
|
+
}
|
|
614
617
|
}
|
|
615
618
|
|
|
616
619
|
export function addSDPHeader(
|
package/src/transport/dtls.ts
CHANGED
|
@@ -202,7 +202,11 @@ export class RTCDtlsTransport {
|
|
|
202
202
|
} else {
|
|
203
203
|
const dec = this.srtp.decrypt(data);
|
|
204
204
|
const rtp = RtpPacket.deSerialize(dec);
|
|
205
|
-
|
|
205
|
+
try {
|
|
206
|
+
this.router.routeRtp(rtp);
|
|
207
|
+
} catch (error) {
|
|
208
|
+
log("router error", error);
|
|
209
|
+
}
|
|
206
210
|
}
|
|
207
211
|
});
|
|
208
212
|
}
|
package/src/transport/sctp.ts
CHANGED
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
} from "../dataChannel";
|
|
22
22
|
import { RTCDtlsTransport } from "./dtls";
|
|
23
23
|
|
|
24
|
-
const log = debug("werift/webrtc/transport/sctp");
|
|
24
|
+
const log = debug("werift:packages/webrtc/src/transport/sctp.ts");
|
|
25
25
|
|
|
26
26
|
export class RTCSctpTransport {
|
|
27
27
|
dtlsTransport!: RTCDtlsTransport;
|
package/src/utils.ts
CHANGED
|
@@ -18,7 +18,7 @@ import { Direction, Directions } from "./media/rtpTransceiver";
|
|
|
18
18
|
import { RTCIceServer } from "./peerConnection";
|
|
19
19
|
const now = require("nano-time");
|
|
20
20
|
|
|
21
|
-
const log = debug("werift/webrtc/utils");
|
|
21
|
+
const log = debug("werift:packages/webrtc/src/utils.ts");
|
|
22
22
|
|
|
23
23
|
export function fingerprint(file: Buffer, hashName: string) {
|
|
24
24
|
const upper = (s: string) => s.toUpperCase();
|
|
@@ -64,6 +64,8 @@ export const microTime = () => now.micro() as number;
|
|
|
64
64
|
|
|
65
65
|
export const milliTime = () => new Date().getTime();
|
|
66
66
|
|
|
67
|
+
export const timestampSeconds = () => Date.now() / 1000;
|
|
68
|
+
|
|
67
69
|
/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */
|
|
68
70
|
export const ntpTime = () => {
|
|
69
71
|
const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);
|
|
@@ -76,7 +78,11 @@ export const ntpTime = () => {
|
|
|
76
78
|
return buf.readBigUInt64BE();
|
|
77
79
|
};
|
|
78
80
|
|
|
79
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* https://datatracker.ietf.org/doc/html/rfc3550#section-4
|
|
83
|
+
* @param ntp
|
|
84
|
+
* @returns 32bit
|
|
85
|
+
*/
|
|
80
86
|
export const compactNtp = (ntp: bigint) => {
|
|
81
87
|
const buf = bufferWriter([8], [ntp]);
|
|
82
88
|
const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);
|