@observertc/observer-js 1.0.1-c3edea3.0 → 1.0.1-f31d7a4.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 (48) hide show
  1. package/lib/ObservedCall.d.ts +13 -0
  2. package/lib/ObservedCall.d.ts.map +1 -1
  3. package/lib/ObservedCall.js +37 -1
  4. package/lib/ObservedClient.d.ts +39 -7
  5. package/lib/ObservedClient.d.ts.map +1 -1
  6. package/lib/ObservedClient.js +110 -58
  7. package/lib/ObservedDataChannel.d.ts +4 -0
  8. package/lib/ObservedDataChannel.d.ts.map +1 -1
  9. package/lib/ObservedDataChannel.js +28 -0
  10. package/lib/ObservedIceCandidatePair.d.ts +4 -0
  11. package/lib/ObservedIceCandidatePair.d.ts.map +1 -1
  12. package/lib/ObservedIceCandidatePair.js +28 -0
  13. package/lib/ObservedPeerConnection.d.ts +10 -0
  14. package/lib/ObservedPeerConnection.d.ts.map +1 -1
  15. package/lib/ObservedPeerConnection.js +79 -9
  16. package/lib/ObservedTURN.d.ts +30 -0
  17. package/lib/ObservedTURN.d.ts.map +1 -0
  18. package/lib/ObservedTURN.js +54 -0
  19. package/lib/ObservedTurnServer.d.ts +25 -0
  20. package/lib/ObservedTurnServer.d.ts.map +1 -0
  21. package/lib/ObservedTurnServer.js +59 -0
  22. package/lib/Observer.d.ts +27 -21
  23. package/lib/Observer.d.ts.map +1 -1
  24. package/lib/Observer.js +59 -40
  25. package/lib/index.d.ts +4 -0
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/schema/{eventTypes.d.ts → ClientEventTypes.d.ts} +2 -2
  28. package/lib/schema/ClientEventTypes.d.ts.map +1 -0
  29. package/lib/schema/ClientEventTypes.js +38 -0
  30. package/lib/schema/{metaTypes.d.ts → ClientMetaTypes.d.ts} +2 -2
  31. package/lib/schema/ClientMetaTypes.d.ts.map +1 -0
  32. package/lib/schema/ClientMetaTypes.js +16 -0
  33. package/package.json +1 -1
  34. package/src/ObservedCall.ts +44 -1
  35. package/src/ObservedClient.ts +125 -60
  36. package/src/ObservedDataChannel.ts +29 -0
  37. package/src/ObservedIceCandidatePair.ts +26 -0
  38. package/src/ObservedPeerConnection.ts +90 -10
  39. package/src/ObservedTURN.ts +80 -0
  40. package/src/ObservedTurnServer.ts +72 -0
  41. package/src/Observer.ts +81 -68
  42. package/src/index.ts +4 -0
  43. package/src/schema/{eventTypes.ts → ClientEventTypes.ts} +1 -1
  44. package/src/schema/{metaTypes.ts → ClientMetaTypes.ts} +1 -1
  45. package/lib/schema/eventTypes.d.ts.map +0 -1
  46. package/lib/schema/eventTypes.js +0 -38
  47. package/lib/schema/metaTypes.d.ts.map +0 -1
  48. package/lib/schema/metaTypes.js +0 -16
@@ -34,16 +34,29 @@ export declare class ObservedCall<AppData extends Record<string, unknown> = Reco
34
34
  readonly calculatedScore: CalculatedScore;
35
35
  remoteTrackResolver?: RemoteTrackResolver;
36
36
  callUpdater?: CallUpdater;
37
+ totalAudioBytesSent: number;
38
+ totalAudioBytesReceived: number;
39
+ totalVideoBytesSent: number;
40
+ totalVideoBytesReceived: number;
41
+ totalDataChannelBytesSent: number;
42
+ totalDataChannelBytesReceived: number;
43
+ numberOfPeerConnections: number;
44
+ numberOfInboundRtpStreams: number;
45
+ numberOfOutboundRtpStreams: number;
46
+ numberOfDataChannels: number;
47
+ maxNumberOfClients: number;
37
48
  appData?: AppData;
38
49
  closed: boolean;
39
50
  started?: number;
40
51
  ended?: number;
41
52
  scoreCalculator: ScoreCalculator;
42
53
  constructor(settings: ObservedCallSettings<AppData>, observer: Observer);
54
+ get numberOfClients(): number;
43
55
  get score(): number | undefined;
44
56
  close(): void;
45
57
  getObservedClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(clientId: string): ObservedClient<ClientAppData> | undefined;
46
58
  createObservedClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(settings: ObservedClientSettings<ClientAppData>): ObservedClient<ClientAppData>;
47
59
  update(): void;
60
+ private _onClientUpdate;
48
61
  }
49
62
  //# sourceMappingURL=ObservedCall.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedCall.d.ts","sourceRoot":"","sources":["../src/ObservedCall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObservedCall.d.ts","sourceRoot":"","sources":["../src/ObservedCall.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,17 @@ class ObservedCall extends events_1.EventEmitter {
18
18
  };
19
19
  remoteTrackResolver;
20
20
  callUpdater;
21
+ totalAudioBytesSent = 0;
22
+ totalAudioBytesReceived = 0;
23
+ totalVideoBytesSent = 0;
24
+ totalVideoBytesReceived = 0;
25
+ totalDataChannelBytesSent = 0;
26
+ totalDataChannelBytesReceived = 0;
27
+ numberOfPeerConnections = 0;
28
+ numberOfInboundRtpStreams = 0;
29
+ numberOfOutboundRtpStreams = 0;
30
+ numberOfDataChannels = 0;
31
+ maxNumberOfClients = 0;
21
32
  appData;
22
33
  closed = false;
23
34
  started;
@@ -44,6 +55,9 @@ class ObservedCall extends events_1.EventEmitter {
44
55
  break;
45
56
  }
46
57
  }
58
+ get numberOfClients() {
59
+ return this.observedClients.size;
60
+ }
47
61
  get score() {
48
62
  return this.calculatedScore.value;
49
63
  }
@@ -66,7 +80,7 @@ class ObservedCall extends events_1.EventEmitter {
66
80
  throw new Error(`Client with id ${settings.clientId} already exists`);
67
81
  const result = new ObservedClient_1.ObservedClient(settings, this);
68
82
  const wasEmpty = this.observedClients.size === 0;
69
- const onUpdate = () => this.callUpdater?.onClientUpdate(result);
83
+ const onUpdate = () => this._onClientUpdate(result);
70
84
  result.once('close', () => {
71
85
  result.off('update', onUpdate);
72
86
  this.observedClients.delete(settings.clientId);
@@ -76,6 +90,7 @@ class ObservedCall extends events_1.EventEmitter {
76
90
  });
77
91
  result.on('update', onUpdate);
78
92
  this.observedClients.set(settings.clientId, result);
93
+ this.maxNumberOfClients = Math.max(this.maxNumberOfClients, this.observedClients.size);
79
94
  this.emit('newclient', result);
80
95
  if (wasEmpty) {
81
96
  this.emit('not-empty');
@@ -83,9 +98,30 @@ class ObservedCall extends events_1.EventEmitter {
83
98
  return result;
84
99
  }
85
100
  update() {
101
+ if (this.closed)
102
+ return;
103
+ this.numberOfInboundRtpStreams = 0;
104
+ this.numberOfOutboundRtpStreams = 0;
105
+ this.numberOfPeerConnections = 0;
106
+ this.numberOfDataChannels = 0;
107
+ for (const client of this.observedClients.values()) {
108
+ this.numberOfInboundRtpStreams += client.numberOfInboundRtpStreams;
109
+ this.numberOfOutboundRtpStreams += client.numberOfOutboundRtpStreams;
110
+ this.numberOfPeerConnections += client.numberOfPeerConnections;
111
+ this.numberOfDataChannels += client.numberOfDataChannels;
112
+ }
86
113
  this.detectors.update();
87
114
  this.scoreCalculator.update();
88
115
  this.emit('update');
89
116
  }
117
+ _onClientUpdate(client) {
118
+ this.callUpdater?.onClientUpdate(client);
119
+ this.totalAudioBytesReceived = client.deltaReceivedAudioBytes;
120
+ this.totalAudioBytesSent = client.deltaSentAudioBytes;
121
+ this.totalVideoBytesReceived = client.deltaReceivedVideoBytes;
122
+ this.totalVideoBytesSent = client.deltaSentVideoBytes;
123
+ this.totalDataChannelBytesReceived = client.deltaDataChannelBytesReceived;
124
+ this.totalDataChannelBytesSent = client.deltaDataChannelBytesSent;
125
+ }
90
126
  }
91
127
  exports.ObservedCall = ObservedCall;
@@ -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/metaTypes';
5
+ import * as MetaData from './schema/ClientMetaTypes';
6
6
  import { ObservedCall } from './ObservedCall';
7
7
  import { CalculatedScore } from './scores/CalculatedScore';
8
8
  import { Detectors } from './detectors/Detectors';
@@ -19,6 +19,8 @@ export type ObservedClientEvents = {
19
19
  ];
20
20
  close: [];
21
21
  joined: [];
22
+ issue: [ClientIssue];
23
+ metaData: [ClientMetaData];
22
24
  rejoined: [timestamp: number];
23
25
  left: [];
24
26
  usingturn: [boolean];
@@ -52,21 +54,51 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
52
54
  usingTURN: boolean;
53
55
  availableOutgoingBitrate: number;
54
56
  availableIncomingBitrate: number;
57
+ totalInboundPacketsLost: number;
58
+ totalInboundPacketsReceived: number;
59
+ totalOutboundPacketsSent: number;
60
+ totalDataChannelBytesSent: number;
61
+ totalDataChannelBytesReceived: number;
62
+ totalDataChannelMessagesSent: number;
63
+ totalDataChannelMessagesReceived: number;
64
+ totalSentBytes: number;
65
+ totalReceivedBytes: number;
66
+ totalReceivedAudioBytes: number;
67
+ totalReceivedVideoBytes: number;
68
+ totalSentAudioBytes: number;
69
+ totalSentVideoBytes: number;
70
+ deltaReceivedAudioBytes: number;
71
+ deltaReceivedVideoBytes: number;
72
+ deltaSentAudioBytes: number;
73
+ deltaSentVideoBytes: number;
74
+ deltaDataChannelBytesSent: number;
75
+ deltaDataChannelBytesReceived: number;
76
+ deltaDataChannelMessagesSent: number;
77
+ deltaDataChannelMessagesReceived: number;
78
+ deltaInboundPacketsLost: number;
79
+ deltaInboundPacketsReceived: number;
80
+ deltaOutboundPacketsSent: number;
55
81
  avgRttInMs?: number;
56
- outboundAudioBitrate?: number;
57
- outboundVideoBitrate?: number;
58
- inboundAudioBitrate?: number;
59
- inboundVideoBitrate?: number;
82
+ sendingAudioBitrate: number;
83
+ sendingVideoBitrate: number;
84
+ receivingAudioBitrate: number;
85
+ receivingVideoBitrate: number;
86
+ numberOfInboundRtpStreams: number;
87
+ numberOfInbundTracks: number;
88
+ numberOfOutboundRtpStreams: number;
89
+ numberOfOutboundTracks: number;
90
+ numberOfDataChannels: number;
60
91
  readonly mediaDevices: MetaData.MediaDeviceInfo[];
61
92
  issues: ClientIssue[];
62
93
  constructor(settings: ObservedClientSettings<AppData>, call: ObservedCall);
94
+ get numberOfPeerConnections(): number;
63
95
  get score(): number | undefined;
64
96
  close(): void;
65
97
  accept(sample: ClientSample): void;
66
98
  private _processClientEvent;
67
99
  processMetadata(metadata: ClientMetaData): void;
68
- processIssue(issue: ClientIssue): void;
69
- processExtensionStats(stats: ExtensionStat): void;
100
+ addIssue(issue: ClientIssue): void;
101
+ addExtensionStats(stats: ExtensionStat): void;
70
102
  private _updatePeerConnection;
71
103
  }
72
104
  //# 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":"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"}
@@ -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 eventTypes_1 = require("./schema/eventTypes");
8
- const metaTypes_1 = require("./schema/metaTypes");
7
+ const ClientEventTypes_1 = require("./schema/ClientEventTypes");
8
+ const ClientMetaTypes_1 = require("./schema/ClientMetaTypes");
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');
@@ -34,31 +34,40 @@ class ObservedClient extends events_1.EventEmitter {
34
34
  usingTURN = false;
35
35
  availableOutgoingBitrate = 0;
36
36
  availableIncomingBitrate = 0;
37
- // public totalInboundPacketsLost = 0;
38
- // public totalInboundPacketsReceived = 0;
39
- // public totalOutboundPacketsSent = 0;
40
- // public totalDataChannelBytesSent = 0;
41
- // public totalDataChannelBytesReceived = 0;
42
- // public totalSentBytes = 0;
43
- // public totalReceivedBytes = 0;
44
- // public totalReceivedAudioBytes = 0;
45
- // public totalReceivedVideoBytes = 0;
46
- // public totalSentAudioBytes = 0;
47
- // public totalSentVideoBytes = 0;
48
- // public deltaReceivedAudioBytes = 0;
49
- // public deltaReceivedVideoBytes = 0;
50
- // public deltaSentAudioBytes = 0;
51
- // public deltaSentVideoBytes = 0;
52
- // public deltaDataChannelBytesSent = 0;
53
- // public deltaDataChannelBytesReceived = 0;
54
- // public deltaInboundPacketsLost = 0;
55
- // public deltaInboundPacketsReceived = 0;
56
- // public deltaOutboundPacketsSent = 0;
37
+ totalInboundPacketsLost = 0;
38
+ totalInboundPacketsReceived = 0;
39
+ totalOutboundPacketsSent = 0;
40
+ totalDataChannelBytesSent = 0;
41
+ totalDataChannelBytesReceived = 0;
42
+ totalDataChannelMessagesSent = 0;
43
+ totalDataChannelMessagesReceived = 0;
44
+ totalSentBytes = 0;
45
+ totalReceivedBytes = 0;
46
+ totalReceivedAudioBytes = 0;
47
+ totalReceivedVideoBytes = 0;
48
+ totalSentAudioBytes = 0;
49
+ totalSentVideoBytes = 0;
50
+ deltaReceivedAudioBytes = 0;
51
+ deltaReceivedVideoBytes = 0;
52
+ deltaSentAudioBytes = 0;
53
+ deltaSentVideoBytes = 0;
54
+ deltaDataChannelBytesSent = 0;
55
+ deltaDataChannelBytesReceived = 0;
56
+ deltaDataChannelMessagesSent = 0;
57
+ deltaDataChannelMessagesReceived = 0;
58
+ deltaInboundPacketsLost = 0;
59
+ deltaInboundPacketsReceived = 0;
60
+ deltaOutboundPacketsSent = 0;
57
61
  avgRttInMs;
58
- outboundAudioBitrate;
59
- outboundVideoBitrate;
60
- inboundAudioBitrate;
61
- inboundVideoBitrate;
62
+ sendingAudioBitrate = 0;
63
+ sendingVideoBitrate = 0;
64
+ receivingAudioBitrate = 0;
65
+ receivingVideoBitrate = 0;
66
+ numberOfInboundRtpStreams = 0;
67
+ numberOfInbundTracks = 0;
68
+ numberOfOutboundRtpStreams = 0;
69
+ numberOfOutboundTracks = 0;
70
+ numberOfDataChannels = 0;
62
71
  mediaDevices = [];
63
72
  issues = [];
64
73
  constructor(settings, call) {
@@ -69,6 +78,9 @@ class ObservedClient extends events_1.EventEmitter {
69
78
  this.appData = settings.appData;
70
79
  this.detectors = new Detectors_1.Detectors();
71
80
  }
81
+ get numberOfPeerConnections() {
82
+ return this.observedPeerConnections.size;
83
+ }
72
84
  get score() {
73
85
  return this.calculatedScore.value;
74
86
  }
@@ -83,13 +95,49 @@ class ObservedClient extends events_1.EventEmitter {
83
95
  if (this.closed)
84
96
  throw new Error(`Client ${this.clientId} is closed`);
85
97
  const now = Date.now();
98
+ const elapsedInMs = now - this.updated;
99
+ const elapsedInSeconds = elapsedInMs / 1000;
100
+ ++this.acceptedSamples;
101
+ this.availableIncomingBitrate = 0;
102
+ this.availableOutgoingBitrate = 0;
103
+ this.deltaDataChannelBytesReceived = 0;
104
+ this.deltaDataChannelBytesSent = 0;
105
+ this.deltaDataChannelMessagesReceived = 0;
106
+ this.deltaDataChannelMessagesSent = 0;
107
+ this.deltaInboundPacketsLost = 0;
108
+ this.deltaInboundPacketsReceived = 0;
109
+ this.deltaOutboundPacketsSent = 0;
110
+ this.deltaReceivedAudioBytes = 0;
111
+ this.deltaReceivedVideoBytes = 0;
112
+ this.deltaSentAudioBytes = 0;
113
+ this.deltaSentVideoBytes = 0;
114
+ this.numberOfDataChannels = 0;
115
+ this.numberOfInboundRtpStreams = 0;
116
+ this.numberOfInbundTracks = 0;
117
+ this.numberOfOutboundRtpStreams = 0;
118
+ this.numberOfOutboundTracks = 0;
86
119
  sample.clientEvents?.forEach(this._processClientEvent.bind(this));
87
120
  sample.clientMetaItems?.forEach(this.processMetadata.bind(this));
88
- sample.clientIssues?.forEach(this.processIssue.bind(this));
121
+ sample.clientIssues?.forEach(this.addIssue.bind(this));
89
122
  sample.peerConnections?.forEach(this._updatePeerConnection.bind(this));
90
- sample.extensionStats?.forEach(this.processExtensionStats.bind(this));
123
+ sample.extensionStats?.forEach(this.addExtensionStats.bind(this));
91
124
  // emit new attachments?
92
125
  this.attachments = sample.attachments;
126
+ this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
127
+ this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
128
+ this.totalDataChannelMessagesReceived += this.deltaDataChannelMessagesReceived;
129
+ this.totalDataChannelMessagesSent += this.deltaDataChannelMessagesSent;
130
+ this.totalInboundPacketsLost += this.deltaInboundPacketsLost;
131
+ this.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;
132
+ this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
133
+ this.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;
134
+ this.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;
135
+ this.totalSentAudioBytes += this.deltaSentAudioBytes;
136
+ this.totalSentVideoBytes += this.deltaSentVideoBytes;
137
+ this.receivingAudioBitrate = (this.deltaReceivedAudioBytes * 8) / (elapsedInSeconds);
138
+ this.receivingVideoBitrate = (this.totalReceivedVideoBytes * 8) / (elapsedInSeconds);
139
+ this.sendingAudioBitrate = (this.deltaSentAudioBytes * 8) / (elapsedInSeconds);
140
+ this.sendingVideoBitrate = (this.deltaSentVideoBytes * 8) / (elapsedInSeconds);
93
141
  this.calculatedScore.value = sample.score;
94
142
  this.detectors.update();
95
143
  // emit update
@@ -101,15 +149,15 @@ class ObservedClient extends events_1.EventEmitter {
101
149
  }
102
150
  _processClientEvent(event) {
103
151
  switch (event.type) {
104
- case eventTypes_1.ClientEventType.CALL_STARTED: {
152
+ case ClientEventTypes_1.ClientEventTypes.CALL_STARTED: {
105
153
  // update call timestamp if it's the first time
106
154
  break;
107
155
  }
108
- case eventTypes_1.ClientEventType.CALL_ENDED: {
156
+ case ClientEventTypes_1.ClientEventTypes.CALL_ENDED: {
109
157
  // update call timestamp if it's the first time
110
158
  break;
111
159
  }
112
- case eventTypes_1.ClientEventType.CLIENT_JOINED: {
160
+ case ClientEventTypes_1.ClientEventTypes.CLIENT_JOINED: {
113
161
  if (event.timestamp) {
114
162
  if (!this.joinedAt) {
115
163
  this.joinedAt = event.timestamp;
@@ -125,7 +173,7 @@ class ObservedClient extends events_1.EventEmitter {
125
173
  }
126
174
  break;
127
175
  }
128
- case eventTypes_1.ClientEventType.CLIENT_LEFT: {
176
+ case ClientEventTypes_1.ClientEventTypes.CLIENT_LEFT: {
129
177
  if (event.timestamp) {
130
178
  if (!this.leftAt) {
131
179
  this.leftAt = event.timestamp;
@@ -135,50 +183,35 @@ class ObservedClient extends events_1.EventEmitter {
135
183
  break;
136
184
  }
137
185
  }
138
- this.call.observer.processors.events.process({
139
- call: this.call,
140
- client: this,
141
- data: event,
142
- });
186
+ this.call.observer.emit('client-event', this, event);
143
187
  }
144
188
  processMetadata(metadata) {
145
189
  switch (metadata.type) {
146
- case metaTypes_1.ClientMetaType.BROWSER: {
190
+ case ClientMetaTypes_1.ClientMetaTypes.BROWSER: {
147
191
  this.browser = (0, utils_1.parseJsonAs)(metadata.payload);
148
192
  break;
149
193
  }
150
- case metaTypes_1.ClientMetaType.ENGINE: {
194
+ case ClientMetaTypes_1.ClientMetaTypes.ENGINE: {
151
195
  this.engine = (0, utils_1.parseJsonAs)(metadata.payload);
152
196
  break;
153
197
  }
154
- case metaTypes_1.ClientMetaType.PLATFORM: {
198
+ case ClientMetaTypes_1.ClientMetaTypes.PLATFORM: {
155
199
  this.platform = (0, utils_1.parseJsonAs)(metadata.payload);
156
200
  break;
157
201
  }
158
- case metaTypes_1.ClientMetaType.OPERATION_SYSTEM: {
202
+ case ClientMetaTypes_1.ClientMetaTypes.OPERATION_SYSTEM: {
159
203
  this.operationSystem = (0, utils_1.parseJsonAs)(metadata.payload);
160
204
  break;
161
205
  }
162
206
  }
163
- this.call.observer.processors.metaData.process({
164
- call: this.call,
165
- client: this,
166
- data: metadata,
167
- });
207
+ this.call.observer.emit('client-metadata', this, metadata);
168
208
  }
169
- processIssue(issue) {
170
- this.call.observer.processors.issues.process({
171
- call: this.call,
172
- client: this,
173
- data: issue,
174
- });
209
+ addIssue(issue) {
210
+ this.emit('issue', issue);
211
+ this.call.observer.emit('client-issue', this, issue);
175
212
  }
176
- processExtensionStats(stats) {
177
- this.call.observer.processors.extensionStats.process({
178
- call: this.call,
179
- client: this,
180
- data: stats,
181
- });
213
+ addExtensionStats(stats) {
214
+ this.call.observer.emit('client-extension-stats', this, stats);
182
215
  }
183
216
  _updatePeerConnection(sample) {
184
217
  let observedPeerConnection = this.observedPeerConnections.get(sample.peerConnectionId);
@@ -191,8 +224,27 @@ class ObservedClient extends events_1.EventEmitter {
191
224
  this.observedPeerConnections.delete(sample.peerConnectionId);
192
225
  });
193
226
  this.observedPeerConnections.set(sample.peerConnectionId, observedPeerConnection);
227
+ this.emit('newpeerconnection', observedPeerConnection);
194
228
  }
195
229
  observedPeerConnection.accept(sample);
230
+ this.deltaDataChannelBytesReceived += observedPeerConnection.deltaDataChannelBytesReceived;
231
+ this.deltaDataChannelBytesSent += observedPeerConnection.deltaDataChannelBytesSent;
232
+ this.deltaDataChannelMessagesReceived += observedPeerConnection.deltaDataChannelMessagesReceived;
233
+ this.deltaDataChannelMessagesSent += observedPeerConnection.deltaDataChannelMessagesSent;
234
+ this.deltaInboundPacketsLost += observedPeerConnection.deltaInboundPacketsLost;
235
+ this.deltaInboundPacketsReceived += observedPeerConnection.deltaInboundPacketsReceived;
236
+ this.deltaOutboundPacketsSent += observedPeerConnection.deltaOutboundPacketsSent;
237
+ this.deltaReceivedAudioBytes += observedPeerConnection.deltaReceivedAudioBytes;
238
+ this.deltaReceivedVideoBytes += observedPeerConnection.deltaReceivedVideoBytes;
239
+ this.deltaSentAudioBytes += observedPeerConnection.deltaSentAudioBytes;
240
+ this.deltaSentVideoBytes += observedPeerConnection.deltaSentVideoBytes;
241
+ this.availableIncomingBitrate += observedPeerConnection.availableIncomingBitrate;
242
+ this.availableOutgoingBitrate += observedPeerConnection.availableOutgoingBitrate;
243
+ this.numberOfDataChannels += observedPeerConnection.observedDataChannels.size;
244
+ this.numberOfInbundTracks += observedPeerConnection.observedInboundTracks.size;
245
+ this.numberOfOutboundRtpStreams += observedPeerConnection.observedOutboundRtps.size;
246
+ this.numberOfOutboundTracks += observedPeerConnection.observedOutboundTracks.size;
247
+ this.numberOfInboundRtpStreams += observedPeerConnection.observedInboundRtps.size;
196
248
  }
197
249
  }
198
250
  exports.ObservedClient = ObservedClient;
@@ -15,6 +15,10 @@ export declare class ObservedDataChannel implements DataChannelStats {
15
15
  messagesReceived?: number | undefined;
16
16
  bytesReceived?: number | undefined;
17
17
  attachments?: Record<string, unknown> | undefined;
18
+ deltaBytesSent: number;
19
+ deltaBytesReceived: number;
20
+ deltaMessagesSent: number;
21
+ deltaMessagesReceived: number;
18
22
  appData?: Record<string, unknown>;
19
23
  constructor(timestamp: number, id: string, _peerConnection: ObservedPeerConnection);
20
24
  get visited(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedDataChannel.d.ts","sourceRoot":"","sources":["../src/ObservedDataChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpF,qBAAa,mBAAoB,YAAW,gBAAgB;IAgBnD,SAAS,EAAE,MAAM;IACjB,EAAE,EAAE,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAjBjC,OAAO,CAAC,QAAQ,CAAS;IAEzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAE3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACA,eAAe,EAAE,sBAAsB;IAIzD,IAAW,OAAO,YAMjB;IAEM,iBAAiB;IAIjB,MAAM,CAAC,KAAK,EAAE,gBAAgB;CAarC"}
1
+ {"version":3,"file":"ObservedDataChannel.d.ts","sourceRoot":"","sources":["../src/ObservedDataChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpF,qBAAa,mBAAoB,YAAW,gBAAgB;IAqBnD,SAAS,EAAE,MAAM;IACjB,EAAE,EAAE,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAtBjC,OAAO,CAAC,QAAQ,CAAS;IAEzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAE3C,cAAc,SAAK;IACnB,kBAAkB,SAAK;IACvB,iBAAiB,SAAK;IACtB,qBAAqB,SAAK;IAE1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACA,eAAe,EAAE,sBAAsB;IAIzD,IAAW,OAAO,YAMjB;IAEM,iBAAiB;IAIjB,MAAM,CAAC,KAAK,EAAE,gBAAgB;CAqCrC"}
@@ -15,6 +15,10 @@ class ObservedDataChannel {
15
15
  messagesReceived;
16
16
  bytesReceived;
17
17
  attachments;
18
+ deltaBytesSent = 0;
19
+ deltaBytesReceived = 0;
20
+ deltaMessagesSent = 0;
21
+ deltaMessagesReceived = 0;
18
22
  appData;
19
23
  constructor(timestamp, id, _peerConnection) {
20
24
  this.timestamp = timestamp;
@@ -31,6 +35,30 @@ class ObservedDataChannel {
31
35
  }
32
36
  update(stats) {
33
37
  this._visited = true;
38
+ if (this.messagesSent && stats.messagesSent && stats.messagesSent >= this.messagesSent) {
39
+ this.deltaMessagesSent = stats.messagesSent - this.messagesSent;
40
+ }
41
+ else {
42
+ this.deltaMessagesSent = 0;
43
+ }
44
+ if (this.messagesReceived && stats.messagesReceived && stats.messagesReceived >= this.messagesReceived) {
45
+ this.deltaMessagesReceived = stats.messagesReceived - this.messagesReceived;
46
+ }
47
+ else {
48
+ this.deltaMessagesReceived = 0;
49
+ }
50
+ if (this.bytesSent && stats.bytesSent && stats.bytesSent >= this.bytesSent) {
51
+ this.deltaBytesSent = stats.bytesSent - this.bytesSent;
52
+ }
53
+ else {
54
+ this.deltaBytesSent = 0;
55
+ }
56
+ if (this.bytesReceived && stats.bytesReceived && stats.bytesReceived >= this.bytesReceived) {
57
+ this.deltaBytesReceived = stats.bytesReceived - this.bytesReceived;
58
+ }
59
+ else {
60
+ this.deltaBytesReceived = 0;
61
+ }
34
62
  this.label = stats.label;
35
63
  this.protocol = stats.protocol;
36
64
  this.dataChannelIdentifier = stats.dataChannelIdentifier;
@@ -29,6 +29,10 @@ export declare class ObservedIceCandidatePair implements IceCandidatePairStats {
29
29
  packetsDiscardedOnSend?: number | undefined;
30
30
  bytesDiscardedOnSend?: number | undefined;
31
31
  attachments?: Record<string, unknown> | undefined;
32
+ deltaBytesSent: number;
33
+ deltaBytesReceived: number;
34
+ deltaPacketsSent: number;
35
+ deltaPacketsReceived: number;
32
36
  constructor(timestamp: number, id: string, _peerConnection: ObservedPeerConnection);
33
37
  get visited(): boolean;
34
38
  getPeerConnection(): ObservedPeerConnection;
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedIceCandidatePair.d.ts","sourceRoot":"","sources":["../src/ObservedIceCandidatePair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,qBAAa,wBAAyB,YAAW,qBAAqB;IA6B7D,SAAS,EAAE,MAAM;IACjB,EAAE,EAAE,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,eAAe;IA9BjC,OAAO,CAAC,QAAQ,CAAS;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEzC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,KAAK,CAAC,EAAE,KAAK,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAClE,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,2BAA2B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;gBAG1C,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACA,eAAe,EAAE,sBAAsB;IAIzD,IAAW,OAAO,YAMjB;IAEM,iBAAiB;IAIjB,eAAe;IAIf,iBAAiB;IAIjB,kBAAkB;IAIlB,MAAM,CAAC,KAAK,EAAE,qBAAqB;CA6B1C"}
1
+ {"version":3,"file":"ObservedIceCandidatePair.d.ts","sourceRoot":"","sources":["../src/ObservedIceCandidatePair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,qBAAa,wBAAyB,YAAW,qBAAqB;IAkC7D,SAAS,EAAE,MAAM;IACjB,EAAE,EAAE,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAnCjC,OAAO,CAAC,QAAQ,CAAS;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEzC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,KAAK,CAAC,EAAE,KAAK,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAClE,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,2BAA2B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAE3C,cAAc,SAAK;IACnB,kBAAkB,SAAK;IACvB,gBAAgB,SAAK;IACrB,oBAAoB,SAAK;gBAGxB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACA,eAAe,EAAE,sBAAsB;IAIzD,IAAW,OAAO,YAMjB;IAEM,iBAAiB;IAIjB,eAAe;IAIf,iBAAiB;IAIjB,kBAAkB;IAIlB,MAAM,CAAC,KAAK,EAAE,qBAAqB;CAkD1C"}
@@ -30,6 +30,10 @@ class ObservedIceCandidatePair {
30
30
  packetsDiscardedOnSend;
31
31
  bytesDiscardedOnSend;
32
32
  attachments;
33
+ deltaBytesSent = 0;
34
+ deltaBytesReceived = 0;
35
+ deltaPacketsSent = 0;
36
+ deltaPacketsReceived = 0;
33
37
  constructor(timestamp, id, _peerConnection) {
34
38
  this.timestamp = timestamp;
35
39
  this.id = id;
@@ -54,6 +58,30 @@ class ObservedIceCandidatePair {
54
58
  }
55
59
  update(stats) {
56
60
  this._visited = true;
61
+ if (this.packetsSent && stats.packetsSent && stats.packetsSent >= this.packetsSent) {
62
+ this.deltaPacketsSent = stats.packetsSent - this.packetsSent;
63
+ }
64
+ else {
65
+ this.deltaPacketsSent = 0;
66
+ }
67
+ if (this.packetsReceived && stats.packetsReceived && stats.packetsReceived >= this.packetsReceived) {
68
+ this.deltaPacketsReceived = stats.packetsReceived - this.packetsReceived;
69
+ }
70
+ else {
71
+ this.deltaPacketsReceived = 0;
72
+ }
73
+ if (this.bytesSent && stats.bytesSent && stats.bytesSent >= this.bytesSent) {
74
+ this.deltaBytesSent = stats.bytesSent - this.bytesSent;
75
+ }
76
+ else {
77
+ this.deltaBytesSent = 0;
78
+ }
79
+ if (this.bytesReceived && stats.bytesReceived && stats.bytesReceived >= this.bytesReceived) {
80
+ this.deltaBytesReceived = stats.bytesReceived - this.bytesReceived;
81
+ }
82
+ else {
83
+ this.deltaBytesReceived = 0;
84
+ }
57
85
  this.timestamp = stats.timestamp;
58
86
  this.transportId = stats.transportId;
59
87
  this.localCandidateId = stats.localCandidateId;
@@ -18,6 +18,7 @@ import { ObservedRemoteOutboundRtp } from './ObservedRemoteOutboundRtp';
18
18
  import { ObservedInboundTrack } from './ObservedInboundTrack';
19
19
  import { ObservedOutboundTrack } from './ObservedOutboundTrack';
20
20
  import { CalculatedScore } from './scores/CalculatedScore';
21
+ import { ObservedTurnServer } from './ObservedTurnServer';
21
22
  export type ObservedPeerConnectionEvents = {
22
23
  iceconnectionstatechange: [
23
24
  {
@@ -65,6 +66,7 @@ export type ObservedPeerConnectionEvents = {
65
66
  'removed-peer-connection-transport': [ObservedPeerConnectionTransport];
66
67
  'removed-remote-inbound-rtp': [ObservedRemoteInboundRtp];
67
68
  'removed-remote-outbound-rtp': [ObservedRemoteOutboundRtp];
69
+ 'update': [];
68
70
  close: [];
69
71
  };
70
72
  export declare interface ObservedPeerConnection {
@@ -83,11 +85,15 @@ export declare class ObservedPeerConnection extends EventEmitter {
83
85
  openedAt?: number;
84
86
  closedAt?: number;
85
87
  updated: number;
88
+ availableIncomingBitrate: number;
89
+ availableOutgoingBitrate: number;
86
90
  totalInboundPacketsLost: number;
87
91
  totalInboundPacketsReceived: number;
88
92
  totalOutboundPacketsSent: number;
89
93
  totalDataChannelBytesSent: number;
90
94
  totalDataChannelBytesReceived: number;
95
+ totalDataChannelMessagesSent: number;
96
+ totalDataChannelMessagesReceived: number;
91
97
  totalSentAudioBytes: number;
92
98
  totalSentVideoBytes: number;
93
99
  totalSentAudioPackets: number;
@@ -101,6 +107,8 @@ export declare class ObservedPeerConnection extends EventEmitter {
101
107
  deltaOutboundPacketsSent: number;
102
108
  deltaDataChannelBytesSent: number;
103
109
  deltaDataChannelBytesReceived: number;
110
+ deltaDataChannelMessagesSent: number;
111
+ deltaDataChannelMessagesReceived: number;
104
112
  deltaInboundReceivedBytes: number;
105
113
  deltaOutboundSentBytes: number;
106
114
  deltaReceivedAudioBytes: number;
@@ -119,6 +127,7 @@ export declare class ObservedPeerConnection extends EventEmitter {
119
127
  avgJitter?: number;
120
128
  usingTCP: boolean;
121
129
  usingTURN: boolean;
130
+ observedTurnServer?: ObservedTurnServer;
122
131
  readonly observedCertificates: Map<string, ObservedCertificate>;
123
132
  readonly observedCodecs: Map<string, ObservedCodec>;
124
133
  readonly observedDataChannels: Map<string, ObservedDataChannel>;
@@ -151,6 +160,7 @@ export declare class ObservedPeerConnection extends EventEmitter {
151
160
  get iceCandidatePairs(): ObservedIceCandidatePair[];
152
161
  get certificates(): ObservedCertificate[];
153
162
  get selectedIceCandidatePairs(): ObservedIceCandidatePair[];
163
+ get selectedIceCandiadtePairForTurn(): ObservedIceCandidatePair[];
154
164
  close(): void;
155
165
  accept(sample: PeerConnectionSample): void;
156
166
  private _checkVisited;