@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.
@@ -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/ClientMetaTypes';
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
- addIssue(issue: ClientIssue): void;
71
- addExtensionStats(stats: ExtensionStat): void;
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":"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"}
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"}
@@ -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 ClientEventTypes_1 = require("./schema/ClientEventTypes");
8
- const ClientMetaTypes_1 = require("./schema/ClientMetaTypes");
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.addIssue.bind(this));
88
+ sample.clientIssues?.forEach(this.processIssue.bind(this));
89
89
  sample.peerConnections?.forEach(this._updatePeerConnection.bind(this));
90
- sample.extensionStats?.forEach(this.addExtensionStats.bind(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 ClientEventTypes_1.ClientEventTypes.CALL_STARTED: {
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 ClientEventTypes_1.ClientEventTypes.CALL_ENDED: {
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 ClientEventTypes_1.ClientEventTypes.CLIENT_JOINED: {
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 ClientEventTypes_1.ClientEventTypes.CLIENT_LEFT: {
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.emit('client-event', this, event);
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 ClientMetaTypes_1.ClientMetaTypes.BROWSER: {
146
+ case metaTypes_1.ClientMetaType.BROWSER: {
143
147
  this.browser = (0, utils_1.parseJsonAs)(metadata.payload);
144
148
  break;
145
149
  }
146
- case ClientMetaTypes_1.ClientMetaTypes.ENGINE: {
150
+ case metaTypes_1.ClientMetaType.ENGINE: {
147
151
  this.engine = (0, utils_1.parseJsonAs)(metadata.payload);
148
152
  break;
149
153
  }
150
- case ClientMetaTypes_1.ClientMetaTypes.PLATFORM: {
154
+ case metaTypes_1.ClientMetaType.PLATFORM: {
151
155
  this.platform = (0, utils_1.parseJsonAs)(metadata.payload);
152
156
  break;
153
157
  }
154
- case ClientMetaTypes_1.ClientMetaTypes.OPERATION_SYSTEM: {
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.emit('metadata-received', this, metadata);
163
+ this.call.observer.processors.metaData.process({
164
+ call: this.call,
165
+ client: this,
166
+ data: metadata,
167
+ });
160
168
  }
161
- addIssue(issue) {
162
- this.emit('issue', issue);
163
- this.call.observer.emit('issue-received', this, issue);
169
+ processIssue(issue) {
170
+ this.call.observer.processors.issues.process({
171
+ call: this.call,
172
+ client: this,
173
+ data: issue,
174
+ });
164
175
  }
165
- addExtensionStats(stats) {
166
- this.call.observer.emit('extension-stats-received', this, stats);
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
@@ -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,cAAc,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC9C,cAAc,EAAE,CAAC,YAAY,CAAC,CAAC;IAC/B,gBAAgB,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAChD,mBAAmB,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACtD,0BAA0B,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAC5D,SAAS,EAAE,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,EAAE,EAAE,CAAC;CACZ,CAAA;AAED,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC;CACR,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,QAAQ;IAChC,EAAE,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACnG,GAAG,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACpG,IAAI,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACrG,IAAI,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CACpF;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,qBAAa,QAAS,SAAQ,YAAY;IACzC,SAAgB,aAAa,qDAAmC;IACzD,MAAM,UAAS;;IAQf,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS;IAMzH,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpF,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,YAAY,CAAC,CAAC,CAAC;IAoBX,KAAK;CAUZ"}
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
@@ -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;AACpF,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,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 ClientEventTypes {
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=ClientEventTypes.d.ts.map
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 ClientMetaTypes {
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=ClientMetaTypes.d.ts.map
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@observertc/observer-js",
3
- "version": "1.0.1-620842f.0",
3
+ "version": "1.0.1-c3edea3.0",
4
4
  "description": "Server Side NodeJS Library for processing ObserveRTC Samples",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -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/ClientMetaTypes';
7
- import { ClientEventTypes } from './schema/ClientEventTypes';
6
+ import * as MetaData from './schema/metaTypes';
7
+ import { ClientEventType } from './schema/eventTypes';
8
8
  import { ObservedCall } from './ObservedCall';
9
- import { ClientMetaTypes } from './schema/ClientMetaTypes';
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.addIssue.bind(this));
135
+ sample.clientIssues?.forEach(this.processIssue.bind(this));
138
136
  sample.peerConnections?.forEach(this._updatePeerConnection.bind(this));
139
- sample.extensionStats?.forEach(this.addExtensionStats.bind(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 ClientEventTypes.CALL_STARTED: {
155
+ case ClientEventType.CALL_STARTED: {
158
156
  // update call timestamp if it's the first time
159
157
  break;
160
158
  }
161
- case ClientEventTypes.CALL_ENDED: {
159
+ case ClientEventType.CALL_ENDED: {
162
160
  // update call timestamp if it's the first time
163
161
  break;
164
162
  }
165
- case ClientEventTypes.CLIENT_JOINED: {
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 ClientEventTypes.CLIENT_LEFT: {
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.emit('client-event', this, event);
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 ClientMetaTypes.BROWSER: {
197
+ case ClientMetaType.BROWSER: {
196
198
  this.browser = parseJsonAs(metadata.payload);
197
199
  break;
198
200
  }
199
- case ClientMetaTypes.ENGINE: {
201
+ case ClientMetaType.ENGINE: {
200
202
  this.engine = parseJsonAs(metadata.payload);
201
203
  break;
202
204
  }
203
- case ClientMetaTypes.PLATFORM: {
205
+ case ClientMetaType.PLATFORM: {
204
206
  this.platform = parseJsonAs(metadata.payload);
205
207
  break;
206
208
  }
207
- case ClientMetaTypes.OPERATION_SYSTEM: {
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.emit('metadata-received', this, metadata);
215
+ this.call.observer.processors.metaData.process({
216
+ call: this.call,
217
+ client: this,
218
+ data: metadata,
219
+ });
214
220
  }
215
221
 
216
- public addIssue(issue: ClientIssue) {
217
- this.emit('issue', issue);
218
- this.call.observer.emit('issue-received', this, issue);
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 addExtensionStats(stats: ExtensionStat) {
222
- this.call.observer.emit('extension-stats-received', this, stats);
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,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 +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 = {}));