@webex/internal-plugin-mercury 3.0.0-beta.8 → 3.0.0-bnr.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.
- package/README.md +1 -3
- package/dist/config.js +0 -7
- package/dist/config.js.map +1 -1
- package/dist/errors.js +0 -44
- package/dist/errors.js.map +1 -1
- package/dist/index.js +1 -20
- package/dist/index.js.map +1 -1
- package/dist/mercury.js +29 -148
- package/dist/mercury.js.map +1 -1
- package/dist/socket/index.js +0 -4
- package/dist/socket/index.js.map +1 -1
- package/dist/socket/socket-base.js +25 -116
- package/dist/socket/socket-base.js.map +1 -1
- package/dist/socket/socket.js +1 -7
- package/dist/socket/socket.js.map +1 -1
- package/dist/socket/socket.shim.js +2 -7
- package/dist/socket/socket.shim.js.map +1 -1
- package/dist/types/config.d.ts +10 -0
- package/dist/types/errors.d.ts +31 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/mercury.d.ts +2 -0
- package/dist/types/socket/index.d.ts +1 -0
- package/dist/types/socket/socket-base.d.ts +120 -0
- package/dist/types/socket/socket.d.ts +2 -0
- package/dist/types/socket/socket.shim.d.ts +2 -0
- package/package.json +14 -14
- package/src/config.js +2 -2
- package/src/errors.js +7 -5
- package/src/index.js +2 -2
- package/src/mercury.js +74 -59
- package/src/socket/socket-base.js +45 -46
- package/src/socket/socket.shim.js +6 -8
- package/test/integration/spec/mercury.js +49 -39
- package/test/integration/spec/sharable-mercury.js +19 -15
- package/test/integration/spec/webex.js +8 -7
- package/test/unit/spec/mercury-events.js +51 -60
- package/test/unit/spec/mercury.js +179 -150
- package/test/unit/spec/socket.js +246 -202
|
@@ -11,7 +11,7 @@ import Mercury, {
|
|
|
11
11
|
// NotFound,
|
|
12
12
|
config as mercuryConfig,
|
|
13
13
|
ConnectionError,
|
|
14
|
-
Socket
|
|
14
|
+
Socket,
|
|
15
15
|
} from '@webex/internal-plugin-mercury';
|
|
16
16
|
import sinon from 'sinon';
|
|
17
17
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
@@ -24,23 +24,19 @@ import promiseTick from '../lib/promise-tick';
|
|
|
24
24
|
|
|
25
25
|
describe('plugin-mercury', () => {
|
|
26
26
|
describe('Mercury', () => {
|
|
27
|
-
let clock,
|
|
28
|
-
mercury,
|
|
29
|
-
mockWebSocket,
|
|
30
|
-
socketOpenStub,
|
|
31
|
-
webex;
|
|
27
|
+
let clock, mercury, mockWebSocket, socketOpenStub, webex;
|
|
32
28
|
|
|
33
29
|
const statusStartTypingMessage = JSON.stringify({
|
|
34
30
|
id: uuid.v4(),
|
|
35
31
|
data: {
|
|
36
32
|
eventType: 'status.start_typing',
|
|
37
33
|
actor: {
|
|
38
|
-
id: 'actorId'
|
|
34
|
+
id: 'actorId',
|
|
39
35
|
},
|
|
40
|
-
conversationId: uuid.v4()
|
|
36
|
+
conversationId: uuid.v4(),
|
|
41
37
|
},
|
|
42
38
|
timestamp: Date.now(),
|
|
43
|
-
trackingId: `suffix_${uuid.v4()}_${Date.now()}
|
|
39
|
+
trackingId: `suffix_${uuid.v4()}_${Date.now()}`,
|
|
44
40
|
});
|
|
45
41
|
|
|
46
42
|
beforeEach(() => {
|
|
@@ -54,27 +50,31 @@ describe('plugin-mercury', () => {
|
|
|
54
50
|
beforeEach(() => {
|
|
55
51
|
webex = new MockWebex({
|
|
56
52
|
children: {
|
|
57
|
-
mercury: Mercury
|
|
58
|
-
}
|
|
53
|
+
mercury: Mercury,
|
|
54
|
+
},
|
|
59
55
|
});
|
|
60
56
|
webex.credentials = {
|
|
61
57
|
refresh: sinon.stub().returns(Promise.resolve()),
|
|
62
|
-
getUserToken: sinon.stub().returns(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
58
|
+
getUserToken: sinon.stub().returns(
|
|
59
|
+
Promise.resolve({
|
|
60
|
+
toString() {
|
|
61
|
+
return 'Bearer FAKE';
|
|
62
|
+
},
|
|
63
|
+
})
|
|
64
|
+
),
|
|
67
65
|
};
|
|
68
66
|
webex.internal.device = {
|
|
69
67
|
register: sinon.stub().returns(Promise.resolve()),
|
|
70
68
|
refresh: sinon.stub().returns(Promise.resolve()),
|
|
71
69
|
webSocketUrl: 'ws://example.com',
|
|
72
70
|
getWebSocketUrl: sinon.stub().returns(Promise.resolve('ws://example-2.com')),
|
|
73
|
-
useServiceCatalogUrl: sinon
|
|
71
|
+
useServiceCatalogUrl: sinon
|
|
72
|
+
.stub()
|
|
73
|
+
.returns(Promise.resolve('https://service-catalog-url.com')),
|
|
74
74
|
};
|
|
75
75
|
webex.internal.services = {
|
|
76
76
|
convertUrlToPriorityHostUrl: sinon.stub().returns(Promise.resolve('ws://example-2.com')),
|
|
77
|
-
markFailedUrl: sinon.stub().returns(Promise.resolve())
|
|
77
|
+
markFailedUrl: sinon.stub().returns(Promise.resolve()),
|
|
78
78
|
};
|
|
79
79
|
webex.internal.metrics.submitClientMetrics = sinon.stub();
|
|
80
80
|
webex.trackingId = 'fakeTrackingId';
|
|
@@ -132,10 +132,9 @@ describe('plugin-mercury', () => {
|
|
|
132
132
|
|
|
133
133
|
mockWebSocket.open();
|
|
134
134
|
|
|
135
|
-
return promise
|
|
136
|
-
.
|
|
137
|
-
|
|
138
|
-
});
|
|
135
|
+
return promise.then(() => {
|
|
136
|
+
assert.calledOnce(webex.internal.device.register);
|
|
137
|
+
});
|
|
139
138
|
});
|
|
140
139
|
|
|
141
140
|
it('connects to Mercury using default url', () => {
|
|
@@ -145,12 +144,11 @@ describe('plugin-mercury', () => {
|
|
|
145
144
|
assert.isTrue(mercury.connecting, 'Mercury is connecting');
|
|
146
145
|
mockWebSocket.open();
|
|
147
146
|
|
|
148
|
-
return promise
|
|
149
|
-
.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
});
|
|
147
|
+
return promise.then(() => {
|
|
148
|
+
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
149
|
+
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
150
|
+
assert.calledWith(socketOpenStub, sinon.match(/ws:\/\/example.com/), sinon.match.any);
|
|
151
|
+
});
|
|
154
152
|
});
|
|
155
153
|
|
|
156
154
|
describe('when `maxRetries` is set', () => {
|
|
@@ -198,15 +196,14 @@ describe('plugin-mercury', () => {
|
|
|
198
196
|
mercury.connect(),
|
|
199
197
|
mercury.connect(),
|
|
200
198
|
mercury.connect(),
|
|
201
|
-
mercury.connect()
|
|
199
|
+
mercury.connect(),
|
|
202
200
|
]);
|
|
203
201
|
|
|
204
202
|
mockWebSocket.open();
|
|
205
203
|
|
|
206
|
-
return promise
|
|
207
|
-
.
|
|
208
|
-
|
|
209
|
-
});
|
|
204
|
+
return promise.then(() => {
|
|
205
|
+
assert.calledOnce(Socket.prototype.open);
|
|
206
|
+
});
|
|
210
207
|
});
|
|
211
208
|
|
|
212
209
|
// skipping due to apparent bug with lolex in all browsers but Chrome.
|
|
@@ -261,7 +258,9 @@ describe('plugin-mercury', () => {
|
|
|
261
258
|
it('fails permanently', () => {
|
|
262
259
|
clock.uninstall();
|
|
263
260
|
socketOpenStub.restore();
|
|
264
|
-
socketOpenStub = sinon
|
|
261
|
+
socketOpenStub = sinon
|
|
262
|
+
.stub(Socket.prototype, 'open')
|
|
263
|
+
.returns(Promise.reject(new BadRequest({code: 4400})));
|
|
265
264
|
|
|
266
265
|
return assert.isRejected(mercury.connect());
|
|
267
266
|
});
|
|
@@ -276,18 +275,16 @@ describe('plugin-mercury', () => {
|
|
|
276
275
|
assert.notCalled(webex.internal.device.refresh);
|
|
277
276
|
const promise = mercury.connect();
|
|
278
277
|
|
|
279
|
-
return promiseTick(7)
|
|
280
|
-
.
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
clock.tick(1000);
|
|
278
|
+
return promiseTick(7).then(() => {
|
|
279
|
+
assert.notCalled(webex.credentials.refresh);
|
|
280
|
+
assert.called(webex.internal.device.refresh);
|
|
281
|
+
clock.tick(1000);
|
|
284
282
|
|
|
285
|
-
|
|
286
|
-
|
|
283
|
+
return promise;
|
|
284
|
+
});
|
|
287
285
|
});
|
|
288
286
|
});
|
|
289
287
|
|
|
290
|
-
|
|
291
288
|
describe('with `NotAuthorized`', () => {
|
|
292
289
|
it('triggers a token refresh', () => {
|
|
293
290
|
socketOpenStub.restore();
|
|
@@ -297,14 +294,13 @@ describe('plugin-mercury', () => {
|
|
|
297
294
|
assert.notCalled(webex.internal.device.refresh);
|
|
298
295
|
const promise = mercury.connect();
|
|
299
296
|
|
|
300
|
-
return promiseTick(7)
|
|
301
|
-
.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
clock.tick(1000);
|
|
297
|
+
return promiseTick(7).then(() => {
|
|
298
|
+
assert.called(webex.credentials.refresh);
|
|
299
|
+
assert.notCalled(webex.internal.device.refresh);
|
|
300
|
+
clock.tick(1000);
|
|
305
301
|
|
|
306
|
-
|
|
307
|
-
|
|
302
|
+
return promise;
|
|
303
|
+
});
|
|
308
304
|
});
|
|
309
305
|
});
|
|
310
306
|
|
|
@@ -312,7 +308,9 @@ describe('plugin-mercury', () => {
|
|
|
312
308
|
it('fails permanently', () => {
|
|
313
309
|
clock.uninstall();
|
|
314
310
|
socketOpenStub.restore();
|
|
315
|
-
socketOpenStub = sinon
|
|
311
|
+
socketOpenStub = sinon
|
|
312
|
+
.stub(Socket.prototype, 'open')
|
|
313
|
+
.returns(Promise.reject(new Forbidden({code: 4403})));
|
|
316
314
|
|
|
317
315
|
return assert.isRejected(mercury.connect());
|
|
318
316
|
});
|
|
@@ -344,20 +342,19 @@ describe('plugin-mercury', () => {
|
|
|
344
342
|
socketOpenStub.onCall(0).returns(Promise.reject(new ConnectionError({code: 4001})));
|
|
345
343
|
const promise = mercury.connect();
|
|
346
344
|
|
|
347
|
-
return promiseTick(7)
|
|
348
|
-
.
|
|
349
|
-
|
|
350
|
-
clock.tick(1000);
|
|
345
|
+
return promiseTick(7).then(() => {
|
|
346
|
+
assert.calledOnce(webex.internal.services.markFailedUrl);
|
|
347
|
+
clock.tick(1000);
|
|
351
348
|
|
|
352
|
-
|
|
353
|
-
|
|
349
|
+
return promise;
|
|
350
|
+
});
|
|
354
351
|
});
|
|
355
352
|
});
|
|
356
353
|
});
|
|
357
354
|
|
|
358
355
|
describe('when connected', () => {
|
|
359
|
-
it('resolves immediately', () =>
|
|
360
|
-
.then(() => {
|
|
356
|
+
it('resolves immediately', () =>
|
|
357
|
+
mercury.connect().then(() => {
|
|
361
358
|
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
362
359
|
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
363
360
|
const promise = mercury.connect();
|
|
@@ -393,12 +390,15 @@ describe('plugin-mercury', () => {
|
|
|
393
390
|
assert.isTrue(mercury.connecting, 'Mercury is connecting');
|
|
394
391
|
mockWebSocket.open();
|
|
395
392
|
|
|
396
|
-
return promise
|
|
397
|
-
.
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
393
|
+
return promise.then(() => {
|
|
394
|
+
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
395
|
+
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
396
|
+
assert.calledWith(
|
|
397
|
+
Socket.prototype.open,
|
|
398
|
+
sinon.match(/ws:\/\/providedurl.com/),
|
|
399
|
+
sinon.match.any
|
|
400
|
+
);
|
|
401
|
+
});
|
|
402
402
|
});
|
|
403
403
|
});
|
|
404
404
|
});
|
|
@@ -418,13 +418,18 @@ describe('plugin-mercury', () => {
|
|
|
418
418
|
assert.isTrue(mercury.connecting, 'Mercury is connecting');
|
|
419
419
|
mockWebSocket.open();
|
|
420
420
|
|
|
421
|
-
return promise
|
|
422
|
-
.
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
421
|
+
return promise.then(() => {
|
|
422
|
+
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
423
|
+
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
424
|
+
assert.calledWith(
|
|
425
|
+
socketOpenStub,
|
|
426
|
+
sinon.match(/ws:\/\/example.com/),
|
|
427
|
+
sinon.match.has(
|
|
428
|
+
'agent',
|
|
429
|
+
sinon.match.has('proxy', sinon.match.has('href', testProxyUrl))
|
|
430
|
+
)
|
|
431
|
+
);
|
|
432
|
+
});
|
|
428
433
|
});
|
|
429
434
|
|
|
430
435
|
it('connects to Mercury without proxy agent', () => {
|
|
@@ -434,41 +439,47 @@ describe('plugin-mercury', () => {
|
|
|
434
439
|
assert.isTrue(mercury.connecting, 'Mercury is connecting');
|
|
435
440
|
mockWebSocket.open();
|
|
436
441
|
|
|
437
|
-
return promise
|
|
438
|
-
.
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
442
|
+
return promise.then(() => {
|
|
443
|
+
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
444
|
+
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
445
|
+
assert.calledWith(
|
|
446
|
+
socketOpenStub,
|
|
447
|
+
sinon.match(/ws:\/\/example.com/),
|
|
448
|
+
sinon.match({agent: undefined})
|
|
449
|
+
);
|
|
450
|
+
});
|
|
443
451
|
});
|
|
444
452
|
});
|
|
445
453
|
|
|
446
454
|
describe('#disconnect()', () => {
|
|
447
|
-
it('disconnects the WebSocket', () =>
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
455
|
+
it('disconnects the WebSocket', () =>
|
|
456
|
+
mercury
|
|
457
|
+
.connect()
|
|
458
|
+
.then(() => {
|
|
459
|
+
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
460
|
+
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
461
|
+
const promise = mercury.disconnect();
|
|
452
462
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
463
|
+
mockWebSocket.emit('close', {
|
|
464
|
+
code: 1000,
|
|
465
|
+
reason: 'Done',
|
|
466
|
+
});
|
|
457
467
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
468
|
+
return promise;
|
|
469
|
+
})
|
|
470
|
+
.then(() => {
|
|
471
|
+
assert.isFalse(mercury.connected, 'Mercury is not connected');
|
|
472
|
+
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
473
|
+
assert.isUndefined(mercury.mockWebSocket, 'Mercury does not have a mockWebSocket');
|
|
474
|
+
}));
|
|
465
475
|
|
|
466
476
|
it('stops emitting message events', () => {
|
|
467
477
|
const spy = sinon.spy();
|
|
468
478
|
|
|
469
479
|
mercury.on('event:status.start_typing', spy);
|
|
470
480
|
|
|
471
|
-
return mercury
|
|
481
|
+
return mercury
|
|
482
|
+
.connect()
|
|
472
483
|
.then(() => {
|
|
473
484
|
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
474
485
|
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
@@ -488,7 +499,7 @@ describe('plugin-mercury', () => {
|
|
|
488
499
|
mockWebSocket.emit('message', {data: statusStartTypingMessage});
|
|
489
500
|
mockWebSocket.emit('close', {
|
|
490
501
|
code: 1000,
|
|
491
|
-
reason: 'Done'
|
|
502
|
+
reason: 'Done',
|
|
492
503
|
});
|
|
493
504
|
mockWebSocket.emit('message', {data: statusStartTypingMessage});
|
|
494
505
|
|
|
@@ -511,28 +522,27 @@ describe('plugin-mercury', () => {
|
|
|
511
522
|
// Delay the opening of the socket so that disconnect is called while open
|
|
512
523
|
// is in progress
|
|
513
524
|
promiseTick(2 * webex.internal.mercury.config.backoffTimeReset)
|
|
514
|
-
|
|
515
|
-
|
|
525
|
+
// Pretend the socket opened successfully. Failing should be fine too but
|
|
526
|
+
// it generates more console output.
|
|
516
527
|
.then(() => Promise.resolve())
|
|
517
528
|
);
|
|
518
529
|
const promise = mercury.connect();
|
|
519
530
|
|
|
520
531
|
// Wait for the connect call to setup
|
|
521
|
-
return promiseTick(webex.internal.mercury.config.backoffTimeReset)
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
});
|
|
532
|
+
return promiseTick(webex.internal.mercury.config.backoffTimeReset).then(() => {
|
|
533
|
+
// By this time backoffCall and mercury socket should be defined by the
|
|
534
|
+
// 'connect' call
|
|
535
|
+
assert.isDefined(mercury.backoffCall, 'Mercury backoffCall is not defined');
|
|
536
|
+
assert.isDefined(mercury.socket, 'Mercury socket is not defined');
|
|
537
|
+
// Calling disconnect will abort the backoffCall, close the socket, and
|
|
538
|
+
// reject the connect
|
|
539
|
+
mercury.disconnect();
|
|
540
|
+
assert.isUndefined(mercury.backoffCall, 'Mercury backoffCall is still defined');
|
|
541
|
+
// The socket will never be unset (which seems bad)
|
|
542
|
+
assert.isDefined(mercury.socket, 'Mercury socket is not defined');
|
|
543
|
+
|
|
544
|
+
return assert.isRejected(promise);
|
|
545
|
+
});
|
|
536
546
|
});
|
|
537
547
|
|
|
538
548
|
it('stops the attempt when backoffCall is undefined', () => {
|
|
@@ -547,10 +557,12 @@ describe('plugin-mercury', () => {
|
|
|
547
557
|
reason = _reason;
|
|
548
558
|
});
|
|
549
559
|
|
|
550
|
-
return promiseTick(webex.internal.mercury.config.backoffTimeReset)
|
|
551
|
-
.
|
|
552
|
-
|
|
553
|
-
|
|
560
|
+
return promiseTick(webex.internal.mercury.config.backoffTimeReset).then(() => {
|
|
561
|
+
assert.equal(
|
|
562
|
+
reason.message,
|
|
563
|
+
'mercury: prevent socket open when backoffCall no longer defined'
|
|
564
|
+
);
|
|
565
|
+
});
|
|
554
566
|
});
|
|
555
567
|
});
|
|
556
568
|
});
|
|
@@ -572,11 +584,11 @@ describe('plugin-mercury', () => {
|
|
|
572
584
|
it('merges a single header field with data', () => {
|
|
573
585
|
const envelope = {
|
|
574
586
|
headers: {
|
|
575
|
-
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate
|
|
587
|
+
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
|
|
576
588
|
},
|
|
577
589
|
data: {
|
|
578
|
-
activity: {}
|
|
579
|
-
}
|
|
590
|
+
activity: {},
|
|
591
|
+
},
|
|
580
592
|
};
|
|
581
593
|
|
|
582
594
|
mercury._applyOverrides(envelope);
|
|
@@ -588,27 +600,30 @@ describe('plugin-mercury', () => {
|
|
|
588
600
|
const envelope = {
|
|
589
601
|
headers: {
|
|
590
602
|
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
|
|
591
|
-
'data.activity.target.lastReadableActivityDate': lastReadableActivityDate
|
|
603
|
+
'data.activity.target.lastReadableActivityDate': lastReadableActivityDate,
|
|
592
604
|
},
|
|
593
605
|
data: {
|
|
594
|
-
activity: {}
|
|
595
|
-
}
|
|
606
|
+
activity: {},
|
|
607
|
+
},
|
|
596
608
|
};
|
|
597
609
|
|
|
598
610
|
mercury._applyOverrides(envelope);
|
|
599
611
|
|
|
600
612
|
assert.equal(envelope.data.activity.target.lastSeenActivityDate, lastSeenActivityDate);
|
|
601
|
-
assert.equal(
|
|
613
|
+
assert.equal(
|
|
614
|
+
envelope.data.activity.target.lastReadableActivityDate,
|
|
615
|
+
lastReadableActivityDate
|
|
616
|
+
);
|
|
602
617
|
});
|
|
603
618
|
|
|
604
619
|
it('merges headers when Mercury messages arrive', () => {
|
|
605
620
|
const envelope = {
|
|
606
621
|
headers: {
|
|
607
|
-
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate
|
|
622
|
+
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
|
|
608
623
|
},
|
|
609
624
|
data: {
|
|
610
|
-
activity: {}
|
|
611
|
-
}
|
|
625
|
+
activity: {},
|
|
626
|
+
},
|
|
612
627
|
};
|
|
613
628
|
|
|
614
629
|
mercury._applyOverrides(envelope);
|
|
@@ -622,19 +637,24 @@ describe('plugin-mercury', () => {
|
|
|
622
637
|
webex.internal.device.webSocketUrl = 'ws://example.com';
|
|
623
638
|
});
|
|
624
639
|
|
|
625
|
-
it('uses device default webSocketUrl', () =>
|
|
626
|
-
.then((wsUrl) => assert.match(wsUrl, /example.com/)));
|
|
627
|
-
it('uses provided webSocketUrl', () =>
|
|
628
|
-
.
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
it('
|
|
637
|
-
.
|
|
640
|
+
it('uses device default webSocketUrl', () =>
|
|
641
|
+
webex.internal.mercury._prepareUrl().then((wsUrl) => assert.match(wsUrl, /example.com/)));
|
|
642
|
+
it('uses provided webSocketUrl', () =>
|
|
643
|
+
webex.internal.mercury
|
|
644
|
+
._prepareUrl('ws://provided.com')
|
|
645
|
+
.then((wsUrl) => assert.match(wsUrl, /provided.com/)));
|
|
646
|
+
it('requests text-mode WebSockets', () =>
|
|
647
|
+
webex.internal.mercury
|
|
648
|
+
._prepareUrl()
|
|
649
|
+
.then((wsUrl) => assert.match(wsUrl, /outboundWireFormat=text/)));
|
|
650
|
+
|
|
651
|
+
it('requests the buffer state message', () =>
|
|
652
|
+
webex.internal.mercury
|
|
653
|
+
._prepareUrl()
|
|
654
|
+
.then((wsUrl) => assert.match(wsUrl, /bufferStates=true/)));
|
|
655
|
+
|
|
656
|
+
it('does not add conditional properties', () =>
|
|
657
|
+
webex.internal.mercury._prepareUrl().then((wsUrl) => {
|
|
638
658
|
assert.notMatch(wsUrl, /mercuryRegistrationStatus/);
|
|
639
659
|
assert.notMatch(wsUrl, /mercuryRegistrationStatus/);
|
|
640
660
|
assert.notMatch(wsUrl, /isRegistrationRefreshEnabled/);
|
|
@@ -643,27 +663,34 @@ describe('plugin-mercury', () => {
|
|
|
643
663
|
|
|
644
664
|
describe('when web-high-availability is enabled', () => {
|
|
645
665
|
it('uses webSocketUrl provided by device', () => {
|
|
646
|
-
webex.internal.device.useServiceCatalogUrl = sinon
|
|
666
|
+
webex.internal.device.useServiceCatalogUrl = sinon
|
|
667
|
+
.stub()
|
|
668
|
+
.returns(Promise.resolve('ws://example-2.com'));
|
|
647
669
|
webex.internal.feature.getFeature.onCall(0).returns(Promise.resolve(true));
|
|
648
670
|
|
|
649
|
-
return webex.internal.mercury
|
|
671
|
+
return webex.internal.mercury
|
|
672
|
+
._prepareUrl()
|
|
650
673
|
.then((wsUrl) => assert.match(wsUrl, /example-2.com/));
|
|
651
674
|
});
|
|
652
675
|
});
|
|
653
676
|
|
|
654
|
-
describe(
|
|
677
|
+
describe("when 'web-shared-socket' is enabled", () => {
|
|
655
678
|
beforeEach(() => {
|
|
656
679
|
webex.internal.feature.getFeature.returns(Promise.resolve(true));
|
|
657
680
|
});
|
|
658
681
|
|
|
659
|
-
it('requests shared socket support', () =>
|
|
660
|
-
.
|
|
682
|
+
it('requests shared socket support', () =>
|
|
683
|
+
webex.internal.mercury
|
|
684
|
+
._prepareUrl()
|
|
685
|
+
.then((wsUrl) => assert.match(wsUrl, /isRegistrationRefreshEnabled=true/)));
|
|
661
686
|
|
|
662
|
-
it('requests the registration banner', () =>
|
|
663
|
-
.
|
|
687
|
+
it('requests the registration banner', () =>
|
|
688
|
+
webex.internal.mercury
|
|
689
|
+
._prepareUrl()
|
|
690
|
+
.then((wsUrl) => assert.match(wsUrl, /mercuryRegistrationStatus=true/)));
|
|
664
691
|
|
|
665
|
-
it('does not request the buffer state message', () =>
|
|
666
|
-
.then((wsUrl) => {
|
|
692
|
+
it('does not request the buffer state message', () =>
|
|
693
|
+
webex.internal.mercury._prepareUrl().then((wsUrl) => {
|
|
667
694
|
assert.match(wsUrl, /mercuryRegistrationStatus=true/);
|
|
668
695
|
assert.notMatch(wsUrl, /bufferStates/);
|
|
669
696
|
}));
|
|
@@ -674,8 +701,10 @@ describe('plugin-mercury', () => {
|
|
|
674
701
|
webex.config.device.ephemeral = true;
|
|
675
702
|
});
|
|
676
703
|
|
|
677
|
-
it('indicates multiple connections may be coming from this user', () =>
|
|
678
|
-
.
|
|
704
|
+
it('indicates multiple connections may be coming from this user', () =>
|
|
705
|
+
webex.internal.mercury
|
|
706
|
+
._prepareUrl()
|
|
707
|
+
.then((wsUrl) => assert.match(wsUrl, /multipleConnections/)));
|
|
679
708
|
});
|
|
680
709
|
});
|
|
681
710
|
});
|