@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.
- package/dist/meeting/index.js +10 -7
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +24 -20
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +2 -1
- package/dist/meeting/util.js.map +1 -1
- package/package.json +5 -5
- package/src/meeting/index.js +10 -6
- package/src/meeting/request.js +10 -5
- package/src/meeting/util.js +2 -1
- package/test/unit/spec/meeting/index.js +15 -2
- package/test/unit/spec/meeting/request.js +53 -1
- package/test/unit/spec/meeting/utils.js +41 -0
- package/test/unit/spec/meetings/index.js +3 -1
package/src/meeting/request.js
CHANGED
|
@@ -50,8 +50,9 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
50
50
|
async joinMeeting(options) {
|
|
51
51
|
const {
|
|
52
52
|
asResourceOccupant,
|
|
53
|
-
|
|
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 (
|
|
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:
|
|
118
|
+
address: inviteeAddress || `wbxmn:${meetingNumber}`
|
|
114
119
|
};
|
|
115
120
|
}
|
|
116
121
|
catch (e) {
|
|
117
|
-
LoggerProxy.logger.error(`Meeting:request#joinMeeting ${
|
|
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 ===
|
|
131
|
+
if (resourceId === inviteeAddress) {
|
|
127
132
|
body.callPreferences = {
|
|
128
133
|
requestedMedia: [_SLIDES_]
|
|
129
134
|
};
|
package/src/meeting/util.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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 () => {
|