@observertc/observer-js 0.9.20-beta → 0.9.22-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 +1408 -38
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +484 -180
- 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 +5 -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 +71 -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 +2 -1
- package/src/Evaluator.ts +17 -9
- package/src/Observer.ts +239 -171
- 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 +6 -5
- package/src/sources/ObservedClientSource.ts +3 -2
- package/src/sources/ObservedSfuSource.ts +4 -8
- package/src/sources/Sources.ts +96 -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
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
Platform,
|
|
13
13
|
} from '@observertc/sample-schemas-js';
|
|
14
14
|
|
|
15
|
+
// eslint-disable-next-line no-shadow
|
|
15
16
|
export enum CallMetaType {
|
|
16
17
|
CERTIFICATE = 'CERTIFICATE',
|
|
17
18
|
CODEC = 'CODEC',
|
|
@@ -32,47 +33,47 @@ export enum CallMetaType {
|
|
|
32
33
|
|
|
33
34
|
export type CallMetaReportType =
|
|
34
35
|
| {
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
type: CallMetaType.CERTIFICATE;
|
|
37
|
+
payload: Certificate;
|
|
37
38
|
} | {
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
type: CallMetaType.CODEC;
|
|
40
|
+
payload: MediaCodecStats;
|
|
40
41
|
} | {
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
type: CallMetaType.ICE_LOCAL_CANDIDATE;
|
|
43
|
+
payload: IceLocalCandidate;
|
|
43
44
|
} | {
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
type: CallMetaType.ICE_REMOTE_CANDIDATE;
|
|
46
|
+
payload: IceRemoteCandidate;
|
|
46
47
|
} | {
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
type: CallMetaType.ICE_SERVER;
|
|
49
|
+
payload: string;
|
|
49
50
|
} | {
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
type: CallMetaType.MEDIA_CONSTRAINT;
|
|
52
|
+
payload: string;
|
|
52
53
|
} | {
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
type: CallMetaType.MEDIA_DEVICE;
|
|
55
|
+
payload: MediaDevice;
|
|
55
56
|
} | {
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
type: CallMetaType.MEDIA_SOURCE;
|
|
58
|
+
payload: MediaSourceStat;
|
|
58
59
|
} | {
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
type: CallMetaType.USER_MEDIA_ERROR;
|
|
61
|
+
payload: string;
|
|
61
62
|
} | {
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
type: CallMetaType.OPERATION_SYSTEM;
|
|
64
|
+
payload: OperationSystem;
|
|
64
65
|
} | {
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
type: CallMetaType.PLATFORM;
|
|
67
|
+
payload: Platform;
|
|
67
68
|
} | {
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
type: CallMetaType.ENGINE;
|
|
70
|
+
payload: Engine;
|
|
70
71
|
} | {
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
type: CallMetaType.LOCAL_SDP;
|
|
73
|
+
payload: string;
|
|
73
74
|
} | {
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
type: CallMetaType.BROWSER;
|
|
76
|
+
payload: Browser;
|
|
76
77
|
};
|
|
77
78
|
|
|
78
79
|
export function createCallMetaReport(
|
|
@@ -96,5 +97,6 @@ export function createCallMetaReport(
|
|
|
96
97
|
payload: JSON.stringify(reportType.payload),
|
|
97
98
|
timestamp: timestamp ?? Date.now(),
|
|
98
99
|
};
|
|
100
|
+
|
|
99
101
|
return report;
|
|
100
102
|
}
|
package/src/common/logger.ts
CHANGED
|
@@ -1,186 +1,194 @@
|
|
|
1
1
|
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
2
2
|
|
|
3
3
|
export interface Logger {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
trace(...args: any[]): void;
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
7
|
+
debug(...args: any[]): void;
|
|
8
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
9
|
+
info(...args: any[]): void;
|
|
10
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
11
|
+
warn(...args: any[]): void;
|
|
12
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
13
|
+
error(...args: any[]): void;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export interface WrappedLogger extends Logger {
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
init(): void;
|
|
18
|
+
level: LogLevel | undefined,
|
|
19
19
|
logger: Logger;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export type LoggerFactory = () => Logger;
|
|
23
23
|
|
|
24
24
|
const COLORS = {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
black: '\x1b[30m',
|
|
26
|
+
red: '\x1b[31m',
|
|
27
|
+
green: '\x1b[32m',
|
|
28
|
+
yellow: '\x1b[33m',
|
|
29
|
+
blue: '\x1b[34m',
|
|
30
|
+
magenta: '\x1b[35m',
|
|
31
|
+
cyan: '\x1b[36m',
|
|
32
|
+
white: '\x1b[37m',
|
|
33
|
+
default: '\x1b[39m',
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
-
let defaultLevel: LogLevel =
|
|
36
|
+
let defaultLevel: LogLevel = 'error';
|
|
37
37
|
const created = Date.now();
|
|
38
38
|
|
|
39
39
|
function createDefaultLoggerFactory(): LoggerFactory {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
40
|
+
return () => {
|
|
41
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
42
|
+
const trace = (...args: any[]) => {
|
|
43
|
+
/* eslint-disable no-debugger, no-console */
|
|
44
|
+
console.trace(...args);
|
|
45
|
+
};
|
|
46
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
47
|
+
const debug = (...args: any[]) => {
|
|
48
|
+
/* eslint-disable no-debugger, no-console */
|
|
49
|
+
console.debug(...args);
|
|
50
|
+
};
|
|
51
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
52
|
+
const info = (...args: any[]) => {
|
|
53
|
+
/* eslint-disable no-debugger, no-console */
|
|
54
|
+
console.info(...args);
|
|
55
|
+
};
|
|
56
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
57
|
+
const warn = (...args: any[]) => {
|
|
58
|
+
/* eslint-disable no-debugger, no-console */
|
|
59
|
+
console.warn(...args);
|
|
60
|
+
};
|
|
61
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
62
|
+
const error = (...args: any[]) => {
|
|
63
|
+
/* eslint-disable no-debugger, no-console */
|
|
64
|
+
console.error(...args);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
trace,
|
|
69
|
+
debug,
|
|
70
|
+
info,
|
|
71
|
+
warn,
|
|
72
|
+
error,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
const wrapLogger = (logger: Logger, moduleName: string, logLevel?: LogLevel) => {
|
|
77
78
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
let isTrace = false;
|
|
80
|
+
let isDebug = false;
|
|
81
|
+
let isInfo = false;
|
|
82
|
+
let isWarning = false;
|
|
83
|
+
let isError = false;
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
let _level = logLevel;
|
|
86
|
+
let _logger = logger;
|
|
86
87
|
const tracePrefix = `${COLORS.magenta}[TRACE]${COLORS.default} ${moduleName}`;
|
|
87
88
|
const debugPrefix = `${COLORS.cyan}[DEBUG]${COLORS.default} ${moduleName}`;
|
|
88
89
|
const infoPrefix = `${COLORS.green}[INFO]${COLORS.default} ${moduleName}`;
|
|
89
90
|
const warnPrefix = `${COLORS.yellow}[WARN]${COLORS.default} ${moduleName}`;
|
|
90
91
|
const errorPrefix = `${COLORS.red}[ERROR]${COLORS.default} ${moduleName}`;
|
|
91
92
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
const result = new class implements WrappedLogger {
|
|
94
|
+
public init() {
|
|
95
|
+
isTrace = [ 'trace' ].includes(_level ?? defaultLevel);
|
|
96
|
+
isDebug = [ 'trace', 'debug' ].includes(_level ?? defaultLevel);
|
|
97
|
+
isInfo = [ 'trace', 'debug', 'info' ].includes(_level ?? defaultLevel);
|
|
98
|
+
isWarning = [ 'trace', 'debug', 'info', 'warn' ].includes(_level ?? defaultLevel);
|
|
99
|
+
isError = [ 'trace', 'debug', 'info', 'warn', 'error' ].includes(_level ?? defaultLevel);
|
|
100
|
+
}
|
|
100
101
|
public get logger() {
|
|
101
102
|
return _logger;
|
|
102
103
|
}
|
|
103
104
|
public set logger(value: Logger) {
|
|
104
105
|
_logger = value;
|
|
105
106
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
134
|
-
warn(...args: any[]): void {
|
|
135
|
-
if (isWarning) {
|
|
136
|
-
const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`
|
|
137
|
-
logger.warn(warnPrefix, ...args, elapsedInMs);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
141
|
-
error(...args: any[]): void {
|
|
142
|
-
if (isError) {
|
|
143
|
-
const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`
|
|
144
|
-
logger.error(errorPrefix, ...args, elapsedInMs);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
return result;
|
|
150
|
-
}
|
|
107
|
+
public get level(): LogLevel | undefined {
|
|
108
|
+
return _level;
|
|
109
|
+
}
|
|
110
|
+
public set level(value: LogLevel | undefined) {
|
|
111
|
+
_level = value;
|
|
112
|
+
}
|
|
113
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
114
|
+
trace(...args: any[]): void {
|
|
115
|
+
if (isTrace) {
|
|
116
|
+
const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`;
|
|
117
|
+
|
|
118
|
+
logger.trace(tracePrefix, ...args, elapsedInMs);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
122
|
+
debug(...args: any[]): void {
|
|
123
|
+
if (isDebug) {
|
|
124
|
+
const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`;
|
|
125
|
+
|
|
126
|
+
logger.debug(debugPrefix, ...args, elapsedInMs);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
130
|
+
info(...args: any[]): void {
|
|
131
|
+
if (isInfo) {
|
|
132
|
+
const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`;
|
|
151
133
|
|
|
134
|
+
logger.info(infoPrefix, ...args, elapsedInMs);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
138
|
+
warn(...args: any[]): void {
|
|
139
|
+
if (isWarning) {
|
|
140
|
+
const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`;
|
|
141
|
+
|
|
142
|
+
logger.warn(warnPrefix, ...args, elapsedInMs);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
146
|
+
error(...args: any[]): void {
|
|
147
|
+
if (isError) {
|
|
148
|
+
const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`;
|
|
149
|
+
|
|
150
|
+
logger.error(errorPrefix, ...args, elapsedInMs);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
return result;
|
|
157
|
+
};
|
|
152
158
|
|
|
153
159
|
let actualLoggerFactory: LoggerFactory = createDefaultLoggerFactory();
|
|
154
160
|
const loggers = new Map<string, WrappedLogger>();
|
|
155
161
|
|
|
156
162
|
export const createLogger = (moduleName: string, logLevel?: LogLevel) => {
|
|
157
163
|
let wrappedLogger = loggers.get(moduleName);
|
|
164
|
+
|
|
158
165
|
if (!wrappedLogger) {
|
|
159
|
-
|
|
166
|
+
const logger = actualLoggerFactory();
|
|
167
|
+
|
|
160
168
|
wrappedLogger = wrapLogger(logger, moduleName, logLevel ?? defaultLevel);
|
|
161
169
|
loggers.set(moduleName, wrappedLogger);
|
|
162
170
|
} else {
|
|
163
171
|
wrappedLogger.level = logLevel ?? defaultLevel;
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
172
|
+
}
|
|
173
|
+
wrappedLogger.init();
|
|
174
|
+
|
|
175
|
+
return wrappedLogger;
|
|
176
|
+
};
|
|
168
177
|
|
|
169
178
|
export const setLogLevel = (level: LogLevel) => {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
179
|
+
defaultLevel = level;
|
|
180
|
+
for (const [ moduleName ] of Array.from(loggers.entries())) {
|
|
181
|
+
loggers.set(moduleName, createLogger(moduleName, level));
|
|
182
|
+
}
|
|
174
183
|
};
|
|
175
184
|
|
|
176
185
|
export const setLoggerFactory = (loggerFactory: LoggerFactory) => {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
186
|
+
actualLoggerFactory = loggerFactory;
|
|
187
|
+
for (const [ moduleName, logger ] of Array.from(loggers.entries())) {
|
|
188
|
+
loggers.set(moduleName, createLogger(moduleName, logger.level));
|
|
189
|
+
}
|
|
181
190
|
};
|
|
182
191
|
|
|
183
192
|
export const getLogLevel = () => {
|
|
184
|
-
|
|
185
|
-
}
|
|
186
|
-
|
|
193
|
+
return defaultLevel;
|
|
194
|
+
};
|
package/src/common/types.ts
CHANGED
package/src/common/utils.ts
CHANGED
|
@@ -10,5 +10,16 @@ export function iteratorConverter<T>(generator: Generator<T, void, undefined>):
|
|
|
10
10
|
next(): IteratorResult<T> {
|
|
11
11
|
return generator.next();
|
|
12
12
|
},
|
|
13
|
-
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function asyncIteratorConverter<T>(generator: AsyncGenerator<T, void, undefined>): AsyncIterableIterator<T> {
|
|
17
|
+
return {
|
|
18
|
+
[Symbol.asyncIterator](): AsyncIterableIterator<T> {
|
|
19
|
+
return this;
|
|
20
|
+
},
|
|
21
|
+
next(): Promise<IteratorResult<T>> {
|
|
22
|
+
return generator.next();
|
|
23
|
+
},
|
|
24
|
+
};
|
|
14
25
|
}
|
|
@@ -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 { asyncIteratorConverter } from '../common/utils';
|
|
5
|
+
import { ClientEntry, createClientEntry } from './ClientEntry';
|
|
6
|
+
|
|
7
|
+
export const logger = createLogger('CallWrapper');
|
|
8
|
+
|
|
9
|
+
export type CallEntry = ReturnType<typeof createCallEntry>;
|
|
10
|
+
|
|
11
|
+
export function createCallEntry(storageProvider: StorageProvider, model?: Models.Call) {
|
|
12
|
+
if (!model) return;
|
|
13
|
+
const {
|
|
14
|
+
callId,
|
|
15
|
+
roomId,
|
|
16
|
+
serviceId,
|
|
17
|
+
started,
|
|
18
|
+
} = model;
|
|
19
|
+
|
|
20
|
+
if (!callId) return logger.warn(`Call model without callId: ${JSON.stringify(model)}`);
|
|
21
|
+
if (!roomId) return logger.warn(`Call model without roomId: ${JSON.stringify(model)}`);
|
|
22
|
+
if (!serviceId) return logger.warn(`Call model without serviceId: ${JSON.stringify(model)}`);
|
|
23
|
+
if (!started) return logger.warn(`Call model without started: ${JSON.stringify(model)}`);
|
|
24
|
+
|
|
25
|
+
const getClient = async (clientId: string) => {
|
|
26
|
+
return model.clientIds.includes(clientId) ? createClientEntry(storageProvider, await storageProvider.clientStorage.get(clientId)) : undefined;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const asyncClientsGenerator = async function *(providedClientIds?: string[]) {
|
|
30
|
+
const { clientStorage } = storageProvider;
|
|
31
|
+
const clientModels = await Promise.all(
|
|
32
|
+
(providedClientIds ?? model.clientIds).map((clientId) => clientStorage.get(clientId))
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
for (const clientModel of clientModels) {
|
|
36
|
+
if (!clientModel) continue;
|
|
37
|
+
yield createClientEntry(storageProvider, clientModel);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
callId,
|
|
43
|
+
roomId,
|
|
44
|
+
serviceId,
|
|
45
|
+
started,
|
|
46
|
+
get clientIds(): ReadonlyArray<string> {
|
|
47
|
+
return model.clientIds;
|
|
48
|
+
},
|
|
49
|
+
getClient,
|
|
50
|
+
get clients(): AsyncIterableIterator<ClientEntry> {
|
|
51
|
+
return asyncIteratorConverter<ClientEntry>(asyncClientsGenerator());
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
refresh: async () => {
|
|
55
|
+
const refreshedModel = await storageProvider.callStorage.get(callId);
|
|
56
|
+
|
|
57
|
+
if (!refreshedModel) return;
|
|
58
|
+
|
|
59
|
+
model.clientIds = refreshedModel.clientIds;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
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 { PeerConnectionEntry, createPeerConnectionEntry } from './PeerConnectionEntry';
|
|
6
|
+
|
|
7
|
+
export type ClientEntry = ReturnType<typeof createClientEntry>;
|
|
8
|
+
|
|
9
|
+
export function createClientEntry(storageProvider: StorageProvider, model?: Models.Client) {
|
|
10
|
+
if (!model) return;
|
|
11
|
+
|
|
12
|
+
const {
|
|
13
|
+
clientId,
|
|
14
|
+
roomId,
|
|
15
|
+
serviceId,
|
|
16
|
+
mediaUnitId,
|
|
17
|
+
callId,
|
|
18
|
+
joined,
|
|
19
|
+
timeZoneId,
|
|
20
|
+
} = model;
|
|
21
|
+
|
|
22
|
+
if (!callId) return logger.warn(`Client model without callId: ${JSON.stringify(model)}`);
|
|
23
|
+
if (!roomId) return logger.warn(`Client model without roomId: ${JSON.stringify(model)}`);
|
|
24
|
+
if (!clientId) return logger.warn(`Client model without clientId: ${JSON.stringify(model)}`);
|
|
25
|
+
if (!serviceId) return logger.warn(`Client model without serviceId: ${JSON.stringify(model)}`);
|
|
26
|
+
if (!mediaUnitId) return logger.warn(`Client model without mediaUnitId: ${JSON.stringify(model)}`);
|
|
27
|
+
|
|
28
|
+
const getCall = async () => {
|
|
29
|
+
return createCallEntry(storageProvider, await storageProvider.callStorage.get(callId));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const asyncPeerConnectionGenerator = async function *(providedPeerConnectionIds?: string[]) {
|
|
33
|
+
const peerConnectionModels = await Promise.all(
|
|
34
|
+
(providedPeerConnectionIds ?? model.peerConnectionIds).map((peerConnectionId) => storageProvider.peerConnectionStorage.get(peerConnectionId))
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
for (const peerConnectionModel of peerConnectionModels) {
|
|
38
|
+
if (!peerConnectionModel) continue;
|
|
39
|
+
yield createPeerConnectionEntry(storageProvider, peerConnectionModel);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
clientId,
|
|
45
|
+
roomId,
|
|
46
|
+
serviceId,
|
|
47
|
+
mediaUnitId,
|
|
48
|
+
callId,
|
|
49
|
+
joined,
|
|
50
|
+
timeZoneId,
|
|
51
|
+
get browser() {
|
|
52
|
+
return model.browser;
|
|
53
|
+
},
|
|
54
|
+
get engine() {
|
|
55
|
+
return model.engine;
|
|
56
|
+
},
|
|
57
|
+
get operationSystem() {
|
|
58
|
+
return model.operationSystem;
|
|
59
|
+
},
|
|
60
|
+
get platform() {
|
|
61
|
+
return model.platform;
|
|
62
|
+
},
|
|
63
|
+
get peerConnectionIds(): ReadonlyArray<string> {
|
|
64
|
+
return model.peerConnectionIds;
|
|
65
|
+
},
|
|
66
|
+
get marker() {
|
|
67
|
+
return model.marker;
|
|
68
|
+
},
|
|
69
|
+
getCall,
|
|
70
|
+
get peerConnections(): AsyncIterableIterator<PeerConnectionEntry> {
|
|
71
|
+
return asyncIteratorConverter<PeerConnectionEntry>(asyncPeerConnectionGenerator());
|
|
72
|
+
},
|
|
73
|
+
getPeerConnection: async (peerConnectionId: string) => {
|
|
74
|
+
return model.peerConnectionIds.includes(peerConnectionId) ? createPeerConnectionEntry(storageProvider, await storageProvider.peerConnectionStorage.get(peerConnectionId)) : undefined;
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
refresh: async () => {
|
|
78
|
+
const refreshedModel = await storageProvider.clientStorage.get(clientId);
|
|
79
|
+
|
|
80
|
+
if (!refreshedModel) return;
|
|
81
|
+
|
|
82
|
+
model.browser = refreshedModel.browser;
|
|
83
|
+
model.engine = refreshedModel.engine;
|
|
84
|
+
model.operationSystem = refreshedModel.operationSystem;
|
|
85
|
+
model.platform = refreshedModel.platform;
|
|
86
|
+
model.peerConnectionIds = refreshedModel.peerConnectionIds;
|
|
87
|
+
model.marker = refreshedModel.marker;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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('InboundTrackWrapper');
|
|
9
|
+
|
|
10
|
+
export type InboundTrackEntry = ReturnType<typeof createInboundTrackEntry>;
|
|
11
|
+
|
|
12
|
+
export function createInboundTrackEntry(storageProvider: StorageProvider, model?: Models.InboundTrack) {
|
|
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(`InboundTrack model without callId: ${JSON.stringify(model)}`);
|
|
23
|
+
if (!clientId) return logger.warn(`InboundTrack model without clientId: ${JSON.stringify(model)}`);
|
|
24
|
+
if (!peerConnectionId) return logger.warn(`InboundTrack model without peerConnectionId: ${JSON.stringify(model)}`);
|
|
25
|
+
if (!trackId) return logger.warn(`InboundTrack model without trackId: ${JSON.stringify(model)}`);
|
|
26
|
+
if (!kind) return logger.warn(`InboundTrack model without kind: ${JSON.stringify(model)}`);
|
|
27
|
+
|
|
28
|
+
const direction = 'inbound' 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
|
+
async refresh() {
|
|
63
|
+
const refreshedModel = await storageProvider.inboundTrackStorage.get(trackId);
|
|
64
|
+
|
|
65
|
+
if (!refreshedModel) return;
|
|
66
|
+
|
|
67
|
+
model.audioStats = refreshedModel.audioStats;
|
|
68
|
+
model.videoStats = refreshedModel.videoStats;
|
|
69
|
+
model.marker = refreshedModel.marker;
|
|
70
|
+
model.ssrc = refreshedModel.ssrc;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
};
|
|
74
|
+
}
|