@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
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { iteratorConverter } from '../common/utils';
|
|
2
|
-
import { ObservedCall, ObservedCallBuilder } from './ObservedCall';
|
|
3
2
|
import { ObservedSfu, ObservedSfuBuilder } from './ObservedSfu';
|
|
4
3
|
|
|
5
4
|
export interface ObservedSfus {
|
|
@@ -23,25 +22,28 @@ export class ObservedSfusBuilder {
|
|
|
23
22
|
configSupplier: () => ConstructorParameters<typeof ObservedSfuBuilder>[0]
|
|
24
23
|
) {
|
|
25
24
|
let result = this._builders.get(sfuId);
|
|
25
|
+
|
|
26
26
|
if (!result) {
|
|
27
27
|
const config = configSupplier();
|
|
28
|
+
|
|
28
29
|
result = new ObservedSfuBuilder(config);
|
|
29
30
|
this._builders.set(sfuId, result);
|
|
30
31
|
}
|
|
32
|
+
|
|
31
33
|
return result;
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
public build(): ObservedSfus {
|
|
35
37
|
const observedSfus = new Map<string, ObservedSfu>();
|
|
36
38
|
|
|
37
|
-
const sfuIdsGenerator = function*
|
|
39
|
+
const sfuIdsGenerator = function *() {
|
|
38
40
|
for (const observedSfu of observedSfus.values()) {
|
|
39
41
|
yield observedSfu.sfuId;
|
|
40
42
|
}
|
|
41
43
|
};
|
|
42
44
|
const sfuIds = () => iteratorConverter<string>(sfuIdsGenerator());
|
|
43
45
|
|
|
44
|
-
const sfuTransportIdsGenerator = function*
|
|
46
|
+
const sfuTransportIdsGenerator = function *() {
|
|
45
47
|
for (const observedSfu of observedSfus.values()) {
|
|
46
48
|
for (const observedTransport of observedSfu.observedSfuTransports()) {
|
|
47
49
|
yield observedTransport.transportId;
|
|
@@ -50,7 +52,7 @@ export class ObservedSfusBuilder {
|
|
|
50
52
|
};
|
|
51
53
|
const sfuTransportIds = () => iteratorConverter<string>(sfuTransportIdsGenerator());
|
|
52
54
|
|
|
53
|
-
const sfuInboundRtpPadIdsGenerator = function*
|
|
55
|
+
const sfuInboundRtpPadIdsGenerator = function *() {
|
|
54
56
|
for (const observedSfu of observedSfus.values()) {
|
|
55
57
|
for (const observedTransport of observedSfu.observedSfuTransports()) {
|
|
56
58
|
for (const sfuInboundRtpPad of observedTransport.inboundRtpPads()) {
|
|
@@ -61,7 +63,7 @@ export class ObservedSfusBuilder {
|
|
|
61
63
|
};
|
|
62
64
|
const sfuInboundRtpPadIds = () => iteratorConverter<string>(sfuInboundRtpPadIdsGenerator());
|
|
63
65
|
|
|
64
|
-
const sfuOutboundRtpPadIdsGenerator = function*
|
|
66
|
+
const sfuOutboundRtpPadIdsGenerator = function *() {
|
|
65
67
|
for (const observedSfu of observedSfus.values()) {
|
|
66
68
|
for (const observedTransport of observedSfu.observedSfuTransports()) {
|
|
67
69
|
for (const sfuOutboundRtpPad of observedTransport.outboundRtpPads()) {
|
|
@@ -80,11 +82,14 @@ export class ObservedSfusBuilder {
|
|
|
80
82
|
observedSfus: () => observedSfus.values(),
|
|
81
83
|
getObservedSfu: (sfuId) => observedSfus.get(sfuId),
|
|
82
84
|
};
|
|
85
|
+
|
|
83
86
|
for (const builder of this._builders.values()) {
|
|
84
87
|
const observedSfu = builder.build();
|
|
88
|
+
|
|
85
89
|
observedSfus.set(observedSfu.sfuId, observedSfu);
|
|
86
90
|
}
|
|
87
91
|
this._builders.clear();
|
|
92
|
+
|
|
88
93
|
return result;
|
|
89
94
|
}
|
|
90
95
|
}
|
|
@@ -121,19 +121,21 @@ export class SinkImpl implements ReportsCollector, ObserverReportsEmitter {
|
|
|
121
121
|
this._processor = createProcessor();
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
|
|
125
124
|
public on<K extends keyof SinkEventsMap>(event: K, listener: (reports: SinkEventsMap[K]) => void): this {
|
|
126
125
|
this._emitter.addListener(event, listener);
|
|
126
|
+
|
|
127
127
|
return this;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
public off<K extends keyof SinkEventsMap>(event: K, listener: (reports: SinkEventsMap[K]) => void): this {
|
|
131
131
|
this._emitter.removeListener(event, listener);
|
|
132
|
+
|
|
132
133
|
return this;
|
|
133
134
|
}
|
|
134
135
|
|
|
135
136
|
public once<K extends keyof SinkEventsMap>(event: K, listener: (reports: SinkEventsMap[K]) => void): this {
|
|
136
137
|
this._emitter.once(event, listener);
|
|
138
|
+
|
|
137
139
|
return this;
|
|
138
140
|
}
|
|
139
141
|
|
|
@@ -230,12 +232,14 @@ export class SinkImpl implements ReportsCollector, ObserverReportsEmitter {
|
|
|
230
232
|
await process(context);
|
|
231
233
|
if (next) await next(context);
|
|
232
234
|
};
|
|
235
|
+
|
|
233
236
|
this._customProcesses.set(process, middleware);
|
|
234
237
|
this._processor.addMiddleware(middleware);
|
|
235
238
|
}
|
|
236
239
|
|
|
237
240
|
public removeProcess(process: ObserverSinkProcess) {
|
|
238
241
|
const middleware = this._customProcesses.get(process);
|
|
242
|
+
|
|
239
243
|
if (!middleware) {
|
|
240
244
|
return;
|
|
241
245
|
}
|
|
@@ -249,7 +253,7 @@ export class SinkImpl implements ReportsCollector, ObserverReportsEmitter {
|
|
|
249
253
|
return;
|
|
250
254
|
}
|
|
251
255
|
if (this._processes.has(this._index)) {
|
|
252
|
-
logger.warn(
|
|
256
|
+
logger.warn('The sink process has been called while the previous process has not yet completed. This may indicate that the observer is attempting to process more reports than it can handle.');
|
|
253
257
|
}
|
|
254
258
|
|
|
255
259
|
const actualBlockingPoint = this._processes.get(this._index) ?? Promise.resolve();
|
|
@@ -270,7 +274,9 @@ export class SinkImpl implements ReportsCollector, ObserverReportsEmitter {
|
|
|
270
274
|
resolve();
|
|
271
275
|
});
|
|
272
276
|
});
|
|
277
|
+
|
|
273
278
|
this._processes.set(index, nextBlockingPoint);
|
|
279
|
+
|
|
274
280
|
return result;
|
|
275
281
|
}
|
|
276
282
|
|
|
@@ -284,9 +290,10 @@ export class SinkImpl implements ReportsCollector, ObserverReportsEmitter {
|
|
|
284
290
|
};
|
|
285
291
|
|
|
286
292
|
const context = this._createObserverSinkContext();
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
293
|
+
|
|
294
|
+
this._process(context).catch((err) => {
|
|
295
|
+
logger.error('Error occurred while processing reports', err);
|
|
296
|
+
});
|
|
290
297
|
|
|
291
298
|
checkAndEmit('call-event', this._callEventReports);
|
|
292
299
|
this._callEventReports = [];
|
|
@@ -349,45 +356,45 @@ export class SinkImpl implements ReportsCollector, ObserverReportsEmitter {
|
|
|
349
356
|
return this._emitter.emit(event, reports);
|
|
350
357
|
}
|
|
351
358
|
|
|
352
|
-
private
|
|
353
|
-
const callEventReports = [...this._callEventReports];
|
|
354
|
-
const callMetaReports = [...this._callMetaReports];
|
|
355
|
-
const clientDataChannelReports = [...this._clientDataChannelReports];
|
|
356
|
-
const clientExtensionReports = [...this._clientExtensionReports];
|
|
357
|
-
const iceCandidatePairReports = [...this._iceCandidatePairReports];
|
|
358
|
-
const inboundAudioTrackReports = [...this._inboundAudioTrackReports];
|
|
359
|
-
const inboundVideoTrackReports = [...this._inboundVideoTrackReports];
|
|
360
|
-
const peerConnectionTransportReports = [...this._peerConnectionTransportReports];
|
|
361
|
-
const observerEventReports = [...this._observerEventReports];
|
|
362
|
-
const outboundAudioTrackReports = [...this._outboundAudioTrackReports];
|
|
363
|
-
const outboundVideoTrackReports = [...this._outboundVideoTrackReports];
|
|
364
|
-
const sfuEventReports = [...this._sfuEventReports];
|
|
365
|
-
const sfuExtensionReports = [...this._sfuExtensionReports];
|
|
366
|
-
const sfuInboundRtpPadReports = [...this._sfuInboundRtpPadReports];
|
|
367
|
-
const sfuOutboundRtpPadReports = [...this._sfuOutboundRtpPadReports];
|
|
368
|
-
const sfuSctpStreamReports = [...this._sfuSctpStreamReports];
|
|
369
|
-
const sfuTransportReports = [...this._sfuTransportReports];
|
|
370
|
-
const sfuMetaReports = [...this._sfuMetaReports];
|
|
371
|
-
|
|
359
|
+
private _createObserverSinkContext(): ObserverSinkContext {
|
|
360
|
+
const callEventReports = [ ...this._callEventReports ];
|
|
361
|
+
const callMetaReports = [ ...this._callMetaReports ];
|
|
362
|
+
const clientDataChannelReports = [ ...this._clientDataChannelReports ];
|
|
363
|
+
const clientExtensionReports = [ ...this._clientExtensionReports ];
|
|
364
|
+
const iceCandidatePairReports = [ ...this._iceCandidatePairReports ];
|
|
365
|
+
const inboundAudioTrackReports = [ ...this._inboundAudioTrackReports ];
|
|
366
|
+
const inboundVideoTrackReports = [ ...this._inboundVideoTrackReports ];
|
|
367
|
+
const peerConnectionTransportReports = [ ...this._peerConnectionTransportReports ];
|
|
368
|
+
const observerEventReports = [ ...this._observerEventReports ];
|
|
369
|
+
const outboundAudioTrackReports = [ ...this._outboundAudioTrackReports ];
|
|
370
|
+
const outboundVideoTrackReports = [ ...this._outboundVideoTrackReports ];
|
|
371
|
+
const sfuEventReports = [ ...this._sfuEventReports ];
|
|
372
|
+
const sfuExtensionReports = [ ...this._sfuExtensionReports ];
|
|
373
|
+
const sfuInboundRtpPadReports = [ ...this._sfuInboundRtpPadReports ];
|
|
374
|
+
const sfuOutboundRtpPadReports = [ ...this._sfuOutboundRtpPadReports ];
|
|
375
|
+
const sfuSctpStreamReports = [ ...this._sfuSctpStreamReports ];
|
|
376
|
+
const sfuTransportReports = [ ...this._sfuTransportReports ];
|
|
377
|
+
const sfuMetaReports = [ ...this._sfuMetaReports ];
|
|
378
|
+
|
|
372
379
|
return {
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
380
|
+
callEventReports,
|
|
381
|
+
callMetaReports,
|
|
382
|
+
clientDataChannelReports,
|
|
383
|
+
clientExtensionReports,
|
|
384
|
+
iceCandidatePairReports,
|
|
385
|
+
inboundAudioTrackReports,
|
|
386
|
+
inboundVideoTrackReports,
|
|
387
|
+
peerConnectionTransportReports,
|
|
388
|
+
observerEventReports,
|
|
389
|
+
outboundAudioTrackReports,
|
|
390
|
+
outboundVideoTrackReports,
|
|
391
|
+
sfuEventReports,
|
|
392
|
+
sfuExtensionReports,
|
|
393
|
+
sfuInboundRtpPadReports,
|
|
394
|
+
sfuOutboundRtpPadReports,
|
|
395
|
+
sfuSctpStreamReports,
|
|
396
|
+
sfuTransportReports,
|
|
397
|
+
sfuMetaReports,
|
|
391
398
|
};
|
|
392
|
-
|
|
399
|
+
}
|
|
393
400
|
}
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
import { ClientSample } from '@observertc/sample-schemas-js';
|
|
2
1
|
import { PartialBy } from '../common/utils';
|
|
3
2
|
import { ObservedClientSource, ObservedClientSourceConfig } from './ObservedClientSource';
|
|
4
3
|
|
|
5
|
-
export type ObservedCallSourceConfig = {
|
|
4
|
+
export type ObservedCallSourceConfig<T extends Record<string, unknown>> = {
|
|
5
|
+
readonly appData: T
|
|
6
6
|
readonly serviceId: string;
|
|
7
7
|
readonly mediaUnitId: string;
|
|
8
8
|
readonly roomId: string;
|
|
9
9
|
readonly callId: string;
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
export interface ObservedCallSource extends ObservedCallSourceConfig {
|
|
12
|
+
export interface ObservedCallSource<T extends Record<string, unknown> = Record<string, unknown>> extends ObservedCallSourceConfig<T> {
|
|
13
13
|
readonly closed: boolean;
|
|
14
|
+
readonly clients: IterableIterator<ObservedClientSource>;
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
getClientSource<U extends Record<string, unknown>>(clientId: string): ObservedClientSource<U> | undefined;
|
|
17
|
+
|
|
18
|
+
createClientSource<U extends Record<string, unknown> = Record<string, unknown>>(
|
|
19
|
+
context: PartialBy<ObservedClientSourceConfig<U>, 'joined' | 'mediaUnitId' | 'serviceId' | 'callId' | 'roomId'>
|
|
20
|
+
): ObservedClientSource<U>;
|
|
18
21
|
|
|
19
22
|
// automatically close every
|
|
20
23
|
close(): void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ClientSample } from '@observertc/sample-schemas-js';
|
|
2
2
|
|
|
3
|
-
export type ObservedClientSourceConfig = {
|
|
3
|
+
export type ObservedClientSourceConfig<T extends Record<string, unknown> = Record<string, unknown>> = {
|
|
4
|
+
readonly appData: T;
|
|
4
5
|
readonly serviceId: string;
|
|
5
6
|
readonly mediaUnitId: string;
|
|
6
7
|
readonly roomId: string;
|
|
@@ -13,7 +14,7 @@ export type ObservedClientSourceConfig = {
|
|
|
13
14
|
timeZoneId?: string;
|
|
14
15
|
};
|
|
15
16
|
|
|
16
|
-
export interface ObservedClientSource extends ObservedClientSourceConfig {
|
|
17
|
+
export interface ObservedClientSource<T extends Record<string, unknown> = Record<string, unknown>> extends ObservedClientSourceConfig<T> {
|
|
17
18
|
readonly closed: boolean;
|
|
18
19
|
|
|
19
20
|
accept(...samples: ClientSample[]): void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SfuSample } from '@observertc/sample-schemas-js';
|
|
2
2
|
|
|
3
|
-
export type ObservedSfuSourceConfig = {
|
|
3
|
+
export type ObservedSfuSourceConfig<T extends Record<string, unknown> = Record<string, unknown>> = {
|
|
4
|
+
readonly appData: T;
|
|
4
5
|
readonly serviceId: string;
|
|
5
6
|
readonly mediaUnitId: string;
|
|
6
7
|
readonly sfuId: string;
|
|
@@ -9,15 +10,10 @@ export type ObservedSfuSourceConfig = {
|
|
|
9
10
|
timeZoneId?: string;
|
|
10
11
|
};
|
|
11
12
|
|
|
12
|
-
export interface ObservedSfuSource extends ObservedSfuSourceConfig {
|
|
13
|
+
export interface ObservedSfuSource<T extends Record<string, unknown> = Record<string, unknown>> extends ObservedSfuSourceConfig<T> {
|
|
13
14
|
readonly closed: boolean;
|
|
14
15
|
|
|
15
16
|
accept(...samples: SfuSample[]): void;
|
|
16
17
|
|
|
17
|
-
// when you close this, client is disposed. so this triggers the client to dispose
|
|
18
|
-
// therefore this triggers the call to be disposed
|
|
19
|
-
// peer connections, and tracks the creation is evented by the client,
|
|
20
|
-
// the close of those object is evented by the observer or closing this
|
|
21
|
-
// call the close of this is mandatory, as only this closes the client inside the observer
|
|
22
18
|
close(): void;
|
|
23
19
|
}
|
package/src/sources/Sources.ts
CHANGED
|
@@ -4,9 +4,9 @@ import { ObservedClientSource, ObservedClientSourceConfig } from './ObservedClie
|
|
|
4
4
|
import { EventEmitter } from 'events';
|
|
5
5
|
import { createLogger } from '../common/logger';
|
|
6
6
|
import { PartialBy } from '../common/utils';
|
|
7
|
-
import { ObservedCallSource, ObservedCallSourceConfig } from './ObservedCallSource';
|
|
8
7
|
import { ObservedSfuSourceConfig, ObservedSfuSource } from './ObservedSfuSource';
|
|
9
8
|
import { ObservedSfus, ObservedSfusBuilder } from '../samples/ObservedSfus';
|
|
9
|
+
import { ObservedCallSource, ObservedCallSourceConfig } from './ObservedCallSource';
|
|
10
10
|
|
|
11
11
|
const logger = createLogger('Sources');
|
|
12
12
|
|
|
@@ -30,7 +30,8 @@ export type SourcesEvents = {
|
|
|
30
30
|
export class Sources {
|
|
31
31
|
|
|
32
32
|
private readonly _warnFlags = { autoEmitButEmitSamplesInvoked: false };
|
|
33
|
-
private readonly
|
|
33
|
+
private readonly _callSources = new Map<string, ObservedCallSource>();
|
|
34
|
+
// private readonly _clientSources = new Map<string, ObservedClientSource>();
|
|
34
35
|
private readonly _sfuSources = new Map<string, ObservedSfuSource>();
|
|
35
36
|
private readonly _emitter = new EventEmitter();
|
|
36
37
|
|
|
@@ -41,13 +42,27 @@ export class Sources {
|
|
|
41
42
|
|
|
42
43
|
public constructor(public readonly config: SourcesConfig) {}
|
|
43
44
|
|
|
45
|
+
public getCallSource<T extends Record<string, unknown> = Record<string, unknown>>(callId: string): ObservedCallSource<T> | undefined {
|
|
46
|
+
if (!this._callSources.has(callId)) return;
|
|
47
|
+
|
|
48
|
+
return this._callSources.get(callId) as ObservedCallSource<T>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public getSfuSource<T extends Record<string, unknown> = Record<string, unknown>>(sfuId: string) {
|
|
52
|
+
if (!this._sfuSources.has(sfuId)) return;
|
|
53
|
+
|
|
54
|
+
return this._sfuSources.get(sfuId) as ObservedSfuSource<T>;
|
|
55
|
+
}
|
|
56
|
+
|
|
44
57
|
public on<K extends keyof SourcesEvents>(event: K, listener: (data: SourcesEvents[K]) => void): this {
|
|
45
58
|
this._emitter.addListener(event, listener);
|
|
59
|
+
|
|
46
60
|
return this;
|
|
47
61
|
}
|
|
48
62
|
|
|
49
63
|
public off<K extends keyof SourcesEvents>(event: K, listener: (data: SourcesEvents[K]) => void): this {
|
|
50
64
|
this._emitter.removeListener(event, listener);
|
|
65
|
+
|
|
51
66
|
return this;
|
|
52
67
|
}
|
|
53
68
|
|
|
@@ -55,16 +70,86 @@ export class Sources {
|
|
|
55
70
|
return this._emitter.emit(event, data);
|
|
56
71
|
}
|
|
57
72
|
|
|
58
|
-
public
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
73
|
+
public createCallSource<T extends Record<string, unknown> = Record<string, unknown>>(
|
|
74
|
+
config: ObservedCallSourceConfig<T>
|
|
75
|
+
): ObservedCallSource<T> {
|
|
76
|
+
let closed = false;
|
|
77
|
+
const {
|
|
78
|
+
serviceId,
|
|
79
|
+
mediaUnitId,
|
|
80
|
+
appData,
|
|
81
|
+
...callConfig
|
|
82
|
+
} = config;
|
|
83
|
+
const clientSources = new Map<string, ObservedClientSource>();
|
|
84
|
+
const callSource: ObservedCallSource<T> = {
|
|
85
|
+
...callConfig,
|
|
86
|
+
appData,
|
|
87
|
+
serviceId,
|
|
88
|
+
mediaUnitId,
|
|
89
|
+
get clients() {
|
|
90
|
+
return clientSources.values();
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
getClientSource: <U extends Record<string, unknown> = Record<string, unknown>>(clientId: string) => {
|
|
94
|
+
if (!clientSources.has(clientId)) return;
|
|
95
|
+
else return clientSources.get(clientId) as ObservedClientSource<U>;
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
createClientSource: <U extends Record<string, unknown> = Record<string, unknown>>(context: ObservedClientSourceConfig<U>) => {
|
|
99
|
+
const existingClientSource = clientSources.get(context.clientId);
|
|
100
|
+
|
|
101
|
+
if (existingClientSource) return existingClientSource as ObservedClientSource<U>;
|
|
102
|
+
|
|
103
|
+
const { appData: clientAppData, ...clientConfig } = context;
|
|
104
|
+
const clientSource = this._createClientSource<U>({
|
|
105
|
+
...callConfig,
|
|
106
|
+
...clientConfig,
|
|
107
|
+
appData: clientAppData,
|
|
108
|
+
serviceId,
|
|
109
|
+
mediaUnitId,
|
|
110
|
+
});
|
|
111
|
+
const closeClientSource = clientSource.close;
|
|
112
|
+
|
|
113
|
+
clientSource.close = () => {
|
|
114
|
+
closeClientSource();
|
|
115
|
+
clientSources.delete(context.clientId);
|
|
116
|
+
};
|
|
117
|
+
clientSources.set(context.clientId, clientSource);
|
|
118
|
+
|
|
119
|
+
return clientSource as ObservedClientSource<U>;
|
|
120
|
+
},
|
|
121
|
+
close: () => {
|
|
122
|
+
if (closed) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
for (const clientSource of clientSources.values()) {
|
|
126
|
+
clientSource.close();
|
|
127
|
+
}
|
|
128
|
+
clientSources.clear();
|
|
129
|
+
this._callSources.delete(config.callId);
|
|
130
|
+
closed = true;
|
|
131
|
+
},
|
|
132
|
+
closed,
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
if (this._callSources.size < 1) {
|
|
136
|
+
this._resetTimer();
|
|
63
137
|
}
|
|
138
|
+
this._callSources.set(config.callId, callSource);
|
|
139
|
+
|
|
140
|
+
return callSource;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private _createClientSource<T extends Record<string, unknown> = Record<string, unknown>>(config: PartialBy<ObservedClientSourceConfig<T>, 'joined'>): ObservedClientSource<T> {
|
|
64
144
|
let closed = false;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
...
|
|
145
|
+
const {
|
|
146
|
+
appData,
|
|
147
|
+
...clientConfig
|
|
148
|
+
} = config;
|
|
149
|
+
|
|
150
|
+
const source: ObservedClientSource<T> = {
|
|
151
|
+
...clientConfig,
|
|
152
|
+
appData,
|
|
68
153
|
joined: config.joined ?? Date.now(),
|
|
69
154
|
|
|
70
155
|
accept: (...samples: ClientSample[]) => {
|
|
@@ -92,23 +177,20 @@ export class Sources {
|
|
|
92
177
|
return;
|
|
93
178
|
}
|
|
94
179
|
closed = true;
|
|
95
|
-
this._clientSources.delete(config.clientId);
|
|
96
180
|
this._emit('removed-client-source', source);
|
|
97
181
|
},
|
|
98
182
|
closed,
|
|
99
183
|
};
|
|
100
|
-
|
|
101
|
-
this._resetTimer();
|
|
102
|
-
}
|
|
103
|
-
this._clientSources.set(config.clientId, source);
|
|
184
|
+
|
|
104
185
|
this._emit('added-client-source', source);
|
|
186
|
+
|
|
105
187
|
return source;
|
|
106
188
|
}
|
|
107
189
|
|
|
108
|
-
public createSfuSource(config: PartialBy<ObservedSfuSourceConfig
|
|
190
|
+
public createSfuSource<T extends Record<string, unknown> = Record<string, unknown>>(config: PartialBy<ObservedSfuSourceConfig<T>, 'joined'>): ObservedSfuSource {
|
|
109
191
|
const existingSfuSource = this._sfuSources.get(config.sfuId);
|
|
192
|
+
|
|
110
193
|
if (existingSfuSource) {
|
|
111
|
-
logger.warn(`Attempted to add a SfuSource for sfu ${config.sfuId} twice`);
|
|
112
194
|
return existingSfuSource;
|
|
113
195
|
}
|
|
114
196
|
let closed = false;
|
|
@@ -142,11 +224,13 @@ export class Sources {
|
|
|
142
224
|
},
|
|
143
225
|
closed,
|
|
144
226
|
};
|
|
227
|
+
|
|
145
228
|
if (this._sfuSources.size < 1) {
|
|
146
229
|
this._resetTimer();
|
|
147
230
|
}
|
|
148
231
|
this._sfuSources.set(config.sfuId, source);
|
|
149
232
|
this._emit('added-sfu-source', source);
|
|
233
|
+
|
|
150
234
|
return source;
|
|
151
235
|
}
|
|
152
236
|
|
|
@@ -174,8 +258,10 @@ export class Sources {
|
|
|
174
258
|
private _emitSamples() {
|
|
175
259
|
this._resetTimer();
|
|
176
260
|
const observedCalls = this._observedCallsBuilder.build();
|
|
261
|
+
|
|
177
262
|
this._observedCallsBuilder = new ObservedCallsBuilder();
|
|
178
263
|
const observedSfus = this._observedSfusBuilder.build();
|
|
264
|
+
|
|
179
265
|
this._observedSfusBuilder = new ObservedSfusBuilder();
|
|
180
266
|
this._emit('observed-samples', {
|
|
181
267
|
observedCalls,
|
|
@@ -199,11 +285,10 @@ export class Sources {
|
|
|
199
285
|
}
|
|
200
286
|
|
|
201
287
|
public close() {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
288
|
+
[ ...this._callSources.values() ].forEach((callSource) => callSource.close());
|
|
289
|
+
[ ...this._sfuSources.values() ].forEach((sfuSource) => sfuSource.close());
|
|
290
|
+
this._callSources.clear();
|
|
291
|
+
this._sfuSources.clear();
|
|
207
292
|
this._emitSamples();
|
|
208
293
|
}
|
|
209
294
|
}
|
|
@@ -5,87 +5,110 @@ export class SimpleStorage<K, V> implements ObserverStorage<K, V> {
|
|
|
5
5
|
|
|
6
6
|
public constructor(public readonly id: string) {}
|
|
7
7
|
|
|
8
|
-
public
|
|
9
|
-
return this._map.size;
|
|
8
|
+
public size(): Promise<number> {
|
|
9
|
+
return Promise.resolve(this._map.size);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
public
|
|
12
|
+
public clear(): Promise<void> {
|
|
13
13
|
this._map.clear();
|
|
14
|
+
|
|
15
|
+
return Promise.resolve();
|
|
14
16
|
}
|
|
15
17
|
|
|
16
|
-
public
|
|
17
|
-
return this._map.get(key);
|
|
18
|
+
public get(key: K): Promise<V | undefined> {
|
|
19
|
+
return Promise.resolve(this._map.get(key));
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
public
|
|
22
|
+
public getAll(keys: Iterable<K>): Promise<ReadonlyMap<K, V>> {
|
|
21
23
|
const result = new Map<K, V>();
|
|
24
|
+
|
|
22
25
|
for (const key of keys) {
|
|
23
26
|
const value = this._map.get(key);
|
|
27
|
+
|
|
24
28
|
if (value) {
|
|
25
29
|
result.set(key, value);
|
|
26
30
|
}
|
|
27
31
|
}
|
|
28
|
-
|
|
32
|
+
|
|
33
|
+
return Promise.resolve(result);
|
|
29
34
|
}
|
|
30
35
|
|
|
31
|
-
public
|
|
36
|
+
public set(key: K, value: V): Promise<V | undefined> {
|
|
32
37
|
const result = this._map.get(key);
|
|
38
|
+
|
|
33
39
|
this._map.set(key, value);
|
|
34
|
-
|
|
40
|
+
|
|
41
|
+
return Promise.resolve(result);
|
|
35
42
|
}
|
|
36
43
|
|
|
37
|
-
public
|
|
44
|
+
public setAll(entries: ReadonlyMap<K, V>): Promise<ReadonlyMap<K, V>> {
|
|
38
45
|
const result = new Map<K, V>();
|
|
39
|
-
|
|
46
|
+
|
|
47
|
+
for (const [ key, value ] of entries) {
|
|
40
48
|
const oldValue = this._map.get(key);
|
|
49
|
+
|
|
41
50
|
if (oldValue) {
|
|
42
51
|
result.set(key, oldValue);
|
|
43
52
|
}
|
|
44
53
|
this._map.set(key, value);
|
|
45
54
|
}
|
|
46
|
-
|
|
55
|
+
|
|
56
|
+
return Promise.resolve(result);
|
|
47
57
|
}
|
|
48
58
|
|
|
49
|
-
public
|
|
59
|
+
public insert(key: K, value: V): Promise<V | undefined> {
|
|
50
60
|
const result = this._map.get(key);
|
|
61
|
+
|
|
51
62
|
if (result) {
|
|
52
|
-
return result;
|
|
63
|
+
return Promise.resolve(result);
|
|
53
64
|
}
|
|
54
65
|
this._map.set(key, value);
|
|
66
|
+
|
|
67
|
+
return Promise.resolve(undefined);
|
|
55
68
|
}
|
|
56
69
|
|
|
57
|
-
public
|
|
70
|
+
public insertAll(entries: ReadonlyMap<K, V>): Promise<ReadonlyMap<K, V>> {
|
|
58
71
|
const result = new Map<K, V>();
|
|
59
|
-
|
|
72
|
+
|
|
73
|
+
for (const [ key, value ] of entries) {
|
|
60
74
|
const oldValue = this._map.get(key);
|
|
75
|
+
|
|
61
76
|
if (oldValue) {
|
|
62
77
|
result.set(key, oldValue);
|
|
63
78
|
} else {
|
|
64
79
|
this._map.set(key, value);
|
|
65
80
|
}
|
|
66
81
|
}
|
|
67
|
-
|
|
82
|
+
|
|
83
|
+
return Promise.resolve(result);
|
|
68
84
|
}
|
|
69
85
|
|
|
70
|
-
public
|
|
86
|
+
public remove(key: K): Promise<V | undefined> {
|
|
71
87
|
const result = this._map.get(key);
|
|
88
|
+
|
|
72
89
|
this._map.delete(key);
|
|
73
|
-
|
|
90
|
+
|
|
91
|
+
return Promise.resolve(result);
|
|
74
92
|
}
|
|
75
93
|
|
|
76
|
-
public
|
|
94
|
+
public removeAll(keys: Iterable<K>): Promise<ReadonlyMap<K, V>> {
|
|
77
95
|
const result = new Map<K, V>();
|
|
96
|
+
|
|
78
97
|
for (const key of keys) {
|
|
79
98
|
const value = this._map.get(key);
|
|
99
|
+
|
|
80
100
|
this._map.delete(key);
|
|
81
101
|
if (value) {
|
|
82
102
|
result.set(key, value);
|
|
83
103
|
}
|
|
84
104
|
}
|
|
85
|
-
|
|
105
|
+
|
|
106
|
+
return Promise.resolve(result);
|
|
86
107
|
}
|
|
87
108
|
|
|
88
109
|
public async *[Symbol.asyncIterator](): AsyncIterableIterator<[K, V]> {
|
|
110
|
+
await Promise.resolve();
|
|
111
|
+
|
|
89
112
|
for (const entry of this._map.entries()) {
|
|
90
113
|
yield entry;
|
|
91
114
|
}
|