@observertc/observer-js 1.0.1-620842f.0 → 1.0.1-c3edea3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/ObservedClient.d.ts +3 -5
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +34 -19
- package/lib/Observer.d.ts +15 -8
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +39 -0
- package/lib/index.d.ts +0 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/schema/{ClientEventTypes.d.ts → eventTypes.d.ts} +2 -2
- package/lib/schema/eventTypes.d.ts.map +1 -0
- package/lib/schema/eventTypes.js +38 -0
- package/lib/schema/{ClientMetaTypes.d.ts → metaTypes.d.ts} +2 -2
- package/lib/schema/metaTypes.d.ts.map +1 -0
- package/lib/schema/metaTypes.js +16 -0
- package/package.json +1 -1
- package/src/ObservedClient.ts +35 -22
- package/src/Observer.ts +64 -9
- package/src/index.ts +0 -4
- package/src/schema/{ClientEventTypes.ts → eventTypes.ts} +1 -1
- package/src/schema/{ClientMetaTypes.ts → metaTypes.ts} +1 -1
- package/lib/schema/ClientEventTypes.d.ts.map +0 -1
- package/lib/schema/ClientEventTypes.js +0 -38
- package/lib/schema/ClientMetaTypes.d.ts.map +0 -1
- package/lib/schema/ClientMetaTypes.js +0 -16
package/lib/ObservedClient.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
3
|
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
4
4
|
import { ClientMetaData, ClientSample, ClientIssue, ExtensionStat } from './schema/ClientSample';
|
|
5
|
-
import * as MetaData from './schema/
|
|
5
|
+
import * as MetaData from './schema/metaTypes';
|
|
6
6
|
import { ObservedCall } from './ObservedCall';
|
|
7
7
|
import { CalculatedScore } from './scores/CalculatedScore';
|
|
8
8
|
import { Detectors } from './detectors/Detectors';
|
|
@@ -19,8 +19,6 @@ export type ObservedClientEvents = {
|
|
|
19
19
|
];
|
|
20
20
|
close: [];
|
|
21
21
|
joined: [];
|
|
22
|
-
issue: [ClientIssue];
|
|
23
|
-
metaData: [ClientMetaData];
|
|
24
22
|
rejoined: [timestamp: number];
|
|
25
23
|
left: [];
|
|
26
24
|
usingturn: [boolean];
|
|
@@ -67,8 +65,8 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
|
|
|
67
65
|
accept(sample: ClientSample): void;
|
|
68
66
|
private _processClientEvent;
|
|
69
67
|
processMetadata(metadata: ClientMetaData): void;
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
processIssue(issue: ClientIssue): void;
|
|
69
|
+
processExtensionStats(stats: ExtensionStat): void;
|
|
72
70
|
private _updatePeerConnection;
|
|
73
71
|
}
|
|
74
72
|
//# sourceMappingURL=ObservedClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAe,cAAc,EAAE,YAAY,EAAwB,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACpI,OAAO,KAAK,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAe,cAAc,EAAE,YAAY,EAAwB,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACpI,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,MAAM,MAAM,sBAAsB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACvG,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE;QACP;YACC,MAAM,EAAE,YAAY,CAAC;YACrB,eAAe,EAAE,MAAM,CAAC;SACxB;KACD,CAAC;IACF,KAAK,EAAE,EAAE,CAAC;IACV,MAAM,EAAE,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,EAAE,CAAC;IACT,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IACrB,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;IAGzB,iBAAiB,EAAE,CAAC,sBAAsB,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,cAAc;IACtC,EAAE,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/G,GAAG,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAChH,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACjH,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAChG;AAED,qBAAa,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,YAAY;aA4DpC,IAAI,EAAE,YAAY;IA3DhG,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,uBAAuB,sCAA6C;IACpF,SAAgB,eAAe,EAAE,eAAe,CAG9C;IAEK,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtC,OAAO,SAAc;IACrB,eAAe,SAAK;IACpB,MAAM,UAAS;IAEf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,eAAe,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAC3C,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC7B,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAEhC,SAAS,UAAS;IAClB,wBAAwB,SAAK;IAC7B,wBAAwB,SAAK;IAuB7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAEpC,SAAgB,YAAY,EAAE,QAAQ,CAAC,eAAe,EAAE,CAAM;IACvD,MAAM,EAAE,WAAW,EAAE,CAAM;gBAEf,QAAQ,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAAkB,IAAI,EAAE,YAAY;IAShG,IAAW,KAAK,uBAEf;IAEM,KAAK;IASL,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAyBzC,OAAO,CAAC,mBAAmB;IA0CpB,eAAe,CAAC,QAAQ,EAAE,cAAc;IA2BxC,YAAY,CAAC,KAAK,EAAE,WAAW;IAQ/B,qBAAqB,CAAC,KAAK,EAAE,aAAa;IAQjD,OAAO,CAAC,qBAAqB;CAqB7B"}
|
package/lib/ObservedClient.js
CHANGED
|
@@ -4,8 +4,8 @@ exports.ObservedClient = void 0;
|
|
|
4
4
|
const events_1 = require("events");
|
|
5
5
|
const ObservedPeerConnection_1 = require("./ObservedPeerConnection");
|
|
6
6
|
const logger_1 = require("./common/logger");
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const eventTypes_1 = require("./schema/eventTypes");
|
|
8
|
+
const metaTypes_1 = require("./schema/metaTypes");
|
|
9
9
|
const utils_1 = require("./common/utils");
|
|
10
10
|
const Detectors_1 = require("./detectors/Detectors");
|
|
11
11
|
const logger = (0, logger_1.createLogger)('ObservedClient');
|
|
@@ -85,9 +85,9 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
85
85
|
const now = Date.now();
|
|
86
86
|
sample.clientEvents?.forEach(this._processClientEvent.bind(this));
|
|
87
87
|
sample.clientMetaItems?.forEach(this.processMetadata.bind(this));
|
|
88
|
-
sample.clientIssues?.forEach(this.
|
|
88
|
+
sample.clientIssues?.forEach(this.processIssue.bind(this));
|
|
89
89
|
sample.peerConnections?.forEach(this._updatePeerConnection.bind(this));
|
|
90
|
-
sample.extensionStats?.forEach(this.
|
|
90
|
+
sample.extensionStats?.forEach(this.processExtensionStats.bind(this));
|
|
91
91
|
// emit new attachments?
|
|
92
92
|
this.attachments = sample.attachments;
|
|
93
93
|
this.calculatedScore.value = sample.score;
|
|
@@ -101,15 +101,15 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
101
101
|
}
|
|
102
102
|
_processClientEvent(event) {
|
|
103
103
|
switch (event.type) {
|
|
104
|
-
case
|
|
104
|
+
case eventTypes_1.ClientEventType.CALL_STARTED: {
|
|
105
105
|
// update call timestamp if it's the first time
|
|
106
106
|
break;
|
|
107
107
|
}
|
|
108
|
-
case
|
|
108
|
+
case eventTypes_1.ClientEventType.CALL_ENDED: {
|
|
109
109
|
// update call timestamp if it's the first time
|
|
110
110
|
break;
|
|
111
111
|
}
|
|
112
|
-
case
|
|
112
|
+
case eventTypes_1.ClientEventType.CLIENT_JOINED: {
|
|
113
113
|
if (event.timestamp) {
|
|
114
114
|
if (!this.joinedAt) {
|
|
115
115
|
this.joinedAt = event.timestamp;
|
|
@@ -125,7 +125,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
125
125
|
}
|
|
126
126
|
break;
|
|
127
127
|
}
|
|
128
|
-
case
|
|
128
|
+
case eventTypes_1.ClientEventType.CLIENT_LEFT: {
|
|
129
129
|
if (event.timestamp) {
|
|
130
130
|
if (!this.leftAt) {
|
|
131
131
|
this.leftAt = event.timestamp;
|
|
@@ -135,35 +135,50 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
135
135
|
break;
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
|
-
this.call.observer.
|
|
138
|
+
this.call.observer.processors.events.process({
|
|
139
|
+
call: this.call,
|
|
140
|
+
client: this,
|
|
141
|
+
data: event,
|
|
142
|
+
});
|
|
139
143
|
}
|
|
140
144
|
processMetadata(metadata) {
|
|
141
145
|
switch (metadata.type) {
|
|
142
|
-
case
|
|
146
|
+
case metaTypes_1.ClientMetaType.BROWSER: {
|
|
143
147
|
this.browser = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
144
148
|
break;
|
|
145
149
|
}
|
|
146
|
-
case
|
|
150
|
+
case metaTypes_1.ClientMetaType.ENGINE: {
|
|
147
151
|
this.engine = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
148
152
|
break;
|
|
149
153
|
}
|
|
150
|
-
case
|
|
154
|
+
case metaTypes_1.ClientMetaType.PLATFORM: {
|
|
151
155
|
this.platform = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
152
156
|
break;
|
|
153
157
|
}
|
|
154
|
-
case
|
|
158
|
+
case metaTypes_1.ClientMetaType.OPERATION_SYSTEM: {
|
|
155
159
|
this.operationSystem = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
156
160
|
break;
|
|
157
161
|
}
|
|
158
162
|
}
|
|
159
|
-
this.call.observer.
|
|
163
|
+
this.call.observer.processors.metaData.process({
|
|
164
|
+
call: this.call,
|
|
165
|
+
client: this,
|
|
166
|
+
data: metadata,
|
|
167
|
+
});
|
|
160
168
|
}
|
|
161
|
-
|
|
162
|
-
this.
|
|
163
|
-
|
|
169
|
+
processIssue(issue) {
|
|
170
|
+
this.call.observer.processors.issues.process({
|
|
171
|
+
call: this.call,
|
|
172
|
+
client: this,
|
|
173
|
+
data: issue,
|
|
174
|
+
});
|
|
164
175
|
}
|
|
165
|
-
|
|
166
|
-
this.call.observer.
|
|
176
|
+
processExtensionStats(stats) {
|
|
177
|
+
this.call.observer.processors.extensionStats.process({
|
|
178
|
+
call: this.call,
|
|
179
|
+
client: this,
|
|
180
|
+
data: stats,
|
|
181
|
+
});
|
|
167
182
|
}
|
|
168
183
|
_updatePeerConnection(sample) {
|
|
169
184
|
let observedPeerConnection = this.observedPeerConnections.get(sample.peerConnectionId);
|
package/lib/Observer.d.ts
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
import { Middleware, MiddlewareProcessor } from './common/Middleware';
|
|
2
3
|
import { ObservedCall, ObservedCallSettings } from './ObservedCall';
|
|
3
4
|
import { EventEmitter } from 'events';
|
|
4
5
|
import { ClientEvent, ClientMetaData, ClientIssue, ExtensionStat } from './schema/ClientSample';
|
|
5
6
|
import { ObservedClient } from './ObservedClient';
|
|
6
7
|
export type ObserverEvents = {
|
|
7
|
-
'client-event': [ObservedClient, ClientEvent];
|
|
8
|
-
'call-updated': [ObservedCall];
|
|
9
|
-
'issue-received': [ObservedClient, ClientIssue];
|
|
10
|
-
'metadata-received': [ObservedClient, ClientMetaData];
|
|
11
|
-
'extension-stats-received': [ObservedClient, ExtensionStat];
|
|
12
8
|
'newcall': [ObservedCall];
|
|
13
9
|
'close': [];
|
|
14
10
|
};
|
|
@@ -23,15 +19,26 @@ export declare interface Observer {
|
|
|
23
19
|
once<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;
|
|
24
20
|
emit<U extends keyof ObserverEvents>(event: U, ...args: ObserverEvents[U]): boolean;
|
|
25
21
|
}
|
|
26
|
-
export type ObserverSummary = {
|
|
27
|
-
rttlt50: number;
|
|
28
|
-
};
|
|
29
22
|
export declare class Observer extends EventEmitter {
|
|
23
|
+
readonly processors: {
|
|
24
|
+
events: MiddlewareProcessor<ProcessorInputContext<ClientEvent>>;
|
|
25
|
+
metaData: MiddlewareProcessor<ProcessorInputContext<ClientMetaData>>;
|
|
26
|
+
issues: MiddlewareProcessor<ProcessorInputContext<ClientIssue>>;
|
|
27
|
+
extensionStats: MiddlewareProcessor<ProcessorInputContext<ExtensionStat>>;
|
|
28
|
+
};
|
|
30
29
|
readonly observedCalls: Map<string, ObservedCall<Record<string, unknown>>>;
|
|
31
30
|
closed: boolean;
|
|
32
31
|
constructor();
|
|
33
32
|
getObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(callId: string): ObservedCall<T> | undefined;
|
|
34
33
|
createObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(settings: ObservedCallSettings<T>): ObservedCall<T>;
|
|
34
|
+
addClientEventMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientEvent>>[]): Observer;
|
|
35
|
+
removeClientEventMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientEvent>>[]): Observer;
|
|
36
|
+
addClientMetaDataMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientMetaData>>[]): Observer;
|
|
37
|
+
removeClientMetaDataMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientMetaData>>[]): Observer;
|
|
38
|
+
addClientIssueMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientIssue>>[]): Observer;
|
|
39
|
+
removeClientIssueMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientIssue>>[]): Observer;
|
|
40
|
+
addExtensionStatMiddleware(...middlewares: Middleware<ProcessorInputContext<ExtensionStat>>[]): Observer;
|
|
41
|
+
removeExtensionStatMiddleware(...middlewares: Middleware<ProcessorInputContext<ExtensionStat>>[]): Observer;
|
|
35
42
|
close(): void;
|
|
36
43
|
}
|
|
37
44
|
//# sourceMappingURL=Observer.d.ts.map
|
package/lib/Observer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../src/Observer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIlD,MAAM,MAAM,cAAc,GAAG;IAC5B,
|
|
1
|
+
{"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../src/Observer.ts"],"names":[],"mappings":"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"}
|
package/lib/Observer.js
CHANGED
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Observer = void 0;
|
|
4
4
|
const logger_1 = require("./common/logger");
|
|
5
|
+
const Middleware_1 = require("./common/Middleware");
|
|
5
6
|
const ObservedCall_1 = require("./ObservedCall");
|
|
6
7
|
const events_1 = require("events");
|
|
7
8
|
const logger = (0, logger_1.createLogger)('Observer');
|
|
8
9
|
class Observer extends events_1.EventEmitter {
|
|
10
|
+
processors = {
|
|
11
|
+
events: new Middleware_1.MiddlewareProcessor(),
|
|
12
|
+
metaData: new Middleware_1.MiddlewareProcessor(),
|
|
13
|
+
issues: new Middleware_1.MiddlewareProcessor(),
|
|
14
|
+
extensionStats: new Middleware_1.MiddlewareProcessor(),
|
|
15
|
+
};
|
|
9
16
|
observedCalls = new Map();
|
|
10
17
|
closed = false;
|
|
11
18
|
constructor() {
|
|
@@ -31,6 +38,38 @@ class Observer extends events_1.EventEmitter {
|
|
|
31
38
|
this.emit('newcall', observedCall);
|
|
32
39
|
return observedCall;
|
|
33
40
|
}
|
|
41
|
+
addClientEventMiddleware(...middlewares) {
|
|
42
|
+
this.processors.events.addMiddleware(...middlewares);
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
removeClientEventMiddleware(...middlewares) {
|
|
46
|
+
this.processors.events.removeMiddleware(...middlewares);
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
addClientMetaDataMiddleware(...middlewares) {
|
|
50
|
+
this.processors.metaData.addMiddleware(...middlewares);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
removeClientMetaDataMiddleware(...middlewares) {
|
|
54
|
+
this.processors.metaData.removeMiddleware(...middlewares);
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
addClientIssueMiddleware(...middlewares) {
|
|
58
|
+
this.processors.issues.addMiddleware(...middlewares);
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
removeClientIssueMiddleware(...middlewares) {
|
|
62
|
+
this.processors.issues.removeMiddleware(...middlewares);
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
addExtensionStatMiddleware(...middlewares) {
|
|
66
|
+
this.processors.extensionStats.addMiddleware(...middlewares);
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
removeExtensionStatMiddleware(...middlewares) {
|
|
70
|
+
this.processors.extensionStats.removeMiddleware(...middlewares);
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
34
73
|
close() {
|
|
35
74
|
if (this.closed) {
|
|
36
75
|
return logger.debug('Attempted to close twice');
|
package/lib/index.d.ts
CHANGED
|
@@ -18,9 +18,5 @@ export { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
|
|
|
18
18
|
export { ObservedIceCandidate } from './ObservedIceCandidate';
|
|
19
19
|
export { ObservedIceTransport } from './ObservedIceTransport';
|
|
20
20
|
export { ObservedPeerConnectionTransport } from './ObservedPeerConnectionTransport';
|
|
21
|
-
export type { ClientEventTypes } from './schema/ClientEventTypes';
|
|
22
|
-
export type { ClientMetaTypes } from './schema/ClientMetaTypes';
|
|
23
|
-
export type { ClientSample } from './schema/ClientSample';
|
|
24
|
-
export { ScoreCalculator } from './scores/ScoreCalculator';
|
|
25
21
|
export { Middleware } from './common/Middleware';
|
|
26
22
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare enum
|
|
1
|
+
export declare enum ClientEventType {
|
|
2
2
|
CALL_STARTED = "CALL_STARTED",
|
|
3
3
|
CALL_ENDED = "CALL_ENDED",
|
|
4
4
|
CLIENT_JOINED = "CLIENT_JOINED",
|
|
@@ -30,4 +30,4 @@ export declare enum ClientEventTypes {
|
|
|
30
30
|
DATA_CONSUMER_CREATED = "DATA_CONSUMER_CREATED",
|
|
31
31
|
DATA_CONSUMER_CLOSED = "DATA_CONSUMER_CLOSED"
|
|
32
32
|
}
|
|
33
|
-
//# sourceMappingURL=
|
|
33
|
+
//# sourceMappingURL=eventTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventTypes.d.ts","sourceRoot":"","sources":["../../src/schema/eventTypes.ts"],"names":[],"mappings":"AAEA,oBAAY,eAAe;IAC1B,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,aAAa,kBAAkB;IAC/B,WAAW,gBAAgB;IAC3B,sBAAsB,2BAA2B;IACjD,sBAAsB,2BAA2B;IACjD,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,2BAA2B,gCAAgC;IAC3D,6BAA6B,kCAAkC;IAC/D,4BAA4B,iCAAiC;IAC7D,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;IACzC,sBAAsB,2BAA2B;IACjD,0BAA0B,+BAA+B;IACzD,2BAA2B,gCAAgC;IAC3D,aAAa,kBAAkB;IAG/B,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,qBAAqB,0BAA0B;IAC/C,oBAAoB,yBAAyB;IAC7C,qBAAqB,0BAA0B;IAC/C,oBAAoB,yBAAyB;CAC7C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable no-shadow */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ClientEventType = void 0;
|
|
5
|
+
var ClientEventType;
|
|
6
|
+
(function (ClientEventType) {
|
|
7
|
+
ClientEventType["CALL_STARTED"] = "CALL_STARTED";
|
|
8
|
+
ClientEventType["CALL_ENDED"] = "CALL_ENDED";
|
|
9
|
+
ClientEventType["CLIENT_JOINED"] = "CLIENT_JOINED";
|
|
10
|
+
ClientEventType["CLIENT_LEFT"] = "CLIENT_LEFT";
|
|
11
|
+
ClientEventType["PEER_CONNECTION_OPENED"] = "PEER_CONNECTION_OPENED";
|
|
12
|
+
ClientEventType["PEER_CONNECTION_CLOSED"] = "PEER_CONNECTION_CLOSED";
|
|
13
|
+
ClientEventType["MEDIA_TRACK_ADDED"] = "MEDIA_TRACK_ADDED";
|
|
14
|
+
ClientEventType["MEDIA_TRACK_REMOVED"] = "MEDIA_TRACK_REMOVED";
|
|
15
|
+
ClientEventType["MEDIA_TRACK_RESUMED"] = "MEDIA_TRACK_RESUMED";
|
|
16
|
+
ClientEventType["MEDIA_TRACK_MUTED"] = "MEDIA_TRACK_MUTED";
|
|
17
|
+
ClientEventType["MEDIA_TRACK_UNMUTED"] = "MEDIA_TRACK_UNMUTED";
|
|
18
|
+
ClientEventType["ICE_GATHERING_STATE_CHANGED"] = "ICE_GATHERING_STATE_CHANGED";
|
|
19
|
+
ClientEventType["PEER_CONNECTION_STATE_CHANGED"] = "PEER_CONNECTION_STATE_CHANGED";
|
|
20
|
+
ClientEventType["ICE_CONNECTION_STATE_CHANGED"] = "ICE_CONNECTION_STATE_CHANGED";
|
|
21
|
+
ClientEventType["DATA_CHANNEL_OPEN"] = "DATA_CHANNEL_OPEN";
|
|
22
|
+
ClientEventType["DATA_CHANNEL_CLOSED"] = "DATA_CHANNEL_CLOSED";
|
|
23
|
+
ClientEventType["DATA_CHANNEL_ERROR"] = "DATA_CHANNEL_ERROR";
|
|
24
|
+
ClientEventType["NEGOTIATION_NEEDED"] = "NEGOTIATION_NEEDED";
|
|
25
|
+
ClientEventType["SIGNALING_STATE_CHANGE"] = "SIGNALING_STATE_CHANGE";
|
|
26
|
+
ClientEventType["ICE_GATHERING_STATE_CHANGE"] = "ICE_GATHERING_STATE_CHANGE";
|
|
27
|
+
ClientEventType["ICE_CONNECTION_STATE_CHANGE"] = "ICE_CONNECTION_STATE_CHANGE";
|
|
28
|
+
ClientEventType["ICE_CANDIDATE"] = "ICE_CANDIDATE";
|
|
29
|
+
// mediasoup events
|
|
30
|
+
ClientEventType["PRODUCER_ADDED"] = "PRODUCER_ADDED";
|
|
31
|
+
ClientEventType["PRODUCER_REMOVED"] = "PRODUCER_REMOVED";
|
|
32
|
+
ClientEventType["CONSUMER_ADDED"] = "CONSUMER_ADDED";
|
|
33
|
+
ClientEventType["CONSUMER_REMOVED"] = "CONSUMER_REMOVED";
|
|
34
|
+
ClientEventType["DATA_PRODUCER_CREATED"] = "DATA_PRODUCER_CREATED";
|
|
35
|
+
ClientEventType["DATA_PRODUCER_CLOSED"] = "DATA_PRODUCER_CLOSED";
|
|
36
|
+
ClientEventType["DATA_CONSUMER_CREATED"] = "DATA_CONSUMER_CREATED";
|
|
37
|
+
ClientEventType["DATA_CONSUMER_CLOSED"] = "DATA_CONSUMER_CLOSED";
|
|
38
|
+
})(ClientEventType = exports.ClientEventType || (exports.ClientEventType = {}));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare enum
|
|
1
|
+
export declare enum ClientMetaType {
|
|
2
2
|
MEDIA_CONSTRAINT = "MEDIA_CONSTRAINT",
|
|
3
3
|
MEDIA_DEVICE = "MEDIA_DEVICE",
|
|
4
4
|
MEDIA_DEVICES_SUPPORTED_CONSTRAINTS = "MEDIA_DEVICES_SUPPORTED_CONSTRAINTS",
|
|
@@ -31,4 +31,4 @@ export type OperationSystem = {
|
|
|
31
31
|
name: string;
|
|
32
32
|
version: string;
|
|
33
33
|
};
|
|
34
|
-
//# sourceMappingURL=
|
|
34
|
+
//# sourceMappingURL=metaTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metaTypes.d.ts","sourceRoot":"","sources":["../../src/schema/metaTypes.ts"],"names":[],"mappings":"AAEA,oBAAY,cAAc;IACzB,gBAAgB,qBAAqB;IACrC,YAAY,iBAAiB;IAC7B,mCAAmC,wCAAwC;IAC3E,gBAAgB,qBAAqB;IACrC,SAAS,cAAc;IAEvB,gBAAgB,qBAAqB;IACrC,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,OAAO,YAAY;CACnB;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable no-shadow */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ClientMetaType = void 0;
|
|
5
|
+
var ClientMetaType;
|
|
6
|
+
(function (ClientMetaType) {
|
|
7
|
+
ClientMetaType["MEDIA_CONSTRAINT"] = "MEDIA_CONSTRAINT";
|
|
8
|
+
ClientMetaType["MEDIA_DEVICE"] = "MEDIA_DEVICE";
|
|
9
|
+
ClientMetaType["MEDIA_DEVICES_SUPPORTED_CONSTRAINTS"] = "MEDIA_DEVICES_SUPPORTED_CONSTRAINTS";
|
|
10
|
+
ClientMetaType["USER_MEDIA_ERROR"] = "USER_MEDIA_ERROR";
|
|
11
|
+
ClientMetaType["LOCAL_SDP"] = "LOCAL_SDP";
|
|
12
|
+
ClientMetaType["OPERATION_SYSTEM"] = "OPERATION_SYSTEM";
|
|
13
|
+
ClientMetaType["ENGINE"] = "ENGINE";
|
|
14
|
+
ClientMetaType["PLATFORM"] = "PLATFORM";
|
|
15
|
+
ClientMetaType["BROWSER"] = "BROWSER";
|
|
16
|
+
})(ClientMetaType = exports.ClientMetaType || (exports.ClientMetaType = {}));
|
package/package.json
CHANGED
package/src/ObservedClient.ts
CHANGED
|
@@ -3,10 +3,10 @@ import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
|
3
3
|
import { createLogger } from './common/logger';
|
|
4
4
|
// eslint-disable-next-line camelcase
|
|
5
5
|
import { ClientEvent, ClientMetaData, ClientSample, PeerConnectionSample, ClientIssue, ExtensionStat } from './schema/ClientSample';
|
|
6
|
-
import * as MetaData from './schema/
|
|
7
|
-
import {
|
|
6
|
+
import * as MetaData from './schema/metaTypes';
|
|
7
|
+
import { ClientEventType } from './schema/eventTypes';
|
|
8
8
|
import { ObservedCall } from './ObservedCall';
|
|
9
|
-
import {
|
|
9
|
+
import { ClientMetaType } from './schema/metaTypes';
|
|
10
10
|
import { parseJsonAs } from './common/utils';
|
|
11
11
|
import { CalculatedScore } from './scores/CalculatedScore';
|
|
12
12
|
import { Detectors } from './detectors/Detectors';
|
|
@@ -27,8 +27,6 @@ export type ObservedClientEvents = {
|
|
|
27
27
|
];
|
|
28
28
|
close: [];
|
|
29
29
|
joined: [];
|
|
30
|
-
issue: [ClientIssue];
|
|
31
|
-
metaData: [ClientMetaData];
|
|
32
30
|
rejoined: [timestamp: number];
|
|
33
31
|
left: [];
|
|
34
32
|
usingturn: [boolean];
|
|
@@ -134,9 +132,9 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
134
132
|
|
|
135
133
|
sample.clientEvents?.forEach(this._processClientEvent.bind(this));
|
|
136
134
|
sample.clientMetaItems?.forEach(this.processMetadata.bind(this));
|
|
137
|
-
sample.clientIssues?.forEach(this.
|
|
135
|
+
sample.clientIssues?.forEach(this.processIssue.bind(this));
|
|
138
136
|
sample.peerConnections?.forEach(this._updatePeerConnection.bind(this));
|
|
139
|
-
sample.extensionStats?.forEach(this.
|
|
137
|
+
sample.extensionStats?.forEach(this.processExtensionStats.bind(this));
|
|
140
138
|
|
|
141
139
|
// emit new attachments?
|
|
142
140
|
this.attachments = sample.attachments;
|
|
@@ -154,15 +152,15 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
154
152
|
|
|
155
153
|
private _processClientEvent(event: ClientEvent) {
|
|
156
154
|
switch (event.type) {
|
|
157
|
-
case
|
|
155
|
+
case ClientEventType.CALL_STARTED: {
|
|
158
156
|
// update call timestamp if it's the first time
|
|
159
157
|
break;
|
|
160
158
|
}
|
|
161
|
-
case
|
|
159
|
+
case ClientEventType.CALL_ENDED: {
|
|
162
160
|
// update call timestamp if it's the first time
|
|
163
161
|
break;
|
|
164
162
|
}
|
|
165
|
-
case
|
|
163
|
+
case ClientEventType.CLIENT_JOINED: {
|
|
166
164
|
if (event.timestamp) {
|
|
167
165
|
if (!this.joinedAt) {
|
|
168
166
|
this.joinedAt = event.timestamp;
|
|
@@ -176,7 +174,7 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
176
174
|
}
|
|
177
175
|
break;
|
|
178
176
|
}
|
|
179
|
-
case
|
|
177
|
+
case ClientEventType.CLIENT_LEFT: {
|
|
180
178
|
if (event.timestamp) {
|
|
181
179
|
if (!this.leftAt) {
|
|
182
180
|
this.leftAt = event.timestamp;
|
|
@@ -187,39 +185,54 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
187
185
|
}
|
|
188
186
|
}
|
|
189
187
|
|
|
190
|
-
this.call.observer.
|
|
188
|
+
this.call.observer.processors.events.process({
|
|
189
|
+
call: this.call,
|
|
190
|
+
client: this,
|
|
191
|
+
data: event,
|
|
192
|
+
});
|
|
191
193
|
}
|
|
192
194
|
|
|
193
195
|
public processMetadata(metadata: ClientMetaData) {
|
|
194
196
|
switch (metadata.type) {
|
|
195
|
-
case
|
|
197
|
+
case ClientMetaType.BROWSER: {
|
|
196
198
|
this.browser = parseJsonAs(metadata.payload);
|
|
197
199
|
break;
|
|
198
200
|
}
|
|
199
|
-
case
|
|
201
|
+
case ClientMetaType.ENGINE: {
|
|
200
202
|
this.engine = parseJsonAs(metadata.payload);
|
|
201
203
|
break;
|
|
202
204
|
}
|
|
203
|
-
case
|
|
205
|
+
case ClientMetaType.PLATFORM: {
|
|
204
206
|
this.platform = parseJsonAs(metadata.payload);
|
|
205
207
|
break;
|
|
206
208
|
}
|
|
207
|
-
case
|
|
209
|
+
case ClientMetaType.OPERATION_SYSTEM: {
|
|
208
210
|
this.operationSystem = parseJsonAs(metadata.payload);
|
|
209
211
|
break;
|
|
210
212
|
}
|
|
211
213
|
}
|
|
212
214
|
|
|
213
|
-
this.call.observer.
|
|
215
|
+
this.call.observer.processors.metaData.process({
|
|
216
|
+
call: this.call,
|
|
217
|
+
client: this,
|
|
218
|
+
data: metadata,
|
|
219
|
+
});
|
|
214
220
|
}
|
|
215
221
|
|
|
216
|
-
public
|
|
217
|
-
this.
|
|
218
|
-
|
|
222
|
+
public processIssue(issue: ClientIssue) {
|
|
223
|
+
this.call.observer.processors.issues.process({
|
|
224
|
+
call: this.call,
|
|
225
|
+
client: this,
|
|
226
|
+
data: issue,
|
|
227
|
+
});
|
|
219
228
|
}
|
|
220
229
|
|
|
221
|
-
public
|
|
222
|
-
this.call.observer.
|
|
230
|
+
public processExtensionStats(stats: ExtensionStat) {
|
|
231
|
+
this.call.observer.processors.extensionStats.process({
|
|
232
|
+
call: this.call,
|
|
233
|
+
client: this,
|
|
234
|
+
data: stats,
|
|
235
|
+
});
|
|
223
236
|
}
|
|
224
237
|
|
|
225
238
|
private _updatePeerConnection(sample: PeerConnectionSample) {
|
package/src/Observer.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createLogger } from './common/logger';
|
|
2
|
+
import { Middleware, MiddlewareProcessor } from './common/Middleware';
|
|
2
3
|
import { ObservedCall, ObservedCallSettings } from './ObservedCall';
|
|
3
4
|
import { EventEmitter } from 'events';
|
|
4
5
|
import { ClientEvent, ClientMetaData, ClientIssue, ExtensionStat } from './schema/ClientSample';
|
|
@@ -7,11 +8,6 @@ import { ObservedClient } from './ObservedClient';
|
|
|
7
8
|
const logger = createLogger('Observer');
|
|
8
9
|
|
|
9
10
|
export type ObserverEvents = {
|
|
10
|
-
'client-event': [ObservedClient, ClientEvent];
|
|
11
|
-
'call-updated': [ObservedCall],
|
|
12
|
-
'issue-received': [ObservedClient, ClientIssue],
|
|
13
|
-
'metadata-received': [ObservedClient, ClientMetaData],
|
|
14
|
-
'extension-stats-received': [ObservedClient, ExtensionStat],
|
|
15
11
|
'newcall': [ObservedCall],
|
|
16
12
|
'close': [],
|
|
17
13
|
}
|
|
@@ -29,11 +25,14 @@ export declare interface Observer {
|
|
|
29
25
|
emit<U extends keyof ObserverEvents>(event: U, ...args: ObserverEvents[U]): boolean;
|
|
30
26
|
}
|
|
31
27
|
|
|
32
|
-
export type ObserverSummary = {
|
|
33
|
-
rttlt50: number;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
28
|
export class Observer extends EventEmitter {
|
|
29
|
+
public readonly processors = {
|
|
30
|
+
events: new MiddlewareProcessor<ProcessorInputContext<ClientEvent>>(),
|
|
31
|
+
metaData: new MiddlewareProcessor<ProcessorInputContext<ClientMetaData>>(),
|
|
32
|
+
issues: new MiddlewareProcessor<ProcessorInputContext<ClientIssue>>(),
|
|
33
|
+
extensionStats: new MiddlewareProcessor<ProcessorInputContext<ExtensionStat>>(),
|
|
34
|
+
};
|
|
35
|
+
|
|
37
36
|
public readonly observedCalls = new Map<string, ObservedCall>();
|
|
38
37
|
public closed = false;
|
|
39
38
|
|
|
@@ -71,6 +70,62 @@ export class Observer extends EventEmitter {
|
|
|
71
70
|
return observedCall;
|
|
72
71
|
}
|
|
73
72
|
|
|
73
|
+
public addClientEventMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientEvent>>[]): Observer {
|
|
74
|
+
|
|
75
|
+
this.processors.events.addMiddleware(...middlewares);
|
|
76
|
+
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public removeClientEventMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientEvent>>[]): Observer {
|
|
81
|
+
|
|
82
|
+
this.processors.events.removeMiddleware(...middlewares);
|
|
83
|
+
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public addClientMetaDataMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientMetaData>>[]): Observer {
|
|
88
|
+
|
|
89
|
+
this.processors.metaData.addMiddleware(...middlewares);
|
|
90
|
+
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public removeClientMetaDataMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientMetaData>>[]): Observer {
|
|
95
|
+
|
|
96
|
+
this.processors.metaData.removeMiddleware(...middlewares);
|
|
97
|
+
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public addClientIssueMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientIssue>>[]): Observer {
|
|
102
|
+
|
|
103
|
+
this.processors.issues.addMiddleware(...middlewares);
|
|
104
|
+
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public removeClientIssueMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientIssue>>[]): Observer {
|
|
109
|
+
|
|
110
|
+
this.processors.issues.removeMiddleware(...middlewares);
|
|
111
|
+
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public addExtensionStatMiddleware(...middlewares: Middleware<ProcessorInputContext<ExtensionStat>>[]): Observer {
|
|
116
|
+
|
|
117
|
+
this.processors.extensionStats.addMiddleware(...middlewares);
|
|
118
|
+
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public removeExtensionStatMiddleware(...middlewares: Middleware<ProcessorInputContext<ExtensionStat>>[]): Observer {
|
|
123
|
+
|
|
124
|
+
this.processors.extensionStats.removeMiddleware(...middlewares);
|
|
125
|
+
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
|
|
74
129
|
public close() {
|
|
75
130
|
if (this.closed) {
|
|
76
131
|
return logger.debug('Attempted to close twice');
|
package/src/index.ts
CHANGED
|
@@ -19,9 +19,5 @@ export { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
|
|
|
19
19
|
export { ObservedIceCandidate } from './ObservedIceCandidate';
|
|
20
20
|
export { ObservedIceTransport } from './ObservedIceTransport';
|
|
21
21
|
export { ObservedPeerConnectionTransport } from './ObservedPeerConnectionTransport';
|
|
22
|
-
export type { ClientEventTypes } from './schema/ClientEventTypes';
|
|
23
|
-
export type { ClientMetaTypes } from './schema/ClientMetaTypes';
|
|
24
|
-
export type { ClientSample } from './schema/ClientSample';
|
|
25
|
-
export { ScoreCalculator } from './scores/ScoreCalculator';
|
|
26
22
|
|
|
27
23
|
export { Middleware } from './common/Middleware';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ClientEventTypes.d.ts","sourceRoot":"","sources":["../../src/schema/ClientEventTypes.ts"],"names":[],"mappings":"AAEA,oBAAY,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,aAAa,kBAAkB;IAC/B,WAAW,gBAAgB;IAC3B,sBAAsB,2BAA2B;IACjD,sBAAsB,2BAA2B;IACjD,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,2BAA2B,gCAAgC;IAC3D,6BAA6B,kCAAkC;IAC/D,4BAA4B,iCAAiC;IAC7D,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;IACzC,sBAAsB,2BAA2B;IACjD,0BAA0B,+BAA+B;IACzD,2BAA2B,gCAAgC;IAC3D,aAAa,kBAAkB;IAG/B,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,qBAAqB,0BAA0B;IAC/C,oBAAoB,yBAAyB;IAC7C,qBAAqB,0BAA0B;IAC/C,oBAAoB,yBAAyB;CAC7C"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/* eslint-disable no-shadow */
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.ClientEventTypes = void 0;
|
|
5
|
-
var ClientEventTypes;
|
|
6
|
-
(function (ClientEventTypes) {
|
|
7
|
-
ClientEventTypes["CALL_STARTED"] = "CALL_STARTED";
|
|
8
|
-
ClientEventTypes["CALL_ENDED"] = "CALL_ENDED";
|
|
9
|
-
ClientEventTypes["CLIENT_JOINED"] = "CLIENT_JOINED";
|
|
10
|
-
ClientEventTypes["CLIENT_LEFT"] = "CLIENT_LEFT";
|
|
11
|
-
ClientEventTypes["PEER_CONNECTION_OPENED"] = "PEER_CONNECTION_OPENED";
|
|
12
|
-
ClientEventTypes["PEER_CONNECTION_CLOSED"] = "PEER_CONNECTION_CLOSED";
|
|
13
|
-
ClientEventTypes["MEDIA_TRACK_ADDED"] = "MEDIA_TRACK_ADDED";
|
|
14
|
-
ClientEventTypes["MEDIA_TRACK_REMOVED"] = "MEDIA_TRACK_REMOVED";
|
|
15
|
-
ClientEventTypes["MEDIA_TRACK_RESUMED"] = "MEDIA_TRACK_RESUMED";
|
|
16
|
-
ClientEventTypes["MEDIA_TRACK_MUTED"] = "MEDIA_TRACK_MUTED";
|
|
17
|
-
ClientEventTypes["MEDIA_TRACK_UNMUTED"] = "MEDIA_TRACK_UNMUTED";
|
|
18
|
-
ClientEventTypes["ICE_GATHERING_STATE_CHANGED"] = "ICE_GATHERING_STATE_CHANGED";
|
|
19
|
-
ClientEventTypes["PEER_CONNECTION_STATE_CHANGED"] = "PEER_CONNECTION_STATE_CHANGED";
|
|
20
|
-
ClientEventTypes["ICE_CONNECTION_STATE_CHANGED"] = "ICE_CONNECTION_STATE_CHANGED";
|
|
21
|
-
ClientEventTypes["DATA_CHANNEL_OPEN"] = "DATA_CHANNEL_OPEN";
|
|
22
|
-
ClientEventTypes["DATA_CHANNEL_CLOSED"] = "DATA_CHANNEL_CLOSED";
|
|
23
|
-
ClientEventTypes["DATA_CHANNEL_ERROR"] = "DATA_CHANNEL_ERROR";
|
|
24
|
-
ClientEventTypes["NEGOTIATION_NEEDED"] = "NEGOTIATION_NEEDED";
|
|
25
|
-
ClientEventTypes["SIGNALING_STATE_CHANGE"] = "SIGNALING_STATE_CHANGE";
|
|
26
|
-
ClientEventTypes["ICE_GATHERING_STATE_CHANGE"] = "ICE_GATHERING_STATE_CHANGE";
|
|
27
|
-
ClientEventTypes["ICE_CONNECTION_STATE_CHANGE"] = "ICE_CONNECTION_STATE_CHANGE";
|
|
28
|
-
ClientEventTypes["ICE_CANDIDATE"] = "ICE_CANDIDATE";
|
|
29
|
-
// mediasoup events
|
|
30
|
-
ClientEventTypes["PRODUCER_ADDED"] = "PRODUCER_ADDED";
|
|
31
|
-
ClientEventTypes["PRODUCER_REMOVED"] = "PRODUCER_REMOVED";
|
|
32
|
-
ClientEventTypes["CONSUMER_ADDED"] = "CONSUMER_ADDED";
|
|
33
|
-
ClientEventTypes["CONSUMER_REMOVED"] = "CONSUMER_REMOVED";
|
|
34
|
-
ClientEventTypes["DATA_PRODUCER_CREATED"] = "DATA_PRODUCER_CREATED";
|
|
35
|
-
ClientEventTypes["DATA_PRODUCER_CLOSED"] = "DATA_PRODUCER_CLOSED";
|
|
36
|
-
ClientEventTypes["DATA_CONSUMER_CREATED"] = "DATA_CONSUMER_CREATED";
|
|
37
|
-
ClientEventTypes["DATA_CONSUMER_CLOSED"] = "DATA_CONSUMER_CLOSED";
|
|
38
|
-
})(ClientEventTypes = exports.ClientEventTypes || (exports.ClientEventTypes = {}));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ClientMetaTypes.d.ts","sourceRoot":"","sources":["../../src/schema/ClientMetaTypes.ts"],"names":[],"mappings":"AAEA,oBAAY,eAAe;IAC1B,gBAAgB,qBAAqB;IACrC,YAAY,iBAAiB;IAC7B,mCAAmC,wCAAwC;IAC3E,gBAAgB,qBAAqB;IACrC,SAAS,cAAc;IAEvB,gBAAgB,qBAAqB;IACrC,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,OAAO,YAAY;CACnB;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/* eslint-disable no-shadow */
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.ClientMetaTypes = void 0;
|
|
5
|
-
var ClientMetaTypes;
|
|
6
|
-
(function (ClientMetaTypes) {
|
|
7
|
-
ClientMetaTypes["MEDIA_CONSTRAINT"] = "MEDIA_CONSTRAINT";
|
|
8
|
-
ClientMetaTypes["MEDIA_DEVICE"] = "MEDIA_DEVICE";
|
|
9
|
-
ClientMetaTypes["MEDIA_DEVICES_SUPPORTED_CONSTRAINTS"] = "MEDIA_DEVICES_SUPPORTED_CONSTRAINTS";
|
|
10
|
-
ClientMetaTypes["USER_MEDIA_ERROR"] = "USER_MEDIA_ERROR";
|
|
11
|
-
ClientMetaTypes["LOCAL_SDP"] = "LOCAL_SDP";
|
|
12
|
-
ClientMetaTypes["OPERATION_SYSTEM"] = "OPERATION_SYSTEM";
|
|
13
|
-
ClientMetaTypes["ENGINE"] = "ENGINE";
|
|
14
|
-
ClientMetaTypes["PLATFORM"] = "PLATFORM";
|
|
15
|
-
ClientMetaTypes["BROWSER"] = "BROWSER";
|
|
16
|
-
})(ClientMetaTypes = exports.ClientMetaTypes || (exports.ClientMetaTypes = {}));
|