@observertc/observer-js 0.9.21-beta → 0.9.23-beta
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/.eslintrc.json +143 -0
- package/lib/Evaluator.d.ts.map +1 -1
- package/lib/Evaluator.js +54 -47
- package/lib/Observer.d.ts +1404 -38
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +479 -176
- package/lib/common/Semaphore.d.ts.map +1 -1
- package/lib/common/callMetaReports.d.ts.map +1 -1
- package/lib/common/callMetaReports.js +1 -0
- package/lib/common/logger.d.ts.map +1 -1
- package/lib/common/logger.js +15 -15
- package/lib/common/utils.d.ts +1 -0
- package/lib/common/utils.d.ts.map +1 -1
- package/lib/common/utils.js +12 -1
- package/lib/entries/CallEntry.d.ts +611 -0
- package/lib/entries/CallEntry.d.ts.map +1 -0
- package/lib/entries/CallEntry.js +75 -0
- package/lib/entries/ClientEntry.d.ts +474 -0
- package/lib/entries/ClientEntry.d.ts.map +1 -0
- package/lib/entries/ClientEntry.js +101 -0
- package/lib/entries/InboundTrackEntry.d.ts +670 -0
- package/lib/entries/InboundTrackEntry.d.ts.map +1 -0
- package/lib/entries/InboundTrackEntry.js +76 -0
- package/lib/entries/OutboundTrackEntry.d.ts +670 -0
- package/lib/entries/OutboundTrackEntry.d.ts.map +1 -0
- package/lib/entries/OutboundTrackEntry.js +73 -0
- package/lib/entries/PeerConnectionEntry.d.ts +469 -0
- package/lib/entries/PeerConnectionEntry.d.ts.map +1 -0
- package/lib/entries/PeerConnectionEntry.js +144 -0
- package/lib/entries/SfuEntry.d.ts +150 -0
- package/lib/entries/SfuEntry.d.ts.map +1 -0
- package/lib/entries/SfuEntry.js +77 -0
- package/lib/entries/SfuInboundRtpPadEntry.d.ts +14 -0
- package/lib/entries/SfuInboundRtpPadEntry.d.ts.map +1 -0
- package/lib/entries/SfuInboundRtpPadEntry.js +49 -0
- package/lib/entries/SfuOutboundRtpPadEntry.d.ts +14 -0
- package/lib/entries/SfuOutboundRtpPadEntry.d.ts.map +1 -0
- package/lib/entries/SfuOutboundRtpPadEntry.js +47 -0
- package/lib/entries/SfuSctpChannelEntry.d.ts +12 -0
- package/lib/entries/SfuSctpChannelEntry.d.ts.map +1 -0
- package/lib/entries/SfuSctpChannelEntry.js +43 -0
- package/lib/entries/SfuTransportEntry.d.ts +82 -0
- package/lib/entries/SfuTransportEntry.d.ts.map +1 -0
- package/lib/entries/SfuTransportEntry.js +122 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/middlewares/CallOperationsContext.d.ts.map +1 -1
- package/lib/middlewares/CallOperationsContext.js +2 -6
- package/lib/middlewares/CallProcessor.d.ts.map +1 -1
- package/lib/middlewares/CallProcessor.js +15 -6
- package/lib/middlewares/CommitTransactionMiddleware.d.ts.map +1 -1
- package/lib/middlewares/CommitTransactionMiddleware.js +22 -26
- package/lib/middlewares/DeleteOutdatedCallEntries.d.ts.map +1 -1
- package/lib/middlewares/DeleteOutdatedCallEntries.js +29 -20
- package/lib/middlewares/DeleteOutdatedSfuEntries.d.ts.map +1 -1
- package/lib/middlewares/DeleteOutdatedSfuEntries.js +27 -18
- package/lib/middlewares/Middleware.d.ts.map +1 -1
- package/lib/middlewares/Middleware.js +13 -4
- package/lib/middlewares/Processor.d.ts.map +1 -1
- package/lib/middlewares/Processor.js +18 -9
- package/lib/middlewares/TransactionContext.d.ts.map +1 -1
- package/lib/middlewares/TransactionContext.js +84 -73
- package/lib/middlewares/VisitObservedCallsMiddleware.d.ts.map +1 -1
- package/lib/middlewares/VisitObservedCallsMiddleware.js +16 -7
- package/lib/middlewares/VisitObservedSfusMiddleware.d.ts.map +1 -1
- package/lib/middlewares/VisitObservedSfusMiddleware.js +15 -6
- package/lib/middlewares/visitors/visitClient.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitClient.js +6 -18
- package/lib/middlewares/visitors/visitInboundAudioTrack.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitInboundAudioTrack.js +17 -20
- package/lib/middlewares/visitors/visitInboundVideoTrack.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitInboundVideoTrack.js +16 -21
- package/lib/middlewares/visitors/visitOutboundAudioTrack.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitOutboundAudioTrack.js +16 -16
- package/lib/middlewares/visitors/visitOutboundVideoTarck.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitOutboundVideoTarck.js +16 -17
- package/lib/middlewares/visitors/visitPeerConnection.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitPeerConnection.js +24 -40
- package/lib/middlewares/visitors/visitSfu.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitSfu.js +6 -7
- package/lib/middlewares/visitors/visitSfuInboundRtpPad.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitSfuInboundRtpPad.js +3 -7
- package/lib/middlewares/visitors/visitSfuOutboundRtpPad.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitSfuOutboundRtpPad.js +3 -8
- package/lib/middlewares/visitors/visitSfuSctpChannel.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitSfuSctpChannel.js +3 -6
- package/lib/middlewares/visitors/visitSfuTransport.d.ts.map +1 -1
- package/lib/middlewares/visitors/visitSfuTransport.js +3 -6
- package/lib/processes/closePeerConnectionProcess.d.ts.map +1 -1
- package/lib/processes/closePeerConnectionProcess.js +14 -5
- package/lib/processes/detachClientProcess.d.ts.map +1 -1
- package/lib/processes/detachClientProcess.js +20 -17
- package/lib/processes/findRemoteMatches.d.ts +2 -2
- package/lib/processes/findRemoteMatches.d.ts.map +1 -1
- package/lib/processes/findRemoteMatches.js +70 -56
- package/lib/processes/inboundTrackRemoved.d.ts.map +1 -1
- package/lib/processes/inboundTrackRemoved.js +12 -3
- package/lib/processes/joinClientProcess.d.ts.map +1 -1
- package/lib/processes/joinClientProcess.js +15 -6
- package/lib/processes/outboundTrackRemoved.d.ts.map +1 -1
- package/lib/processes/outboundTrackRemoved.js +12 -3
- package/lib/samples/ObservedCall.d.ts.map +1 -1
- package/lib/samples/ObservedCall.js +1 -5
- package/lib/samples/ObservedCalls.d.ts.map +1 -1
- package/lib/samples/ObservedClient.d.ts.map +1 -1
- package/lib/samples/ObservedClient.js +1 -9
- package/lib/samples/ObservedInboundAudioTrack.d.ts.map +1 -1
- package/lib/samples/ObservedInboundAudioTrack.js +1 -5
- package/lib/samples/ObservedInboundVideoTrack.d.ts.map +1 -1
- package/lib/samples/ObservedInboundVideoTrack.js +1 -5
- package/lib/samples/ObservedOutboundAudioTrack.d.ts.map +1 -1
- package/lib/samples/ObservedOutboundAudioTrack.js +1 -5
- package/lib/samples/ObservedOutboundVideoTrack.d.ts.map +1 -1
- package/lib/samples/ObservedOutboundVideoTrack.js +1 -5
- package/lib/samples/ObservedPeerConnection.d.ts.map +1 -1
- package/lib/samples/ObservedPeerConnection.js +1 -12
- package/lib/samples/ObservedSfu.d.ts.map +1 -1
- package/lib/samples/ObservedSfu.js +1 -8
- package/lib/samples/ObservedSfuInboundRtpPad.d.ts.map +1 -1
- package/lib/samples/ObservedSfuInboundRtpPad.js +1 -5
- package/lib/samples/ObservedSfuOutboundRtpPad.d.ts.map +1 -1
- package/lib/samples/ObservedSfuOutboundRtpPad.js +1 -5
- package/lib/samples/ObservedSfuSctpChannel.d.ts.map +1 -1
- package/lib/samples/ObservedSfuSctpChannel.js +1 -5
- package/lib/samples/ObservedSfuTransport.d.ts.map +1 -1
- package/lib/samples/ObservedSfuTransport.js +1 -8
- package/lib/samples/ObservedSfus.d.ts.map +1 -1
- package/lib/sinks/ObserverSink.d.ts.map +1 -1
- package/lib/sinks/ObserverSink.js +42 -31
- package/lib/sinks/callEventReports.js +1 -0
- package/lib/sources/ObservedCallSource.d.ts +6 -3
- package/lib/sources/ObservedCallSource.d.ts.map +1 -1
- package/lib/sources/ObservedClientSource.d.ts +3 -2
- package/lib/sources/ObservedClientSource.d.ts.map +1 -1
- package/lib/sources/ObservedSfuSource.d.ts +3 -2
- package/lib/sources/ObservedSfuSource.d.ts.map +1 -1
- package/lib/sources/Sources.d.ts +8 -4
- package/lib/sources/Sources.d.ts.map +1 -1
- package/lib/sources/Sources.js +83 -46
- package/lib/storages/ObserverStorage.d.ts.map +1 -1
- package/lib/storages/SimpleStorage.d.ts.map +1 -1
- package/lib/storages/SimpleStorage.js +40 -23
- package/package.json +1 -1
- package/src/Evaluator.ts +17 -9
- package/src/Observer.ts +230 -170
- package/src/common/Semaphore.ts +2 -0
- package/src/common/callMetaReports.ts +30 -28
- package/src/common/logger.ts +140 -132
- package/src/common/types.ts +1 -1
- package/src/common/utils.ts +12 -1
- package/src/entries/CallEntry.ts +62 -0
- package/src/entries/ClientEntry.ts +90 -0
- package/src/entries/InboundTrackEntry.ts +74 -0
- package/src/entries/OutboundTrackEntry.ts +72 -0
- package/src/entries/PeerConnectionEntry.ts +133 -0
- package/src/entries/SfuEntry.ts +62 -0
- package/src/entries/SfuInboundRtpPadEntry.ts +46 -0
- package/src/entries/SfuOutboundRtpPadEntry.ts +44 -0
- package/src/entries/SfuSctpChannelEntry.ts +39 -0
- package/src/entries/SfuTransportEntry.ts +109 -0
- package/src/index.ts +11 -0
- package/src/middlewares/CallOperationsContext.ts +9 -5
- package/src/middlewares/CallProcessor.ts +4 -2
- package/src/middlewares/CommitTransactionMiddleware.ts +8 -5
- package/src/middlewares/DeleteOutdatedCallEntries.ts +24 -16
- package/src/middlewares/DeleteOutdatedSfuEntries.ts +24 -15
- package/src/middlewares/Middleware.ts +1 -0
- package/src/middlewares/Processor.ts +10 -5
- package/src/middlewares/TransactionContext.ts +1 -2
- package/src/middlewares/VisitObservedCallsMiddleware.ts +5 -2
- package/src/middlewares/VisitObservedSfusMiddleware.ts +8 -7
- package/src/middlewares/visitors/visitClient.ts +15 -1
- package/src/middlewares/visitors/visitInboundAudioTrack.ts +4 -1
- package/src/middlewares/visitors/visitInboundVideoTrack.ts +5 -1
- package/src/middlewares/visitors/visitOutboundAudioTrack.ts +5 -1
- package/src/middlewares/visitors/visitOutboundVideoTarck.ts +5 -1
- package/src/middlewares/visitors/visitPeerConnection.ts +15 -2
- package/src/middlewares/visitors/visitSfu.ts +7 -1
- package/src/middlewares/visitors/visitSfuInboundRtpPad.ts +4 -2
- package/src/middlewares/visitors/visitSfuOutboundRtpPad.ts +3 -1
- package/src/middlewares/visitors/visitSfuSctpChannel.ts +23 -21
- package/src/middlewares/visitors/visitSfuTransport.ts +3 -1
- package/src/processes/closePeerConnectionProcess.ts +3 -0
- package/src/processes/detachClientProcess.ts +13 -4
- package/src/processes/findRemoteMatches.ts +32 -21
- package/src/processes/inboundTrackRemoved.ts +2 -0
- package/src/processes/joinClientProcess.ts +8 -2
- package/src/processes/outboundTrackRemoved.ts +2 -0
- package/src/samples/ObservedCall.ts +6 -0
- package/src/samples/ObservedCalls.ts +13 -7
- package/src/samples/ObservedClient.ts +24 -8
- package/src/samples/ObservedInboundAudioTrack.ts +3 -2
- package/src/samples/ObservedInboundVideoTrack.ts +3 -2
- package/src/samples/ObservedOutboundAudioTrack.ts +3 -2
- package/src/samples/ObservedOutboundVideoTrack.ts +3 -2
- package/src/samples/ObservedPeerConnection.ts +27 -11
- package/src/samples/ObservedSfu.ts +17 -10
- package/src/samples/ObservedSfuInboundRtpPad.ts +5 -4
- package/src/samples/ObservedSfuOutboundRtpPad.ts +5 -4
- package/src/samples/ObservedSfuSctpChannel.ts +13 -13
- package/src/samples/ObservedSfuTransport.ts +19 -7
- package/src/samples/ObservedSfus.ts +10 -5
- package/src/sinks/ObserverSink.ts +51 -44
- package/src/sinks/callEventReports.ts +1 -1
- package/src/sources/ObservedCallSource.ts +9 -6
- package/src/sources/ObservedClientSource.ts +3 -2
- package/src/sources/ObservedSfuSource.ts +4 -8
- package/src/sources/Sources.ts +107 -22
- package/src/storages/ObserverStorage.ts +1 -0
- package/src/storages/SimpleStorage.ts +44 -21
- package/tsconfig.json +7 -5
- package/.eslintrc.js +0 -27
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createLogger } from '../common/logger';
|
|
2
|
+
import * as Models from '../models/Models';
|
|
3
|
+
import { StorageProvider } from '../storages/StorageProvider';
|
|
4
|
+
import { createCallEntry } from './CallEntry';
|
|
5
|
+
import { createClientEntry } from './ClientEntry';
|
|
6
|
+
import { createPeerConnectionEntry } from './PeerConnectionEntry';
|
|
7
|
+
|
|
8
|
+
const logger = createLogger('OutboundTrackWrapper');
|
|
9
|
+
|
|
10
|
+
export type OutboundTrackEntry = ReturnType<typeof createOutboundTrackEntry>;
|
|
11
|
+
|
|
12
|
+
export function createOutboundTrackEntry(storageProvider: StorageProvider, model?: Models.OutboundTrack) {
|
|
13
|
+
if (!model) return;
|
|
14
|
+
const {
|
|
15
|
+
callId,
|
|
16
|
+
clientId,
|
|
17
|
+
peerConnectionId,
|
|
18
|
+
trackId,
|
|
19
|
+
kind,
|
|
20
|
+
} = model;
|
|
21
|
+
|
|
22
|
+
if (!callId) return logger.warn(`OutboundTrack model without callId: ${JSON.stringify(model)}`);
|
|
23
|
+
if (!clientId) return logger.warn(`OutboundTrack model without clientId: ${JSON.stringify(model)}`);
|
|
24
|
+
if (!peerConnectionId) return logger.warn(`OutboundTrack model without peerConnectionId: ${JSON.stringify(model)}`);
|
|
25
|
+
if (!trackId) return logger.warn(`OutboundTrack model without trackId: ${JSON.stringify(model)}`);
|
|
26
|
+
if (!kind) return logger.warn(`OutboundTrack model without kind: ${JSON.stringify(model)}`);
|
|
27
|
+
|
|
28
|
+
const direction = 'outbound' as const;
|
|
29
|
+
const getCall = async () => {
|
|
30
|
+
return createCallEntry(storageProvider, await storageProvider.callStorage.get(callId));
|
|
31
|
+
};
|
|
32
|
+
const getClient = async () => {
|
|
33
|
+
return createClientEntry(storageProvider, await storageProvider.clientStorage.get(clientId));
|
|
34
|
+
};
|
|
35
|
+
const getPeerConnection = async () => {
|
|
36
|
+
return createPeerConnectionEntry(storageProvider, await storageProvider.peerConnectionStorage.get(peerConnectionId));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
callId,
|
|
41
|
+
clientId,
|
|
42
|
+
peerConnectionId,
|
|
43
|
+
trackId,
|
|
44
|
+
direction,
|
|
45
|
+
get kind(): 'audio' | 'video' {
|
|
46
|
+
return kind.toLocaleLowerCase() as 'audio' | 'video';
|
|
47
|
+
},
|
|
48
|
+
get stats() {
|
|
49
|
+
return 0 < model.audioStats.length ? model.audioStats : 0 < model.videoStats.length ? model.videoStats : undefined;
|
|
50
|
+
},
|
|
51
|
+
get marker() {
|
|
52
|
+
return model.marker;
|
|
53
|
+
},
|
|
54
|
+
get ssrc() {
|
|
55
|
+
return model.ssrc;
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
getCall,
|
|
59
|
+
getClient,
|
|
60
|
+
getPeerConnection,
|
|
61
|
+
|
|
62
|
+
refresh: async () => {
|
|
63
|
+
const refreshedModel = await storageProvider.outboundTrackStorage.get(trackId);
|
|
64
|
+
|
|
65
|
+
if (!refreshedModel) return;
|
|
66
|
+
|
|
67
|
+
model.audioStats = refreshedModel.audioStats;
|
|
68
|
+
model.videoStats = refreshedModel.videoStats;
|
|
69
|
+
model.marker = refreshedModel.marker;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import * as Models from '../models/Models';
|
|
2
|
+
import { StorageProvider } from '../storages/StorageProvider';
|
|
3
|
+
import { logger, createCallEntry } from './CallEntry';
|
|
4
|
+
import { asyncIteratorConverter } from '../common/utils';
|
|
5
|
+
import { createClientEntry } from './ClientEntry';
|
|
6
|
+
import { InboundTrackEntry, createInboundTrackEntry } from './InboundTrackEntry';
|
|
7
|
+
import { OutboundTrackEntry, createOutboundTrackEntry } from './OutboundTrackEntry';
|
|
8
|
+
|
|
9
|
+
export type PeerConnectionEntry = ReturnType<typeof createPeerConnectionEntry>;
|
|
10
|
+
|
|
11
|
+
export function createPeerConnectionEntry(storageProvider: StorageProvider, model?: Models.PeerConnection) {
|
|
12
|
+
if (!model) return;
|
|
13
|
+
|
|
14
|
+
const {
|
|
15
|
+
callId,
|
|
16
|
+
clientId,
|
|
17
|
+
peerConnectionId,
|
|
18
|
+
label,
|
|
19
|
+
mediaUnitId,
|
|
20
|
+
opened,
|
|
21
|
+
serviceId,
|
|
22
|
+
roomId,
|
|
23
|
+
userId,
|
|
24
|
+
marker
|
|
25
|
+
} = model;
|
|
26
|
+
|
|
27
|
+
if (!peerConnectionId) return logger.warn(`PeerConnection model without peerConnectionId: ${JSON.stringify(model)}`);
|
|
28
|
+
if (!callId) return logger.warn(`PeerConnection model without callId: ${JSON.stringify(model)}`);
|
|
29
|
+
if (!clientId) return logger.warn(`PeerConnection model without clientId: ${JSON.stringify(model)}`);
|
|
30
|
+
|
|
31
|
+
const getClient = async () => {
|
|
32
|
+
return createClientEntry(storageProvider, await storageProvider.clientStorage.get(clientId));
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const getCall = async () => {
|
|
36
|
+
return createCallEntry(storageProvider, await storageProvider.callStorage.get(callId));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const asyncInboundTrackGenerator = async function *(providedInboundTrackIds?: string[], kind?: string) {
|
|
40
|
+
const inboundTrackModels = await Promise.all(
|
|
41
|
+
(providedInboundTrackIds ?? model.inboundTrackIds).map((inboundTrackId) => storageProvider.inboundTrackStorage.get(inboundTrackId))
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
for (const inboundTrackModel of inboundTrackModels) {
|
|
45
|
+
if (!inboundTrackModel) continue;
|
|
46
|
+
if (kind && inboundTrackModel.kind !== kind) continue;
|
|
47
|
+
yield createInboundTrackEntry(storageProvider, inboundTrackModel);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const asyncOutboundTrackGenerator = async function *(providedOutboundTrackIds?: string[], kind?: string) {
|
|
51
|
+
const outboundTrackModels = await Promise.all(
|
|
52
|
+
(providedOutboundTrackIds ?? model.outboundTrackIds).map((outboundTrackId) => storageProvider.outboundTrackStorage.get(outboundTrackId))
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
for (const outboundTrackModel of outboundTrackModels) {
|
|
56
|
+
if (!outboundTrackModel) continue;
|
|
57
|
+
if (kind && outboundTrackModel.kind !== kind) continue;
|
|
58
|
+
yield createOutboundTrackEntry(storageProvider, outboundTrackModel);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
callId,
|
|
64
|
+
clientId,
|
|
65
|
+
peerConnectionId,
|
|
66
|
+
marker,
|
|
67
|
+
label,
|
|
68
|
+
mediaUnitId,
|
|
69
|
+
opened,
|
|
70
|
+
serviceId,
|
|
71
|
+
roomId,
|
|
72
|
+
userId,
|
|
73
|
+
|
|
74
|
+
getClient,
|
|
75
|
+
getCall,
|
|
76
|
+
|
|
77
|
+
get iceCandidatePairs() {
|
|
78
|
+
return model.iceCandidatePairs;
|
|
79
|
+
},
|
|
80
|
+
get iceRemoteCandidates() {
|
|
81
|
+
return model.iceRemoteCandidates;
|
|
82
|
+
},
|
|
83
|
+
get iceLocalCandidates() {
|
|
84
|
+
return model.icelocalCandidates;
|
|
85
|
+
},
|
|
86
|
+
get transports() {
|
|
87
|
+
return model.transports;
|
|
88
|
+
},
|
|
89
|
+
get inboundTrackIds(): ReadonlyArray<string> {
|
|
90
|
+
return model.inboundTrackIds;
|
|
91
|
+
},
|
|
92
|
+
get outboundTrackIds(): ReadonlyArray<string> {
|
|
93
|
+
return model.outboundTrackIds;
|
|
94
|
+
},
|
|
95
|
+
get inboundTracks(): AsyncIterableIterator<InboundTrackEntry> {
|
|
96
|
+
return asyncIteratorConverter<InboundTrackEntry>(asyncInboundTrackGenerator());
|
|
97
|
+
},
|
|
98
|
+
get outboundTracks(): AsyncIterableIterator<OutboundTrackEntry> {
|
|
99
|
+
return asyncIteratorConverter<OutboundTrackEntry>(asyncOutboundTrackGenerator());
|
|
100
|
+
},
|
|
101
|
+
get inboundAudioTracks(): AsyncIterableIterator<InboundTrackEntry> {
|
|
102
|
+
return asyncIteratorConverter<InboundTrackEntry>(asyncInboundTrackGenerator(undefined, 'audio'));
|
|
103
|
+
},
|
|
104
|
+
get outboundAudioTracks(): AsyncIterableIterator<OutboundTrackEntry> {
|
|
105
|
+
return asyncIteratorConverter<OutboundTrackEntry>(asyncOutboundTrackGenerator(undefined, 'audio'));
|
|
106
|
+
},
|
|
107
|
+
get inboundVideoTracks(): AsyncIterableIterator<InboundTrackEntry> {
|
|
108
|
+
return asyncIteratorConverter<InboundTrackEntry>(asyncInboundTrackGenerator(undefined, 'video'));
|
|
109
|
+
},
|
|
110
|
+
get outboundVideoTracks(): AsyncIterableIterator<OutboundTrackEntry> {
|
|
111
|
+
return asyncIteratorConverter<OutboundTrackEntry>(asyncOutboundTrackGenerator(undefined, 'video'));
|
|
112
|
+
},
|
|
113
|
+
async getInboundTrack(inboundTrackId: string) {
|
|
114
|
+
return model.inboundTrackIds.includes(inboundTrackId) ? createInboundTrackEntry(storageProvider, await storageProvider.inboundTrackStorage.get(inboundTrackId)) : undefined;
|
|
115
|
+
},
|
|
116
|
+
async getOutboundTrack(outboundTrackId: string) {
|
|
117
|
+
return model.outboundTrackIds.includes(outboundTrackId) ? createOutboundTrackEntry(storageProvider, await storageProvider.outboundTrackStorage.get(outboundTrackId)) : undefined;
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
async refresh() {
|
|
121
|
+
const refreshedModel = await storageProvider.peerConnectionStorage.get(peerConnectionId);
|
|
122
|
+
|
|
123
|
+
if (!refreshedModel) return;
|
|
124
|
+
|
|
125
|
+
model.iceCandidatePairs = refreshedModel.iceCandidatePairs;
|
|
126
|
+
model.iceRemoteCandidates = refreshedModel.iceRemoteCandidates;
|
|
127
|
+
model.icelocalCandidates = refreshedModel.icelocalCandidates;
|
|
128
|
+
model.transports = refreshedModel.transports;
|
|
129
|
+
model.inboundTrackIds = refreshedModel.inboundTrackIds;
|
|
130
|
+
model.outboundTrackIds = refreshedModel.outboundTrackIds;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as Models from '../models/Models';
|
|
2
|
+
import { StorageProvider } from '../storages/StorageProvider';
|
|
3
|
+
import { createLogger } from '../common/logger';
|
|
4
|
+
import { SfuTransportEntry, createSfuTransportEntry } from './SfuTransportEntry';
|
|
5
|
+
import { asyncIteratorConverter } from '../common/utils';
|
|
6
|
+
|
|
7
|
+
export const logger = createLogger('CallWrapper');
|
|
8
|
+
|
|
9
|
+
export type SfuEntry = ReturnType<typeof createSfuEntry>;
|
|
10
|
+
|
|
11
|
+
export function createSfuEntry(storageProvider: StorageProvider, model?: Models.Sfu) {
|
|
12
|
+
if (!model) return;
|
|
13
|
+
const {
|
|
14
|
+
sfuId,
|
|
15
|
+
serviceId,
|
|
16
|
+
mediaUnitId,
|
|
17
|
+
joined,
|
|
18
|
+
} = model;
|
|
19
|
+
|
|
20
|
+
if (!sfuId) return logger.warn(`Sfu model without sfuId: ${JSON.stringify(model)}`);
|
|
21
|
+
if (!serviceId) return logger.warn(`Sfu model without serviceId: ${JSON.stringify(model)}`);
|
|
22
|
+
if (!mediaUnitId) return logger.warn(`Sfu model without mediaUnitId: ${JSON.stringify(model)}`);
|
|
23
|
+
if (!joined) return logger.warn(`Sfu model without joined: ${JSON.stringify(model)}`);
|
|
24
|
+
|
|
25
|
+
const getSfuTransport = async (sfuTransportId: string) => {
|
|
26
|
+
return createSfuTransportEntry(storageProvider, await storageProvider.sfuTransportStorage.get(sfuTransportId));
|
|
27
|
+
};
|
|
28
|
+
const asyncSfuTransportGenerator = async function *() {
|
|
29
|
+
const sfuTransportModels = await Promise.all(
|
|
30
|
+
model.sfuTransportIds.map((sfuTransportId) => storageProvider.sfuTransportStorage.get(sfuTransportId))
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
for (const sfuTransportModel of sfuTransportModels) {
|
|
34
|
+
if (!sfuTransportModel) continue;
|
|
35
|
+
yield createSfuTransportEntry(storageProvider, sfuTransportModel);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
sfuId,
|
|
41
|
+
serviceId,
|
|
42
|
+
mediaUnitId,
|
|
43
|
+
joined,
|
|
44
|
+
get marker() {
|
|
45
|
+
return model.marker;
|
|
46
|
+
},
|
|
47
|
+
get sfuTransportIds(): ReadonlyArray<string> {
|
|
48
|
+
return model.sfuTransportIds;
|
|
49
|
+
},
|
|
50
|
+
get sfuTransports(): AsyncIterableIterator<SfuTransportEntry> {
|
|
51
|
+
return asyncIteratorConverter<SfuTransportEntry>(asyncSfuTransportGenerator());
|
|
52
|
+
},
|
|
53
|
+
getSfuTransport,
|
|
54
|
+
refresh: async () => {
|
|
55
|
+
const refreshedModel = await storageProvider.sfuStorage.get(sfuId);
|
|
56
|
+
|
|
57
|
+
if (!refreshedModel) return;
|
|
58
|
+
|
|
59
|
+
model.marker = refreshedModel.marker;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as Models from '../models/Models';
|
|
2
|
+
import { StorageProvider } from '../storages/StorageProvider';
|
|
3
|
+
import { logger } from './SfuEntry';
|
|
4
|
+
|
|
5
|
+
export type SfuInboundRtpPadEntry = ReturnType<typeof createSfuInboundRtpPadEntry>;
|
|
6
|
+
|
|
7
|
+
export function createSfuInboundRtpPadEntry(storageProvider: StorageProvider, model?: Models.SfuInboundRtpPad) {
|
|
8
|
+
if (!model) return;
|
|
9
|
+
const {
|
|
10
|
+
sfuId,
|
|
11
|
+
sfuTransportId,
|
|
12
|
+
added,
|
|
13
|
+
internal,
|
|
14
|
+
rtpPadId,
|
|
15
|
+
mediaUnitId,
|
|
16
|
+
} = model;
|
|
17
|
+
|
|
18
|
+
if (!sfuId) return logger.warn(`SfuInboundRtpPad model without sfuId: ${JSON.stringify(model)}`);
|
|
19
|
+
if (!sfuTransportId) return logger.warn(`SfuInboundRtpPad model without sfuTransportId: ${JSON.stringify(model)}`);
|
|
20
|
+
if (!added) return logger.warn(`SfuInboundRtpPad model without added: ${JSON.stringify(model)}`);
|
|
21
|
+
if (!rtpPadId) return logger.warn(`SfuInboundRtpPad model without rtpPadId: ${JSON.stringify(model)}`);
|
|
22
|
+
if (!mediaUnitId) return logger.warn(`SfuInboundRtpPad model without mediaUnitId: ${JSON.stringify(model)}`);
|
|
23
|
+
|
|
24
|
+
const direction = 'inbound' as const;
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
sfuId,
|
|
28
|
+
sfuTransportId,
|
|
29
|
+
rtpPadId,
|
|
30
|
+
direction,
|
|
31
|
+
added,
|
|
32
|
+
get internal() {
|
|
33
|
+
return internal === true;
|
|
34
|
+
},
|
|
35
|
+
get marker() {
|
|
36
|
+
return model.marker;
|
|
37
|
+
},
|
|
38
|
+
refresh: async () => {
|
|
39
|
+
const refreshedModel = await storageProvider.sfuInboundRtpPadStorage.get(sfuTransportId);
|
|
40
|
+
|
|
41
|
+
if (!refreshedModel) return;
|
|
42
|
+
|
|
43
|
+
model.marker = refreshedModel.marker;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as Models from '../models/Models';
|
|
2
|
+
import { StorageProvider } from '../storages/StorageProvider';
|
|
3
|
+
import { logger } from './SfuEntry';
|
|
4
|
+
|
|
5
|
+
export type SfuOutboundRtpPadEntry = ReturnType<typeof createSfuOutboundRtpPadEntry>;
|
|
6
|
+
|
|
7
|
+
export function createSfuOutboundRtpPadEntry(storageProvider: StorageProvider, model?: Models.SfuOutboundRtpPad) {
|
|
8
|
+
if (!model) return;
|
|
9
|
+
const {
|
|
10
|
+
sfuId,
|
|
11
|
+
sfuTransportId,
|
|
12
|
+
rtpPadId,
|
|
13
|
+
added,
|
|
14
|
+
internal,
|
|
15
|
+
} = model;
|
|
16
|
+
|
|
17
|
+
if (!sfuId) return logger.warn(`SfuTransport model without sfuId: ${JSON.stringify(model)}`);
|
|
18
|
+
if (!sfuTransportId) return logger.warn(`SfuTransport model without sfuTransportId: ${JSON.stringify(model)}`);
|
|
19
|
+
if (!rtpPadId) return logger.warn(`SfuTransport model without rtpPadId: ${JSON.stringify(model)}`);
|
|
20
|
+
if (!added) return logger.warn(`SfuTransport model without added: ${JSON.stringify(model)}`);
|
|
21
|
+
|
|
22
|
+
const direction = 'outbound' as const;
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
sfuTransportId,
|
|
26
|
+
sfuId,
|
|
27
|
+
rtpPadId,
|
|
28
|
+
added,
|
|
29
|
+
direction,
|
|
30
|
+
get internal() {
|
|
31
|
+
return internal === true;
|
|
32
|
+
},
|
|
33
|
+
get marker() {
|
|
34
|
+
return model.marker;
|
|
35
|
+
},
|
|
36
|
+
refresh: async () => {
|
|
37
|
+
const refreshedModel = await storageProvider.sfuTransportStorage.get(sfuTransportId);
|
|
38
|
+
|
|
39
|
+
if (!refreshedModel) return;
|
|
40
|
+
|
|
41
|
+
model.marker = refreshedModel.marker;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as Models from '../models/Models';
|
|
2
|
+
import { StorageProvider } from '../storages/StorageProvider';
|
|
3
|
+
import { logger } from './SfuEntry';
|
|
4
|
+
|
|
5
|
+
export type SfuSctpChannelEntry = ReturnType<typeof createSfuSctpChannelEntry>;
|
|
6
|
+
|
|
7
|
+
export function createSfuSctpChannelEntry(storageProvider: StorageProvider, model?: Models.SfuSctpChannel) {
|
|
8
|
+
if (!model) return;
|
|
9
|
+
const {
|
|
10
|
+
sfuId,
|
|
11
|
+
sfuTransportId,
|
|
12
|
+
sfuSctpChannelId,
|
|
13
|
+
opened,
|
|
14
|
+
} = model;
|
|
15
|
+
|
|
16
|
+
model.sfuTransportId;
|
|
17
|
+
|
|
18
|
+
if (!sfuId) return logger.warn(`SfuSctpChannel model without sfuId: ${JSON.stringify(model)}`);
|
|
19
|
+
if (!sfuTransportId) return logger.warn(`SfuSctpChannel model without sfuTransportId: ${JSON.stringify(model)}`);
|
|
20
|
+
if (!sfuSctpChannelId) return logger.warn(`SfuSctpChannel model without sfuSctpChannelId: ${JSON.stringify(model)}`);
|
|
21
|
+
if (!opened) return logger.warn(`SfuSctpChannel model without opened: ${JSON.stringify(model)}`);
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
sfuId,
|
|
25
|
+
sfuTransportId,
|
|
26
|
+
sfuSctpChannelId,
|
|
27
|
+
opened,
|
|
28
|
+
get marker() {
|
|
29
|
+
return model.marker;
|
|
30
|
+
},
|
|
31
|
+
refresh: async () => {
|
|
32
|
+
const refreshedModel = await storageProvider.sfuSctpChannelStorage.get(sfuSctpChannelId);
|
|
33
|
+
|
|
34
|
+
if (!refreshedModel) return;
|
|
35
|
+
|
|
36
|
+
model.marker = refreshedModel.marker;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { asyncIteratorConverter } from '../common/utils';
|
|
2
|
+
import * as Models from '../models/Models';
|
|
3
|
+
import { StorageProvider } from '../storages/StorageProvider';
|
|
4
|
+
import { createSfuEntry, logger } from './SfuEntry';
|
|
5
|
+
import { createSfuInboundRtpPadEntry } from './SfuInboundRtpPadEntry';
|
|
6
|
+
import { createSfuOutboundRtpPadEntry } from './SfuOutboundRtpPadEntry';
|
|
7
|
+
import { createSfuSctpChannelEntry } from './SfuSctpChannelEntry';
|
|
8
|
+
|
|
9
|
+
export type SfuTransportEntry = ReturnType<typeof createSfuTransportEntry>;
|
|
10
|
+
|
|
11
|
+
export function createSfuTransportEntry(storageProvider: StorageProvider, model?: Models.SfuTransport) {
|
|
12
|
+
if (!model) return;
|
|
13
|
+
const {
|
|
14
|
+
sfuId,
|
|
15
|
+
transportId: sfuTransportId,
|
|
16
|
+
opened,
|
|
17
|
+
internal,
|
|
18
|
+
} = model;
|
|
19
|
+
|
|
20
|
+
if (!sfuId) return logger.warn(`SfuTransport model without sfuId: ${JSON.stringify(model)}`);
|
|
21
|
+
if (!sfuTransportId) return logger.warn(`SfuTransport model without sfuTransportId: ${JSON.stringify(model)}`);
|
|
22
|
+
if (!opened) return logger.warn(`SfuTransport model without opened: ${JSON.stringify(model)}`);
|
|
23
|
+
|
|
24
|
+
const getSfu = async () => {
|
|
25
|
+
return createSfuEntry(storageProvider, await storageProvider.sfuStorage.get(sfuId));
|
|
26
|
+
};
|
|
27
|
+
const getSfuInboundRtpPad = async (sfuInboundRtpPadId: string) => {
|
|
28
|
+
return createSfuInboundRtpPadEntry(storageProvider, await storageProvider.sfuInboundRtpPadStorage.get(sfuInboundRtpPadId));
|
|
29
|
+
};
|
|
30
|
+
const getSfuOutboundRtpPad = async (sfuOutboundRtpPadId: string) => {
|
|
31
|
+
return createSfuOutboundRtpPadEntry(storageProvider, await storageProvider.sfuOutboundRtpPadStorage.get(sfuOutboundRtpPadId));
|
|
32
|
+
};
|
|
33
|
+
const getSfuSctpChannel = async (sfuSctpChannelId: string) => {
|
|
34
|
+
return createSfuSctpChannelEntry(storageProvider, await storageProvider.sfuSctpChannelStorage.get(sfuSctpChannelId));
|
|
35
|
+
};
|
|
36
|
+
const asyncSfuInboundRtpPadGenerator = async function *() {
|
|
37
|
+
const sfuInboundRtpPadModels = await Promise.all(
|
|
38
|
+
model.inboundRtpPadIds.map((sfuInboundRtpPadId) => storageProvider.sfuInboundRtpPadStorage.get(sfuInboundRtpPadId))
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
for (const sfuInboundRtpPadModel of sfuInboundRtpPadModels) {
|
|
42
|
+
if (!sfuInboundRtpPadModel) continue;
|
|
43
|
+
yield createSfuInboundRtpPadEntry(storageProvider, sfuInboundRtpPadModel);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const asyncSfuOutboundRtpPadGenerator = async function *() {
|
|
48
|
+
const sfuOutboundRtpPadModels = await Promise.all(
|
|
49
|
+
model.outboundRtpPadIds.map((sfuOutboundRtpPadId) => storageProvider.sfuOutboundRtpPadStorage.get(sfuOutboundRtpPadId))
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
for (const sfuOutboundRtpPadModel of sfuOutboundRtpPadModels) {
|
|
53
|
+
if (!sfuOutboundRtpPadModel) continue;
|
|
54
|
+
yield createSfuOutboundRtpPadEntry(storageProvider, sfuOutboundRtpPadModel);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const asyncSfuSctpChannelGenerator = async function *() {
|
|
59
|
+
const sfuSctpChannelModels = await Promise.all(
|
|
60
|
+
model.sctpChannelIds.map((sfuSctpChannelId) => storageProvider.sfuSctpChannelStorage.get(sfuSctpChannelId))
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
for (const sfuSctpChannelModel of sfuSctpChannelModels) {
|
|
64
|
+
if (!sfuSctpChannelModel) continue;
|
|
65
|
+
yield createSfuSctpChannelEntry(storageProvider, sfuSctpChannelModel);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
sfuTransportId,
|
|
71
|
+
sfuId,
|
|
72
|
+
opened,
|
|
73
|
+
get internal() {
|
|
74
|
+
return internal === true;
|
|
75
|
+
},
|
|
76
|
+
get marker() {
|
|
77
|
+
return model.marker;
|
|
78
|
+
},
|
|
79
|
+
get inboundRtpPadIds(): ReadonlyArray<string> {
|
|
80
|
+
return model.inboundRtpPadIds;
|
|
81
|
+
},
|
|
82
|
+
get outboundRtpPadIds(): ReadonlyArray<string> {
|
|
83
|
+
return model.outboundRtpPadIds;
|
|
84
|
+
},
|
|
85
|
+
get sctpChannelIds(): ReadonlyArray<string> {
|
|
86
|
+
return model.sctpChannelIds;
|
|
87
|
+
},
|
|
88
|
+
get inboundRtpPads(): AsyncIterableIterator<ReturnType<typeof createSfuInboundRtpPadEntry>> {
|
|
89
|
+
return asyncIteratorConverter<ReturnType<typeof createSfuInboundRtpPadEntry>>(asyncSfuInboundRtpPadGenerator());
|
|
90
|
+
},
|
|
91
|
+
get outboundRtpPads(): AsyncIterableIterator<ReturnType<typeof createSfuOutboundRtpPadEntry>> {
|
|
92
|
+
return asyncIteratorConverter<ReturnType<typeof createSfuOutboundRtpPadEntry>>(asyncSfuOutboundRtpPadGenerator());
|
|
93
|
+
},
|
|
94
|
+
get sctpChannels(): AsyncIterableIterator<ReturnType<typeof createSfuSctpChannelEntry>> {
|
|
95
|
+
return asyncIteratorConverter<ReturnType<typeof createSfuSctpChannelEntry>>(asyncSfuSctpChannelGenerator());
|
|
96
|
+
},
|
|
97
|
+
getSfu,
|
|
98
|
+
getSfuInboundRtpPad,
|
|
99
|
+
getSfuOutboundRtpPad,
|
|
100
|
+
getSfuSctpChannel,
|
|
101
|
+
refresh: async () => {
|
|
102
|
+
const refreshedModel = await storageProvider.sfuTransportStorage.get(sfuTransportId);
|
|
103
|
+
|
|
104
|
+
if (!refreshedModel) return;
|
|
105
|
+
|
|
106
|
+
model.marker = refreshedModel.marker;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -13,6 +13,17 @@ export * as Models from './models/Models';
|
|
|
13
13
|
export * as SampleSchema from '@observertc/sample-schemas-js';
|
|
14
14
|
export * as ReportSchema from '@observertc/report-schemas-js';
|
|
15
15
|
|
|
16
|
+
export type { CallEntry } from './entries/CallEntry';
|
|
17
|
+
export type { ClientEntry } from './entries/ClientEntry';
|
|
18
|
+
export type { PeerConnectionEntry } from './entries/PeerConnectionEntry';
|
|
19
|
+
export type { InboundTrackEntry } from './entries/InboundTrackEntry';
|
|
20
|
+
export type { OutboundTrackEntry } from './entries/OutboundTrackEntry';
|
|
21
|
+
export type { SfuEntry } from './entries/SfuEntry';
|
|
22
|
+
export type { SfuTransportEntry } from './entries/SfuTransportEntry';
|
|
23
|
+
export type { SfuInboundRtpPadEntry } from './entries/SfuInboundRtpPadEntry';
|
|
24
|
+
export type { SfuOutboundRtpPadEntry } from './entries/SfuOutboundRtpPadEntry';
|
|
25
|
+
export type { SfuSctpChannelEntry } from './entries/SfuSctpChannelEntry';
|
|
26
|
+
|
|
16
27
|
export type {
|
|
17
28
|
Samples,
|
|
18
29
|
ClientSample,
|
|
@@ -13,11 +13,11 @@ export type CallOperationsContext = {
|
|
|
13
13
|
|
|
14
14
|
export type CallOperation =
|
|
15
15
|
| (ObservedClientSourceConfig & {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
type: 'join';
|
|
17
|
+
}) | (ObservedClientSourceConfig & {
|
|
18
|
+
type: 'detach';
|
|
19
|
+
detached: number;
|
|
20
|
+
});
|
|
21
21
|
|
|
22
22
|
export function createCallOperationContext(
|
|
23
23
|
clientOperations: Map<string, CallOperation>,
|
|
@@ -25,12 +25,14 @@ export function createCallOperationContext(
|
|
|
25
25
|
): CallOperationsContext {
|
|
26
26
|
const joinedClients: CallOperationsContext['joinedClients'] = [];
|
|
27
27
|
const detachedClients: CallOperationsContext['detachedClients'] = [];
|
|
28
|
+
|
|
28
29
|
for (const clientOperation of clientOperations.values()) {
|
|
29
30
|
switch (clientOperation.type) {
|
|
30
31
|
case 'join': {
|
|
31
32
|
const joinedClient: CallOperationsContext['joinedClients'][number] = {
|
|
32
33
|
...clientOperation,
|
|
33
34
|
};
|
|
35
|
+
|
|
34
36
|
joinedClients.push(joinedClient);
|
|
35
37
|
break;
|
|
36
38
|
}
|
|
@@ -38,11 +40,13 @@ export function createCallOperationContext(
|
|
|
38
40
|
const detachedClient: CallOperationsContext['detachedClients'][number] = {
|
|
39
41
|
...clientOperation,
|
|
40
42
|
};
|
|
43
|
+
|
|
41
44
|
detachedClients.push(detachedClient);
|
|
42
45
|
break;
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
}
|
|
49
|
+
|
|
46
50
|
return {
|
|
47
51
|
joinedClients,
|
|
48
52
|
detachedClients,
|
|
@@ -19,7 +19,8 @@ export function createCallProcessor(
|
|
|
19
19
|
|
|
20
20
|
evaluatorContext: context.evaluatorContext,
|
|
21
21
|
};
|
|
22
|
-
|
|
22
|
+
|
|
23
|
+
await Promise.all([ joinClientProcess(input), next ? next(context) : Promise.resolve() ]);
|
|
23
24
|
};
|
|
24
25
|
|
|
25
26
|
const detachClientMiddleware: Middleware<CallOperationsContext> = async (context, next) => {
|
|
@@ -29,7 +30,8 @@ export function createCallProcessor(
|
|
|
29
30
|
evaluatorContext: context.evaluatorContext,
|
|
30
31
|
recursive: true,
|
|
31
32
|
};
|
|
32
|
-
|
|
33
|
+
|
|
34
|
+
await Promise.all([ detachClientProcess(input), next ? next(context) : Promise.resolve() ]);
|
|
33
35
|
};
|
|
34
36
|
|
|
35
37
|
return createProcessor(joinClientMiddleware, detachClientMiddleware);
|
|
@@ -160,6 +160,7 @@ export function createCommitTransactionMiddleware(
|
|
|
160
160
|
|
|
161
161
|
const [
|
|
162
162
|
[
|
|
163
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
163
164
|
oldClientModels,
|
|
164
165
|
oldPeerConnectionModels,
|
|
165
166
|
oldInboundAudioTrackModels,
|
|
@@ -233,6 +234,7 @@ export function createCommitTransactionMiddleware(
|
|
|
233
234
|
};
|
|
234
235
|
const addedUnits = <K, V>(oldItems: ReadonlyMap<K, V>, updatedItems: ReadonlyMap<K, V>) => {
|
|
235
236
|
const oldSet = new Set<K>(oldItems.keys());
|
|
237
|
+
|
|
236
238
|
return Array.from(updatedItems.keys()).filter((updatedKey) => !oldSet.has(updatedKey));
|
|
237
239
|
};
|
|
238
240
|
|
|
@@ -312,14 +314,15 @@ export function createCommitTransactionMiddleware(
|
|
|
312
314
|
})
|
|
313
315
|
);
|
|
314
316
|
|
|
315
|
-
evaluatorContext.callEvents = [...reports.getCallEventReports()];
|
|
316
|
-
evaluatorContext.clientExtensionStats = [...reports.getClientExtensionReports()];
|
|
317
|
-
evaluatorContext.sfuEvents = [...reports.getSfuEventReports()];
|
|
318
|
-
evaluatorContext.sfuExtensionStats = [...reports.getSfuExtensionReports()];
|
|
317
|
+
evaluatorContext.callEvents = [ ...reports.getCallEventReports() ];
|
|
318
|
+
evaluatorContext.clientExtensionStats = [ ...reports.getClientExtensionReports() ];
|
|
319
|
+
evaluatorContext.sfuEvents = [ ...reports.getSfuEventReports() ];
|
|
320
|
+
evaluatorContext.sfuExtensionStats = [ ...reports.getSfuExtensionReports() ];
|
|
319
321
|
};
|
|
320
322
|
|
|
321
323
|
const result = async (context: TransactionContext, next?: Middleware<TransactionContext>) => {
|
|
322
|
-
await Promise.all([process(context), next ? next(context) : Promise.resolve()]);
|
|
324
|
+
await Promise.all([ process(context), next ? next(context) : Promise.resolve() ]);
|
|
323
325
|
};
|
|
326
|
+
|
|
324
327
|
return result;
|
|
325
328
|
}
|