@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.
- package/lib/ObservedCall.d.ts +1 -0
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +2 -2
- package/lib/ObservedClient.d.ts +0 -5
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +34 -11
- package/lib/ObservedDataChannel.d.ts +68 -0
- package/lib/ObservedDataChannel.d.ts.map +1 -0
- package/lib/ObservedDataChannel.js +110 -0
- package/lib/ObservedInboundTrack.d.ts +0 -1
- package/lib/ObservedInboundTrack.d.ts.map +1 -1
- package/lib/ObservedInboundTrack.js +3 -5
- package/lib/ObservedOutboundTrack.d.ts +0 -1
- package/lib/ObservedOutboundTrack.d.ts.map +1 -1
- package/lib/ObservedOutboundTrack.js +3 -5
- package/lib/ObservedPeerConnection.d.ts +4 -0
- package/lib/ObservedPeerConnection.d.ts.map +1 -1
- package/lib/ObservedPeerConnection.js +23 -0
- package/package.json +1 -1
- package/src/ObservedCall.ts +3 -3
- package/src/ObservedClient.ts +33 -11
- package/src/ObservedDataChannel.ts +186 -0
- package/src/ObservedInboundTrack.ts +4 -7
- package/src/ObservedOutboundTrack.ts +4 -7
- package/src/ObservedPeerConnection.ts +29 -0
package/lib/ObservedCall.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/lib/ObservedCall.js
CHANGED
|
@@ -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,
|
|
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
|
}
|
package/lib/ObservedClient.d.ts
CHANGED
|
@@ -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":";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;AAUlE,MAAM,MAAM,mBAAmB,GAAE;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":"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"}
|
package/lib/ObservedClient.js
CHANGED
|
@@ -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
|
|
205
|
-
const { 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 <
|
|
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 <
|
|
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 <
|
|
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 <
|
|
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 += (
|
|
451
|
-
this.availableOutgoingBitrate += (
|
|
452
|
-
sumRttInMs += (
|
|
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 =
|
|
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,
|
|
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 =
|
|
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,
|
|
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 =
|
|
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":";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;
|
|
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
package/src/ObservedCall.ts
CHANGED
|
@@ -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
|
-
|
|
107
|
+
joined,
|
|
108
108
|
result.userId,
|
|
109
109
|
result.marker,
|
|
110
110
|
));
|
package/src/ObservedClient.ts
CHANGED
|
@@ -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 <
|
|
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 <
|
|
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 <
|
|
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 <
|
|
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 =
|
|
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,
|
|
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 =
|
|
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,
|
|
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 =
|
|
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
|
}
|