@observertc/client-monitor-js 1.1.0 → 1.2.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 (39) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +43 -0
  3. package/lib/Accumulator.d.ts +16 -0
  4. package/lib/Accumulator.d.ts.map +1 -1
  5. package/lib/Accumulator.js +10 -1
  6. package/lib/ClientDevices.d.ts +10 -0
  7. package/lib/ClientDevices.d.ts.map +1 -1
  8. package/lib/ClientDevices.js +58 -14
  9. package/lib/ClientMonitor.d.ts +8 -2
  10. package/lib/ClientMonitor.d.ts.map +1 -1
  11. package/lib/ClientMonitorImpl.d.ts +2 -1
  12. package/lib/ClientMonitorImpl.d.ts.map +1 -1
  13. package/lib/ClientMonitorImpl.js +25 -11
  14. package/lib/Sampler.d.ts +4 -0
  15. package/lib/Sampler.d.ts.map +1 -1
  16. package/lib/Sampler.js +8 -2
  17. package/lib/entries/PeerConnectionEntryImpl.d.ts +2 -0
  18. package/lib/entries/PeerConnectionEntryImpl.d.ts.map +1 -1
  19. package/lib/entries/PeerConnectionEntryImpl.js +4 -0
  20. package/lib/entries/StatsStorage.d.ts +5 -0
  21. package/lib/entries/StatsStorage.d.ts.map +1 -1
  22. package/lib/entries/StatsStorage.js +11 -0
  23. package/lib/utils/StatsVisitor.d.ts +9 -0
  24. package/lib/utils/StatsVisitor.d.ts.map +1 -1
  25. package/lib/utils/StatsVisitor.js +16 -0
  26. package/lib/utils/Timer.d.ts +6 -2
  27. package/lib/utils/Timer.d.ts.map +1 -1
  28. package/lib/utils/Timer.js +70 -88
  29. package/package.json +2 -2
  30. package/src/Accumulator.ts +30 -1
  31. package/src/ClientDevices.ts +69 -11
  32. package/src/ClientMonitor.ts +9 -2
  33. package/src/ClientMonitorImpl.ts +27 -13
  34. package/src/Sampler.ts +13 -2
  35. package/src/entries/PeerConnectionEntryImpl.ts +8 -2
  36. package/src/entries/StatsStorage.ts +16 -0
  37. package/src/utils/StatsVisitor.ts +26 -0
  38. package/src/utils/Timer.ts +76 -90
  39. package/tests/utils/Timer.spec.ts +26 -6
package/CHANGELOG.md CHANGED
@@ -1,7 +1,19 @@
1
+ ## 1.2.0
2
+ * Make timer tick based instead of calculated next delays
3
+ * Be able to collect samples if sender is not available
4
+ * add maxSamples config option to accumulator
5
+
6
+ ## 1.1.0
7
+ * Fix continous media source meta sending due to constantly changing `audioLevel`
8
+ * add ice-candidate-pairs according to schema changes in 2.1.0^
9
+ * align peer-connection-transport changes according to schema changes in 2.1.0^
10
+ * make id navigational alterations in PeerConnectionImpl related to the webrtc schema changes
11
+ * run prettier
12
+
1
13
  ## 1.0.1
2
14
 
3
15
  * Add validation for extension stats to check if the given payload is a valid json string or not.
4
16
 
5
17
  ## 1.0.0
6
18
 
7
- Init
19
+ Init
package/README.md CHANGED
@@ -570,6 +570,14 @@ const config = {
570
570
  */
571
571
  statsExpirationTimeInMs: 60000,
572
572
 
573
+ /**
574
+ * By setting this flag to true the samples are buffered even if no sender is available.
575
+ * This is useful if the sender is set later than the monitor is created, so no samples will be lost.
576
+ *
577
+ * DEFAULT: true
578
+ */
579
+ bufferingSamples: true;
580
+
573
581
  /**
574
582
  * Collector Component related configurations
575
583
  *
@@ -640,6 +648,13 @@ const config = {
640
648
  * DEFAULT: true
641
649
  */
642
650
  incrementalSampling: true,
651
+
652
+ /**
653
+ * Indicate if the sampler should use the timestamp provided by the rtcstats (the minimum of the peer connection stats will be used as the timestamp of the sample)
654
+ *
655
+ * DEFAULT: true
656
+ */
657
+ useStatsSample: true,
643
658
  },
644
659
  /**
645
660
  * Configure the sender component.
@@ -673,6 +688,34 @@ const config = {
673
688
  */
674
689
  maxRetries: 1,
675
690
  }
691
+ },
692
+
693
+ /**
694
+ * Configuration for the samples accumulator to balance the transfer the size of the Samples
695
+ * prepared to be sent to the server
696
+ *
697
+ */
698
+ accumulator: {
699
+ /**
700
+ * Sets the maximum number of client sample allowed to be in one Sample
701
+ *
702
+ * DEFAULT: 100
703
+ */
704
+ maxClientSamples: 100,
705
+
706
+ /**
707
+ * Sets the maximum number of Samples the accumulator can hold
708
+ *
709
+ * DEFAULT: 10
710
+ */
711
+ maxSamples: 10,
712
+
713
+ /**
714
+ * Forward a Sample to the server even if it is empty
715
+ *
716
+ * DEFAULT: false
717
+ */
718
+ forwardIfEmpty: false
676
719
  }
677
720
  };
678
721
  ```
@@ -1,6 +1,22 @@
1
1
  import { ClientSample, Samples } from "@observertc/monitor-schemas";
2
2
  export declare type AccumulatorConfig = {
3
+ /**
4
+ * Sets the maximum number of client sample allowed to be in one Sample
5
+ *
6
+ * DEFAULT: 100
7
+ */
3
8
  maxClientSamples?: number;
9
+ /**
10
+ * Sets the maximum number of Samples the accumulator can hold
11
+ *
12
+ * DEFAULT: 10
13
+ */
14
+ maxSamples?: number;
15
+ /**
16
+ * Forward a Sample to the server even if it is empty
17
+ *
18
+ * DEFAULT: false
19
+ */
4
20
  forwardIfEmpty?: boolean;
5
21
  };
6
22
  export declare type SamplesListener = (samples?: Samples) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"Accumulator.d.ts","sourceRoot":"","sources":["../src/Accumulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEpE,oBAAY,iBAAiB,GAAG;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AASF,oBAAY,eAAe,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE1D,qBAAa,WAAW;WACN,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB;IAM/C,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAoB;gBAChB,MAAM,EAAE,iBAAiB;IAI5C,IAAW,OAAO,IAAI,OAAO,CAE5B;IAEM,OAAO,CAAC,QAAQ,EAAE,eAAe;IAejC,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAaxD,OAAO,CAAC,UAAU;CAMrB"}
1
+ {"version":3,"file":"Accumulator.d.ts","sourceRoot":"","sources":["../src/Accumulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAKpE,oBAAY,iBAAiB,GAAG;IAC5B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAWF,oBAAY,eAAe,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE1D,qBAAa,WAAW;WACN,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB;IAM/C,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAoB;gBAChB,MAAM,EAAE,iBAAiB;IAI5C,IAAW,OAAO,IAAI,OAAO,CAE5B;IAEM,OAAO,CAAC,QAAQ,EAAE,eAAe;IAejC,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAaxD,OAAO,CAAC,UAAU;CAYrB"}
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Accumulator = void 0;
4
+ const logger_1 = require("./utils/logger");
5
+ const logger = (0, logger_1.createLogger)("Accumulator");
4
6
  const supplyDefaultConfig = () => {
5
7
  const defaultConfig = {
8
+ maxClientSamples: 100,
9
+ maxSamples: 10,
6
10
  forwardIfEmpty: false,
7
11
  };
8
12
  return defaultConfig;
@@ -44,7 +48,7 @@ class Accumulator {
44
48
  }
45
49
  clientSamples.push(clientSample);
46
50
  this._empty = false;
47
- if (this._config.maxClientSamples && clientSamples.length <= this._config.maxClientSamples) {
51
+ if (this._config.maxClientSamples && this._config.maxClientSamples <= clientSamples.length) {
48
52
  this._buffering();
49
53
  }
50
54
  }
@@ -52,6 +56,11 @@ class Accumulator {
52
56
  if (this._empty)
53
57
  return;
54
58
  this._buffer.push(this._samples);
59
+ while (this._config.maxSamples && this._config.maxSamples < this._buffer.length) {
60
+ const removedSamples = this._buffer.shift();
61
+ logger.warn(`Sample is removed from the accumulator buffer due to its limitation:
62
+ (maxSamples: ${this._config.maxSamples}, maxClientSample in one sample: ${this._config.maxClientSamples})`, removedSamples);
63
+ }
55
64
  this._samples = {};
56
65
  this._empty = true;
57
66
  }
@@ -4,10 +4,20 @@ export declare class ClientDevices {
4
4
  private _browser;
5
5
  private _platform;
6
6
  private _engine;
7
+ private _warned;
8
+ private _actualHashes?;
9
+ private _pivotHashes?;
7
10
  constructor();
11
+ collect(): void;
8
12
  get os(): OperationSystem;
9
13
  get browser(): Browser;
10
14
  get platform(): Platform;
11
15
  get engine(): Engine;
16
+ get isOsChanged(): boolean;
17
+ get isBrowserChanged(): boolean;
18
+ get isPlatformChanged(): boolean;
19
+ get isEngineChanged(): boolean;
20
+ get changed(): boolean;
21
+ pivot(): void;
12
22
  }
13
23
  //# sourceMappingURL=ClientDevices.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClientDevices.d.ts","sourceRoot":"","sources":["../src/ClientDevices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAwBzF,qBAAa,aAAa;IACtB,OAAO,CAAC,GAAG,CAA+B;IAC1C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,OAAO,CAA0B;;IAezC,IAAW,EAAE,IAAI,eAAe,CAE/B;IAED,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,IAAW,QAAQ,IAAI,QAAQ,CAE9B;IAED,IAAW,MAAM,IAAI,MAAM,CAE1B;CACJ"}
1
+ {"version":3,"file":"ClientDevices.d.ts","sourceRoot":"","sources":["../src/ClientDevices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAoCzF,qBAAa,aAAa;IACtB,OAAO,CAAC,GAAG,CAA+B;IAC1C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAS;;IAMvB,OAAO;IAyBd,IAAW,EAAE,IAAI,eAAe,CAE/B;IAED,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,IAAW,QAAQ,IAAI,QAAQ,CAE9B;IAED,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,IAAW,gBAAgB,IAAI,OAAO,CAErC;IAED,IAAW,iBAAiB,IAAI,OAAO,CAEtC;IAED,IAAW,eAAe,IAAI,OAAO,CAEpC;IAED,IAAW,OAAO,IAAI,OAAO,CAE5B;IAEM,KAAK,IAAI,IAAI;CAKvB"}
@@ -25,6 +25,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.ClientDevices = void 0;
27
27
  const Bowser = __importStar(require("bowser"));
28
+ const logger_1 = require("./utils/logger");
29
+ const hash_1 = require("./utils/hash");
30
+ // import * as proto from "./ProtobufSamples"
31
+ const logger = (0, logger_1.createLogger)("ClientDevices");
28
32
  const UNKNOWN_OS = {
29
33
  name: "Unkown",
30
34
  version: undefined,
@@ -49,20 +53,36 @@ class ClientDevices {
49
53
  this._browser = UNKNOWN_BROWSER;
50
54
  this._platform = UNKNOWN_PLATFORM;
51
55
  this._engine = UNKNOWN_ENGINE;
52
- /* eslint-disable @typescript-eslint/no-explicit-any */
53
- let outerNavigator = undefined;
54
- if (navigator)
55
- outerNavigator = navigator;
56
- else if (window && window.navigator)
57
- outerNavigator = window.navigator;
58
- else
59
- return this;
60
- const parsedResult = Bowser.parse(outerNavigator.userAgent);
61
- this._browser = Object.assign(this._browser, parsedResult.browser);
62
- this._engine = Object.assign(this._engine, parsedResult.engine);
63
- this._os = Object.assign(this._os, parsedResult.os);
64
- this._platform = Object.assign(this._platform, parsedResult.platform);
65
- return this;
56
+ this._warned = false;
57
+ this.collect();
58
+ }
59
+ collect() {
60
+ try {
61
+ /* eslint-disable @typescript-eslint/no-explicit-any */
62
+ let outerNavigator = undefined;
63
+ if (navigator !== undefined)
64
+ outerNavigator = navigator;
65
+ else if (window !== undefined && window.navigator !== undefined)
66
+ outerNavigator = window.navigator;
67
+ else
68
+ return;
69
+ const parsedResult = Bowser.parse(outerNavigator.userAgent);
70
+ this._browser = Object.assign(this._browser, parsedResult.browser);
71
+ this._engine = Object.assign(this._engine, parsedResult.engine);
72
+ this._os = Object.assign(this._os, parsedResult.os);
73
+ this._platform = Object.assign(this._platform, parsedResult.platform);
74
+ }
75
+ catch (err) {
76
+ if (!this._warned) {
77
+ logger.warn(`Cannot collect media devices and navigator data, because an error occurred`, err);
78
+ }
79
+ }
80
+ this._actualHashes = {
81
+ os: (0, hash_1.hash)(this._os),
82
+ browser: (0, hash_1.hash)(this._browser),
83
+ platform: (0, hash_1.hash)(this._platform),
84
+ engine: (0, hash_1.hash)(this._engine),
85
+ };
66
86
  }
67
87
  get os() {
68
88
  return this._os;
@@ -76,5 +96,29 @@ class ClientDevices {
76
96
  get engine() {
77
97
  return this._engine;
78
98
  }
99
+ get isOsChanged() {
100
+ var _a, _b;
101
+ return ((_a = this._pivotHashes) === null || _a === void 0 ? void 0 : _a.os) !== ((_b = this._actualHashes) === null || _b === void 0 ? void 0 : _b.os);
102
+ }
103
+ get isBrowserChanged() {
104
+ var _a, _b;
105
+ return ((_a = this._pivotHashes) === null || _a === void 0 ? void 0 : _a.browser) !== ((_b = this._actualHashes) === null || _b === void 0 ? void 0 : _b.browser);
106
+ }
107
+ get isPlatformChanged() {
108
+ var _a, _b;
109
+ return ((_a = this._pivotHashes) === null || _a === void 0 ? void 0 : _a.platform) !== ((_b = this._actualHashes) === null || _b === void 0 ? void 0 : _b.platform);
110
+ }
111
+ get isEngineChanged() {
112
+ var _a, _b;
113
+ return ((_a = this._pivotHashes) === null || _a === void 0 ? void 0 : _a.engine) !== ((_b = this._actualHashes) === null || _b === void 0 ? void 0 : _b.engine);
114
+ }
115
+ get changed() {
116
+ return this.isOsChanged || this.isBrowserChanged || this.isPlatformChanged || this.isEngineChanged;
117
+ }
118
+ pivot() {
119
+ this._pivotHashes = {
120
+ ...this._actualHashes,
121
+ };
122
+ }
79
123
  }
80
124
  exports.ClientDevices = ClientDevices;
@@ -31,6 +31,12 @@ export declare type ClientMonitorConfig = {
31
31
  * DEFAULT: undefined
32
32
  */
33
33
  sendingPeriodInMs?: number;
34
+ /**
35
+ * Set the ticking time of the timer invokes processes for collecting, sampling, and sending.
36
+ *
37
+ * DEFAULT: 1000
38
+ */
39
+ tickingTimeInMs?: number;
34
40
  /**
35
41
  * By setting it stats items and entries are deleted if they are not updated.
36
42
  *
@@ -174,10 +180,10 @@ export interface ClientMonitor {
174
180
  /**
175
181
  * Sets the client displayed userId.
176
182
  *
177
- * This can change during the call, but the clientId must remains
183
+ * This can change during the call, but the clientId must remain the same
178
184
  * @param value
179
185
  */
180
- setUserId(value: string): void;
186
+ setUserId(value?: string | undefined): void;
181
187
  /**
182
188
  * Sets the identifier of the call the client participates.
183
189
  * If the value is given then sample will contain the provided value, and the observer will (try) to use it.
@@ -1 +1 @@
1
- {"version":3,"file":"ClientMonitor.d.ts","sourceRoot":"","sources":["../src/ClientMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,oBAAY,mBAAmB,GAAG;IAC9B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;OAEG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAE7B;;;OAGG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACnC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEpD;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAErD;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEpD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAEhC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAEhC;;;;OAIG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IAErD;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3C;;;;;;;;;OASG;IACH,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAErD;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvC;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEtC;;;;;;;OAOG;IACH,mBAAmB,CAAC,SAAS,EAAE,sBAAsB,GAAG,qBAAqB,GAAG,IAAI,CAAC;IAErF;;;;;OAKG;IAEH,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAElC;;;;;;;OAOG;IACH,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAE9C;;;;;;;OAOG;IACH,eAAe,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAEjD;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC;;;;;;OAMG;IACH,mBAAmB,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAExD;;;;;;OAMG;IACH,iBAAiB,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpD;;;;;;OAMG;IACH,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAElD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAEpC;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,QAE9C;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,aAAa,CAElE"}
1
+ {"version":3,"file":"ClientMonitor.d.ts","sourceRoot":"","sources":["../src/ClientMonitor.ts"],"names":[],"mappings":"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"}
@@ -42,7 +42,7 @@ export declare class ClientMonitorImpl implements ClientMonitor {
42
42
  addStatsCollector(collector: PcStatsCollector): void;
43
43
  removeStatsCollector(collectorId: string): void;
44
44
  setMediaDevices(...devices: MediaDevice[]): void;
45
- setUserId(value: string): void;
45
+ setUserId(value?: string | null): void;
46
46
  addMediaConstraints(constrains: MediaStreamConstraints | MediaTrackConstraints): void;
47
47
  addUserMediaError(err: any): void;
48
48
  addExtensionStats(stats: ExtensionStat): void;
@@ -55,6 +55,7 @@ export declare class ClientMonitorImpl implements ClientMonitor {
55
55
  setCollectingPeriod(collectingPeriodInMs: number): void;
56
56
  setSamplingPeriod(samplingPeriodInMs: number): void;
57
57
  setSendingPeriod(sendingPeriodInMs: number): void;
58
+ private _collectClientDevices;
58
59
  private _makeCollector;
59
60
  private _makeSampler;
60
61
  private _createSender;
@@ -1 +1 @@
1
- {"version":3,"file":"ClientMonitorImpl.d.ts","sourceRoot":"","sources":["../src/ClientMonitorImpl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClientMonitorImpl.d.ts","sourceRoot":"","sources":["../src/ClientMonitorImpl.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,7 @@ const supplyDefaultConfig = () => {
48
48
  const defaultConfig = {
49
49
  // samplingPeriodInMs: 5000,
50
50
  // sendingPeriodInMs: 10000,
51
+ tickingTimeInMs: 1000,
51
52
  sampler: (0, Sampler_2.supplyDefaultConfig)(),
52
53
  };
53
54
  return defaultConfig;
@@ -69,10 +70,6 @@ class ClientMonitorImpl {
69
70
  this._sampler = this._makeSampler();
70
71
  this._createSender();
71
72
  this._createTimer();
72
- this._sampler.addEngine(this._clientDevices.engine);
73
- this._sampler.addPlatform(this._clientDevices.platform);
74
- this._sampler.addBrowser(this._clientDevices.browser);
75
- this._sampler.addOs(this._clientDevices.os);
76
73
  }
77
74
  static create(config) {
78
75
  if ((config === null || config === void 0 ? void 0 : config.maxListeners) !== undefined) {
@@ -164,7 +161,7 @@ class ClientMonitorImpl {
164
161
  }
165
162
  }
166
163
  setUserId(value) {
167
- if (!value)
164
+ if (value === undefined || value === null)
168
165
  return;
169
166
  this._sampler.setUserId(value);
170
167
  }
@@ -206,12 +203,11 @@ class ClientMonitorImpl {
206
203
  }
207
204
  async sample() {
208
205
  try {
206
+ this._collectClientDevices();
209
207
  const clientSample = this._sampler.make();
210
208
  if (!clientSample)
211
209
  return;
212
- if (this._sender) {
213
- this._accumulator.addClientSample(clientSample);
214
- }
210
+ this._accumulator.addClientSample(clientSample);
215
211
  this._eventer.emitSampleCreated(clientSample);
216
212
  const now = Date.now();
217
213
  this._metrics.setLastSampled(now);
@@ -295,7 +291,7 @@ class ClientMonitorImpl {
295
291
  return;
296
292
  }
297
293
  if (!this._timer) {
298
- this._timer = new Timer_1.Timer();
294
+ this._timer = new Timer_1.Timer(this._config.tickingTimeInMs);
299
295
  }
300
296
  if (this._timer.hasListener("collect")) {
301
297
  this._timer.clear("collect");
@@ -314,7 +310,7 @@ class ClientMonitorImpl {
314
310
  return;
315
311
  }
316
312
  if (!this._timer) {
317
- this._timer = new Timer_1.Timer();
313
+ this._timer = new Timer_1.Timer(this._config.tickingTimeInMs);
318
314
  }
319
315
  if (this._timer.hasListener("sample")) {
320
316
  this._timer.clear("sample");
@@ -323,6 +319,7 @@ class ClientMonitorImpl {
323
319
  type: "sample",
324
320
  process: this.sample.bind(this),
325
321
  fixedDelayInMs: samplingPeriodInMs,
322
+ initialDelayInMs: samplingPeriodInMs,
326
323
  context: "Creating Sample",
327
324
  });
328
325
  }
@@ -333,7 +330,7 @@ class ClientMonitorImpl {
333
330
  return;
334
331
  }
335
332
  if (!this._timer) {
336
- this._timer = new Timer_1.Timer();
333
+ this._timer = new Timer_1.Timer(this._config.tickingTimeInMs);
337
334
  }
338
335
  if (this._timer.hasListener("send")) {
339
336
  this._timer.clear("send");
@@ -342,9 +339,26 @@ class ClientMonitorImpl {
342
339
  type: "send",
343
340
  process: this.send.bind(this),
344
341
  fixedDelayInMs: sendingPeriodInMs,
342
+ initialDelayInMs: sendingPeriodInMs,
345
343
  context: "Sending Samples",
346
344
  });
347
345
  }
346
+ _collectClientDevices() {
347
+ this._clientDevices.collect();
348
+ if (this._clientDevices.isOsChanged) {
349
+ this._sampler.addOs(this._clientDevices.os);
350
+ }
351
+ if (this._clientDevices.isBrowserChanged) {
352
+ this._sampler.addBrowser(this._clientDevices.browser);
353
+ }
354
+ if (this._clientDevices.isPlatformChanged) {
355
+ this._sampler.addPlatform(this._clientDevices.platform);
356
+ }
357
+ if (this._clientDevices.isEngineChanged) {
358
+ this._sampler.addEngine(this._clientDevices.engine);
359
+ }
360
+ this._clientDevices.pivot();
361
+ }
348
362
  _makeCollector() {
349
363
  var _a, _b;
350
364
  const collectorConfig = this._config.collectors;
package/lib/Sampler.d.ts CHANGED
@@ -33,6 +33,10 @@ export declare type SamplerConfig = {
33
33
  * DEFAULT: true
34
34
  */
35
35
  incrementalSampling?: boolean;
36
+ /**
37
+ * Indicate if the sampler should use the timestamp provided by the rtcstats (the minimum of the peer connection stats will be used as the timestamp of the sample)
38
+ */
39
+ useStatsSample?: boolean;
36
40
  };
37
41
  declare type SamplerConstructorConfig = SamplerConfig & {
38
42
  roomId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Sampler.d.ts","sourceRoot":"","sources":["../src/Sampler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Sampler.d.ts","sourceRoot":"","sources":["../src/Sampler.ts"],"names":[],"mappings":"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"}
package/lib/Sampler.js CHANGED
@@ -11,6 +11,7 @@ const supplyDefaultConfig = () => {
11
11
  roomId: (0, uuid_1.v4)(),
12
12
  clientId: (0, uuid_1.v4)(),
13
13
  incrementalSampling: true,
14
+ useStatsSample: true,
14
15
  };
15
16
  return defaultConfig;
16
17
  };
@@ -129,7 +130,6 @@ class Sampler {
129
130
  if (this._closed) {
130
131
  throw new Error(`Cannot sample a closed Sampler`);
131
132
  }
132
- const now = Date.now();
133
133
  const clientSample = {
134
134
  callId: this._config.callId,
135
135
  clientId: this._config.clientId,
@@ -147,7 +147,7 @@ class Sampler {
147
147
  userMediaErrors: this._userMediaErrors,
148
148
  extensionStats: this._extensionStats,
149
149
  mediaDevices: this._mediaDevices,
150
- timestamp: now,
150
+ timestamp: Date.now(),
151
151
  };
152
152
  ++this._sampleSeq;
153
153
  this._engine = undefined;
@@ -164,6 +164,12 @@ class Sampler {
164
164
  this._sampled = clientSample.timestamp;
165
165
  return clientSample;
166
166
  }
167
+ else if (this._config.useStatsSample) {
168
+ const statsTimestamp = this._statsReader.statsTimestamp;
169
+ if (statsTimestamp) {
170
+ clientSample.timestamp = statsTimestamp;
171
+ }
172
+ }
167
173
  let inboundAudioTracks;
168
174
  let inboundVideoTracks;
169
175
  let outboundAudioTracks;
@@ -9,6 +9,7 @@ export declare class PeerConnectionEntryImpl implements PeerConnectionEntry {
9
9
  static create(config: PeerConnectionEntryConfig): PeerConnectionEntryImpl;
10
10
  readonly created: number;
11
11
  private _config;
12
+ private _statsTimestamp?;
12
13
  private _updated;
13
14
  private _touched;
14
15
  private _stats?;
@@ -58,6 +59,7 @@ export declare class PeerConnectionEntryImpl implements PeerConnectionEntry {
58
59
  get id(): string | undefined;
59
60
  get updated(): number;
60
61
  get touched(): number;
62
+ get statsTimestamp(): number | undefined;
61
63
  codecs(): IterableIterator<CodecEntry>;
62
64
  inboundRtps(): IterableIterator<InboundRtpEntry>;
63
65
  update(statsEntry: StatsEntry): void;
@@ -1 +1 @@
1
- {"version":3,"file":"PeerConnectionEntryImpl.d.ts","sourceRoot":"","sources":["../../src/entries/PeerConnectionEntryImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,uBAAuB,CAAC;AACjE,OAAO,EACH,uBAAuB,EACvB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAEhB,mBAAmB,EACnB,iBAAiB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAkC9D,aAAK,yBAAyB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,qBAAa,uBAAwB,YAAW,mBAAmB;WACjD,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,uBAAuB;IAKhF,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAC,CAA6B;IAC5C,OAAO,CAAC,sBAAsB,CAA0C;IACxE,OAAO,CAAC,uBAAuB,CAA2C;IAE1E,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,kBAAkB,CAAiD;IAC3E,OAAO,CAAC,mBAAmB,CAAkD;IAC7E,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,oBAAoB,CAAmD;IAC/E,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,kBAAkB,CAAiD;IAC3E,OAAO,CAAC,gBAAgB,CAA+C;IACvE,OAAO,CAAC,iBAAiB,CAAgD;IACzE,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,cAAc,CAA6C;IAGnE,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO;IAQP,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,cAAc,IAAI,MAAM,GAAG,SAAS,CAE9C;IAEO,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC;IAqB/C,SAAS,IAAI,gBAAgB,CAAC,aAAa,CAAC;IAI5C,YAAY,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;IAIlD,YAAY,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;IAIlD,iBAAiB,IAAI,gBAAgB,CAAC,qBAAqB,CAAC;IAI5D,kBAAkB,IAAI,gBAAgB,CAAC,sBAAsB,CAAC;IAI9D,mBAAmB,IAAI,gBAAgB,CAAC,uBAAuB,CAAC;IAIhE,YAAY,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;IAIlD,YAAY,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;IAIlD,OAAO,IAAI,gBAAgB,CAAC,WAAW,CAAC;IAIxC,UAAU,IAAI,gBAAgB,CAAC,cAAc,CAAC;IAI9C,cAAc,IAAI,gBAAgB,CAAC,kBAAkB,CAAC;IAItD,iBAAiB,IAAI,gBAAgB,CAAC,qBAAqB,CAAC;IAI5D,eAAe,IAAI,gBAAgB,CAAC,mBAAmB,CAAC;IAIxD,gBAAgB,IAAI,gBAAgB,CAAC,oBAAoB,CAAC;IAI1D,YAAY,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;IAIlD,UAAU,IAAI,gBAAgB,CAAC,cAAc,CAAC;IAI9C,aAAa,IAAI,gBAAgB,CAAC,iBAAiB,CAAC;IAI3D,IAAW,KAAK,IAAI,GAAG,CAAC,sBAAsB,GAAG,SAAS,CAEzD;IAED,IAAW,EAAE,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,OAAO,IAAI,MAAM,CAE3B;IAEM,MAAM,IAAI,gBAAgB,CAAC,UAAU,CAAC;IAItC,WAAW,IAAI,gBAAgB,CAAC,eAAe,CAAC;IAIhD,MAAM,CAAC,UAAU,EAAE,UAAU;IAQpC,OAAO,CAAC,aAAa;IAwBd,IAAI,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI;IAe3C,KAAK,IAAI,IAAI;IAOpB,OAAO,CAAC,OAAO,CA+xBb;CACL"}
1
+ {"version":3,"file":"PeerConnectionEntryImpl.d.ts","sourceRoot":"","sources":["../../src/entries/PeerConnectionEntryImpl.ts"],"names":[],"mappings":"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"}
@@ -988,6 +988,9 @@ class PeerConnectionEntryImpl {
988
988
  get touched() {
989
989
  return this._touched;
990
990
  }
991
+ get statsTimestamp() {
992
+ return this._statsTimestamp;
993
+ }
991
994
  codecs() {
992
995
  return this._codecs.values();
993
996
  }
@@ -1000,6 +1003,7 @@ class PeerConnectionEntryImpl {
1000
1003
  if (visitor.touched) {
1001
1004
  this._touched = visitor.created;
1002
1005
  }
1006
+ this._statsTimestamp = visitor.maxTimestamp;
1003
1007
  }
1004
1008
  _getEntryMaps() {
1005
1009
  const result = [
@@ -96,6 +96,10 @@ export interface StatsReader {
96
96
  * The corresponded stats (csrc stats) are deprecated and will be removed from browser
97
97
  */
98
98
  contributingSources(): IterableIterator<ContributingSourceEntry>;
99
+ /**
100
+ * The timestamp of the stats representing the collected rtc stats
101
+ */
102
+ readonly statsTimestamp: number | undefined;
99
103
  }
100
104
  export interface StatsWriter {
101
105
  register(collectorId: string, label?: string): void;
@@ -105,6 +109,7 @@ export interface StatsWriter {
105
109
  export declare class StatsStorage implements StatsReader, StatsWriter {
106
110
  private _peerConnections;
107
111
  accept(collectorId: string, statsEntry: StatsEntry): void;
112
+ get statsTimestamp(): number | undefined;
108
113
  trim(expirationThresholdInMs: number): void;
109
114
  clear(): void;
110
115
  register(collectorId: string, collectorLabel?: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"StatsStorage.d.ts","sourceRoot":"","sources":["../../src/entries/StatsStorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StatsStorage.d.ts","sourceRoot":"","sources":["../../src/entries/StatsStorage.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,17 @@ class StatsStorage {
16
16
  }
17
17
  pcEntry.update(statsEntry);
18
18
  }
19
+ get statsTimestamp() {
20
+ let result;
21
+ for (const pc of Array.from(this._peerConnections.values())) {
22
+ if (pc.statsTimestamp === undefined)
23
+ continue;
24
+ if (result === undefined || pc.statsTimestamp < result) {
25
+ result = pc.statsTimestamp;
26
+ }
27
+ }
28
+ return result;
29
+ }
19
30
  trim(expirationThresholdInMs) {
20
31
  for (const pcEntry of this._peerConnections.values()) {
21
32
  pcEntry.trim(expirationThresholdInMs);
@@ -1,7 +1,16 @@
1
1
  import { W3CStats as W3C } from "@observertc/monitor-schemas";
2
2
  export declare type StatsValue = W3C.RtcCodecStats | W3C.RtcInboundRtpStreamStats | W3C.RtcOutboundRTPStreamStats | W3C.RtcRemoteInboundRtpStreamStats | W3C.RtcRemoteOutboundRTPStreamStats | W3C.RtcAudioSourceStats | W3C.RtcVideoSourceStats | W3C.RtcPeerConnectionStats | W3C.RtcDataChannelStats | W3C.RtcTransportStats | W3C.RtcCertificateStats | W3C.RTCAudioPlayoutStats | W3C.RtcRtpContributingSourceStats | W3C.RtcRtpTransceiverStats | W3C.RtcAudioSenderStats | W3C.RtcVideoSenderStats | W3C.RtcAudioReceiverStats | W3C.RtcVideoReceiverStats | W3C.RtcSctpTransportStats | W3C.RtcIceCandidatePairStats | W3C.RtcLocalCandidateStats | W3C.RtcRemoteCandidateStats | W3C.RtcIceServerStats;
3
3
  export declare type StatsEntry = [W3C.StatsType, StatsValue];
4
+ export declare type Timestamps = {
5
+ maxTimestamp?: number;
6
+ minTimestamp?: number;
7
+ };
4
8
  export declare abstract class StatsVisitor {
9
+ private _minTimestamp?;
10
+ private _maxTimestamp?;
11
+ get minTimestamp(): number | undefined;
12
+ get maxTimestamp(): number | undefined;
13
+ resetTimestamps(): void;
5
14
  visit(statsEntry: StatsEntry): void;
6
15
  abstract visitCodec(stats: W3C.RtcCodecStats): void;
7
16
  abstract visitInboundRtp(stats: W3C.RtcInboundRtpStreamStats): void;