@observertc/observer-js 0.40.4-beta → 0.40.6-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.
@@ -7,7 +7,6 @@ export type ObservedCallModel = {
7
7
  serviceId: string;
8
8
  roomId: string;
9
9
  callId: string;
10
- started: number;
11
10
  };
12
11
  export type ObservedCallEvents = {
13
12
  update: [];
@@ -24,17 +23,19 @@ export declare class ObservedCall<AppData extends Record<string, unknown> = Reco
24
23
  private readonly _model;
25
24
  readonly observer: Observer;
26
25
  readonly appData: AppData;
26
+ readonly created: number;
27
27
  private readonly _clients;
28
28
  readonly sfuStreamIdToOutboundAudioTrack: Map<string | number, ObservedOutboundTrack<"audio">>;
29
29
  readonly sfuStreamIdToOutboundVideoTrack: Map<string | number, ObservedOutboundTrack<"video">>;
30
30
  private _closed;
31
+ private _updated;
31
32
  private _ended?;
32
33
  constructor(_model: ObservedCallModel, observer: Observer, appData: AppData);
33
34
  get serviceId(): string;
34
35
  get reports(): import("./ReportsCollector").ReportsCollector;
35
36
  get roomId(): string;
36
37
  get callId(): string;
37
- get started(): number;
38
+ get updated(): number;
38
39
  get ended(): number | undefined;
39
40
  get clients(): ReadonlyMap<string, ObservedClient>;
40
41
  get closed(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedCall.d.ts","sourceRoot":"","sources":["../src/ObservedCall.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,MAAM,iBAAiB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,MAAM,EAAE,EAAE,CAAC;IACX,SAAS,EAAE,CAAC,cAAc,CAAC,CAAC;IAC5B,KAAK,EAAE,EAAE,CAAC;CACV,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,YAAY;IACpC,EAAE,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3G,GAAG,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5G,IAAI,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7G,IAAI,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAC5F;AAED,qBAAa,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,YAAY;IAS/G,OAAO,CAAC,QAAQ,CAAC,MAAM;aACP,QAAQ,EAAE,QAAQ;aAClB,OAAO,EAAE,OAAO;IAVjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAE9D,SAAgB,+BAA+B,uDAA8D;IAC7G,SAAgB,+BAA+B,uDAA8D;IAC7G,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAGN,MAAM,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO;IAMjC,IAAW,SAAS,IAAI,MAAM,CAG7B;IAED,IAAW,OAAO,kDAEjB;IAED,IAAW,MAAM,WAGhB;IAED,IAAW,MAAM,WAGhB;IAED,IAAW,OAAO,WAEjB;IAED,IAAW,KAAK,uBAEf;IAED,IAAW,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAExD;IAED,IAAW,MAAM,YAEhB;IAEM,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM;IAUxB,YAAY,CAAC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,mBAAmB,GAAG;QAAE,OAAO,EAAE,aAAa,CAAC;QAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;CAgC5M"}
1
+ {"version":3,"file":"ObservedCall.d.ts","sourceRoot":"","sources":["../src/ObservedCall.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,MAAM,iBAAiB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,MAAM,EAAE,EAAE,CAAC;IACX,SAAS,EAAE,CAAC,cAAc,CAAC,CAAC;IAC5B,KAAK,EAAE,EAAE,CAAC;CACV,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,YAAY;IACpC,EAAE,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3G,GAAG,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5G,IAAI,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7G,IAAI,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAC5F;AAED,qBAAa,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,YAAY;IAY/G,OAAO,CAAC,QAAQ,CAAC,MAAM;aACP,QAAQ,EAAE,QAAQ;aAClB,OAAO,EAAE,OAAO;IAbjC,SAAgB,OAAO,SAAc;IAErC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAE9D,SAAgB,+BAA+B,uDAA8D;IAC7G,SAAgB,+BAA+B,uDAA8D;IAC7G,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAGN,MAAM,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO;IAMjC,IAAW,SAAS,IAAI,MAAM,CAG7B;IAED,IAAW,OAAO,kDAEjB;IAED,IAAW,MAAM,WAGhB;IAED,IAAW,MAAM,WAGhB;IAED,IAAW,OAAO,WAEjB;IAED,IAAW,KAAK,uBAEf;IAED,IAAW,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAExD;IAED,IAAW,MAAM,YAEhB;IAEM,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM;IAUxB,YAAY,CAAC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,mBAAmB,GAAG;QAAE,OAAO,EAAE,aAAa,CAAC;QAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;CAmC5M"}
@@ -21,10 +21,12 @@ class ObservedCall extends events_1.EventEmitter {
21
21
  this._model = _model;
22
22
  this.observer = observer;
23
23
  this.appData = appData;
24
+ this.created = Date.now();
24
25
  this._clients = new Map();
25
26
  this.sfuStreamIdToOutboundAudioTrack = new Map();
26
27
  this.sfuStreamIdToOutboundVideoTrack = new Map();
27
28
  this._closed = false;
29
+ this._updated = Date.now();
28
30
  this.setMaxListeners(Infinity);
29
31
  }
30
32
  get serviceId() {
@@ -42,8 +44,8 @@ class ObservedCall extends events_1.EventEmitter {
42
44
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
43
45
  return this._model.callId;
44
46
  }
45
- get started() {
46
- return Number(this._model.started);
47
+ get updated() {
48
+ return this._updated;
47
49
  }
48
50
  get ended() {
49
51
  return this._ended;
@@ -67,7 +69,10 @@ class ObservedCall extends events_1.EventEmitter {
67
69
  throw new Error(`Call ${this.callId} is closed`);
68
70
  const { appData, generateClientJoinedReport, joined = Date.now() } = config, model = __rest(config, ["appData", "generateClientJoinedReport", "joined"]);
69
71
  const result = new ObservedClient_1.ObservedClient(model, this, appData);
70
- const onUpdate = () => this.emit('update');
72
+ const onUpdate = () => {
73
+ this._updated = Date.now();
74
+ this.emit('update');
75
+ };
71
76
  result.once('close', () => {
72
77
  result.off('update', onUpdate);
73
78
  this._clients.delete(result.clientId);
@@ -74,9 +74,24 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
74
74
  totalDataChannelBytesReceived: number;
75
75
  totalSentBytes: number;
76
76
  totalReceivedBytes: number;
77
+ totalReceivedAudioBytes: number;
78
+ totalReceivedVideoBytes: number;
79
+ totalSentAudioBytes: number;
80
+ totalSentVideoBytes: number;
81
+ deltaReceivedAudioBytes: number;
82
+ deltaReceivedVideoBytes: number;
83
+ deltaSentAudioBytes: number;
84
+ deltaSentVideoBytes: number;
85
+ deltaDataChannelBytesSent: number;
86
+ deltaDataChannelBytesReceived: number;
87
+ deltaInboundPacketsLost: number;
88
+ deltaInboundPacketsReceived: number;
89
+ deltaOutboundPacketsSent: number;
77
90
  avgRttInMs?: number;
78
- sendingBitrate?: number;
79
- receivingBitrate?: number;
91
+ outboundAudioBitrate?: number;
92
+ outboundVideoBitrate?: number;
93
+ inboundAudioBitrate?: number;
94
+ inboundVideoBitrate?: number;
80
95
  readonly mediaDevices: string[];
81
96
  readonly codecs: string[];
82
97
  readonly userMediaErrors: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAChJ,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAOlE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,MAAM,MAAM,mBAAmB,GAAE;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,EAAE,CAAC;IACX,KAAK,EAAE,EAAE,CAAC;IACV,iBAAiB,EAAE,CAAC,sBAAsB,CAAC,CAAC;IAC5C,wBAAwB,EAAE;QAAC;YAC1B,cAAc,EAAE,sBAAsB,CAAC;YACvC,KAAK,EAAE,MAAM,CAAC;SACd;KAAC,CAAC;IACH,uBAAuB,EAAE;QAAC;YACzB,cAAc,EAAE,sBAAsB,CAAC;YACvC,KAAK,EAAE,MAAM,CAAC;SACd;KAAC,CAAC;IACH,qBAAqB,EAAE;QAAC;YACvB,cAAc,EAAE,sBAAsB,CAAC;YACvC,KAAK,EAAE,MAAM,CAAC;SACd;KAAC,CAAC;IACH,qBAAqB,EAAE;QAAC;YACvB,cAAc,EAAE,sBAAsB,CAAC;YACvC,cAAc,EAAE,iBAAiB,CAAC;YAClC,eAAe,EAAE,kBAAkB,CAAC;SACpC;KAAC,CAAC;IACH,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;CACrB,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxG,EAAE,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/G,GAAG,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAChH,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACjH,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAChG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,YAAY;IAqCjH,OAAO,CAAC,QAAQ,CAAC,MAAM;aACP,IAAI,EAAE,YAAY;aAClB,OAAO,EAAE,OAAO;IArCjC,SAAgB,OAAO,SAAc;IAC9B,QAAQ,SAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6C;IAE9E,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,sBAAsB,CAAC,CAAS;IACxC,OAAO,CAAC,KAAK,CAAC,CAAS;IAEhB,SAAS,UAAS;IAClB,wBAAwB,SAAK;IAC7B,wBAAwB,SAAK;IAC7B,uBAAuB,SAAK;IAC5B,2BAA2B,SAAK;IAChC,wBAAwB,SAAK;IAC7B,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAClC,cAAc,SAAK;IACnB,kBAAkB,SAAK;IAEvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAEjC,SAAgB,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5C,SAAgB,MAAM,EAAE,MAAM,EAAE,CAAM;IACtC,SAAgB,eAAe,EAAE,MAAM,EAAE,CAAM;IAE/C,SAAgB,8BAA8B,sBAA6B;IAC3E,SAAgB,sCAAsC,sBAA6B;gBAGjE,MAAM,EAAE,mBAAmB,EAC5B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,OAAO;IAMjC,IAAW,GAAG,IAAI,WAAW,GAAG,SAAS,CAIxC;IAED,IAAW,QAAQ,IAAI,MAAM,CAG5B;IAED,IAAW,MAAM,WAGhB;IAED,IAAW,SAAS,WAGnB;IAED,IAAW,MAAM,WAGhB;IAED,IAAW,WAAW,WAGrB;IAED,IAAW,OAAO,kDAEjB;IAED,IAAW,MAAM,uBAEhB;IAED,IAAW,qBAAqB,uBAE/B;IAED,IAAW,MAAM,uBAEhB;IAED,IAAW,OAAO,wBAEjB;IAED,IAAW,MAAM,uBAEhB;IAED,IAAW,eAAe,gCAEzB;IAED,IAAW,QAAQ,yBAElB;IAED,IAAW,cAAc,WAExB;IAED,IAAW,OAAO,WAEjB;IAED,IAAW,MAAM,YAEhB;IAED,IAAW,eAAe,IAAI,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAExE;IAEM,KAAK;IAaL,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IA+gBzC,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,oBAAoB;CAe5B"}
1
+ {"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,19 @@ class ObservedClient extends events_1.EventEmitter {
42
42
  this.totalDataChannelBytesReceived = 0;
43
43
  this.totalSentBytes = 0;
44
44
  this.totalReceivedBytes = 0;
45
+ this.totalReceivedAudioBytes = 0;
46
+ this.totalReceivedVideoBytes = 0;
47
+ this.totalSentAudioBytes = 0;
48
+ this.totalSentVideoBytes = 0;
49
+ this.deltaReceivedAudioBytes = 0;
50
+ this.deltaReceivedVideoBytes = 0;
51
+ this.deltaSentAudioBytes = 0;
52
+ this.deltaSentVideoBytes = 0;
53
+ this.deltaDataChannelBytesSent = 0;
54
+ this.deltaDataChannelBytesReceived = 0;
55
+ this.deltaInboundPacketsLost = 0;
56
+ this.deltaInboundPacketsReceived = 0;
57
+ this.deltaOutboundPacketsSent = 0;
45
58
  this.mediaDevices = [];
46
59
  this.codecs = [];
47
60
  this.userMediaErrors = [];
@@ -451,38 +464,58 @@ class ObservedClient extends events_1.EventEmitter {
451
464
  }
452
465
  // update metrics
453
466
  const wasUsingTURN = this.usingTURN;
467
+ const elapsedTimeInMs = now - this._updated;
454
468
  this.usingTURN = false;
455
469
  this.availableIncomingBitrate = 0;
456
470
  this.availableOutgoingBitrate = 0;
457
- this.totalSentBytes = 0;
458
- this.totalReceivedBytes = 0;
459
- this.totalOutboundPacketsSent = 0;
460
- this.totalInboundPacketsReceived = 0;
461
- this.totalInboundPacketsLost = 0;
462
- this.totalDataChannelBytesSent = 0;
463
- this.totalDataChannelBytesReceived = 0;
464
- this.sendingBitrate = 0;
465
- this.receivingBitrate = 0;
471
+ this.deltaInboundPacketsLost = 0;
472
+ this.deltaInboundPacketsReceived = 0;
473
+ this.deltaOutboundPacketsSent = 0;
474
+ this.deltaReceivedAudioBytes = 0;
475
+ this.deltaReceivedVideoBytes = 0;
476
+ this.deltaSentAudioBytes = 0;
477
+ this.deltaSentVideoBytes = 0;
478
+ this.deltaDataChannelBytesReceived = 0;
479
+ this.deltaDataChannelBytesSent = 0;
480
+ this.outboundAudioBitrate = 0;
481
+ this.outboundVideoBitrate = 0;
482
+ this.inboundAudioBitrate = 0;
483
+ this.inboundVideoBitrate = 0;
466
484
  let sumRttInMs = 0;
467
485
  for (const peerConnection of this._peerConnections.values()) {
468
486
  if (peerConnection.closed)
469
487
  continue;
470
488
  peerConnection.updateMetrics();
471
- this.totalSentBytes += peerConnection.totalSentAudioBytes + peerConnection.totalSentVideoBytes;
472
- this.totalReceivedBytes += peerConnection.totalReceivedAudioBytes + peerConnection.totalReceivedVideoBytes;
473
- this.totalOutboundPacketsSent += peerConnection.totalOutboundPacketsSent;
474
- this.totalInboundPacketsReceived += peerConnection.totalInboundPacketsReceived;
475
- this.totalInboundPacketsLost += peerConnection.totalInboundPacketsLost;
476
- this.totalDataChannelBytesSent += peerConnection.totalDataChannelBytesSent;
477
- this.totalDataChannelBytesReceived += peerConnection.totalDataChannelBytesReceived;
478
- this.sendingBitrate += peerConnection.sendingAudioBitrate + peerConnection.sendingVideoBitrate;
479
- this.receivingBitrate += peerConnection.receivingAudioBitrate + peerConnection.receivingVideoBitrate;
489
+ this.deltaInboundPacketsLost += peerConnection.deltaInboundPacketsLost;
490
+ this.deltaInboundPacketsReceived += peerConnection.deltaInboundPacketsReceived;
491
+ this.deltaOutboundPacketsSent += peerConnection.deltaOutboundPacketsSent;
492
+ this.deltaReceivedAudioBytes += peerConnection.deltaReceivedAudioBytes;
493
+ this.deltaReceivedVideoBytes += peerConnection.deltaReceivedVideoBytes;
494
+ this.deltaSentAudioBytes += peerConnection.deltaSentAudioBytes;
495
+ this.deltaSentVideoBytes += peerConnection.deltaSentVideoBytes;
496
+ this.deltaDataChannelBytesReceived += peerConnection.deltaDataChannelBytesReceived;
497
+ this.deltaDataChannelBytesSent += peerConnection.deltaDataChannelBytesSent;
480
498
  this.availableIncomingBitrate += (_18 = peerConnection.availableIncomingBitrate) !== null && _18 !== void 0 ? _18 : 0;
481
499
  this.availableOutgoingBitrate += (_19 = peerConnection.availableOutgoingBitrate) !== null && _19 !== void 0 ? _19 : 0;
482
500
  sumRttInMs += (_20 = peerConnection.avgRttInMs) !== null && _20 !== void 0 ? _20 : 0;
483
501
  if (peerConnection.usingTURN)
484
502
  this.usingTURN = true;
485
503
  }
504
+ this.totalSentBytes += this.deltaSentAudioBytes + this.deltaSentVideoBytes;
505
+ this.totalReceivedBytes += this.deltaReceivedAudioBytes + this.deltaReceivedVideoBytes;
506
+ this.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;
507
+ this.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;
508
+ this.totalSentAudioBytes += this.deltaSentAudioBytes;
509
+ this.totalSentVideoBytes += this.deltaSentVideoBytes;
510
+ this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
511
+ this.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;
512
+ this.totalInboundPacketsLost += this.deltaInboundPacketsLost;
513
+ this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
514
+ this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
515
+ this.outboundAudioBitrate = (this.deltaSentAudioBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
516
+ this.outboundVideoBitrate = (this.deltaSentVideoBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
517
+ this.inboundAudioBitrate = (this.deltaReceivedAudioBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
518
+ this.inboundVideoBitrate = (this.deltaReceivedVideoBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
486
519
  this.avgRttInMs = this._peerConnections.size ? sumRttInMs / this._peerConnections.size : undefined;
487
520
  if (wasUsingTURN !== this.usingTURN)
488
521
  this.emit('usingturn', this.usingTURN);
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedInboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedInboundTrack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObservedInboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedInboundTrack.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,yBAAyB,CAAC,CAAC,SAAS,SAAS,IAAI;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAA;AAED,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,SAAS,IAAI;IAC7D,MAAM,EAAE,EAAE,CAAC;IACX,KAAK,EAAE,EAAE,CAAC;IACV,mBAAmB,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,+BAA+B,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,SAAS,OAAO,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAE7H,MAAM,MAAM,yBAAyB,CAAC,CAAC,SAAS,SAAS,IAAI,+BAA+B,CAAC,CAAC,CAAC,GAAG;IACjG,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAMF,MAAM,CAAC,OAAO,WAAW,oBAAoB,CAAC,IAAI,SAAS,SAAS;IACnE,EAAE,CAAC,CAAC,SAAS,MAAM,0BAA0B,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACvI,GAAG,CAAC,CAAC,SAAS,MAAM,0BAA0B,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACxI,IAAI,CAAC,CAAC,SAAS,MAAM,0BAA0B,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACzI,IAAI,CAAC,CAAC,SAAS,MAAM,0BAA0B,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IACxH,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/E;AAED,qBAAa,oBAAoB,CAAC,IAAI,SAAS,SAAS,CAAE,SAAQ,YAAY;IAgC5E,OAAO,CAAC,QAAQ,CAAC,MAAM;aACP,cAAc,EAAE,sBAAsB;IAhCvD,SAAgB,OAAO,SAAc;IAErC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsD;IAE7E,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,oBAAoB,CAAC,CAA8B;IACpD,OAAO,SAAK;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,SAAK;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,gBAAgB,SAAK;IACrB,oBAAoB,SAAK;IACzB,kBAAkB,SAAK;IACvB,mBAAmB,SAAK;IACxB,kBAAkB,SAAK;IACvB,kBAAkB,SAAK;IACvB,oBAAoB,SAAK;IACzB,2BAA2B,SAAK;IAEhC,gBAAgB,SAAK;IACrB,oBAAoB,SAAK;IACzB,kBAAkB,SAAK;IACvB,mBAAmB,SAAK;IACxB,kBAAkB,SAAK;IACvB,kBAAkB,SAAK;IACvB,oBAAoB,SAAK;IACzB,2BAA2B,SAAK;gBAGrB,MAAM,EAAE,yBAAyB,CAAC,IAAI,CAAC,EACxC,cAAc,EAAE,sBAAsB;IAMvD,IAAW,SAAS,WAEnB;IAED,IAAW,MAAM,WAEhB;IAED,IAAW,MAAM,WAEhB;IAED,IAAW,QAAQ,WAElB;IAED,IAAW,WAAW,WAErB;IAED,IAAW,gBAAgB,WAE1B;IAED,IAAW,OAAO,WAEjB;IAED,IAAW,IAAI,IAAI,IAAI,CAEtB;IAED,IAAW,WAAW,uBAErB;IAED,IAAW,SAAS,uBAEnB;IAED,IAAW,OAAO,WAEjB;IAED,IAAW,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAEvE;IAED,IAAW,OAAO,kDAEjB;IAED,IAAW,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,CAAC,IAAI,CAAC,GAAG,SAAS,EAS5E;IAED,IAAW,mBAAmB,IAXQ,qBAAqB,CAAC,IAAI,CAAC,GAAG,SAAS,CAa5E;IAED,IAAW,MAAM,YAEhB;IAEM,KAAK;IAQL,YAAY;CAuInB"}
@@ -108,7 +108,7 @@ class ObservedInboundTrack extends events_1.EventEmitter {
108
108
  this.fractionLoss = 0;
109
109
  }
110
110
  update(sample, timestamp) {
111
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
111
+ var _a, _b, _c, _d, _e;
112
112
  if (this._closed)
113
113
  return;
114
114
  const now = Date.now();
@@ -126,10 +126,22 @@ class ObservedInboundTrack extends events_1.EventEmitter {
126
126
  const elapsedTimeInMs = Math.max(1, now - this._updated);
127
127
  const lastStat = this._stats.get(sample.ssrc);
128
128
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
129
- const bitrate = (((_f = sample.bytesReceived) !== null && _f !== void 0 ? _f : 0) - ((_g = lastStat === null || lastStat === void 0 ? void 0 : lastStat.bytesReceived) !== null && _g !== void 0 ? _g : 0)) * 8 / (elapsedTimeInMs / 1000);
130
- const lostPackets = ((_h = sample.packetsLost) !== null && _h !== void 0 ? _h : 0) - ((_j = lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsLost) !== null && _j !== void 0 ? _j : 0);
131
- const receivedPackets = ((_k = sample.packetsReceived) !== null && _k !== void 0 ? _k : 0) - ((_l = lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsReceived) !== null && _l !== void 0 ? _l : 0);
132
- const fractionLost = 0 < receivedPackets && 0 < lostPackets ? (lostPackets / (receivedPackets + lostPackets)) : 0;
129
+ let bitrate = 0;
130
+ let fractionLost = 0;
131
+ let lostPackets = 0;
132
+ let receivedPackets = 0;
133
+ if ((lastStat === null || lastStat === void 0 ? void 0 : lastStat.bytesReceived) && sample.bytesReceived && lastStat.bytesReceived < sample.bytesReceived) {
134
+ bitrate = (sample.bytesReceived - lastStat.bytesReceived) / (elapsedTimeInMs / 1000);
135
+ }
136
+ if ((lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsReceived) && (sample === null || sample === void 0 ? void 0 : sample.packetsReceived) && lastStat.packetsReceived < sample.packetsReceived) {
137
+ receivedPackets = sample.packetsReceived - lastStat.packetsReceived;
138
+ }
139
+ if ((lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsLost) && sample.packetsLost && lastStat.packetsLost < sample.packetsLost) {
140
+ lostPackets = sample.packetsLost - lastStat.packetsLost;
141
+ if (0 < receivedPackets) {
142
+ fractionLost = lostPackets / (receivedPackets + lostPackets);
143
+ }
144
+ }
133
145
  let decodedFrames;
134
146
  let droppedFrames;
135
147
  let receivedFrames;
@@ -137,14 +149,22 @@ class ObservedInboundTrack extends events_1.EventEmitter {
137
149
  if (this.kind === 'video') {
138
150
  const videoSample = sample;
139
151
  const lastVideoStat = lastStat;
140
- decodedFrames = ((_m = videoSample.framesDecoded) !== null && _m !== void 0 ? _m : 0) - ((_o = lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesDecoded) !== null && _o !== void 0 ? _o : 0);
141
- droppedFrames = ((_p = videoSample.framesDropped) !== null && _p !== void 0 ? _p : 0) - ((_q = lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesDropped) !== null && _q !== void 0 ? _q : 0);
142
- receivedFrames = ((_r = videoSample.framesReceived) !== null && _r !== void 0 ? _r : 0) - ((_s = lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesReceived) !== null && _s !== void 0 ? _s : 0);
152
+ if (videoSample.framesDecoded && (lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesDecoded) && lastVideoStat.framesDecoded < videoSample.framesDecoded) {
153
+ decodedFrames = videoSample.framesDecoded - lastVideoStat.framesDecoded;
154
+ }
155
+ if (videoSample.framesDropped && (lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesDropped) && lastVideoStat.framesDropped < videoSample.framesDropped) {
156
+ droppedFrames = videoSample.framesDropped - lastVideoStat.framesDropped;
157
+ }
158
+ if (videoSample.framesReceived && (lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesReceived) && lastVideoStat.framesReceived < videoSample.framesReceived) {
159
+ receivedFrames = videoSample.framesReceived - lastVideoStat.framesReceived;
160
+ }
143
161
  }
144
162
  else if (this.kind === 'audio') {
145
163
  const audioSample = sample;
146
164
  const lastAudioStat = lastStat;
147
- silentConcealedSamples = ((_t = audioSample.silentConcealedSamples) !== null && _t !== void 0 ? _t : 0) - ((_u = lastAudioStat === null || lastAudioStat === void 0 ? void 0 : lastAudioStat.silentConcealedSamples) !== null && _u !== void 0 ? _u : 0);
165
+ if (audioSample.silentConcealedSamples && (lastAudioStat === null || lastAudioStat === void 0 ? void 0 : lastAudioStat.silentConcealedSamples) && lastAudioStat.silentConcealedSamples < audioSample.silentConcealedSamples) {
166
+ silentConcealedSamples = audioSample.silentConcealedSamples - lastAudioStat.silentConcealedSamples;
167
+ }
148
168
  }
149
169
  const stats = Object.assign(Object.assign({}, sample), { fractionLost,
150
170
  rttInMs,
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedOutboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedOutboundTrack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObservedOutboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedOutboundTrack.ts"],"names":[],"mappings":"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"}
@@ -82,7 +82,6 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
82
82
  this.deltaEncodedFrames = 0;
83
83
  }
84
84
  update(sample, timestamp) {
85
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
86
85
  if (this._closed)
87
86
  return;
88
87
  const now = Date.now();
@@ -94,17 +93,33 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
94
93
  const elapsedTimeInMs = Math.max(1, now - this._updated);
95
94
  const lastStat = this._stats.get(sample.ssrc);
96
95
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
97
- const bitrate = (((_a = sample.bytesSent) !== null && _a !== void 0 ? _a : 0) - ((_b = lastStat === null || lastStat === void 0 ? void 0 : lastStat.bytesSent) !== null && _b !== void 0 ? _b : 0)) * 8 / (elapsedTimeInMs / 1000);
98
- const deltaLostPackets = ((_c = sample.packetsLost) !== null && _c !== void 0 ? _c : 0) - ((_d = lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsLost) !== null && _d !== void 0 ? _d : 0);
99
- const deltaSentPackets = ((_e = sample.packetsSent) !== null && _e !== void 0 ? _e : 0) - ((_f = lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsSent) !== null && _f !== void 0 ? _f : 0);
100
- const deltaSentBytes = ((_g = sample.bytesSent) !== null && _g !== void 0 ? _g : 0) - ((_h = lastStat === null || lastStat === void 0 ? void 0 : lastStat.bytesSent) !== null && _h !== void 0 ? _h : 0);
96
+ let bitrate = 0;
97
+ let deltaLostPackets = 0;
98
+ let deltaSentPackets = 0;
99
+ let deltaSentBytes = 0;
100
+ if (sample.bytesSent && (lastStat === null || lastStat === void 0 ? void 0 : lastStat.bytesSent) && lastStat.bytesSent < sample.bytesSent) {
101
+ bitrate = (sample.bytesSent - lastStat.bytesSent) * 8 / (elapsedTimeInMs / 1000);
102
+ }
103
+ if (sample.packetsLost && (lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsLost) && lastStat.packetsLost < sample.packetsLost) {
104
+ deltaLostPackets = sample.packetsLost - lastStat.packetsLost;
105
+ }
106
+ if (sample.packetsSent && (lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsSent) && lastStat.packetsSent < sample.packetsSent) {
107
+ deltaSentPackets = sample.packetsSent - lastStat.packetsSent;
108
+ }
109
+ if (sample.bytesSent && (lastStat === null || lastStat === void 0 ? void 0 : lastStat.bytesSent) && lastStat.bytesSent < sample.bytesSent) {
110
+ deltaSentBytes = sample.bytesSent - lastStat.bytesSent;
111
+ }
101
112
  let deltaEncodedFrames;
102
113
  let deltaSentFrames;
103
114
  if (this.kind === 'video') {
104
115
  const videoSample = sample;
105
116
  const lastVideoStats = lastStat;
106
- deltaEncodedFrames = ((_j = videoSample.framesEncoded) !== null && _j !== void 0 ? _j : 0) - ((_k = lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesEncoded) !== null && _k !== void 0 ? _k : 0);
107
- deltaSentFrames = ((_l = videoSample.framesSent) !== null && _l !== void 0 ? _l : 0) - ((_m = lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesSent) !== null && _m !== void 0 ? _m : 0);
117
+ if ((videoSample === null || videoSample === void 0 ? void 0 : videoSample.framesEncoded) && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesEncoded) && lastVideoStats.framesEncoded < videoSample.framesEncoded) {
118
+ deltaEncodedFrames = videoSample.framesEncoded - lastVideoStats.framesEncoded;
119
+ }
120
+ if ((videoSample === null || videoSample === void 0 ? void 0 : videoSample.framesSent) && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesSent) && lastVideoStats.framesSent < videoSample.framesSent) {
121
+ deltaSentFrames = videoSample.framesSent - lastVideoStats.framesSent;
122
+ }
108
123
  }
109
124
  const stats = Object.assign(Object.assign({}, sample), { rttInMs,
110
125
  bitrate, ssrc: sample.ssrc, deltaLostPackets,
@@ -118,6 +133,7 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
118
133
  this.totalLostPackets = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.packetsLost) !== null && _a !== void 0 ? _a : 0); }, 0);
119
134
  this.totalSentPackets = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.packetsSent) !== null && _a !== void 0 ? _a : 0); }, 0);
120
135
  this.totalSentBytes = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.bytesSent) !== null && _a !== void 0 ? _a : 0); }, 0);
136
+ this.totalSentFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.deltaSentPackets) !== null && _a !== void 0 ? _a : 0); }, 0);
121
137
  this.deltaEncodedFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.deltaEncodedFrames) !== null && _a !== void 0 ? _a : 0); }, 0);
122
138
  this.deltaSentFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.deltaSentFrames) !== null && _a !== void 0 ? _a : 0); }, 0);
123
139
  this.deltaLostPackets = [...this._stats.values()].reduce((acc, stat) => acc + stat.deltaLostPackets, 0);
@@ -43,9 +43,9 @@ export declare class ObservedPeerConnection extends EventEmitter {
43
43
  totalReceivedVideoPackets: number;
44
44
  totalReceivedAudioBytes: number;
45
45
  totalReceivedVideoBytes: number;
46
- deltaInboundLostPackets: number;
47
- deltaInboundReceivedPackets: number;
48
- deltaOutboundSentPackets: number;
46
+ deltaInboundPacketsLost: number;
47
+ deltaInboundPacketsReceived: number;
48
+ deltaOutboundPacketsSent: number;
49
49
  deltaDataChannelBytesSent: number;
50
50
  deltaDataChannelBytesReceived: number;
51
51
  deltaInboundReceivedBytes: number;
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedPeerConnection.d.ts","sourceRoot":"","sources":["../src/ObservedPeerConnection.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,4BAA4B,GAAG;IAC1C,MAAM,EAAE,EAAE,CAAC;IACX,KAAK,EAAE,EAAE,CAAC;IACV,mBAAmB,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,mBAAmB,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,qBAAqB,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,qBAAqB,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,mBAAmB,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,uBAAuB,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC;AAEjG,MAAM,CAAC,OAAO,WAAW,sBAAsB;IAC9C,EAAE,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/H,GAAG,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAChI,IAAI,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACjI,IAAI,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAChH;AAED,qBAAa,sBAAuB,SAAQ,YAAY;IAoDtD,OAAO,CAAC,QAAQ,CAAC,MAAM;aACP,MAAM,EAAE,cAAc;IApDvC,SAAgB,OAAO,SAAc;IAE9B,uBAAuB,SAAK;IAC5B,2BAA2B,SAAK;IAChC,wBAAwB,SAAK;IAC7B,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAElC,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,qBAAqB,SAAK;IAC1B,qBAAqB,SAAK;IAC1B,yBAAyB,SAAK;IAC9B,yBAAyB,SAAK;IAC9B,uBAAuB,SAAK;IAC5B,uBAAuB,SAAK;IAE5B,uBAAuB,SAAK;IAC5B,2BAA2B,SAAK;IAChC,wBAAwB,SAAK;IAC7B,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAClC,yBAAyB,SAAK;IAC9B,sBAAsB,SAAK;IAE3B,uBAAuB,SAAK;IAC5B,uBAAuB,SAAK;IAC5B,yBAAyB,SAAK;IAC9B,yBAAyB,SAAK;IAC9B,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,qBAAqB,SAAK;IAC1B,qBAAqB,SAAK;IAE1B,UAAU,CAAC,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,OAAO,CAAC,CAA8B;IAC9C,OAAO,CAAC,OAAO,CAAC,CAAS;IAEzB,SAAgB,GAAG,cAA4B;IAC/C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAoD;IACxF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAoD;IACxF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqD;IAC1F,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqD;IAC1F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0C;gBAGtD,MAAM,EAAE,2BAA2B,EACpC,MAAM,EAAE,cAAc;IAMvC,IAAW,SAAS,WAEnB;IAED,IAAW,MAAM,WAEhB;IAED,IAAW,MAAM,WAEhB;IAED,IAAW,QAAQ,WAElB;IAED,IAAW,WAAW,WAErB;IAED,IAAW,KAAK,IAIQ,MAAM,GAAG,SAAS,CAFzC;IAED,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAEzC;IAED,IAAW,SAAS,YAEnB;IAED,IAAW,wBAAwB,uBAElC;IAED,IAAW,wBAAwB,uBAElC;IAED,IAAW,gBAAgB,IAAI,MAAM,CAGpC;IAED,IAAW,OAAO,kDAEjB;IAED,IAAW,KAAK,IAAI,2BAA2B,GAAG,SAAS,CAE1D;IAED,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,kBAAkB,IAAI,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAElF;IAED,IAAW,kBAAkB,IAAI,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAElF;IAED,IAAW,mBAAmB,IAAI,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAEpF;IAED,IAAW,mBAAmB,IAAI,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAEpF;IAED,IAAW,YAAY,IAAI,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAElE;IAED,IAAW,UAAU,WAEpB;IAED,IAAW,MAAM,IAIQ,MAAM,GAAG,SAAS,CAF1C;IAED,IAAW,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAQ1C;IAED,IAAW,MAAM,YAEhB;IAEM,KAAK;IAYL,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,SAAS;IAItK,YAAY;IAkBZ,aAAa;IAuGb,MAAM,CAAC,MAAM,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM;IA4BzD,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC;IAkBhH,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC;IAkBhH,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC;IAkBnH,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC;IAkBnH,iBAAiB,CAAC,SAAS,EAAE,MAAM;CAgB1C"}
1
+ {"version":3,"file":"ObservedPeerConnection.d.ts","sourceRoot":"","sources":["../src/ObservedPeerConnection.ts"],"names":[],"mappings":"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"}
@@ -25,9 +25,9 @@ class ObservedPeerConnection extends events_1.EventEmitter {
25
25
  this.totalReceivedVideoPackets = 0;
26
26
  this.totalReceivedAudioBytes = 0;
27
27
  this.totalReceivedVideoBytes = 0;
28
- this.deltaInboundLostPackets = 0;
29
- this.deltaInboundReceivedPackets = 0;
30
- this.deltaOutboundSentPackets = 0;
28
+ this.deltaInboundPacketsLost = 0;
29
+ this.deltaInboundPacketsReceived = 0;
30
+ this.deltaOutboundPacketsSent = 0;
31
31
  this.deltaDataChannelBytesSent = 0;
32
32
  this.deltaDataChannelBytesReceived = 0;
33
33
  this.deltaInboundReceivedBytes = 0;
@@ -146,15 +146,23 @@ class ObservedPeerConnection extends events_1.EventEmitter {
146
146
  return (_c = (_b = (_a = this._inboundAudioTracks.get(trackId)) !== null && _a !== void 0 ? _a : this._inboundVideoTracks.get(trackId)) !== null && _b !== void 0 ? _b : this._outboundAudioTracks.get(trackId)) !== null && _c !== void 0 ? _c : this._outboundVideoTracks.get(trackId);
147
147
  }
148
148
  resetMetrics() {
149
- this.deltaInboundLostPackets = 0;
150
- this.deltaInboundReceivedPackets = 0;
151
- this.deltaOutboundSentPackets = 0;
149
+ this.deltaInboundPacketsLost = 0;
150
+ this.deltaInboundPacketsReceived = 0;
151
+ this.deltaOutboundPacketsSent = 0;
152
152
  this.deltaDataChannelBytesSent = 0;
153
153
  this.deltaDataChannelBytesReceived = 0;
154
+ this.deltaInboundReceivedBytes = 0;
155
+ this.deltaOutboundSentBytes = 0;
154
156
  this.deltaReceivedAudioBytes = 0;
155
157
  this.deltaReceivedVideoBytes = 0;
158
+ this.deltaReceivedAudioPackets = 0;
159
+ this.deltaReceivedVideoPackets = 0;
156
160
  this.deltaSentAudioBytes = 0;
157
161
  this.deltaSentVideoBytes = 0;
162
+ this.sendingAudioBitrate = 0;
163
+ this.sendingVideoBitrate = 0;
164
+ this.receivingAudioBitrate = 0;
165
+ this.receivingVideoBitrate = 0;
158
166
  this._inboundAudioTracks.forEach((track) => track.resetMetrics());
159
167
  this._inboundVideoTracks.forEach((track) => track.resetMetrics());
160
168
  this._outboundAudioTracks.forEach((track) => track.resetMetrics());
@@ -162,77 +170,48 @@ class ObservedPeerConnection extends events_1.EventEmitter {
162
170
  }
163
171
  updateMetrics() {
164
172
  var _a;
165
- this.totalInboundPacketsLost = 0;
166
- this.totalInboundPacketsReceived = 0;
167
- this.totalOutboundPacketsSent = 0;
168
- this.totalDataChannelBytesSent = 0;
169
- this.totalDataChannelBytesReceived = 0;
170
- this.totalSentAudioBytes = 0;
171
- this.totalSentVideoBytes = 0;
172
- this.totalReceivedAudioBytes = 0;
173
- this.totalReceivedVideoBytes = 0;
174
- this.sendingAudioBitrate = 0;
175
- this.sendingVideoBitrate = 0;
176
- this.receivingAudioBitrate = 0;
177
- this.receivingVideoBitrate = 0;
178
173
  let sumRttInMs = 0;
179
174
  this._inboundAudioTracks.forEach((track) => {
180
175
  var _a;
181
- this.deltaInboundLostPackets += track.deltaLostPackets;
182
- this.deltaInboundReceivedPackets += track.deltaReceivedPackets;
176
+ this.deltaInboundPacketsLost += track.deltaLostPackets;
177
+ this.deltaInboundPacketsReceived += track.deltaReceivedPackets;
183
178
  this.deltaInboundReceivedBytes += track.deltaBytesReceived;
184
179
  this.deltaReceivedAudioBytes += track.deltaBytesReceived;
185
180
  this.deltaReceivedAudioPackets += track.deltaReceivedPackets;
186
181
  this.receivingAudioBitrate += track.bitrate;
187
- this.totalInboundPacketsLost += track.totalLostPackets;
188
- this.totalInboundPacketsReceived += track.totalReceivedPackets;
189
- this.totalReceivedAudioBytes += track.totalBytesReceived;
190
- this.totalReceivedAudioPacktes += track.totalReceivedPackets;
191
182
  sumRttInMs = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0);
192
183
  });
193
184
  this._inboundVideoTracks.forEach((track) => {
194
185
  var _a;
195
- this.deltaInboundLostPackets += track.deltaLostPackets;
196
- this.deltaInboundReceivedPackets += track.deltaReceivedPackets;
186
+ this.deltaInboundPacketsLost += track.deltaLostPackets;
187
+ this.deltaInboundPacketsReceived += track.deltaReceivedPackets;
197
188
  this.deltaInboundReceivedBytes += track.deltaBytesReceived;
198
189
  this.deltaReceivedVideoBytes += track.deltaBytesReceived;
199
190
  this.deltaReceivedVideoPackets += track.deltaReceivedPackets;
200
191
  this.receivingVideoBitrate += track.bitrate;
201
- this.totalInboundPacketsLost += track.totalLostPackets;
202
- this.totalInboundPacketsReceived += track.totalReceivedPackets;
203
- this.totalReceivedVideoBytes += track.totalBytesReceived;
204
- this.totalReceivedVideoPackets += track.totalReceivedPackets;
205
192
  sumRttInMs = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0);
206
193
  });
207
194
  this._outboundAudioTracks.forEach((track) => {
208
195
  var _a;
209
- this.deltaOutboundSentPackets += track.deltaSentPackets;
196
+ this.deltaOutboundPacketsSent += track.deltaSentPackets;
210
197
  this.deltaOutboundSentBytes += track.deltaSentBytes;
211
198
  this.deltaSentAudioBytes += track.deltaSentBytes;
212
199
  this.deltaSentAudioBytes += track.deltaSentPackets;
213
200
  this.sendingAudioBitrate += track.bitrate;
214
- this.totalOutboundPacketsSent += track.totalSentPackets;
215
- this.totalSentAudioBytes += track.totalSentBytes;
216
- this.totalSentAudioPackets += track.totalSentPackets;
217
201
  sumRttInMs = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0);
218
202
  });
219
203
  this._outboundVideoTracks.forEach((track) => {
220
204
  var _a;
221
- this.deltaOutboundSentPackets += track.deltaSentPackets;
205
+ this.deltaOutboundPacketsSent += track.deltaSentPackets;
222
206
  this.deltaOutboundSentBytes += track.deltaSentBytes;
223
207
  this.deltaSentVideoBytes += track.deltaSentBytes;
224
208
  this.deltaSentVideoBytes += track.deltaSentPackets;
225
209
  this.sendingVideoBitrate += track.bitrate;
226
- this.totalOutboundPacketsSent += track.totalSentPackets;
227
- this.totalSentVideoBytes += track.totalSentBytes;
228
- this.totalSentVideoPackets += track.totalSentPackets;
229
210
  sumRttInMs = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0);
230
211
  });
231
212
  this._dataChannels.forEach((channel) => {
232
213
  this.deltaDataChannelBytesSent += channel.deltaBytesSent;
233
214
  this.deltaDataChannelBytesReceived += channel.deltaBytesReceived;
234
- this.totalDataChannelBytesSent += channel.totalBytesSent;
235
- this.totalDataChannelBytesReceived += channel.totalBytesReceived;
236
215
  });
237
216
  const iceRttInMs = (_a = this.ICE.stats) === null || _a === void 0 ? void 0 : _a.currentRoundTripTime;
238
217
  let nrOfBelongings = this._inboundAudioTracks.size + this._inboundVideoTracks.size + this._outboundAudioTracks.size + this._outboundVideoTracks.size;
@@ -241,6 +220,19 @@ class ObservedPeerConnection extends events_1.EventEmitter {
241
220
  nrOfBelongings += 1;
242
221
  }
243
222
  this.avgRttInMs = 0 < nrOfBelongings ? sumRttInMs / nrOfBelongings : undefined;
223
+ this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
224
+ this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
225
+ this.totalInboundPacketsLost += this.deltaInboundPacketsLost;
226
+ this.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;
227
+ this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
228
+ this.totalSentAudioBytes += this.deltaSentAudioBytes;
229
+ this.totalSentVideoBytes += this.deltaSentVideoBytes;
230
+ this.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;
231
+ this.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;
232
+ this.totalReceivedAudioPacktes += this.deltaReceivedAudioPackets;
233
+ this.totalReceivedVideoPackets += this.deltaReceivedVideoPackets;
234
+ this.totalSentAudioPackets += this.deltaSentAudioBytes;
235
+ this.totalSentVideoPackets += this.deltaSentVideoBytes;
244
236
  }
245
237
  update(sample, timestamp) {
246
238
  if (this._closed)
package/lib/Observer.d.ts CHANGED
@@ -45,8 +45,9 @@ export declare class Observer extends EventEmitter {
45
45
  private _reportTimer?;
46
46
  private _closed;
47
47
  constructor(config: ObserverConfig);
48
- createObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(config: PartialBy<ObservedCallModel, 'serviceId' | 'started'> & {
48
+ createObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(config: PartialBy<ObservedCallModel, 'serviceId'> & {
49
49
  appData: T;
50
+ started?: number;
50
51
  }): ObservedCall<T>;
51
52
  createObservedSfu<AppData extends Record<string, unknown> = Record<string, unknown>>(model: ObservedSfuModel, appData: AppData): ObservedSfu<AppData>;
52
53
  get observedCalls(): ReadonlyMap<string, ObservedCall>;
@@ -1 +1 @@
1
- {"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../src/Observer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../src/Observer.ts"],"names":[],"mappings":"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"}
package/lib/Observer.js CHANGED
@@ -62,8 +62,8 @@ class Observer extends events_1.EventEmitter {
62
62
  if (this._closed) {
63
63
  throw new Error('Attempted to create a call source on a closed observer');
64
64
  }
65
- const { appData } = config, model = __rest(config, ["appData"]);
66
- const call = new ObservedCall_1.ObservedCall(Object.assign(Object.assign({}, model), { serviceId: this.config.defaultServiceId, started: Date.now() }), this, appData);
65
+ const { appData, started = Date.now() } = config, model = __rest(config, ["appData", "started"]);
66
+ const call = new ObservedCall_1.ObservedCall(Object.assign(Object.assign({}, model), { serviceId: this.config.defaultServiceId }), this, appData);
67
67
  if (this._closed)
68
68
  throw new Error('Cannot create an observed call on a closed observer');
69
69
  if (this._observedCalls.has(call.callId))
@@ -73,7 +73,7 @@ class Observer extends events_1.EventEmitter {
73
73
  this.reports.addCallEventReport((0, callEventReports_1.createCallEndedEventReport)(call.serviceId, call.roomId, call.callId, Date.now()));
74
74
  });
75
75
  this._observedCalls.set(call.callId, call);
76
- this.reports.addCallEventReport((0, callEventReports_1.createCallStartedEventReport)(call.serviceId, call.roomId, call.callId, call.started));
76
+ this.reports.addCallEventReport((0, callEventReports_1.createCallStartedEventReport)(call.serviceId, call.roomId, call.callId, started));
77
77
  this.emit('newcall', call);
78
78
  return call;
79
79
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@observertc/observer-js",
3
- "version": "0.40.4-beta",
3
+ "version": "0.40.6-beta",
4
4
  "description": "Server Side NodeJS Library for processing ObserveRTC Samples",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -8,7 +8,6 @@ export type ObservedCallModel = {
8
8
  serviceId: string;
9
9
  roomId: string;
10
10
  callId: string;
11
- started: number,
12
11
  };
13
12
 
14
13
  export type ObservedCallEvents = {
@@ -25,11 +24,14 @@ export declare interface ObservedCall {
25
24
  }
26
25
 
27
26
  export class ObservedCall<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
27
+ public readonly created = Date.now();
28
+
28
29
  private readonly _clients = new Map<string, ObservedClient>();
29
30
 
30
31
  public readonly sfuStreamIdToOutboundAudioTrack = new Map<string | number, ObservedOutboundTrack<'audio'>>();
31
32
  public readonly sfuStreamIdToOutboundVideoTrack = new Map<string | number, ObservedOutboundTrack<'video'>>();
32
33
  private _closed = false;
34
+ private _updated = Date.now();
33
35
  private _ended?: number;
34
36
 
35
37
  public constructor(
@@ -60,8 +62,8 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
60
62
  return this._model.callId!;
61
63
  }
62
64
 
63
- public get started() {
64
- return Number(this._model.started);
65
+ public get updated() {
66
+ return this._updated;
65
67
  }
66
68
 
67
69
  public get ended() {
@@ -92,7 +94,10 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
92
94
  const { appData, generateClientJoinedReport, joined = Date.now(), ...model } = config;
93
95
 
94
96
  const result = new ObservedClient(model, this, appData);
95
- const onUpdate = () => this.emit('update');
97
+ const onUpdate = () => {
98
+ this._updated = Date.now();
99
+ this.emit('update');
100
+ };
96
101
 
97
102
  result.once('close', () => {
98
103
  result.off('update', onUpdate);
@@ -79,10 +79,26 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
79
79
  public totalDataChannelBytesReceived = 0;
80
80
  public totalSentBytes = 0;
81
81
  public totalReceivedBytes = 0;
82
+ public totalReceivedAudioBytes = 0;
83
+ public totalReceivedVideoBytes = 0;
84
+ public totalSentAudioBytes = 0;
85
+ public totalSentVideoBytes = 0;
86
+
87
+ public deltaReceivedAudioBytes = 0;
88
+ public deltaReceivedVideoBytes = 0;
89
+ public deltaSentAudioBytes = 0;
90
+ public deltaSentVideoBytes = 0;
91
+ public deltaDataChannelBytesSent = 0;
92
+ public deltaDataChannelBytesReceived = 0;
93
+ public deltaInboundPacketsLost = 0;
94
+ public deltaInboundPacketsReceived = 0;
95
+ public deltaOutboundPacketsSent = 0;
82
96
 
83
97
  public avgRttInMs?: number;
84
- public sendingBitrate?: number;
85
- public receivingBitrate?: number;
98
+ public outboundAudioBitrate?: number;
99
+ public outboundVideoBitrate?: number;
100
+ public inboundAudioBitrate?: number;
101
+ public inboundVideoBitrate?: number;
86
102
 
87
103
  public readonly mediaDevices: string[] = [];
88
104
  public readonly codecs: string[] = [];
@@ -677,40 +693,65 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
677
693
 
678
694
  // update metrics
679
695
  const wasUsingTURN = this.usingTURN;
696
+ const elapsedTimeInMs = now - this._updated;
680
697
 
681
698
  this.usingTURN = false;
682
699
  this.availableIncomingBitrate = 0;
683
700
  this.availableOutgoingBitrate = 0;
684
- this.totalSentBytes = 0;
685
- this.totalReceivedBytes = 0;
686
- this.totalOutboundPacketsSent = 0;
687
- this.totalInboundPacketsReceived = 0;
688
- this.totalInboundPacketsLost = 0;
689
- this.totalDataChannelBytesSent = 0;
690
- this.totalDataChannelBytesReceived = 0;
691
- this.sendingBitrate = 0;
692
- this.receivingBitrate = 0;
701
+ this.deltaInboundPacketsLost = 0;
702
+ this.deltaInboundPacketsReceived = 0;
703
+ this.deltaOutboundPacketsSent = 0;
704
+ this.deltaReceivedAudioBytes = 0;
705
+ this.deltaReceivedVideoBytes = 0;
706
+ this.deltaSentAudioBytes = 0;
707
+ this.deltaSentVideoBytes = 0;
708
+ this.deltaDataChannelBytesReceived = 0;
709
+ this.deltaDataChannelBytesSent = 0;
710
+
711
+ this.outboundAudioBitrate = 0;
712
+ this.outboundVideoBitrate = 0;
713
+ this.inboundAudioBitrate = 0;
714
+ this.inboundVideoBitrate = 0;
693
715
  let sumRttInMs = 0;
694
716
 
695
717
  for (const peerConnection of this._peerConnections.values()) {
696
718
  if (peerConnection.closed) continue;
697
719
  peerConnection.updateMetrics();
698
- this.totalSentBytes += peerConnection.totalSentAudioBytes + peerConnection.totalSentVideoBytes;
699
- this.totalReceivedBytes += peerConnection.totalReceivedAudioBytes + peerConnection.totalReceivedVideoBytes;
700
- this.totalOutboundPacketsSent += peerConnection.totalOutboundPacketsSent;
701
- this.totalInboundPacketsReceived += peerConnection.totalInboundPacketsReceived;
702
- this.totalInboundPacketsLost += peerConnection.totalInboundPacketsLost;
703
- this.totalDataChannelBytesSent += peerConnection.totalDataChannelBytesSent;
704
- this.totalDataChannelBytesReceived += peerConnection.totalDataChannelBytesReceived;
705
- this.sendingBitrate += peerConnection.sendingAudioBitrate + peerConnection.sendingVideoBitrate;
706
- this.receivingBitrate += peerConnection.receivingAudioBitrate + peerConnection.receivingVideoBitrate;
720
+ this.deltaInboundPacketsLost += peerConnection.deltaInboundPacketsLost;
721
+ this.deltaInboundPacketsReceived += peerConnection.deltaInboundPacketsReceived;
722
+ this.deltaOutboundPacketsSent += peerConnection.deltaOutboundPacketsSent;
723
+ this.deltaReceivedAudioBytes += peerConnection.deltaReceivedAudioBytes;
724
+ this.deltaReceivedVideoBytes += peerConnection.deltaReceivedVideoBytes;
725
+ this.deltaSentAudioBytes += peerConnection.deltaSentAudioBytes;
726
+ this.deltaSentVideoBytes += peerConnection.deltaSentVideoBytes;
727
+ this.deltaDataChannelBytesReceived += peerConnection.deltaDataChannelBytesReceived;
728
+ this.deltaDataChannelBytesSent += peerConnection.deltaDataChannelBytesSent;
729
+
707
730
  this.availableIncomingBitrate += peerConnection.availableIncomingBitrate ?? 0;
708
731
  this.availableOutgoingBitrate += peerConnection.availableOutgoingBitrate ?? 0;
732
+
709
733
  sumRttInMs += peerConnection.avgRttInMs ?? 0;
710
734
 
711
735
  if (peerConnection.usingTURN) this.usingTURN = true;
712
736
  }
713
737
 
738
+ this.totalSentBytes += this.deltaSentAudioBytes + this.deltaSentVideoBytes;
739
+ this.totalReceivedBytes += this.deltaReceivedAudioBytes + this.deltaReceivedVideoBytes;
740
+ this.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;
741
+ this.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;
742
+ this.totalSentAudioBytes += this.deltaSentAudioBytes;
743
+ this.totalSentVideoBytes += this.deltaSentVideoBytes;
744
+ this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
745
+ this.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;
746
+ this.totalInboundPacketsLost += this.deltaInboundPacketsLost;
747
+ this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
748
+ this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
749
+
750
+ this.outboundAudioBitrate = (this.deltaSentAudioBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
751
+ this.outboundVideoBitrate = (this.deltaSentVideoBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
752
+ this.inboundAudioBitrate = (this.deltaReceivedAudioBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
753
+ this.inboundVideoBitrate = (this.deltaReceivedVideoBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
754
+
714
755
  this.avgRttInMs = this._peerConnections.size ? sumRttInMs / this._peerConnections.size : undefined;
715
756
 
716
757
  if (wasUsingTURN !== this.usingTURN) this.emit('usingturn', this.usingTURN);
@@ -215,10 +215,24 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
215
215
  const elapsedTimeInMs = Math.max(1, now - this._updated);
216
216
  const lastStat = this._stats.get(sample.ssrc);
217
217
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
218
- const bitrate = ((sample.bytesReceived ?? 0) - (lastStat?.bytesReceived ?? 0)) * 8 / (elapsedTimeInMs / 1000);
219
- const lostPackets = (sample.packetsLost ?? 0) - (lastStat?.packetsLost ?? 0);
220
- const receivedPackets = (sample.packetsReceived ?? 0) - (lastStat?.packetsReceived ?? 0);
221
- const fractionLost = 0 < receivedPackets && 0 < lostPackets ? (lostPackets / (receivedPackets + lostPackets)) : 0;
218
+ let bitrate = 0;
219
+ let fractionLost = 0;
220
+ let lostPackets = 0;
221
+ let receivedPackets = 0;
222
+
223
+ if (lastStat?.bytesReceived && sample.bytesReceived && lastStat.bytesReceived < sample.bytesReceived) {
224
+ bitrate = (sample.bytesReceived - lastStat.bytesReceived) / (elapsedTimeInMs / 1000);
225
+ }
226
+ if (lastStat?.packetsReceived && sample?.packetsReceived && lastStat.packetsReceived < sample.packetsReceived) {
227
+ receivedPackets = sample.packetsReceived - lastStat.packetsReceived;
228
+ }
229
+ if (lastStat?.packetsLost && sample.packetsLost && lastStat.packetsLost < sample.packetsLost) {
230
+ lostPackets = sample.packetsLost - lastStat.packetsLost;
231
+ if (0 < receivedPackets) {
232
+ fractionLost = lostPackets / (receivedPackets + lostPackets);
233
+ }
234
+ }
235
+
222
236
  let decodedFrames: number | undefined;
223
237
  let droppedFrames: number | undefined;
224
238
  let receivedFrames: number | undefined;
@@ -228,14 +242,22 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
228
242
  const videoSample = sample as InboundVideoTrack;
229
243
  const lastVideoStat = lastStat as InboundVideoTrack | undefined;
230
244
 
231
- decodedFrames = (videoSample.framesDecoded ?? 0) - (lastVideoStat?.framesDecoded ?? 0);
232
- droppedFrames = (videoSample.framesDropped ?? 0) - (lastVideoStat?.framesDropped ?? 0);
233
- receivedFrames = (videoSample.framesReceived ?? 0) - (lastVideoStat?.framesReceived ?? 0);
245
+ if (videoSample.framesDecoded && lastVideoStat?.framesDecoded && lastVideoStat.framesDecoded < videoSample.framesDecoded) {
246
+ decodedFrames = videoSample.framesDecoded - lastVideoStat.framesDecoded;
247
+ }
248
+ if (videoSample.framesDropped && lastVideoStat?.framesDropped && lastVideoStat.framesDropped < videoSample.framesDropped) {
249
+ droppedFrames = videoSample.framesDropped - lastVideoStat.framesDropped;
250
+ }
251
+ if (videoSample.framesReceived && lastVideoStat?.framesReceived && lastVideoStat.framesReceived < videoSample.framesReceived) {
252
+ receivedFrames = videoSample.framesReceived - lastVideoStat.framesReceived;
253
+ }
234
254
  } else if (this.kind === 'audio') {
235
255
  const audioSample = sample as InboundAudioTrack;
236
256
  const lastAudioStat = lastStat as InboundAudioTrack | undefined;
237
-
238
- silentConcealedSamples = (audioSample.silentConcealedSamples ?? 0) - (lastAudioStat?.silentConcealedSamples ?? 0);
257
+
258
+ if (audioSample.silentConcealedSamples && lastAudioStat?.silentConcealedSamples && lastAudioStat.silentConcealedSamples < audioSample.silentConcealedSamples) {
259
+ silentConcealedSamples = audioSample.silentConcealedSamples - lastAudioStat.silentConcealedSamples;
260
+ }
239
261
  }
240
262
 
241
263
  const stats: ObservedInboundTrackStats<Kind> = {
@@ -172,10 +172,24 @@ export class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter
172
172
  const elapsedTimeInMs = Math.max(1, now - this._updated);
173
173
  const lastStat = this._stats.get(sample.ssrc);
174
174
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
175
- const bitrate = ((sample.bytesSent ?? 0) - (lastStat?.bytesSent ?? 0)) * 8 / (elapsedTimeInMs / 1000);
176
- const deltaLostPackets = (sample.packetsLost ?? 0) - (lastStat?.packetsLost ?? 0);
177
- const deltaSentPackets = (sample.packetsSent ?? 0) - (lastStat?.packetsSent ?? 0);
178
- const deltaSentBytes = (sample.bytesSent ?? 0) - (lastStat?.bytesSent ?? 0);
175
+ let bitrate = 0;
176
+ let deltaLostPackets = 0;
177
+ let deltaSentPackets = 0;
178
+ let deltaSentBytes = 0;
179
+
180
+ if (sample.bytesSent && lastStat?.bytesSent && lastStat.bytesSent < sample.bytesSent) {
181
+ bitrate = (sample.bytesSent - lastStat.bytesSent) * 8 / (elapsedTimeInMs / 1000);
182
+ }
183
+ if (sample.packetsLost && lastStat?.packetsLost && lastStat.packetsLost < sample.packetsLost) {
184
+ deltaLostPackets = sample.packetsLost - lastStat.packetsLost;
185
+ }
186
+ if (sample.packetsSent && lastStat?.packetsSent && lastStat.packetsSent < sample.packetsSent) {
187
+ deltaSentPackets = sample.packetsSent - lastStat.packetsSent;
188
+ }
189
+ if (sample.bytesSent && lastStat?.bytesSent && lastStat.bytesSent < sample.bytesSent) {
190
+ deltaSentBytes = sample.bytesSent - lastStat.bytesSent;
191
+ }
192
+
179
193
  let deltaEncodedFrames: number | undefined;
180
194
  let deltaSentFrames: number | undefined;
181
195
 
@@ -183,8 +197,12 @@ export class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter
183
197
  const videoSample = sample as OutboundVideoTrack;
184
198
  const lastVideoStats = lastStat as OutboundVideoTrack | undefined;
185
199
 
186
- deltaEncodedFrames = (videoSample.framesEncoded ?? 0) - (lastVideoStats?.framesEncoded ?? 0);
187
- deltaSentFrames = (videoSample.framesSent ?? 0) - (lastVideoStats?.framesSent ?? 0);
200
+ if (videoSample?.framesEncoded && lastVideoStats?.framesEncoded && lastVideoStats.framesEncoded < videoSample.framesEncoded) {
201
+ deltaEncodedFrames = videoSample.framesEncoded - lastVideoStats.framesEncoded;
202
+ }
203
+ if (videoSample?.framesSent && lastVideoStats?.framesSent && lastVideoStats.framesSent < videoSample.framesSent) {
204
+ deltaSentFrames = videoSample.framesSent - lastVideoStats.framesSent;
205
+ }
188
206
  }
189
207
  const stats: ObservedOutboundTrackStats<Kind> = {
190
208
  ...sample,
@@ -207,6 +225,7 @@ export class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter
207
225
  this.totalLostPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.packetsLost ?? 0), 0);
208
226
  this.totalSentPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.packetsSent ?? 0), 0);
209
227
  this.totalSentBytes = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.bytesSent ?? 0), 0);
228
+ this.totalSentFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.deltaSentPackets ?? 0), 0);
210
229
 
211
230
  this.deltaEncodedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.deltaEncodedFrames ?? 0), 0);
212
231
  this.deltaSentFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.deltaSentFrames ?? 0), 0);
@@ -49,9 +49,9 @@ export class ObservedPeerConnection extends EventEmitter {
49
49
  public totalReceivedAudioBytes = 0;
50
50
  public totalReceivedVideoBytes = 0;
51
51
 
52
- public deltaInboundLostPackets = 0;
53
- public deltaInboundReceivedPackets = 0;
54
- public deltaOutboundSentPackets = 0;
52
+ public deltaInboundPacketsLost = 0;
53
+ public deltaInboundPacketsReceived = 0;
54
+ public deltaOutboundPacketsSent = 0;
55
55
  public deltaDataChannelBytesSent = 0;
56
56
  public deltaDataChannelBytesReceived = 0;
57
57
  public deltaInboundReceivedBytes = 0;
@@ -206,16 +206,24 @@ export class ObservedPeerConnection extends EventEmitter {
206
206
  }
207
207
 
208
208
  public resetMetrics() {
209
- this.deltaInboundLostPackets = 0;
210
- this.deltaInboundReceivedPackets = 0;
211
- this.deltaOutboundSentPackets = 0;
212
-
209
+ this.deltaInboundPacketsLost = 0;
210
+ this.deltaInboundPacketsReceived = 0;
211
+ this.deltaOutboundPacketsSent = 0;
213
212
  this.deltaDataChannelBytesSent = 0;
214
213
  this.deltaDataChannelBytesReceived = 0;
214
+ this.deltaInboundReceivedBytes = 0;
215
+ this.deltaOutboundSentBytes = 0;
216
+
215
217
  this.deltaReceivedAudioBytes = 0;
216
218
  this.deltaReceivedVideoBytes = 0;
219
+ this.deltaReceivedAudioPackets = 0;
220
+ this.deltaReceivedVideoPackets = 0;
217
221
  this.deltaSentAudioBytes = 0;
218
222
  this.deltaSentVideoBytes = 0;
223
+ this.sendingAudioBitrate = 0;
224
+ this.sendingVideoBitrate = 0;
225
+ this.receivingAudioBitrate = 0;
226
+ this.receivingVideoBitrate = 0;
219
227
 
220
228
  this._inboundAudioTracks.forEach((track) => track.resetMetrics());
221
229
  this._inboundVideoTracks.forEach((track) => track.resetMetrics());
@@ -224,26 +232,11 @@ export class ObservedPeerConnection extends EventEmitter {
224
232
  }
225
233
 
226
234
  public updateMetrics() {
227
- this.totalInboundPacketsLost = 0;
228
- this.totalInboundPacketsReceived = 0;
229
- this.totalOutboundPacketsSent = 0;
230
- this.totalDataChannelBytesSent = 0;
231
- this.totalDataChannelBytesReceived = 0;
232
-
233
- this.totalSentAudioBytes = 0;
234
- this.totalSentVideoBytes = 0;
235
- this.totalReceivedAudioBytes = 0;
236
- this.totalReceivedVideoBytes = 0;
237
- this.sendingAudioBitrate = 0;
238
- this.sendingVideoBitrate = 0;
239
- this.receivingAudioBitrate = 0;
240
- this.receivingVideoBitrate = 0;
241
-
242
235
  let sumRttInMs = 0;
243
236
 
244
237
  this._inboundAudioTracks.forEach((track) => {
245
- this.deltaInboundLostPackets += track.deltaLostPackets;
246
- this.deltaInboundReceivedPackets += track.deltaReceivedPackets;
238
+ this.deltaInboundPacketsLost += track.deltaLostPackets;
239
+ this.deltaInboundPacketsReceived += track.deltaReceivedPackets;
247
240
  this.deltaInboundReceivedBytes += track.deltaBytesReceived;
248
241
 
249
242
  this.deltaReceivedAudioBytes += track.deltaBytesReceived;
@@ -251,17 +244,12 @@ export class ObservedPeerConnection extends EventEmitter {
251
244
 
252
245
  this.receivingAudioBitrate += track.bitrate;
253
246
 
254
- this.totalInboundPacketsLost += track.totalLostPackets;
255
- this.totalInboundPacketsReceived += track.totalReceivedPackets;
256
- this.totalReceivedAudioBytes += track.totalBytesReceived;
257
- this.totalReceivedAudioPacktes += track.totalReceivedPackets;
258
-
259
247
  sumRttInMs = (track.rttInMs ?? 0);
260
248
  });
261
249
 
262
250
  this._inboundVideoTracks.forEach((track) => {
263
- this.deltaInboundLostPackets += track.deltaLostPackets;
264
- this.deltaInboundReceivedPackets += track.deltaReceivedPackets;
251
+ this.deltaInboundPacketsLost += track.deltaLostPackets;
252
+ this.deltaInboundPacketsReceived += track.deltaReceivedPackets;
265
253
  this.deltaInboundReceivedBytes += track.deltaBytesReceived;
266
254
 
267
255
  this.deltaReceivedVideoBytes += track.deltaBytesReceived;
@@ -269,16 +257,11 @@ export class ObservedPeerConnection extends EventEmitter {
269
257
 
270
258
  this.receivingVideoBitrate += track.bitrate;
271
259
 
272
- this.totalInboundPacketsLost += track.totalLostPackets;
273
- this.totalInboundPacketsReceived += track.totalReceivedPackets;
274
- this.totalReceivedVideoBytes += track.totalBytesReceived;
275
- this.totalReceivedVideoPackets += track.totalReceivedPackets;
276
-
277
260
  sumRttInMs = (track.rttInMs ?? 0);
278
261
  });
279
262
 
280
263
  this._outboundAudioTracks.forEach((track) => {
281
- this.deltaOutboundSentPackets += track.deltaSentPackets;
264
+ this.deltaOutboundPacketsSent += track.deltaSentPackets;
282
265
  this.deltaOutboundSentBytes += track.deltaSentBytes;
283
266
 
284
267
  this.deltaSentAudioBytes += track.deltaSentBytes;
@@ -286,15 +269,11 @@ export class ObservedPeerConnection extends EventEmitter {
286
269
 
287
270
  this.sendingAudioBitrate += track.bitrate;
288
271
 
289
- this.totalOutboundPacketsSent += track.totalSentPackets;
290
- this.totalSentAudioBytes += track.totalSentBytes;
291
- this.totalSentAudioPackets += track.totalSentPackets;
292
-
293
272
  sumRttInMs = (track.rttInMs ?? 0);
294
273
  });
295
274
 
296
275
  this._outboundVideoTracks.forEach((track) => {
297
- this.deltaOutboundSentPackets += track.deltaSentPackets;
276
+ this.deltaOutboundPacketsSent += track.deltaSentPackets;
298
277
  this.deltaOutboundSentBytes += track.deltaSentBytes;
299
278
 
300
279
  this.deltaSentVideoBytes += track.deltaSentBytes;
@@ -302,18 +281,12 @@ export class ObservedPeerConnection extends EventEmitter {
302
281
 
303
282
  this.sendingVideoBitrate += track.bitrate;
304
283
 
305
- this.totalOutboundPacketsSent += track.totalSentPackets;
306
- this.totalSentVideoBytes += track.totalSentBytes;
307
- this.totalSentVideoPackets += track.totalSentPackets;
308
-
309
284
  sumRttInMs = (track.rttInMs ?? 0);
310
285
  });
311
286
 
312
287
  this._dataChannels.forEach((channel) => {
313
288
  this.deltaDataChannelBytesSent += channel.deltaBytesSent;
314
289
  this.deltaDataChannelBytesReceived += channel.deltaBytesReceived;
315
- this.totalDataChannelBytesSent += channel.totalBytesSent;
316
- this.totalDataChannelBytesReceived += channel.totalBytesReceived;
317
290
  });
318
291
 
319
292
  const iceRttInMs = this.ICE.stats?.currentRoundTripTime;
@@ -323,7 +296,22 @@ export class ObservedPeerConnection extends EventEmitter {
323
296
  sumRttInMs += iceRttInMs;
324
297
  nrOfBelongings += 1;
325
298
  }
299
+
326
300
  this.avgRttInMs = 0 < nrOfBelongings ? sumRttInMs / nrOfBelongings : undefined;
301
+ this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
302
+ this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
303
+ this.totalInboundPacketsLost += this.deltaInboundPacketsLost;
304
+ this.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;
305
+ this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
306
+ this.totalSentAudioBytes += this.deltaSentAudioBytes;
307
+ this.totalSentVideoBytes += this.deltaSentVideoBytes;
308
+ this.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;
309
+ this.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;
310
+ this.totalReceivedAudioPacktes += this.deltaReceivedAudioPackets;
311
+ this.totalReceivedVideoPackets += this.deltaReceivedVideoPackets;
312
+ this.totalSentAudioPackets += this.deltaSentAudioBytes;
313
+ this.totalSentVideoPackets += this.deltaSentVideoBytes;
314
+
327
315
  }
328
316
 
329
317
  public update(sample: PeerConnectionTransport, timestamp: number) {
package/src/Observer.ts CHANGED
@@ -99,17 +99,16 @@ export class Observer extends EventEmitter {
99
99
  }
100
100
 
101
101
  public createObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(
102
- config: PartialBy<ObservedCallModel, 'serviceId' | 'started'> & { appData: T }
102
+ config: PartialBy<ObservedCallModel, 'serviceId'> & { appData: T, started?: number }
103
103
  ): ObservedCall<T> {
104
104
  if (this._closed) {
105
105
  throw new Error('Attempted to create a call source on a closed observer');
106
106
  }
107
107
 
108
- const { appData, ...model } = config;
108
+ const { appData, started = Date.now(), ...model } = config;
109
109
  const call = new ObservedCall({
110
110
  ...model,
111
111
  serviceId: this.config.defaultServiceId,
112
- started: Date.now(),
113
112
  }, this, appData);
114
113
 
115
114
  if (this._closed) throw new Error('Cannot create an observed call on a closed observer');
@@ -130,7 +129,7 @@ export class Observer extends EventEmitter {
130
129
  call.serviceId,
131
130
  call.roomId,
132
131
  call.callId,
133
- call.started,
132
+ started,
134
133
  ));
135
134
 
136
135
  this.emit('newcall', call);