@webex/plugin-meetings 1.153.3 → 1.153.4

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.
@@ -50,8 +50,9 @@ export default class MeetingRequest extends StatelessWebexPlugin {
50
50
  async joinMeeting(options) {
51
51
  const {
52
52
  asResourceOccupant,
53
- sipUri,
53
+ inviteeAddress,
54
54
  meetingNumber,
55
+ permissionToken,
55
56
  deviceUrl,
56
57
  locusUrl,
57
58
  resourceId,
@@ -98,6 +99,10 @@ export default class MeetingRequest extends StatelessWebexPlugin {
98
99
  body.moderator = moderator;
99
100
  }
100
101
 
102
+ if (permissionToken) {
103
+ body.permissionToken = permissionToken;
104
+ }
105
+
101
106
  if (pin !== undefined) {
102
107
  body.pin = pin;
103
108
  }
@@ -105,16 +110,16 @@ export default class MeetingRequest extends StatelessWebexPlugin {
105
110
  if (locusUrl) {
106
111
  url = `${locusUrl}/${PARTICIPANT}`;
107
112
  }
108
- else if (sipUri || meetingNumber) {
113
+ else if (inviteeAddress || meetingNumber) {
109
114
  try {
110
115
  await this.webex.internal.services.waitForCatalog('postauth');
111
116
  url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;
112
117
  body.invitee = {
113
- address: sipUri || `wbxmn:${meetingNumber}`
118
+ address: inviteeAddress || `wbxmn:${meetingNumber}`
114
119
  };
115
120
  }
116
121
  catch (e) {
117
- LoggerProxy.logger.error(`Meeting:request#joinMeeting ${sipUri ? 'sipUri' : 'meetingNumber'} --> ${e}`);
122
+ LoggerProxy.logger.error(`Meeting:request#joinMeeting Error Joining ${inviteeAddress || meetingNumber} --> ${e}`);
118
123
  throw (e);
119
124
  }
120
125
  }
@@ -123,7 +128,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
123
128
  // TODO: -- this will be resolved in SDK request
124
129
  url = url.concat(`?${ALTERNATE_REDIRECT_TRUE}`);
125
130
 
126
- if (resourceId === sipUri) {
131
+ if (resourceId === inviteeAddress) {
127
132
  body.callPreferences = {
128
133
  requestedMedia: [_SLIDES_]
129
134
  };
@@ -90,12 +90,13 @@ MeetingUtil.joinMeeting = (meeting, options) => {
90
90
  // if Joining state termintate the request as user might click multiple times
91
91
  return meeting.meetingRequest
92
92
  .joinMeeting({
93
- sipUri: meeting.sipUri,
93
+ inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,
94
94
  meetingNumber: meeting.meetingNumber,
95
95
  deviceUrl: meeting.deviceUrl,
96
96
  locusUrl: meeting.locusUrl,
97
97
  correlationId: meeting.correlationId,
98
98
  roapMessage: options.roapMessage,
99
+ permissionToken: meeting.permissionToken,
99
100
  resourceId: options.resourceId || null,
100
101
  moderator: options.moderator,
101
102
  pin: options.pin,
@@ -610,6 +610,17 @@ describe('plugin-meetings', () => {
610
610
  });
611
611
  });
612
612
  describe('#join', () => {
613
+ let sandbox = null;
614
+
615
+ beforeEach(() => {
616
+ sandbox = sinon.createSandbox();
617
+ });
618
+
619
+ afterEach(() => {
620
+ sandbox.restore();
621
+ sandbox = null;
622
+ });
623
+
613
624
  it('should have #join', () => {
614
625
  assert.exists(meeting.join);
615
626
  });
@@ -619,8 +630,9 @@ describe('plugin-meetings', () => {
619
630
  });
620
631
  describe('successful', () => {
621
632
  beforeEach(() => {
622
- MeetingUtil.joinMeeting = sinon.stub().returns(Promise.resolve());
633
+ sandbox.stub(MeetingUtil, 'joinMeeting').returns(Promise.resolve());
623
634
  });
635
+
624
636
  it('should join the meeting and return promise', async () => {
625
637
  const join = meeting.join();
626
638
 
@@ -650,9 +662,10 @@ describe('plugin-meetings', () => {
650
662
  });
651
663
  describe('failure', () => {
652
664
  beforeEach(() => {
653
- MeetingUtil.joinMeeting = sinon.stub().returns(Promise.reject());
665
+ sandbox.stub(MeetingUtil, 'joinMeeting').returns(Promise.reject());
654
666
  meeting.logger.log = sinon.stub().returns(true);
655
667
  });
668
+
656
669
  describe('guest join', () => {
657
670
  beforeEach(() => {
658
671
  MeetingUtil.isPinOrGuest = sinon.stub().returns(true);
@@ -19,10 +19,18 @@ describe('plugin-meetings', () => {
19
19
  regionCode: 'WEST-COAST'
20
20
  };
21
21
 
22
+ webex.internal = {
23
+ services: {
24
+ get: sinon.mock().returns('locusUrl'),
25
+ waitForCatalog: sinon.mock().returns(Promise.resolve({}))
26
+ }
27
+ };
28
+
22
29
  meetingsRequest = new MeetingRequest({}, {
23
30
  parent: webex
24
31
  });
25
32
 
33
+
26
34
  meetingsRequest.request = sinon.mock().returns(Promise.resolve({}));
27
35
  });
28
36
 
@@ -112,12 +120,15 @@ describe('plugin-meetings', () => {
112
120
  const deviceUrl = 'deviceUrl';
113
121
  const correlationId = 'random-uuid';
114
122
  const roapMessage = 'roap-message';
123
+ const permissionToken = 'permission-token';
115
124
 
116
125
  await meetingsRequest.joinMeeting({
117
126
  locusUrl,
118
127
  deviceUrl,
119
128
  correlationId,
120
- roapMessage
129
+ roapMessage,
130
+ permissionToken
131
+
121
132
  });
122
133
  const requestParams = meetingsRequest.request.getCall(0).args[0];
123
134
 
@@ -125,8 +136,49 @@ describe('plugin-meetings', () => {
125
136
  assert.equal(requestParams.uri, `${locusUrl}/participant?alternateRedirect=true`);
126
137
  assert.equal(requestParams.body.device.url, deviceUrl);
127
138
  assert.equal(requestParams.body.device.countryCode, 'US');
139
+ assert.equal(requestParams.body.permissionToken, 'permission-token');
128
140
  assert.equal(requestParams.body.device.regionCode, 'WEST-COAST');
129
141
  });
142
+
143
+ it('sends /call with meetingNumber if inviteeAddress does not exist', async () => {
144
+ const deviceUrl = 'deviceUrl';
145
+ const correlationId = 'random-uuid';
146
+ const roapMessage = 'roap-message';
147
+ const meetingNumber = 'meetingNumber';
148
+
149
+ await meetingsRequest.joinMeeting({
150
+ deviceUrl,
151
+ correlationId,
152
+ roapMessage,
153
+ meetingNumber
154
+ });
155
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
156
+
157
+ assert.equal(requestParams.method, 'POST');
158
+ assert.equal(requestParams.uri, 'locusUrl/loci/call?alternateRedirect=true');
159
+ assert.equal(requestParams.body.invitee.address, 'wbxmn:meetingNumber');
160
+ });
161
+
162
+ it('sends /call with inviteeAddress over meetingNumber as preference', async () => {
163
+ const deviceUrl = 'deviceUrl';
164
+ const correlationId = 'random-uuid';
165
+ const roapMessage = 'roap-message';
166
+ const meetingNumber = 'meetingNumber';
167
+ const inviteeAddress = 'sipUrl';
168
+
169
+ await meetingsRequest.joinMeeting({
170
+ deviceUrl,
171
+ correlationId,
172
+ roapMessage,
173
+ meetingNumber,
174
+ inviteeAddress
175
+ });
176
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
177
+
178
+ assert.equal(requestParams.method, 'POST');
179
+ assert.equal(requestParams.uri, 'locusUrl/loci/call?alternateRedirect=true');
180
+ assert.equal(requestParams.body.invitee.address, 'sipUrl');
181
+ });
130
182
  });
131
183
 
132
184
  describe('#pstn', () => {
@@ -4,6 +4,7 @@ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
4
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
5
  import LoggerConfig
6
6
  from '@webex/plugin-meetings/src/common/logs/logger-config';
7
+ import Metrics from '@webex/plugin-meetings/src/metrics/index';
7
8
 
8
9
  describe('plugin-meetings', () => {
9
10
  describe('Meeting utils function', () => {
@@ -11,6 +12,7 @@ describe('plugin-meetings', () => {
11
12
  const meeting = {};
12
13
 
13
14
  beforeEach(() => {
15
+ Metrics.postEvent = sinon.stub();
14
16
  const logger = {
15
17
  info: sandbox.stub(),
16
18
  log: sandbox.stub(),
@@ -132,6 +134,45 @@ describe('plugin-meetings', () => {
132
134
  });
133
135
  });
134
136
  });
137
+
138
+ describe('joinMeeting', () => {
139
+ it('#Should call `meetingRequest.joinMeeting', async () => {
140
+ const meeting = {meetingJoinUrl: 'meetingJoinUrl', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
141
+
142
+ MeetingUtil.parseLocusJoin = sinon.stub();
143
+ await MeetingUtil.joinMeeting(meeting, {});
144
+
145
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
146
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
147
+
148
+ assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
149
+ });
150
+
151
+ it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
152
+ const meeting = {sipUri: 'sipUri', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
153
+
154
+ MeetingUtil.parseLocusJoin = sinon.stub();
155
+ await MeetingUtil.joinMeeting(meeting, {});
156
+
157
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
158
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
159
+
160
+ assert.equal(parameter.inviteeAddress, 'sipUri');
161
+ });
162
+
163
+ it('#Should fallback to meetingNumber if meetingJoinUrl/sipUrl does not exists', async () => {
164
+ const meeting = {meetingNumber: 'meetingNumber', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
165
+
166
+ MeetingUtil.parseLocusJoin = sinon.stub();
167
+ await MeetingUtil.joinMeeting(meeting, {});
168
+
169
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
170
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
171
+
172
+ assert.isUndefined(parameter.inviteeAddress);
173
+ assert.equal(parameter.meetingNumber, 'meetingNumber');
174
+ });
175
+ });
135
176
  });
136
177
  });
137
178
 
@@ -468,7 +468,7 @@ skipInBrowser(describe)('plugin-meetings', () => {
468
468
  });
469
469
  describe('successful MeetingInfo.#fetchMeetingInfo', () => {
470
470
  beforeEach(() => {
471
- webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(Promise.resolve(true));
471
+ webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(Promise.resolve({body: {permissionToken: 'PT', meetingJoinUrl: 'meetingJoinUrl'}}));
472
472
  });
473
473
  it('creates the meeting from a successful meeting info fetch promise testing', async () => {
474
474
  const meeting = webex.meetings.createMeeting('test', 'test');
@@ -482,6 +482,8 @@ skipInBrowser(describe)('plugin-meetings', () => {
482
482
  assert.calledWith(webex.meetings.meetingInfo.fetchMeetingInfo, 'test');
483
483
  assert.calledWith(MeetingsUtil.extractDestination, 'test', 'test');
484
484
  assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test');
485
+ assert.equal(meeting.permissionToken, 'PT');
486
+ assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
485
487
  });
486
488
 
487
489
  it('creates the meeting from a successful meeting info fetch meeting resolve testing', async () => {