@observertc/observer-js 0.30.6-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 +6 -12
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +24 -104
- package/lib/ObservedClient.d.ts +16 -32
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +381 -521
- 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 +3 -9
- package/lib/ObservedInboundTrack.d.ts.map +1 -1
- package/lib/ObservedInboundTrack.js +75 -157
- package/lib/ObservedOutboundTrack.d.ts +9 -9
- package/lib/ObservedOutboundTrack.d.ts.map +1 -1
- package/lib/ObservedOutboundTrack.js +77 -133
- package/lib/ObservedPeerConnection.d.ts +21 -15
- package/lib/ObservedPeerConnection.d.ts.map +1 -1
- package/lib/ObservedPeerConnection.js +85 -171
- package/lib/ObservedSfu.d.ts +5 -7
- package/lib/ObservedSfu.d.ts.map +1 -1
- package/lib/ObservedSfu.js +10 -74
- package/lib/Observer.d.ts +5 -6
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +28 -31
- package/lib/common/types.d.ts +0 -55
- package/lib/common/types.d.ts.map +1 -1
- package/lib/index.d.ts +5 -7
- package/lib/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ObservedCall.ts +27 -87
- package/src/ObservedClient.ts +451 -586
- package/src/ObservedDataChannel.ts +186 -0
- package/src/ObservedInboundTrack.ts +18 -72
- package/src/ObservedOutboundTrack.ts +36 -60
- package/src/ObservedPeerConnection.ts +79 -112
- package/src/ObservedSfu.ts +11 -46
- package/src/Observer.ts +11 -16
- package/src/common/types.ts +0 -69
- package/src/index.ts +5 -7
- package/lib/models/Models.d.ts +0 -642
- package/lib/models/Models.d.ts.map +0 -1
- package/lib/models/Models.js +0 -481
- package/lib/models/samples_pb.d.ts +0 -2452
- package/lib/models/samples_pb.d.ts.map +0 -1
- package/lib/models/samples_pb.js +0 -1495
- package/lib/storages/ObserverStorage.d.ts +0 -87
- package/lib/storages/ObserverStorage.d.ts.map +0 -1
- package/lib/storages/ObserverStorage.js +0 -2
- package/lib/storages/SimpleStorage.d.ts +0 -19
- package/lib/storages/SimpleStorage.d.ts.map +0 -1
- package/lib/storages/SimpleStorage.js +0 -106
- package/lib/storages/StorageProvider.d.ts +0 -16
- package/lib/storages/StorageProvider.d.ts.map +0 -1
- package/lib/storages/StorageProvider.js +0 -29
- package/src/models/Models.ts +0 -1103
- package/src/models/samples_pb.ts +0 -4061
- package/src/storages/ObserverStorage.ts +0 -99
- package/src/storages/SimpleStorage.ts +0 -120
- package/src/storages/StorageProvider.ts +0 -42
|
@@ -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;
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
|
-
import { StorageProvider } from './storages/StorageProvider';
|
|
4
3
|
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
5
4
|
import { InboundAudioTrack, InboundVideoTrack } from '@observertc/sample-schemas-js';
|
|
6
5
|
import { ObservedOutboundTrack } from './ObservedOutboundTrack';
|
|
7
6
|
import { MediaKind } from './common/types';
|
|
8
|
-
export type
|
|
7
|
+
export type ObservedInboundTrackModel<K extends MediaKind> = {
|
|
9
8
|
trackId: string;
|
|
10
9
|
kind: K;
|
|
11
10
|
sfuStreamId?: string;
|
|
@@ -41,11 +40,8 @@ export declare interface ObservedInboundTrack<Kind extends MediaKind> {
|
|
|
41
40
|
export declare class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
42
41
|
private readonly _model;
|
|
43
42
|
readonly peerConnection: ObservedPeerConnection;
|
|
44
|
-
|
|
45
|
-
static create<K extends MediaKind>(config: ObservedInboundTrackConfig<K>, peerConnection: ObservedPeerConnection, storageProvider: StorageProvider): Promise<ObservedInboundTrack<K>>;
|
|
46
|
-
created: number;
|
|
43
|
+
readonly created: number;
|
|
47
44
|
private readonly _stats;
|
|
48
|
-
private readonly _execute;
|
|
49
45
|
private _closed;
|
|
50
46
|
private _updated;
|
|
51
47
|
private _remoteOutboundTrack?;
|
|
@@ -68,7 +64,7 @@ export declare class ObservedInboundTrack<Kind extends MediaKind> extends EventE
|
|
|
68
64
|
deltaDroppedFrames: number;
|
|
69
65
|
deltaReceivedSamples: number;
|
|
70
66
|
deltaSilentConcealedSamples: number;
|
|
71
|
-
|
|
67
|
+
constructor(_model: ObservedInboundTrackModel<Kind>, peerConnection: ObservedPeerConnection);
|
|
72
68
|
get serviceId(): string;
|
|
73
69
|
get roomId(): string;
|
|
74
70
|
get callId(): string;
|
|
@@ -82,12 +78,10 @@ export declare class ObservedInboundTrack<Kind extends MediaKind> extends EventE
|
|
|
82
78
|
get updated(): number;
|
|
83
79
|
get stats(): ReadonlyMap<number, ObservedInboundTrackStats<Kind>>;
|
|
84
80
|
get reports(): import("./ReportsCollector").ReportsCollector;
|
|
85
|
-
get uptimeInMs(): number;
|
|
86
81
|
set remoteOutboundTrack(track: ObservedOutboundTrack<Kind> | undefined);
|
|
87
82
|
get remoteOutboundTrack(): ObservedOutboundTrack<Kind> | undefined;
|
|
88
83
|
get closed(): boolean;
|
|
89
84
|
close(): void;
|
|
90
85
|
resetMetrics(): void;
|
|
91
|
-
private _save;
|
|
92
86
|
}
|
|
93
87
|
//# sourceMappingURL=ObservedInboundTrack.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedInboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedInboundTrack.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ObservedInboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedInboundTrack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,70 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
3
|
exports.ObservedInboundTrack = void 0;
|
|
36
4
|
const events_1 = require("events");
|
|
37
|
-
const Models = __importStar(require("./models/Models"));
|
|
38
|
-
const SingleExecutor_1 = require("./common/SingleExecutor");
|
|
39
5
|
class ObservedInboundTrack extends events_1.EventEmitter {
|
|
40
|
-
|
|
41
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
-
const model = new Models.InboundTrack({
|
|
43
|
-
serviceId: peerConnection.client.serviceId,
|
|
44
|
-
roomId: peerConnection.client.roomId,
|
|
45
|
-
callId: peerConnection.client.callId,
|
|
46
|
-
clientId: peerConnection.client.clientId,
|
|
47
|
-
mediaUnitId: peerConnection.client.mediaUnitId,
|
|
48
|
-
peerConnectionId: peerConnection.peerConnectionId,
|
|
49
|
-
trackId: config.trackId,
|
|
50
|
-
kind: config.kind,
|
|
51
|
-
sfuStreamId: config.sfuStreamId,
|
|
52
|
-
sfuSinkId: config.sfuSinkId,
|
|
53
|
-
});
|
|
54
|
-
const alreadyInserted = yield storageProvider.inboundTrackStorage.insert(config.trackId, model);
|
|
55
|
-
if (alreadyInserted)
|
|
56
|
-
throw new Error(`InboundAudioTrack with id ${config.trackId} already exists`);
|
|
57
|
-
return new ObservedInboundTrack(model, peerConnection, storageProvider);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
constructor(_model, peerConnection, _storageProvider) {
|
|
6
|
+
constructor(_model, peerConnection) {
|
|
61
7
|
super();
|
|
62
8
|
this._model = _model;
|
|
63
9
|
this.peerConnection = peerConnection;
|
|
64
|
-
this._storageProvider = _storageProvider;
|
|
65
10
|
this.created = Date.now();
|
|
66
11
|
this._stats = new Map();
|
|
67
|
-
this._execute = (0, SingleExecutor_1.createSingleExecutor)();
|
|
68
12
|
this._closed = false;
|
|
69
13
|
this._updated = Date.now();
|
|
70
14
|
this.bitrate = 0;
|
|
@@ -87,35 +31,27 @@ class ObservedInboundTrack extends events_1.EventEmitter {
|
|
|
87
31
|
this.deltaSilentConcealedSamples = 0;
|
|
88
32
|
}
|
|
89
33
|
get serviceId() {
|
|
90
|
-
|
|
91
|
-
return this._model.serviceId;
|
|
34
|
+
return this.peerConnection.serviceId;
|
|
92
35
|
}
|
|
93
36
|
get roomId() {
|
|
94
|
-
|
|
95
|
-
return this._model.roomId;
|
|
37
|
+
return this.peerConnection.roomId;
|
|
96
38
|
}
|
|
97
39
|
get callId() {
|
|
98
|
-
|
|
99
|
-
return this._model.callId;
|
|
40
|
+
return this.peerConnection.callId;
|
|
100
41
|
}
|
|
101
42
|
get clientId() {
|
|
102
|
-
|
|
103
|
-
return this._model.clientId;
|
|
43
|
+
return this.peerConnection.clientId;
|
|
104
44
|
}
|
|
105
45
|
get mediaUnitId() {
|
|
106
|
-
|
|
107
|
-
return this._model.mediaUnitId;
|
|
46
|
+
return this.peerConnection.mediaUnitId;
|
|
108
47
|
}
|
|
109
48
|
get peerConnectionId() {
|
|
110
|
-
|
|
111
|
-
return this._model.peerConnectionId;
|
|
49
|
+
return this.peerConnection.peerConnectionId;
|
|
112
50
|
}
|
|
113
51
|
get trackId() {
|
|
114
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
115
52
|
return this._model.trackId;
|
|
116
53
|
}
|
|
117
54
|
get kind() {
|
|
118
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
119
55
|
return this._model.kind;
|
|
120
56
|
}
|
|
121
57
|
get sfuStreamId() {
|
|
@@ -133,9 +69,6 @@ class ObservedInboundTrack extends events_1.EventEmitter {
|
|
|
133
69
|
get reports() {
|
|
134
70
|
return this.peerConnection.reports;
|
|
135
71
|
}
|
|
136
|
-
get uptimeInMs() {
|
|
137
|
-
return this._updated - this.created;
|
|
138
|
-
}
|
|
139
72
|
set remoteOutboundTrack(track) {
|
|
140
73
|
if (this._closed)
|
|
141
74
|
return;
|
|
@@ -159,9 +92,7 @@ class ObservedInboundTrack extends events_1.EventEmitter {
|
|
|
159
92
|
if (this._closed)
|
|
160
93
|
return;
|
|
161
94
|
this._closed = true;
|
|
162
|
-
this.
|
|
163
|
-
.catch(() => void 0)
|
|
164
|
-
.finally(() => this.emit('close'));
|
|
95
|
+
this.emit('close');
|
|
165
96
|
}
|
|
166
97
|
resetMetrics() {
|
|
167
98
|
this.bitrate = 0;
|
|
@@ -177,86 +108,73 @@ class ObservedInboundTrack extends events_1.EventEmitter {
|
|
|
177
108
|
}
|
|
178
109
|
update(sample, timestamp) {
|
|
179
110
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
this.fractionLoss = 0 < this.deltaReceivedPackets && 0 < this.deltaLostPackets ? (this.deltaLostPackets / (this.deltaReceivedPackets + this.deltaLostPackets)) : 0;
|
|
248
|
-
if (executeSave)
|
|
249
|
-
yield this._save();
|
|
250
|
-
this._updated = timestamp;
|
|
251
|
-
this.emit('update');
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
_save() {
|
|
255
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
256
|
-
if (this._closed)
|
|
257
|
-
throw new Error(`OutboundTrack ${this.trackId} is closed`);
|
|
258
|
-
return this._storageProvider.inboundTrackStorage.set(this.trackId, this._model);
|
|
259
|
-
});
|
|
111
|
+
if (this._closed)
|
|
112
|
+
return;
|
|
113
|
+
const now = Date.now();
|
|
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 });
|
|
115
|
+
if (this.kind === 'audio')
|
|
116
|
+
this.reports.addInboundAudioTrackReport(report);
|
|
117
|
+
else if (this.kind === 'video')
|
|
118
|
+
this.reports.addInboundVideoTrackReport(report);
|
|
119
|
+
if (!this._model.sfuStreamId && sample.sfuStreamId) {
|
|
120
|
+
this._model.sfuStreamId = sample.sfuStreamId;
|
|
121
|
+
}
|
|
122
|
+
if (!this._model.sfuSinkId && sample.sfuSinkId) {
|
|
123
|
+
this._model.sfuSinkId = sample.sfuSinkId;
|
|
124
|
+
}
|
|
125
|
+
const elapsedTimeInMs = Math.max(1, now - this._updated);
|
|
126
|
+
const lastStat = this._stats.get(sample.ssrc);
|
|
127
|
+
const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
|
|
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);
|
|
129
|
+
const lostPackets = ((_h = sample.packetsLost) !== null && _h !== void 0 ? _h : 0) - ((_j = lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsLost) !== null && _j !== void 0 ? _j : 0);
|
|
130
|
+
const receivedPackets = ((_k = sample.packetsReceived) !== null && _k !== void 0 ? _k : 0) - ((_l = lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsReceived) !== null && _l !== void 0 ? _l : 0);
|
|
131
|
+
const fractionLost = 0 < receivedPackets && 0 < lostPackets ? (lostPackets / (receivedPackets + lostPackets)) : 0;
|
|
132
|
+
let decodedFrames;
|
|
133
|
+
let droppedFrames;
|
|
134
|
+
let receivedFrames;
|
|
135
|
+
let silentConcealedSamples;
|
|
136
|
+
if (this.kind === 'video') {
|
|
137
|
+
const videoSample = sample;
|
|
138
|
+
const lastVideoStat = lastStat;
|
|
139
|
+
decodedFrames = ((_m = videoSample.framesDecoded) !== null && _m !== void 0 ? _m : 0) - ((_o = lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesDecoded) !== null && _o !== void 0 ? _o : 0);
|
|
140
|
+
droppedFrames = ((_p = videoSample.framesDropped) !== null && _p !== void 0 ? _p : 0) - ((_q = lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesDropped) !== null && _q !== void 0 ? _q : 0);
|
|
141
|
+
receivedFrames = ((_r = videoSample.framesReceived) !== null && _r !== void 0 ? _r : 0) - ((_s = lastVideoStat === null || lastVideoStat === void 0 ? void 0 : lastVideoStat.framesReceived) !== null && _s !== void 0 ? _s : 0);
|
|
142
|
+
}
|
|
143
|
+
else if (this.kind === 'audio') {
|
|
144
|
+
const audioSample = sample;
|
|
145
|
+
const lastAudioStat = lastStat;
|
|
146
|
+
silentConcealedSamples = ((_t = audioSample.silentConcealedSamples) !== null && _t !== void 0 ? _t : 0) - ((_u = lastAudioStat === null || lastAudioStat === void 0 ? void 0 : lastAudioStat.silentConcealedSamples) !== null && _u !== void 0 ? _u : 0);
|
|
147
|
+
}
|
|
148
|
+
const stats = Object.assign(Object.assign({}, sample), { fractionLost,
|
|
149
|
+
rttInMs,
|
|
150
|
+
bitrate, ssrc: sample.ssrc, lostPackets,
|
|
151
|
+
receivedPackets,
|
|
152
|
+
receivedFrames,
|
|
153
|
+
decodedFrames,
|
|
154
|
+
droppedFrames,
|
|
155
|
+
silentConcealedSamples });
|
|
156
|
+
this._stats.set(sample.ssrc, stats);
|
|
157
|
+
this.bitrate = [...this._stats.values()].reduce((acc, stat) => acc + stat.bitrate, 0);
|
|
158
|
+
this.rttInMs = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.rttInMs) !== null && _a !== void 0 ? _a : 0); }, 0) / (this._stats.size || 1);
|
|
159
|
+
this.totalLostPackets = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.lostPackets) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
160
|
+
this.totalReceivedPackets = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.receivedPackets) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
161
|
+
this.totalBytesReceived = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.bytesReceived) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
162
|
+
this.totalReceivedFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.receivedFrames) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
163
|
+
this.totalDecodedFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.decodedFrames) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
164
|
+
this.totalDroppedFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.droppedFrames) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
165
|
+
this.totalReceivedSamples = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.receivedSamples) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
166
|
+
this.totalSilentConcealedSamples = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.silentConcealedSamples) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
167
|
+
this.deltaLostPackets = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.lostPackets) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
168
|
+
this.deltaReceivedPackets = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.receivedPackets) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
169
|
+
this.deltaBytesReceived = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.bytesReceived) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
170
|
+
this.deltaReceivedFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.receivedFrames) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
171
|
+
this.deltaDecodedFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.decodedFrames) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
172
|
+
this.deltaDroppedFrames = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.droppedFrames) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
173
|
+
this.deltaReceivedSamples = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.receivedSamples) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
174
|
+
this.deltaSilentConcealedSamples = [...this._stats.values()].reduce((acc, stat) => { var _a; return acc + ((_a = stat.silentConcealedSamples) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
175
|
+
this.fractionLoss = 0 < this.deltaReceivedPackets && 0 < this.deltaLostPackets ? (this.deltaLostPackets / (this.deltaReceivedPackets + this.deltaLostPackets)) : 0;
|
|
176
|
+
this._updated = now;
|
|
177
|
+
this.emit('update');
|
|
260
178
|
}
|
|
261
179
|
}
|
|
262
180
|
exports.ObservedInboundTrack = ObservedInboundTrack;
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
|
-
import { StorageProvider } from './storages/StorageProvider';
|
|
4
3
|
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
5
4
|
import { OutboundAudioTrack, OutboundVideoTrack } from '@observertc/sample-schemas-js';
|
|
6
5
|
import { ObservedInboundTrack } from './ObservedInboundTrack';
|
|
7
6
|
import { MediaKind } from './common/types';
|
|
8
|
-
export type
|
|
7
|
+
export type ObservedOutboundTrackModel<K extends MediaKind> = {
|
|
9
8
|
trackId: string;
|
|
10
9
|
kind: K;
|
|
11
10
|
sfuStreamId?: string;
|
|
@@ -35,8 +34,7 @@ export declare interface ObservedOutboundTrack<Kind extends MediaKind> {
|
|
|
35
34
|
export declare class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
36
35
|
private readonly _model;
|
|
37
36
|
readonly peerConnection: ObservedPeerConnection;
|
|
38
|
-
|
|
39
|
-
static create<K extends MediaKind>(config: ObservedOutboundTrackConfig<K>, peerConnection: ObservedPeerConnection, storageProvider: StorageProvider): Promise<ObservedOutboundTrack<K>>;
|
|
37
|
+
readonly created: number;
|
|
40
38
|
bitrate: number;
|
|
41
39
|
rttInMs?: number;
|
|
42
40
|
totalLostPackets: number;
|
|
@@ -48,13 +46,17 @@ export declare class ObservedOutboundTrack<Kind extends MediaKind> extends Event
|
|
|
48
46
|
deltaSentBytes: number;
|
|
49
47
|
deltaSentFrames: number;
|
|
50
48
|
deltaEncodedFrames: number;
|
|
51
|
-
created: number;
|
|
52
49
|
private readonly _stats;
|
|
53
|
-
private readonly _execute;
|
|
54
50
|
private _closed;
|
|
55
51
|
private _updated;
|
|
56
52
|
private _remoteInboundTracks;
|
|
57
|
-
|
|
53
|
+
constructor(_model: ObservedOutboundTrackModel<Kind>, peerConnection: ObservedPeerConnection);
|
|
54
|
+
get serviceId(): string;
|
|
55
|
+
get roomId(): string;
|
|
56
|
+
get callId(): string;
|
|
57
|
+
get clientId(): string;
|
|
58
|
+
get mediaUnitId(): string;
|
|
59
|
+
get peerConnectionId(): string;
|
|
58
60
|
get kind(): Kind;
|
|
59
61
|
get trackId(): string;
|
|
60
62
|
get sfuStreamId(): string | undefined;
|
|
@@ -62,11 +64,9 @@ export declare class ObservedOutboundTrack<Kind extends MediaKind> extends Event
|
|
|
62
64
|
get reports(): import("./ReportsCollector").ReportsCollector;
|
|
63
65
|
get updated(): number;
|
|
64
66
|
get stats(): ReadonlyMap<number, ObservedOutboundTrackStats<Kind>>;
|
|
65
|
-
get uptimeInMs(): number;
|
|
66
67
|
get closed(): boolean;
|
|
67
68
|
close(): void;
|
|
68
69
|
resetMetrics(): void;
|
|
69
70
|
connectInboundTrack(track: ObservedInboundTrack<Kind>): void;
|
|
70
|
-
private _save;
|
|
71
71
|
}
|
|
72
72
|
//# sourceMappingURL=ObservedOutboundTrack.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedOutboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedOutboundTrack.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ObservedOutboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedOutboundTrack.ts"],"names":[],"mappings":"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"}
|