@webex/internal-plugin-mercury 2.60.0 → 2.60.1-next.10
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/config.js +1 -2
- package/dist/config.js.map +1 -1
- package/dist/errors.js +8 -11
- package/dist/errors.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mercury.js +56 -62
- package/dist/mercury.js.map +1 -1
- package/dist/socket/socket-base.js +57 -42
- package/dist/socket/socket-base.js.map +1 -1
- package/dist/socket/socket.js +1 -2
- package/dist/socket/socket.js.map +1 -1
- package/dist/socket/socket.shim.js +1 -2
- package/dist/socket/socket.shim.js.map +1 -1
- package/package.json +25 -24
- package/src/mercury.js +43 -51
- package/src/socket/socket-base.js +61 -28
- package/test/integration/spec/webex.js +3 -2
- package/test/unit/spec/mercury.js +115 -9
- package/test/unit/spec/socket.js +17 -0
|
@@ -32,12 +32,13 @@ describe('plugin-mercury', function () {
|
|
|
32
32
|
);
|
|
33
33
|
|
|
34
34
|
describe('onBeforeLogout()', () => {
|
|
35
|
-
it('disconnects the web socket', () =>
|
|
35
|
+
it('disconnects the web socket', () => {
|
|
36
36
|
webex.logout({noRedirect: true}).then(() => {
|
|
37
37
|
assert.called(webex.internal.mercury.disconnect);
|
|
38
38
|
assert.isFalse(webex.internal.mercury.connected);
|
|
39
39
|
assert.called(webex.internal.device.unregister);
|
|
40
40
|
assert.isFalse(webex.internal.device.registered);
|
|
41
|
-
})
|
|
41
|
+
});
|
|
42
|
+
});
|
|
42
43
|
});
|
|
43
44
|
});
|
|
@@ -452,11 +452,13 @@ describe('plugin-mercury', () => {
|
|
|
452
452
|
});
|
|
453
453
|
|
|
454
454
|
describe.skip('#disconnect()', () => {
|
|
455
|
-
it('disconnects the WebSocket', () =>
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
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();
|
|
460
462
|
|
|
461
463
|
mockWebSocket.emit('close', {
|
|
462
464
|
code: 1000,
|
|
@@ -558,7 +560,7 @@ describe('plugin-mercury', () => {
|
|
|
558
560
|
return promiseTick(webex.internal.mercury.config.backoffTimeReset).then(() => {
|
|
559
561
|
assert.equal(
|
|
560
562
|
reason.message,
|
|
561
|
-
'
|
|
563
|
+
'Mercury: prevent socket open when backoffCall no longer defined'
|
|
562
564
|
);
|
|
563
565
|
});
|
|
564
566
|
});
|
|
@@ -566,12 +568,21 @@ describe('plugin-mercury', () => {
|
|
|
566
568
|
});
|
|
567
569
|
|
|
568
570
|
describe('#_emit()', () => {
|
|
569
|
-
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'};
|
|
570
574
|
mercury.on('break', () => {
|
|
571
|
-
throw
|
|
575
|
+
throw error;
|
|
572
576
|
});
|
|
577
|
+
sinon.stub(mercury.logger, 'error');
|
|
573
578
|
|
|
574
|
-
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
|
+
});
|
|
575
586
|
});
|
|
576
587
|
});
|
|
577
588
|
|
|
@@ -706,4 +717,99 @@ describe('plugin-mercury', () => {
|
|
|
706
717
|
});
|
|
707
718
|
});
|
|
708
719
|
});
|
|
720
|
+
describe('ping pong latency event is forwarded', () => {
|
|
721
|
+
let clock, mercury, mockWebSocket, socketOpenStub, webex;
|
|
722
|
+
|
|
723
|
+
const statusStartTypingMessage = JSON.stringify({
|
|
724
|
+
id: uuid.v4(),
|
|
725
|
+
data: {
|
|
726
|
+
eventType: 'status.start_typing',
|
|
727
|
+
actor: {
|
|
728
|
+
id: 'actorId',
|
|
729
|
+
},
|
|
730
|
+
conversationId: uuid.v4(),
|
|
731
|
+
},
|
|
732
|
+
timestamp: Date.now(),
|
|
733
|
+
trackingId: `suffix_${uuid.v4()}_${Date.now()}`,
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
beforeEach(() => {
|
|
737
|
+
clock = FakeTimers.install({now: Date.now()});
|
|
738
|
+
});
|
|
739
|
+
|
|
740
|
+
afterEach(() => {
|
|
741
|
+
clock.uninstall();
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
beforeEach(() => {
|
|
745
|
+
webex = new MockWebex({
|
|
746
|
+
children: {
|
|
747
|
+
mercury: Mercury,
|
|
748
|
+
},
|
|
749
|
+
});
|
|
750
|
+
webex.credentials = {
|
|
751
|
+
refresh: sinon.stub().returns(Promise.resolve()),
|
|
752
|
+
getUserToken: sinon.stub().returns(
|
|
753
|
+
Promise.resolve({
|
|
754
|
+
toString() {
|
|
755
|
+
return 'Bearer FAKE';
|
|
756
|
+
},
|
|
757
|
+
})
|
|
758
|
+
),
|
|
759
|
+
};
|
|
760
|
+
webex.internal.device = {
|
|
761
|
+
register: sinon.stub().returns(Promise.resolve()),
|
|
762
|
+
refresh: sinon.stub().returns(Promise.resolve()),
|
|
763
|
+
webSocketUrl: 'ws://example.com',
|
|
764
|
+
getWebSocketUrl: sinon.stub().returns(Promise.resolve('ws://example-2.com')),
|
|
765
|
+
useServiceCatalogUrl: sinon
|
|
766
|
+
.stub()
|
|
767
|
+
.returns(Promise.resolve('https://service-catalog-url.com')),
|
|
768
|
+
};
|
|
769
|
+
webex.internal.services = {
|
|
770
|
+
convertUrlToPriorityHostUrl: sinon.stub().returns(Promise.resolve('ws://example-2.com')),
|
|
771
|
+
markFailedUrl: sinon.stub().returns(Promise.resolve()),
|
|
772
|
+
};
|
|
773
|
+
webex.internal.metrics.submitClientMetrics = sinon.stub();
|
|
774
|
+
webex.trackingId = 'fakeTrackingId';
|
|
775
|
+
webex.config.mercury = mercuryConfig.mercury;
|
|
776
|
+
|
|
777
|
+
webex.logger = console;
|
|
778
|
+
|
|
779
|
+
mockWebSocket = new MockWebSocket();
|
|
780
|
+
sinon.stub(Socket, 'getWebSocketConstructor').returns(() => mockWebSocket);
|
|
781
|
+
|
|
782
|
+
const origOpen = Socket.prototype.open;
|
|
783
|
+
|
|
784
|
+
socketOpenStub = sinon.stub(Socket.prototype, 'open').callsFake(function (...args) {
|
|
785
|
+
const promise = Reflect.apply(origOpen, this, args);
|
|
786
|
+
|
|
787
|
+
process.nextTick(() => mockWebSocket.open());
|
|
788
|
+
|
|
789
|
+
return promise;
|
|
790
|
+
});
|
|
791
|
+
|
|
792
|
+
mercury = webex.internal.mercury;
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
afterEach(() => {
|
|
796
|
+
if (socketOpenStub) {
|
|
797
|
+
socketOpenStub.restore();
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
if (Socket.getWebSocketConstructor.restore) {
|
|
801
|
+
Socket.getWebSocketConstructor.restore();
|
|
802
|
+
}
|
|
803
|
+
});
|
|
804
|
+
it('should forward ping pong latency event', () => {
|
|
805
|
+
const spy = sinon.spy();
|
|
806
|
+
|
|
807
|
+
mercury.on('ping-pong-latency', spy);
|
|
808
|
+
|
|
809
|
+
return mercury.connect().then(() => {
|
|
810
|
+
assert.calledWith(spy, 0);
|
|
811
|
+
assert.calledOnce(spy);
|
|
812
|
+
});
|
|
813
|
+
});
|
|
814
|
+
});
|
|
709
815
|
});
|
package/test/unit/spec/socket.js
CHANGED
|
@@ -807,6 +807,23 @@ describe('plugin-mercury', () => {
|
|
|
807
807
|
reason: 'Pong mismatch',
|
|
808
808
|
});
|
|
809
809
|
});
|
|
810
|
+
|
|
811
|
+
it('emits ping pong latency correctly', () => {
|
|
812
|
+
const spy = sinon.spy();
|
|
813
|
+
|
|
814
|
+
socket.on('ping-pong-latency', spy);
|
|
815
|
+
|
|
816
|
+
socket._ping(123);
|
|
817
|
+
mockWebSocket.emit('message', {
|
|
818
|
+
data: JSON.stringify({
|
|
819
|
+
type: 'pong',
|
|
820
|
+
id: 123,
|
|
821
|
+
}),
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
assert.calledWith(spy, 0);
|
|
825
|
+
assert.calledOnce(spy);
|
|
826
|
+
});
|
|
810
827
|
});
|
|
811
828
|
});
|
|
812
829
|
});
|