@webex/plugin-meetings 3.8.0-next.58 → 3.8.0-next.59

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.
@@ -956,91 +956,6 @@ export declare const NETWORK_STATUS: {
956
956
  readonly CONNECTED: "CONNECTED";
957
957
  };
958
958
  export type NETWORK_STATUS = Enum<typeof NETWORK_STATUS>;
959
- export declare const NETWORK_TYPE: {
960
- VPN: string;
961
- UNKNOWN: string;
962
- WIFI: string;
963
- ETHERNET: string;
964
- };
965
- export declare const STATS: {
966
- SEND_DIRECTION: string;
967
- RECEIVE_DIRECTION: string;
968
- REMOTE: string;
969
- LOCAL: string;
970
- };
971
- export declare const MQA_STATS: {
972
- MQA_SIZE: number;
973
- CA_TYPE: string;
974
- DEFAULT_IP: string;
975
- DEFAULT_SHARE_SENDER_STATS: {
976
- common: {
977
- common: {
978
- direction: string;
979
- isMain: boolean;
980
- mariFecEnabled: boolean;
981
- mariRtxEnabled: boolean;
982
- mariLiteEnabled: boolean;
983
- mariQosEnabled: boolean;
984
- multistreamEnabled: boolean;
985
- };
986
- availableBitrate: number;
987
- dtlsBitrate: number;
988
- dtlsPackets: number;
989
- fecBitrate: number;
990
- fecPackets: number;
991
- maxBitrate: number;
992
- queueDelay: number;
993
- remoteJitter: number;
994
- remoteLossRate: number;
995
- roundTripTime: number;
996
- rtcpBitrate: number;
997
- rtcpPackets: number;
998
- rtpBitrate: number;
999
- rtpPackets: number;
1000
- stunBitrate: number;
1001
- stunPackets: number;
1002
- transportType: string;
1003
- };
1004
- streams: {
1005
- common: {
1006
- codec: string;
1007
- duplicateSsci: number;
1008
- requestedBitrate: number;
1009
- requestedFrames: number;
1010
- rtpPackets: number;
1011
- ssci: number;
1012
- transmittedBitrate: number;
1013
- transmittedFrameRate: number;
1014
- };
1015
- h264CodecProfile: string;
1016
- localConfigurationChanges: number;
1017
- remoteConfigurationChanges: number;
1018
- requestedFrameSize: number;
1019
- requestedKeyFrames: number;
1020
- transmittedFrameSize: number;
1021
- transmittedHeight: number;
1022
- transmittedKeyFrames: number;
1023
- transmittedWidth: number;
1024
- }[];
1025
- };
1026
- intervalMetadata: {
1027
- memoryUsage: {
1028
- cpuBitWidth: number;
1029
- mainProcessMaximumMemoryBytes: number;
1030
- osBitWidth: number;
1031
- processAverageMemoryUsage: number;
1032
- processMaximumMemoryBytes: number;
1033
- processMaximumMemoryUsage: number;
1034
- systemAverageMemoryUsage: number;
1035
- systemMaximumMemoryUsage: number;
1036
- };
1037
- peerReflexiveIP: string;
1038
- processAverageCPU: number;
1039
- processMaximumCPU: number;
1040
- systemAverageCPU: number;
1041
- systemMaximumCPU: number;
1042
- };
1043
- };
1044
959
  export declare const QUALITY_LEVELS: {
1045
960
  LOW: string;
1046
961
  MEDIUM: string;
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.8.0-next.58"
461
+ version: "3.8.0-next.59"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -43,7 +43,7 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-meetings": "3.8.0-next.58",
46
+ "@webex/plugin-meetings": "3.8.0-next.59",
47
47
  "@webex/plugin-rooms": "3.8.0-next.21",
48
48
  "@webex/test-helper-chai": "3.8.0-next.17",
49
49
  "@webex/test-helper-mocha": "3.8.0-next.17",
@@ -63,7 +63,7 @@
63
63
  "dependencies": {
64
64
  "@webex/common": "3.8.0-next.17",
65
65
  "@webex/event-dictionary-ts": "^1.0.1753",
66
- "@webex/internal-media-core": "2.15.0",
66
+ "@webex/internal-media-core": "2.16.0",
67
67
  "@webex/internal-plugin-conversation": "3.8.0-next.21",
68
68
  "@webex/internal-plugin-device": "3.8.0-next.17",
69
69
  "@webex/internal-plugin-llm": "3.8.0-next.20",
@@ -71,8 +71,8 @@
71
71
  "@webex/internal-plugin-metrics": "3.8.0-next.17",
72
72
  "@webex/internal-plugin-support": "3.8.0-next.21",
73
73
  "@webex/internal-plugin-user": "3.8.0-next.17",
74
- "@webex/internal-plugin-voicea": "3.8.0-next.58",
75
- "@webex/media-helpers": "3.8.0-next.20",
74
+ "@webex/internal-plugin-voicea": "3.8.0-next.59",
75
+ "@webex/media-helpers": "3.8.0-next.21",
76
76
  "@webex/plugin-people": "3.8.0-next.19",
77
77
  "@webex/plugin-rooms": "3.8.0-next.21",
78
78
  "@webex/web-capabilities": "^1.4.0",
@@ -92,5 +92,5 @@
92
92
  "//": [
93
93
  "TODO: upgrade jwt-decode when moving to node 18"
94
94
  ],
95
- "version": "3.8.0-next.58"
95
+ "version": "3.8.0-next.59"
96
96
  }
package/src/constants.ts CHANGED
@@ -1166,96 +1166,6 @@ export const NETWORK_STATUS = {
1166
1166
 
1167
1167
  export type NETWORK_STATUS = Enum<typeof NETWORK_STATUS>;
1168
1168
 
1169
- export const NETWORK_TYPE = {
1170
- VPN: 'vpn',
1171
- UNKNOWN: 'unknown',
1172
- WIFI: 'wifi',
1173
- ETHERNET: 'ethernet',
1174
- };
1175
-
1176
- export const STATS = {
1177
- SEND_DIRECTION: 'send',
1178
- RECEIVE_DIRECTION: 'recv',
1179
- REMOTE: 'remote',
1180
- LOCAL: 'local',
1181
- };
1182
-
1183
- export const MQA_STATS = {
1184
- MQA_SIZE: 120, // MQA is done on 60 second intervals by server def, add a buffer for missed events
1185
- CA_TYPE: 'MQA',
1186
- DEFAULT_IP: '0.0.0.0',
1187
- DEFAULT_SHARE_SENDER_STATS: {
1188
- common: {
1189
- common: {
1190
- direction: 'sendrecv', // TODO: parse from SDP and save globally
1191
- isMain: false, // always true for share sender
1192
- mariFecEnabled: false, // unavailable
1193
- mariRtxEnabled: false, // unavailable
1194
- mariLiteEnabled: false, // unavailable
1195
- mariQosEnabled: false, // unavailable
1196
- multistreamEnabled: false, // unavailable
1197
- },
1198
- availableBitrate: 0,
1199
- dtlsBitrate: 0, // unavailable
1200
- dtlsPackets: 0, // unavailable
1201
- fecBitrate: 0, // unavailable
1202
- fecPackets: 0, // unavailable
1203
- maxBitrate: 0, // unavailable
1204
- queueDelay: 0, // unavailable
1205
- remoteJitter: 0, // unavailable
1206
- remoteLossRate: 0,
1207
- roundTripTime: 0,
1208
- rtcpBitrate: 0, // unavailable
1209
- rtcpPackets: 0, // unavailable
1210
- rtpBitrate: 0, // unavailable
1211
- rtpPackets: 0,
1212
- stunBitrate: 0, // unavailable
1213
- stunPackets: 0, // unavailable
1214
- transportType: 'UDP', // TODO: parse the transport type from the SDP and save globally
1215
- },
1216
- streams: [
1217
- {
1218
- common: {
1219
- codec: 'H264', // TODO: parse the codec from the SDP and save globally
1220
- duplicateSsci: 0, // unavailable
1221
- requestedBitrate: 0, // unavailable
1222
- requestedFrames: 0, // unavailable
1223
- rtpPackets: 0,
1224
- ssci: 0, // unavailable
1225
- transmittedBitrate: 0,
1226
- transmittedFrameRate: 0,
1227
- },
1228
- h264CodecProfile: 'BP', // TODO: parse the profile level from h264 in the SDP and save globally
1229
- localConfigurationChanges: 0, // unavailable
1230
- remoteConfigurationChanges: 0, // unavailable
1231
- requestedFrameSize: 0, // unavailable
1232
- requestedKeyFrames: 0, // unavailable
1233
- transmittedFrameSize: 0, // unavailable
1234
- transmittedHeight: 0,
1235
- transmittedKeyFrames: 0,
1236
- transmittedWidth: 0,
1237
- },
1238
- ],
1239
- },
1240
- intervalMetadata: {
1241
- memoryUsage: {
1242
- cpuBitWidth: 0,
1243
- mainProcessMaximumMemoryBytes: 0,
1244
- osBitWidth: 0,
1245
- processAverageMemoryUsage: 0,
1246
- processMaximumMemoryBytes: 0,
1247
- processMaximumMemoryUsage: 0,
1248
- systemAverageMemoryUsage: 0,
1249
- systemMaximumMemoryUsage: 0,
1250
- },
1251
- peerReflexiveIP: 'NULL', // TODO: save after ice trickling completes and use as a global variable
1252
- processAverageCPU: 0,
1253
- processMaximumCPU: 0,
1254
- systemAverageCPU: 0,
1255
- systemMaximumCPU: 0,
1256
- },
1257
- };
1258
-
1259
1169
  // ****** MEDIA QUALITY CONSTANTS ****** //
1260
1170
 
1261
1171
  // these values must match allowed values of RemoteQualityLevel from the @webex/internal-media-core lib
@@ -100,7 +100,6 @@ import {
100
100
  MEETING_STATE_MACHINE,
101
101
  MEETING_STATE,
102
102
  MEETINGS,
103
- MQA_STATS,
104
103
  NETWORK_STATUS,
105
104
  ONLINE,
106
105
  OFFLINE,
@@ -6822,20 +6821,20 @@ export default class Meeting extends StatelessWebexPlugin {
6822
6821
  * @memberof Meetings
6823
6822
  */
6824
6823
  setupStatsAnalyzerEventHandlers = () => {
6825
- this.statsAnalyzer.on(StatsAnalyzerEventNames.MEDIA_QUALITY, (options) => {
6826
- // TODO: might have to send the same event to the developer
6827
- // Add ip address info if geo hint is present
6828
- // @ts-ignore fix type
6829
- options.data.intervalMetadata.peerReflexiveIP =
6830
- // @ts-ignore
6831
- this.webex.meetings.geoHintInfo?.clientAddress ||
6832
- options.data.intervalMetadata.peerReflexiveIP ||
6833
- MQA_STATS.DEFAULT_IP;
6824
+ this.statsAnalyzer.on(StatsAnalyzerEventNames.MEDIA_QUALITY, (event) => {
6825
+ // Add IP address from geoHintInfo if missing.
6826
+ if (event.data.intervalMetadata.maskedPeerReflexiveIP === '0.0.0.0') {
6827
+ // @ts-ignore fix type
6828
+ const clientAddressFromGeoHint = this.webex.meetings.geoHintInfo?.clientAddress;
6829
+ if (clientAddressFromGeoHint) {
6830
+ event.data.intervalMetadata.maskedPeerReflexiveIP =
6831
+ CallDiagnosticUtils.anonymizeIPAddress(clientAddressFromGeoHint);
6832
+ }
6833
+ }
6834
6834
 
6835
+ // Count members that are in the meeting.
6835
6836
  const {members} = this.getMembers().membersCollection;
6836
-
6837
- // Count members that are in the meeting
6838
- options.data.intervalMetadata.meetingUserCount = Object.values(members).filter(
6837
+ event.data.intervalMetadata.meetingUserCount = Object.values(members).filter(
6839
6838
  (member: Member) => member.isInMeeting
6840
6839
  ).length;
6841
6840
 
@@ -6844,10 +6843,10 @@ export default class Meeting extends StatelessWebexPlugin {
6844
6843
  name: 'client.mediaquality.event',
6845
6844
  options: {
6846
6845
  meetingId: this.id,
6847
- networkType: options.data.networkType,
6846
+ networkType: this.statsAnalyzer.getNetworkType(),
6848
6847
  },
6849
6848
  payload: {
6850
- intervals: [options.data],
6849
+ intervals: [event.data],
6851
6850
  },
6852
6851
  });
6853
6852
  });
@@ -2762,7 +2762,7 @@ describe('plugin-meetings', () => {
2762
2762
  turnDiscoverySkippedReason: undefined,
2763
2763
  });
2764
2764
  meeting.meetingState = 'ACTIVE';
2765
- const error = {iceConnected: false}
2765
+ const error = {iceConnected: false};
2766
2766
  meeting.mediaProperties.waitForMediaConnectionConnected.rejects(error);
2767
2767
 
2768
2768
  const forceRtcMetricsSend = sinon.stub().resolves();
@@ -3435,28 +3435,23 @@ describe('plugin-meetings', () => {
3435
3435
  on: sinon.stub(),
3436
3436
  });
3437
3437
 
3438
- await meeting
3439
- .addMedia({
3440
- mediaSettings: {},
3441
- });
3438
+ await meeting.addMedia({
3439
+ mediaSettings: {},
3440
+ });
3442
3441
 
3443
- assert.calledWith(
3444
- Metrics.sendBehavioralMetric,
3445
- BEHAVIORAL_METRICS.ADD_MEDIA_SUCCESS,
3446
- {
3447
- correlation_id: meeting.correlationId,
3448
- locus_id: meeting.locusUrl.split('/').pop(),
3449
- connectionType: 'udp',
3450
- selectedCandidatePairChanges: 2,
3451
- numTransports: 1,
3452
- isMultistream: false,
3453
- retriedWithTurnServer: false,
3454
- isJoinWithMediaRetry: false,
3455
- iceCandidatesCount: 0,
3456
- reachability_public_udp_success: 5,
3457
- isSubnetReachable: false,
3458
- }
3459
- );
3442
+ assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADD_MEDIA_SUCCESS, {
3443
+ correlation_id: meeting.correlationId,
3444
+ locus_id: meeting.locusUrl.split('/').pop(),
3445
+ connectionType: 'udp',
3446
+ selectedCandidatePairChanges: 2,
3447
+ numTransports: 1,
3448
+ isMultistream: false,
3449
+ retriedWithTurnServer: false,
3450
+ isJoinWithMediaRetry: false,
3451
+ iceCandidatesCount: 0,
3452
+ reachability_public_udp_success: 5,
3453
+ isSubnetReachable: false,
3454
+ });
3460
3455
  });
3461
3456
 
3462
3457
  it('should send valid isSubnetReachability if media connection fails', async () => {
@@ -3536,6 +3531,8 @@ describe('plugin-meetings', () => {
3536
3531
  meeting.config.stats.enableStatsAnalyzer = true;
3537
3532
 
3538
3533
  statsAnalyzerStub = new EventsScope();
3534
+ statsAnalyzerStub.getNetworkType = sinon.stub().returns('wifi');
3535
+
3539
3536
  // mock the StatsAnalyzer constructor
3540
3537
  sinon.stub(InternalMediaCoreModule, 'StatsAnalyzer').returns(statsAnalyzerStub);
3541
3538
 
@@ -3830,7 +3827,7 @@ describe('plugin-meetings', () => {
3830
3827
  },
3831
3828
  };
3832
3829
  sinon.stub(meeting, 'getMembers').returns({membersCollection: fakeMembersCollection});
3833
- const fakeData = {intervalMetadata: {}, networkType: 'wifi'};
3830
+ const fakeData = {intervalMetadata: {}};
3834
3831
 
3835
3832
  statsAnalyzerStub.emit(
3836
3833
  {file: 'test', function: 'test'},
@@ -3871,7 +3868,7 @@ describe('plugin-meetings', () => {
3871
3868
  });
3872
3869
 
3873
3870
  it('calls submitMQE correctly', async () => {
3874
- const fakeData = {intervalMetadata: {bla: 'bla'}, networkType: 'wifi'};
3871
+ const fakeData = {intervalMetadata: {bla: 'bla'}};
3875
3872
 
3876
3873
  statsAnalyzerStub.emit(
3877
3874
  {file: 'test', function: 'test'},
@@ -4081,7 +4078,7 @@ describe('plugin-meetings', () => {
4081
4078
  meetingId: meeting.id,
4082
4079
  rawError: {
4083
4080
  iceConnected: false,
4084
- }
4081
+ },
4085
4082
  },
4086
4083
  },
4087
4084
  ]);