@webex/plugin-meetings 3.0.0-beta.320 → 3.0.0-beta.321

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.
@@ -62,7 +62,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
62
62
  updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
63
63
  this.set('canManageWebcast', canManageWebcast);
64
64
  },
65
- version: "3.0.0-beta.320"
65
+ version: "3.0.0-beta.321"
66
66
  });
67
67
  var _default = Webinar;
68
68
  exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.320",
3
+ "version": "3.0.0-beta.321",
4
4
  "description": "",
5
5
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
6
  "contributors": [
@@ -33,12 +33,12 @@
33
33
  },
34
34
  "devDependencies": {
35
35
  "@peculiar/webcrypto": "^1.4.3",
36
- "@webex/plugin-meetings": "3.0.0-beta.320",
37
- "@webex/test-helper-chai": "3.0.0-beta.320",
38
- "@webex/test-helper-mocha": "3.0.0-beta.320",
39
- "@webex/test-helper-mock-webex": "3.0.0-beta.320",
40
- "@webex/test-helper-retry": "3.0.0-beta.320",
41
- "@webex/test-helper-test-users": "3.0.0-beta.320",
36
+ "@webex/plugin-meetings": "3.0.0-beta.321",
37
+ "@webex/test-helper-chai": "3.0.0-beta.321",
38
+ "@webex/test-helper-mocha": "3.0.0-beta.321",
39
+ "@webex/test-helper-mock-webex": "3.0.0-beta.321",
40
+ "@webex/test-helper-retry": "3.0.0-beta.321",
41
+ "@webex/test-helper-test-users": "3.0.0-beta.321",
42
42
  "chai": "^4.3.4",
43
43
  "chai-as-promised": "^7.1.1",
44
44
  "jsdom-global": "3.0.2",
@@ -47,19 +47,19 @@
47
47
  "typescript": "^4.7.4"
48
48
  },
49
49
  "dependencies": {
50
- "@webex/common": "3.0.0-beta.320",
50
+ "@webex/common": "3.0.0-beta.321",
51
51
  "@webex/internal-media-core": "2.2.2",
52
- "@webex/internal-plugin-conversation": "3.0.0-beta.320",
53
- "@webex/internal-plugin-device": "3.0.0-beta.320",
54
- "@webex/internal-plugin-llm": "3.0.0-beta.320",
55
- "@webex/internal-plugin-mercury": "3.0.0-beta.320",
56
- "@webex/internal-plugin-metrics": "3.0.0-beta.320",
57
- "@webex/internal-plugin-support": "3.0.0-beta.320",
58
- "@webex/internal-plugin-user": "3.0.0-beta.320",
59
- "@webex/media-helpers": "3.0.0-beta.320",
60
- "@webex/plugin-people": "3.0.0-beta.320",
61
- "@webex/plugin-rooms": "3.0.0-beta.320",
62
- "@webex/webex-core": "3.0.0-beta.320",
52
+ "@webex/internal-plugin-conversation": "3.0.0-beta.321",
53
+ "@webex/internal-plugin-device": "3.0.0-beta.321",
54
+ "@webex/internal-plugin-llm": "3.0.0-beta.321",
55
+ "@webex/internal-plugin-mercury": "3.0.0-beta.321",
56
+ "@webex/internal-plugin-metrics": "3.0.0-beta.321",
57
+ "@webex/internal-plugin-support": "3.0.0-beta.321",
58
+ "@webex/internal-plugin-user": "3.0.0-beta.321",
59
+ "@webex/media-helpers": "3.0.0-beta.321",
60
+ "@webex/plugin-people": "3.0.0-beta.321",
61
+ "@webex/plugin-rooms": "3.0.0-beta.321",
62
+ "@webex/webex-core": "3.0.0-beta.321",
63
63
  "ampersand-collection": "^2.0.2",
64
64
  "bowser": "^2.11.0",
65
65
  "btoa": "^1.2.1",
@@ -9,7 +9,6 @@ import {
9
9
  ClientEvent,
10
10
  ClientEventLeaveReason,
11
11
  CallDiagnosticUtils,
12
- CALL_DIAGNOSTIC_CONFIG,
13
12
  } from '@webex/internal-plugin-metrics';
14
13
  import {
15
14
  ConnectionState,
@@ -5421,25 +5420,6 @@ export default class Meeting extends StatelessWebexPlugin {
5421
5420
  this.reconnectionManager.resetReconnectionTimer();
5422
5421
 
5423
5422
  this.reconnect({networkDisconnect: true});
5424
- // @ts-ignore
5425
- this.webex.internal.newMetrics.submitClientEvent({
5426
- name: 'client.ice.end',
5427
- payload: {
5428
- canProceed: false,
5429
- icePhase: 'IN_MEETING',
5430
- errors: [
5431
- // @ts-ignore
5432
- this.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode(
5433
- {
5434
- clientErrorCode: CALL_DIAGNOSTIC_CONFIG.ICE_FAILURE_CLIENT_CODE,
5435
- }
5436
- ),
5437
- ],
5438
- },
5439
- options: {
5440
- meetingId: this.id,
5441
- },
5442
- });
5443
5423
 
5444
5424
  this.uploadLogs({
5445
5425
  file: 'peer-connection-manager/index',
@@ -5457,26 +5437,32 @@ export default class Meeting extends StatelessWebexPlugin {
5457
5437
 
5458
5438
  switch (event.state) {
5459
5439
  case ConnectionState.Connecting:
5460
- // @ts-ignore
5461
- this.webex.internal.newMetrics.submitClientEvent({
5462
- name: 'client.ice.start',
5463
- options: {
5464
- meetingId: this.id,
5465
- },
5466
- });
5440
+ if (!this.hasMediaConnectionConnectedAtLeastOnce) {
5441
+ // Only send CA event for join flow if we haven't successfully connected media yet
5442
+ // @ts-ignore
5443
+ this.webex.internal.newMetrics.submitClientEvent({
5444
+ name: 'client.ice.start',
5445
+ options: {
5446
+ meetingId: this.id,
5447
+ },
5448
+ });
5449
+ }
5467
5450
  break;
5468
5451
  case ConnectionState.Connected:
5469
- // @ts-ignore
5470
- this.webex.internal.newMetrics.submitClientEvent({
5471
- name: 'client.ice.end',
5472
- payload: {
5473
- canProceed: true,
5474
- icePhase: !this.networkStatus ? 'JOIN_MEETING_FINAL' : 'IN_MEETING',
5475
- },
5476
- options: {
5477
- meetingId: this.id,
5478
- },
5479
- });
5452
+ if (!this.hasMediaConnectionConnectedAtLeastOnce) {
5453
+ // Only send CA event for join flow if we haven't successfully connected media yet
5454
+ // @ts-ignore
5455
+ this.webex.internal.newMetrics.submitClientEvent({
5456
+ name: 'client.ice.end',
5457
+ payload: {
5458
+ canProceed: true,
5459
+ icePhase: 'JOIN_MEETING_FINAL',
5460
+ },
5461
+ options: {
5462
+ meetingId: this.id,
5463
+ },
5464
+ });
5465
+ }
5480
5466
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_SUCCESS, {
5481
5467
  correlation_id: this.correlationId,
5482
5468
  locus_id: this.locusId,
@@ -5790,36 +5776,42 @@ export default class Meeting extends StatelessWebexPlugin {
5790
5776
  try {
5791
5777
  await this.mediaProperties.waitForMediaConnectionConnected();
5792
5778
  } catch (error) {
5793
- // @ts-ignore
5794
- this.webex.internal.newMetrics.submitClientEvent({
5795
- name: 'client.ice.end',
5796
- payload: {
5797
- canProceed: !this.turnServerUsed, // If we haven't done turn tls retry yet we will proceed with join attempt
5798
- icePhase: this.turnServerUsed ? 'JOIN_MEETING_FINAL' : 'JOIN_MEETING_RETRY',
5799
- errors: [
5800
- // @ts-ignore
5801
- this.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode({
5802
- clientErrorCode: CallDiagnosticUtils.generateClientErrorCodeForIceFailure({
5803
- signalingState:
5804
- this.mediaProperties.webrtcMediaConnection?.multistreamConnection?.pc?.pc
5805
- ?.signalingState ||
5806
- this.mediaProperties.webrtcMediaConnection?.mediaConnection?.pc?.signalingState ||
5807
- 'unknown',
5808
- iceConnectionState:
5809
- this.mediaProperties.webrtcMediaConnection?.multistreamConnection?.pc?.pc
5810
- ?.iceConnectionState ||
5811
- this.mediaProperties.webrtcMediaConnection?.mediaConnection?.pc
5812
- ?.iceConnectionState ||
5813
- 'unknown',
5814
- turnServerUsed: this.turnServerUsed,
5815
- }),
5816
- }),
5817
- ],
5818
- },
5819
- options: {
5820
- meetingId: this.id,
5821
- },
5822
- });
5779
+ if (!this.hasMediaConnectionConnectedAtLeastOnce) {
5780
+ // Only send CA event for join flow if we haven't successfully connected media yet
5781
+ // @ts-ignore
5782
+ this.webex.internal.newMetrics.submitClientEvent({
5783
+ name: 'client.ice.end',
5784
+ payload: {
5785
+ canProceed: !this.turnServerUsed, // If we haven't done turn tls retry yet we will proceed with join attempt
5786
+ icePhase: this.turnServerUsed ? 'JOIN_MEETING_FINAL' : 'JOIN_MEETING_RETRY',
5787
+ errors: [
5788
+ // @ts-ignore
5789
+ this.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode(
5790
+ {
5791
+ clientErrorCode: CallDiagnosticUtils.generateClientErrorCodeForIceFailure({
5792
+ signalingState:
5793
+ this.mediaProperties.webrtcMediaConnection?.multistreamConnection?.pc?.pc
5794
+ ?.signalingState ||
5795
+ this.mediaProperties.webrtcMediaConnection?.mediaConnection?.pc
5796
+ ?.signalingState ||
5797
+ 'unknown',
5798
+ iceConnectionState:
5799
+ this.mediaProperties.webrtcMediaConnection?.multistreamConnection?.pc?.pc
5800
+ ?.iceConnectionState ||
5801
+ this.mediaProperties.webrtcMediaConnection?.mediaConnection?.pc
5802
+ ?.iceConnectionState ||
5803
+ 'unknown',
5804
+ turnServerUsed: this.turnServerUsed,
5805
+ }),
5806
+ }
5807
+ ),
5808
+ ],
5809
+ },
5810
+ options: {
5811
+ meetingId: this.id,
5812
+ },
5813
+ });
5814
+ }
5823
5815
  throw new Error(
5824
5816
  `Timed out waiting for media connection to be connected, correlationId=${this.correlationId}`
5825
5817
  );
@@ -5691,11 +5691,23 @@ describe('plugin-meetings', () => {
5691
5691
  });
5692
5692
 
5693
5693
  describe('CONNECTION_STATE_CHANGED event when state = "Connecting"', () => {
5694
- it('sends client.ice.start correctly', () => {
5694
+ it('sends client.ice.start correctly when hasMediaConnectionConnectedAtLeastOnce = true', () => {
5695
+ meeting.hasMediaConnectionConnectedAtLeastOnce = true;
5696
+ meeting.setupMediaConnectionListeners();
5697
+ eventListeners[Event.CONNECTION_STATE_CHANGED]({
5698
+ state: 'Connecting',
5699
+ });
5700
+
5701
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
5702
+ })
5703
+
5704
+ it('sends client.ice.start correctly when hasMediaConnectionConnectedAtLeastOnce = false', () => {
5705
+ meeting.hasMediaConnectionConnectedAtLeastOnce = false;
5695
5706
  meeting.setupMediaConnectionListeners();
5696
5707
  eventListeners[Event.CONNECTION_STATE_CHANGED]({
5697
5708
  state: 'Connecting',
5698
5709
  });
5710
+
5699
5711
  assert.calledOnce(webex.internal.newMetrics.submitClientEvent);
5700
5712
  assert.calledWithMatch(webex.internal.newMetrics.submitClientEvent, {
5701
5713
  name: 'client.ice.start',
@@ -5724,17 +5736,21 @@ describe('plugin-meetings', () => {
5724
5736
  };
5725
5737
 
5726
5738
  const checkExpectedSpies = (expected) => {
5727
- assert.calledOnce(webex.internal.newMetrics.submitClientEvent);
5728
- assert.calledWithMatch(webex.internal.newMetrics.submitClientEvent, {
5729
- name: 'client.ice.end',
5730
- options: {
5731
- meetingId: meeting.id,
5732
- },
5733
- payload: {
5734
- canProceed: true,
5735
- icePhase: expected.icePhase,
5736
- },
5737
- });
5739
+ if (expected.icePhase) {
5740
+ assert.calledOnce(webex.internal.newMetrics.submitClientEvent);
5741
+ assert.calledWithMatch(webex.internal.newMetrics.submitClientEvent, {
5742
+ name: 'client.ice.end',
5743
+ options: {
5744
+ meetingId: meeting.id,
5745
+ },
5746
+ payload: {
5747
+ canProceed: true,
5748
+ icePhase: expected.icePhase,
5749
+ },
5750
+ });
5751
+ } else {
5752
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
5753
+ }
5738
5754
  assert.calledOnce(Metrics.sendBehavioralMetric);
5739
5755
  assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.CONNECTION_SUCCESS, {
5740
5756
  correlation_id: meeting.correlationId,
@@ -5776,8 +5792,9 @@ describe('plugin-meetings', () => {
5776
5792
  icePhase: 'JOIN_MEETING_FINAL',
5777
5793
  setNetworkStatusCallParams: [NETWORK_STATUS.CONNECTED],
5778
5794
  });
5795
+ assert.equal(meeting.hasMediaConnectionConnectedAtLeastOnce, true);
5779
5796
 
5780
- // now simulate short connection loss, the 2nd client.ice.end should have a different icePhase
5797
+ // now simulate short connection loss, client.ice.end is not sent a second time as hasMediaConnectionConnectedAtLeastOnce = true
5781
5798
  resetSpies();
5782
5799
 
5783
5800
  eventListeners[Event.CONNECTION_STATE_CHANGED]({
@@ -5788,11 +5805,17 @@ describe('plugin-meetings', () => {
5788
5805
  });
5789
5806
 
5790
5807
  checkExpectedSpies({
5791
- icePhase: 'IN_MEETING',
5792
5808
  setNetworkStatusCallParams: [NETWORK_STATUS.DISCONNECTED, NETWORK_STATUS.CONNECTED],
5793
5809
  });
5794
5810
 
5795
- assert.equal(meeting.hasMediaConnectionConnectedAtLeastOnce, true);
5811
+ resetSpies();
5812
+
5813
+ eventListeners[Event.CONNECTION_STATE_CHANGED]({
5814
+ state: 'Disconnected',
5815
+ });
5816
+ eventListeners[Event.CONNECTION_STATE_CHANGED]({
5817
+ state: 'Connected',
5818
+ });
5796
5819
  });
5797
5820
  });
5798
5821
 
@@ -5864,19 +5887,7 @@ describe('plugin-meetings', () => {
5864
5887
  assert.calledOnce(meeting.setNetworkStatus);
5865
5888
  assert.calledWith(meeting.setNetworkStatus, NETWORK_STATUS.DISCONNECTED);
5866
5889
  assert.calledOnce(meeting.reconnectionManager.waitForIceReconnect);
5867
- assert.calledOnce(getErrorPayloadForClientErrorCodeStub);
5868
- assert.calledOnce(webex.internal.newMetrics.submitClientEvent);
5869
- assert.calledWithMatch(webex.internal.newMetrics.submitClientEvent, {
5870
- name: 'client.ice.end',
5871
- payload: {
5872
- canProceed: false,
5873
- icePhase: 'IN_MEETING',
5874
- errors: [FAKE_ERROR],
5875
- },
5876
- options: {
5877
- meetingId: meeting.id,
5878
- },
5879
- });
5890
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
5880
5891
  checkBehavioralMetricSent(true);
5881
5892
  });
5882
5893
 
@@ -5891,6 +5902,7 @@ describe('plugin-meetings', () => {
5891
5902
  assert.calledOnce(meeting.setNetworkStatus);
5892
5903
  assert.calledWith(meeting.setNetworkStatus, NETWORK_STATUS.DISCONNECTED);
5893
5904
  assert.calledOnce(meeting.reconnectionManager.waitForIceReconnect);
5905
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
5894
5906
  checkBehavioralMetricSent();
5895
5907
  });
5896
5908
  });
@@ -5923,32 +5935,16 @@ describe('plugin-meetings', () => {
5923
5935
 
5924
5936
  mockFailedEvent();
5925
5937
 
5926
- checkBehavioralMetricSent();
5927
5938
  assert.notCalled(webex.internal.newMetrics.submitClientEvent);
5939
+ checkBehavioralMetricSent();
5928
5940
  });
5929
5941
 
5930
5942
  it('handles "Failed" state correctly when hasMediaConnectionConnectedAtLeastOnce = true', async () => {
5931
- const FAKE_ERROR = {fatal: true};
5932
- const getErrorPayloadForClientErrorCodeStub = webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode = sinon
5933
- .stub()
5934
- .returns(FAKE_ERROR);
5935
5943
  meeting.hasMediaConnectionConnectedAtLeastOnce = true;
5936
5944
 
5937
5945
  mockFailedEvent();
5938
5946
 
5939
- assert.calledOnceWithExactly(getErrorPayloadForClientErrorCodeStub, {clientErrorCode: 2004});
5940
- assert.calledOnce(webex.internal.newMetrics.submitClientEvent);
5941
- assert.calledWithMatch(webex.internal.newMetrics.submitClientEvent, {
5942
- name: 'client.ice.end',
5943
- payload: {
5944
- canProceed: false,
5945
- icePhase: 'IN_MEETING',
5946
- errors: [FAKE_ERROR],
5947
- },
5948
- options: {
5949
- meetingId: meeting.id,
5950
- },
5951
- });
5947
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
5952
5948
  checkBehavioralMetricSent(true);
5953
5949
  });
5954
5950
  });
@@ -5960,6 +5956,8 @@ describe('plugin-meetings', () => {
5960
5956
 
5961
5957
  beforeEach(() => {
5962
5958
  meeting.setupMediaConnectionListeners();
5959
+ webex.internal.newMetrics.submitClientEvent.resetHistory();
5960
+ Metrics.sendBehavioralMetric.resetHistory();
5963
5961
  });
5964
5962
 
5965
5963
  const checkMetricSent = (event, error) => {