livekit-client 2.18.0 → 2.18.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/dist/livekit-client.e2ee.worker.js +1 -1
- package/dist/livekit-client.e2ee.worker.js.map +1 -1
- package/dist/livekit-client.e2ee.worker.mjs +8 -7
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +7832 -5799
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/api/SignalClient.d.ts +12 -4
- package/dist/src/api/SignalClient.d.ts.map +1 -1
- package/dist/src/e2ee/constants.d.ts.map +1 -1
- package/dist/src/e2ee/types.d.ts +6 -0
- package/dist/src/e2ee/types.d.ts.map +1 -1
- package/dist/src/e2ee/utils.d.ts +2 -1
- package/dist/src/e2ee/utils.d.ts.map +1 -1
- package/dist/src/e2ee/worker/DataCryptor.d.ts.map +1 -1
- package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
- package/dist/src/index.d.ts +5 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +5 -0
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/PCTransportManager.d.ts +1 -1
- package/dist/src/room/PCTransportManager.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +24 -8
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +13 -3
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/data-stream/outgoing/OutgoingDataStreamManager.d.ts.map +1 -1
- package/dist/src/room/data-track/LocalDataTrack.d.ts +28 -5
- package/dist/src/room/data-track/LocalDataTrack.d.ts.map +1 -1
- package/dist/src/room/data-track/RemoteDataTrack.d.ts +5 -5
- package/dist/src/room/data-track/RemoteDataTrack.d.ts.map +1 -1
- package/dist/src/room/data-track/depacketizer.d.ts +4 -4
- package/dist/src/room/data-track/depacketizer.d.ts.map +1 -1
- package/dist/src/room/data-track/frame.d.ts +14 -0
- package/dist/src/room/data-track/frame.d.ts.map +1 -1
- package/dist/src/room/data-track/incoming/IncomingDataTrackManager.d.ts +19 -11
- package/dist/src/room/data-track/incoming/IncomingDataTrackManager.d.ts.map +1 -1
- package/dist/src/room/data-track/incoming/pipeline.d.ts +6 -5
- package/dist/src/room/data-track/incoming/pipeline.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/OutgoingDataTrackManager.d.ts +57 -23
- package/dist/src/room/data-track/outgoing/OutgoingDataTrackManager.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/errors.d.ts +16 -6
- package/dist/src/room/data-track/outgoing/errors.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/pipeline.d.ts +7 -6
- package/dist/src/room/data-track/outgoing/pipeline.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/types.d.ts +14 -4
- package/dist/src/room/data-track/outgoing/types.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/extensions.d.ts.map +1 -1
- package/dist/src/room/data-track/packetizer.d.ts +4 -4
- package/dist/src/room/data-track/packetizer.d.ts.map +1 -1
- package/dist/src/room/data-track/track-interfaces.d.ts +1 -1
- package/dist/src/room/data-track/track-interfaces.d.ts.map +1 -1
- package/dist/src/room/data-track/types.d.ts +6 -1
- package/dist/src/room/data-track/types.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +24 -3
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts +11 -1
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/RemoteParticipant.d.ts +13 -0
- package/dist/src/room/participant/RemoteParticipant.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts +1 -0
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/src/utils/deferrable-map.d.ts +32 -0
- package/dist/src/utils/deferrable-map.d.ts.map +1 -0
- package/dist/ts4.2/api/SignalClient.d.ts +12 -4
- package/dist/ts4.2/e2ee/types.d.ts +6 -0
- package/dist/ts4.2/e2ee/utils.d.ts +2 -1
- package/dist/ts4.2/index.d.ts +5 -4
- package/dist/ts4.2/room/PCTransport.d.ts +5 -0
- package/dist/ts4.2/room/PCTransportManager.d.ts +1 -1
- package/dist/ts4.2/room/RTCEngine.d.ts +24 -8
- package/dist/ts4.2/room/Room.d.ts +13 -3
- package/dist/ts4.2/room/data-track/LocalDataTrack.d.ts +27 -4
- package/dist/ts4.2/room/data-track/RemoteDataTrack.d.ts +4 -4
- package/dist/ts4.2/room/data-track/depacketizer.d.ts +4 -4
- package/dist/ts4.2/room/data-track/frame.d.ts +14 -0
- package/dist/ts4.2/room/data-track/incoming/IncomingDataTrackManager.d.ts +21 -10
- package/dist/ts4.2/room/data-track/incoming/pipeline.d.ts +6 -5
- package/dist/ts4.2/room/data-track/outgoing/OutgoingDataTrackManager.d.ts +57 -23
- package/dist/ts4.2/room/data-track/outgoing/errors.d.ts +16 -6
- package/dist/ts4.2/room/data-track/outgoing/pipeline.d.ts +7 -6
- package/dist/ts4.2/room/data-track/outgoing/types.d.ts +14 -4
- package/dist/ts4.2/room/data-track/packetizer.d.ts +4 -4
- package/dist/ts4.2/room/data-track/track-interfaces.d.ts +1 -1
- package/dist/ts4.2/room/data-track/types.d.ts +6 -1
- package/dist/ts4.2/room/events.d.ts +24 -3
- package/dist/ts4.2/room/participant/LocalParticipant.d.ts +11 -1
- package/dist/ts4.2/room/participant/RemoteParticipant.d.ts +13 -0
- package/dist/ts4.2/room/utils.d.ts +1 -0
- package/dist/ts4.2/utils/deferrable-map.d.ts +32 -0
- package/package.json +1 -1
- package/src/api/SignalClient.test.ts +9 -4
- package/src/api/SignalClient.ts +116 -9
- package/src/e2ee/constants.ts +1 -0
- package/src/e2ee/types.ts +6 -0
- package/src/e2ee/utils.ts +4 -3
- package/src/e2ee/worker/DataCryptor.ts +1 -4
- package/src/e2ee/worker/FrameCryptor.ts +1 -4
- package/src/e2ee/worker/ParticipantKeyHandler.ts +1 -1
- package/src/index.ts +6 -4
- package/src/room/PCTransport.ts +41 -1
- package/src/room/PCTransportManager.ts +1 -1
- package/src/room/RTCEngine.ts +266 -111
- package/src/room/Room.ts +149 -12
- package/src/room/data-stream/outgoing/OutgoingDataStreamManager.ts +7 -7
- package/src/room/data-track/LocalDataTrack.ts +83 -10
- package/src/room/data-track/RemoteDataTrack.ts +7 -9
- package/src/room/data-track/depacketizer.ts +21 -12
- package/src/room/data-track/frame.ts +28 -2
- package/src/room/data-track/incoming/IncomingDataTrackManager.test.ts +58 -73
- package/src/room/data-track/incoming/IncomingDataTrackManager.ts +132 -80
- package/src/room/data-track/incoming/pipeline.ts +29 -24
- package/src/room/data-track/outgoing/OutgoingDataTrackManager.test.ts +225 -32
- package/src/room/data-track/outgoing/OutgoingDataTrackManager.ts +150 -75
- package/src/room/data-track/outgoing/errors.ts +36 -7
- package/src/room/data-track/outgoing/pipeline.ts +23 -17
- package/src/room/data-track/outgoing/types.ts +12 -3
- package/src/room/data-track/packet/extensions.ts +17 -22
- package/src/room/data-track/packet/index.test.ts +22 -33
- package/src/room/data-track/packetizer.test.ts +2 -2
- package/src/room/data-track/packetizer.ts +4 -4
- package/src/room/data-track/track-interfaces.ts +1 -1
- package/src/room/data-track/types.ts +21 -1
- package/src/room/events.ts +26 -1
- package/src/room/participant/LocalParticipant.ts +57 -6
- package/src/room/participant/RemoteParticipant.ts +25 -0
- package/src/room/utils.ts +4 -0
- package/src/utils/deferrable-map.ts +109 -0
- package/dist/src/room/data-track/e2ee.d.ts +0 -12
- package/dist/src/room/data-track/e2ee.d.ts.map +0 -1
- package/dist/ts4.2/room/data-track/e2ee.d.ts +0 -12
- package/src/room/data-track/e2ee.ts +0 -15
|
@@ -1,43 +1,25 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
2
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
3
|
import { subscribeToEvents } from '../../../utils/subscribeToEvents';
|
|
4
|
-
import {
|
|
5
|
-
import { DataTrackFrame } from '../frame';
|
|
4
|
+
import { type DataTrackFrame } from '../frame';
|
|
6
5
|
import { DataTrackHandle, DataTrackHandleAllocator } from '../handle';
|
|
6
|
+
import { PrefixingEncryptionProvider } from '../outgoing/OutgoingDataTrackManager.test';
|
|
7
7
|
import { DataTrackPacket, DataTrackPacketHeader, FrameMarker } from '../packet';
|
|
8
8
|
import { DataTrackE2eeExtension, DataTrackExtensions } from '../packet/extensions';
|
|
9
9
|
import { DataTrackTimestamp, WrapAroundUnsignedInt } from '../utils';
|
|
10
10
|
import IncomingDataTrackManager, {
|
|
11
|
-
DataTrackIncomingManagerCallbacks,
|
|
11
|
+
type DataTrackIncomingManagerCallbacks,
|
|
12
12
|
} from './IncomingDataTrackManager';
|
|
13
13
|
import { DataTrackSubscribeError } from './errors';
|
|
14
14
|
|
|
15
|
-
/** A fake "decryption" provider used for test purposes. Assumes the payload is prefixed with
|
|
16
|
-
* 0xdeafbeef, which is stripped off. */
|
|
17
|
-
const PrefixingDecryptionProvider: DecryptionProvider = {
|
|
18
|
-
decrypt(p: EncryptedPayload, _senderIdentity: string) {
|
|
19
|
-
if (
|
|
20
|
-
p.payload[0] !== 0xde ||
|
|
21
|
-
p.payload[1] !== 0xad ||
|
|
22
|
-
p.payload[2] !== 0xbe ||
|
|
23
|
-
p.payload[3] !== 0xef
|
|
24
|
-
) {
|
|
25
|
-
throw new Error(
|
|
26
|
-
`PrefixingDecryptionProvider: first four bytes of payload were not 0xdeadbeef, found ${p.payload.slice(0, 4)}`,
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
return p.payload.slice(4);
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
|
|
33
15
|
describe('DataTrackIncomingManager', () => {
|
|
34
16
|
describe('Track publication', () => {
|
|
35
17
|
it('should test track publication additions / removals', async () => {
|
|
36
18
|
const manager = new IncomingDataTrackManager();
|
|
37
19
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
38
20
|
'sfuUpdateSubscription',
|
|
39
|
-
'
|
|
40
|
-
'
|
|
21
|
+
'trackPublished',
|
|
22
|
+
'trackUnpublished',
|
|
41
23
|
]);
|
|
42
24
|
|
|
43
25
|
// 1. Add a track, make sure the track available event was sent
|
|
@@ -57,11 +39,11 @@ describe('DataTrackIncomingManager', () => {
|
|
|
57
39
|
]),
|
|
58
40
|
);
|
|
59
41
|
|
|
60
|
-
const
|
|
61
|
-
expect(
|
|
62
|
-
expect(
|
|
63
|
-
expect(
|
|
64
|
-
expect(
|
|
42
|
+
const trackPublishedEvent = await managerEvents.waitFor('trackPublished');
|
|
43
|
+
expect(trackPublishedEvent.track.info.sid).toStrictEqual('sid1');
|
|
44
|
+
expect(trackPublishedEvent.track.info.pubHandle).toStrictEqual(DataTrackHandle.fromNumber(5));
|
|
45
|
+
expect(trackPublishedEvent.track.info.name).toStrictEqual('test');
|
|
46
|
+
expect(trackPublishedEvent.track.info.usesE2ee).toStrictEqual(false);
|
|
65
47
|
|
|
66
48
|
// 2. Check to make sure the publication has been noted in internal state
|
|
67
49
|
expect((await manager.queryPublications()).map((p) => p.pubHandle)).to.deep.equal([
|
|
@@ -72,9 +54,9 @@ describe('DataTrackIncomingManager', () => {
|
|
|
72
54
|
await manager.receiveSfuPublicationUpdates(new Map([['identity1', []]]));
|
|
73
55
|
expect(await manager.queryPublications()).to.deep.equal([]);
|
|
74
56
|
|
|
75
|
-
const
|
|
76
|
-
expect(
|
|
77
|
-
expect(
|
|
57
|
+
const trackUnpublishedEvent = await managerEvents.waitFor('trackUnpublished');
|
|
58
|
+
expect(trackUnpublishedEvent.sid).toStrictEqual('sid1');
|
|
59
|
+
expect(trackUnpublishedEvent.publisherIdentity).toStrictEqual('identity1');
|
|
78
60
|
});
|
|
79
61
|
|
|
80
62
|
it('should process sfu publication updates idempotently', async () => {
|
|
@@ -111,7 +93,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
111
93
|
const manager = new IncomingDataTrackManager();
|
|
112
94
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
113
95
|
'sfuUpdateSubscription',
|
|
114
|
-
'
|
|
96
|
+
'trackPublished',
|
|
115
97
|
]);
|
|
116
98
|
|
|
117
99
|
const senderIdentity = 'identity';
|
|
@@ -122,10 +104,11 @@ describe('DataTrackIncomingManager', () => {
|
|
|
122
104
|
await manager.receiveSfuPublicationUpdates(
|
|
123
105
|
new Map([[senderIdentity, [{ sid, pubHandle: handle, name: 'test', usesE2ee: false }]]]),
|
|
124
106
|
);
|
|
125
|
-
await managerEvents.waitFor('
|
|
107
|
+
await managerEvents.waitFor('trackPublished');
|
|
126
108
|
|
|
127
|
-
// 2.
|
|
128
|
-
const
|
|
109
|
+
// 2. Create a subscription readable stream (SFU subscription starts lazily in the background)
|
|
110
|
+
const [stream, sfuSubscriptionComplete] = manager.openSubscriptionStream(sid);
|
|
111
|
+
const reader = stream.getReader();
|
|
129
112
|
|
|
130
113
|
// 3. This subscribe request should be sent along to the SFU
|
|
131
114
|
const sfuUpdateSubscriptionEvent = await managerEvents.waitFor('sfuUpdateSubscription');
|
|
@@ -136,9 +119,8 @@ describe('DataTrackIncomingManager', () => {
|
|
|
136
119
|
// the subscription
|
|
137
120
|
manager.receivedSfuSubscriberHandles(new Map([[handle, sid]]));
|
|
138
121
|
|
|
139
|
-
// 5.
|
|
140
|
-
|
|
141
|
-
const reader = readableStream.getReader();
|
|
122
|
+
// 5. Wait for the subscription to be fully established
|
|
123
|
+
await sfuSubscriptionComplete;
|
|
142
124
|
|
|
143
125
|
// 6. Simulate receiving a packet
|
|
144
126
|
manager.packetReceived(
|
|
@@ -163,11 +145,11 @@ describe('DataTrackIncomingManager', () => {
|
|
|
163
145
|
|
|
164
146
|
it('should test data track subscribing with end to end encryption (ok case)', async () => {
|
|
165
147
|
const manager = new IncomingDataTrackManager({
|
|
166
|
-
|
|
148
|
+
e2eeManager: new PrefixingEncryptionProvider(),
|
|
167
149
|
});
|
|
168
150
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
169
151
|
'sfuUpdateSubscription',
|
|
170
|
-
'
|
|
152
|
+
'trackPublished',
|
|
171
153
|
]);
|
|
172
154
|
|
|
173
155
|
const senderIdentity = 'identity';
|
|
@@ -178,10 +160,11 @@ describe('DataTrackIncomingManager', () => {
|
|
|
178
160
|
await manager.receiveSfuPublicationUpdates(
|
|
179
161
|
new Map([[senderIdentity, [{ sid, pubHandle: handle, name: 'test', usesE2ee: true }]]]),
|
|
180
162
|
);
|
|
181
|
-
await managerEvents.waitFor('
|
|
163
|
+
await managerEvents.waitFor('trackPublished');
|
|
182
164
|
|
|
183
|
-
// 2.
|
|
184
|
-
const
|
|
165
|
+
// 2. Create a subscription readable stream
|
|
166
|
+
const [stream, sfuSubscriptionComplete] = manager.openSubscriptionStream(sid);
|
|
167
|
+
const reader = stream.getReader();
|
|
185
168
|
|
|
186
169
|
// 3. This subscribe request should be sent along to the SFU
|
|
187
170
|
const sfuUpdateSubscriptionEvent = await managerEvents.waitFor('sfuUpdateSubscription');
|
|
@@ -192,9 +175,8 @@ describe('DataTrackIncomingManager', () => {
|
|
|
192
175
|
// the subscription
|
|
193
176
|
manager.receivedSfuSubscriberHandles(new Map([[handle, sid]]));
|
|
194
177
|
|
|
195
|
-
// 5.
|
|
196
|
-
|
|
197
|
-
const reader = readableStream.getReader();
|
|
178
|
+
// 5. Wait for the subscription to be fully established
|
|
179
|
+
await sfuSubscriptionComplete;
|
|
198
180
|
|
|
199
181
|
// 6. Simulate receiving a (fake) encrypted packet
|
|
200
182
|
manager.packetReceived(
|
|
@@ -228,7 +210,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
228
210
|
const manager = new IncomingDataTrackManager();
|
|
229
211
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
230
212
|
'sfuUpdateSubscription',
|
|
231
|
-
'
|
|
213
|
+
'trackPublished',
|
|
232
214
|
]);
|
|
233
215
|
|
|
234
216
|
const senderIdentity = 'identity';
|
|
@@ -241,13 +223,14 @@ describe('DataTrackIncomingManager', () => {
|
|
|
241
223
|
await manager.receiveSfuPublicationUpdates(
|
|
242
224
|
new Map([[senderIdentity, [{ sid, pubHandle, name: 'test', usesE2ee: false }]]]),
|
|
243
225
|
);
|
|
244
|
-
await managerEvents.waitFor('
|
|
226
|
+
await managerEvents.waitFor('trackPublished');
|
|
245
227
|
|
|
246
228
|
// 2. Set up lots of subscribers
|
|
247
229
|
const readers: Array<ReadableStreamDefaultReader<DataTrackFrame>> = [];
|
|
248
230
|
for (let index = 0; index < 8; index += 1) {
|
|
249
|
-
//
|
|
250
|
-
const
|
|
231
|
+
// Create a subscription readable stream
|
|
232
|
+
const [stream, sfuSubscriptionComplete] = manager.openSubscriptionStream(sid);
|
|
233
|
+
readers.push(stream.getReader());
|
|
251
234
|
|
|
252
235
|
// Make sure that the sfu interactions ONLY happen for the first subscription opened.
|
|
253
236
|
if (index === 0) {
|
|
@@ -262,10 +245,8 @@ describe('DataTrackIncomingManager', () => {
|
|
|
262
245
|
);
|
|
263
246
|
}
|
|
264
247
|
|
|
265
|
-
// 5.
|
|
266
|
-
|
|
267
|
-
const reader = readableStream.getReader();
|
|
268
|
-
readers.push(reader);
|
|
248
|
+
// 5. Wait for the subscription to be fully established
|
|
249
|
+
await sfuSubscriptionComplete;
|
|
269
250
|
}
|
|
270
251
|
|
|
271
252
|
// 6. Simulate receiving a packet
|
|
@@ -302,7 +283,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
302
283
|
const manager = new IncomingDataTrackManager();
|
|
303
284
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
304
285
|
'sfuUpdateSubscription',
|
|
305
|
-
'
|
|
286
|
+
'trackPublished',
|
|
306
287
|
]);
|
|
307
288
|
|
|
308
289
|
const sid = 'data track sid';
|
|
@@ -316,7 +297,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
316
297
|
],
|
|
317
298
|
]),
|
|
318
299
|
);
|
|
319
|
-
await managerEvents.waitFor('
|
|
300
|
+
await managerEvents.waitFor('trackPublished');
|
|
320
301
|
|
|
321
302
|
// 2. Subscribe to a data track
|
|
322
303
|
const controller = new AbortController();
|
|
@@ -340,7 +321,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
340
321
|
const manager = new IncomingDataTrackManager();
|
|
341
322
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
342
323
|
'sfuUpdateSubscription',
|
|
343
|
-
'
|
|
324
|
+
'trackPublished',
|
|
344
325
|
]);
|
|
345
326
|
|
|
346
327
|
const sid = 'data track sid';
|
|
@@ -354,7 +335,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
354
335
|
],
|
|
355
336
|
]),
|
|
356
337
|
);
|
|
357
|
-
await managerEvents.waitFor('
|
|
338
|
+
await managerEvents.waitFor('trackPublished');
|
|
358
339
|
|
|
359
340
|
// 2. Subscribe to a data track twice
|
|
360
341
|
const controllerOne = new AbortController();
|
|
@@ -415,7 +396,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
415
396
|
const manager = new IncomingDataTrackManager();
|
|
416
397
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
417
398
|
'sfuUpdateSubscription',
|
|
418
|
-
'
|
|
399
|
+
'trackPublished',
|
|
419
400
|
]);
|
|
420
401
|
|
|
421
402
|
const sid = 'data track sid';
|
|
@@ -429,7 +410,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
429
410
|
],
|
|
430
411
|
]),
|
|
431
412
|
);
|
|
432
|
-
await managerEvents.waitFor('
|
|
413
|
+
await managerEvents.waitFor('trackPublished');
|
|
433
414
|
|
|
434
415
|
// 2. Create subscription A
|
|
435
416
|
const controllerA = new AbortController();
|
|
@@ -461,7 +442,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
461
442
|
const manager = new IncomingDataTrackManager();
|
|
462
443
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
463
444
|
'sfuUpdateSubscription',
|
|
464
|
-
'
|
|
445
|
+
'trackPublished',
|
|
465
446
|
]);
|
|
466
447
|
|
|
467
448
|
const senderIdentity = 'identity';
|
|
@@ -472,7 +453,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
472
453
|
await manager.receiveSfuPublicationUpdates(
|
|
473
454
|
new Map([[senderIdentity, [{ sid, pubHandle: handle, name: 'test', usesE2ee: false }]]]),
|
|
474
455
|
);
|
|
475
|
-
await managerEvents.waitFor('
|
|
456
|
+
await managerEvents.waitFor('trackPublished');
|
|
476
457
|
|
|
477
458
|
// 2. Begin subscribing to a data track
|
|
478
459
|
const promise = manager.subscribeRequest(sid);
|
|
@@ -490,7 +471,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
490
471
|
const manager = new IncomingDataTrackManager();
|
|
491
472
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
492
473
|
'sfuUpdateSubscription',
|
|
493
|
-
'
|
|
474
|
+
'trackPublished',
|
|
494
475
|
]);
|
|
495
476
|
|
|
496
477
|
const senderIdentity = 'identity';
|
|
@@ -501,17 +482,18 @@ describe('DataTrackIncomingManager', () => {
|
|
|
501
482
|
await manager.receiveSfuPublicationUpdates(
|
|
502
483
|
new Map([[senderIdentity, [{ sid, pubHandle: handle, name: 'test', usesE2ee: false }]]]),
|
|
503
484
|
);
|
|
504
|
-
await managerEvents.waitFor('
|
|
485
|
+
await managerEvents.waitFor('trackPublished');
|
|
505
486
|
|
|
506
487
|
// 2. Subscribe to a data track, and send the handle back as if the SFU acknowledged it
|
|
507
|
-
const
|
|
488
|
+
const [stream, sfuSubscriptionComplete] = manager.openSubscriptionStream(sid);
|
|
489
|
+
const reader = stream.getReader();
|
|
508
490
|
const sfuUpdateSubscriptionEvent = await managerEvents.waitFor('sfuUpdateSubscription');
|
|
509
491
|
expect(sfuUpdateSubscriptionEvent.sid).toStrictEqual(sid);
|
|
510
492
|
expect(sfuUpdateSubscriptionEvent.subscribe).toStrictEqual(true);
|
|
511
493
|
manager.receivedSfuSubscriberHandles(new Map([[handle, sid]]));
|
|
512
494
|
|
|
513
495
|
// 3. Start an active stream read for later
|
|
514
|
-
|
|
496
|
+
await sfuSubscriptionComplete;
|
|
515
497
|
|
|
516
498
|
// 4. Simulate the remote participant disconnecting
|
|
517
499
|
manager.handleRemoteParticipantDisconnected(senderIdentity);
|
|
@@ -529,7 +511,7 @@ describe('DataTrackIncomingManager', () => {
|
|
|
529
511
|
const manager = new IncomingDataTrackManager();
|
|
530
512
|
const managerEvents = subscribeToEvents<DataTrackIncomingManagerCallbacks>(manager, [
|
|
531
513
|
'sfuUpdateSubscription',
|
|
532
|
-
'
|
|
514
|
+
'trackPublished',
|
|
533
515
|
]);
|
|
534
516
|
|
|
535
517
|
const senderIdentity = 'identity';
|
|
@@ -540,10 +522,11 @@ describe('DataTrackIncomingManager', () => {
|
|
|
540
522
|
await manager.receiveSfuPublicationUpdates(
|
|
541
523
|
new Map([[senderIdentity, [{ sid, pubHandle: handle, name: 'test', usesE2ee: false }]]]),
|
|
542
524
|
);
|
|
543
|
-
await managerEvents.waitFor('
|
|
525
|
+
await managerEvents.waitFor('trackPublished');
|
|
544
526
|
|
|
545
|
-
// 2.
|
|
546
|
-
const
|
|
527
|
+
// 2. Create a subscription readable stream
|
|
528
|
+
const [stream, sfuSubscriptionComplete] = manager.openSubscriptionStream(sid);
|
|
529
|
+
const reader = stream.getReader();
|
|
547
530
|
|
|
548
531
|
// 3. This subscribe request should be sent along to the SFU
|
|
549
532
|
const sfuUpdateSubscriptionInitEvent = await managerEvents.waitFor('sfuUpdateSubscription');
|
|
@@ -554,9 +537,8 @@ describe('DataTrackIncomingManager', () => {
|
|
|
554
537
|
// the subscription
|
|
555
538
|
manager.receivedSfuSubscriberHandles(new Map([[handle, sid]]));
|
|
556
539
|
|
|
557
|
-
// 5.
|
|
558
|
-
|
|
559
|
-
const reader = readableStream.getReader();
|
|
540
|
+
// 5. Wait for the subscription to be fully established
|
|
541
|
+
await sfuSubscriptionComplete;
|
|
560
542
|
|
|
561
543
|
// 6. Manually cancel the readable stream
|
|
562
544
|
await reader.cancel();
|
|
@@ -565,6 +547,9 @@ describe('DataTrackIncomingManager', () => {
|
|
|
565
547
|
const sfuUpdateSubscriptionCancelEvent = await managerEvents.waitFor('sfuUpdateSubscription');
|
|
566
548
|
expect(sfuUpdateSubscriptionCancelEvent.sid).toStrictEqual(sid);
|
|
567
549
|
expect(sfuUpdateSubscriptionCancelEvent.subscribe).toStrictEqual(false);
|
|
550
|
+
|
|
551
|
+
// 8. Make sure the in flight stream is now complete
|
|
552
|
+
await expect(reader.read()).resolves.toStrictEqual({ value: undefined, done: true });
|
|
568
553
|
});
|
|
569
554
|
});
|
|
570
555
|
});
|