@observertc/observer-js 0.40.0-beta → 0.40.1-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.
@@ -42,6 +42,7 @@ export declare class ObservedCall<AppData extends Record<string, unknown> = Reco
42
42
  createClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(config: ObservedClientModel & {
43
43
  appData: ClientAppData;
44
44
  generateClientJoinedReport?: boolean;
45
+ joined?: number;
45
46
  }): ObservedClient<ClientAppData>;
46
47
  }
47
48
  //# sourceMappingURL=ObservedCall.d.ts.map
@@ -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;IAKjC,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,CAAA;KAAE;CA2B3L"}
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;IAKjC,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;CA2B5M"}
@@ -64,14 +64,14 @@ class ObservedCall extends events_1.EventEmitter {
64
64
  createClient(config) {
65
65
  if (this._closed)
66
66
  throw new Error(`Call ${this.callId} is closed`);
67
- const { appData, generateClientJoinedReport } = config, model = __rest(config, ["appData", "generateClientJoinedReport"]);
67
+ const { appData, generateClientJoinedReport, joined = Date.now() } = config, model = __rest(config, ["appData", "generateClientJoinedReport", "joined"]);
68
68
  const result = new ObservedClient_1.ObservedClient(model, this, appData);
69
69
  result.once('close', () => {
70
70
  this._clients.delete(result.clientId);
71
71
  });
72
72
  this._clients.set(result.clientId, result);
73
73
  if (generateClientJoinedReport) {
74
- this.reports.addCallEventReport((0, callEventReports_1.createClientJoinedEventReport)(this.serviceId, result.mediaUnitId, this.roomId, this.callId, result.clientId, Date.now(), result.userId, result.marker));
74
+ this.reports.addCallEventReport((0, callEventReports_1.createClientJoinedEventReport)(this.serviceId, result.mediaUnitId, this.roomId, this.callId, result.clientId, joined, result.userId, result.marker));
75
75
  }
76
76
  return result;
77
77
  }
@@ -6,17 +6,12 @@ import { ObservedPeerConnection } from './ObservedPeerConnection';
6
6
  export type ObservedClientModel = {
7
7
  clientId: string;
8
8
  mediaUnitId: string;
9
- overflowingProcessingThreshold?: number;
10
9
  userId?: string;
11
10
  marker?: string;
12
11
  operationSystem?: OperationSystem;
13
12
  engine?: Engine;
14
13
  platform?: Platform;
15
14
  browser?: Browser;
16
- /**
17
- * before client-monitor-js 3.4.0 the client joined event was generated by the observer, this flag is to keep the compatibility with the old behavior
18
- */
19
- addJoinAndDetachClientEvent?: boolean;
20
15
  };
21
16
  export type ObservedClientEvents = {
22
17
  update: [];
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":"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"}
@@ -115,12 +115,13 @@ class ObservedClient extends events_1.EventEmitter {
115
115
  this.emit('close');
116
116
  }
117
117
  accept(sample) {
118
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17;
118
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20;
119
119
  if (this._closed)
120
120
  throw new Error(`Client ${this.clientId} is closed`);
121
121
  if (sample.clientId && sample.clientId !== 'NULL' && sample.clientId !== this.clientId) {
122
122
  throw new Error(`Sample client id (${sample.clientId}) does not match the client id of the observed client (${this.clientId})`);
123
123
  }
124
+ const now = Date.now();
124
125
  ++this._acceptedSample;
125
126
  for (const peerConnection of this._peerConnections.values()) {
126
127
  if (peerConnection.closed)
@@ -201,8 +202,8 @@ class ObservedClient extends events_1.EventEmitter {
201
202
  extensionType: extensionStats.type,
202
203
  });
203
204
  }
204
- for (let _18 of (_p = sample.customCallEvents) !== null && _p !== void 0 ? _p : []) {
205
- const { timestamp } = _18, callEvent = __rest(_18, ["timestamp"]);
205
+ for (let _21 of (_p = sample.customCallEvents) !== null && _p !== void 0 ? _p : []) {
206
+ const { timestamp } = _21, callEvent = __rest(_21, ["timestamp"]);
206
207
  switch (callEvent.name) {
207
208
  case CallEventType_1.CallEventType.CLIENT_LEFT: {
208
209
  this._left = timestamp;
@@ -391,32 +392,54 @@ class ObservedClient extends events_1.EventEmitter {
391
392
  }
392
393
  peerConnection.ICE.update(candidatePair, sample.timestamp);
393
394
  }
395
+ for (const dataChannel of (_15 = sample.dataChannels) !== null && _15 !== void 0 ? _15 : []) {
396
+ if (!dataChannel.peerConnectionId || !dataChannel.dataChannelIdentifier) {
397
+ logger.warn(`DataChannel without peerConnectionId or dataChannelIdentifier: ${JSON.stringify(dataChannel)}`);
398
+ continue;
399
+ }
400
+ try {
401
+ const peerConnection = (_16 = this._peerConnections.get(dataChannel.peerConnectionId)) !== null && _16 !== void 0 ? _16 : this._createPeerConnection(dataChannel.peerConnectionId);
402
+ if (!peerConnection)
403
+ continue;
404
+ const observedDataChannel = (_17 = peerConnection.dataChannels.get(dataChannel.dataChannelIdentifier)) !== null && _17 !== void 0 ? _17 : peerConnection.createDataChannel(dataChannel.dataChannelIdentifier);
405
+ observedDataChannel.update(dataChannel, sample.timestamp);
406
+ }
407
+ catch (err) {
408
+ logger.error(`Error creating data channel: ${err === null || err === void 0 ? void 0 : err.message}`);
409
+ }
410
+ }
394
411
  // close entries that are idle for too long
395
412
  if (this.call.observer.config.maxEntryIdleTimeInMs && this._updated < sample.timestamp) {
396
413
  for (const peerConnection of this._peerConnections.values()) {
397
- if (this.call.observer.config.maxEntryIdleTimeInMs < sample.timestamp - peerConnection.updated) {
414
+ if (this.call.observer.config.maxEntryIdleTimeInMs < peerConnection.created - peerConnection.updated) {
398
415
  logger.debug(`Closing peer connection ${peerConnection.peerConnectionId} due to inactivity`);
399
416
  peerConnection.close();
400
417
  continue;
401
418
  }
402
419
  for (const track of peerConnection.inboundAudioTracks.values()) {
403
- if (this.call.observer.config.maxEntryIdleTimeInMs < sample.timestamp - track.updated) {
420
+ if (this.call.observer.config.maxEntryIdleTimeInMs < track.created - track.updated) {
404
421
  logger.debug(`Closing inbound audio track ${track.trackId} due to inactivity`);
405
422
  track.close();
406
423
  }
407
424
  }
408
425
  for (const track of peerConnection.inboundVideoTracks.values()) {
409
- if (this.call.observer.config.maxEntryIdleTimeInMs < sample.timestamp - track.updated) {
426
+ if (this.call.observer.config.maxEntryIdleTimeInMs < track.created - track.updated) {
410
427
  logger.debug(`Closing inbound video track ${track.trackId} due to inactivity`);
411
428
  track.close();
412
429
  }
413
430
  }
414
431
  for (const track of peerConnection.outboundAudioTracks.values()) {
415
- if (this.call.observer.config.maxEntryIdleTimeInMs < sample.timestamp - track.updated) {
432
+ if (this.call.observer.config.maxEntryIdleTimeInMs < track.created - track.updated) {
416
433
  logger.debug(`Closing outbound audio track ${track.trackId} due to inactivity`);
417
434
  track.close();
418
435
  }
419
436
  }
437
+ for (const dataChannel of peerConnection.dataChannels.values()) {
438
+ if (this.call.observer.config.maxEntryIdleTimeInMs < dataChannel.created - dataChannel.updated) {
439
+ logger.debug(`Closing DataChannel ${dataChannel.channelId} due to inactivity`);
440
+ dataChannel.close();
441
+ }
442
+ }
420
443
  }
421
444
  }
422
445
  // update metrics
@@ -447,16 +470,16 @@ class ObservedClient extends events_1.EventEmitter {
447
470
  this.totalDataChannelBytesReceived += peerConnection.totalDataChannelBytesReceived;
448
471
  this.sendingBitrate += peerConnection.sendingAudioBitrate + peerConnection.sendingVideoBitrate;
449
472
  this.receivingBitrate += peerConnection.receivingAudioBitrate + peerConnection.receivingVideoBitrate;
450
- this.availableIncomingBitrate += (_15 = peerConnection.availableIncomingBitrate) !== null && _15 !== void 0 ? _15 : 0;
451
- this.availableOutgoingBitrate += (_16 = peerConnection.availableOutgoingBitrate) !== null && _16 !== void 0 ? _16 : 0;
452
- sumRttInMs += (_17 = peerConnection.avgRttInMs) !== null && _17 !== void 0 ? _17 : 0;
473
+ this.availableIncomingBitrate += (_18 = peerConnection.availableIncomingBitrate) !== null && _18 !== void 0 ? _18 : 0;
474
+ this.availableOutgoingBitrate += (_19 = peerConnection.availableOutgoingBitrate) !== null && _19 !== void 0 ? _19 : 0;
475
+ sumRttInMs += (_20 = peerConnection.avgRttInMs) !== null && _20 !== void 0 ? _20 : 0;
453
476
  if (peerConnection.usingTURN)
454
477
  this.usingTURN = true;
455
478
  }
456
479
  this.avgRttInMs = this._peerConnections.size ? sumRttInMs / this._peerConnections.size : undefined;
457
480
  if (wasUsingTURN !== this.usingTURN)
458
481
  this.emit('usingturn', this.usingTURN);
459
- this._updated = Date.now();
482
+ this._updated = now;
460
483
  this.emit('update');
461
484
  }
462
485
  _createPeerConnection(peerConnectionId, label) {
@@ -0,0 +1,68 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'events';
3
+ import { ObservedPeerConnection } from './ObservedPeerConnection';
4
+ import { DataChannel } from '@observertc/sample-schemas-js';
5
+ export type ObservedDataChannelState = 'connecting' | 'open' | 'closing' | 'closed';
6
+ export type ObservedDataChannelModel = {
7
+ channelId: number;
8
+ };
9
+ export type ObservedDataChannelEvents = {
10
+ update: [];
11
+ close: [];
12
+ };
13
+ export type ObservedInboundTrackStats = {
14
+ ssrc: number;
15
+ bitrate: number;
16
+ fractionLost: number;
17
+ rttInMs?: number;
18
+ lostPackets?: number;
19
+ receivedPackets?: number;
20
+ receivedFrames?: number;
21
+ decodedFrames?: number;
22
+ droppedFrames?: number;
23
+ receivedSamples?: number;
24
+ silentConcealedSamples?: number;
25
+ fractionLoss?: number;
26
+ };
27
+ export declare interface ObservedDataChannel {
28
+ on<U extends keyof ObservedDataChannelEvents>(event: U, listener: (...args: ObservedDataChannelEvents[U]) => void): this;
29
+ off<U extends keyof ObservedDataChannelEvents>(event: U, listener: (...args: ObservedDataChannelEvents[U]) => void): this;
30
+ once<U extends keyof ObservedDataChannelEvents>(event: U, listener: (...args: ObservedDataChannelEvents[U]) => void): this;
31
+ emit<U extends keyof ObservedDataChannelEvents>(event: U, ...args: ObservedDataChannelEvents[U]): boolean;
32
+ update(sample: DataChannel, timestamp: number): void;
33
+ }
34
+ export declare class ObservedDataChannel extends EventEmitter {
35
+ private readonly _model;
36
+ readonly peerConnection: ObservedPeerConnection;
37
+ readonly created: number;
38
+ private _stats?;
39
+ private _closed;
40
+ private _updated;
41
+ bitrate: number;
42
+ totalReceivedMessages: number;
43
+ totalSentMessages: number;
44
+ totalBytesReceived: number;
45
+ totalBytesSent: number;
46
+ deltaReceivedMessages: number;
47
+ deltaSentMessages: number;
48
+ deltaBytesReceived: number;
49
+ deltaBytesSent: number;
50
+ constructor(_model: ObservedDataChannelModel, peerConnection: ObservedPeerConnection);
51
+ get serviceId(): string;
52
+ get roomId(): string;
53
+ get callId(): string;
54
+ get clientId(): string;
55
+ get mediaUnitId(): string;
56
+ get peerConnectionId(): string;
57
+ get channelId(): number;
58
+ get updated(): number;
59
+ get state(): ObservedDataChannelState | undefined;
60
+ get label(): string | undefined;
61
+ get protocol(): string | undefined;
62
+ get reports(): import("./ReportsCollector").ReportsCollector;
63
+ get stats(): DataChannel | undefined;
64
+ get closed(): boolean;
65
+ close(): void;
66
+ resetMetrics(): void;
67
+ }
68
+ //# sourceMappingURL=ObservedDataChannel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObservedDataChannel.d.ts","sourceRoot":"","sources":["../src/ObservedDataChannel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObservedDataChannel = void 0;
4
+ const events_1 = require("events");
5
+ class ObservedDataChannel extends events_1.EventEmitter {
6
+ constructor(_model, peerConnection) {
7
+ super();
8
+ this._model = _model;
9
+ this.peerConnection = peerConnection;
10
+ this.created = Date.now();
11
+ this._closed = false;
12
+ this._updated = Date.now();
13
+ this.bitrate = 0;
14
+ this.totalReceivedMessages = 0;
15
+ this.totalSentMessages = 0;
16
+ this.totalBytesReceived = 0;
17
+ this.totalBytesSent = 0;
18
+ this.deltaReceivedMessages = 0;
19
+ this.deltaSentMessages = 0;
20
+ this.deltaBytesReceived = 0;
21
+ this.deltaBytesSent = 0;
22
+ }
23
+ get serviceId() {
24
+ return this.peerConnection.serviceId;
25
+ }
26
+ get roomId() {
27
+ return this.peerConnection.roomId;
28
+ }
29
+ get callId() {
30
+ return this.peerConnection.callId;
31
+ }
32
+ get clientId() {
33
+ return this.peerConnection.clientId;
34
+ }
35
+ get mediaUnitId() {
36
+ return this.peerConnection.mediaUnitId;
37
+ }
38
+ get peerConnectionId() {
39
+ return this.peerConnection.peerConnectionId;
40
+ }
41
+ get channelId() {
42
+ return this._model.channelId;
43
+ }
44
+ get updated() {
45
+ return this._updated;
46
+ }
47
+ get state() {
48
+ var _a;
49
+ return (_a = this._stats) === null || _a === void 0 ? void 0 : _a.state;
50
+ }
51
+ get label() {
52
+ var _a;
53
+ return (_a = this._stats) === null || _a === void 0 ? void 0 : _a.label;
54
+ }
55
+ get protocol() {
56
+ var _a;
57
+ return (_a = this._stats) === null || _a === void 0 ? void 0 : _a.protocol;
58
+ }
59
+ get reports() {
60
+ return this.peerConnection.reports;
61
+ }
62
+ get stats() {
63
+ return this._stats;
64
+ }
65
+ get closed() {
66
+ return this._closed;
67
+ }
68
+ close() {
69
+ if (this._closed)
70
+ return;
71
+ this._closed = true;
72
+ this.emit('close');
73
+ }
74
+ resetMetrics() {
75
+ this.bitrate = 0;
76
+ this.totalReceivedMessages = 0;
77
+ this.totalSentMessages = 0;
78
+ this.totalBytesReceived = 0;
79
+ this.totalBytesSent = 0;
80
+ this.deltaReceivedMessages = 0;
81
+ this.deltaSentMessages = 0;
82
+ this.deltaBytesReceived = 0;
83
+ }
84
+ update(sample, timestamp) {
85
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
86
+ if (this._closed)
87
+ return;
88
+ const now = Date.now();
89
+ const report = Object.assign(Object.assign({ serviceId: this.peerConnection.client.call.serviceId, roomId: this.peerConnection.client.call.roomId, callId: this.peerConnection.client.call.callId, clientId: this.peerConnection.client.clientId, userId: this.peerConnection.client.userId, mediaUnitId: this.peerConnection.client.mediaUnitId }, sample), { timestamp, sampleSeq: -1 });
90
+ this.reports.addClientDataChannelReport(report);
91
+ sample.bytesReceived;
92
+ sample.bytesSent;
93
+ sample.messageReceived;
94
+ sample.messageSent;
95
+ const elapsedTimeInMs = Math.max(1, now - this._updated);
96
+ this.bitrate = (((_a = sample.bytesReceived) !== null && _a !== void 0 ? _a : 0) - ((_c = (_b = this._stats) === null || _b === void 0 ? void 0 : _b.bytesReceived) !== null && _c !== void 0 ? _c : 0)) * 8 / (elapsedTimeInMs / 1000);
97
+ this.deltaSentMessages = ((_d = sample.messageSent) !== null && _d !== void 0 ? _d : 0) - ((_f = (_e = this._stats) === null || _e === void 0 ? void 0 : _e.messageSent) !== null && _f !== void 0 ? _f : 0);
98
+ this.deltaReceivedMessages = ((_g = sample.messageReceived) !== null && _g !== void 0 ? _g : 0) - ((_j = (_h = this._stats) === null || _h === void 0 ? void 0 : _h.messageReceived) !== null && _j !== void 0 ? _j : 0);
99
+ this.deltaBytesSent = ((_k = sample.bytesSent) !== null && _k !== void 0 ? _k : 0) - ((_m = (_l = this._stats) === null || _l === void 0 ? void 0 : _l.bytesSent) !== null && _m !== void 0 ? _m : 0);
100
+ this.deltaBytesReceived = ((_o = sample.bytesReceived) !== null && _o !== void 0 ? _o : 0) - ((_q = (_p = this._stats) === null || _p === void 0 ? void 0 : _p.bytesReceived) !== null && _q !== void 0 ? _q : 0);
101
+ this.totalBytesReceived = (_r = sample.bytesReceived) !== null && _r !== void 0 ? _r : 0;
102
+ this.totalBytesSent = (_s = sample.bytesSent) !== null && _s !== void 0 ? _s : 0;
103
+ this.totalReceivedMessages = (_t = sample.messageReceived) !== null && _t !== void 0 ? _t : 0;
104
+ this.totalSentMessages = (_u = sample.messageSent) !== null && _u !== void 0 ? _u : 0;
105
+ this._stats = sample;
106
+ this._updated = timestamp;
107
+ this.emit('update');
108
+ }
109
+ }
110
+ exports.ObservedDataChannel = ObservedDataChannel;
@@ -78,7 +78,6 @@ export declare class ObservedInboundTrack<Kind extends MediaKind> extends EventE
78
78
  get updated(): number;
79
79
  get stats(): ReadonlyMap<number, ObservedInboundTrackStats<Kind>>;
80
80
  get reports(): import("./ReportsCollector").ReportsCollector;
81
- get uptimeInMs(): number;
82
81
  set remoteOutboundTrack(track: ObservedOutboundTrack<Kind> | undefined);
83
82
  get remoteOutboundTrack(): ObservedOutboundTrack<Kind> | undefined;
84
83
  get closed(): boolean;
@@ -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":"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"}
@@ -69,9 +69,6 @@ class ObservedInboundTrack extends events_1.EventEmitter {
69
69
  get reports() {
70
70
  return this.peerConnection.reports;
71
71
  }
72
- get uptimeInMs() {
73
- return this._updated - this.created;
74
- }
75
72
  set remoteOutboundTrack(track) {
76
73
  if (this._closed)
77
74
  return;
@@ -113,6 +110,7 @@ class ObservedInboundTrack extends events_1.EventEmitter {
113
110
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
114
111
  if (this._closed)
115
112
  return;
113
+ const now = Date.now();
116
114
  const report = Object.assign(Object.assign({ serviceId: this.peerConnection.client.call.serviceId, roomId: this.peerConnection.client.call.roomId, callId: this.peerConnection.client.call.callId, clientId: this.peerConnection.client.clientId, userId: this.peerConnection.client.userId, mediaUnitId: this.peerConnection.client.mediaUnitId, peerConnectionId: this.peerConnection.peerConnectionId }, sample), { timestamp, sampleSeq: -1, remoteClientId: (_a = sample.remoteClientId) !== null && _a !== void 0 ? _a : (_b = this.remoteOutboundTrack) === null || _b === void 0 ? void 0 : _b.peerConnection.client.clientId, remoteUserId: (_c = this.remoteOutboundTrack) === null || _c === void 0 ? void 0 : _c.peerConnection.client.userId, remoteTrackId: (_d = this.remoteOutboundTrack) === null || _d === void 0 ? void 0 : _d.trackId, remotePeerConnectionId: (_e = this.remoteOutboundTrack) === null || _e === void 0 ? void 0 : _e.peerConnection.peerConnectionId });
117
115
  if (this.kind === 'audio')
118
116
  this.reports.addInboundAudioTrackReport(report);
@@ -124,7 +122,7 @@ class ObservedInboundTrack extends events_1.EventEmitter {
124
122
  if (!this._model.sfuSinkId && sample.sfuSinkId) {
125
123
  this._model.sfuSinkId = sample.sfuSinkId;
126
124
  }
127
- const elapsedTimeInMs = Math.max(1, timestamp - this._updated);
125
+ const elapsedTimeInMs = Math.max(1, now - this._updated);
128
126
  const lastStat = this._stats.get(sample.ssrc);
129
127
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
130
128
  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);
@@ -175,7 +173,7 @@ class ObservedInboundTrack extends events_1.EventEmitter {
175
173
  this.deltaReceivedSamples = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.receivedSamples) !== null && _a !== void 0 ? _a : 0); }, 0);
176
174
  this.deltaSilentConcealedSamples = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.silentConcealedSamples) !== null && _a !== void 0 ? _a : 0); }, 0);
177
175
  this.fractionLoss = 0 < this.deltaReceivedPackets && 0 < this.deltaLostPackets ? (this.deltaLostPackets / (this.deltaReceivedPackets + this.deltaLostPackets)) : 0;
178
- this._updated = timestamp;
176
+ this._updated = now;
179
177
  this.emit('update');
180
178
  }
181
179
  }
@@ -64,7 +64,6 @@ export declare class ObservedOutboundTrack<Kind extends MediaKind> extends Event
64
64
  get reports(): import("./ReportsCollector").ReportsCollector;
65
65
  get updated(): number;
66
66
  get stats(): ReadonlyMap<number, ObservedOutboundTrackStats<Kind>>;
67
- get uptimeInMs(): number;
68
67
  get closed(): boolean;
69
68
  close(): void;
70
69
  resetMetrics(): void;
@@ -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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"}
@@ -62,9 +62,6 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
62
62
  get stats() {
63
63
  return this._stats;
64
64
  }
65
- get uptimeInMs() {
66
- return this._updated - this.created;
67
- }
68
65
  get closed() {
69
66
  return this._closed;
70
67
  }
@@ -87,12 +84,13 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
87
84
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
88
85
  if (this._closed)
89
86
  return;
87
+ const now = Date.now();
90
88
  const report = Object.assign(Object.assign({ serviceId: this.peerConnection.client.serviceId, roomId: this.peerConnection.client.call.roomId, callId: this.peerConnection.client.call.callId, clientId: this.peerConnection.client.clientId, userId: this.peerConnection.client.userId, mediaUnitId: this.peerConnection.client.mediaUnitId, peerConnectionId: this.peerConnection.peerConnectionId }, sample), { timestamp, sampleSeq: -1 });
91
89
  if (this.kind === 'audio')
92
90
  this.reports.addOutboundAudioTrackReport(report);
93
91
  else if (this.kind === 'video')
94
92
  this.reports.addOutboundVideoTrackReport(report);
95
- const elapsedTimeInMs = Math.max(1, timestamp - this._updated);
93
+ const elapsedTimeInMs = Math.max(1, now - this._updated);
96
94
  const lastStat = this._stats.get(sample.ssrc);
97
95
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
98
96
  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);
@@ -140,7 +138,7 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
140
138
  else if (this.kind === 'video')
141
139
  this.peerConnection.client.call.sfuStreamIdToOutboundVideoTrack.set(this._model.sfuStreamId, this);
142
140
  }
143
- this._updated = timestamp;
141
+ this._updated = now;
144
142
  this.emit('update');
145
143
  }
146
144
  connectInboundTrack(track) {
@@ -5,6 +5,7 @@ import { ObservedClient } from './ObservedClient';
5
5
  import { ObservedInboundTrack, ObservedInboundTrackModel } from './ObservedInboundTrack';
6
6
  import { ObservedOutboundTrack, ObservedOutboundTrackModel } from './ObservedOutboundTrack';
7
7
  import { ObservedICE } from './ObservedICE';
8
+ import { ObservedDataChannel } from './ObservedDataChannel';
8
9
  export type ObservedPeerConnectionEvents = {
9
10
  update: [];
10
11
  close: [];
@@ -67,6 +68,7 @@ export declare class ObservedPeerConnection extends EventEmitter {
67
68
  private readonly _inboundVideoTracks;
68
69
  private readonly _outboundAudioTracks;
69
70
  private readonly _outboundVideoTracks;
71
+ private readonly _dataChannels;
70
72
  constructor(_model: ObservedPeerConnectionModel, client: ObservedClient);
71
73
  get serviceId(): string;
72
74
  get roomId(): string;
@@ -86,6 +88,7 @@ export declare class ObservedPeerConnection extends EventEmitter {
86
88
  get inboundVideoTracks(): ReadonlyMap<string, ObservedInboundTrack<'video'>>;
87
89
  get outboundAudioTracks(): ReadonlyMap<string, ObservedOutboundTrack<'audio'>>;
88
90
  get outboundVideoTracks(): ReadonlyMap<string, ObservedOutboundTrack<'video'>>;
91
+ get dataChannels(): ReadonlyMap<number, ObservedDataChannel>;
89
92
  get uptimeInMs(): number;
90
93
  get closed(): boolean;
91
94
  close(): void;
@@ -97,5 +100,6 @@ export declare class ObservedPeerConnection extends EventEmitter {
97
100
  createInboundVideoTrack(config: Omit<ObservedInboundTrackModel<'video'>, 'kind'>): ObservedInboundTrack<'video'>;
98
101
  createOutboundAudioTrack(config: Omit<ObservedOutboundTrackModel<'audio'>, 'kind'>): ObservedOutboundTrack<'audio'>;
99
102
  createOutboundVideoTrack(config: Omit<ObservedOutboundTrackModel<'video'>, 'kind'>): ObservedOutboundTrack<'video'>;
103
+ createDataChannel(channelId: number): ObservedDataChannel;
100
104
  }
101
105
  //# sourceMappingURL=ObservedPeerConnection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedPeerConnection.d.ts","sourceRoot":"","sources":["../src/ObservedPeerConnection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObservedPeerConnection.d.ts","sourceRoot":"","sources":["../src/ObservedPeerConnection.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ const events_1 = require("events");
5
5
  const ObservedInboundTrack_1 = require("./ObservedInboundTrack");
6
6
  const ObservedOutboundTrack_1 = require("./ObservedOutboundTrack");
7
7
  const ObservedICE_1 = require("./ObservedICE");
8
+ const ObservedDataChannel_1 = require("./ObservedDataChannel");
8
9
  class ObservedPeerConnection extends events_1.EventEmitter {
9
10
  constructor(_model, client) {
10
11
  super();
@@ -48,6 +49,7 @@ class ObservedPeerConnection extends events_1.EventEmitter {
48
49
  this._inboundVideoTracks = new Map();
49
50
  this._outboundAudioTracks = new Map();
50
51
  this._outboundVideoTracks = new Map();
52
+ this._dataChannels = new Map();
51
53
  }
52
54
  get serviceId() {
53
55
  return this.client.serviceId;
@@ -107,6 +109,9 @@ class ObservedPeerConnection extends events_1.EventEmitter {
107
109
  get outboundVideoTracks() {
108
110
  return this._outboundVideoTracks;
109
111
  }
112
+ get dataChannels() {
113
+ return this._dataChannels;
114
+ }
110
115
  get uptimeInMs() {
111
116
  return this._updated - this.created;
112
117
  }
@@ -210,6 +215,12 @@ class ObservedPeerConnection extends events_1.EventEmitter {
210
215
  this.totalSentVideoPackets += track.totalSentPackets;
211
216
  sumRttInMs = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0);
212
217
  });
218
+ this._dataChannels.forEach((channel) => {
219
+ this.deltaDataChannelBytesSent += channel.deltaBytesSent;
220
+ this.deltaDataChannelBytesReceived += channel.deltaBytesReceived;
221
+ this.totalDataChannelBytesSent += channel.totalBytesSent;
222
+ this.totalDataChannelBytesReceived += channel.totalBytesReceived;
223
+ });
213
224
  const iceRttInMs = (_a = this.ICE.stats) === null || _a === void 0 ? void 0 : _a.currentRoundTripTime;
214
225
  let nrOfBelongings = this._inboundAudioTracks.size + this._inboundVideoTracks.size + this._outboundAudioTracks.size + this._outboundVideoTracks.size;
215
226
  if (iceRttInMs) {
@@ -276,5 +287,17 @@ class ObservedPeerConnection extends events_1.EventEmitter {
276
287
  this.emit('newoutboundvideotrack', result);
277
288
  return result;
278
289
  }
290
+ createDataChannel(channelId) {
291
+ if (this._closed)
292
+ throw new Error(`PeerConnection ${this.peerConnectionId} is closed`);
293
+ const result = new ObservedDataChannel_1.ObservedDataChannel({
294
+ channelId,
295
+ }, this);
296
+ result.on('close', () => {
297
+ this._dataChannels.delete(result.channelId);
298
+ });
299
+ this._dataChannels.set(result.channelId, result);
300
+ return result;
301
+ }
279
302
  }
280
303
  exports.ObservedPeerConnection = ObservedPeerConnection;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@observertc/observer-js",
3
- "version": "0.40.0-beta",
3
+ "version": "0.40.1-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",
@@ -85,10 +85,10 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
85
85
  this.emit('close');
86
86
  }
87
87
 
88
- public createClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(config: ObservedClientModel & { appData: ClientAppData, generateClientJoinedReport?: boolean }) {
88
+ public createClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(config: ObservedClientModel & { appData: ClientAppData, generateClientJoinedReport?: boolean, joined?: number }) {
89
89
  if (this._closed) throw new Error(`Call ${this.callId} is closed`);
90
90
 
91
- const { appData, generateClientJoinedReport, ...model } = config;
91
+ const { appData, generateClientJoinedReport, joined = Date.now(), ...model } = config;
92
92
 
93
93
  const result = new ObservedClient(model, this, appData);
94
94
 
@@ -104,7 +104,7 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
104
104
  this.roomId,
105
105
  this.callId,
106
106
  result.clientId,
107
- Date.now(),
107
+ joined,
108
108
  result.userId,
109
109
  result.marker,
110
110
  ));
@@ -14,18 +14,12 @@ const logger = createLogger('ObservedClient');
14
14
  export type ObservedClientModel= {
15
15
  clientId: string;
16
16
  mediaUnitId: string;
17
- overflowingProcessingThreshold?: number;
18
17
  userId?: string,
19
18
  marker?: string,
20
19
  operationSystem?: OperationSystem,
21
20
  engine?: Engine,
22
21
  platform?: Platform,
23
22
  browser?: Browser,
24
-
25
- /**
26
- * before client-monitor-js 3.4.0 the client joined event was generated by the observer, this flag is to keep the compatibility with the old behavior
27
- */
28
- addJoinAndDetachClientEvent?: boolean;
29
23
  };
30
24
 
31
25
  export type ObservedClientEvents = {
@@ -194,6 +188,8 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
194
188
  if (sample.clientId && sample.clientId !== 'NULL' && sample.clientId !== this.clientId) {
195
189
  throw new Error(`Sample client id (${sample.clientId}) does not match the client id of the observed client (${this.clientId})`);
196
190
  }
191
+ const now = Date.now();
192
+
197
193
  ++this._acceptedSample;
198
194
 
199
195
  for (const peerConnection of this._peerConnections.values()) {
@@ -612,34 +608,60 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
612
608
  peerConnection.ICE.update(candidatePair, sample.timestamp);
613
609
  }
614
610
 
611
+ for (const dataChannel of sample.dataChannels ?? []) {
612
+ if (!dataChannel.peerConnectionId || !dataChannel.dataChannelIdentifier) {
613
+ logger.warn(`DataChannel without peerConnectionId or dataChannelIdentifier: ${JSON.stringify(dataChannel)}`);
614
+
615
+ continue;
616
+ }
617
+
618
+ try {
619
+ const peerConnection = this._peerConnections.get(dataChannel.peerConnectionId) ?? this._createPeerConnection(dataChannel.peerConnectionId);
620
+
621
+ if (!peerConnection) continue;
622
+
623
+ const observedDataChannel = peerConnection.dataChannels.get(dataChannel.dataChannelIdentifier) ?? peerConnection.createDataChannel(dataChannel.dataChannelIdentifier);
624
+
625
+ observedDataChannel.update(dataChannel, sample.timestamp);
626
+ } catch (err) {
627
+ logger.error(`Error creating data channel: ${(err as Error)?.message}`);
628
+ }
629
+ }
630
+
615
631
  // close entries that are idle for too long
616
632
  if (this.call.observer.config.maxEntryIdleTimeInMs && this._updated < sample.timestamp) {
617
633
 
618
634
  for (const peerConnection of this._peerConnections.values()) {
619
- if (this.call.observer.config.maxEntryIdleTimeInMs < sample.timestamp - peerConnection.updated) {
635
+ if (this.call.observer.config.maxEntryIdleTimeInMs < peerConnection.created - peerConnection.updated) {
620
636
  logger.debug(`Closing peer connection ${peerConnection.peerConnectionId} due to inactivity`);
621
637
  peerConnection.close();
622
638
 
623
639
  continue;
624
640
  }
625
641
  for (const track of peerConnection.inboundAudioTracks.values()) {
626
- if (this.call.observer.config.maxEntryIdleTimeInMs < sample.timestamp - track.updated) {
642
+ if (this.call.observer.config.maxEntryIdleTimeInMs < track.created - track.updated) {
627
643
  logger.debug(`Closing inbound audio track ${track.trackId} due to inactivity`);
628
644
  track.close();
629
645
  }
630
646
  }
631
647
  for (const track of peerConnection.inboundVideoTracks.values()) {
632
- if (this.call.observer.config.maxEntryIdleTimeInMs < sample.timestamp - track.updated) {
648
+ if (this.call.observer.config.maxEntryIdleTimeInMs < track.created - track.updated) {
633
649
  logger.debug(`Closing inbound video track ${track.trackId} due to inactivity`);
634
650
  track.close();
635
651
  }
636
652
  }
637
653
  for (const track of peerConnection.outboundAudioTracks.values()) {
638
- if (this.call.observer.config.maxEntryIdleTimeInMs < sample.timestamp - track.updated) {
654
+ if (this.call.observer.config.maxEntryIdleTimeInMs < track.created - track.updated) {
639
655
  logger.debug(`Closing outbound audio track ${track.trackId} due to inactivity`);
640
656
  track.close();
641
657
  }
642
658
  }
659
+ for (const dataChannel of peerConnection.dataChannels.values()) {
660
+ if (this.call.observer.config.maxEntryIdleTimeInMs < dataChannel.created - dataChannel.updated) {
661
+ logger.debug(`Closing DataChannel ${dataChannel.channelId} due to inactivity`);
662
+ dataChannel.close();
663
+ }
664
+ }
643
665
  }
644
666
  }
645
667
 
@@ -683,7 +705,7 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
683
705
 
684
706
  if (wasUsingTURN !== this.usingTURN) this.emit('usingturn', this.usingTURN);
685
707
 
686
- this._updated = Date.now();
708
+ this._updated = now;
687
709
  this.emit('update');
688
710
  }
689
711
 
@@ -0,0 +1,186 @@
1
+ import { EventEmitter } from 'events';
2
+ import { ObservedPeerConnection } from './ObservedPeerConnection';
3
+ import { DataChannel } from '@observertc/sample-schemas-js';
4
+ import { ClientDataChannelReport } from '@observertc/report-schemas-js';
5
+
6
+ export type ObservedDataChannelState = 'connecting' | 'open' | 'closing' | 'closed';
7
+
8
+ export type ObservedDataChannelModel = {
9
+ channelId: number;
10
+ }
11
+
12
+ export type ObservedDataChannelEvents = {
13
+ update: [],
14
+ close: [],
15
+ };
16
+
17
+ export type ObservedInboundTrackStats = {
18
+ ssrc: number;
19
+ bitrate: number;
20
+ fractionLost: number;
21
+ rttInMs?: number;
22
+ lostPackets?: number;
23
+ receivedPackets?: number;
24
+ receivedFrames?: number;
25
+ decodedFrames?: number;
26
+ droppedFrames?: number;
27
+ receivedSamples?: number;
28
+ silentConcealedSamples?: number;
29
+ fractionLoss?: number;
30
+ };
31
+
32
+ // {
33
+ // [Property in keyof ObservedInboundTrackStats<K>]: ObservedInboundTrackStats<K>[Property];
34
+ // }
35
+
36
+ export declare interface ObservedDataChannel {
37
+ on<U extends keyof ObservedDataChannelEvents>(event: U, listener: (...args: ObservedDataChannelEvents[U]) => void): this;
38
+ off<U extends keyof ObservedDataChannelEvents>(event: U, listener: (...args: ObservedDataChannelEvents[U]) => void): this;
39
+ once<U extends keyof ObservedDataChannelEvents>(event: U, listener: (...args: ObservedDataChannelEvents[U]) => void): this;
40
+ emit<U extends keyof ObservedDataChannelEvents>(event: U, ...args: ObservedDataChannelEvents[U]): boolean;
41
+ update(sample: DataChannel, timestamp: number): void;
42
+ }
43
+
44
+ export class ObservedDataChannel extends EventEmitter {
45
+ public readonly created = Date.now();
46
+
47
+ private _stats?: DataChannel;
48
+
49
+ private _closed = false;
50
+ private _updated = Date.now();
51
+ public bitrate = 0;
52
+
53
+ public totalReceivedMessages = 0;
54
+ public totalSentMessages = 0;
55
+ public totalBytesReceived = 0;
56
+ public totalBytesSent = 0;
57
+
58
+ public deltaReceivedMessages = 0;
59
+ public deltaSentMessages = 0;
60
+ public deltaBytesReceived = 0;
61
+ public deltaBytesSent = 0;
62
+
63
+ public constructor(
64
+ private readonly _model: ObservedDataChannelModel,
65
+ public readonly peerConnection: ObservedPeerConnection,
66
+ ) {
67
+ super();
68
+ }
69
+
70
+ public get serviceId() {
71
+ return this.peerConnection.serviceId;
72
+ }
73
+
74
+ public get roomId() {
75
+ return this.peerConnection.roomId;
76
+ }
77
+
78
+ public get callId() {
79
+ return this.peerConnection.callId;
80
+ }
81
+
82
+ public get clientId() {
83
+ return this.peerConnection.clientId;
84
+ }
85
+
86
+ public get mediaUnitId() {
87
+ return this.peerConnection.mediaUnitId;
88
+ }
89
+
90
+ public get peerConnectionId() {
91
+ return this.peerConnection.peerConnectionId;
92
+ }
93
+
94
+ public get channelId() {
95
+ return this._model.channelId;
96
+ }
97
+
98
+ public get updated() {
99
+ return this._updated;
100
+ }
101
+
102
+ public get state(): ObservedDataChannelState | undefined {
103
+ return this._stats?.state as ObservedDataChannelState | undefined;
104
+ }
105
+
106
+ public get label() {
107
+ return this._stats?.label;
108
+ }
109
+
110
+ public get protocol() {
111
+ return this._stats?.protocol;
112
+ }
113
+
114
+ public get reports() {
115
+ return this.peerConnection.reports;
116
+ }
117
+
118
+ public get stats() {
119
+ return this._stats;
120
+ }
121
+
122
+ public get closed() {
123
+ return this._closed;
124
+ }
125
+
126
+ public close() {
127
+ if (this._closed) return;
128
+
129
+ this._closed = true;
130
+
131
+ this.emit('close');
132
+ }
133
+
134
+ public resetMetrics() {
135
+ this.bitrate = 0;
136
+ this.totalReceivedMessages = 0;
137
+ this.totalSentMessages = 0;
138
+ this.totalBytesReceived = 0;
139
+ this.totalBytesSent = 0;
140
+ this.deltaReceivedMessages = 0;
141
+ this.deltaSentMessages = 0;
142
+ this.deltaBytesReceived = 0;
143
+ }
144
+
145
+ public update(sample: DataChannel, timestamp: number) {
146
+ if (this._closed) return;
147
+
148
+ const now = Date.now();
149
+
150
+ const report: ClientDataChannelReport = {
151
+ serviceId: this.peerConnection.client.call.serviceId,
152
+ roomId: this.peerConnection.client.call.roomId,
153
+ callId: this.peerConnection.client.call.callId,
154
+ clientId: this.peerConnection.client.clientId,
155
+ userId: this.peerConnection.client.userId,
156
+ mediaUnitId: this.peerConnection.client.mediaUnitId,
157
+ ...sample,
158
+ timestamp,
159
+ sampleSeq: -1,
160
+ };
161
+
162
+ this.reports.addClientDataChannelReport(report);
163
+
164
+ sample.bytesReceived;
165
+ sample.bytesSent;
166
+ sample.messageReceived;
167
+ sample.messageSent;
168
+
169
+ const elapsedTimeInMs = Math.max(1, now - this._updated);
170
+
171
+ this.bitrate = ((sample.bytesReceived ?? 0) - (this._stats?.bytesReceived ?? 0)) * 8 / (elapsedTimeInMs / 1000);
172
+ this.deltaSentMessages = (sample.messageSent ?? 0) - (this._stats?.messageSent ?? 0);
173
+ this.deltaReceivedMessages = (sample.messageReceived ?? 0) - (this._stats?.messageReceived ?? 0);
174
+ this.deltaBytesSent = (sample.bytesSent ?? 0) - (this._stats?.bytesSent ?? 0);
175
+ this.deltaBytesReceived = (sample.bytesReceived ?? 0) - (this._stats?.bytesReceived ?? 0);
176
+
177
+ this.totalBytesReceived = sample.bytesReceived ?? 0;
178
+ this.totalBytesSent = sample.bytesSent ?? 0;
179
+ this.totalReceivedMessages = sample.messageReceived ?? 0;
180
+ this.totalSentMessages = sample.messageSent ?? 0;
181
+
182
+ this._stats = sample;
183
+ this._updated = timestamp;
184
+ this.emit('update');
185
+ }
186
+ }
@@ -136,10 +136,6 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
136
136
  return this.peerConnection.reports;
137
137
  }
138
138
 
139
- public get uptimeInMs() {
140
- return this._updated - this.created;
141
- }
142
-
143
139
  public set remoteOutboundTrack(track: ObservedOutboundTrack<Kind> | undefined) {
144
140
  if (this._closed) return;
145
141
  if (this._remoteOutboundTrack) return;
@@ -182,7 +178,8 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
182
178
 
183
179
  public update(sample: ObservedInboundTrackStatsUpdate<Kind>, timestamp: number) {
184
180
  if (this._closed) return;
185
-
181
+
182
+ const now = Date.now();
186
183
  const report: InboundAudioTrackReport | InboundVideoTrackReport = {
187
184
  serviceId: this.peerConnection.client.call.serviceId,
188
185
  roomId: this.peerConnection.client.call.roomId,
@@ -212,7 +209,7 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
212
209
  this._model.sfuSinkId = sample.sfuSinkId;
213
210
  }
214
211
 
215
- const elapsedTimeInMs = Math.max(1, timestamp - this._updated);
212
+ const elapsedTimeInMs = Math.max(1, now - this._updated);
216
213
  const lastStat = this._stats.get(sample.ssrc);
217
214
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
218
215
  const bitrate = ((sample.bytesReceived ?? 0) - (lastStat?.bytesReceived ?? 0)) * 8 / (elapsedTimeInMs / 1000);
@@ -275,7 +272,7 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
275
272
  this.deltaSilentConcealedSamples = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.silentConcealedSamples ?? 0), 0);
276
273
  this.fractionLoss = 0 < this.deltaReceivedPackets && 0 < this.deltaLostPackets ? (this.deltaLostPackets / (this.deltaReceivedPackets + this.deltaLostPackets)) : 0;
277
274
 
278
- this._updated = timestamp;
275
+ this._updated = now;
279
276
  this.emit('update');
280
277
  }
281
278
  }
@@ -124,10 +124,6 @@ export class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter
124
124
  return this._stats;
125
125
  }
126
126
 
127
- public get uptimeInMs() {
128
- return this._updated - this.created;
129
- }
130
-
131
127
  public get closed() {
132
128
  return this._closed;
133
129
  }
@@ -152,7 +148,8 @@ export class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter
152
148
 
153
149
  public update(sample: ObservedOutboundTrackStatsUpdate<Kind>, timestamp: number): void {
154
150
  if (this._closed) return;
155
-
151
+
152
+ const now = Date.now();
156
153
  const report: OutboundAudioTrackReport | OutboundVideoTrackReport = {
157
154
  serviceId: this.peerConnection.client.serviceId,
158
155
  roomId: this.peerConnection.client.call.roomId,
@@ -169,7 +166,7 @@ export class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter
169
166
  if (this.kind === 'audio') this.reports.addOutboundAudioTrackReport(report);
170
167
  else if (this.kind === 'video') this.reports.addOutboundVideoTrackReport(report);
171
168
 
172
- const elapsedTimeInMs = Math.max(1, timestamp - this._updated);
169
+ const elapsedTimeInMs = Math.max(1, now - this._updated);
173
170
  const lastStat = this._stats.get(sample.ssrc);
174
171
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
175
172
  const bitrate = ((sample.bytesSent ?? 0) - (lastStat?.bytesSent ?? 0)) * 8 / (elapsedTimeInMs / 1000);
@@ -228,7 +225,7 @@ export class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter
228
225
  else if (this.kind === 'video') this.peerConnection.client.call.sfuStreamIdToOutboundVideoTrack.set(this._model.sfuStreamId, this as ObservedOutboundTrack<'video'>);
229
226
  }
230
227
 
231
- this._updated = timestamp;
228
+ this._updated = now;
232
229
  this.emit('update');
233
230
  }
234
231
 
@@ -5,6 +5,7 @@ import { ObservedInboundTrack, ObservedInboundTrackModel } from './ObservedInbou
5
5
  import { ObservedOutboundTrack, ObservedOutboundTrackModel } from './ObservedOutboundTrack';
6
6
  import { PeerConnectionTransportReport } from '@observertc/report-schemas-js';
7
7
  import { ObservedICE } from './ObservedICE';
8
+ import { ObservedDataChannel } from './ObservedDataChannel';
8
9
 
9
10
  export type ObservedPeerConnectionEvents = {
10
11
  update: [],
@@ -77,6 +78,7 @@ export class ObservedPeerConnection extends EventEmitter {
77
78
  private readonly _inboundVideoTracks = new Map<string, ObservedInboundTrack<'video'>>();
78
79
  private readonly _outboundAudioTracks = new Map<string, ObservedOutboundTrack<'audio'>>();
79
80
  private readonly _outboundVideoTracks = new Map<string, ObservedOutboundTrack<'video'>>();
81
+ private readonly _dataChannels = new Map<number, ObservedDataChannel>();
80
82
 
81
83
  public constructor(
82
84
  private readonly _model: ObservedPeerConnectionModel,
@@ -158,6 +160,10 @@ export class ObservedPeerConnection extends EventEmitter {
158
160
  return this._outboundVideoTracks;
159
161
  }
160
162
 
163
+ public get dataChannels(): ReadonlyMap<number, ObservedDataChannel> {
164
+ return this._dataChannels;
165
+ }
166
+
161
167
  public get uptimeInMs() {
162
168
  return this._updated - this.created;
163
169
  }
@@ -285,6 +291,14 @@ export class ObservedPeerConnection extends EventEmitter {
285
291
 
286
292
  sumRttInMs = (track.rttInMs ?? 0);
287
293
  });
294
+
295
+ this._dataChannels.forEach((channel) => {
296
+ this.deltaDataChannelBytesSent += channel.deltaBytesSent;
297
+ this.deltaDataChannelBytesReceived += channel.deltaBytesReceived;
298
+ this.totalDataChannelBytesSent += channel.totalBytesSent;
299
+ this.totalDataChannelBytesReceived += channel.totalBytesReceived;
300
+ });
301
+
288
302
  const iceRttInMs = this.ICE.stats?.currentRoundTripTime;
289
303
  let nrOfBelongings = this._inboundAudioTracks.size + this._inboundVideoTracks.size + this._outboundAudioTracks.size + this._outboundVideoTracks.size;
290
304
 
@@ -393,4 +407,19 @@ export class ObservedPeerConnection extends EventEmitter {
393
407
 
394
408
  return result;
395
409
  }
410
+
411
+ public createDataChannel(channelId: number) {
412
+ if (this._closed) throw new Error(`PeerConnection ${this.peerConnectionId} is closed`);
413
+
414
+ const result = new ObservedDataChannel({
415
+ channelId,
416
+ }, this);
417
+
418
+ result.on('close', () => {
419
+ this._dataChannels.delete(result.channelId);
420
+ });
421
+ this._dataChannels.set(result.channelId, result);
422
+
423
+ return result;
424
+ }
396
425
  }