@webex/internal-plugin-mercury 3.0.0-beta.3 → 3.0.0-beta.300
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 +67 -178
- 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 +58 -143
- 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/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 +108 -84
- package/src/socket/socket-base.js +93 -71
- 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 +10 -8
- package/test/unit/spec/mercury-events.js +51 -60
- package/test/unit/spec/mercury.js +191 -153
- 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,21 +557,32 @@ 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
|
});
|
|
557
569
|
|
|
558
570
|
describe('#_emit()', () => {
|
|
559
|
-
it('emits Error-safe events', () => {
|
|
571
|
+
it('emits Error-safe events and log the error with the call parameters', () => {
|
|
572
|
+
const error = 'error';
|
|
573
|
+
const event = {data: 'some data'};
|
|
560
574
|
mercury.on('break', () => {
|
|
561
|
-
throw
|
|
575
|
+
throw error;
|
|
562
576
|
});
|
|
577
|
+
sinon.stub(mercury.logger, 'error');
|
|
563
578
|
|
|
564
|
-
return Promise.resolve(mercury._emit('break'))
|
|
579
|
+
return Promise.resolve(mercury._emit('break', event)).then((res) => {
|
|
580
|
+
assert.calledWith(mercury.logger.error, 'Mercury: error occurred in event handler', {
|
|
581
|
+
error,
|
|
582
|
+
arguments: ['break', event],
|
|
583
|
+
});
|
|
584
|
+
return res;
|
|
585
|
+
});
|
|
565
586
|
});
|
|
566
587
|
});
|
|
567
588
|
|
|
@@ -572,11 +593,11 @@ describe('plugin-mercury', () => {
|
|
|
572
593
|
it('merges a single header field with data', () => {
|
|
573
594
|
const envelope = {
|
|
574
595
|
headers: {
|
|
575
|
-
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate
|
|
596
|
+
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
|
|
576
597
|
},
|
|
577
598
|
data: {
|
|
578
|
-
activity: {}
|
|
579
|
-
}
|
|
599
|
+
activity: {},
|
|
600
|
+
},
|
|
580
601
|
};
|
|
581
602
|
|
|
582
603
|
mercury._applyOverrides(envelope);
|
|
@@ -588,27 +609,30 @@ describe('plugin-mercury', () => {
|
|
|
588
609
|
const envelope = {
|
|
589
610
|
headers: {
|
|
590
611
|
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
|
|
591
|
-
'data.activity.target.lastReadableActivityDate': lastReadableActivityDate
|
|
612
|
+
'data.activity.target.lastReadableActivityDate': lastReadableActivityDate,
|
|
592
613
|
},
|
|
593
614
|
data: {
|
|
594
|
-
activity: {}
|
|
595
|
-
}
|
|
615
|
+
activity: {},
|
|
616
|
+
},
|
|
596
617
|
};
|
|
597
618
|
|
|
598
619
|
mercury._applyOverrides(envelope);
|
|
599
620
|
|
|
600
621
|
assert.equal(envelope.data.activity.target.lastSeenActivityDate, lastSeenActivityDate);
|
|
601
|
-
assert.equal(
|
|
622
|
+
assert.equal(
|
|
623
|
+
envelope.data.activity.target.lastReadableActivityDate,
|
|
624
|
+
lastReadableActivityDate
|
|
625
|
+
);
|
|
602
626
|
});
|
|
603
627
|
|
|
604
628
|
it('merges headers when Mercury messages arrive', () => {
|
|
605
629
|
const envelope = {
|
|
606
630
|
headers: {
|
|
607
|
-
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate
|
|
631
|
+
'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
|
|
608
632
|
},
|
|
609
633
|
data: {
|
|
610
|
-
activity: {}
|
|
611
|
-
}
|
|
634
|
+
activity: {},
|
|
635
|
+
},
|
|
612
636
|
};
|
|
613
637
|
|
|
614
638
|
mercury._applyOverrides(envelope);
|
|
@@ -622,19 +646,24 @@ describe('plugin-mercury', () => {
|
|
|
622
646
|
webex.internal.device.webSocketUrl = 'ws://example.com';
|
|
623
647
|
});
|
|
624
648
|
|
|
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
|
-
.
|
|
649
|
+
it('uses device default webSocketUrl', () =>
|
|
650
|
+
webex.internal.mercury._prepareUrl().then((wsUrl) => assert.match(wsUrl, /example.com/)));
|
|
651
|
+
it('uses provided webSocketUrl', () =>
|
|
652
|
+
webex.internal.mercury
|
|
653
|
+
._prepareUrl('ws://provided.com')
|
|
654
|
+
.then((wsUrl) => assert.match(wsUrl, /provided.com/)));
|
|
655
|
+
it('requests text-mode WebSockets', () =>
|
|
656
|
+
webex.internal.mercury
|
|
657
|
+
._prepareUrl()
|
|
658
|
+
.then((wsUrl) => assert.match(wsUrl, /outboundWireFormat=text/)));
|
|
659
|
+
|
|
660
|
+
it('requests the buffer state message', () =>
|
|
661
|
+
webex.internal.mercury
|
|
662
|
+
._prepareUrl()
|
|
663
|
+
.then((wsUrl) => assert.match(wsUrl, /bufferStates=true/)));
|
|
664
|
+
|
|
665
|
+
it('does not add conditional properties', () =>
|
|
666
|
+
webex.internal.mercury._prepareUrl().then((wsUrl) => {
|
|
638
667
|
assert.notMatch(wsUrl, /mercuryRegistrationStatus/);
|
|
639
668
|
assert.notMatch(wsUrl, /mercuryRegistrationStatus/);
|
|
640
669
|
assert.notMatch(wsUrl, /isRegistrationRefreshEnabled/);
|
|
@@ -643,27 +672,34 @@ describe('plugin-mercury', () => {
|
|
|
643
672
|
|
|
644
673
|
describe('when web-high-availability is enabled', () => {
|
|
645
674
|
it('uses webSocketUrl provided by device', () => {
|
|
646
|
-
webex.internal.device.useServiceCatalogUrl = sinon
|
|
675
|
+
webex.internal.device.useServiceCatalogUrl = sinon
|
|
676
|
+
.stub()
|
|
677
|
+
.returns(Promise.resolve('ws://example-2.com'));
|
|
647
678
|
webex.internal.feature.getFeature.onCall(0).returns(Promise.resolve(true));
|
|
648
679
|
|
|
649
|
-
return webex.internal.mercury
|
|
680
|
+
return webex.internal.mercury
|
|
681
|
+
._prepareUrl()
|
|
650
682
|
.then((wsUrl) => assert.match(wsUrl, /example-2.com/));
|
|
651
683
|
});
|
|
652
684
|
});
|
|
653
685
|
|
|
654
|
-
describe(
|
|
686
|
+
describe("when 'web-shared-socket' is enabled", () => {
|
|
655
687
|
beforeEach(() => {
|
|
656
688
|
webex.internal.feature.getFeature.returns(Promise.resolve(true));
|
|
657
689
|
});
|
|
658
690
|
|
|
659
|
-
it('requests shared socket support', () =>
|
|
660
|
-
.
|
|
691
|
+
it('requests shared socket support', () =>
|
|
692
|
+
webex.internal.mercury
|
|
693
|
+
._prepareUrl()
|
|
694
|
+
.then((wsUrl) => assert.match(wsUrl, /isRegistrationRefreshEnabled=true/)));
|
|
661
695
|
|
|
662
|
-
it('requests the registration banner', () =>
|
|
663
|
-
.
|
|
696
|
+
it('requests the registration banner', () =>
|
|
697
|
+
webex.internal.mercury
|
|
698
|
+
._prepareUrl()
|
|
699
|
+
.then((wsUrl) => assert.match(wsUrl, /mercuryRegistrationStatus=true/)));
|
|
664
700
|
|
|
665
|
-
it('does not request the buffer state message', () =>
|
|
666
|
-
.then((wsUrl) => {
|
|
701
|
+
it('does not request the buffer state message', () =>
|
|
702
|
+
webex.internal.mercury._prepareUrl().then((wsUrl) => {
|
|
667
703
|
assert.match(wsUrl, /mercuryRegistrationStatus=true/);
|
|
668
704
|
assert.notMatch(wsUrl, /bufferStates/);
|
|
669
705
|
}));
|
|
@@ -674,8 +710,10 @@ describe('plugin-mercury', () => {
|
|
|
674
710
|
webex.config.device.ephemeral = true;
|
|
675
711
|
});
|
|
676
712
|
|
|
677
|
-
it('indicates multiple connections may be coming from this user', () =>
|
|
678
|
-
.
|
|
713
|
+
it('indicates multiple connections may be coming from this user', () =>
|
|
714
|
+
webex.internal.mercury
|
|
715
|
+
._prepareUrl()
|
|
716
|
+
.then((wsUrl) => assert.match(wsUrl, /multipleConnections/)));
|
|
679
717
|
});
|
|
680
718
|
});
|
|
681
719
|
});
|