@observertc/observer-js 1.0.0-beta.1 → 1.0.0-ca725d7.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/ObservedCall.d.ts +4 -3
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +16 -7
- package/lib/ObservedClient.d.ts +3 -0
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +14 -0
- package/lib/Observer.d.ts +2 -0
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +9 -0
- package/package.json +1 -1
- package/src/ObservedCall.ts +21 -13
- package/src/ObservedClient.ts +19 -0
- package/src/Observer.ts +10 -0
package/lib/ObservedCall.d.ts
CHANGED
|
@@ -11,9 +11,10 @@ import { ObservedCallEventMonitor } from './ObservedCallEventMonitor';
|
|
|
11
11
|
export type ObservedCallSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
12
12
|
callId: string;
|
|
13
13
|
appData?: AppData;
|
|
14
|
-
remoteTrackResolvePolicy?: 'p2p' | 'mediasoup-sfu';
|
|
14
|
+
remoteTrackResolvePolicy?: 'p2p' | 'mediasoup-sfu' | 'none';
|
|
15
15
|
updatePolicy?: 'update-on-any-client-updated' | 'update-when-all-client-updated' | 'update-on-interval';
|
|
16
16
|
updateIntervalInMs?: number;
|
|
17
|
+
closeCallIfEmptyForMs?: number;
|
|
17
18
|
};
|
|
18
19
|
export type ObservedCallEvents = {
|
|
19
20
|
update: [];
|
|
@@ -68,8 +69,8 @@ export declare class ObservedCall<AppData extends Record<string, unknown> = Reco
|
|
|
68
69
|
startedAt?: number;
|
|
69
70
|
endedAt?: number;
|
|
70
71
|
closedAt?: number;
|
|
71
|
-
|
|
72
|
-
private
|
|
72
|
+
readonly settings: Pick<ObservedCallSettings, 'closeCallIfEmptyForMs'>;
|
|
73
|
+
private closeTimer?;
|
|
73
74
|
constructor(settings: ObservedCallSettings<AppData>, observer: Observer);
|
|
74
75
|
get numberOfClients(): number;
|
|
75
76
|
get score(): number | undefined;
|
|
@@ -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,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACrG,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ObservedCall.d.ts","sourceRoot":"","sources":["../src/ObservedCall.ts"],"names":[],"mappings":"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"}
|
package/lib/ObservedCall.js
CHANGED
|
@@ -52,8 +52,8 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
52
52
|
startedAt;
|
|
53
53
|
endedAt;
|
|
54
54
|
closedAt;
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
settings;
|
|
56
|
+
closeTimer;
|
|
57
57
|
constructor(settings, observer) {
|
|
58
58
|
super();
|
|
59
59
|
this.observer = observer;
|
|
@@ -85,11 +85,8 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
85
85
|
case 'mediasoup-sfu':
|
|
86
86
|
break;
|
|
87
87
|
}
|
|
88
|
-
this.
|
|
89
|
-
|
|
90
|
-
};
|
|
91
|
-
this._callEndedEvent = {
|
|
92
|
-
emitted: false,
|
|
88
|
+
this.settings = {
|
|
89
|
+
closeCallIfEmptyForMs: settings.closeCallIfEmptyForMs,
|
|
93
90
|
};
|
|
94
91
|
}
|
|
95
92
|
get numberOfClients() {
|
|
@@ -130,6 +127,9 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
130
127
|
throw new Error(`Call ${this.callId} is closed`);
|
|
131
128
|
if (this.observedClients.has(settings.clientId))
|
|
132
129
|
throw new Error(`Client with id ${settings.clientId} already exists`);
|
|
130
|
+
if (!settings.closeClientIfIdleForMs) {
|
|
131
|
+
settings.closeClientIfIdleForMs = this.observer.config.closeClientIfIdleForMs;
|
|
132
|
+
}
|
|
133
133
|
const result = new ObservedClient_1.ObservedClient(settings, this);
|
|
134
134
|
const wasEmpty = this.observedClients.size === 0;
|
|
135
135
|
const onUpdate = () => this._onClientUpdate(result);
|
|
@@ -142,6 +142,11 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
142
142
|
this.observedClients.delete(settings.clientId);
|
|
143
143
|
if (this.observedClients.size === 0) {
|
|
144
144
|
this.emit('empty');
|
|
145
|
+
if (this.settings.closeCallIfEmptyForMs) {
|
|
146
|
+
this.closeTimer = setTimeout(() => {
|
|
147
|
+
this.close();
|
|
148
|
+
}, this.settings.closeCallIfEmptyForMs);
|
|
149
|
+
}
|
|
145
150
|
}
|
|
146
151
|
++this.totalRemovedClients;
|
|
147
152
|
});
|
|
@@ -151,6 +156,10 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
151
156
|
++this.totalAddedClients;
|
|
152
157
|
this.observedClients.set(settings.clientId, result);
|
|
153
158
|
this.maxNumberOfClients = Math.max(this.maxNumberOfClients, this.observedClients.size);
|
|
159
|
+
if (this.closeTimer) {
|
|
160
|
+
clearTimeout(this.closeTimer);
|
|
161
|
+
this.closeTimer = undefined;
|
|
162
|
+
}
|
|
154
163
|
this.emit('newclient', result);
|
|
155
164
|
if (wasEmpty) {
|
|
156
165
|
this.emit('not-empty');
|
package/lib/ObservedClient.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { Detectors } from './detectors/Detectors';
|
|
|
9
9
|
export type ObservedClientSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
10
10
|
clientId: string;
|
|
11
11
|
appData?: AppData;
|
|
12
|
+
closeClientIfIdleForMs?: number;
|
|
12
13
|
};
|
|
13
14
|
export type ObservedClientEvents = {
|
|
14
15
|
update: [sample: ClientSample, elapsedTimeInMs: number];
|
|
@@ -36,6 +37,7 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
|
|
|
36
37
|
readonly clientId: string;
|
|
37
38
|
readonly observedPeerConnections: Map<string, ObservedPeerConnection>;
|
|
38
39
|
readonly calculatedScore: CalculatedScore;
|
|
40
|
+
readonly settings: Pick<ObservedClientSettings, 'closeClientIfIdleForMs'>;
|
|
39
41
|
appData: AppData;
|
|
40
42
|
attachments?: Record<string, unknown>;
|
|
41
43
|
updated: number;
|
|
@@ -107,6 +109,7 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
|
|
|
107
109
|
readonly mediaDevices: MetaData.MediaDeviceInfo[];
|
|
108
110
|
issues: ClientIssue[];
|
|
109
111
|
private _injections;
|
|
112
|
+
private closeTimer?;
|
|
110
113
|
constructor(settings: ObservedClientSettings<AppData>, call: ObservedCall);
|
|
111
114
|
get numberOfPeerConnections(): number;
|
|
112
115
|
get score(): number | undefined;
|
|
@@ -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,WAAW,EAAE,cAAc,EAAE,YAAY,EAAwB,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACpI,OAAO,KAAK,QAAQ,MAAM,0BAA0B,CAAC;AAErD,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;
|
|
1
|
+
{"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":"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"}
|
package/lib/ObservedClient.js
CHANGED
|
@@ -18,6 +18,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
18
18
|
weight: 1,
|
|
19
19
|
value: undefined,
|
|
20
20
|
};
|
|
21
|
+
settings;
|
|
21
22
|
appData;
|
|
22
23
|
attachments;
|
|
23
24
|
updated = Date.now();
|
|
@@ -90,6 +91,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
90
91
|
mediaDevices = [];
|
|
91
92
|
issues = [];
|
|
92
93
|
_injections = {};
|
|
94
|
+
closeTimer;
|
|
93
95
|
constructor(settings, call) {
|
|
94
96
|
super();
|
|
95
97
|
this.call = call;
|
|
@@ -97,6 +99,9 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
97
99
|
this.clientId = settings.clientId;
|
|
98
100
|
this.appData = settings.appData ?? {};
|
|
99
101
|
this.detectors = new Detectors_1.Detectors();
|
|
102
|
+
this.settings = {
|
|
103
|
+
closeClientIfIdleForMs: settings.closeClientIfIdleForMs,
|
|
104
|
+
};
|
|
100
105
|
}
|
|
101
106
|
get numberOfPeerConnections() {
|
|
102
107
|
return this.observedPeerConnections.size;
|
|
@@ -125,6 +130,10 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
125
130
|
accept(sample) {
|
|
126
131
|
if (this.closed)
|
|
127
132
|
throw new Error(`Client ${this.clientId} is closed`);
|
|
133
|
+
if (this.closeTimer) {
|
|
134
|
+
clearTimeout(this.closeTimer);
|
|
135
|
+
this.closeTimer = undefined;
|
|
136
|
+
}
|
|
128
137
|
const now = Date.now();
|
|
129
138
|
const elapsedInMs = now - this.updated;
|
|
130
139
|
const elapsedInSeconds = elapsedInMs / 1000;
|
|
@@ -268,6 +277,11 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
268
277
|
this.totalScoreSum += this.calculatedScore.value;
|
|
269
278
|
++this.numberOfScoreMeasurements;
|
|
270
279
|
}
|
|
280
|
+
if (this.settings.closeClientIfIdleForMs !== undefined) {
|
|
281
|
+
this.closeTimer = setTimeout(() => {
|
|
282
|
+
this.close();
|
|
283
|
+
}, this.settings.closeClientIfIdleForMs);
|
|
284
|
+
}
|
|
271
285
|
}
|
|
272
286
|
_processClientEvent(event, postBuffer) {
|
|
273
287
|
// eslint-disable-next-line no-console
|
package/lib/Observer.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export type ObserverConfig<AppData extends Record<string, unknown> = Record<stri
|
|
|
23
23
|
defaultCallUpdatePolicy?: ObservedCallSettings['updatePolicy'];
|
|
24
24
|
defaultCallUpdateIntervalInMs?: number;
|
|
25
25
|
appData?: AppData;
|
|
26
|
+
closeClientIfIdleForMs?: number;
|
|
27
|
+
closeCallIfEmptyForMs?: number;
|
|
26
28
|
};
|
|
27
29
|
export declare interface Observer {
|
|
28
30
|
on<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;
|
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,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC9G,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAK9D,MAAM,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC9C,cAAc,EAAE,CAAC,YAAY,CAAC,CAAC;IAC/B,cAAc,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC9C,iBAAiB,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACpD,wBAAwB,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAC1D,SAAS,EAAE,CAAC,YAAY,CAAC,CAAC;IAC1B,QAAQ,EAAE,EAAE,CAAC;IACb,OAAO,EAAE,EAAE,CAAC;CACZ,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAC/F,YAAY,CAAC,EAAE,4BAA4B,GAAG,8BAA8B,GAAG,oBAAoB,CAAC;IACpG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uBAAuB,CAAC,EAAE,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAC/D,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../src/Observer.ts"],"names":[],"mappings":"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"}
|
package/lib/Observer.js
CHANGED
|
@@ -80,6 +80,9 @@ class Observer extends events_1.EventEmitter {
|
|
|
80
80
|
settings.updatePolicy = this.config.defaultCallUpdatePolicy;
|
|
81
81
|
settings.updateIntervalInMs = this.config.defaultCallUpdateIntervalInMs;
|
|
82
82
|
}
|
|
83
|
+
if (!settings.closeCallIfEmptyForMs) {
|
|
84
|
+
settings.closeCallIfEmptyForMs = this.config.closeCallIfEmptyForMs;
|
|
85
|
+
}
|
|
83
86
|
const observedCall = new ObservedCall_1.ObservedCall(settings, this);
|
|
84
87
|
const onCallUpdated = () => this._onObservedCallUpdated(observedCall);
|
|
85
88
|
if (this.observedCalls.has(observedCall.callId))
|
|
@@ -87,6 +90,12 @@ class Observer extends events_1.EventEmitter {
|
|
|
87
90
|
if (settings.remoteTrackResolvePolicy === 'mediasoup-sfu') {
|
|
88
91
|
observedCall.remoteTrackResolver = new MediasoupRemoteTrackResolver_1.MediasoupRemoteTrackResolver(observedCall);
|
|
89
92
|
}
|
|
93
|
+
else if (settings.remoteTrackResolvePolicy === 'p2p') {
|
|
94
|
+
// For future implementation
|
|
95
|
+
}
|
|
96
|
+
else if (settings.remoteTrackResolvePolicy === 'none' || !settings.remoteTrackResolvePolicy) {
|
|
97
|
+
// do nothing
|
|
98
|
+
}
|
|
90
99
|
observedCall.once('close', () => {
|
|
91
100
|
this.observedCalls.delete(observedCall.callId);
|
|
92
101
|
observedCall.off('update', onCallUpdated);
|
package/package.json
CHANGED
package/src/ObservedCall.ts
CHANGED
|
@@ -15,9 +15,10 @@ import { ObservedCallEventMonitor } from './ObservedCallEventMonitor';
|
|
|
15
15
|
export type ObservedCallSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
16
16
|
callId: string;
|
|
17
17
|
appData?: AppData;
|
|
18
|
-
remoteTrackResolvePolicy?: 'p2p' | 'mediasoup-sfu',
|
|
18
|
+
remoteTrackResolvePolicy?: 'p2p' | 'mediasoup-sfu' | 'none',
|
|
19
19
|
updatePolicy?: 'update-on-any-client-updated' | 'update-when-all-client-updated' | 'update-on-interval',
|
|
20
20
|
updateIntervalInMs?: number,
|
|
21
|
+
closeCallIfEmptyForMs?: number,
|
|
21
22
|
};
|
|
22
23
|
|
|
23
24
|
export type ObservedCallEvents = {
|
|
@@ -86,13 +87,8 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
|
|
|
86
87
|
public endedAt?: number;
|
|
87
88
|
public closedAt?: number;
|
|
88
89
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
timer?: ReturnType<typeof setTimeout>,
|
|
92
|
-
};
|
|
93
|
-
private _callEndedEvent: {
|
|
94
|
-
emitted: boolean
|
|
95
|
-
};
|
|
90
|
+
public readonly settings: Pick<ObservedCallSettings, 'closeCallIfEmptyForMs'>;
|
|
91
|
+
private closeTimer?: ReturnType<typeof setTimeout>;
|
|
96
92
|
|
|
97
93
|
public constructor(
|
|
98
94
|
settings: ObservedCallSettings<AppData>,
|
|
@@ -134,11 +130,8 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
|
|
|
134
130
|
break;
|
|
135
131
|
}
|
|
136
132
|
|
|
137
|
-
this.
|
|
138
|
-
|
|
139
|
-
};
|
|
140
|
-
this._callEndedEvent = {
|
|
141
|
-
emitted: false,
|
|
133
|
+
this.settings = {
|
|
134
|
+
closeCallIfEmptyForMs: settings.closeCallIfEmptyForMs,
|
|
142
135
|
};
|
|
143
136
|
}
|
|
144
137
|
|
|
@@ -184,6 +177,10 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
|
|
|
184
177
|
if (this.closed) throw new Error(`Call ${this.callId} is closed`);
|
|
185
178
|
if (this.observedClients.has(settings.clientId)) throw new Error(`Client with id ${settings.clientId} already exists`);
|
|
186
179
|
|
|
180
|
+
if (!settings.closeClientIfIdleForMs) {
|
|
181
|
+
settings.closeClientIfIdleForMs = this.observer.config.closeClientIfIdleForMs;
|
|
182
|
+
}
|
|
183
|
+
|
|
187
184
|
const result = new ObservedClient<ClientAppData>(settings, this);
|
|
188
185
|
const wasEmpty = this.observedClients.size === 0;
|
|
189
186
|
const onUpdate = () => this._onClientUpdate(result);
|
|
@@ -198,6 +195,12 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
|
|
|
198
195
|
|
|
199
196
|
if (this.observedClients.size === 0) {
|
|
200
197
|
this.emit('empty');
|
|
198
|
+
|
|
199
|
+
if (this.settings.closeCallIfEmptyForMs) {
|
|
200
|
+
this.closeTimer = setTimeout(() => {
|
|
201
|
+
this.close();
|
|
202
|
+
}, this.settings.closeCallIfEmptyForMs);
|
|
203
|
+
}
|
|
201
204
|
}
|
|
202
205
|
++this.totalRemovedClients;
|
|
203
206
|
});
|
|
@@ -209,6 +212,11 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
|
|
|
209
212
|
this.observedClients.set(settings.clientId, result);
|
|
210
213
|
this.maxNumberOfClients = Math.max(this.maxNumberOfClients, this.observedClients.size);
|
|
211
214
|
|
|
215
|
+
if (this.closeTimer) {
|
|
216
|
+
clearTimeout(this.closeTimer);
|
|
217
|
+
this.closeTimer = undefined;
|
|
218
|
+
}
|
|
219
|
+
|
|
212
220
|
this.emit('newclient', result);
|
|
213
221
|
|
|
214
222
|
if (wasEmpty) {
|
package/src/ObservedClient.ts
CHANGED
|
@@ -16,6 +16,7 @@ const logger = createLogger('ObservedClient');
|
|
|
16
16
|
export type ObservedClientSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
17
17
|
clientId: string;
|
|
18
18
|
appData?: AppData;
|
|
19
|
+
closeClientIfIdleForMs?: number;
|
|
19
20
|
};
|
|
20
21
|
|
|
21
22
|
export type ObservedClientEvents = {
|
|
@@ -51,6 +52,8 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
51
52
|
value: undefined,
|
|
52
53
|
};
|
|
53
54
|
|
|
55
|
+
public readonly settings: Pick<ObservedClientSettings, 'closeClientIfIdleForMs'>;
|
|
56
|
+
|
|
54
57
|
public appData: AppData;
|
|
55
58
|
public attachments?: Record<string, unknown>;
|
|
56
59
|
|
|
@@ -136,6 +139,8 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
136
139
|
|
|
137
140
|
private _injections: Pick<ClientSample, 'clientEvents' | 'clientIssues' | 'extensionStats' | 'attachments' | 'clientMetaItems'> = {};
|
|
138
141
|
|
|
142
|
+
private closeTimer?: ReturnType<typeof setTimeout>;
|
|
143
|
+
|
|
139
144
|
public constructor(settings: ObservedClientSettings<AppData>, public readonly call: ObservedCall) {
|
|
140
145
|
super();
|
|
141
146
|
this.setMaxListeners(Infinity);
|
|
@@ -144,6 +149,9 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
144
149
|
this.appData = settings.appData ?? {} as AppData;
|
|
145
150
|
|
|
146
151
|
this.detectors = new Detectors();
|
|
152
|
+
this.settings = {
|
|
153
|
+
closeClientIfIdleForMs: settings.closeClientIfIdleForMs,
|
|
154
|
+
};
|
|
147
155
|
}
|
|
148
156
|
|
|
149
157
|
public get numberOfPeerConnections() {
|
|
@@ -179,6 +187,11 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
179
187
|
public accept(sample: ClientSample): void {
|
|
180
188
|
if (this.closed) throw new Error(`Client ${this.clientId} is closed`);
|
|
181
189
|
|
|
190
|
+
if (this.closeTimer) {
|
|
191
|
+
clearTimeout(this.closeTimer);
|
|
192
|
+
this.closeTimer = undefined;
|
|
193
|
+
}
|
|
194
|
+
|
|
182
195
|
const now = Date.now();
|
|
183
196
|
const elapsedInMs = now - this.updated;
|
|
184
197
|
const elapsedInSeconds = elapsedInMs / 1000;
|
|
@@ -347,6 +360,12 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
347
360
|
this.totalScoreSum += this.calculatedScore.value;
|
|
348
361
|
++this.numberOfScoreMeasurements;
|
|
349
362
|
}
|
|
363
|
+
|
|
364
|
+
if (this.settings.closeClientIfIdleForMs !== undefined) {
|
|
365
|
+
this.closeTimer = setTimeout(() => {
|
|
366
|
+
this.close();
|
|
367
|
+
}, this.settings.closeClientIfIdleForMs);
|
|
368
|
+
}
|
|
350
369
|
}
|
|
351
370
|
|
|
352
371
|
private _processClientEvent(event: ClientEvent, postBuffer?: ClientEvent[]) {
|
package/src/Observer.ts
CHANGED
|
@@ -31,6 +31,8 @@ export type ObserverConfig<AppData extends Record<string, unknown> = Record<stri
|
|
|
31
31
|
defaultCallUpdatePolicy?: ObservedCallSettings['updatePolicy'],
|
|
32
32
|
defaultCallUpdateIntervalInMs?: number,
|
|
33
33
|
appData?: AppData,
|
|
34
|
+
closeClientIfIdleForMs?: number,
|
|
35
|
+
closeCallIfEmptyForMs?: number,
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
export declare interface Observer {
|
|
@@ -125,6 +127,10 @@ export class Observer<AppData extends Record<string, unknown> = Record<string, u
|
|
|
125
127
|
settings.updatePolicy = this.config.defaultCallUpdatePolicy;
|
|
126
128
|
settings.updateIntervalInMs = this.config.defaultCallUpdateIntervalInMs;
|
|
127
129
|
}
|
|
130
|
+
if (!settings.closeCallIfEmptyForMs) {
|
|
131
|
+
settings.closeCallIfEmptyForMs = this.config.closeCallIfEmptyForMs;
|
|
132
|
+
}
|
|
133
|
+
|
|
128
134
|
const observedCall = new ObservedCall(settings, this);
|
|
129
135
|
const onCallUpdated = () => this._onObservedCallUpdated(observedCall);
|
|
130
136
|
|
|
@@ -132,6 +138,10 @@ export class Observer<AppData extends Record<string, unknown> = Record<string, u
|
|
|
132
138
|
|
|
133
139
|
if (settings.remoteTrackResolvePolicy === 'mediasoup-sfu') {
|
|
134
140
|
observedCall.remoteTrackResolver = new MediasoupRemoteTrackResolver(observedCall);
|
|
141
|
+
} else if (settings.remoteTrackResolvePolicy === 'p2p') {
|
|
142
|
+
// For future implementation
|
|
143
|
+
} else if (settings.remoteTrackResolvePolicy === 'none' || !settings.remoteTrackResolvePolicy) {
|
|
144
|
+
// do nothing
|
|
135
145
|
}
|
|
136
146
|
|
|
137
147
|
observedCall.once('close', () => {
|