@observertc/observer-js 0.9.21-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.
Files changed (212) hide show
  1. package/.eslintrc.json +143 -0
  2. package/lib/Evaluator.d.ts.map +1 -1
  3. package/lib/Evaluator.js +54 -47
  4. package/lib/Observer.d.ts +1404 -38
  5. package/lib/Observer.d.ts.map +1 -1
  6. package/lib/Observer.js +479 -176
  7. package/lib/common/Semaphore.d.ts.map +1 -1
  8. package/lib/common/callMetaReports.d.ts.map +1 -1
  9. package/lib/common/callMetaReports.js +1 -0
  10. package/lib/common/logger.d.ts.map +1 -1
  11. package/lib/common/logger.js +15 -15
  12. package/lib/common/utils.d.ts +1 -0
  13. package/lib/common/utils.d.ts.map +1 -1
  14. package/lib/common/utils.js +12 -1
  15. package/lib/entries/CallEntry.d.ts +611 -0
  16. package/lib/entries/CallEntry.d.ts.map +1 -0
  17. package/lib/entries/CallEntry.js +75 -0
  18. package/lib/entries/ClientEntry.d.ts +474 -0
  19. package/lib/entries/ClientEntry.d.ts.map +1 -0
  20. package/lib/entries/ClientEntry.js +101 -0
  21. package/lib/entries/InboundTrackEntry.d.ts +670 -0
  22. package/lib/entries/InboundTrackEntry.d.ts.map +1 -0
  23. package/lib/entries/InboundTrackEntry.js +76 -0
  24. package/lib/entries/OutboundTrackEntry.d.ts +670 -0
  25. package/lib/entries/OutboundTrackEntry.d.ts.map +1 -0
  26. package/lib/entries/OutboundTrackEntry.js +73 -0
  27. package/lib/entries/PeerConnectionEntry.d.ts +469 -0
  28. package/lib/entries/PeerConnectionEntry.d.ts.map +1 -0
  29. package/lib/entries/PeerConnectionEntry.js +144 -0
  30. package/lib/entries/SfuEntry.d.ts +150 -0
  31. package/lib/entries/SfuEntry.d.ts.map +1 -0
  32. package/lib/entries/SfuEntry.js +77 -0
  33. package/lib/entries/SfuInboundRtpPadEntry.d.ts +14 -0
  34. package/lib/entries/SfuInboundRtpPadEntry.d.ts.map +1 -0
  35. package/lib/entries/SfuInboundRtpPadEntry.js +49 -0
  36. package/lib/entries/SfuOutboundRtpPadEntry.d.ts +14 -0
  37. package/lib/entries/SfuOutboundRtpPadEntry.d.ts.map +1 -0
  38. package/lib/entries/SfuOutboundRtpPadEntry.js +47 -0
  39. package/lib/entries/SfuSctpChannelEntry.d.ts +12 -0
  40. package/lib/entries/SfuSctpChannelEntry.d.ts.map +1 -0
  41. package/lib/entries/SfuSctpChannelEntry.js +43 -0
  42. package/lib/entries/SfuTransportEntry.d.ts +82 -0
  43. package/lib/entries/SfuTransportEntry.d.ts.map +1 -0
  44. package/lib/entries/SfuTransportEntry.js +122 -0
  45. package/lib/index.d.ts +10 -0
  46. package/lib/index.d.ts.map +1 -1
  47. package/lib/middlewares/CallOperationsContext.d.ts.map +1 -1
  48. package/lib/middlewares/CallOperationsContext.js +2 -6
  49. package/lib/middlewares/CallProcessor.d.ts.map +1 -1
  50. package/lib/middlewares/CallProcessor.js +15 -6
  51. package/lib/middlewares/CommitTransactionMiddleware.d.ts.map +1 -1
  52. package/lib/middlewares/CommitTransactionMiddleware.js +22 -26
  53. package/lib/middlewares/DeleteOutdatedCallEntries.d.ts.map +1 -1
  54. package/lib/middlewares/DeleteOutdatedCallEntries.js +29 -20
  55. package/lib/middlewares/DeleteOutdatedSfuEntries.d.ts.map +1 -1
  56. package/lib/middlewares/DeleteOutdatedSfuEntries.js +27 -18
  57. package/lib/middlewares/Middleware.d.ts.map +1 -1
  58. package/lib/middlewares/Middleware.js +13 -4
  59. package/lib/middlewares/Processor.d.ts.map +1 -1
  60. package/lib/middlewares/Processor.js +18 -9
  61. package/lib/middlewares/TransactionContext.d.ts.map +1 -1
  62. package/lib/middlewares/TransactionContext.js +84 -73
  63. package/lib/middlewares/VisitObservedCallsMiddleware.d.ts.map +1 -1
  64. package/lib/middlewares/VisitObservedCallsMiddleware.js +16 -7
  65. package/lib/middlewares/VisitObservedSfusMiddleware.d.ts.map +1 -1
  66. package/lib/middlewares/VisitObservedSfusMiddleware.js +15 -6
  67. package/lib/middlewares/visitors/visitClient.d.ts.map +1 -1
  68. package/lib/middlewares/visitors/visitClient.js +6 -18
  69. package/lib/middlewares/visitors/visitInboundAudioTrack.d.ts.map +1 -1
  70. package/lib/middlewares/visitors/visitInboundAudioTrack.js +17 -20
  71. package/lib/middlewares/visitors/visitInboundVideoTrack.d.ts.map +1 -1
  72. package/lib/middlewares/visitors/visitInboundVideoTrack.js +16 -21
  73. package/lib/middlewares/visitors/visitOutboundAudioTrack.d.ts.map +1 -1
  74. package/lib/middlewares/visitors/visitOutboundAudioTrack.js +16 -16
  75. package/lib/middlewares/visitors/visitOutboundVideoTarck.d.ts.map +1 -1
  76. package/lib/middlewares/visitors/visitOutboundVideoTarck.js +16 -17
  77. package/lib/middlewares/visitors/visitPeerConnection.d.ts.map +1 -1
  78. package/lib/middlewares/visitors/visitPeerConnection.js +24 -40
  79. package/lib/middlewares/visitors/visitSfu.d.ts.map +1 -1
  80. package/lib/middlewares/visitors/visitSfu.js +6 -7
  81. package/lib/middlewares/visitors/visitSfuInboundRtpPad.d.ts.map +1 -1
  82. package/lib/middlewares/visitors/visitSfuInboundRtpPad.js +3 -7
  83. package/lib/middlewares/visitors/visitSfuOutboundRtpPad.d.ts.map +1 -1
  84. package/lib/middlewares/visitors/visitSfuOutboundRtpPad.js +3 -8
  85. package/lib/middlewares/visitors/visitSfuSctpChannel.d.ts.map +1 -1
  86. package/lib/middlewares/visitors/visitSfuSctpChannel.js +3 -6
  87. package/lib/middlewares/visitors/visitSfuTransport.d.ts.map +1 -1
  88. package/lib/middlewares/visitors/visitSfuTransport.js +3 -6
  89. package/lib/processes/closePeerConnectionProcess.d.ts.map +1 -1
  90. package/lib/processes/closePeerConnectionProcess.js +14 -5
  91. package/lib/processes/detachClientProcess.d.ts.map +1 -1
  92. package/lib/processes/detachClientProcess.js +20 -17
  93. package/lib/processes/findRemoteMatches.d.ts +2 -2
  94. package/lib/processes/findRemoteMatches.d.ts.map +1 -1
  95. package/lib/processes/findRemoteMatches.js +70 -56
  96. package/lib/processes/inboundTrackRemoved.d.ts.map +1 -1
  97. package/lib/processes/inboundTrackRemoved.js +12 -3
  98. package/lib/processes/joinClientProcess.d.ts.map +1 -1
  99. package/lib/processes/joinClientProcess.js +15 -6
  100. package/lib/processes/outboundTrackRemoved.d.ts.map +1 -1
  101. package/lib/processes/outboundTrackRemoved.js +12 -3
  102. package/lib/samples/ObservedCall.d.ts.map +1 -1
  103. package/lib/samples/ObservedCall.js +1 -5
  104. package/lib/samples/ObservedCalls.d.ts.map +1 -1
  105. package/lib/samples/ObservedClient.d.ts.map +1 -1
  106. package/lib/samples/ObservedClient.js +1 -9
  107. package/lib/samples/ObservedInboundAudioTrack.d.ts.map +1 -1
  108. package/lib/samples/ObservedInboundAudioTrack.js +1 -5
  109. package/lib/samples/ObservedInboundVideoTrack.d.ts.map +1 -1
  110. package/lib/samples/ObservedInboundVideoTrack.js +1 -5
  111. package/lib/samples/ObservedOutboundAudioTrack.d.ts.map +1 -1
  112. package/lib/samples/ObservedOutboundAudioTrack.js +1 -5
  113. package/lib/samples/ObservedOutboundVideoTrack.d.ts.map +1 -1
  114. package/lib/samples/ObservedOutboundVideoTrack.js +1 -5
  115. package/lib/samples/ObservedPeerConnection.d.ts.map +1 -1
  116. package/lib/samples/ObservedPeerConnection.js +1 -12
  117. package/lib/samples/ObservedSfu.d.ts.map +1 -1
  118. package/lib/samples/ObservedSfu.js +1 -8
  119. package/lib/samples/ObservedSfuInboundRtpPad.d.ts.map +1 -1
  120. package/lib/samples/ObservedSfuInboundRtpPad.js +1 -5
  121. package/lib/samples/ObservedSfuOutboundRtpPad.d.ts.map +1 -1
  122. package/lib/samples/ObservedSfuOutboundRtpPad.js +1 -5
  123. package/lib/samples/ObservedSfuSctpChannel.d.ts.map +1 -1
  124. package/lib/samples/ObservedSfuSctpChannel.js +1 -5
  125. package/lib/samples/ObservedSfuTransport.d.ts.map +1 -1
  126. package/lib/samples/ObservedSfuTransport.js +1 -8
  127. package/lib/samples/ObservedSfus.d.ts.map +1 -1
  128. package/lib/sinks/ObserverSink.d.ts.map +1 -1
  129. package/lib/sinks/ObserverSink.js +42 -31
  130. package/lib/sinks/callEventReports.js +1 -0
  131. package/lib/sources/ObservedCallSource.d.ts +5 -3
  132. package/lib/sources/ObservedCallSource.d.ts.map +1 -1
  133. package/lib/sources/ObservedClientSource.d.ts +3 -2
  134. package/lib/sources/ObservedClientSource.d.ts.map +1 -1
  135. package/lib/sources/ObservedSfuSource.d.ts +3 -2
  136. package/lib/sources/ObservedSfuSource.d.ts.map +1 -1
  137. package/lib/sources/Sources.d.ts +8 -4
  138. package/lib/sources/Sources.d.ts.map +1 -1
  139. package/lib/sources/Sources.js +71 -46
  140. package/lib/storages/ObserverStorage.d.ts.map +1 -1
  141. package/lib/storages/SimpleStorage.d.ts.map +1 -1
  142. package/lib/storages/SimpleStorage.js +40 -23
  143. package/package.json +1 -1
  144. package/src/Evaluator.ts +17 -9
  145. package/src/Observer.ts +230 -170
  146. package/src/common/Semaphore.ts +2 -0
  147. package/src/common/callMetaReports.ts +30 -28
  148. package/src/common/logger.ts +140 -132
  149. package/src/common/types.ts +1 -1
  150. package/src/common/utils.ts +12 -1
  151. package/src/entries/CallEntry.ts +62 -0
  152. package/src/entries/ClientEntry.ts +90 -0
  153. package/src/entries/InboundTrackEntry.ts +74 -0
  154. package/src/entries/OutboundTrackEntry.ts +72 -0
  155. package/src/entries/PeerConnectionEntry.ts +133 -0
  156. package/src/entries/SfuEntry.ts +62 -0
  157. package/src/entries/SfuInboundRtpPadEntry.ts +46 -0
  158. package/src/entries/SfuOutboundRtpPadEntry.ts +44 -0
  159. package/src/entries/SfuSctpChannelEntry.ts +39 -0
  160. package/src/entries/SfuTransportEntry.ts +109 -0
  161. package/src/index.ts +11 -0
  162. package/src/middlewares/CallOperationsContext.ts +9 -5
  163. package/src/middlewares/CallProcessor.ts +4 -2
  164. package/src/middlewares/CommitTransactionMiddleware.ts +8 -5
  165. package/src/middlewares/DeleteOutdatedCallEntries.ts +24 -16
  166. package/src/middlewares/DeleteOutdatedSfuEntries.ts +24 -15
  167. package/src/middlewares/Middleware.ts +1 -0
  168. package/src/middlewares/Processor.ts +10 -5
  169. package/src/middlewares/TransactionContext.ts +1 -2
  170. package/src/middlewares/VisitObservedCallsMiddleware.ts +5 -2
  171. package/src/middlewares/VisitObservedSfusMiddleware.ts +8 -7
  172. package/src/middlewares/visitors/visitClient.ts +15 -1
  173. package/src/middlewares/visitors/visitInboundAudioTrack.ts +4 -1
  174. package/src/middlewares/visitors/visitInboundVideoTrack.ts +5 -1
  175. package/src/middlewares/visitors/visitOutboundAudioTrack.ts +5 -1
  176. package/src/middlewares/visitors/visitOutboundVideoTarck.ts +5 -1
  177. package/src/middlewares/visitors/visitPeerConnection.ts +15 -2
  178. package/src/middlewares/visitors/visitSfu.ts +7 -1
  179. package/src/middlewares/visitors/visitSfuInboundRtpPad.ts +4 -2
  180. package/src/middlewares/visitors/visitSfuOutboundRtpPad.ts +3 -1
  181. package/src/middlewares/visitors/visitSfuSctpChannel.ts +23 -21
  182. package/src/middlewares/visitors/visitSfuTransport.ts +3 -1
  183. package/src/processes/closePeerConnectionProcess.ts +3 -0
  184. package/src/processes/detachClientProcess.ts +13 -4
  185. package/src/processes/findRemoteMatches.ts +32 -21
  186. package/src/processes/inboundTrackRemoved.ts +2 -0
  187. package/src/processes/joinClientProcess.ts +8 -2
  188. package/src/processes/outboundTrackRemoved.ts +2 -0
  189. package/src/samples/ObservedCall.ts +6 -0
  190. package/src/samples/ObservedCalls.ts +13 -7
  191. package/src/samples/ObservedClient.ts +24 -8
  192. package/src/samples/ObservedInboundAudioTrack.ts +3 -2
  193. package/src/samples/ObservedInboundVideoTrack.ts +3 -2
  194. package/src/samples/ObservedOutboundAudioTrack.ts +3 -2
  195. package/src/samples/ObservedOutboundVideoTrack.ts +3 -2
  196. package/src/samples/ObservedPeerConnection.ts +27 -11
  197. package/src/samples/ObservedSfu.ts +17 -10
  198. package/src/samples/ObservedSfuInboundRtpPad.ts +5 -4
  199. package/src/samples/ObservedSfuOutboundRtpPad.ts +5 -4
  200. package/src/samples/ObservedSfuSctpChannel.ts +13 -13
  201. package/src/samples/ObservedSfuTransport.ts +19 -7
  202. package/src/samples/ObservedSfus.ts +10 -5
  203. package/src/sinks/ObserverSink.ts +51 -44
  204. package/src/sinks/callEventReports.ts +1 -1
  205. package/src/sources/ObservedCallSource.ts +6 -5
  206. package/src/sources/ObservedClientSource.ts +3 -2
  207. package/src/sources/ObservedSfuSource.ts +4 -8
  208. package/src/sources/Sources.ts +96 -22
  209. package/src/storages/ObserverStorage.ts +1 -0
  210. package/src/storages/SimpleStorage.ts +44 -21
  211. package/tsconfig.json +7 -5
  212. 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
- type: CallMetaType.CERTIFICATE;
36
- payload: Certificate;
36
+ type: CallMetaType.CERTIFICATE;
37
+ payload: Certificate;
37
38
  } | {
38
- type: CallMetaType.CODEC;
39
- payload: MediaCodecStats;
39
+ type: CallMetaType.CODEC;
40
+ payload: MediaCodecStats;
40
41
  } | {
41
- type: CallMetaType.ICE_LOCAL_CANDIDATE;
42
- payload: IceLocalCandidate;
42
+ type: CallMetaType.ICE_LOCAL_CANDIDATE;
43
+ payload: IceLocalCandidate;
43
44
  } | {
44
- type: CallMetaType.ICE_REMOTE_CANDIDATE;
45
- payload: IceRemoteCandidate;
45
+ type: CallMetaType.ICE_REMOTE_CANDIDATE;
46
+ payload: IceRemoteCandidate;
46
47
  } | {
47
- type: CallMetaType.ICE_SERVER;
48
- payload: string;
48
+ type: CallMetaType.ICE_SERVER;
49
+ payload: string;
49
50
  } | {
50
- type: CallMetaType.MEDIA_CONSTRAINT;
51
- payload: string;
51
+ type: CallMetaType.MEDIA_CONSTRAINT;
52
+ payload: string;
52
53
  } | {
53
- type: CallMetaType.MEDIA_DEVICE;
54
- payload: MediaDevice;
54
+ type: CallMetaType.MEDIA_DEVICE;
55
+ payload: MediaDevice;
55
56
  } | {
56
- type: CallMetaType.MEDIA_SOURCE;
57
- payload: MediaSourceStat;
57
+ type: CallMetaType.MEDIA_SOURCE;
58
+ payload: MediaSourceStat;
58
59
  } | {
59
- type: CallMetaType.USER_MEDIA_ERROR;
60
- payload: string;
60
+ type: CallMetaType.USER_MEDIA_ERROR;
61
+ payload: string;
61
62
  } | {
62
- type: CallMetaType.OPERATION_SYSTEM;
63
- payload: OperationSystem;
63
+ type: CallMetaType.OPERATION_SYSTEM;
64
+ payload: OperationSystem;
64
65
  } | {
65
- type: CallMetaType.PLATFORM;
66
- payload: Platform;
66
+ type: CallMetaType.PLATFORM;
67
+ payload: Platform;
67
68
  } | {
68
- type: CallMetaType.ENGINE;
69
- payload: Engine;
69
+ type: CallMetaType.ENGINE;
70
+ payload: Engine;
70
71
  } | {
71
- type: CallMetaType.LOCAL_SDP;
72
- payload: string;
72
+ type: CallMetaType.LOCAL_SDP;
73
+ payload: string;
73
74
  } | {
74
- type: CallMetaType.BROWSER;
75
- payload: Browser;
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
  }
@@ -1,186 +1,194 @@
1
1
  export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';
2
2
 
3
3
  export interface Logger {
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;
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
- init(): void;
18
- level: LogLevel | undefined,
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
- 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",
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 = "error";
36
+ let defaultLevel: LogLevel = 'error';
37
37
  const created = Date.now();
38
38
 
39
39
  function createDefaultLoggerFactory(): LoggerFactory {
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
- return {
67
- trace,
68
- debug,
69
- info,
70
- warn,
71
- error,
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
- let isTrace = false;
79
- let isDebug = false
80
- let isInfo = false
81
- let isWarning = false;
82
- let isError = false;
79
+ let isTrace = false;
80
+ let isDebug = false;
81
+ let isInfo = false;
82
+ let isWarning = false;
83
+ let isError = false;
83
84
 
84
- let _level = logLevel;
85
- let _logger = logger;
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
- const result = new class implements WrappedLogger {
93
- public init() {
94
- isTrace = ["trace"].includes(_level ?? defaultLevel);
95
- isDebug = ["trace", "debug"].includes(_level ?? defaultLevel);
96
- isInfo = ["trace", "debug", "info"].includes(_level ?? defaultLevel);
97
- isWarning = ["trace", "debug", "info", "warn"].includes(_level ?? defaultLevel);
98
- isError = ["trace", "debug", "info", "warn", "error"].includes(_level ?? defaultLevel);
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
- public get level(): LogLevel | undefined {
107
- return _level;
108
- }
109
- public set level(value: LogLevel | undefined) {
110
- _level = value;
111
- }
112
- /* eslint-disable @typescript-eslint/no-explicit-any */
113
- trace(...args: any[]): void {
114
- if (isTrace) {
115
- const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`
116
- logger.trace(tracePrefix, ...args, elapsedInMs);
117
- }
118
- }
119
- /* eslint-disable @typescript-eslint/no-explicit-any */
120
- debug(...args: any[]): void {
121
- if (isDebug) {
122
- const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`
123
- logger.debug(debugPrefix, ...args, elapsedInMs);
124
- }
125
- }
126
- /* eslint-disable @typescript-eslint/no-explicit-any */
127
- info(...args: any[]): void {
128
- if (isInfo) {
129
- const elapsedInMs = `${COLORS.magenta}+${Date.now() - created}ms${COLORS.default}`
130
- logger.info(infoPrefix, ...args, elapsedInMs);
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
- const logger = actualLoggerFactory();
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
- wrappedLogger.init();
166
- return wrappedLogger;
167
- }
172
+ }
173
+ wrappedLogger.init();
174
+
175
+ return wrappedLogger;
176
+ };
168
177
 
169
178
  export const setLogLevel = (level: LogLevel) => {
170
- defaultLevel = level;
171
- for (const [moduleName] of Array.from(loggers.entries())) {
172
- loggers.set(moduleName, createLogger(moduleName, level));
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
- actualLoggerFactory = loggerFactory;
178
- for (const [moduleName, logger] of Array.from(loggers.entries())) {
179
- loggers.set(moduleName, createLogger(moduleName, logger.level));
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
- return defaultLevel;
185
- }
186
-
193
+ return defaultLevel;
194
+ };
@@ -131,4 +131,4 @@ export interface ObserverSinkContext {
131
131
  readonly sfuMetaReports: SfuMetaReport[];
132
132
  }
133
133
 
134
- export type ObserverSinkMiddleware = Middleware<ObserverSinkContext>;
134
+ export type ObserverSinkMiddleware = Middleware<ObserverSinkContext>;
@@ -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
+ }