mediasoup-client 3.22.0 → 3.23.1
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/Device.d.ts +7 -3
- package/lib/Device.d.ts.map +1 -1
- package/lib/Device.js +22 -8
- package/lib/Producer.d.ts +0 -4
- package/lib/Producer.d.ts.map +1 -1
- package/lib/Transport.d.ts +1 -1
- package/lib/Transport.d.ts.map +1 -1
- package/lib/Transport.js +1 -2
- package/lib/handlers/Chrome111.d.ts +4 -3
- package/lib/handlers/Chrome111.d.ts.map +1 -1
- package/lib/handlers/Chrome111.js +23 -34
- package/lib/handlers/Chrome74.d.ts +4 -3
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +38 -33
- package/lib/handlers/Firefox120.d.ts +3 -2
- package/lib/handlers/Firefox120.d.ts.map +1 -1
- package/lib/handlers/Firefox120.js +19 -5
- package/lib/handlers/HandlerInterface.d.ts +9 -3
- package/lib/handlers/HandlerInterface.d.ts.map +1 -1
- package/lib/handlers/ReactNative106.d.ts +4 -3
- package/lib/handlers/ReactNative106.d.ts.map +1 -1
- package/lib/handlers/ReactNative106.js +22 -33
- package/lib/handlers/Safari12.d.ts +5 -4
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +22 -33
- package/lib/handlers/ortc/utils.d.ts +8 -9
- package/lib/handlers/ortc/utils.d.ts.map +1 -1
- package/lib/handlers/ortc/utils.js +30 -39
- package/lib/handlers/sdp/commonUtils.d.ts +1 -9
- package/lib/handlers/sdp/commonUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/commonUtils.js +0 -13
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/ortc.js +15 -5
- package/npm-scripts.mjs +12 -2
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Firefox120.d.ts","sourceRoot":"","sources":["../../src/handlers/Firefox120.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,cAAc,CAAC;AAY5D,OAAO,KAAK,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EAGb,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,gCAAgC,EAChC,+BAA+B,EAC/B,MAAM,oBAAoB,CAAC;AAM5B,qBAAa,UACZ,SAAQ,oBAAoB,CAAC,aAAa,CAC1C,YAAW,gBAAgB;IAG3B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,UAAU,CAAkB;IAEpC,OAAO,CAAC,0BAA0B,CAAC,CAAS;IAE5C,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,+BAA+B,CAEV;
|
|
1
|
+
{"version":3,"file":"Firefox120.d.ts","sourceRoot":"","sources":["../../src/handlers/Firefox120.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,cAAc,CAAC;AAY5D,OAAO,KAAK,EACX,qBAAqB,EAErB,cAAc,EACd,gBAAgB,EAChB,aAAa,EAGb,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,gCAAgC,EAChC,+BAA+B,EAC/B,MAAM,oBAAoB,CAAC;AAM5B,qBAAa,UACZ,SAAQ,oBAAoB,CAAC,aAAa,CAC1C,YAAW,gBAAgB;IAG3B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,UAAU,CAAkB;IAEpC,OAAO,CAAC,0BAA0B,CAAC,CAAS;IAE5C,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,+BAA+B,CAEV;IAC7B,OAAO,CAAC,oBAAoB,CAAC,CAA6B;IAE1D,OAAO,CAAC,GAAG,CAAoB;IAE/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CACxB;IAEX,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD,OAAO,CAAC,2BAA2B,CAAS;IAE5C,OAAO,CAAC,qBAAqB,CAAK;IAElC,OAAO,CAAC,eAAe,CAAS;IAEhC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EACpB,mBAAmB,GACnB,EAAE,qBAAqB,GAAG,cAAc;IA+FzC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAatC,OAAO;IAgEP,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEQ,KAAK,IAAI,IAAI;IAsChB,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3D,UAAU,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDvD,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IAM5C,IAAI,CAAC,EACV,KAAK,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,KAAK,EACL,WAAW,GACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmL5C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD3C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC5C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC7C,YAAY,CACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC5B,OAAO,CAAC,IAAI,CAAC;IAuBV,kBAAkB,CACvB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAsDV,wBAAwB,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC;IAkDV,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAaxD,eAAe,CAAC,EACrB,oBAAoB,GACpB,EAAE,6BAA6B,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAuElE,OAAO,CACZ,WAAW,EAAE,qBAAqB,EAAE,GAClC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA6H5B,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6ChD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCjD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuClD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAY1D,kBAAkB,CAAC,EACxB,cAAc,EACd,oBAAoB,EACpB,KAAK,EACL,QAAQ,GACR,EAAE,gCAAgC,GAAG,OAAO,CAAC,+BAA+B,CAAC;IAyE9E,4BAA4B,IAAI,MAAM,GAAG,SAAS;YAMpC,cAAc;IAgC5B,OAAO,CAAC,yBAAyB,CAE/B;IAEF,OAAO,CAAC,mBAAmB,CAIzB;IAEF,OAAO,CAAC,uBAAuB,CAE7B;IAEF,OAAO,CAAC,0BAA0B,CAiChC;IAEF,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,mBAAmB;CAO3B"}
|
|
@@ -57,6 +57,7 @@ class Firefox120 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
57
57
|
_remoteSdp;
|
|
58
58
|
// Callback to request sending extended RTP capabilities on demand.
|
|
59
59
|
_getSendExtendedRtpCapabilities;
|
|
60
|
+
_forcedRtpExtensions;
|
|
60
61
|
// RTCPeerConnection instance.
|
|
61
62
|
_pc;
|
|
62
63
|
// Map of RTCTransceivers indexed by MID.
|
|
@@ -72,10 +73,10 @@ class Firefox120 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
72
73
|
/**
|
|
73
74
|
* Creates a factory function.
|
|
74
75
|
*/
|
|
75
|
-
static createFactory() {
|
|
76
|
+
static createFactory({ forcedRtpExtensions, }) {
|
|
76
77
|
return {
|
|
77
78
|
name: NAME,
|
|
78
|
-
factory: (options) => new Firefox120(options),
|
|
79
|
+
factory: (options) => new Firefox120({ ...options, forcedRtpExtensions }),
|
|
79
80
|
getNativeRtpCapabilities: async ({ direction, }) => {
|
|
80
81
|
logger.debug('getNativeRtpCapabilities() [direction:%o]', direction);
|
|
81
82
|
let pc = new RTCPeerConnection({
|
|
@@ -92,14 +93,20 @@ class Firefox120 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
92
93
|
const fakeStream = canvas.captureStream();
|
|
93
94
|
const fakeVideoTrack = fakeStream.getVideoTracks()[0];
|
|
94
95
|
try {
|
|
95
|
-
pc.addTransceiver('audio', { direction });
|
|
96
|
-
|
|
96
|
+
const audioTransceiver = pc.addTransceiver('audio', { direction });
|
|
97
|
+
if (forcedRtpExtensions) {
|
|
98
|
+
ortcUtils.applyForcedRtpExtensions(audioTransceiver, forcedRtpExtensions);
|
|
99
|
+
}
|
|
100
|
+
const videoTransceiver = pc.addTransceiver(fakeVideoTrack, {
|
|
97
101
|
direction,
|
|
98
102
|
sendEncodings: [
|
|
99
103
|
{ rid: 'r0', maxBitrate: 100000 },
|
|
100
104
|
{ rid: 'r1', maxBitrate: 500000 },
|
|
101
105
|
],
|
|
102
106
|
});
|
|
107
|
+
if (forcedRtpExtensions) {
|
|
108
|
+
ortcUtils.applyForcedRtpExtensions(videoTransceiver, forcedRtpExtensions);
|
|
109
|
+
}
|
|
103
110
|
const offer = await pc.createOffer();
|
|
104
111
|
try {
|
|
105
112
|
canvas.remove();
|
|
@@ -146,7 +153,7 @@ class Firefox120 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
146
153
|
ortc.validateAndNormalizeRtpCapabilities(nativeRtpCapabilities);
|
|
147
154
|
return nativeRtpCapabilities;
|
|
148
155
|
}
|
|
149
|
-
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, getSendExtendedRtpCapabilities, }) {
|
|
156
|
+
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, getSendExtendedRtpCapabilities, forcedRtpExtensions, }) {
|
|
150
157
|
super();
|
|
151
158
|
logger.debug('constructor()');
|
|
152
159
|
this._direction = direction;
|
|
@@ -159,6 +166,7 @@ class Firefox120 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
159
166
|
sctpParameters,
|
|
160
167
|
});
|
|
161
168
|
this._getSendExtendedRtpCapabilities = getSendExtendedRtpCapabilities;
|
|
169
|
+
this._forcedRtpExtensions = forcedRtpExtensions;
|
|
162
170
|
this._pc = new RTCPeerConnection({
|
|
163
171
|
iceServers: iceServers ?? [],
|
|
164
172
|
iceTransportPolicy: iceTransportPolicy ?? 'all',
|
|
@@ -258,6 +266,9 @@ class Firefox120 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
258
266
|
streams: [this._sendStream],
|
|
259
267
|
sendEncodings: encodings,
|
|
260
268
|
});
|
|
269
|
+
if (this._forcedRtpExtensions) {
|
|
270
|
+
ortcUtils.applyForcedRtpExtensions(transceiver, this._forcedRtpExtensions);
|
|
271
|
+
}
|
|
261
272
|
if (onRtpSender) {
|
|
262
273
|
onRtpSender(transceiver.sender);
|
|
263
274
|
}
|
|
@@ -584,6 +595,9 @@ class Firefox120 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
584
595
|
if (!transceiver) {
|
|
585
596
|
throw new Error('transceiver not found');
|
|
586
597
|
}
|
|
598
|
+
if (this._forcedRtpExtensions) {
|
|
599
|
+
ortcUtils.applyForcedRtpExtensions(transceiver, this._forcedRtpExtensions);
|
|
600
|
+
}
|
|
587
601
|
onRtpReceiver(transceiver.receiver);
|
|
588
602
|
}
|
|
589
603
|
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { EnhancedEventEmitter } from '../enhancedEvents';
|
|
2
2
|
import type { IceParameters, IceCandidate, DtlsParameters, IceGatheringState, ConnectionState } from '../Transport';
|
|
3
|
-
import type { ProducerCodecOptions,
|
|
3
|
+
import type { ProducerCodecOptions, OnRtpSenderCallback } from '../Producer';
|
|
4
4
|
import type { OnRtpReceiverCallback } from '../Consumer';
|
|
5
|
-
import type { RtpCapabilities, RtpCodecCapability, RtpParameters, RtpEncodingParameters, ExtendedRtpCapabilities } from '../RtpParameters';
|
|
5
|
+
import type { RtpCapabilities, RtpCodecCapability, RtpParameters, RtpEncodingParameters, RtpHeaderExtensionUri, ExtendedRtpCapabilities } from '../RtpParameters';
|
|
6
6
|
import type { SctpParameters, SctpStreamParameters } from '../SctpParameters';
|
|
7
|
+
export type HandlerFactoryOptions = {
|
|
8
|
+
forcedRtpExtensions?: HandlerForcedRtpExtensions;
|
|
9
|
+
};
|
|
10
|
+
export type HandlerForcedRtpExtensions = {
|
|
11
|
+
[K in RtpHeaderExtensionUri]?: boolean;
|
|
12
|
+
};
|
|
7
13
|
export type HandlerFactory = {
|
|
8
14
|
name: string;
|
|
9
15
|
factory: (options: HandlerOptions) => HandlerInterface;
|
|
@@ -19,6 +25,7 @@ export type HandlerOptions = {
|
|
|
19
25
|
iceTransportPolicy?: RTCIceTransportPolicy;
|
|
20
26
|
additionalSettings?: Partial<RTCConfiguration>;
|
|
21
27
|
getSendExtendedRtpCapabilities: (nativeSendRtpCapabilities: RtpCapabilities) => ExtendedRtpCapabilities;
|
|
28
|
+
forcedRtpExtensions?: HandlerForcedRtpExtensions;
|
|
22
29
|
};
|
|
23
30
|
export type HandlerGetNativeRtpCapabilitiesOptions = {
|
|
24
31
|
direction: Extract<RTCRtpTransceiverDirection, 'sendonly' | 'recvonly'>;
|
|
@@ -34,7 +41,6 @@ export type HandlerSendOptions = {
|
|
|
34
41
|
streamId?: string;
|
|
35
42
|
encodings?: RtpEncodingParameters[];
|
|
36
43
|
codecOptions?: ProducerCodecOptions;
|
|
37
|
-
headerExtensionOptions?: ProducerHeaderExtensionOptions;
|
|
38
44
|
codec?: RtpCodecCapability;
|
|
39
45
|
onRtpSender?: OnRtpSenderCallback;
|
|
40
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandlerInterface.d.ts","sourceRoot":"","sources":["../../src/handlers/HandlerInterface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"HandlerInterface.d.ts","sourceRoot":"","sources":["../../src/handlers/HandlerInterface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EACX,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,MAAM,MAAM,qBAAqB,GAAG;IACnC,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;KACvC,CAAC,IAAI,qBAAqB,CAAC,CAAC,EAAE,OAAO;CACtC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,gBAAgB,CAAC;IACvD,wBAAwB,CACvB,OAAO,EAAE,sCAAsC,GAC7C,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,kBAAkB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/C,8BAA8B,EAAE,CAC/B,yBAAyB,EAAE,eAAe,KACtC,uBAAuB,CAAC;IAC7B,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAAG;IACpD,SAAS,EAAE,OAAO,CAAC,0BAA0B,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,KAAK,EAAE,gBAAgB,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACpC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,WAAW,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;IACxB,WAAW,CAAC,EAAE,cAAc,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC3C,oBAAoB,EAAE,oBAAoB,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IAC1C,WAAW,EAAE,cAAc,CAAC;IAC5B,oBAAoB,EAAE,oBAAoB,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC7C,WAAW,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,EAAE,CAAC;IACb,UAAU,EAAE;QACX;YAAE,cAAc,EAAE,cAAc,CAAA;SAAE;QAClC,MAAM,IAAI;QACV,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;KACtB,CAAC;IACF,0BAA0B,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAChD,oBAAoB,EAAE,CAAC,8BAA8B,CAAC,CAAC;IACvD,wBAAwB,EAAE,CAAC,eAAe,CAAC,CAAC;CAC5C,CAAC;AAEF,8BAAsB,gBAAiB,SAAQ,oBAAoB,CAAC,aAAa,CAAC;;IAKjF,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;aAEV,KAAK,IAAI,IAAI;IAE/B,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAEpE,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAEhE,QAAQ,CAAC,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IAErD,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAEtE,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEpD,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAErD,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtD,QAAQ,CAAC,YAAY,CACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC5B,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,kBAAkB,CAC1B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,wBAAwB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAEjE,QAAQ,CAAC,eAAe,CACvB,OAAO,EAAE,6BAA6B,GACpC,OAAO,CAAC,4BAA4B,CAAC;IAExC,QAAQ,CAAC,OAAO,CACf,WAAW,EAAE,qBAAqB,EAAE,GAClC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAElC,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAEzD,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1D,QAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3D,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAEnE,QAAQ,CAAC,kBAAkB,CAC1B,OAAO,EAAE,gCAAgC,GACvC,OAAO,CAAC,+BAA+B,CAAC;IAE3C,QAAQ,CAAC,4BAA4B,IAAI,MAAM,GAAG,SAAS;CAC3D"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { EnhancedEventEmitter } from '../enhancedEvents';
|
|
2
2
|
import type { IceParameters } from '../Transport';
|
|
3
|
-
import type { HandlerFactory, HandlerInterface, HandlerEvents, HandlerSendOptions, HandlerSendResult, HandlerReceiveOptions, HandlerReceiveResult, HandlerSendDataChannelOptions, HandlerSendDataChannelResult, HandlerReceiveDataChannelOptions, HandlerReceiveDataChannelResult } from './HandlerInterface';
|
|
3
|
+
import type { HandlerFactoryOptions, HandlerFactory, HandlerInterface, HandlerEvents, HandlerSendOptions, HandlerSendResult, HandlerReceiveOptions, HandlerReceiveResult, HandlerSendDataChannelOptions, HandlerSendDataChannelResult, HandlerReceiveDataChannelOptions, HandlerReceiveDataChannelResult } from './HandlerInterface';
|
|
4
4
|
export declare class ReactNative106 extends EnhancedEventEmitter<HandlerEvents> implements HandlerInterface {
|
|
5
5
|
private _closed;
|
|
6
6
|
private _direction;
|
|
7
7
|
private _sctpMaxReceiveMessageSize?;
|
|
8
8
|
private _remoteSdp;
|
|
9
9
|
private _getSendExtendedRtpCapabilities;
|
|
10
|
+
private _forcedRtpExtensions?;
|
|
10
11
|
private _forcedLocalDtlsRole?;
|
|
11
12
|
private _pc;
|
|
12
13
|
private readonly _mapMidTransceiver;
|
|
@@ -17,7 +18,7 @@ export declare class ReactNative106 extends EnhancedEventEmitter<HandlerEvents>
|
|
|
17
18
|
/**
|
|
18
19
|
* Creates a factory function.
|
|
19
20
|
*/
|
|
20
|
-
static createFactory(): HandlerFactory;
|
|
21
|
+
static createFactory({ forcedRtpExtensions, }: HandlerFactoryOptions): HandlerFactory;
|
|
21
22
|
private static getLocalRtpCapabilities;
|
|
22
23
|
private constructor();
|
|
23
24
|
get name(): string;
|
|
@@ -25,7 +26,7 @@ export declare class ReactNative106 extends EnhancedEventEmitter<HandlerEvents>
|
|
|
25
26
|
updateIceServers(iceServers: RTCIceServer[]): Promise<void>;
|
|
26
27
|
restartIce(iceParameters: IceParameters): Promise<void>;
|
|
27
28
|
getTransportStats(): Promise<RTCStatsReport>;
|
|
28
|
-
send({ track, streamId, encodings, codecOptions,
|
|
29
|
+
send({ track, streamId, encodings, codecOptions, codec, onRtpSender, }: HandlerSendOptions): Promise<HandlerSendResult>;
|
|
29
30
|
stopSending(localId: string): Promise<void>;
|
|
30
31
|
pauseSending(localId: string): Promise<void>;
|
|
31
32
|
resumeSending(localId: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactNative106.d.ts","sourceRoot":"","sources":["../../src/handlers/ReactNative106.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ReactNative106.d.ts","sourceRoot":"","sources":["../../src/handlers/ReactNative106.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,7 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
57
57
|
_remoteSdp;
|
|
58
58
|
// Callback to request sending extended RTP capabilities on demand.
|
|
59
59
|
_getSendExtendedRtpCapabilities;
|
|
60
|
+
_forcedRtpExtensions;
|
|
60
61
|
// Initial server side DTLS role. If not 'auto', it will force the opposite
|
|
61
62
|
// value in client side.
|
|
62
63
|
_forcedLocalDtlsRole;
|
|
@@ -75,10 +76,10 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
75
76
|
/**
|
|
76
77
|
* Creates a factory function.
|
|
77
78
|
*/
|
|
78
|
-
static createFactory() {
|
|
79
|
+
static createFactory({ forcedRtpExtensions, }) {
|
|
79
80
|
return {
|
|
80
81
|
name: NAME,
|
|
81
|
-
factory: (options) => new ReactNative106(options),
|
|
82
|
+
factory: (options) => new ReactNative106({ ...options, forcedRtpExtensions }),
|
|
82
83
|
getNativeRtpCapabilities: async ({ direction, }) => {
|
|
83
84
|
logger.debug('getNativeRtpCapabilities() [direction:%o]', direction);
|
|
84
85
|
let pc = new RTCPeerConnection({
|
|
@@ -88,8 +89,14 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
88
89
|
rtcpMuxPolicy: 'require',
|
|
89
90
|
});
|
|
90
91
|
try {
|
|
91
|
-
pc.addTransceiver('audio', { direction });
|
|
92
|
-
|
|
92
|
+
const audioTransceiver = pc.addTransceiver('audio', { direction });
|
|
93
|
+
if (forcedRtpExtensions) {
|
|
94
|
+
ortcUtils.applyForcedRtpExtensions(audioTransceiver, forcedRtpExtensions);
|
|
95
|
+
}
|
|
96
|
+
const videoTransceiver = pc.addTransceiver('video', { direction });
|
|
97
|
+
if (forcedRtpExtensions) {
|
|
98
|
+
ortcUtils.applyForcedRtpExtensions(videoTransceiver, forcedRtpExtensions);
|
|
99
|
+
}
|
|
93
100
|
const offer = await pc.createOffer();
|
|
94
101
|
try {
|
|
95
102
|
pc.close();
|
|
@@ -112,7 +119,7 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
112
119
|
},
|
|
113
120
|
};
|
|
114
121
|
}
|
|
115
|
-
static getLocalRtpCapabilities(localSdpObject
|
|
122
|
+
static getLocalRtpCapabilities(localSdpObject) {
|
|
116
123
|
const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({
|
|
117
124
|
sdpObject: localSdpObject,
|
|
118
125
|
});
|
|
@@ -120,12 +127,9 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
120
127
|
ortc.validateAndNormalizeRtpCapabilities(nativeRtpCapabilities);
|
|
121
128
|
// libwebrtc supports NACK for OPUS but doesn't announce it.
|
|
122
129
|
ortcUtils.addNackSupportForOpus(nativeRtpCapabilities);
|
|
123
|
-
for (const headerExtension of extraHeaderExtensions) {
|
|
124
|
-
ortcUtils.addHeaderExtensionSupport(nativeRtpCapabilities, headerExtension);
|
|
125
|
-
}
|
|
126
130
|
return nativeRtpCapabilities;
|
|
127
131
|
}
|
|
128
|
-
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, getSendExtendedRtpCapabilities, }) {
|
|
132
|
+
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, getSendExtendedRtpCapabilities, forcedRtpExtensions, }) {
|
|
129
133
|
super();
|
|
130
134
|
logger.debug('constructor()');
|
|
131
135
|
this._direction = direction;
|
|
@@ -138,6 +142,7 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
138
142
|
sctpParameters,
|
|
139
143
|
});
|
|
140
144
|
this._getSendExtendedRtpCapabilities = getSendExtendedRtpCapabilities;
|
|
145
|
+
this._forcedRtpExtensions = forcedRtpExtensions;
|
|
141
146
|
if (dtlsParameters.role && dtlsParameters.role !== 'auto') {
|
|
142
147
|
this._forcedLocalDtlsRole =
|
|
143
148
|
dtlsParameters.role === 'server' ? 'client' : 'server';
|
|
@@ -227,7 +232,7 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
227
232
|
this.assertNotClosed();
|
|
228
233
|
return this._pc.getStats();
|
|
229
234
|
}
|
|
230
|
-
async send({ track, streamId, encodings, codecOptions,
|
|
235
|
+
async send({ track, streamId, encodings, codecOptions, codec, onRtpSender, }) {
|
|
231
236
|
this.assertNotClosed();
|
|
232
237
|
this.assertSendDirection();
|
|
233
238
|
logger.debug('send() [kind:%s, track.id:%s, streamId:%s]', track.kind, track.id, streamId);
|
|
@@ -242,6 +247,9 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
242
247
|
streams: [this._sendStream],
|
|
243
248
|
sendEncodings: encodings,
|
|
244
249
|
});
|
|
250
|
+
if (this._forcedRtpExtensions) {
|
|
251
|
+
ortcUtils.applyForcedRtpExtensions(transceiver, this._forcedRtpExtensions);
|
|
252
|
+
}
|
|
245
253
|
if (onRtpSender) {
|
|
246
254
|
onRtpSender(transceiver.sender);
|
|
247
255
|
}
|
|
@@ -250,15 +258,7 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
250
258
|
if (localSdpObject.extmapAllowMixed) {
|
|
251
259
|
this._remoteSdp.setSessionExtmapAllowMixed();
|
|
252
260
|
}
|
|
253
|
-
const
|
|
254
|
-
if (headerExtensionOptions?.absCaptureTime) {
|
|
255
|
-
extraHeaderExtensions.push({
|
|
256
|
-
uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time',
|
|
257
|
-
kind: track.kind,
|
|
258
|
-
direction: 'sendonly',
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
const nativeRtpCapabilities = ReactNative106.getLocalRtpCapabilities(localSdpObject, extraHeaderExtensions);
|
|
261
|
+
const nativeRtpCapabilities = ReactNative106.getLocalRtpCapabilities(localSdpObject);
|
|
262
262
|
const sendExtendedRtpCapabilities = this._getSendExtendedRtpCapabilities(nativeRtpCapabilities);
|
|
263
263
|
// Generic sending RTP parameters.
|
|
264
264
|
const sendingRtpParameters = ortc.getSendingRtpParameters(track.kind, sendExtendedRtpCapabilities);
|
|
@@ -294,20 +294,6 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
294
294
|
sdp: sdpTransform.write(localSdpObject),
|
|
295
295
|
};
|
|
296
296
|
}
|
|
297
|
-
// Optimize. Only generate new offer if needed.
|
|
298
|
-
if (headerExtensionOptions?.absCaptureTime) {
|
|
299
|
-
offerMediaObject = localSdpObject.media[mediaSectionIdx.idx];
|
|
300
|
-
sdpCommonUtils.addHeaderExtension({
|
|
301
|
-
offerMediaObject,
|
|
302
|
-
headerExtensionUri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time',
|
|
303
|
-
headerExtensionId: sendingRemoteRtpParameters.headerExtensions.find(headerExtension => headerExtension.uri ===
|
|
304
|
-
'http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time').id,
|
|
305
|
-
});
|
|
306
|
-
offer = {
|
|
307
|
-
type: 'offer',
|
|
308
|
-
sdp: sdpTransform.write(localSdpObject),
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
297
|
logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
312
298
|
await this._pc.setLocalDescription(offer);
|
|
313
299
|
// We can now get the transceiver.mid.
|
|
@@ -631,6 +617,9 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
631
617
|
if (!transceiver) {
|
|
632
618
|
throw new Error('transceiver not found');
|
|
633
619
|
}
|
|
620
|
+
if (this._forcedRtpExtensions) {
|
|
621
|
+
ortcUtils.applyForcedRtpExtensions(transceiver, this._forcedRtpExtensions);
|
|
622
|
+
}
|
|
634
623
|
onRtpReceiver(transceiver.receiver);
|
|
635
624
|
}
|
|
636
625
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { EnhancedEventEmitter } from '../enhancedEvents';
|
|
2
2
|
import type { IceParameters } from '../Transport';
|
|
3
|
-
import type { HandlerFactory, HandlerInterface, HandlerEvents, HandlerOptions, HandlerSendOptions, HandlerSendResult, HandlerReceiveOptions, HandlerReceiveResult, HandlerSendDataChannelOptions, HandlerSendDataChannelResult, HandlerReceiveDataChannelOptions, HandlerReceiveDataChannelResult } from './HandlerInterface';
|
|
3
|
+
import type { HandlerFactoryOptions, HandlerFactory, HandlerInterface, HandlerEvents, HandlerOptions, HandlerSendOptions, HandlerSendResult, HandlerReceiveOptions, HandlerReceiveResult, HandlerSendDataChannelOptions, HandlerSendDataChannelResult, HandlerReceiveDataChannelOptions, HandlerReceiveDataChannelResult } from './HandlerInterface';
|
|
4
4
|
export declare class Safari12 extends EnhancedEventEmitter<HandlerEvents> implements HandlerInterface {
|
|
5
5
|
private _closed;
|
|
6
6
|
private _direction;
|
|
7
7
|
private _sctpMaxReceiveMessageSize?;
|
|
8
8
|
private _remoteSdp;
|
|
9
9
|
private _getSendExtendedRtpCapabilities;
|
|
10
|
+
private _forcedRtpExtensions?;
|
|
10
11
|
private _forcedLocalDtlsRole?;
|
|
11
12
|
private _pc;
|
|
12
13
|
private readonly _mapMidTransceiver;
|
|
@@ -17,15 +18,15 @@ export declare class Safari12 extends EnhancedEventEmitter<HandlerEvents> implem
|
|
|
17
18
|
/**
|
|
18
19
|
* Creates a factory function.
|
|
19
20
|
*/
|
|
20
|
-
static createFactory(): HandlerFactory;
|
|
21
|
+
static createFactory({ forcedRtpExtensions, }: HandlerFactoryOptions): HandlerFactory;
|
|
21
22
|
private static getLocalRtpCapabilities;
|
|
22
|
-
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, getSendExtendedRtpCapabilities, }: HandlerOptions);
|
|
23
|
+
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, getSendExtendedRtpCapabilities, forcedRtpExtensions, }: HandlerOptions);
|
|
23
24
|
get name(): string;
|
|
24
25
|
close(): void;
|
|
25
26
|
updateIceServers(iceServers: RTCIceServer[]): Promise<void>;
|
|
26
27
|
restartIce(iceParameters: IceParameters): Promise<void>;
|
|
27
28
|
getTransportStats(): Promise<RTCStatsReport>;
|
|
28
|
-
send({ track, streamId, encodings, codecOptions,
|
|
29
|
+
send({ track, streamId, encodings, codecOptions, codec, onRtpSender, }: HandlerSendOptions): Promise<HandlerSendResult>;
|
|
29
30
|
stopSending(localId: string): Promise<void>;
|
|
30
31
|
pauseSending(localId: string): Promise<void>;
|
|
31
32
|
resumeSending(localId: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Safari12.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari12.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Safari12.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari12.ts"],"names":[],"mappings":"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"}
|
package/lib/handlers/Safari12.js
CHANGED
|
@@ -57,6 +57,7 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
57
57
|
_remoteSdp;
|
|
58
58
|
// Callback to request sending extended RTP capabilities on demand.
|
|
59
59
|
_getSendExtendedRtpCapabilities;
|
|
60
|
+
_forcedRtpExtensions;
|
|
60
61
|
// Initial server side DTLS role. If not 'auto', it will force the opposite
|
|
61
62
|
// value in client side.
|
|
62
63
|
_forcedLocalDtlsRole;
|
|
@@ -75,10 +76,10 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
75
76
|
/**
|
|
76
77
|
* Creates a factory function.
|
|
77
78
|
*/
|
|
78
|
-
static createFactory() {
|
|
79
|
+
static createFactory({ forcedRtpExtensions, }) {
|
|
79
80
|
return {
|
|
80
81
|
name: NAME,
|
|
81
|
-
factory: (options) => new Safari12(options),
|
|
82
|
+
factory: (options) => new Safari12({ ...options, forcedRtpExtensions }),
|
|
82
83
|
getNativeRtpCapabilities: async ({ direction, }) => {
|
|
83
84
|
logger.debug('getNativeRtpCapabilities() [direction:%o]', direction);
|
|
84
85
|
let pc = new RTCPeerConnection({
|
|
@@ -88,8 +89,14 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
88
89
|
rtcpMuxPolicy: 'require',
|
|
89
90
|
});
|
|
90
91
|
try {
|
|
91
|
-
pc.addTransceiver('audio', { direction });
|
|
92
|
-
|
|
92
|
+
const audioTransceiver = pc.addTransceiver('audio', { direction });
|
|
93
|
+
if (forcedRtpExtensions) {
|
|
94
|
+
ortcUtils.applyForcedRtpExtensions(audioTransceiver, forcedRtpExtensions);
|
|
95
|
+
}
|
|
96
|
+
const videoTransceiver = pc.addTransceiver('video', { direction });
|
|
97
|
+
if (forcedRtpExtensions) {
|
|
98
|
+
ortcUtils.applyForcedRtpExtensions(videoTransceiver, forcedRtpExtensions);
|
|
99
|
+
}
|
|
93
100
|
const offer = await pc.createOffer();
|
|
94
101
|
try {
|
|
95
102
|
pc.close();
|
|
@@ -112,7 +119,7 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
112
119
|
},
|
|
113
120
|
};
|
|
114
121
|
}
|
|
115
|
-
static getLocalRtpCapabilities(localSdpObject
|
|
122
|
+
static getLocalRtpCapabilities(localSdpObject) {
|
|
116
123
|
const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({
|
|
117
124
|
sdpObject: localSdpObject,
|
|
118
125
|
});
|
|
@@ -120,12 +127,9 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
120
127
|
ortc.validateAndNormalizeRtpCapabilities(nativeRtpCapabilities);
|
|
121
128
|
// libwebrtc supports NACK for OPUS but doesn't announce it.
|
|
122
129
|
ortcUtils.addNackSupportForOpus(nativeRtpCapabilities);
|
|
123
|
-
for (const headerExtension of extraHeaderExtensions) {
|
|
124
|
-
ortcUtils.addHeaderExtensionSupport(nativeRtpCapabilities, headerExtension);
|
|
125
|
-
}
|
|
126
130
|
return nativeRtpCapabilities;
|
|
127
131
|
}
|
|
128
|
-
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, getSendExtendedRtpCapabilities, }) {
|
|
132
|
+
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, getSendExtendedRtpCapabilities, forcedRtpExtensions, }) {
|
|
129
133
|
super();
|
|
130
134
|
logger.debug('constructor()');
|
|
131
135
|
this._direction = direction;
|
|
@@ -138,6 +142,7 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
138
142
|
sctpParameters,
|
|
139
143
|
});
|
|
140
144
|
this._getSendExtendedRtpCapabilities = getSendExtendedRtpCapabilities;
|
|
145
|
+
this._forcedRtpExtensions = forcedRtpExtensions;
|
|
141
146
|
if (dtlsParameters.role && dtlsParameters.role !== 'auto') {
|
|
142
147
|
this._forcedLocalDtlsRole =
|
|
143
148
|
dtlsParameters.role === 'server' ? 'client' : 'server';
|
|
@@ -229,7 +234,7 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
229
234
|
this.assertNotClosed();
|
|
230
235
|
return this._pc.getStats();
|
|
231
236
|
}
|
|
232
|
-
async send({ track, streamId, encodings, codecOptions,
|
|
237
|
+
async send({ track, streamId, encodings, codecOptions, codec, onRtpSender, }) {
|
|
233
238
|
this.assertNotClosed();
|
|
234
239
|
this.assertSendDirection();
|
|
235
240
|
logger.debug('send() [kind:%s, track.id:%s, streamId:%s]', track.kind, track.id, streamId);
|
|
@@ -238,6 +243,9 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
238
243
|
direction: 'sendonly',
|
|
239
244
|
streams: [this._sendStream],
|
|
240
245
|
});
|
|
246
|
+
if (this._forcedRtpExtensions) {
|
|
247
|
+
ortcUtils.applyForcedRtpExtensions(transceiver, this._forcedRtpExtensions);
|
|
248
|
+
}
|
|
241
249
|
if (onRtpSender) {
|
|
242
250
|
onRtpSender(transceiver.sender);
|
|
243
251
|
}
|
|
@@ -246,15 +254,7 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
246
254
|
if (localSdpObject.extmapAllowMixed) {
|
|
247
255
|
this._remoteSdp.setSessionExtmapAllowMixed();
|
|
248
256
|
}
|
|
249
|
-
const
|
|
250
|
-
if (headerExtensionOptions?.absCaptureTime) {
|
|
251
|
-
extraHeaderExtensions.push({
|
|
252
|
-
uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time',
|
|
253
|
-
kind: track.kind,
|
|
254
|
-
direction: 'sendonly',
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
const nativeRtpCapabilities = Safari12.getLocalRtpCapabilities(localSdpObject, extraHeaderExtensions);
|
|
257
|
+
const nativeRtpCapabilities = Safari12.getLocalRtpCapabilities(localSdpObject);
|
|
258
258
|
const sendExtendedRtpCapabilities = this._getSendExtendedRtpCapabilities(nativeRtpCapabilities);
|
|
259
259
|
// Generic sending RTP parameters.
|
|
260
260
|
const sendingRtpParameters = ortc.getSendingRtpParameters(track.kind, sendExtendedRtpCapabilities);
|
|
@@ -285,20 +285,6 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
285
285
|
sdp: sdpTransform.write(localSdpObject),
|
|
286
286
|
};
|
|
287
287
|
}
|
|
288
|
-
// Optimize. Only generate new offer if needed.
|
|
289
|
-
if (headerExtensionOptions?.absCaptureTime) {
|
|
290
|
-
offerMediaObject = localSdpObject.media[mediaSectionIdx.idx];
|
|
291
|
-
sdpCommonUtils.addHeaderExtension({
|
|
292
|
-
offerMediaObject,
|
|
293
|
-
headerExtensionUri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time',
|
|
294
|
-
headerExtensionId: sendingRemoteRtpParameters.headerExtensions.find(headerExtension => headerExtension.uri ===
|
|
295
|
-
'http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time').id,
|
|
296
|
-
});
|
|
297
|
-
offer = {
|
|
298
|
-
type: 'offer',
|
|
299
|
-
sdp: sdpTransform.write(localSdpObject),
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
288
|
logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
303
289
|
await this._pc.setLocalDescription(offer);
|
|
304
290
|
// We can now get the transceiver.mid.
|
|
@@ -592,6 +578,9 @@ class Safari12 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
592
578
|
if (!transceiver) {
|
|
593
579
|
throw new Error('transceiver not found');
|
|
594
580
|
}
|
|
581
|
+
if (this._forcedRtpExtensions) {
|
|
582
|
+
ortcUtils.applyForcedRtpExtensions(transceiver, this._forcedRtpExtensions);
|
|
583
|
+
}
|
|
595
584
|
onRtpReceiver(transceiver.receiver);
|
|
596
585
|
}
|
|
597
586
|
}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HandlerForcedRtpExtensions } from '../../handlers/HandlerInterface';
|
|
2
|
+
import type { RtpCapabilities } from '../../RtpParameters';
|
|
2
3
|
/**
|
|
3
4
|
* This function adds RTCP NACK support for OPUS codec in given capabilities.
|
|
4
5
|
*/
|
|
5
6
|
export declare function addNackSupportForOpus(rtpCapabilities: RtpCapabilities): void;
|
|
6
|
-
/**
|
|
7
|
-
* This function adds the given RTP header extension to given capabilities.
|
|
8
|
-
*/
|
|
9
|
-
export declare function addHeaderExtensionSupport(rtpCapabilities: RtpCapabilities, headerExtension: {
|
|
10
|
-
uri: RtpHeaderExtensionUri;
|
|
11
|
-
kind: MediaKind;
|
|
12
|
-
direction: RtpHeaderExtensionDirection;
|
|
13
|
-
}): void;
|
|
14
7
|
export declare function getMsidStreamIdAndTrackId(msid?: string): {
|
|
15
8
|
msidStreamId?: string;
|
|
16
9
|
msidTrackId?: string;
|
|
17
10
|
};
|
|
11
|
+
/**
|
|
12
|
+
* Apply given desired RTP extension to the given RTCRtpTransceiver.
|
|
13
|
+
*
|
|
14
|
+
* @see https://w3c.github.io/webrtc-extensions/#rtp-header-extension-control
|
|
15
|
+
*/
|
|
16
|
+
export declare function applyForcedRtpExtensions(transceiver: RTCRtpTransceiver, forcedRtpExtensions: HandlerForcedRtpExtensions): boolean;
|
|
18
17
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/handlers/ortc/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/handlers/ortc/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,KAAK,EACX,eAAe,EAEf,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAc5E;AAED,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAgBA;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,WAAW,EAAE,iBAAiB,EAC9B,mBAAmB,EAAE,0BAA0B,GAC7C,OAAO,CAiCT"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addNackSupportForOpus = addNackSupportForOpus;
|
|
4
|
-
exports.addHeaderExtensionSupport = addHeaderExtensionSupport;
|
|
5
4
|
exports.getMsidStreamIdAndTrackId = getMsidStreamIdAndTrackId;
|
|
5
|
+
exports.applyForcedRtpExtensions = applyForcedRtpExtensions;
|
|
6
6
|
/**
|
|
7
7
|
* This function adds RTCP NACK support for OPUS codec in given capabilities.
|
|
8
8
|
*/
|
|
@@ -18,44 +18,6 @@ function addNackSupportForOpus(rtpCapabilities) {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
/**
|
|
22
|
-
* This function adds the given RTP header extension to given capabilities.
|
|
23
|
-
*/
|
|
24
|
-
function addHeaderExtensionSupport(rtpCapabilities, headerExtension) {
|
|
25
|
-
let preferredId;
|
|
26
|
-
// Look for an already existing header extension with same `uri`. Don't
|
|
27
|
-
// try to match `kind` since all media sections in a Bundle SDP must share
|
|
28
|
-
// same `id` in extensions with same `uri` (as per spec). So if we are
|
|
29
|
-
// adding an audio extension and there is already a video extension with
|
|
30
|
-
// same `uri`, then reuse its preferred `id`.
|
|
31
|
-
const existingHeaderExtension = rtpCapabilities.headerExtensions?.find(exten => exten.uri === headerExtension.uri);
|
|
32
|
-
if (existingHeaderExtension) {
|
|
33
|
-
if (existingHeaderExtension.kind === headerExtension.kind) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
preferredId = existingHeaderExtension.preferredId;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
if (!rtpCapabilities.headerExtensions) {
|
|
41
|
-
rtpCapabilities.headerExtensions = [];
|
|
42
|
-
}
|
|
43
|
-
if (preferredId === undefined) {
|
|
44
|
-
preferredId = 1;
|
|
45
|
-
const setPreferredIds = new Set(rtpCapabilities.headerExtensions.map(exten => exten.preferredId));
|
|
46
|
-
while (setPreferredIds.has(preferredId)) {
|
|
47
|
-
++preferredId;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
const newHeaderExtension = {
|
|
51
|
-
kind: headerExtension.kind,
|
|
52
|
-
uri: headerExtension.uri,
|
|
53
|
-
preferredId,
|
|
54
|
-
preferredEncrypt: false,
|
|
55
|
-
direction: headerExtension.direction,
|
|
56
|
-
};
|
|
57
|
-
rtpCapabilities.headerExtensions.push(newHeaderExtension);
|
|
58
|
-
}
|
|
59
21
|
function getMsidStreamIdAndTrackId(msid) {
|
|
60
22
|
if (!msid || typeof msid !== 'string') {
|
|
61
23
|
return { msidStreamId: undefined, msidTrackId: undefined };
|
|
@@ -70,3 +32,32 @@ function getMsidStreamIdAndTrackId(msid) {
|
|
|
70
32
|
}
|
|
71
33
|
return { msidStreamId, msidTrackId };
|
|
72
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Apply given desired RTP extension to the given RTCRtpTransceiver.
|
|
37
|
+
*
|
|
38
|
+
* @see https://w3c.github.io/webrtc-extensions/#rtp-header-extension-control
|
|
39
|
+
*/
|
|
40
|
+
function applyForcedRtpExtensions(transceiver, forcedRtpExtensions) {
|
|
41
|
+
// If the RTP header extension control API is not available then abort.
|
|
42
|
+
if (!transceiver.getHeaderExtensionsToNegotiate ||
|
|
43
|
+
!transceiver.setHeaderExtensionsToNegotiate) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (Object.keys(forcedRtpExtensions).length === 0) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
let extensionsToNegotiate = transceiver.getHeaderExtensionsToNegotiate();
|
|
50
|
+
extensionsToNegotiate = extensionsToNegotiate.map((extenCap) => {
|
|
51
|
+
const uri = extenCap.uri;
|
|
52
|
+
const enabled = forcedRtpExtensions[uri];
|
|
53
|
+
if (enabled === true) {
|
|
54
|
+
extenCap.direction = 'sendrecv';
|
|
55
|
+
}
|
|
56
|
+
else if (enabled === false) {
|
|
57
|
+
extenCap.direction = 'stopped';
|
|
58
|
+
}
|
|
59
|
+
return extenCap;
|
|
60
|
+
});
|
|
61
|
+
transceiver.setHeaderExtensionsToNegotiate(extensionsToNegotiate);
|
|
62
|
+
return true;
|
|
63
|
+
}
|