@webex/calling 3.12.0-mobius-socket.10 → 3.12.0-mobius-socket.12

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.
Files changed (81) hide show
  1. package/dist/CallingClient/CallingClient.test.js +2 -2
  2. package/dist/CallingClient/CallingClient.test.js.map +1 -1
  3. package/dist/CallingClient/calling/call.test.js +1 -1
  4. package/dist/CallingClient/calling/call.test.js.map +1 -1
  5. package/dist/CallingClient/line/line.test.js +2 -2
  6. package/dist/CallingClient/line/line.test.js.map +1 -1
  7. package/dist/CallingClient/registration/register.js +76 -43
  8. package/dist/CallingClient/registration/register.js.map +1 -1
  9. package/dist/CallingClient/registration/register.test.js +1 -1
  10. package/dist/CallingClient/registration/register.test.js.map +1 -1
  11. package/dist/CallingClient/registration/types.js.map +1 -1
  12. package/dist/CallingClient/utils/request.js +2 -2
  13. package/dist/CallingClient/utils/request.js.map +1 -1
  14. package/dist/common/Utils.js +70 -30
  15. package/dist/common/Utils.js.map +1 -1
  16. package/dist/mobius-socket/config.js +61 -0
  17. package/dist/mobius-socket/config.js.map +1 -0
  18. package/dist/mobius-socket/errors.js +106 -0
  19. package/dist/mobius-socket/errors.js.map +1 -0
  20. package/dist/mobius-socket/index.js +101 -0
  21. package/dist/mobius-socket/index.js.map +1 -0
  22. package/dist/mobius-socket/mobius-socket-events.test.js +511 -0
  23. package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -0
  24. package/dist/mobius-socket/mobius-socket.js +1191 -0
  25. package/dist/mobius-socket/mobius-socket.js.map +1 -0
  26. package/dist/mobius-socket/mobius-socket.test.js +2107 -0
  27. package/dist/mobius-socket/mobius-socket.test.js.map +1 -0
  28. package/dist/mobius-socket/socket/constants.js +20 -0
  29. package/dist/mobius-socket/socket/constants.js.map +1 -0
  30. package/dist/mobius-socket/socket/index.js +15 -0
  31. package/dist/mobius-socket/socket/index.js.map +1 -0
  32. package/dist/mobius-socket/socket/socket-base.js +632 -0
  33. package/dist/mobius-socket/socket/socket-base.js.map +1 -0
  34. package/dist/mobius-socket/socket/socket.js +19 -0
  35. package/dist/mobius-socket/socket/socket.js.map +1 -0
  36. package/dist/mobius-socket/socket/socket.shim.js +36 -0
  37. package/dist/mobius-socket/socket/socket.shim.js.map +1 -0
  38. package/dist/mobius-socket/socket.test.js +752 -0
  39. package/dist/mobius-socket/socket.test.js.map +1 -0
  40. package/dist/mobius-socket/test/mocha-helpers.js +23 -0
  41. package/dist/mobius-socket/test/mocha-helpers.js.map +1 -0
  42. package/dist/mobius-socket/test/promise-tick.js +29 -0
  43. package/dist/mobius-socket/test/promise-tick.js.map +1 -0
  44. package/dist/module/CallingClient/registration/register.js +30 -7
  45. package/dist/module/CallingClient/utils/request.js +1 -1
  46. package/dist/module/common/Utils.js +17 -4
  47. package/dist/module/mobius-socket/config.js +18 -0
  48. package/dist/module/mobius-socket/errors.js +30 -0
  49. package/dist/module/mobius-socket/index.js +24 -0
  50. package/dist/module/mobius-socket/mobius-socket.js +761 -0
  51. package/dist/module/mobius-socket/socket/constants.js +10 -0
  52. package/dist/module/mobius-socket/socket/index.js +4 -0
  53. package/dist/module/mobius-socket/socket/socket-base.js +374 -0
  54. package/dist/module/mobius-socket/socket/socket.js +9 -0
  55. package/dist/module/mobius-socket/socket/socket.shim.js +24 -0
  56. package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
  57. package/dist/types/CallingClient/registration/types.d.ts +1 -1
  58. package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
  59. package/dist/types/common/Utils.d.ts +4 -1
  60. package/dist/types/common/Utils.d.ts.map +1 -1
  61. package/dist/types/mobius-socket/config.d.ts +15 -0
  62. package/dist/types/mobius-socket/config.d.ts.map +1 -0
  63. package/dist/types/mobius-socket/errors.d.ts +13 -0
  64. package/dist/types/mobius-socket/errors.d.ts.map +1 -0
  65. package/dist/types/mobius-socket/index.d.ts +9 -0
  66. package/dist/types/mobius-socket/index.d.ts.map +1 -0
  67. package/dist/types/mobius-socket/mobius-socket.d.ts +62 -0
  68. package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -0
  69. package/dist/types/mobius-socket/socket/constants.d.ts +11 -0
  70. package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -0
  71. package/dist/types/mobius-socket/socket/index.d.ts +2 -0
  72. package/dist/types/mobius-socket/socket/index.d.ts.map +1 -0
  73. package/dist/types/mobius-socket/socket/socket-base.d.ts +38 -0
  74. package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -0
  75. package/dist/types/mobius-socket/socket/socket.d.ts +3 -0
  76. package/dist/types/mobius-socket/socket/socket.d.ts.map +1 -0
  77. package/dist/types/mobius-socket/socket/socket.shim.d.ts +3 -0
  78. package/dist/types/mobius-socket/socket/socket.shim.d.ts.map +1 -0
  79. package/package.json +16 -3
  80. package/src/mobius-socket/socket/socket.js +13 -0
  81. package/src/mobius-socket/socket/socket.shim.js +31 -0
@@ -0,0 +1,511 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
4
+ var _Object$keys = require("@babel/runtime-corejs2/core-js/object/keys");
5
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
7
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
8
+ var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
9
+ var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property");
10
+ var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
11
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
12
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property"));
14
+ var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));
15
+ var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
16
+ var _apply = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/apply"));
17
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
18
+ var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
19
+ var _construct2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/construct"));
20
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
21
+ var _wrap2 = _interopRequireDefault(require("lodash/wrap"));
22
+ var _crypto = require("crypto");
23
+ var _sinon = _interopRequireDefault(require("sinon"));
24
+ var _testHelperChai = require("@webex/test-helper-chai");
25
+ var _testHelperMockWebex = _interopRequireDefault(require("@webex/test-helper-mock-webex"));
26
+ var _testHelperMockWebSocket = _interopRequireDefault(require("@webex/test-helper-mock-web-socket"));
27
+ var _index = _interopRequireWildcard(require("./index"));
28
+ var _constants = require("./socket/constants");
29
+ var _promiseTick = _interopRequireDefault(require("./test/promise-tick"));
30
+ function _interopRequireWildcard(e, t) { if ("function" == typeof _WeakMap) var r = new _WeakMap(), n = new _WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = _Object$defineProperty2) && _Object$getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
31
+ function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
32
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty3.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty2(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; } /*!
33
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
34
+ */
35
+ if (!crypto.randomUUID) {
36
+ (0, _defineProperty2.default)(crypto, 'randomUUID', {
37
+ value: _crypto.randomUUID,
38
+ configurable: true
39
+ });
40
+ }
41
+ describe('plugin-mobiusSocket', function () {
42
+ var createUuid = function createUuid() {
43
+ return crypto.randomUUID();
44
+ };
45
+ describe('MobiusSocket', function () {
46
+ describe('Events', function () {
47
+ var mobiusSocket;
48
+ var mockWebSocket;
49
+ var originalSendSpy;
50
+ var socketOpenStub;
51
+ var usingFakeTimers;
52
+ var webex;
53
+ var fakeTestMessage = {
54
+ id: createUuid(),
55
+ data: {
56
+ eventType: 'fake.test'
57
+ },
58
+ timestamp: (0, _now.default)(),
59
+ trackingId: "suffix_".concat(createUuid(), "_").concat((0, _now.default)())
60
+ };
61
+ var statusStartTypingMessage = {
62
+ id: createUuid(),
63
+ data: {
64
+ eventType: 'status.start_typing',
65
+ actor: {
66
+ id: 'actorId'
67
+ },
68
+ conversationId: createUuid()
69
+ },
70
+ timestamp: (0, _now.default)(),
71
+ trackingId: "suffix_".concat(createUuid(), "_").concat((0, _now.default)()),
72
+ sessionId: 'mobius-websocket-session'
73
+ };
74
+ var emitAuthResponse = function emitAuthResponse() {
75
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
76
+ _ref$statusCode = _ref.statusCode,
77
+ statusCode = _ref$statusCode === void 0 ? 200 : _ref$statusCode,
78
+ _ref$statusMessage = _ref.statusMessage,
79
+ statusMessage = _ref$statusMessage === void 0 ? 'OK' : _ref$statusMessage;
80
+ var sendSpy = mockWebSocket.send.lastCall ? mockWebSocket.send : originalSendSpy;
81
+ var authRequest = JSON.parse(sendSpy.lastCall.args[0]);
82
+ mockWebSocket.emit('message', {
83
+ data: (0, _stringify.default)({
84
+ type: 'response_event',
85
+ subtype: _constants.MESSAGE_TYPES.AUTH,
86
+ trackingId: authRequest.trackingId,
87
+ statusCode: statusCode,
88
+ statusMessage: statusMessage
89
+ })
90
+ });
91
+ };
92
+ beforeEach(function () {
93
+ jest.useFakeTimers({
94
+ doNotFake: ['nextTick']
95
+ });
96
+ usingFakeTimers = true;
97
+ });
98
+ afterEach(/*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
99
+ var _t;
100
+ return _regenerator.default.wrap(function (_context) {
101
+ while (1) switch (_context.prev = _context.next) {
102
+ case 0:
103
+ if (usingFakeTimers) {
104
+ jest.useRealTimers();
105
+ usingFakeTimers = false;
106
+ }
107
+ if (!mobiusSocket) {
108
+ _context.next = 5;
109
+ break;
110
+ }
111
+ if (mobiusSocket._connectPromises) {
112
+ mobiusSocket._connectPromises.forEach(function (promise) {
113
+ promise.catch(function () {});
114
+ });
115
+ }
116
+ _context.prev = 1;
117
+ _context.next = 2;
118
+ return mobiusSocket.disconnectAll();
119
+ case 2:
120
+ _context.next = 4;
121
+ break;
122
+ case 3:
123
+ _context.prev = 3;
124
+ _t = _context["catch"](1);
125
+ case 4:
126
+ if (mobiusSocket._connectPromises) {
127
+ mobiusSocket._connectPromises.clear();
128
+ }
129
+ case 5:
130
+ if (mockWebSocket && typeof mockWebSocket.close === 'function') {
131
+ try {
132
+ mockWebSocket.close();
133
+ } catch (e) {}
134
+ }
135
+ // Restore stubs
136
+ if (_index.Socket.getWebSocketConstructor.restore) {
137
+ _index.Socket.getWebSocketConstructor.restore();
138
+ }
139
+ if (socketOpenStub && socketOpenStub.restore) {
140
+ socketOpenStub.restore();
141
+ }
142
+ case 6:
143
+ case "end":
144
+ return _context.stop();
145
+ }
146
+ }, _callee, null, [[1, 3]]);
147
+ })));
148
+ beforeEach(function () {
149
+ webex = new _testHelperMockWebex.default();
150
+ webex.internal.device.registered = true;
151
+ webex.internal.metrics.submitClientMetrics = _sinon.default.stub();
152
+ webex.trackingId = 'fakeTrackingId';
153
+ webex.logger = console;
154
+ _sinon.default.stub(_index.Socket, 'getWebSocketConstructor').callsFake(function () {
155
+ return function () {
156
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
157
+ args[_key] = arguments[_key];
158
+ }
159
+ mockWebSocket = (0, _construct2.default)(_testHelperMockWebSocket.default, args);
160
+ originalSendSpy = mockWebSocket.send;
161
+ return mockWebSocket;
162
+ };
163
+ });
164
+ var origOpen = _index.Socket.prototype.open;
165
+ socketOpenStub = _sinon.default.stub(_index.Socket.prototype, 'open').callsFake(function () {
166
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
167
+ args[_key2] = arguments[_key2];
168
+ }
169
+ var promise = (0, _apply.default)(origOpen, this, args);
170
+ process.nextTick(function () {
171
+ mockWebSocket.open();
172
+ // Simulate Mobius auth response after socket open
173
+ process.nextTick(function () {
174
+ emitAuthResponse();
175
+ });
176
+ });
177
+ return promise;
178
+ });
179
+ mobiusSocket = new _index.default(webex, _objectSpread({}, _index.config.mobiusSocket));
180
+ mobiusSocket.defaultSessionId = 'mobius-websocket-session';
181
+ });
182
+ it('removes all listeners for an event when off() is called without a listener', function () {
183
+ var firstListener = _sinon.default.stub();
184
+ var secondListener = _sinon.default.stub();
185
+ mobiusSocket.on('event:fake.test', firstListener);
186
+ mobiusSocket.on('event:fake.test', secondListener);
187
+ mobiusSocket.off('event:fake.test');
188
+ mobiusSocket.emit('event:fake.test', fakeTestMessage);
189
+ _testHelperChai.assert.notCalled(firstListener);
190
+ _testHelperChai.assert.notCalled(secondListener);
191
+ });
192
+ afterEach(function () {
193
+ if (socketOpenStub) {
194
+ socketOpenStub.restore();
195
+ }
196
+ if (_index.Socket.getWebSocketConstructor.restore) {
197
+ _index.Socket.getWebSocketConstructor.restore();
198
+ }
199
+ });
200
+ describe('when connected', function () {
201
+ it('emits the `online` event', function () {
202
+ var spy = _sinon.default.spy();
203
+ mobiusSocket.on('online', spy);
204
+ var promise = mobiusSocket.connect();
205
+ return promise.then(function () {
206
+ return _testHelperChai.assert.called(spy);
207
+ });
208
+ });
209
+ });
210
+ describe('when disconnected', function () {
211
+ it('emits the `offline` event', function () {
212
+ var spy = _sinon.default.spy();
213
+ mobiusSocket.on('offline', spy);
214
+ var promise = mobiusSocket.connect();
215
+ mockWebSocket.open();
216
+ return promise.then(function () {
217
+ var promise = mobiusSocket.disconnect();
218
+ mockWebSocket.emit('close', {
219
+ code: 1000,
220
+ reason: 'Done'
221
+ });
222
+ return promise;
223
+ }).then(function () {
224
+ return _testHelperChai.assert.calledOnce(spy);
225
+ });
226
+ });
227
+ describe('when reconnected', function () {
228
+ it('emits the `online` event', function () {
229
+ var spy = _sinon.default.spy();
230
+ mobiusSocket.on('online', spy);
231
+ var promise = mobiusSocket.connect();
232
+ mockWebSocket.open();
233
+ return promise.then(function () {
234
+ return _testHelperChai.assert.calledOnce(spy);
235
+ }).then(function () {
236
+ return mockWebSocket.emit('close', {
237
+ code: 1000,
238
+ reason: 'Idle'
239
+ });
240
+ }).then(function () {
241
+ return mobiusSocket.connect();
242
+ }).then(function () {
243
+ return _testHelperChai.assert.calledTwice(spy);
244
+ });
245
+ });
246
+ });
247
+ });
248
+ describe('when `mercury.buffer_state` is received', function () {
249
+ // This test is here because the buffer states message may arrive before
250
+ // the mobiusSocket Promise resolves.
251
+ it('gets emitted', function () {
252
+ var sendSpy;
253
+ var resolveTest;
254
+ var rejectTest;
255
+ var bufferStateSpy = _sinon.default.spy();
256
+ var onlineSpy = _sinon.default.spy();
257
+ mobiusSocket.on('event:mercury.buffer_state', bufferStateSpy);
258
+ mobiusSocket.on('online', onlineSpy);
259
+ _index.Socket.getWebSocketConstructor.callsFake(function () {
260
+ return function () {
261
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
262
+ args[_key3] = arguments[_key3];
263
+ }
264
+ mockWebSocket = (0, _construct2.default)(_testHelperMockWebSocket.default, args);
265
+ sendSpy = mockWebSocket.send;
266
+ mockWebSocket.send = (0, _wrap2.default)(mockWebSocket.send, function (fn) {
267
+ var _this = this;
268
+ for (var _len4 = arguments.length, sendArgs = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
269
+ sendArgs[_key4 - 1] = arguments[_key4];
270
+ }
271
+ process.nextTick(function () {
272
+ (0, _apply.default)(fn, _this, sendArgs);
273
+ });
274
+ });
275
+ process.nextTick(function () {
276
+ _testHelperChai.assert.isTrue(mobiusSocket.connecting, 'MobiusSocket is still connecting');
277
+ _testHelperChai.assert.isFalse(mobiusSocket.connected, 'MobiusSocket has not yet connected');
278
+ _testHelperChai.assert.notCalled(onlineSpy);
279
+ _testHelperChai.assert.lengthOf(sendSpy.args, 0, 'The client has not yet sent the auth message');
280
+ // set websocket readystate to 1 to allow a successful send message
281
+ mockWebSocket.readyState = 1;
282
+ mockWebSocket.emit('open');
283
+ mockWebSocket.emit('message', {
284
+ data: (0, _stringify.default)({
285
+ id: createUuid(),
286
+ data: {
287
+ eventType: 'mercury.buffer_state'
288
+ }
289
+ })
290
+ });
291
+ // using lengthOf because notCalled doesn't allow the helpful
292
+ // string assertion
293
+ _testHelperChai.assert.lengthOf(sendSpy.args, 0, 'The client has not acked the buffer_state message');
294
+ (0, _promiseTick.default)(1).then(function () {
295
+ _testHelperChai.assert.calledOnce(bufferStateSpy);
296
+ resolveTest();
297
+ }).catch(rejectTest);
298
+ });
299
+ return mockWebSocket;
300
+ };
301
+ });
302
+ return new _promise.default(function (resolve, reject) {
303
+ resolveTest = resolve;
304
+ rejectTest = reject;
305
+ mobiusSocket.connect().catch(function () {});
306
+ });
307
+ });
308
+ });
309
+ describe('when a CloseEvent is received', function () {
310
+ var events = [{
311
+ code: 1000,
312
+ reason: 'idle',
313
+ action: 'reconnect'
314
+ }, {
315
+ code: 1000,
316
+ reason: 'done (forced)',
317
+ action: 'reconnect'
318
+ }, {
319
+ code: 1000,
320
+ reason: 'pong not received',
321
+ action: 'close'
322
+ }, {
323
+ code: 1000,
324
+ reason: 'pong mismatch',
325
+ action: 'close'
326
+ }, {
327
+ code: 1000,
328
+ action: 'close'
329
+ }, {
330
+ code: 1003,
331
+ action: 'close'
332
+ }, {
333
+ code: 1001,
334
+ action: 'reconnect'
335
+ }, {
336
+ code: 1005,
337
+ action: 'reconnect'
338
+ }, {
339
+ code: 1006,
340
+ action: 'reconnect'
341
+ }, {
342
+ code: 1011,
343
+ action: 'reconnect'
344
+ }, {
345
+ code: 4000,
346
+ action: 'replace'
347
+ }, {
348
+ action: 'close'
349
+ }];
350
+ events.forEach(function (def) {
351
+ var action = def.action,
352
+ reason = def.reason,
353
+ code = def.code;
354
+ var description;
355
+ if (code && reason) {
356
+ description = "with code `".concat(code, "` and reason `").concat(reason, "`");
357
+ } else if (code) {
358
+ description = "with code `".concat(code, "`");
359
+ } else if (reason) {
360
+ description = "with reason `".concat(reason, "`");
361
+ }
362
+ describe("when an event ".concat(description, " is received"), function () {
363
+ it("takes the ".concat(action, " action"), function () {
364
+ if (mobiusSocket._reconnect.restore) {
365
+ mobiusSocket._reconnect.restore();
366
+ }
367
+ _sinon.default.spy(mobiusSocket, 'connect');
368
+ var offlineSpy = _sinon.default.spy();
369
+ var permanentSpy = _sinon.default.spy();
370
+ var transientSpy = _sinon.default.spy();
371
+ var replacedSpy = _sinon.default.spy();
372
+ mobiusSocket.on('offline', offlineSpy);
373
+ mobiusSocket.on('offline.permanent', permanentSpy);
374
+ mobiusSocket.on('offline.transient', transientSpy);
375
+ mobiusSocket.on('offline.replaced', replacedSpy);
376
+ var promise = mobiusSocket.connect();
377
+ mockWebSocket.open();
378
+ return promise.then(function () {
379
+ // Make sure mobiusSocket.connect has a call count of zero
380
+ mobiusSocket.connect.resetHistory();
381
+ mockWebSocket.emit('close', {
382
+ code: code,
383
+ reason: reason
384
+ });
385
+ return (0, _promiseTick.default)(1);
386
+ }).then(function () {
387
+ _testHelperChai.assert.called(offlineSpy);
388
+ _testHelperChai.assert.calledWith(offlineSpy, {
389
+ code: code,
390
+ reason: reason,
391
+ sessionId: 'mobius-websocket-session'
392
+ });
393
+ switch (action) {
394
+ case 'close':
395
+ _testHelperChai.assert.called(permanentSpy);
396
+ _testHelperChai.assert.notCalled(transientSpy);
397
+ _testHelperChai.assert.notCalled(replacedSpy);
398
+ break;
399
+ case 'reconnect':
400
+ _testHelperChai.assert.notCalled(permanentSpy);
401
+ _testHelperChai.assert.called(transientSpy);
402
+ _testHelperChai.assert.notCalled(replacedSpy);
403
+ break;
404
+ case 'replace':
405
+ _testHelperChai.assert.notCalled(permanentSpy);
406
+ _testHelperChai.assert.notCalled(transientSpy);
407
+ _testHelperChai.assert.called(replacedSpy);
408
+ break;
409
+ default:
410
+ (0, _testHelperChai.assert)(false, 'unreachable code reached');
411
+ }
412
+ _testHelperChai.assert.isFalse(mobiusSocket.connected, 'MobiusSocket is not connected');
413
+ if (action === 'reconnect') {
414
+ _testHelperChai.assert.called(mobiusSocket.connect);
415
+ _testHelperChai.assert.calledWith(mobiusSocket.connect, mockWebSocket.url);
416
+ _testHelperChai.assert.isTrue(mobiusSocket.connecting, 'MobiusSocket is connecting');
417
+
418
+ // Block until reconnect completes so logs don't overlap
419
+ return mobiusSocket.connect();
420
+ }
421
+ _testHelperChai.assert.notCalled(mobiusSocket.connect);
422
+ _testHelperChai.assert.isFalse(mobiusSocket.connecting, 'MobiusSocket is not connecting');
423
+ return _promise.default.resolve();
424
+ });
425
+ });
426
+ });
427
+ });
428
+ });
429
+ describe('when a MessageEvent is received', function () {
430
+ it('processes the Event via any autowired event handlers', function () {
431
+ webex.fake = {
432
+ processTestEvent: _sinon.default.spy()
433
+ };
434
+ var promise = mobiusSocket.connect();
435
+ mockWebSocket.open();
436
+ return promise.then(function () {
437
+ mockWebSocket.emit('message', {
438
+ data: (0, _stringify.default)(fakeTestMessage)
439
+ });
440
+ return (0, _promiseTick.default)(1);
441
+ }).then(function () {
442
+ _testHelperChai.assert.called(webex.fake.processTestEvent);
443
+ });
444
+ });
445
+ it('emits the MobiusSocket envelope', function () {
446
+ var startSpy = _sinon.default.spy();
447
+ var stopSpy = _sinon.default.spy();
448
+ mobiusSocket.on('event:status.start_typing', startSpy);
449
+ mobiusSocket.on('event:status.stop_typing', stopSpy);
450
+ var promise = mobiusSocket.connect();
451
+ mockWebSocket.open();
452
+ return promise.then(function () {
453
+ mockWebSocket.emit('message', {
454
+ data: (0, _stringify.default)(statusStartTypingMessage)
455
+ });
456
+ return (0, _promiseTick.default)(1);
457
+ }).then(function () {
458
+ _testHelperChai.assert.calledOnce(startSpy);
459
+ _testHelperChai.assert.notCalled(stopSpy);
460
+ _testHelperChai.assert.calledWith(startSpy, statusStartTypingMessage);
461
+ });
462
+ });
463
+ it("emits the MobiusSocket envelope named by the MobiusSocket event's eventType", function () {
464
+ var startSpy = _sinon.default.spy();
465
+ var stopSpy = _sinon.default.spy();
466
+ mobiusSocket.on('event:status.start_typing', startSpy);
467
+ mobiusSocket.on('event:status.stop_typing', stopSpy);
468
+ var promise = mobiusSocket.connect();
469
+ mockWebSocket.open();
470
+ return promise.then(function () {
471
+ mockWebSocket.emit('message', {
472
+ data: (0, _stringify.default)(statusStartTypingMessage)
473
+ });
474
+ return (0, _promiseTick.default)(1);
475
+ }).then(function () {
476
+ _testHelperChai.assert.calledOnce(startSpy);
477
+ _testHelperChai.assert.notCalled(stopSpy);
478
+ _testHelperChai.assert.calledWith(startSpy, statusStartTypingMessage);
479
+ });
480
+ });
481
+ });
482
+
483
+ // Mobius does not use sequence numbers, so sequence-mismatch tests are not applicable
484
+ });
485
+ });
486
+
487
+ /*
488
+ // On mobiusSocket:
489
+ online
490
+ offline
491
+ offline.transient
492
+ offline.permanent
493
+ offline.replaced
494
+ event
495
+ event:locus.participant_joined
496
+ mockWebSocket.connection-failed
497
+ mockWebSocket.sequence-mismatch
498
+ // On webex:
499
+ mobiusSocket.online
500
+ mobiusSocket.offline
501
+ mobiusSocket.offline.transient
502
+ mobiusSocket.offline.permanent
503
+ mobiusSocket.offline.replaced
504
+ mobiusSocket.event
505
+ mobiusSocket.event:locus.participant_joined
506
+ mobiusSocket.mockWebSocket.connection-failed
507
+ mobiusSocket.mockWebSocket.sequence-mismatch
508
+ // TODO go through all it(`emits...`) and make sure corresponding tests are here
509
+ */
510
+ });
511
+ //# sourceMappingURL=mobius-socket-events.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_crypto","require","_sinon","_interopRequireDefault","_testHelperChai","_testHelperMockWebex","_testHelperMockWebSocket","_index","_interopRequireWildcard","_constants","_promiseTick","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t2","hasOwnProperty","call","_Object$defineProperty2","_Object$getOwnPropertyDescriptor","ownKeys","_Object$keys","_Object$getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty3","_Object$getOwnPropertyDescriptors","_Object$defineProperties","crypto","randomUUID","_defineProperty2","value","configurable","describe","createUuid","mobiusSocket","mockWebSocket","originalSendSpy","socketOpenStub","usingFakeTimers","webex","fakeTestMessage","id","data","eventType","timestamp","_now","trackingId","concat","statusStartTypingMessage","actor","conversationId","sessionId","emitAuthResponse","_ref","undefined","_ref$statusCode","statusCode","_ref$statusMessage","statusMessage","sendSpy","send","lastCall","authRequest","JSON","parse","args","emit","_stringify","type","subtype","MESSAGE_TYPES","AUTH","beforeEach","jest","useFakeTimers","doNotFake","afterEach","_asyncToGenerator2","_regenerator","mark","_callee","_t","wrap","_context","prev","next","useRealTimers","_connectPromises","promise","catch","disconnectAll","clear","close","Socket","getWebSocketConstructor","restore","stop","MockWebex","internal","device","registered","metrics","submitClientMetrics","sinon","stub","logger","console","callsFake","_len","Array","_key","_construct2","MockWebSocket","origOpen","prototype","open","_len2","_key2","_apply","process","nextTick","MobiusSocket","mobiusConfig","defaultSessionId","it","firstListener","secondListener","on","off","assert","notCalled","spy","connect","then","called","disconnect","code","reason","calledOnce","calledTwice","resolveTest","rejectTest","bufferStateSpy","onlineSpy","_len3","_key3","_wrap2","fn","_this","_len4","sendArgs","_key4","isTrue","connecting","isFalse","connected","lengthOf","readyState","promiseTick","_promise","resolve","reject","events","action","def","description","_reconnect","offlineSpy","permanentSpy","transientSpy","replacedSpy","resetHistory","calledWith","url","fake","processTestEvent","startSpy","stopSpy"],"sources":["mobius-socket-events.test.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {randomUUID} from 'crypto';\nimport sinon from 'sinon';\nimport {assert} from '@webex/test-helper-chai';\nimport MockWebex from '@webex/test-helper-mock-webex';\nimport MockWebSocket from '@webex/test-helper-mock-web-socket';\nimport {wrap} from 'lodash';\nimport MobiusSocket, {config as mobiusConfig, Socket} from './index';\nimport {MESSAGE_TYPES} from './socket/constants';\n\nimport promiseTick from './test/promise-tick';\n\nif (!crypto.randomUUID) {\n Object.defineProperty(crypto, 'randomUUID', {\n value: randomUUID,\n configurable: true,\n });\n}\n\ndescribe('plugin-mobiusSocket', () => {\n const createUuid = () => crypto.randomUUID();\n\n describe('MobiusSocket', () => {\n describe('Events', () => {\n let mobiusSocket;\n let mockWebSocket;\n let originalSendSpy;\n let socketOpenStub;\n let usingFakeTimers;\n let webex;\n\n const fakeTestMessage = {\n id: createUuid(),\n data: {\n eventType: 'fake.test',\n },\n timestamp: Date.now(),\n trackingId: `suffix_${createUuid()}_${Date.now()}`,\n };\n\n const statusStartTypingMessage = {\n id: createUuid(),\n data: {\n eventType: 'status.start_typing',\n actor: {\n id: 'actorId',\n },\n conversationId: createUuid(),\n },\n timestamp: Date.now(),\n trackingId: `suffix_${createUuid()}_${Date.now()}`,\n sessionId: 'mobius-websocket-session',\n };\n\n const emitAuthResponse = ({statusCode = 200, statusMessage = 'OK'} = {}) => {\n const sendSpy = mockWebSocket.send.lastCall ? mockWebSocket.send : originalSendSpy;\n const authRequest = JSON.parse(sendSpy.lastCall.args[0]);\n\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'response_event',\n subtype: MESSAGE_TYPES.AUTH,\n trackingId: authRequest.trackingId,\n statusCode,\n statusMessage,\n }),\n });\n };\n\n beforeEach(() => {\n jest.useFakeTimers({doNotFake: ['nextTick']});\n usingFakeTimers = true;\n });\n\n afterEach(async () => {\n if (usingFakeTimers) {\n jest.useRealTimers();\n usingFakeTimers = false;\n }\n if (mobiusSocket) {\n if (mobiusSocket._connectPromises) {\n mobiusSocket._connectPromises.forEach((promise) => {\n promise.catch(() => {});\n });\n }\n try {\n await mobiusSocket.disconnectAll();\n } catch (e) {}\n if (mobiusSocket._connectPromises) {\n mobiusSocket._connectPromises.clear();\n }\n }\n if (mockWebSocket && typeof mockWebSocket.close === 'function') {\n try {\n mockWebSocket.close();\n } catch (e) {}\n }\n // Restore stubs\n if (Socket.getWebSocketConstructor.restore) {\n Socket.getWebSocketConstructor.restore();\n }\n if (socketOpenStub && socketOpenStub.restore) {\n socketOpenStub.restore();\n }\n });\n\n beforeEach(() => {\n webex = new MockWebex();\n\n webex.internal.device.registered = true;\n webex.internal.metrics.submitClientMetrics = sinon.stub();\n webex.trackingId = 'fakeTrackingId';\n\n webex.logger = console;\n\n sinon.stub(Socket, 'getWebSocketConstructor').callsFake(\n () =>\n function (...args) {\n mockWebSocket = new MockWebSocket(...args);\n originalSendSpy = mockWebSocket.send;\n\n return mockWebSocket;\n }\n );\n\n const origOpen = Socket.prototype.open;\n\n socketOpenStub = sinon.stub(Socket.prototype, 'open').callsFake(function (...args) {\n const promise = Reflect.apply(origOpen, this, args);\n\n process.nextTick(() => {\n mockWebSocket.open();\n // Simulate Mobius auth response after socket open\n process.nextTick(() => {\n emitAuthResponse();\n });\n });\n\n return promise;\n });\n\n mobiusSocket = new MobiusSocket(webex, {...mobiusConfig.mobiusSocket});\n mobiusSocket.defaultSessionId = 'mobius-websocket-session';\n });\n\n it('removes all listeners for an event when off() is called without a listener', () => {\n const firstListener = sinon.stub();\n const secondListener = sinon.stub();\n\n mobiusSocket.on('event:fake.test', firstListener);\n mobiusSocket.on('event:fake.test', secondListener);\n\n mobiusSocket.off('event:fake.test');\n mobiusSocket.emit('event:fake.test', fakeTestMessage);\n\n assert.notCalled(firstListener);\n assert.notCalled(secondListener);\n });\n\n afterEach(() => {\n if (socketOpenStub) {\n socketOpenStub.restore();\n }\n\n if (Socket.getWebSocketConstructor.restore) {\n Socket.getWebSocketConstructor.restore();\n }\n });\n\n describe('when connected', () => {\n it('emits the `online` event', () => {\n const spy = sinon.spy();\n\n mobiusSocket.on('online', spy);\n const promise = mobiusSocket.connect();\n\n return promise.then(() => assert.called(spy));\n });\n });\n\n describe('when disconnected', () => {\n it('emits the `offline` event', () => {\n const spy = sinon.spy();\n\n mobiusSocket.on('offline', spy);\n const promise = mobiusSocket.connect();\n\n mockWebSocket.open();\n\n return promise\n .then(() => {\n const promise = mobiusSocket.disconnect();\n\n mockWebSocket.emit('close', {\n code: 1000,\n reason: 'Done',\n });\n\n return promise;\n })\n .then(() => assert.calledOnce(spy));\n });\n\n describe('when reconnected', () => {\n it('emits the `online` event', () => {\n const spy = sinon.spy();\n\n mobiusSocket.on('online', spy);\n\n const promise = mobiusSocket.connect();\n\n mockWebSocket.open();\n\n return promise\n .then(() => assert.calledOnce(spy))\n .then(() => mockWebSocket.emit('close', {code: 1000, reason: 'Idle'}))\n .then(() => mobiusSocket.connect())\n .then(() => assert.calledTwice(spy));\n });\n });\n });\n\n describe('when `mercury.buffer_state` is received', () => {\n // This test is here because the buffer states message may arrive before\n // the mobiusSocket Promise resolves.\n it('gets emitted', () => {\n let sendSpy;\n let resolveTest;\n let rejectTest;\n const bufferStateSpy = sinon.spy();\n const onlineSpy = sinon.spy();\n\n mobiusSocket.on('event:mercury.buffer_state', bufferStateSpy);\n mobiusSocket.on('online', onlineSpy);\n\n Socket.getWebSocketConstructor.callsFake(\n () =>\n function (...args) {\n mockWebSocket = new MockWebSocket(...args);\n sendSpy = mockWebSocket.send;\n mockWebSocket.send = wrap(mockWebSocket.send, function (fn, ...sendArgs) {\n process.nextTick(() => {\n Reflect.apply(fn, this, sendArgs);\n });\n });\n\n process.nextTick(() => {\n assert.isTrue(mobiusSocket.connecting, 'MobiusSocket is still connecting');\n assert.isFalse(mobiusSocket.connected, 'MobiusSocket has not yet connected');\n assert.notCalled(onlineSpy);\n assert.lengthOf(sendSpy.args, 0, 'The client has not yet sent the auth message');\n // set websocket readystate to 1 to allow a successful send message\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n id: createUuid(),\n data: {\n eventType: 'mercury.buffer_state',\n },\n }),\n });\n // using lengthOf because notCalled doesn't allow the helpful\n // string assertion\n assert.lengthOf(\n sendSpy.args,\n 0,\n 'The client has not acked the buffer_state message'\n );\n\n promiseTick(1)\n .then(() => {\n assert.calledOnce(bufferStateSpy);\n resolveTest();\n })\n .catch(rejectTest);\n });\n\n return mockWebSocket;\n }\n );\n\n return new Promise((resolve, reject) => {\n resolveTest = resolve;\n rejectTest = reject;\n mobiusSocket.connect().catch(() => {});\n });\n });\n });\n\n describe('when a CloseEvent is received', () => {\n const events = [\n {\n code: 1000,\n reason: 'idle',\n action: 'reconnect',\n },\n {\n code: 1000,\n reason: 'done (forced)',\n action: 'reconnect',\n },\n {\n code: 1000,\n reason: 'pong not received',\n action: 'close',\n },\n {\n code: 1000,\n reason: 'pong mismatch',\n action: 'close',\n },\n {\n code: 1000,\n action: 'close',\n },\n {\n code: 1003,\n action: 'close',\n },\n {\n code: 1001,\n action: 'reconnect',\n },\n {\n code: 1005,\n action: 'reconnect',\n },\n {\n code: 1006,\n action: 'reconnect',\n },\n {\n code: 1011,\n action: 'reconnect',\n },\n {\n code: 4000,\n action: 'replace',\n },\n {\n action: 'close',\n },\n ];\n\n events.forEach((def) => {\n const {action, reason, code} = def;\n let description;\n\n if (code && reason) {\n description = `with code \\`${code}\\` and reason \\`${reason}\\``;\n } else if (code) {\n description = `with code \\`${code}\\``;\n } else if (reason) {\n description = `with reason \\`${reason}\\``;\n }\n\n describe(`when an event ${description} is received`, () => {\n it(`takes the ${action} action`, () => {\n if (mobiusSocket._reconnect.restore) {\n mobiusSocket._reconnect.restore();\n }\n\n sinon.spy(mobiusSocket, 'connect');\n\n const offlineSpy = sinon.spy();\n const permanentSpy = sinon.spy();\n const transientSpy = sinon.spy();\n const replacedSpy = sinon.spy();\n\n mobiusSocket.on('offline', offlineSpy);\n mobiusSocket.on('offline.permanent', permanentSpy);\n mobiusSocket.on('offline.transient', transientSpy);\n mobiusSocket.on('offline.replaced', replacedSpy);\n\n const promise = mobiusSocket.connect();\n\n mockWebSocket.open();\n\n return promise\n .then(() => {\n // Make sure mobiusSocket.connect has a call count of zero\n mobiusSocket.connect.resetHistory();\n\n mockWebSocket.emit('close', {code, reason});\n\n return promiseTick(1);\n })\n .then(() => {\n assert.called(offlineSpy);\n assert.calledWith(offlineSpy, {\n code,\n reason,\n sessionId: 'mobius-websocket-session',\n });\n switch (action) {\n case 'close':\n assert.called(permanentSpy);\n assert.notCalled(transientSpy);\n assert.notCalled(replacedSpy);\n break;\n case 'reconnect':\n assert.notCalled(permanentSpy);\n assert.called(transientSpy);\n assert.notCalled(replacedSpy);\n break;\n case 'replace':\n assert.notCalled(permanentSpy);\n assert.notCalled(transientSpy);\n assert.called(replacedSpy);\n break;\n default:\n assert(false, 'unreachable code reached');\n }\n assert.isFalse(mobiusSocket.connected, 'MobiusSocket is not connected');\n if (action === 'reconnect') {\n assert.called(mobiusSocket.connect);\n assert.calledWith(mobiusSocket.connect, mockWebSocket.url);\n assert.isTrue(mobiusSocket.connecting, 'MobiusSocket is connecting');\n\n // Block until reconnect completes so logs don't overlap\n return mobiusSocket.connect();\n }\n\n assert.notCalled(mobiusSocket.connect);\n assert.isFalse(mobiusSocket.connecting, 'MobiusSocket is not connecting');\n\n return Promise.resolve();\n });\n });\n });\n });\n });\n\n describe('when a MessageEvent is received', () => {\n it('processes the Event via any autowired event handlers', () => {\n webex.fake = {\n processTestEvent: sinon.spy(),\n };\n\n const promise = mobiusSocket.connect();\n\n mockWebSocket.open();\n\n return promise\n .then(() => {\n mockWebSocket.emit('message', {data: JSON.stringify(fakeTestMessage)});\n\n return promiseTick(1);\n })\n .then(() => {\n assert.called(webex.fake.processTestEvent);\n });\n });\n\n it('emits the MobiusSocket envelope', () => {\n const startSpy = sinon.spy();\n const stopSpy = sinon.spy();\n\n mobiusSocket.on('event:status.start_typing', startSpy);\n mobiusSocket.on('event:status.stop_typing', stopSpy);\n\n const promise = mobiusSocket.connect();\n\n mockWebSocket.open();\n\n return promise\n .then(() => {\n mockWebSocket.emit('message', {data: JSON.stringify(statusStartTypingMessage)});\n\n return promiseTick(1);\n })\n .then(() => {\n assert.calledOnce(startSpy);\n assert.notCalled(stopSpy);\n assert.calledWith(startSpy, statusStartTypingMessage);\n });\n });\n\n it(\"emits the MobiusSocket envelope named by the MobiusSocket event's eventType\", () => {\n const startSpy = sinon.spy();\n const stopSpy = sinon.spy();\n\n mobiusSocket.on('event:status.start_typing', startSpy);\n mobiusSocket.on('event:status.stop_typing', stopSpy);\n\n const promise = mobiusSocket.connect();\n\n mockWebSocket.open();\n\n return promise\n .then(() => {\n mockWebSocket.emit('message', {data: JSON.stringify(statusStartTypingMessage)});\n\n return promiseTick(1);\n })\n .then(() => {\n assert.calledOnce(startSpy);\n assert.notCalled(stopSpy);\n assert.calledWith(startSpy, statusStartTypingMessage);\n });\n });\n });\n\n // Mobius does not use sequence numbers, so sequence-mismatch tests are not applicable\n });\n });\n\n /*\n // On mobiusSocket:\n online\n offline\n offline.transient\n offline.permanent\n offline.replaced\n event\n event:locus.participant_joined\n mockWebSocket.connection-failed\n mockWebSocket.sequence-mismatch\n\n // On webex:\n mobiusSocket.online\n mobiusSocket.offline\n mobiusSocket.offline.transient\n mobiusSocket.offline.permanent\n mobiusSocket.offline.replaced\n mobiusSocket.event\n mobiusSocket.event:locus.participant_joined\n mobiusSocket.mockWebSocket.connection-failed\n mobiusSocket.mockWebSocket.sequence-mismatch\n\n // TODO go through all it(`emits...`) and make sure corresponding tests are here\n */\n});\n"],"mappings":"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","ignoreList":[]}