@observertc/observer-js 0.42.8 → 1.0.1-1b9b3c5.0

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 (295) hide show
  1. package/.prettierrc +6 -6
  2. package/README.md +0 -104
  3. package/lib/ObservedCall.d.ts +63 -43
  4. package/lib/ObservedCall.d.ts.map +1 -1
  5. package/lib/ObservedCall.js +176 -108
  6. package/lib/ObservedCallEventMonitor.d.ts +103 -0
  7. package/lib/ObservedCallEventMonitor.d.ts.map +1 -0
  8. package/lib/ObservedCallEventMonitor.js +312 -0
  9. package/lib/ObservedCallSummary.d.ts +18 -0
  10. package/lib/ObservedCallSummary.d.ts.map +1 -0
  11. package/lib/ObservedCertificate.d.ts +19 -0
  12. package/lib/ObservedCertificate.d.ts.map +1 -0
  13. package/lib/ObservedCertificate.js +38 -0
  14. package/lib/ObservedClient.d.ts +79 -130
  15. package/lib/ObservedClient.d.ts.map +1 -1
  16. package/lib/ObservedClient.js +463 -744
  17. package/lib/ObservedClientEventMonitor.d.ts +89 -0
  18. package/lib/ObservedClientEventMonitor.d.ts.map +1 -0
  19. package/lib/ObservedClientEventMonitor.js +247 -0
  20. package/lib/ObservedClientSummary.d.ts +23 -0
  21. package/lib/ObservedClientSummary.d.ts.map +1 -0
  22. package/lib/ObservedClientSummary.js +2 -0
  23. package/lib/ObservedCodec.d.ts +22 -0
  24. package/lib/ObservedCodec.d.ts.map +1 -0
  25. package/lib/ObservedCodec.js +45 -0
  26. package/lib/ObservedDataChannel.d.ts +25 -69
  27. package/lib/ObservedDataChannel.d.ts.map +1 -1
  28. package/lib/ObservedDataChannel.js +69 -109
  29. package/lib/ObservedIceCandidate.d.ts +29 -0
  30. package/lib/ObservedIceCandidate.d.ts.map +1 -0
  31. package/lib/ObservedIceCandidate.js +59 -0
  32. package/lib/ObservedIceCandidatePair.d.ts +44 -0
  33. package/lib/ObservedIceCandidatePair.d.ts.map +1 -0
  34. package/lib/ObservedIceCandidatePair.js +111 -0
  35. package/lib/ObservedIceTransport.d.ts +36 -0
  36. package/lib/ObservedIceTransport.d.ts.map +1 -0
  37. package/lib/ObservedIceTransport.js +93 -0
  38. package/lib/ObservedInboundRtp.d.ts +92 -0
  39. package/lib/ObservedInboundRtp.d.ts.map +1 -0
  40. package/lib/ObservedInboundRtp.js +193 -0
  41. package/lib/ObservedInboundTrack.d.ts +31 -0
  42. package/lib/ObservedInboundTrack.d.ts.map +1 -0
  43. package/lib/ObservedInboundTrack.js +59 -0
  44. package/lib/ObservedMediaPlayout.d.ts +22 -0
  45. package/lib/ObservedMediaPlayout.d.ts.map +1 -0
  46. package/lib/ObservedMediaPlayout.js +42 -0
  47. package/lib/ObservedMediaSource.d.ts +28 -0
  48. package/lib/ObservedMediaSource.d.ts.map +1 -0
  49. package/lib/ObservedMediaSource.js +55 -0
  50. package/lib/ObservedOutboundRtp.d.ts +62 -0
  51. package/lib/ObservedOutboundRtp.d.ts.map +1 -0
  52. package/lib/ObservedOutboundRtp.js +144 -0
  53. package/lib/ObservedOutboundTrack.d.ts +31 -0
  54. package/lib/ObservedOutboundTrack.d.ts.map +1 -0
  55. package/lib/ObservedOutboundTrack.js +59 -0
  56. package/lib/ObservedPeerConnection.d.ts +132 -80
  57. package/lib/ObservedPeerConnection.d.ts.map +1 -1
  58. package/lib/ObservedPeerConnection.js +646 -357
  59. package/lib/ObservedPeerConnectionTransport.d.ts +17 -0
  60. package/lib/ObservedPeerConnectionTransport.d.ts.map +1 -0
  61. package/lib/ObservedPeerConnectionTransport.js +34 -0
  62. package/lib/ObservedRemoteInboundRtp.d.ts +30 -0
  63. package/lib/ObservedRemoteInboundRtp.d.ts.map +1 -0
  64. package/lib/ObservedRemoteInboundRtp.js +60 -0
  65. package/lib/ObservedRemoteOutboundRtp.d.ts +30 -0
  66. package/lib/ObservedRemoteOutboundRtp.d.ts.map +1 -0
  67. package/lib/ObservedRemoteOutboundRtp.js +60 -0
  68. package/lib/ObservedTURN.d.ts +31 -0
  69. package/lib/ObservedTURN.d.ts.map +1 -0
  70. package/lib/ObservedTURN.js +58 -0
  71. package/lib/ObservedTurnServer.d.ts +25 -0
  72. package/lib/ObservedTurnServer.d.ts.map +1 -0
  73. package/lib/ObservedTurnServer.js +59 -0
  74. package/lib/Observer.d.ts +44 -51
  75. package/lib/Observer.d.ts.map +1 -1
  76. package/lib/Observer.js +135 -226
  77. package/lib/ObserverEventMonitor.d.ts +106 -0
  78. package/lib/ObserverEventMonitor.d.ts.map +1 -0
  79. package/lib/ObserverEventMonitor.js +320 -0
  80. package/lib/ObserverSummary.d.ts +13 -0
  81. package/lib/ObserverSummary.d.ts.map +1 -0
  82. package/lib/ObserverSummary.js +2 -0
  83. package/lib/common/Middleware.d.ts +10 -1
  84. package/lib/common/Middleware.d.ts.map +1 -1
  85. package/lib/common/Middleware.js +55 -36
  86. package/lib/common/logger.d.ts +8 -4
  87. package/lib/common/logger.d.ts.map +1 -1
  88. package/lib/common/logger.js +44 -68
  89. package/lib/common/types.d.ts +0 -21
  90. package/lib/common/types.d.ts.map +1 -1
  91. package/lib/common/types.js +1 -0
  92. package/lib/common/utils.d.ts +3 -1
  93. package/lib/common/utils.d.ts.map +1 -1
  94. package/lib/common/utils.js +23 -3
  95. package/lib/detectors/Detector.d.ts +5 -0
  96. package/lib/detectors/Detector.d.ts.map +1 -0
  97. package/lib/detectors/Detector.js +3 -0
  98. package/lib/detectors/Detectors.d.ts +11 -0
  99. package/lib/detectors/Detectors.d.ts.map +1 -0
  100. package/lib/detectors/Detectors.js +34 -0
  101. package/lib/index.d.ts +26 -24
  102. package/lib/index.d.ts.map +1 -1
  103. package/lib/index.js +45 -41
  104. package/lib/monitors/TurnUsageMonitor.d.ts +0 -52
  105. package/lib/monitors/TurnUsageMonitor.d.ts.map +1 -1
  106. package/lib/monitors/TurnUsageMonitor.js +145 -120
  107. package/lib/schema/ClientEventTypes.d.ts +160 -0
  108. package/lib/schema/ClientEventTypes.d.ts.map +1 -0
  109. package/lib/schema/ClientEventTypes.js +38 -0
  110. package/lib/schema/ClientMetaTypes.d.ts +34 -0
  111. package/lib/schema/ClientMetaTypes.d.ts.map +1 -0
  112. package/lib/schema/ClientMetaTypes.js +16 -0
  113. package/lib/schema/ClientSample.d.ts +1333 -0
  114. package/lib/schema/ClientSample.d.ts.map +1 -0
  115. package/lib/schema/ClientSample.js +4 -0
  116. package/lib/scores/CalculatedScore.d.ts +6 -0
  117. package/lib/scores/CalculatedScore.d.ts.map +1 -0
  118. package/lib/scores/CalculatedScore.js +2 -0
  119. package/lib/scores/DefaultCallScoreCalculator.d.ts +7 -0
  120. package/lib/scores/DefaultCallScoreCalculator.d.ts.map +1 -0
  121. package/lib/scores/DefaultCallScoreCalculator.js +21 -0
  122. package/lib/scores/ScoreCalculator.d.ts +4 -0
  123. package/lib/scores/ScoreCalculator.d.ts.map +1 -0
  124. package/lib/scores/ScoreCalculator.js +2 -0
  125. package/lib/updaters/CallUpdater.d.ts +5 -0
  126. package/lib/updaters/CallUpdater.d.ts.map +1 -0
  127. package/lib/updaters/CallUpdater.js +2 -0
  128. package/lib/updaters/ObserverUpdater.d.ts +5 -0
  129. package/lib/updaters/ObserverUpdater.d.ts.map +1 -0
  130. package/lib/updaters/ObserverUpdater.js +2 -0
  131. package/lib/updaters/OnAllCallObserverUpdater.d.ts +15 -0
  132. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
  133. package/lib/updaters/OnAllCallObserverUpdater.js +50 -0
  134. package/lib/updaters/OnAllClientCallUpdater.d.ts +15 -0
  135. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -0
  136. package/lib/updaters/OnAllClientCallUpdater.js +53 -0
  137. package/lib/updaters/OnAnyCallObserverUpdater.d.ts +12 -0
  138. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
  139. package/lib/updaters/OnAnyCallObserverUpdater.js +37 -0
  140. package/lib/updaters/OnAnyClientCallUpdater.d.ts +12 -0
  141. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -0
  142. package/lib/updaters/OnAnyClientCallUpdater.js +36 -0
  143. package/lib/updaters/OnIntervalUpdater.d.ts +10 -0
  144. package/lib/updaters/OnIntervalUpdater.d.ts.map +1 -0
  145. package/lib/updaters/OnIntervalUpdater.js +17 -0
  146. package/lib/updaters/Updater.d.ts +6 -0
  147. package/lib/updaters/Updater.d.ts.map +1 -0
  148. package/lib/updaters/Updater.js +2 -0
  149. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +25 -0
  150. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -0
  151. package/lib/utils/MediasoupRemoteTrackResolver.js +110 -0
  152. package/lib/utils/RemoteTrackResolver.d.ts +7 -0
  153. package/lib/utils/RemoteTrackResolver.d.ts.map +1 -0
  154. package/lib/utils/RemoteTrackResolver.js +2 -0
  155. package/package.json +4 -4
  156. package/src/ObservedCall.ts +267 -166
  157. package/src/ObservedCallEventMonitor.ts +389 -0
  158. package/src/ObservedCallSummary.ts +22 -0
  159. package/src/ObservedCertificate.ts +43 -0
  160. package/src/ObservedClient.ts +520 -1019
  161. package/src/ObservedClientEventMonitor.ts +301 -0
  162. package/src/ObservedClientSummary.ts +24 -0
  163. package/src/ObservedCodec.ts +49 -0
  164. package/src/ObservedDataChannel.ts +71 -181
  165. package/src/ObservedIceCandidate.ts +64 -0
  166. package/src/ObservedIceCandidatePair.ts +118 -0
  167. package/src/ObservedIceTransport.ts +99 -0
  168. package/src/ObservedInboundRtp.ts +205 -0
  169. package/src/ObservedInboundTrack.ts +73 -0
  170. package/src/ObservedMediaPlayout.ts +49 -0
  171. package/src/ObservedMediaSource.ts +60 -0
  172. package/src/ObservedOutboundRtp.ts +156 -0
  173. package/src/ObservedOutboundTrack.ts +72 -0
  174. package/src/ObservedPeerConnection.ts +854 -408
  175. package/src/ObservedPeerConnectionTransport.ts +38 -0
  176. package/src/ObservedRemoteInboundRtp.ts +64 -0
  177. package/src/ObservedRemoteOutboundRtp.ts +65 -0
  178. package/src/ObservedTURN.ts +86 -0
  179. package/src/ObservedTurnServer.ts +72 -0
  180. package/src/Observer.ts +180 -295
  181. package/src/ObserverEventMonitor.ts +398 -0
  182. package/src/ObserverSummary.ts +15 -0
  183. package/src/common/Middleware.ts +70 -42
  184. package/src/common/logger.ts +60 -69
  185. package/src/common/types.ts +0 -42
  186. package/src/common/utils.ts +24 -2
  187. package/src/detectors/Detector.ts +6 -0
  188. package/src/detectors/Detectors.ts +38 -0
  189. package/src/index.ts +26 -87
  190. package/src/monitors/TurnUsageMonitor.ts +164 -164
  191. package/src/schema/ClientEventTypes.ts +176 -0
  192. package/src/schema/ClientMetaTypes.ts +41 -0
  193. package/src/schema/ClientSample.ts +1682 -0
  194. package/src/scores/CalculatedScore.ts +6 -0
  195. package/src/scores/DefaultCallScoreCalculator.ts +23 -0
  196. package/src/scores/ScoreCalculator.ts +3 -0
  197. package/src/updaters/CallUpdater.ts +5 -0
  198. package/src/updaters/ObserverUpdater.ts +5 -0
  199. package/src/updaters/OnAllCallObserverUpdater.ts +59 -0
  200. package/src/updaters/OnAllClientCallUpdater.ts +61 -0
  201. package/src/updaters/OnAnyCallObserverUpdater.ts +41 -0
  202. package/src/updaters/OnAnyClientCallUpdater.ts +39 -0
  203. package/src/updaters/OnIntervalUpdater.ts +19 -0
  204. package/src/updaters/Updater.ts +5 -0
  205. package/src/utils/MediasoupRemoteTrackResolver.ts +155 -0
  206. package/src/utils/RemoteTrackResolver.ts +12 -0
  207. package/tsconfig.json +3 -3
  208. package/lib/ObservedICE.d.ts +0 -64
  209. package/lib/ObservedICE.d.ts.map +0 -1
  210. package/lib/ObservedICE.js +0 -141
  211. package/lib/ObservedInboundAudioTrack.d.ts +0 -96
  212. package/lib/ObservedInboundAudioTrack.d.ts.map +0 -1
  213. package/lib/ObservedInboundAudioTrack.js +0 -217
  214. package/lib/ObservedInboundVideoTrack.d.ts +0 -101
  215. package/lib/ObservedInboundVideoTrack.d.ts.map +0 -1
  216. package/lib/ObservedInboundVideoTrack.js +0 -232
  217. package/lib/ObservedOutboundAudioTrack.d.ts +0 -87
  218. package/lib/ObservedOutboundAudioTrack.d.ts.map +0 -1
  219. package/lib/ObservedOutboundAudioTrack.js +0 -186
  220. package/lib/ObservedOutboundVideoTrack.d.ts +0 -91
  221. package/lib/ObservedOutboundVideoTrack.d.ts.map +0 -1
  222. package/lib/ObservedOutboundVideoTrack.js +0 -193
  223. package/lib/ObservedSfu.d.ts +0 -59
  224. package/lib/ObservedSfu.d.ts.map +0 -1
  225. package/lib/ObservedSfu.js +0 -157
  226. package/lib/ObservedSfuInboundRtpPad.d.ts +0 -42
  227. package/lib/ObservedSfuInboundRtpPad.d.ts.map +0 -1
  228. package/lib/ObservedSfuInboundRtpPad.js +0 -71
  229. package/lib/ObservedSfuOutboundRtpPad.d.ts +0 -42
  230. package/lib/ObservedSfuOutboundRtpPad.d.ts.map +0 -1
  231. package/lib/ObservedSfuOutboundRtpPad.js +0 -72
  232. package/lib/ObservedSfuSctpChannel.d.ts +0 -42
  233. package/lib/ObservedSfuSctpChannel.d.ts.map +0 -1
  234. package/lib/ObservedSfuSctpChannel.js +0 -57
  235. package/lib/ObservedSfuTransport.d.ts +0 -58
  236. package/lib/ObservedSfuTransport.d.ts.map +0 -1
  237. package/lib/ObservedSfuTransport.js +0 -120
  238. package/lib/RemoteTrackAssigner.d.ts +0 -14
  239. package/lib/RemoteTrackAssigner.d.ts.map +0 -1
  240. package/lib/RemoteTrackAssigner.js +0 -52
  241. package/lib/ReportsCollector.d.ts +0 -109
  242. package/lib/ReportsCollector.d.ts.map +0 -1
  243. package/lib/ReportsCollector.js +0 -207
  244. package/lib/common/CalculatedScore.d.ts +0 -80
  245. package/lib/common/CalculatedScore.d.ts.map +0 -1
  246. package/lib/common/CalculatedScore.js +0 -162
  247. package/lib/common/CallEventType.d.ts +0 -63
  248. package/lib/common/CallEventType.d.ts.map +0 -1
  249. package/lib/common/CallEventType.js +0 -39
  250. package/lib/common/CallMetaReports.d.ts +0 -42
  251. package/lib/common/CallMetaReports.d.ts.map +0 -1
  252. package/lib/common/CallMetaReports.js +0 -36
  253. package/lib/common/QualityScoreUtils.d.ts +0 -1
  254. package/lib/common/QualityScoreUtils.d.ts.map +0 -1
  255. package/lib/common/QualityScoreUtils.js +0 -1
  256. package/lib/common/TypedEventEmitter.d.ts +0 -22
  257. package/lib/common/TypedEventEmitter.d.ts.map +0 -1
  258. package/lib/common/TypedEventEmitter.js +0 -11
  259. package/lib/common/callEventReports.d.ts +0 -10
  260. package/lib/common/callEventReports.d.ts.map +0 -1
  261. package/lib/common/callEventReports.js +0 -112
  262. package/lib/monitors/CallSummary.d.ts +0 -37
  263. package/lib/monitors/CallSummary.d.ts.map +0 -1
  264. package/lib/monitors/CallSummaryMonitor.d.ts +0 -32
  265. package/lib/monitors/CallSummaryMonitor.d.ts.map +0 -1
  266. package/lib/monitors/CallSummaryMonitor.js +0 -152
  267. package/lib/monitors/ClientIssueMonitor.d.ts +0 -32
  268. package/lib/monitors/ClientIssueMonitor.d.ts.map +0 -1
  269. package/lib/monitors/ClientIssueMonitor.js +0 -49
  270. package/lib/monitors/SfuServerMonitor.d.ts +0 -79
  271. package/lib/monitors/SfuServerMonitor.d.ts.map +0 -1
  272. package/lib/monitors/SfuServerMonitor.js +0 -198
  273. package/src/ObservedICE.ts +0 -237
  274. package/src/ObservedInboundAudioTrack.ts +0 -344
  275. package/src/ObservedInboundVideoTrack.ts +0 -361
  276. package/src/ObservedOutboundAudioTrack.ts +0 -307
  277. package/src/ObservedOutboundVideoTrack.ts +0 -319
  278. package/src/ObservedSfu.ts +0 -231
  279. package/src/ObservedSfuInboundRtpPad.ts +0 -106
  280. package/src/ObservedSfuOutboundRtpPad.ts +0 -107
  281. package/src/ObservedSfuSctpChannel.ts +0 -103
  282. package/src/ObservedSfuTransport.ts +0 -185
  283. package/src/RemoteTrackAssigner.ts +0 -68
  284. package/src/ReportsCollector.ts +0 -336
  285. package/src/common/CalculatedScore.ts +0 -188
  286. package/src/common/CallEventType.ts +0 -69
  287. package/src/common/CallMetaReports.ts +0 -82
  288. package/src/common/QualityScoreUtils.ts +0 -0
  289. package/src/common/TypedEventEmitter.ts +0 -32
  290. package/src/common/callEventReports.ts +0 -178
  291. package/src/monitors/CallSummary.ts +0 -38
  292. package/src/monitors/CallSummaryMonitor.ts +0 -192
  293. package/src/monitors/ClientIssueMonitor.ts +0 -88
  294. package/src/monitors/SfuServerMonitor.ts +0 -285
  295. /package/lib/{monitors/CallSummary.js → ObservedCallSummary.js} +0 -0
package/src/Observer.ts CHANGED
@@ -1,48 +1,36 @@
1
1
  import { createLogger } from './common/logger';
2
- import { ObservedCall, ObservedCallModel } from './ObservedCall';
3
- import { ReportsCollector } from './ReportsCollector';
2
+ import { ObservedCall, ObservedCallSettings } from './ObservedCall';
4
3
  import { EventEmitter } from 'events';
5
- import { PartialBy } from './common/utils';
6
- import { createCallEndedEventReport, createCallStartedEventReport } from './common/callEventReports';
7
- import { ObserverSinkContext } from './common/types';
8
- import { ObservedSfu, ObservedSfuModel } from './ObservedSfu';
9
- import { CallSummaryMonitor, CallSummaryMonitorConfig } from './monitors/CallSummaryMonitor';
10
- import { TurnUsageMonitor } from './monitors/TurnUsageMonitor';
4
+ import { ClientEvent, ClientMetaData, ClientIssue, ExtensionStat, ClientSample } from './schema/ClientSample';
11
5
  import { ObservedClient } from './ObservedClient';
12
- import { ObservedPeerConnection } from './ObservedPeerConnection';
13
- import { ClientIssueMonitor } from './monitors/ClientIssueMonitor';
14
- import { SfuServerMonitor } from './monitors/SfuServerMonitor';
6
+ import { ObservedTURN } from './ObservedTURN';
7
+ import { Detectors } from './detectors/Detectors';
8
+ import { Updater } from './updaters/Updater';
9
+ import { OnIntervalUpdater } from './updaters/OnIntervalUpdater';
10
+ import { OnAllCallObserverUpdater } from './updaters/OnAllCallObserverUpdater';
11
+ import { OnAnyCallObserverUpdater } from './updaters/OnAnyCallObserverUpdater';
12
+ import { ObserverEventMonitor } from './ObserverEventMonitor';
13
+ import { MediasoupRemoteTrackResolver } from './utils/MediasoupRemoteTrackResolver';
15
14
 
16
15
  const logger = createLogger('Observer');
17
16
 
18
17
  export type ObserverEvents = {
18
+ 'client-event': [ObservedClient, ClientEvent];
19
+ 'call-updated': [ObservedCall],
20
+ 'client-issue': [ObservedClient, ClientIssue],
21
+ 'client-metadata': [ObservedClient, ClientMetaData],
22
+ 'client-extension-stats': [ObservedClient, ExtensionStat],
19
23
  'newcall': [ObservedCall],
20
- 'newsfu': [ObservedSfu],
21
- 'reports': [ObserverSinkContext],
24
+ 'update': [],
22
25
  'close': [],
23
26
  }
24
27
 
25
28
  export type ObserverConfig = {
26
-
27
- /**
28
- *
29
- * Sets the default serviceId for samples.
30
- *
31
- * For more information about a serviceId please visit https://observertc.org
32
- *
33
- */
34
- defaultServiceId: string;
35
-
36
- /**
37
- * Sets the default mediaUnitId for samples.
38
- *
39
- * For more information about a mediaUnitId please visit https://observertc.org
40
- */
41
- defaultMediaUnitId: string;
42
-
43
- maxReports?: number | undefined;
44
- maxCollectingTimeInMs?: number | undefined;
45
- };
29
+ updatePolicy?: 'update-on-any-call-updated' | 'update-when-all-call-updated' | 'update-on-interval',
30
+ updateIntervalInMs?: number,
31
+ defaultCallUpdatePolicy?: ObservedCallSettings['updatePolicy'],
32
+ defaultCallUpdateIntervalInMs?: number,
33
+ }
46
34
 
47
35
  export declare interface Observer {
48
36
  on<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;
@@ -52,312 +40,209 @@ export declare interface Observer {
52
40
  }
53
41
 
54
42
  export class Observer extends EventEmitter {
55
- public static create(providedConfig: Partial<ObserverConfig>): Observer {
56
- const config: ObserverConfig = Object.assign(
57
- {
58
- defaultServiceId: 'default-service-id',
59
- defaultMediaUnitId: 'default-media-unit-id',
60
- evaluator: {
61
- fetchSamples: true,
62
- maxIdleTimeInMs: 300 * 1000,
63
- },
64
- sink: {},
65
- logLevel: 'info',
66
- },
67
- providedConfig
68
- );
69
-
70
- return new Observer(config);
43
+ public readonly detectors: Detectors;
44
+
45
+ public readonly observedTURN = new ObservedTURN();
46
+ public readonly observedCalls = new Map<string, ObservedCall>();
47
+ public updater?: Updater;
48
+
49
+ public closed = false;
50
+
51
+ public totalAddedCall = 0;
52
+ public totalRemovedCall = 0;
53
+ public totalRttLt50Measurements = 0;
54
+ public totalRttLt150Measurements = 0;
55
+ public totalRttLt300Measurements = 0;
56
+ public totalRttGtOrEq300Measurements = 0;
57
+ public totalClientIssues = 0;
58
+
59
+ public numberOfClientsUsingTurn = 0;
60
+ public numberOfClients = 0;
61
+ public numberOfInboundRtpStreams = 0;
62
+ public numberOfOutboundRtpStreams = 0;
63
+ public numberOfDataChannels = 0;
64
+ public numberOfPeerConnections = 0;
65
+
66
+ public get numberOfCalls() {
67
+ return this.observedCalls.size;
71
68
  }
72
69
 
73
- public readonly reports = new ReportsCollector();
74
- private readonly _observedCalls = new Map<string, ObservedCall>();
75
- private readonly _observedSfus = new Map<string, ObservedSfu>();
76
- private readonly _monitors = new Map<string, { close:() => void, once: (e: 'close', l: () => void) => void }>();
70
+ private _timer?: ReturnType<typeof setInterval>;
77
71
 
78
- private _reportTimer?: ReturnType<typeof setTimeout>;
79
- private _closed = false;
80
- public constructor(
81
- public readonly config: ObserverConfig,
82
- ) {
72
+ public constructor(public readonly config: ObserverConfig = {
73
+ updatePolicy: 'update-when-all-call-updated',
74
+ updateIntervalInMs: undefined,
75
+ }) {
83
76
  super();
84
77
  this.setMaxListeners(Infinity);
78
+ this.update = this.update.bind(this);
85
79
 
86
- logger.debug('Observer is created with config', this.config);
87
-
88
- const onReports = (context: ObserverSinkContext) => this.emit('reports', context);
89
- const onNewReport = (collectedReports: number) => {
90
- if (!this.config.maxReports || this._closed) return;
91
- if (this.config.maxReports < collectedReports) {
92
- this._emitReports();
80
+ if (this.config.updateIntervalInMs) {
81
+ if (this.config.updatePolicy && this.config.updatePolicy !== 'update-on-interval') {
82
+ throw new Error('update policy must be update-on-interval if updateIntervalInMs is set in config');
93
83
  }
94
- };
84
+ this._timer = setInterval(this.update.bind(this), this.config.updateIntervalInMs);
85
+ }
95
86
 
96
- this._emitReports();
87
+ if (this.config.updateIntervalInMs) {
88
+ if (this.config.updatePolicy !== 'update-on-interval') {
89
+ throw new Error('updatePolicy must be update-on-interval if updateIntervalInMs is set in config');
90
+ }
91
+ }
92
+ switch (this.config.updatePolicy) {
93
+ case 'update-on-any-call-updated':
94
+ this.updater = new OnAllCallObserverUpdater(this);
95
+ break;
96
+ case 'update-when-all-call-updated':
97
+ this.updater = new OnAnyCallObserverUpdater(this);
98
+ break;
99
+ case 'update-on-interval':
100
+ if (!this.config.updateIntervalInMs) {
101
+ throw new Error('updateIntervalInMs setting in config must be set if updatePolicy is update-on-interval');
102
+ }
103
+ this.updater = new OnIntervalUpdater(
104
+ this.config.updateIntervalInMs,
105
+ this.update.bind(this),
106
+ );
107
+ break;
108
+ }
109
+
110
+ this.detectors = new Detectors();
111
+ }
97
112
 
98
- this.once('close', () => {
99
- this.reports.off('newreport', onNewReport);
100
- this.reports.off('reports', onReports);
101
- });
102
- this.reports.on('newreport', onNewReport);
103
- this.reports.on('reports', onReports);
113
+ public getObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(callId: string): ObservedCall<T> | undefined {
114
+ if (this.closed || !this.observedCalls.has(callId)) return;
115
+
116
+ return this.observedCalls.get(callId) as ObservedCall<T>;
104
117
  }
105
118
 
106
119
  public createObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(
107
- config: PartialBy<ObservedCallModel, 'serviceId'> & { appData: T, reportCallStarted?: boolean, reportCallEnded?: boolean }
120
+ settings: ObservedCallSettings<T>
108
121
  ): ObservedCall<T> {
109
- if (this._closed) {
122
+ if (this.closed) {
110
123
  throw new Error('Attempted to create a call source on a closed observer');
111
124
  }
112
-
113
- const {
114
- appData,
115
- reportCallEnded = true,
116
- reportCallStarted = true,
117
- ...model
118
- } = config;
119
- const call = new ObservedCall({
120
- ...model,
121
- serviceId: this.config.defaultServiceId,
122
- }, this, appData);
123
-
124
- if (this._closed) throw new Error('Cannot create an observed call on a closed observer');
125
- if (this._observedCalls.has(call.callId)) throw new Error(`Observed Call with id ${call.callId} already exists`);
126
-
127
- call.once('close', () => {
128
- this._observedCalls.delete(call.callId);
129
- reportCallEnded && this.reports.addCallEventReport(createCallEndedEventReport(
130
- call.serviceId,
131
- call.roomId,
132
- call.callId,
133
- call.observationEnded ?? Date.now(),
134
- ));
135
- });
136
-
137
- this._observedCalls.set(call.callId, call);
138
- reportCallStarted && this.reports.addCallEventReport(createCallStartedEventReport(
139
- call.serviceId,
140
- call.roomId,
141
- call.callId,
142
- call.observationStarted,
143
- ));
144
-
145
- this.emit('newcall', call);
146
-
147
- return call;
148
- }
149
-
150
- public createObservedSfu<AppData extends Record<string, unknown> = Record<string, unknown>>(
151
- model: ObservedSfuModel,
152
- appData: AppData,
153
- ): ObservedSfu<AppData> {
154
- if (this._closed) {
155
- throw new Error('Attempted to create an sfu source on a closed observer');
125
+ if (!settings.updatePolicy) {
126
+ settings.updatePolicy = this.config.defaultCallUpdatePolicy;
127
+ settings.updateIntervalInMs = this.config.defaultCallUpdateIntervalInMs;
156
128
  }
129
+ const observedCall = new ObservedCall(settings, this);
130
+ const onCallUpdated = () => this._onObservedCallUpdated(observedCall);
157
131
 
158
- const sfu = new ObservedSfu<AppData>(model, this, appData);
132
+ if (this.observedCalls.has(observedCall.callId)) throw new Error(`Observed Call with id ${observedCall.callId} already exists`);
159
133
 
160
- if (this._closed) throw new Error('Cannot create an observed sfu on a closed observer');
161
- if (this._observedSfus.has(sfu.sfuId)) throw new Error(`Observed SFU with id ${sfu.sfuId} already exists`);
134
+ if (settings.remoteTrackResolvePolicy === 'mediasoup-sfu') {
135
+ observedCall.remoteTrackResolver = new MediasoupRemoteTrackResolver(observedCall);
136
+ }
162
137
 
163
- sfu.once('close', () => {
164
- this._observedSfus.delete(sfu.sfuId);
138
+ observedCall.once('close', () => {
139
+ this.observedCalls.delete(observedCall.callId);
140
+ observedCall.off('update', onCallUpdated);
141
+ ++this.totalRemovedCall;
165
142
  });
166
143
 
167
- this._observedSfus.set(sfu.sfuId, sfu);
168
- this.emit('newsfu', sfu);
169
-
170
- return sfu;
171
- }
172
-
173
- public createCallSummaryMonitor(options?: CallSummaryMonitorConfig & { timeoutAfterCallClose?: number }): CallSummaryMonitor {
174
- if (this._closed) throw new Error('Cannot create a call summary monitor on a closed observer');
175
-
176
- const existingMonitor = this._monitors.get(CallSummaryMonitor.name);
177
-
178
- if (existingMonitor) return existingMonitor as CallSummaryMonitor;
179
-
180
- const monitor = new CallSummaryMonitor(options);
181
- const onNewCall = (call: ObservedCall) => {
182
- monitor.addCall(call);
183
-
184
- call.once('close', () => setTimeout(() => {
185
- const summary = monitor.takeSummary(call.callId);
186
-
187
- summary && monitor.emit('summary', summary);
188
-
189
- }, options?.timeoutAfterCallClose ?? 1000));
190
- };
144
+ this.observedCalls.set(observedCall.callId, observedCall);
145
+ observedCall.on('update', onCallUpdated);
146
+ ++this.totalAddedCall;
191
147
 
192
- monitor.once('close', () => {
193
- this._monitors.delete(CallSummaryMonitor.name);
194
- this.off('newcall', onNewCall);
195
- });
196
-
197
- this._monitors.set(CallSummaryMonitor.name, monitor);
198
- this.on('newcall', onNewCall);
148
+ this.emit('newcall', observedCall);
199
149
 
200
- this.once('close', () => {
201
- monitor.close();
202
- });
203
-
204
- return monitor;
150
+ return observedCall;
205
151
  }
206
152
 
207
- public createTurnUsageMonitor() {
208
- if (this._closed) throw new Error('Cannot create a turn usage monitor on a closed observer');
209
-
210
- const existingMonitor = this._monitors.get(TurnUsageMonitor.name);
211
-
212
- if (existingMonitor) return existingMonitor as TurnUsageMonitor;
213
-
214
- const monitor = new TurnUsageMonitor();
215
-
216
- const onNewCall = (call: ObservedCall) => {
217
- const onNewClient = (client: ObservedClient) => {
218
- const onNewPeerConnection = (pc: ObservedPeerConnection) => {
219
- const onUsingTurnChanged = (usingTurn: boolean) => {
220
- if (usingTurn) monitor.addPeerConnection(pc);
221
- else monitor.removePeerConnection(pc);
222
- };
223
-
224
- pc.once('close', () => {
225
- pc.ICE.off('usingturnchanged', onUsingTurnChanged);
226
- monitor.removePeerConnection(pc);
227
- });
228
- pc.ICE.on('usingturnchanged', onUsingTurnChanged);
229
- };
230
-
231
- client.once('close', () => client.off('newpeerconnection', onNewPeerConnection));
232
- client.on('newpeerconnection', onNewPeerConnection);
233
- };
234
-
235
- call.once('close', () => call.off('newclient', onNewClient));
236
- call.on('newclient', onNewClient);
237
- };
238
-
239
- monitor.once('close', () => {
240
- this._monitors.delete(TurnUsageMonitor.name);
241
- this.off('newcall', onNewCall);
242
- });
153
+ public close() {
154
+ if (this.closed) {
155
+ return logger.debug('Attempted to close twice');
156
+ }
157
+ this.closed = true;
158
+ clearInterval(this._timer);
159
+ this._timer = undefined;
243
160
 
244
- this._monitors.set(TurnUsageMonitor.name, monitor);
245
- this.on('newcall', onNewCall);
161
+ this.observedCalls.forEach((call) => call.close());
246
162
 
247
- this.once('close', () => {
248
- monitor.close();
249
- });
250
-
251
- return monitor;
163
+ this.emit('close');
252
164
  }
253
165
 
254
- public createSfuServerMonitor() {
255
- if (this._closed) throw new Error('Cannot create a turn usage monitor on a closed observer');
256
-
257
- const existingMonitor = this._monitors.get(SfuServerMonitor.name);
258
-
259
- if (existingMonitor) return existingMonitor as SfuServerMonitor;
260
-
261
- const monitor = new SfuServerMonitor({
262
- tooHighRttAlertSettings: {
263
- minNumberOfPeerConnections: 10,
264
- percentageOfPeerConnectionsHighWatermark: 0.5,
265
- percentageOfPeerConnectionsLowWatermark: 0.2,
266
- threshold: 'rtt-gt-300',
267
- }
268
- });
269
-
270
- const onNewCall = (call: ObservedCall) => {
271
- const onNewClient = (client: ObservedClient) => {
272
- const onNewPeerConnection = (pc: ObservedPeerConnection) => {
273
- monitor.addPeerConnection(pc);
274
- };
166
+ public accept(sample: ClientSample) {
167
+ if (this.closed) return;
168
+ if (!sample.callId) return logger.warn('Received sample without callId. %o', sample);
169
+ if (!sample.clientId) return logger.warn('Received sample without clientId %o', sample);
275
170
 
276
- client.once('close', () => client.off('newpeerconnection', onNewPeerConnection));
277
- client.on('newpeerconnection', onNewPeerConnection);
278
- };
279
-
280
- call.once('close', () => call.off('newclient', onNewClient));
281
- call.on('newclient', onNewClient);
282
- };
283
-
284
- monitor.once('close', () => {
285
- this._monitors.delete(SfuServerMonitor.name);
286
- this.off('newcall', onNewCall);
171
+ const call = this.getObservedCall(sample.callId) ?? this.createObservedCall({
172
+ callId: sample.callId,
173
+ updateIntervalInMs: this.config.defaultCallUpdateIntervalInMs,
174
+ updatePolicy: this.config.defaultCallUpdatePolicy,
287
175
  });
288
176
 
289
- this._monitors.set(SfuServerMonitor.name, monitor);
290
- this.on('newcall', onNewCall);
291
-
292
- this.once('close', () => {
293
- monitor.close();
177
+ const client = call.getObservedClient(sample.clientId) ?? call.createObservedClient({
178
+ clientId: sample.clientId,
294
179
  });
295
180
 
296
- return monitor;
181
+ client.accept(sample);
297
182
  }
298
183
 
299
- public createClientIssueMonitor() {
300
- if (this._closed) throw new Error('Cannot create a turn usage monitor on a closed observer');
301
-
302
- const existingMonitor = this._monitors.get(ClientIssueMonitor.name);
303
-
304
- if (existingMonitor) return existingMonitor as ClientIssueMonitor;
305
-
306
- const monitor = new ClientIssueMonitor();
307
-
308
- const onNewCall = (call: ObservedCall) => monitor.addCall(call);
309
-
310
- monitor.once('close', () => {
311
- this._monitors.delete(ClientIssueMonitor.name);
312
- this.off('newcall', onNewCall);
313
- });
184
+ public update() {
185
+ if (this.closed) {
186
+ return;
187
+ }
314
188
 
315
- this._monitors.set(ClientIssueMonitor.name, monitor);
316
- this.on('newcall', onNewCall);
317
-
318
- this.once('close', () => {
319
- monitor.close();
320
- });
189
+ this.numberOfInboundRtpStreams = 0;
190
+ this.numberOfOutboundRtpStreams = 0;
191
+ this.numberOfPeerConnections = 0;
192
+ this.numberOfDataChannels = 0;
193
+ this.numberOfClients = 0;
194
+ this.numberOfClientsUsingTurn = 0;
195
+
196
+ for (const call of this.observedCalls.values()) {
197
+ this.numberOfInboundRtpStreams += call.numberOfInboundRtpStreams;
198
+ this.numberOfOutboundRtpStreams += call.numberOfOutboundRtpStreams;
199
+ this.numberOfPeerConnections += call.numberOfPeerConnections;
200
+ this.numberOfDataChannels += call.numberOfDataChannels;
201
+ this.numberOfClients += call.numberOfClients;
202
+ this.numberOfClientsUsingTurn += call.clientsUsedTurn.size;
203
+ }
321
204
 
322
- return monitor;
323
- }
205
+ this.observedTURN.update();
324
206
 
325
- public get observedCalls(): ReadonlyMap<string, ObservedCall> {
326
- return this._observedCalls;
207
+ this.emit('update');
327
208
  }
328
209
 
329
- public get observedSfus(): ReadonlyMap<string, ObservedSfu> {
330
- return this._observedSfus;
210
+ private _onObservedCallUpdated(call: ObservedCall) {
211
+ this.totalRttLt50Measurements += call.deltaRttLt50Measurements;
212
+ this.totalRttLt150Measurements += call.deltaRttLt150Measurements;
213
+ this.totalRttLt300Measurements += call.deltaRttLt300Measurements;
214
+ this.totalRttGtOrEq300Measurements += call.deltaRttGtOrEq300Measurements;
215
+ this.totalClientIssues += call.deltaNumberOfIssues;
331
216
  }
332
217
 
333
- public get closed() {
334
- return this._closed;
218
+ public createEventMonitor<CTX = unknown>(ctx?: CTX): ObserverEventMonitor<CTX> {
219
+ return new ObserverEventMonitor<CTX>(this, ctx ?? {} as CTX);
335
220
  }
336
221
 
337
- public close() {
338
- if (this._closed) {
339
- return logger.debug('Attempted to close twice');
340
- }
341
- this._closed = true;
222
+ // public resetSummaryMetrics() {
223
+ // this.totalAddedCall = 0;
224
+ // this.totalRemovedCall = 0;
225
+ // this.totalRttLt50Measurements = 0;
226
+ // this.totalRttLt150Measurements = 0;
227
+ // this.totalRttLt300Measurements = 0;
228
+ // this.totalRttGtOrEq300Measurements = 0;
229
+ // this.totalClientIssues = 0;
230
+ // }
231
+
232
+ // public createSummary(): ObserverSummary {
233
+ // return {
234
+ // totalAddedCall: this.totalAddedCall,
235
+ // totalRemovedCall: this.totalRemovedCall,
236
+ // totalRttLt50Measurements: this.totalRttLt50Measurements,
237
+ // totalRttLt150Measurements: this.totalRttLt150Measurements,
238
+ // totalRttLt300Measurements: this.totalRttLt300Measurements,
239
+ // totalRttGtOrEq300Measurements: this.totalRttGtOrEq300Measurements,
240
+
241
+ // totalClientIssues: this.totalClientIssues,
242
+ // currentActiveCalls: this.observedCalls.size,
243
+ // currentNumberOfClients: this.numberOfClients,
244
+ // currentNumberOfClientsUsingTURN: this.numberOfClientsUsedTurn,
245
+ // };
246
+ // }
342
247
 
343
- this._observedCalls.forEach((call) => call.close());
344
-
345
- this.emit('close');
346
- }
347
-
348
- private _emitReports() {
349
- if (this._reportTimer) {
350
- clearTimeout(this._reportTimer);
351
- this._reportTimer = undefined;
352
- }
353
-
354
- this.reports.emit();
355
-
356
- if (this.config.maxCollectingTimeInMs) {
357
- this._reportTimer = setTimeout(() => {
358
- this._reportTimer = undefined;
359
- this._emitReports();
360
- }, this.config.maxCollectingTimeInMs);
361
- }
362
- }
363
248
  }