@webex/calling 3.12.0-mobius-socket.9 → 3.12.0-mobius-socket.11
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/CallingClient/CallingClient.test.js +2 -2
- package/dist/CallingClient/CallingClient.test.js.map +1 -1
- package/dist/CallingClient/calling/call.test.js +1 -1
- package/dist/CallingClient/calling/call.test.js.map +1 -1
- package/dist/CallingClient/line/line.test.js +1 -1
- package/dist/CallingClient/line/line.test.js.map +1 -1
- package/dist/CallingClient/registration/register.test.js +1 -1
- package/dist/CallingClient/registration/register.test.js.map +1 -1
- package/dist/CallingClient/utils/request.js +2 -2
- package/dist/CallingClient/utils/request.js.map +1 -1
- package/dist/mobius-socket/config.js +61 -0
- package/dist/mobius-socket/config.js.map +1 -0
- package/dist/mobius-socket/errors.js +106 -0
- package/dist/mobius-socket/errors.js.map +1 -0
- package/dist/mobius-socket/index.js +101 -0
- package/dist/mobius-socket/index.js.map +1 -0
- package/dist/mobius-socket/mobius-socket-events.test.js +511 -0
- package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -0
- package/dist/mobius-socket/mobius-socket.js +1191 -0
- package/dist/mobius-socket/mobius-socket.js.map +1 -0
- package/dist/mobius-socket/mobius-socket.test.js +2107 -0
- package/dist/mobius-socket/mobius-socket.test.js.map +1 -0
- package/dist/mobius-socket/socket/constants.js +20 -0
- package/dist/mobius-socket/socket/constants.js.map +1 -0
- package/dist/mobius-socket/socket/index.js +15 -0
- package/dist/mobius-socket/socket/index.js.map +1 -0
- package/dist/mobius-socket/socket/socket-base.js +632 -0
- package/dist/mobius-socket/socket/socket-base.js.map +1 -0
- package/dist/mobius-socket/socket/socket.js +19 -0
- package/dist/mobius-socket/socket/socket.js.map +1 -0
- package/dist/mobius-socket/socket/socket.shim.js +36 -0
- package/dist/mobius-socket/socket/socket.shim.js.map +1 -0
- package/dist/mobius-socket/socket.test.js +752 -0
- package/dist/mobius-socket/socket.test.js.map +1 -0
- package/dist/mobius-socket/test/mocha-helpers.js +23 -0
- package/dist/mobius-socket/test/mocha-helpers.js.map +1 -0
- package/dist/mobius-socket/test/promise-tick.js +29 -0
- package/dist/mobius-socket/test/promise-tick.js.map +1 -0
- package/dist/module/CallingClient/utils/request.js +1 -1
- package/dist/module/mobius-socket/config.js +18 -0
- package/dist/module/mobius-socket/errors.js +30 -0
- package/dist/module/mobius-socket/index.js +24 -0
- package/dist/module/mobius-socket/mobius-socket.js +761 -0
- package/dist/module/mobius-socket/socket/constants.js +10 -0
- package/dist/module/mobius-socket/socket/index.js +4 -0
- package/dist/module/mobius-socket/socket/socket-base.js +374 -0
- package/dist/module/mobius-socket/socket/socket.js +9 -0
- package/dist/module/mobius-socket/socket/socket.shim.js +24 -0
- package/dist/types/mobius-socket/config.d.ts +15 -0
- package/dist/types/mobius-socket/config.d.ts.map +1 -0
- package/dist/types/mobius-socket/errors.d.ts +13 -0
- package/dist/types/mobius-socket/errors.d.ts.map +1 -0
- package/dist/types/mobius-socket/index.d.ts +9 -0
- package/dist/types/mobius-socket/index.d.ts.map +1 -0
- package/dist/types/mobius-socket/mobius-socket.d.ts +62 -0
- package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/constants.d.ts +11 -0
- package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/index.d.ts +2 -0
- package/dist/types/mobius-socket/socket/index.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket-base.d.ts +38 -0
- package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket.d.ts +3 -0
- package/dist/types/mobius-socket/socket/socket.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket.shim.d.ts +3 -0
- package/dist/types/mobius-socket/socket/socket.shim.d.ts.map +1 -0
- package/package.json +17 -5
- package/src/mobius-socket/socket/socket.js +13 -0
- package/src/mobius-socket/socket/socket.shim.js +31 -0
|
@@ -0,0 +1,752 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$keys = require("@babel/runtime-corejs2/core-js/object/keys");
|
|
4
|
+
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
|
|
5
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
|
6
|
+
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
|
|
7
|
+
var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
|
|
8
|
+
var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
9
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
10
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
|
11
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property"));
|
|
12
|
+
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
13
|
+
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
14
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
15
|
+
var _construct2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/construct"));
|
|
16
|
+
var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
17
|
+
var _forEach2 = _interopRequireDefault(require("lodash/forEach"));
|
|
18
|
+
var _crypto = require("crypto");
|
|
19
|
+
var _testHelperChai = require("@webex/test-helper-chai");
|
|
20
|
+
var _testHelperMockWebSocket = _interopRequireDefault(require("@webex/test-helper-mock-web-socket"));
|
|
21
|
+
var _sinon = _interopRequireDefault(require("sinon"));
|
|
22
|
+
var _index = require("./index");
|
|
23
|
+
var _constants = require("./socket/constants");
|
|
24
|
+
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; }
|
|
25
|
+
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; } /*!
|
|
26
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
27
|
+
*/
|
|
28
|
+
if (!crypto.randomUUID) {
|
|
29
|
+
(0, _defineProperty2.default)(crypto, 'randomUUID', {
|
|
30
|
+
value: _crypto.randomUUID,
|
|
31
|
+
configurable: true
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
describe('plugin-mobius-socket', function () {
|
|
35
|
+
describe('Socket', function () {
|
|
36
|
+
var mockWebSocket;
|
|
37
|
+
var socket;
|
|
38
|
+
var usingFakeTimers;
|
|
39
|
+
var mockoptions = _objectSpread({
|
|
40
|
+
logger: console,
|
|
41
|
+
token: 'mocktoken',
|
|
42
|
+
trackingId: 'mocktrackingid'
|
|
43
|
+
}, _index.config.mobiusSocket);
|
|
44
|
+
var emitAuthResponse = function emitAuthResponse() {
|
|
45
|
+
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
46
|
+
_ref$statusCode = _ref.statusCode,
|
|
47
|
+
statusCode = _ref$statusCode === void 0 ? 200 : _ref$statusCode,
|
|
48
|
+
_ref$statusMessage = _ref.statusMessage,
|
|
49
|
+
statusMessage = _ref$statusMessage === void 0 ? 'OK' : _ref$statusMessage;
|
|
50
|
+
var authRequest = JSON.parse(mockWebSocket.send.lastCall.args[0]);
|
|
51
|
+
mockWebSocket.emit('message', {
|
|
52
|
+
data: (0, _stringify.default)({
|
|
53
|
+
type: 'response_event',
|
|
54
|
+
subtype: _constants.MESSAGE_TYPES.AUTH,
|
|
55
|
+
trackingId: authRequest.trackingId,
|
|
56
|
+
statusCode: statusCode,
|
|
57
|
+
statusMessage: statusMessage
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
beforeEach(function () {
|
|
62
|
+
jest.useFakeTimers({
|
|
63
|
+
doNotFake: ['nextTick']
|
|
64
|
+
});
|
|
65
|
+
usingFakeTimers = true;
|
|
66
|
+
});
|
|
67
|
+
beforeEach(function () {
|
|
68
|
+
_sinon.default.stub(_index.Socket, 'getWebSocketConstructor').callsFake(function () {
|
|
69
|
+
return function () {
|
|
70
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
71
|
+
args[_key] = arguments[_key];
|
|
72
|
+
}
|
|
73
|
+
mockWebSocket = (0, _construct2.default)(_testHelperMockWebSocket.default, args);
|
|
74
|
+
return mockWebSocket;
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
socket = new _index.Socket();
|
|
78
|
+
var promise = socket.open('ws://example.com', mockoptions);
|
|
79
|
+
mockWebSocket.open();
|
|
80
|
+
// Simulate Mobius auth response (MockWebSocket.open auto-sends mercury.buffer_state which Mobius ignores)
|
|
81
|
+
process.nextTick(function () {
|
|
82
|
+
emitAuthResponse();
|
|
83
|
+
});
|
|
84
|
+
return promise;
|
|
85
|
+
});
|
|
86
|
+
afterEach(function () {
|
|
87
|
+
if (usingFakeTimers) {
|
|
88
|
+
jest.useRealTimers();
|
|
89
|
+
usingFakeTimers = false;
|
|
90
|
+
}
|
|
91
|
+
_index.Socket.getWebSocketConstructor.restore();
|
|
92
|
+
return _promise.default.resolve(socket && socket.close()).then(function () {
|
|
93
|
+
mockWebSocket = undefined;
|
|
94
|
+
socket = undefined;
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('#open()', function () {
|
|
98
|
+
var socket;
|
|
99
|
+
beforeEach(function () {
|
|
100
|
+
socket = new _index.Socket();
|
|
101
|
+
});
|
|
102
|
+
afterEach(function () {
|
|
103
|
+
return socket.close().catch(function () {
|
|
104
|
+
return console.log();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
it('requires a url', function () {
|
|
108
|
+
return _testHelperChai.assert.isRejected(socket.open(), /`url` is required/);
|
|
109
|
+
});
|
|
110
|
+
it('requires a forceCloseDelay option', function () {
|
|
111
|
+
return _testHelperChai.assert.isRejected(socket.open('ws://example.com'), /missing required property forceCloseDelay/);
|
|
112
|
+
});
|
|
113
|
+
it('requires a token option', function () {
|
|
114
|
+
return _testHelperChai.assert.isRejected(socket.open('ws://example.com', {
|
|
115
|
+
forceCloseDelay: mockoptions.forceCloseDelay
|
|
116
|
+
}), /missing required property token/);
|
|
117
|
+
});
|
|
118
|
+
it('requires a trackingId option', function () {
|
|
119
|
+
return _testHelperChai.assert.isRejected(socket.open('ws://example.com', {
|
|
120
|
+
forceCloseDelay: mockoptions.forceCloseDelay,
|
|
121
|
+
token: 'mocktoken'
|
|
122
|
+
}), /missing required property trackingId/);
|
|
123
|
+
});
|
|
124
|
+
it('requires a logger option', function () {
|
|
125
|
+
return _testHelperChai.assert.isRejected(socket.open('ws://example.com', {
|
|
126
|
+
forceCloseDelay: mockoptions.forceCloseDelay,
|
|
127
|
+
token: 'mocktoken',
|
|
128
|
+
trackingId: 'mocktrackingid'
|
|
129
|
+
}), /missing required property logger/);
|
|
130
|
+
});
|
|
131
|
+
it('accepts a logLevelToken option', function () {
|
|
132
|
+
var promise = socket.open('ws://example.com', {
|
|
133
|
+
forceCloseDelay: mockoptions.forceCloseDelay,
|
|
134
|
+
wssResponseTimeout: mockoptions.wssResponseTimeout,
|
|
135
|
+
logger: console,
|
|
136
|
+
token: 'mocktoken',
|
|
137
|
+
trackingId: 'mocktrackingid',
|
|
138
|
+
logLevelToken: 'mocklogleveltoken'
|
|
139
|
+
});
|
|
140
|
+
mockWebSocket.readyState = 1;
|
|
141
|
+
mockWebSocket.emit('open');
|
|
142
|
+
emitAuthResponse();
|
|
143
|
+
return promise.then(function () {
|
|
144
|
+
_testHelperChai.assert.equal(socket.logLevelToken, 'mocklogleveltoken');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe('#binaryType', function () {
|
|
149
|
+
it('proxies to the underlying socket', function () {
|
|
150
|
+
_testHelperChai.assert.notEqual(socket.binaryType, 'test');
|
|
151
|
+
mockWebSocket.binaryType = 'test';
|
|
152
|
+
_testHelperChai.assert.equal(socket.binaryType, 'test');
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('#bufferedAmount', function () {
|
|
156
|
+
it('proxies to the underlying socket', function () {
|
|
157
|
+
_testHelperChai.assert.notEqual(socket.bufferedAmount, 'test');
|
|
158
|
+
mockWebSocket.bufferedAmount = 'test';
|
|
159
|
+
_testHelperChai.assert.equal(socket.bufferedAmount, 'test');
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('#extensions', function () {
|
|
163
|
+
it('proxies to the underlying socket', function () {
|
|
164
|
+
_testHelperChai.assert.notEqual(socket.extensions, 'test');
|
|
165
|
+
mockWebSocket.extensions = 'test';
|
|
166
|
+
_testHelperChai.assert.equal(socket.extensions, 'test');
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('#protocol', function () {
|
|
170
|
+
it('proxies to the underlying socket', function () {
|
|
171
|
+
_testHelperChai.assert.notEqual(socket.protocol, 'test');
|
|
172
|
+
mockWebSocket.protocol = 'test';
|
|
173
|
+
_testHelperChai.assert.equal(socket.protocol, 'test');
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('#readyState', function () {
|
|
177
|
+
it('proxies to the underlying socket', function () {
|
|
178
|
+
_testHelperChai.assert.notEqual(socket.readyState, 'test');
|
|
179
|
+
mockWebSocket.readyState = 'test';
|
|
180
|
+
_testHelperChai.assert.equal(socket.readyState, 'test');
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe('#url', function () {
|
|
184
|
+
it('proxies to the underlying socket', function () {
|
|
185
|
+
_testHelperChai.assert.notEqual(socket.url, 'test');
|
|
186
|
+
mockWebSocket.url = 'test';
|
|
187
|
+
_testHelperChai.assert.equal(socket.url, 'test');
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe('#open()', function () {
|
|
191
|
+
it('requires a url parameter', function () {
|
|
192
|
+
var s = new _index.Socket();
|
|
193
|
+
return _testHelperChai.assert.isRejected(s.open(), /`url` is required/);
|
|
194
|
+
});
|
|
195
|
+
it('cannot be called more than once', function () {
|
|
196
|
+
return _testHelperChai.assert.isRejected(socket.open('ws://example.com'), /Socket#open\(\) can only be called once/);
|
|
197
|
+
});
|
|
198
|
+
it("sets the underlying socket's binary type", function () {
|
|
199
|
+
return _testHelperChai.assert.equal(socket.binaryType, 'arraybuffer');
|
|
200
|
+
});
|
|
201
|
+
describe('when connection fails because this is a service account', function () {
|
|
202
|
+
it('rejects with a BadRequest', function () {
|
|
203
|
+
var s = new _index.Socket();
|
|
204
|
+
var promise = s.open('ws://example.com', mockoptions);
|
|
205
|
+
mockWebSocket.readyState = 1;
|
|
206
|
+
mockWebSocket.emit('open');
|
|
207
|
+
var firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);
|
|
208
|
+
_testHelperChai.assert.equal(firstCallArgs.type, _constants.MESSAGE_TYPES.AUTH);
|
|
209
|
+
mockWebSocket.emit('close', {
|
|
210
|
+
code: 4400,
|
|
211
|
+
reason: "Service accounts can't use this endpoint"
|
|
212
|
+
});
|
|
213
|
+
return _testHelperChai.assert.isRejected(promise).then(function (reason) {
|
|
214
|
+
_testHelperChai.assert.instanceOf(reason, _index.BadRequest);
|
|
215
|
+
_testHelperChai.assert.match(reason.code, 4400);
|
|
216
|
+
_testHelperChai.assert.match(reason.reason, /Service accounts can't use this endpoint/);
|
|
217
|
+
_testHelperChai.assert.match(reason.message, /Service accounts can't use this endpoint/);
|
|
218
|
+
return s.close();
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
describe('when connection fails because of an invalid token', function () {
|
|
223
|
+
it('rejects with a NotAuthorized', function () {
|
|
224
|
+
var s = new _index.Socket();
|
|
225
|
+
var promise = s.open('ws://example.com', mockoptions);
|
|
226
|
+
mockWebSocket.readyState = 1;
|
|
227
|
+
mockWebSocket.emit('open');
|
|
228
|
+
var firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);
|
|
229
|
+
_testHelperChai.assert.equal(firstCallArgs.type, _constants.MESSAGE_TYPES.AUTH);
|
|
230
|
+
mockWebSocket.emit('close', {
|
|
231
|
+
code: 4401,
|
|
232
|
+
reason: 'Authorization Failed'
|
|
233
|
+
});
|
|
234
|
+
return _testHelperChai.assert.isRejected(promise).then(function (reason) {
|
|
235
|
+
_testHelperChai.assert.instanceOf(reason, _index.NotAuthorized);
|
|
236
|
+
_testHelperChai.assert.match(reason.code, 4401);
|
|
237
|
+
_testHelperChai.assert.match(reason.reason, /Authorization Failed/);
|
|
238
|
+
_testHelperChai.assert.match(reason.message, /Authorization Failed/);
|
|
239
|
+
return s.close();
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe('when connection fails because of a missing entitlement', function () {
|
|
244
|
+
it('rejects with a Forbidden', function () {
|
|
245
|
+
var s = new _index.Socket();
|
|
246
|
+
var promise = s.open('ws://example.com', mockoptions);
|
|
247
|
+
mockWebSocket.readyState = 1;
|
|
248
|
+
mockWebSocket.emit('open');
|
|
249
|
+
var firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);
|
|
250
|
+
_testHelperChai.assert.equal(firstCallArgs.type, _constants.MESSAGE_TYPES.AUTH);
|
|
251
|
+
mockWebSocket.emit('close', {
|
|
252
|
+
code: 4403,
|
|
253
|
+
reason: 'Not entitled'
|
|
254
|
+
});
|
|
255
|
+
return _testHelperChai.assert.isRejected(promise).then(function (reason) {
|
|
256
|
+
_testHelperChai.assert.instanceOf(reason, _index.Forbidden);
|
|
257
|
+
_testHelperChai.assert.match(reason.code, 4403);
|
|
258
|
+
_testHelperChai.assert.match(reason.reason, /Not entitled/);
|
|
259
|
+
_testHelperChai.assert.match(reason.message, /Not entitled/);
|
|
260
|
+
return s.close();
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
// describe(`when connection fails because the websocket registation has expired`, () => {
|
|
266
|
+
// it(`rejects with a NotFound`, () => {
|
|
267
|
+
// const s = new Socket();
|
|
268
|
+
// const promise = s.open(`ws://example.com`, mockoptions);
|
|
269
|
+
// mockWebSocket.readyState = 1;
|
|
270
|
+
// mockWebSocket.emit(`open`);
|
|
271
|
+
//
|
|
272
|
+
// const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);
|
|
273
|
+
// assert.equal(firstCallArgs.type, `authorization`);
|
|
274
|
+
//
|
|
275
|
+
// mockWebSocket.emit(`close`, {
|
|
276
|
+
// code: 4404,
|
|
277
|
+
// reason: `Expired registration`
|
|
278
|
+
// });
|
|
279
|
+
//
|
|
280
|
+
// return assert.isRejected(promise)
|
|
281
|
+
// .then((reason) => {
|
|
282
|
+
// assert.instanceOf(reason, NotFound);
|
|
283
|
+
// assert.match(reason.code, 4404);
|
|
284
|
+
// assert.match(reason.reason, /Expired registration/);
|
|
285
|
+
// assert.match(reason.message, /Expired registration/);
|
|
286
|
+
// return s.close();
|
|
287
|
+
// });
|
|
288
|
+
// });
|
|
289
|
+
// });
|
|
290
|
+
|
|
291
|
+
describe('when connection fails for non-authorization reasons', function () {
|
|
292
|
+
it("rejects with the close event's reason", function () {
|
|
293
|
+
var s = new _index.Socket();
|
|
294
|
+
var promise = s.open('ws://example.com', mockoptions);
|
|
295
|
+
mockWebSocket.emit('close', {
|
|
296
|
+
code: 4001,
|
|
297
|
+
reason: 'No'
|
|
298
|
+
});
|
|
299
|
+
return _testHelperChai.assert.isRejected(promise).then(function (reason) {
|
|
300
|
+
_testHelperChai.assert.instanceOf(reason, _index.ConnectionError);
|
|
301
|
+
_testHelperChai.assert.match(reason.code, 4001);
|
|
302
|
+
_testHelperChai.assert.match(reason.reason, /No/);
|
|
303
|
+
_testHelperChai.assert.match(reason.message, /No/);
|
|
304
|
+
return s.close();
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe('when the connection succeeds', function () {
|
|
309
|
+
it('sends an auth message up the socket', function () {
|
|
310
|
+
var firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);
|
|
311
|
+
_testHelperChai.assert.equal(firstCallArgs.type, _constants.MESSAGE_TYPES.AUTH);
|
|
312
|
+
_testHelperChai.assert.property(firstCallArgs, 'data');
|
|
313
|
+
_testHelperChai.assert.property(firstCallArgs.data, 'token');
|
|
314
|
+
_testHelperChai.assert.equal(firstCallArgs.data.token, 'mocktoken');
|
|
315
|
+
_testHelperChai.assert.property(firstCallArgs, 'trackingId');
|
|
316
|
+
});
|
|
317
|
+
describe('when logLevelToken is set', function () {
|
|
318
|
+
it('includes auth payload with token', function () {
|
|
319
|
+
var s = new _index.Socket();
|
|
320
|
+
s.open('ws://example.com', {
|
|
321
|
+
forceCloseDelay: mockoptions.forceCloseDelay,
|
|
322
|
+
wssResponseTimeout: mockoptions.wssResponseTimeout,
|
|
323
|
+
logger: console,
|
|
324
|
+
token: 'mocktoken',
|
|
325
|
+
trackingId: 'mocktrackingid'
|
|
326
|
+
}).catch(function (reason) {
|
|
327
|
+
return console.error(reason);
|
|
328
|
+
});
|
|
329
|
+
mockWebSocket.readyState = 1;
|
|
330
|
+
mockWebSocket.emit('open');
|
|
331
|
+
var firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);
|
|
332
|
+
_testHelperChai.assert.equal(firstCallArgs.type, _constants.MESSAGE_TYPES.AUTH);
|
|
333
|
+
_testHelperChai.assert.property(firstCallArgs, 'data');
|
|
334
|
+
_testHelperChai.assert.equal(firstCallArgs.data.token, 'mocktoken');
|
|
335
|
+
_testHelperChai.assert.property(firstCallArgs, 'trackingId');
|
|
336
|
+
return s.close();
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
it('resolves upon receiving response_event auth response', function () {
|
|
340
|
+
var s = new _index.Socket();
|
|
341
|
+
var promise = s.open('ws://example.com', mockoptions);
|
|
342
|
+
mockWebSocket.readyState = 1;
|
|
343
|
+
mockWebSocket.emit('open');
|
|
344
|
+
emitAuthResponse();
|
|
345
|
+
return promise.then(function () {
|
|
346
|
+
return s.close();
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
it('rejects upon receiving a non-2xx auth response_event', function () {
|
|
350
|
+
var s = new _index.Socket();
|
|
351
|
+
var promise = s.open('ws://example.com', mockoptions);
|
|
352
|
+
mockWebSocket.readyState = 1;
|
|
353
|
+
mockWebSocket.emit('open');
|
|
354
|
+
emitAuthResponse({
|
|
355
|
+
statusCode: 401,
|
|
356
|
+
statusMessage: 'Unauthorized'
|
|
357
|
+
});
|
|
358
|
+
return _testHelperChai.assert.isRejected(promise).then(function (reason) {
|
|
359
|
+
_testHelperChai.assert.instanceOf(reason, _index.NotAuthorized);
|
|
360
|
+
_testHelperChai.assert.equal(reason.code, 401);
|
|
361
|
+
_testHelperChai.assert.match(reason.reason, /Unauthorized/);
|
|
362
|
+
return s.close();
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
describe('#close()', function () {
|
|
368
|
+
it('closes the socket', function () {
|
|
369
|
+
return socket.close().then(function () {
|
|
370
|
+
return _testHelperChai.assert.called(mockWebSocket.close);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
it('only accepts valid close codes', function () {
|
|
374
|
+
return _promise.default.all([_testHelperChai.assert.isRejected(socket.close({
|
|
375
|
+
code: 1001
|
|
376
|
+
}), /`options.code` must be 1000 or between 3000 and 4999 \(inclusive\)/), socket.close({
|
|
377
|
+
code: 1000
|
|
378
|
+
})]);
|
|
379
|
+
});
|
|
380
|
+
it('accepts a reason', function () {
|
|
381
|
+
return socket.close({
|
|
382
|
+
code: 3001,
|
|
383
|
+
reason: 'Custom Normal'
|
|
384
|
+
}).then(function () {
|
|
385
|
+
return _testHelperChai.assert.calledWith(mockWebSocket.close, 3001, 'Custom Normal');
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
it('accepts the logout reason', function () {
|
|
389
|
+
return socket.close({
|
|
390
|
+
code: 3050,
|
|
391
|
+
reason: 'done (permanent)'
|
|
392
|
+
}).then(function () {
|
|
393
|
+
return _testHelperChai.assert.calledWith(mockWebSocket.close, 3050, 'done (permanent)');
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
it('can safely be called called multiple times', function () {
|
|
397
|
+
var p1 = socket.close();
|
|
398
|
+
mockWebSocket.readyState = 2;
|
|
399
|
+
var p2 = socket.close();
|
|
400
|
+
return _promise.default.all([p1, p2]);
|
|
401
|
+
});
|
|
402
|
+
it('signals closure if no close frame is received within the specified window', function () {
|
|
403
|
+
var socket = new _index.Socket();
|
|
404
|
+
var promise = socket.open('ws://example.com', mockoptions);
|
|
405
|
+
mockWebSocket.readyState = 1;
|
|
406
|
+
mockWebSocket.emit('open');
|
|
407
|
+
emitAuthResponse();
|
|
408
|
+
return promise.then(function () {
|
|
409
|
+
var spy = _sinon.default.spy();
|
|
410
|
+
socket.on('close', spy);
|
|
411
|
+
mockWebSocket.close = function () {
|
|
412
|
+
return new _promise.default(function () {
|
|
413
|
+
/* eslint no-inline-comments: [0] */
|
|
414
|
+
});
|
|
415
|
+
};
|
|
416
|
+
mockWebSocket.removeAllListeners('close');
|
|
417
|
+
var promise = socket.close();
|
|
418
|
+
jest.advanceTimersByTime(mockoptions.forceCloseDelay);
|
|
419
|
+
return promise.then(function () {
|
|
420
|
+
_testHelperChai.assert.called(spy);
|
|
421
|
+
_testHelperChai.assert.calledWith(spy, {
|
|
422
|
+
code: 1000,
|
|
423
|
+
reason: 'Done (forced)'
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
it('signals closure if no close frame is received within the specified window, but uses the initial options as 3050 if specified by options call', function () {
|
|
429
|
+
var socket = new _index.Socket();
|
|
430
|
+
var promise = socket.open('ws://example.com', mockoptions);
|
|
431
|
+
mockWebSocket.readyState = 1;
|
|
432
|
+
mockWebSocket.emit('open');
|
|
433
|
+
emitAuthResponse();
|
|
434
|
+
return promise.then(function () {
|
|
435
|
+
var spy = _sinon.default.spy();
|
|
436
|
+
socket.on('close', spy);
|
|
437
|
+
mockWebSocket.close = function () {
|
|
438
|
+
return new _promise.default(function () {
|
|
439
|
+
/* eslint no-inline-comments: [0] */
|
|
440
|
+
});
|
|
441
|
+
};
|
|
442
|
+
mockWebSocket.removeAllListeners('close');
|
|
443
|
+
var promise = socket.close({
|
|
444
|
+
code: 3050,
|
|
445
|
+
reason: 'done (permanent)'
|
|
446
|
+
});
|
|
447
|
+
jest.advanceTimersByTime(mockoptions.forceCloseDelay);
|
|
448
|
+
return promise.then(function () {
|
|
449
|
+
_testHelperChai.assert.called(spy);
|
|
450
|
+
_testHelperChai.assert.calledWith(spy, {
|
|
451
|
+
code: 3050,
|
|
452
|
+
reason: 'done (permanent)'
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
});
|
|
457
|
+
it('signals closure if no close frame is received within the specified window, and uses default options as 1000 if the code is not 3050', function () {
|
|
458
|
+
var socket = new _index.Socket();
|
|
459
|
+
var promise = socket.open('ws://example.com', mockoptions);
|
|
460
|
+
mockWebSocket.readyState = 1;
|
|
461
|
+
mockWebSocket.emit('open');
|
|
462
|
+
emitAuthResponse();
|
|
463
|
+
return promise.then(function () {
|
|
464
|
+
var spy = _sinon.default.spy();
|
|
465
|
+
socket.on('close', spy);
|
|
466
|
+
mockWebSocket.close = function () {
|
|
467
|
+
return new _promise.default(function () {
|
|
468
|
+
/* eslint no-inline-comments: [0] */
|
|
469
|
+
});
|
|
470
|
+
};
|
|
471
|
+
mockWebSocket.removeAllListeners('close');
|
|
472
|
+
var promise = socket.close({
|
|
473
|
+
code: 1000,
|
|
474
|
+
reason: 'test'
|
|
475
|
+
});
|
|
476
|
+
jest.advanceTimersByTime(mockoptions.forceCloseDelay);
|
|
477
|
+
return promise.then(function () {
|
|
478
|
+
_testHelperChai.assert.called(spy);
|
|
479
|
+
_testHelperChai.assert.calledWith(spy, {
|
|
480
|
+
code: 1000,
|
|
481
|
+
reason: 'test'
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
});
|
|
486
|
+
it('signals closure if no close frame is received within the specified window, and uses default options as 1000 if the code is not 3050', function () {
|
|
487
|
+
var socket = new _index.Socket();
|
|
488
|
+
var promise = socket.open('ws://example.com', mockoptions);
|
|
489
|
+
mockWebSocket.readyState = 1;
|
|
490
|
+
mockWebSocket.emit('open');
|
|
491
|
+
emitAuthResponse();
|
|
492
|
+
return promise.then(function () {
|
|
493
|
+
var spy = _sinon.default.spy();
|
|
494
|
+
socket.on('close', spy);
|
|
495
|
+
mockWebSocket.close = function () {
|
|
496
|
+
return new _promise.default(function () {
|
|
497
|
+
/* eslint no-inline-comments: [0] */
|
|
498
|
+
});
|
|
499
|
+
};
|
|
500
|
+
mockWebSocket.removeAllListeners('close');
|
|
501
|
+
var promise = socket.close({
|
|
502
|
+
code: 1000
|
|
503
|
+
});
|
|
504
|
+
jest.advanceTimersByTime(mockoptions.forceCloseDelay);
|
|
505
|
+
return promise.then(function () {
|
|
506
|
+
_testHelperChai.assert.called(spy);
|
|
507
|
+
_testHelperChai.assert.calledWith(spy, {
|
|
508
|
+
code: 1000,
|
|
509
|
+
reason: 'Done (unknown)'
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
});
|
|
513
|
+
});
|
|
514
|
+
[{
|
|
515
|
+
description: 'manually triggers close handler when socket is still connecting',
|
|
516
|
+
closeOptions: {
|
|
517
|
+
code: 3001,
|
|
518
|
+
reason: 'Custom close while connecting'
|
|
519
|
+
},
|
|
520
|
+
expectedCode: 3001,
|
|
521
|
+
expectedReason: 'Custom close while connecting'
|
|
522
|
+
}, {
|
|
523
|
+
description: 'manually triggers close handler with default code when socket is connecting',
|
|
524
|
+
closeOptions: undefined,
|
|
525
|
+
expectedCode: 1000,
|
|
526
|
+
expectedReason: 'Done'
|
|
527
|
+
}].forEach(function (_ref2) {
|
|
528
|
+
var description = _ref2.description,
|
|
529
|
+
closeOptions = _ref2.closeOptions,
|
|
530
|
+
expectedCode = _ref2.expectedCode,
|
|
531
|
+
expectedReason = _ref2.expectedReason;
|
|
532
|
+
it(description, /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
533
|
+
var s, socketInstance, previousStub, closeSpy, result;
|
|
534
|
+
return _regenerator.default.wrap(function (_context) {
|
|
535
|
+
while (1) switch (_context.prev = _context.next) {
|
|
536
|
+
case 0:
|
|
537
|
+
s = new _index.Socket();
|
|
538
|
+
// Save the current stub and replace it
|
|
539
|
+
previousStub = _index.Socket.getWebSocketConstructor;
|
|
540
|
+
_index.Socket.getWebSocketConstructor = _sinon.default.stub().callsFake(function () {
|
|
541
|
+
return function () {
|
|
542
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
543
|
+
args[_key2] = arguments[_key2];
|
|
544
|
+
}
|
|
545
|
+
socketInstance = (0, _construct2.default)(_testHelperMockWebSocket.default, args);
|
|
546
|
+
return socketInstance;
|
|
547
|
+
};
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
// open the socket
|
|
551
|
+
s.open('ws://example.com', mockoptions);
|
|
552
|
+
|
|
553
|
+
// Keep socket in CONNECTING state (readyState 0)
|
|
554
|
+
socketInstance.readyState = 0;
|
|
555
|
+
closeSpy = _sinon.default.spy();
|
|
556
|
+
s.on('close', closeSpy);
|
|
557
|
+
|
|
558
|
+
// Call close and await the result
|
|
559
|
+
_context.next = 1;
|
|
560
|
+
return s.close(closeOptions);
|
|
561
|
+
case 1:
|
|
562
|
+
result = _context.sent;
|
|
563
|
+
// Verify the promise resolved with the correct close event
|
|
564
|
+
_testHelperChai.assert.equal(result.code, expectedCode);
|
|
565
|
+
_testHelperChai.assert.equal(result.reason, expectedReason);
|
|
566
|
+
|
|
567
|
+
// Verify close handler was called with expected code/reason
|
|
568
|
+
_testHelperChai.assert.calledOnce(closeSpy);
|
|
569
|
+
_testHelperChai.assert.calledWith(closeSpy, {
|
|
570
|
+
code: expectedCode,
|
|
571
|
+
reason: expectedReason
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
// Verify the underlying socket.close was called with the correct params
|
|
575
|
+
_testHelperChai.assert.calledOnce(socketInstance.close);
|
|
576
|
+
_testHelperChai.assert.calledWith(socketInstance.close, expectedCode, expectedReason);
|
|
577
|
+
|
|
578
|
+
// Restore the previous stub
|
|
579
|
+
_index.Socket.getWebSocketConstructor = previousStub;
|
|
580
|
+
case 2:
|
|
581
|
+
case "end":
|
|
582
|
+
return _context.stop();
|
|
583
|
+
}
|
|
584
|
+
}, _callee);
|
|
585
|
+
})));
|
|
586
|
+
});
|
|
587
|
+
});
|
|
588
|
+
describe('#send()', function () {
|
|
589
|
+
describe('when the socket is not in the OPEN state', function () {
|
|
590
|
+
it('fails', function () {
|
|
591
|
+
mockWebSocket.readyState = 0;
|
|
592
|
+
return _testHelperChai.assert.isRejected(socket.send('test0'), /INVALID_STATE_ERROR/).then(function () {
|
|
593
|
+
mockWebSocket.readyState = 2;
|
|
594
|
+
return _testHelperChai.assert.isRejected(socket.send('test2'), /INVALID_STATE_ERROR/);
|
|
595
|
+
}).then(function () {
|
|
596
|
+
mockWebSocket.readyState = 3;
|
|
597
|
+
return _testHelperChai.assert.isRejected(socket.send('test3'), /INVALID_STATE_ERROR/);
|
|
598
|
+
}).then(function () {
|
|
599
|
+
mockWebSocket.readyState = 1;
|
|
600
|
+
return socket.send('test1');
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
});
|
|
604
|
+
it('sends strings', function () {
|
|
605
|
+
socket.send('this is a string');
|
|
606
|
+
_testHelperChai.assert.calledWith(mockWebSocket.send, 'this is a string');
|
|
607
|
+
});
|
|
608
|
+
it('sends JSON.stringifyable object', function () {
|
|
609
|
+
socket.send({
|
|
610
|
+
json: true
|
|
611
|
+
});
|
|
612
|
+
_testHelperChai.assert.calledWith(mockWebSocket.send, '{"json":true}');
|
|
613
|
+
});
|
|
614
|
+
});
|
|
615
|
+
describe('#onclose()', function () {
|
|
616
|
+
describe('when it receives close code 1005', function () {
|
|
617
|
+
(0, _forEach2.default)({
|
|
618
|
+
Replaced: 4000,
|
|
619
|
+
'Authentication Failed': 1008,
|
|
620
|
+
'Authentication did not happen within the timeout window of 30000 seconds.': 1008
|
|
621
|
+
}, function (code, reason) {
|
|
622
|
+
it("emits code ".concat(code, " for reason ").concat(reason), function () {
|
|
623
|
+
var spy = _sinon.default.spy();
|
|
624
|
+
socket.on('close', spy);
|
|
625
|
+
mockWebSocket.emit('close', {
|
|
626
|
+
code: 1005,
|
|
627
|
+
reason: reason
|
|
628
|
+
});
|
|
629
|
+
_testHelperChai.assert.called(spy);
|
|
630
|
+
_testHelperChai.assert.calledWith(spy, {
|
|
631
|
+
code: code,
|
|
632
|
+
reason: reason
|
|
633
|
+
});
|
|
634
|
+
});
|
|
635
|
+
});
|
|
636
|
+
});
|
|
637
|
+
describe('when it receives close code 3050', function () {
|
|
638
|
+
it('emits code 3050 for code 3050', function () {
|
|
639
|
+
var code = 3050;
|
|
640
|
+
var reason = 'done (permanent)';
|
|
641
|
+
var spy = _sinon.default.spy();
|
|
642
|
+
socket.on('close', spy);
|
|
643
|
+
mockWebSocket.emit('close', {
|
|
644
|
+
code: code,
|
|
645
|
+
reason: reason
|
|
646
|
+
});
|
|
647
|
+
_testHelperChai.assert.called(spy);
|
|
648
|
+
_testHelperChai.assert.calledWith(spy, {
|
|
649
|
+
code: code,
|
|
650
|
+
reason: reason
|
|
651
|
+
});
|
|
652
|
+
});
|
|
653
|
+
});
|
|
654
|
+
});
|
|
655
|
+
describe('#onmessage()', function () {
|
|
656
|
+
var spy;
|
|
657
|
+
beforeEach(function () {
|
|
658
|
+
spy = _sinon.default.spy();
|
|
659
|
+
socket.on('message', spy);
|
|
660
|
+
});
|
|
661
|
+
it('emits messages from the underlying socket', function () {
|
|
662
|
+
mockWebSocket.emit('message', {
|
|
663
|
+
data: (0, _stringify.default)({
|
|
664
|
+
id: 'mockid'
|
|
665
|
+
})
|
|
666
|
+
});
|
|
667
|
+
_testHelperChai.assert.called(spy);
|
|
668
|
+
});
|
|
669
|
+
it('parses received messages', function () {
|
|
670
|
+
mockWebSocket.emit('message', {
|
|
671
|
+
data: (0, _stringify.default)({
|
|
672
|
+
id: 'mockid',
|
|
673
|
+
type: 'test'
|
|
674
|
+
})
|
|
675
|
+
});
|
|
676
|
+
_testHelperChai.assert.calledWith(spy, {
|
|
677
|
+
data: {
|
|
678
|
+
id: 'mockid',
|
|
679
|
+
type: 'test'
|
|
680
|
+
}
|
|
681
|
+
});
|
|
682
|
+
});
|
|
683
|
+
it('preserves top-level type and eventId for async_event envelopes', function () {
|
|
684
|
+
mockWebSocket.emit('message', {
|
|
685
|
+
data: (0, _stringify.default)({
|
|
686
|
+
type: 'async_event',
|
|
687
|
+
trackingId: 'SRV_bb000000-0000-0000-0000-000000000006',
|
|
688
|
+
eventId: 'f6a7b8c9-d0e1-2345-fabc-456789012345',
|
|
689
|
+
data: {
|
|
690
|
+
eventType: 'mobius.callinfo',
|
|
691
|
+
callId: 'fcf86aa5-5539-4c9f-8b72-667786ae9b6c',
|
|
692
|
+
deviceId: '334f3d50-1d26-4712-93f1-4972390cc565'
|
|
693
|
+
}
|
|
694
|
+
})
|
|
695
|
+
});
|
|
696
|
+
_testHelperChai.assert.calledWith(spy, {
|
|
697
|
+
data: {
|
|
698
|
+
type: 'async_event',
|
|
699
|
+
trackingId: 'SRV_bb000000-0000-0000-0000-000000000006',
|
|
700
|
+
eventId: 'f6a7b8c9-d0e1-2345-fabc-456789012345',
|
|
701
|
+
data: {
|
|
702
|
+
eventType: 'mobius.callinfo',
|
|
703
|
+
callId: 'fcf86aa5-5539-4c9f-8b72-667786ae9b6c',
|
|
704
|
+
deviceId: '334f3d50-1d26-4712-93f1-4972390cc565'
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
});
|
|
708
|
+
});
|
|
709
|
+
it('acknowledges async_event messages only', function () {
|
|
710
|
+
_sinon.default.spy(socket, '_acknowledge');
|
|
711
|
+
mockWebSocket.emit('message', {
|
|
712
|
+
data: (0, _stringify.default)({
|
|
713
|
+
type: 'async_event',
|
|
714
|
+
eventId: 'event-123',
|
|
715
|
+
trackingId: 'tracking-123'
|
|
716
|
+
})
|
|
717
|
+
});
|
|
718
|
+
_testHelperChai.assert.called(socket._acknowledge);
|
|
719
|
+
});
|
|
720
|
+
it('does not acknowledge non-async_event messages', function () {
|
|
721
|
+
_sinon.default.spy(socket, '_acknowledge');
|
|
722
|
+
mockWebSocket.emit('message', {
|
|
723
|
+
data: (0, _stringify.default)({
|
|
724
|
+
type: 'regular',
|
|
725
|
+
id: 'mockid'
|
|
726
|
+
})
|
|
727
|
+
});
|
|
728
|
+
_testHelperChai.assert.notCalled(socket._acknowledge);
|
|
729
|
+
});
|
|
730
|
+
});
|
|
731
|
+
describe('#_acknowledge', function () {
|
|
732
|
+
it('requires an event', function () {
|
|
733
|
+
return _testHelperChai.assert.isRejected(socket._acknowledge(), /`event` is required/);
|
|
734
|
+
});
|
|
735
|
+
it('acknowledges async events using event_ack and eventId', function () {
|
|
736
|
+
return socket._acknowledge({
|
|
737
|
+
data: {
|
|
738
|
+
eventId: 'event-123',
|
|
739
|
+
trackingId: 'tracking-123'
|
|
740
|
+
}
|
|
741
|
+
}).then(function () {
|
|
742
|
+
_testHelperChai.assert.calledWith(mockWebSocket.send, (0, _stringify.default)({
|
|
743
|
+
type: _constants.MESSAGE_TYPES.EVENT_ACK,
|
|
744
|
+
trackingId: 'tracking-123',
|
|
745
|
+
eventId: 'event-123'
|
|
746
|
+
}));
|
|
747
|
+
});
|
|
748
|
+
});
|
|
749
|
+
});
|
|
750
|
+
});
|
|
751
|
+
});
|
|
752
|
+
//# sourceMappingURL=socket.test.js.map
|