@observertc/observer-js 1.0.1-57a1811.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.
Files changed (49) hide show
  1. package/lib/ObservedCall.d.ts +0 -13
  2. package/lib/ObservedCall.d.ts.map +1 -1
  3. package/lib/ObservedCall.js +1 -37
  4. package/lib/ObservedClient.d.ts +7 -39
  5. package/lib/ObservedClient.d.ts.map +1 -1
  6. package/lib/ObservedClient.js +58 -110
  7. package/lib/ObservedDataChannel.d.ts +0 -4
  8. package/lib/ObservedDataChannel.d.ts.map +1 -1
  9. package/lib/ObservedDataChannel.js +0 -28
  10. package/lib/ObservedIceCandidatePair.d.ts +0 -4
  11. package/lib/ObservedIceCandidatePair.d.ts.map +1 -1
  12. package/lib/ObservedIceCandidatePair.js +0 -28
  13. package/lib/ObservedPeerConnection.d.ts +0 -10
  14. package/lib/ObservedPeerConnection.d.ts.map +1 -1
  15. package/lib/ObservedPeerConnection.js +9 -79
  16. package/lib/Observer.d.ts +21 -27
  17. package/lib/Observer.d.ts.map +1 -1
  18. package/lib/Observer.js +40 -59
  19. package/lib/index.d.ts +0 -4
  20. package/lib/index.d.ts.map +1 -1
  21. package/lib/index.js +1 -5
  22. package/lib/schema/{ClientEventTypes.d.ts → eventTypes.d.ts} +2 -2
  23. package/lib/schema/eventTypes.d.ts.map +1 -0
  24. package/lib/schema/eventTypes.js +38 -0
  25. package/lib/schema/{ClientMetaTypes.d.ts → metaTypes.d.ts} +2 -2
  26. package/lib/schema/metaTypes.d.ts.map +1 -0
  27. package/lib/schema/metaTypes.js +16 -0
  28. package/package.json +1 -1
  29. package/src/ObservedCall.ts +1 -44
  30. package/src/ObservedClient.ts +60 -125
  31. package/src/ObservedDataChannel.ts +0 -29
  32. package/src/ObservedIceCandidatePair.ts +0 -26
  33. package/src/ObservedPeerConnection.ts +10 -90
  34. package/src/Observer.ts +68 -81
  35. package/src/index.ts +0 -4
  36. package/src/schema/{ClientEventTypes.ts → eventTypes.ts} +1 -1
  37. package/src/schema/{ClientMetaTypes.ts → metaTypes.ts} +1 -1
  38. package/lib/ObservedTURN.d.ts +0 -31
  39. package/lib/ObservedTURN.d.ts.map +0 -1
  40. package/lib/ObservedTURN.js +0 -58
  41. package/lib/ObservedTurnServer.d.ts +0 -25
  42. package/lib/ObservedTurnServer.d.ts.map +0 -1
  43. package/lib/ObservedTurnServer.js +0 -59
  44. package/lib/schema/ClientEventTypes.d.ts.map +0 -1
  45. package/lib/schema/ClientEventTypes.js +0 -38
  46. package/lib/schema/ClientMetaTypes.d.ts.map +0 -1
  47. package/lib/schema/ClientMetaTypes.js +0 -16
  48. package/src/ObservedTURN.ts +0 -86
  49. package/src/ObservedTurnServer.ts +0 -72
package/src/Observer.ts CHANGED
@@ -1,24 +1,21 @@
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
- import { ClientEvent, ClientMetaData, ClientIssue, ExtensionStat, ClientSample } from './schema/ClientSample';
5
+ import { ClientEvent, ClientMetaData, ClientIssue, ExtensionStat } from './schema/ClientSample';
5
6
  import { ObservedClient } from './ObservedClient';
6
- import { ObservedTURN } from './ObservedTURN';
7
7
 
8
8
  const logger = createLogger('Observer');
9
9
 
10
10
  export type ObserverEvents = {
11
- 'client-event': [ObservedClient, ClientEvent];
12
- 'call-updated': [ObservedCall],
13
- 'client-issue': [ObservedClient, ClientIssue],
14
- 'client-metadata': [ObservedClient, ClientMetaData],
15
- 'client-extension-stats': [ObservedClient, ExtensionStat],
16
11
  'newcall': [ObservedCall],
17
12
  'close': [],
18
13
  }
19
14
 
20
- export type ObserverConfig = {
21
- updateIntervalInMs?: number,
15
+ export type ProcessorInputContext<T> = {
16
+ call: ObservedCall;
17
+ client: ObservedClient;
18
+ data: T;
22
19
  }
23
20
 
24
21
  export declare interface Observer {
@@ -28,40 +25,21 @@ export declare interface Observer {
28
25
  emit<U extends keyof ObserverEvents>(event: U, ...args: ObserverEvents[U]): boolean;
29
26
  }
30
27
 
31
- export type ObserverSummary = {
32
- rttlt50: number;
33
- }
34
-
35
28
  export class Observer extends EventEmitter {
36
- public readonly observedTURN = new ObservedTURN();
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
- public readonly config: ObserverConfig;
39
-
40
37
  public closed = false;
41
38
 
42
- public numberOfClients = 0;
43
- public numberOfInboundRtpStreams = 0;
44
- public numberOfOutboundRtpStreams = 0;
45
- public numberOfDataChannels = 0;
46
- public numberOfPeerConnections = 0;
47
-
48
- public get numberOfCalls() {
49
- return this.observedCalls.size;
50
- }
51
-
52
- private _timer?: ReturnType<typeof setInterval>;
53
-
54
- public constructor(config: ObserverConfig = {
55
- updateIntervalInMs: 10000,
56
- }) {
39
+ public constructor(
40
+ ) {
57
41
  super();
58
42
  this.setMaxListeners(Infinity);
59
- this.config = config;
60
- this.update = this.update.bind(this);
61
-
62
- if (this.config.updateIntervalInMs) {
63
- this._timer = setInterval(this.update.bind(this), this.config.updateIntervalInMs);
64
- }
65
43
  }
66
44
 
67
45
  public getObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(callId: string): ObservedCall<T> | undefined {
@@ -83,70 +61,79 @@ export class Observer extends EventEmitter {
83
61
 
84
62
  observedCall.once('close', () => {
85
63
  this.observedCalls.delete(observedCall.callId);
86
- observedCall.off('update', this.update);
87
64
  });
88
65
 
89
66
  this.observedCalls.set(observedCall.callId, observedCall);
90
- observedCall.on('update', this.update);
91
67
 
92
68
  this.emit('newcall', observedCall);
93
69
 
94
70
  return observedCall;
95
71
  }
96
72
 
97
- public close() {
98
- if (this.closed) {
99
- return logger.debug('Attempted to close twice');
100
- }
101
- this.closed = true;
102
- clearInterval(this._timer);
103
- this._timer = undefined;
104
-
105
- this.observedCalls.forEach((call) => call.close());
106
-
107
- this.emit('close');
73
+ public addClientEventMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientEvent>>[]): Observer {
74
+
75
+ this.processors.events.addMiddleware(...middlewares);
76
+
77
+ return this;
108
78
  }
109
79
 
110
- public accept(sample: ClientSample & { callId: string; clientId: string }) {
111
- if (this.closed) return;
112
- if (!sample.callId) return logger.warn('Received sample without callId. %o', sample);
113
- if (!sample.clientId) return logger.warn('Received sample without clientId %o', sample);
80
+ public removeClientEventMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientEvent>>[]): Observer {
114
81
 
115
- const call = this.getObservedCall(sample.callId);
82
+ this.processors.events.removeMiddleware(...middlewares);
116
83
 
117
- if (!call) {
118
- return logger.warn(`Received sample for unknown call ${sample.callId}. %o`, sample);
119
- }
84
+ return this;
85
+ }
120
86
 
121
- const client = call.getObservedClient(sample.clientId);
87
+ public addClientMetaDataMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientMetaData>>[]): Observer {
122
88
 
123
- if (!client) {
124
- return logger.warn(`Received sample for unknown client ${sample.clientId} in call ${sample.callId}. %o`, sample);
125
- }
89
+ this.processors.metaData.addMiddleware(...middlewares);
126
90
 
127
- client.accept(sample);
91
+ return this;
128
92
  }
129
93
 
130
- public update() {
131
- if (this.closed) {
132
- return;
133
- }
94
+ public removeClientMetaDataMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientMetaData>>[]): Observer {
134
95
 
135
- this.numberOfInboundRtpStreams = 0;
136
- this.numberOfOutboundRtpStreams = 0;
137
- this.numberOfPeerConnections = 0;
138
- this.numberOfDataChannels = 0;
139
- this.numberOfClients = 0;
140
-
141
- for (const call of this.observedCalls.values()) {
142
- this.numberOfInboundRtpStreams += call.numberOfInboundRtpStreams;
143
- this.numberOfOutboundRtpStreams += call.numberOfOutboundRtpStreams;
144
- this.numberOfPeerConnections += call.numberOfPeerConnections;
145
- this.numberOfDataChannels += call.numberOfDataChannels;
146
- this.numberOfClients += call.numberOfClients;
147
- }
96
+ this.processors.metaData.removeMiddleware(...middlewares);
148
97
 
149
- this.observedTURN.update();
98
+ return this;
150
99
  }
151
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
+
129
+ public close() {
130
+ if (this.closed) {
131
+ return logger.debug('Attempted to close twice');
132
+ }
133
+ this.closed = true;
134
+
135
+ this.observedCalls.forEach((call) => call.close());
136
+
137
+ this.emit('close');
138
+ }
152
139
  }
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 { ClientEventTypes } from './schema/ClientEventTypes';
23
- export { ClientMetaTypes } from './schema/ClientMetaTypes';
24
- export { ClientSample } from './schema/ClientSample';
25
- export { ScoreCalculator } from './scores/ScoreCalculator';
26
22
 
27
23
  export { Middleware } from './common/Middleware';
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable no-shadow */
2
2
 
3
- export enum ClientEventTypes {
3
+ export enum ClientEventType {
4
4
  CALL_STARTED = 'CALL_STARTED',
5
5
  CALL_ENDED = 'CALL_ENDED',
6
6
  CLIENT_JOINED = 'CLIENT_JOINED',
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable no-shadow */
2
2
 
3
- export enum ClientMetaTypes {
3
+ export enum ClientMetaType {
4
4
  MEDIA_CONSTRAINT = 'MEDIA_CONSTRAINT',
5
5
  MEDIA_DEVICE = 'MEDIA_DEVICE',
6
6
  MEDIA_DEVICES_SUPPORTED_CONSTRAINTS = 'MEDIA_DEVICES_SUPPORTED_CONSTRAINTS',
@@ -1,31 +0,0 @@
1
- /// <reference types="node" />
2
- import { EventEmitter } from 'stream';
3
- import { ObservedPeerConnection } from './ObservedPeerConnection';
4
- import { ObservedTurnServer } from './ObservedTurnServer';
5
- export type ObservedTURNEventMap = {
6
- 'update': [ObservedTURN];
7
- 'close': [];
8
- };
9
- export declare interface ObservedTURN {
10
- on<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
11
- off<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
12
- once<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
13
- emit<U extends keyof ObservedTURNEventMap>(event: U, ...args: ObservedTURNEventMap[U]): boolean;
14
- }
15
- export declare class ObservedTURN extends EventEmitter {
16
- totalBytesSent: number;
17
- totalBytesReceived: number;
18
- totalPacketsSent: number;
19
- totalPacketsReceived: number;
20
- packetsSentPerSecond: number;
21
- packetsReceivedPerSecond: number;
22
- outboundBitrate: number;
23
- inboundBitrate: number;
24
- numberOfClients: number;
25
- readonly servers: Map<string, ObservedTurnServer>;
26
- constructor();
27
- update(): void;
28
- addPeerConnection(peerConnection: ObservedPeerConnection): ObservedTurnServer | undefined;
29
- removePeerConnection(peerConnection: ObservedPeerConnection): void;
30
- }
31
- //# sourceMappingURL=ObservedTURN.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ObservedTURN.d.ts","sourceRoot":"","sources":["../src/ObservedTURN.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAK1D,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC;IACzB,OAAO,EAAE,EAAE,CAAC;CACZ,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,YAAY;IACpC,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,YAAa,SAAQ,YAAY;IACtC,cAAc,SAAK;IACnB,kBAAkB,SAAK;IACvB,gBAAgB,SAAK;IACrB,oBAAoB,SAAK;IAEzB,oBAAoB,SAAK;IACzB,wBAAwB,SAAK;IAC7B,eAAe,SAAK;IACpB,cAAc,SAAK;IACnB,eAAe,SAAK;IAE3B,SAAgB,OAAO,kCAAyC;;IAOzD,MAAM;IAgBN,iBAAiB,CAAC,cAAc,EAAE,sBAAsB;IAyBxD,oBAAoB,CAAC,cAAc,EAAE,sBAAsB;CAMlE"}
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ObservedTURN = void 0;
4
- const stream_1 = require("stream");
5
- const ObservedTurnServer_1 = require("./ObservedTurnServer");
6
- const logger_1 = require("./common/logger");
7
- const logger = (0, logger_1.createLogger)('ObservedTURN');
8
- class ObservedTURN extends stream_1.EventEmitter {
9
- totalBytesSent = 0;
10
- totalBytesReceived = 0;
11
- totalPacketsSent = 0;
12
- totalPacketsReceived = 0;
13
- packetsSentPerSecond = 0;
14
- packetsReceivedPerSecond = 0;
15
- outboundBitrate = 0;
16
- inboundBitrate = 0;
17
- numberOfClients = 0;
18
- servers = new Map();
19
- constructor() {
20
- super();
21
- }
22
- update() {
23
- const clientIds = new Set();
24
- this.packetsReceivedPerSecond = 0;
25
- this.packetsSentPerSecond = 0;
26
- this.outboundBitrate = 0;
27
- this.inboundBitrate = 0;
28
- for (const server of this.servers.values()) {
29
- server.update();
30
- server.observedPeerConnections.forEach((pc) => clientIds.add(pc.client.clientId));
31
- }
32
- this.numberOfClients = clientIds.size;
33
- }
34
- addPeerConnection(peerConnection) {
35
- const turnPairs = peerConnection.selectedIceCandidatePairs.filter((pair) => pair.getLocalCandidate()?.candidateType === 'relay' && pair.getRemoteCandidate()?.url?.startsWith('turn:'));
36
- if (turnPairs.length !== 1) {
37
- return (logger.warn(`Expected exactly one TURN pair, but found for peerconnection ${peerConnection.peerConnectionId}`, turnPairs.length), undefined);
38
- }
39
- const candidatePair = turnPairs[0];
40
- const rawUrl = candidatePair.getRemoteCandidate()?.url;
41
- if (!rawUrl) {
42
- return (logger.warn(`No remote candidate URL found for peerconnection ${peerConnection.peerConnectionId}`), undefined);
43
- }
44
- const turnUrl = new URL(rawUrl);
45
- const turnServerUrl = `${turnUrl.protocol}//${turnUrl.hostname}:${turnUrl.port}`;
46
- let turnServer = this.servers.get(turnServerUrl);
47
- if (!turnServer) {
48
- turnServer = new ObservedTurnServer_1.ObservedTurnServer(turnServerUrl, this);
49
- }
50
- return turnServer;
51
- }
52
- removePeerConnection(peerConnection) {
53
- for (const turnServer of this.servers.values()) {
54
- turnServer.observedPeerConnections.delete(peerConnection.peerConnectionId);
55
- }
56
- }
57
- }
58
- exports.ObservedTURN = ObservedTURN;
@@ -1,25 +0,0 @@
1
- import { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
2
- import { ObservedPeerConnection } from './ObservedPeerConnection';
3
- import { ObservedTURN } from './ObservedTURN';
4
- export declare class ObservedTurnServer {
5
- readonly url: string;
6
- readonly observedTURN: ObservedTURN;
7
- totalBytesSent: number;
8
- totalBytesReceived: number;
9
- totalPacketsSent: number;
10
- totalPacketsReceived: number;
11
- packetsSentPerSecond: number;
12
- packetsReceivedPerSecond: number;
13
- outboundBitrate: number;
14
- inboundBitrate: number;
15
- deltaBytesSent: number;
16
- deltaBytesReceived: number;
17
- deltaPacketsSent: number;
18
- deltaPacketsReceived: number;
19
- readonly observedPeerConnections: Map<string, ObservedPeerConnection>;
20
- updated: number;
21
- constructor(url: string, observedTURN: ObservedTURN);
22
- updateTurnUsage(...selectedcandidatepairs: ObservedIceCandidatePair[]): void;
23
- update(): void;
24
- }
25
- //# sourceMappingURL=ObservedTurnServer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ObservedTurnServer.d.ts","sourceRoot":"","sources":["../src/ObservedTurnServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,qBAAa,kBAAkB;aAqBb,GAAG,EAAE,MAAM;aACX,YAAY,EAAE,YAAY;IArBpC,cAAc,SAAK;IACnB,kBAAkB,SAAK;IACvB,gBAAgB,SAAK;IACrB,oBAAoB,SAAK;IAEzB,oBAAoB,SAAK;IACzB,wBAAwB,SAAK;IAC7B,eAAe,SAAK;IACpB,cAAc,SAAK;IAEnB,cAAc,SAAK;IACnB,kBAAkB,SAAK;IACvB,gBAAgB,SAAK;IACrB,oBAAoB,SAAK;IAEhC,SAAgB,uBAAuB,sCAA6C;IAE7E,OAAO,SAAc;gBAGX,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,YAAY;IAKpC,eAAe,CAAC,GAAG,sBAAsB,EAAE,wBAAwB,EAAE;IASrE,MAAM;CA+Bb"}
@@ -1,59 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ObservedTurnServer = void 0;
4
- class ObservedTurnServer {
5
- url;
6
- observedTURN;
7
- totalBytesSent = 0;
8
- totalBytesReceived = 0;
9
- totalPacketsSent = 0;
10
- totalPacketsReceived = 0;
11
- packetsSentPerSecond = 0;
12
- packetsReceivedPerSecond = 0;
13
- outboundBitrate = 0;
14
- inboundBitrate = 0;
15
- deltaBytesSent = 0;
16
- deltaBytesReceived = 0;
17
- deltaPacketsSent = 0;
18
- deltaPacketsReceived = 0;
19
- observedPeerConnections = new Map();
20
- updated = Date.now();
21
- constructor(url, observedTURN) {
22
- this.url = url;
23
- this.observedTURN = observedTURN;
24
- }
25
- updateTurnUsage(...selectedcandidatepairs) {
26
- for (const selectedcandidatepair of selectedcandidatepairs) {
27
- this.deltaBytesReceived += selectedcandidatepair.deltaBytesReceived;
28
- this.deltaBytesSent += selectedcandidatepair.deltaBytesSent;
29
- this.deltaPacketsReceived += selectedcandidatepair.deltaPacketsReceived;
30
- this.deltaPacketsSent += selectedcandidatepair.deltaPacketsSent;
31
- }
32
- }
33
- update() {
34
- const now = Date.now();
35
- const deltaInS = (now - this.updated) / 1000;
36
- this.packetsSentPerSecond = this.deltaPacketsSent / deltaInS;
37
- this.packetsReceivedPerSecond = this.deltaPacketsReceived / deltaInS;
38
- this.outboundBitrate = (this.deltaBytesReceived * 8) / deltaInS;
39
- this.inboundBitrate = (this.deltaBytesSent * 8) / deltaInS;
40
- this.totalBytesSent += this.deltaBytesSent;
41
- this.totalBytesReceived += this.deltaBytesReceived;
42
- this.totalPacketsSent += this.deltaPacketsSent;
43
- this.totalPacketsReceived += this.deltaPacketsReceived;
44
- this.observedTURN.totalBytesSent += this.deltaBytesSent;
45
- this.observedTURN.totalBytesReceived += this.deltaBytesReceived;
46
- this.observedTURN.totalPacketsSent += this.deltaPacketsSent;
47
- this.observedTURN.totalPacketsReceived += this.deltaPacketsReceived;
48
- this.observedTURN.inboundBitrate += this.inboundBitrate;
49
- this.observedTURN.outboundBitrate += this.outboundBitrate;
50
- this.observedTURN.packetsReceivedPerSecond += this.packetsReceivedPerSecond;
51
- this.observedTURN.packetsSentPerSecond += this.packetsSentPerSecond;
52
- this.deltaBytesSent = 0;
53
- this.deltaBytesReceived = 0;
54
- this.deltaPacketsSent = 0;
55
- this.deltaPacketsReceived = 0;
56
- this.updated = now;
57
- }
58
- }
59
- exports.ObservedTurnServer = ObservedTurnServer;
@@ -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 = {}));
@@ -1,86 +0,0 @@
1
- import { EventEmitter } from 'stream';
2
- import { ObservedPeerConnection } from './ObservedPeerConnection';
3
- import { ObservedTurnServer } from './ObservedTurnServer';
4
- import { createLogger } from './common/logger';
5
-
6
- const logger = createLogger('ObservedTURN');
7
-
8
- export type ObservedTURNEventMap = {
9
- 'update': [ObservedTURN];
10
- 'close': [];
11
- }
12
-
13
- export declare interface ObservedTURN {
14
- on<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
15
- off<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
16
- once<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
17
- emit<U extends keyof ObservedTURNEventMap>(event: U, ...args: ObservedTURNEventMap[U]): boolean;
18
- }
19
-
20
- export class ObservedTURN extends EventEmitter {
21
- public totalBytesSent = 0;
22
- public totalBytesReceived = 0;
23
- public totalPacketsSent = 0;
24
- public totalPacketsReceived = 0;
25
-
26
- public packetsSentPerSecond = 0;
27
- public packetsReceivedPerSecond = 0;
28
- public outboundBitrate = 0;
29
- public inboundBitrate = 0;
30
- public numberOfClients = 0;
31
-
32
- public readonly servers = new Map<string, ObservedTurnServer>();
33
-
34
- public constructor(
35
- ) {
36
- super();
37
- }
38
-
39
- public update() {
40
- const clientIds = new Set<string>();
41
-
42
- this.packetsReceivedPerSecond = 0;
43
- this.packetsSentPerSecond = 0;
44
- this.outboundBitrate = 0;
45
- this.inboundBitrate = 0;
46
-
47
- for (const server of this.servers.values()) {
48
- server.update();
49
- server.observedPeerConnections.forEach((pc) => clientIds.add(pc.client.clientId));
50
- }
51
-
52
- this.numberOfClients = clientIds.size;
53
- }
54
-
55
- public addPeerConnection(peerConnection: ObservedPeerConnection) {
56
- const turnPairs = peerConnection.selectedIceCandidatePairs.filter((pair) => pair.getLocalCandidate()?.candidateType === 'relay' && pair.getRemoteCandidate()?.url?.startsWith('turn:'));
57
-
58
- if (turnPairs.length !== 1) {
59
- return (logger.warn(`Expected exactly one TURN pair, but found for peerconnection ${peerConnection.peerConnectionId}`, turnPairs.length), undefined);
60
- }
61
-
62
- const candidatePair = turnPairs[0];
63
- const rawUrl = candidatePair.getRemoteCandidate()?.url;
64
-
65
- if (!rawUrl) {
66
- return (logger.warn(`No remote candidate URL found for peerconnection ${peerConnection.peerConnectionId}`), undefined);
67
- }
68
-
69
- const turnUrl = new URL(rawUrl);
70
- const turnServerUrl = `${turnUrl.protocol}//${turnUrl.hostname}:${turnUrl.port}`;
71
- let turnServer = this.servers.get(turnServerUrl);
72
-
73
- if (!turnServer) {
74
- turnServer = new ObservedTurnServer(turnServerUrl, this);
75
- }
76
-
77
- return turnServer;
78
- }
79
-
80
- public removePeerConnection(peerConnection: ObservedPeerConnection) {
81
- for (const turnServer of this.servers.values()) {
82
- turnServer.observedPeerConnections.delete(peerConnection.peerConnectionId);
83
- }
84
- }
85
-
86
- }
@@ -1,72 +0,0 @@
1
- import { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
2
- import { ObservedPeerConnection } from './ObservedPeerConnection';
3
- import { ObservedTURN } from './ObservedTURN';
4
-
5
- export class ObservedTurnServer {
6
- public totalBytesSent = 0;
7
- public totalBytesReceived = 0;
8
- public totalPacketsSent = 0;
9
- public totalPacketsReceived = 0;
10
-
11
- public packetsSentPerSecond = 0;
12
- public packetsReceivedPerSecond = 0;
13
- public outboundBitrate = 0;
14
- public inboundBitrate = 0;
15
-
16
- public deltaBytesSent = 0;
17
- public deltaBytesReceived = 0;
18
- public deltaPacketsSent = 0;
19
- public deltaPacketsReceived = 0;
20
-
21
- public readonly observedPeerConnections = new Map<string, ObservedPeerConnection>();
22
-
23
- public updated = Date.now();
24
-
25
- public constructor(
26
- public readonly url: string,
27
- public readonly observedTURN: ObservedTURN,
28
- ) {
29
-
30
- }
31
-
32
- public updateTurnUsage(...selectedcandidatepairs: ObservedIceCandidatePair[]) {
33
- for (const selectedcandidatepair of selectedcandidatepairs) {
34
- this.deltaBytesReceived += selectedcandidatepair.deltaBytesReceived;
35
- this.deltaBytesSent += selectedcandidatepair.deltaBytesSent;
36
- this.deltaPacketsReceived += selectedcandidatepair.deltaPacketsReceived;
37
- this.deltaPacketsSent += selectedcandidatepair.deltaPacketsSent;
38
- }
39
- }
40
-
41
- public update() {
42
- const now = Date.now();
43
- const deltaInS = (now - this.updated) / 1000;
44
-
45
- this.packetsSentPerSecond = this.deltaPacketsSent / deltaInS;
46
- this.packetsReceivedPerSecond = this.deltaPacketsReceived / deltaInS;
47
- this.outboundBitrate = (this.deltaBytesReceived * 8) / deltaInS;
48
- this.inboundBitrate = (this.deltaBytesSent * 8) / deltaInS;
49
-
50
- this.totalBytesSent += this.deltaBytesSent;
51
- this.totalBytesReceived += this.deltaBytesReceived;
52
- this.totalPacketsSent += this.deltaPacketsSent;
53
- this.totalPacketsReceived += this.deltaPacketsReceived;
54
-
55
- this.observedTURN.totalBytesSent += this.deltaBytesSent;
56
- this.observedTURN.totalBytesReceived += this.deltaBytesReceived;
57
- this.observedTURN.totalPacketsSent += this.deltaPacketsSent;
58
- this.observedTURN.totalPacketsReceived += this.deltaPacketsReceived;
59
-
60
- this.observedTURN.inboundBitrate += this.inboundBitrate;
61
- this.observedTURN.outboundBitrate += this.outboundBitrate;
62
- this.observedTURN.packetsReceivedPerSecond += this.packetsReceivedPerSecond;
63
- this.observedTURN.packetsSentPerSecond += this.packetsSentPerSecond;
64
-
65
- this.deltaBytesSent = 0;
66
- this.deltaBytesReceived = 0;
67
- this.deltaPacketsSent = 0;
68
- this.deltaPacketsReceived = 0;
69
-
70
- this.updated = now;
71
- }
72
- }