mediasoup 3.9.1 → 3.9.2
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/node/lib/ActiveSpeakerObserver.js +1 -0
- package/node/lib/AudioLevelObserver.js +1 -0
- package/node/lib/Channel.js +49 -63
- package/node/lib/Consumer.js +103 -117
- package/node/lib/DataConsumer.js +53 -67
- package/node/lib/DataProducer.js +42 -56
- package/node/lib/DirectTransport.js +7 -14
- package/node/lib/EnhancedEventEmitter.js +1 -0
- package/node/lib/Logger.js +16 -30
- package/node/lib/PayloadChannel.js +66 -79
- package/node/lib/PipeTransport.js +23 -36
- package/node/lib/PlainTransport.js +28 -41
- package/node/lib/Producer.js +64 -78
- package/node/lib/Router.d.ts +8 -0
- package/node/lib/Router.d.ts.map +1 -1
- package/node/lib/Router.js +190 -183
- package/node/lib/RtpObserver.js +36 -42
- package/node/lib/Transport.js +88 -93
- package/node/lib/WebRtcTransport.js +43 -56
- package/node/lib/Worker.d.ts +5 -1
- package/node/lib/Worker.d.ts.map +1 -1
- package/node/lib/Worker.js +92 -97
- package/node/lib/errors.js +1 -0
- package/node/lib/index.d.ts +1 -1
- package/node/lib/index.js +3 -2
- package/node/lib/ortc.js +2 -1
- package/node/lib/scalabilityModes.js +1 -0
- package/node/lib/supportedRtpCapabilities.js +1 -0
- package/node/lib/types.js +28 -18
- package/node/lib/utils.js +1 -0
- package/package.json +7 -8
- package/worker/scripts/cpu_cores.sh +1 -1
- package/worker/src/DepUsrSCTP.cpp +23 -27
- package/worker/src/RTC/Transport.cpp +7 -5
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ActiveSpeakerObserver = void 0;
|
|
3
4
|
const Logger_1 = require("./Logger");
|
|
4
5
|
const RtpObserver_1 = require("./RtpObserver");
|
|
5
6
|
const logger = new Logger_1.Logger('ActiveSpeakerObserver');
|
package/node/lib/Channel.js
CHANGED
|
@@ -1,19 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {
|
|
3
|
-
if (!privateMap.has(receiver)) {
|
|
4
|
-
throw new TypeError("attempted to set private field on non-instance");
|
|
5
|
-
}
|
|
6
|
-
privateMap.set(receiver, value);
|
|
7
|
-
return value;
|
|
8
|
-
};
|
|
9
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
|
|
10
|
-
if (!privateMap.has(receiver)) {
|
|
11
|
-
throw new TypeError("attempted to get private field on non-instance");
|
|
12
|
-
}
|
|
13
|
-
return privateMap.get(receiver);
|
|
14
|
-
};
|
|
15
|
-
var _closed, _producerSocket, _consumerSocket, _nextId, _sents, _recvBuffer;
|
|
16
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Channel = void 0;
|
|
17
4
|
const os = require("os");
|
|
18
5
|
const Logger_1 = require("./Logger");
|
|
19
6
|
const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter");
|
|
@@ -24,55 +11,55 @@ const logger = new Logger_1.Logger('Channel');
|
|
|
24
11
|
const MESSAGE_MAX_LEN = 4194308;
|
|
25
12
|
const PAYLOAD_MAX_LEN = 4194304;
|
|
26
13
|
class Channel extends EnhancedEventEmitter_1.EnhancedEventEmitter {
|
|
14
|
+
// Closed flag.
|
|
15
|
+
#closed = false;
|
|
16
|
+
// Unix Socket instance for sending messages to the worker process.
|
|
17
|
+
#producerSocket;
|
|
18
|
+
// Unix Socket instance for receiving messages to the worker process.
|
|
19
|
+
#consumerSocket;
|
|
20
|
+
// Next id for messages sent to the worker process.
|
|
21
|
+
#nextId = 0;
|
|
22
|
+
// Map of pending sent requests.
|
|
23
|
+
#sents = new Map();
|
|
24
|
+
// Buffer for reading messages from the worker.
|
|
25
|
+
#recvBuffer = Buffer.alloc(0);
|
|
27
26
|
/**
|
|
28
27
|
* @private
|
|
29
28
|
*/
|
|
30
29
|
constructor({ producerSocket, consumerSocket, pid }) {
|
|
31
30
|
super();
|
|
32
|
-
// Closed flag.
|
|
33
|
-
_closed.set(this, false);
|
|
34
|
-
// Unix Socket instance for sending messages to the worker process.
|
|
35
|
-
_producerSocket.set(this, void 0);
|
|
36
|
-
// Unix Socket instance for receiving messages to the worker process.
|
|
37
|
-
_consumerSocket.set(this, void 0);
|
|
38
|
-
// Next id for messages sent to the worker process.
|
|
39
|
-
_nextId.set(this, 0);
|
|
40
|
-
// Map of pending sent requests.
|
|
41
|
-
_sents.set(this, new Map());
|
|
42
|
-
// Buffer for reading messages from the worker.
|
|
43
|
-
_recvBuffer.set(this, Buffer.alloc(0));
|
|
44
31
|
logger.debug('constructor()');
|
|
45
|
-
|
|
46
|
-
|
|
32
|
+
this.#producerSocket = producerSocket;
|
|
33
|
+
this.#consumerSocket = consumerSocket;
|
|
47
34
|
// Read Channel responses/notifications from the worker.
|
|
48
|
-
|
|
49
|
-
if (!
|
|
50
|
-
|
|
35
|
+
this.#consumerSocket.on('data', (buffer) => {
|
|
36
|
+
if (!this.#recvBuffer.length) {
|
|
37
|
+
this.#recvBuffer = buffer;
|
|
51
38
|
}
|
|
52
39
|
else {
|
|
53
|
-
|
|
40
|
+
this.#recvBuffer = Buffer.concat([this.#recvBuffer, buffer], this.#recvBuffer.length + buffer.length);
|
|
54
41
|
}
|
|
55
|
-
if (
|
|
42
|
+
if (this.#recvBuffer.length > PAYLOAD_MAX_LEN) {
|
|
56
43
|
logger.error('receiving buffer is full, discarding all data in it');
|
|
57
44
|
// Reset the buffer and exit.
|
|
58
|
-
|
|
45
|
+
this.#recvBuffer = Buffer.alloc(0);
|
|
59
46
|
return;
|
|
60
47
|
}
|
|
61
48
|
let msgStart = 0;
|
|
62
49
|
while (true) // eslint-disable-line no-constant-condition
|
|
63
50
|
{
|
|
64
|
-
const readLen =
|
|
51
|
+
const readLen = this.#recvBuffer.length - msgStart;
|
|
65
52
|
if (readLen < 4) {
|
|
66
53
|
// Incomplete data.
|
|
67
54
|
break;
|
|
68
55
|
}
|
|
69
|
-
const dataView = new DataView(
|
|
56
|
+
const dataView = new DataView(this.#recvBuffer.buffer, this.#recvBuffer.byteOffset + msgStart);
|
|
70
57
|
const msgLen = dataView.getUint32(0, littleEndian);
|
|
71
58
|
if (readLen < 4 + msgLen) {
|
|
72
59
|
// Incomplete data.
|
|
73
60
|
break;
|
|
74
61
|
}
|
|
75
|
-
const payload =
|
|
62
|
+
const payload = this.#recvBuffer.subarray(msgStart + 4, msgStart + 4 + msgLen);
|
|
76
63
|
msgStart += 4 + msgLen;
|
|
77
64
|
try {
|
|
78
65
|
// We can receive JSON messages (Channel messages) or log strings.
|
|
@@ -108,42 +95,42 @@ class Channel extends EnhancedEventEmitter_1.EnhancedEventEmitter {
|
|
|
108
95
|
}
|
|
109
96
|
}
|
|
110
97
|
if (msgStart != 0) {
|
|
111
|
-
|
|
98
|
+
this.#recvBuffer = this.#recvBuffer.slice(msgStart);
|
|
112
99
|
}
|
|
113
100
|
});
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
101
|
+
this.#consumerSocket.on('end', () => (logger.debug('Consumer Channel ended by the worker process')));
|
|
102
|
+
this.#consumerSocket.on('error', (error) => (logger.error('Consumer Channel error: %s', String(error))));
|
|
103
|
+
this.#producerSocket.on('end', () => (logger.debug('Producer Channel ended by the worker process')));
|
|
104
|
+
this.#producerSocket.on('error', (error) => (logger.error('Producer Channel error: %s', String(error))));
|
|
118
105
|
}
|
|
119
106
|
/**
|
|
120
107
|
* @private
|
|
121
108
|
*/
|
|
122
109
|
close() {
|
|
123
|
-
if (
|
|
110
|
+
if (this.#closed)
|
|
124
111
|
return;
|
|
125
112
|
logger.debug('close()');
|
|
126
|
-
|
|
113
|
+
this.#closed = true;
|
|
127
114
|
// Close every pending sent.
|
|
128
|
-
for (const sent of
|
|
115
|
+
for (const sent of this.#sents.values()) {
|
|
129
116
|
sent.close();
|
|
130
117
|
}
|
|
131
118
|
// Remove event listeners but leave a fake 'error' hander to avoid
|
|
132
119
|
// propagation.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
120
|
+
this.#consumerSocket.removeAllListeners('end');
|
|
121
|
+
this.#consumerSocket.removeAllListeners('error');
|
|
122
|
+
this.#consumerSocket.on('error', () => { });
|
|
123
|
+
this.#producerSocket.removeAllListeners('end');
|
|
124
|
+
this.#producerSocket.removeAllListeners('error');
|
|
125
|
+
this.#producerSocket.on('error', () => { });
|
|
139
126
|
// Destroy the socket after a while to allow pending incoming messages.
|
|
140
127
|
setTimeout(() => {
|
|
141
128
|
try {
|
|
142
|
-
|
|
129
|
+
this.#producerSocket.destroy();
|
|
143
130
|
}
|
|
144
131
|
catch (error) { }
|
|
145
132
|
try {
|
|
146
|
-
|
|
133
|
+
this.#consumerSocket.destroy();
|
|
147
134
|
}
|
|
148
135
|
catch (error) { }
|
|
149
136
|
}, 200);
|
|
@@ -152,29 +139,29 @@ class Channel extends EnhancedEventEmitter_1.EnhancedEventEmitter {
|
|
|
152
139
|
* @private
|
|
153
140
|
*/
|
|
154
141
|
async request(method, internal, data) {
|
|
155
|
-
|
|
156
|
-
const id =
|
|
142
|
+
this.#nextId < 4294967295 ? ++this.#nextId : (this.#nextId = 1);
|
|
143
|
+
const id = this.#nextId;
|
|
157
144
|
logger.debug('request() [method:%s, id:%s]', method, id);
|
|
158
|
-
if (
|
|
145
|
+
if (this.#closed)
|
|
159
146
|
throw new errors_1.InvalidStateError('Channel closed');
|
|
160
147
|
const request = { id, method, internal, data };
|
|
161
148
|
const payload = JSON.stringify(request);
|
|
162
149
|
if (Buffer.byteLength(payload) > MESSAGE_MAX_LEN)
|
|
163
150
|
throw new Error('Channel request too big');
|
|
164
151
|
// This may throw if closed or remote side ended.
|
|
165
|
-
|
|
166
|
-
|
|
152
|
+
this.#producerSocket.write(Buffer.from(Uint32Array.of(Buffer.byteLength(payload)).buffer));
|
|
153
|
+
this.#producerSocket.write(payload);
|
|
167
154
|
return new Promise((pResolve, pReject) => {
|
|
168
155
|
const sent = {
|
|
169
156
|
id: id,
|
|
170
157
|
method: method,
|
|
171
158
|
resolve: (data2) => {
|
|
172
|
-
if (!
|
|
159
|
+
if (!this.#sents.delete(id))
|
|
173
160
|
return;
|
|
174
161
|
pResolve(data2);
|
|
175
162
|
},
|
|
176
163
|
reject: (error) => {
|
|
177
|
-
if (!
|
|
164
|
+
if (!this.#sents.delete(id))
|
|
178
165
|
return;
|
|
179
166
|
pReject(error);
|
|
180
167
|
},
|
|
@@ -183,13 +170,13 @@ class Channel extends EnhancedEventEmitter_1.EnhancedEventEmitter {
|
|
|
183
170
|
}
|
|
184
171
|
};
|
|
185
172
|
// Add sent stuff to the map.
|
|
186
|
-
|
|
173
|
+
this.#sents.set(id, sent);
|
|
187
174
|
});
|
|
188
175
|
}
|
|
189
176
|
processMessage(msg) {
|
|
190
177
|
// If a response, retrieve its associated request.
|
|
191
178
|
if (msg.id) {
|
|
192
|
-
const sent =
|
|
179
|
+
const sent = this.#sents.get(msg.id);
|
|
193
180
|
if (!sent) {
|
|
194
181
|
logger.error('received response does not match any sent request [id:%s]', msg.id);
|
|
195
182
|
return;
|
|
@@ -229,4 +216,3 @@ class Channel extends EnhancedEventEmitter_1.EnhancedEventEmitter {
|
|
|
229
216
|
}
|
|
230
217
|
}
|
|
231
218
|
exports.Channel = Channel;
|
|
232
|
-
_closed = new WeakMap(), _producerSocket = new WeakMap(), _consumerSocket = new WeakMap(), _nextId = new WeakMap(), _sents = new WeakMap(), _recvBuffer = new WeakMap();
|