@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.
- 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 +2 -2
- package/dist/CallingClient/line/line.test.js.map +1 -1
- package/dist/CallingClient/registration/register.js +76 -43
- package/dist/CallingClient/registration/register.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/registration/types.js.map +1 -1
- package/dist/CallingClient/utils/request.js +2 -2
- package/dist/CallingClient/utils/request.js.map +1 -1
- package/dist/common/Utils.js +70 -30
- package/dist/common/Utils.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/registration/register.js +30 -7
- package/dist/module/CallingClient/utils/request.js +1 -1
- package/dist/module/common/Utils.js +17 -4
- 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/CallingClient/registration/register.d.ts.map +1 -1
- package/dist/types/CallingClient/registration/types.d.ts +1 -1
- package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
- package/dist/types/common/Utils.d.ts +4 -1
- package/dist/types/common/Utils.d.ts.map +1 -1
- 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 +16 -3
- package/src/mobius-socket/socket/socket.js +13 -0
- package/src/mobius-socket/socket/socket.shim.js +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_crypto","require","_testHelperChai","_testHelperMockWebSocket","_interopRequireDefault","_sinon","_index","_constants","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty3","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty2","crypto","randomUUID","_defineProperty2","value","configurable","describe","mockWebSocket","socket","usingFakeTimers","mockoptions","logger","console","token","trackingId","config","mobiusSocket","emitAuthResponse","_ref","undefined","_ref$statusCode","statusCode","_ref$statusMessage","statusMessage","authRequest","JSON","parse","send","lastCall","args","emit","data","_stringify","type","subtype","MESSAGE_TYPES","AUTH","beforeEach","jest","useFakeTimers","doNotFake","sinon","stub","Socket","callsFake","_len","Array","_key","_construct2","MockWebSocket","promise","open","process","nextTick","afterEach","useRealTimers","getWebSocketConstructor","restore","_promise","resolve","close","then","catch","log","it","assert","isRejected","forceCloseDelay","wssResponseTimeout","logLevelToken","readyState","equal","notEqual","binaryType","bufferedAmount","extensions","protocol","url","s","firstCallArgs","firstCall","code","reason","instanceOf","BadRequest","match","message","NotAuthorized","Forbidden","ConnectionError","property","error","called","all","calledWith","p1","p2","spy","on","removeAllListeners","advanceTimersByTime","description","closeOptions","expectedCode","expectedReason","_ref2","_asyncToGenerator2","_regenerator","mark","_callee","socketInstance","previousStub","closeSpy","result","wrap","_context","prev","next","_len2","_key2","sent","calledOnce","stop","json","_forEach2","Replaced","concat","id","eventId","eventType","callId","deviceId","_acknowledge","notCalled","EVENT_ACK"],"sources":["socket.test.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {randomUUID} from 'crypto';\nimport {forEach} from 'lodash';\nimport {assert} from '@webex/test-helper-chai';\nimport MockWebSocket from '@webex/test-helper-mock-web-socket';\nimport sinon from 'sinon';\nimport {\n BadRequest,\n NotAuthorized,\n Forbidden,\n // NotFound,\n config,\n ConnectionError,\n Socket,\n} from './index';\nimport {MESSAGE_TYPES} from './socket/constants';\n\nif (!crypto.randomUUID) {\n Object.defineProperty(crypto, 'randomUUID', {\n value: randomUUID,\n configurable: true,\n });\n}\n\ndescribe('plugin-mobius-socket', () => {\n describe('Socket', () => {\n let mockWebSocket;\n let socket;\n let usingFakeTimers;\n\n const mockoptions = {\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n ...config.mobiusSocket,\n };\n\n const emitAuthResponse = ({statusCode = 200, statusMessage = 'OK'} = {}) => {\n const authRequest = JSON.parse(mockWebSocket.send.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 beforeEach(() => {\n sinon.stub(Socket, 'getWebSocketConstructor').callsFake(\n () =>\n function (...args) {\n mockWebSocket = new MockWebSocket(...args);\n\n return mockWebSocket;\n }\n );\n\n socket = new Socket();\n const promise = socket.open('ws://example.com', mockoptions);\n\n mockWebSocket.open();\n // Simulate Mobius auth response (MockWebSocket.open auto-sends mercury.buffer_state which Mobius ignores)\n process.nextTick(() => {\n emitAuthResponse();\n });\n\n return promise;\n });\n\n afterEach(() => {\n if (usingFakeTimers) {\n jest.useRealTimers();\n usingFakeTimers = false;\n }\n\n Socket.getWebSocketConstructor.restore();\n\n return Promise.resolve(socket && socket.close()).then(() => {\n mockWebSocket = undefined;\n socket = undefined;\n });\n });\n\n describe('#open()', () => {\n let socket;\n\n beforeEach(() => {\n socket = new Socket();\n });\n\n afterEach(() => socket.close().catch(() => console.log()));\n\n it('requires a url', () => assert.isRejected(socket.open(), /`url` is required/));\n\n it('requires a forceCloseDelay option', () =>\n assert.isRejected(\n socket.open('ws://example.com'),\n /missing required property forceCloseDelay/\n ));\n\n it('requires a token option', () =>\n assert.isRejected(\n socket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n }),\n /missing required property token/\n ));\n\n it('requires a trackingId option', () =>\n assert.isRejected(\n socket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n token: 'mocktoken',\n }),\n /missing required property trackingId/\n ));\n\n it('requires a logger option', () =>\n assert.isRejected(\n socket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n }),\n /missing required property logger/\n ));\n\n it('accepts a logLevelToken option', () => {\n const promise = socket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n wssResponseTimeout: mockoptions.wssResponseTimeout,\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n logLevelToken: 'mocklogleveltoken',\n });\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n emitAuthResponse();\n\n return promise.then(() => {\n assert.equal(socket.logLevelToken, 'mocklogleveltoken');\n });\n });\n });\n\n describe('#binaryType', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.binaryType, 'test');\n mockWebSocket.binaryType = 'test';\n assert.equal(socket.binaryType, 'test');\n });\n });\n\n describe('#bufferedAmount', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.bufferedAmount, 'test');\n mockWebSocket.bufferedAmount = 'test';\n assert.equal(socket.bufferedAmount, 'test');\n });\n });\n\n describe('#extensions', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.extensions, 'test');\n mockWebSocket.extensions = 'test';\n assert.equal(socket.extensions, 'test');\n });\n });\n\n describe('#protocol', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.protocol, 'test');\n mockWebSocket.protocol = 'test';\n assert.equal(socket.protocol, 'test');\n });\n });\n\n describe('#readyState', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.readyState, 'test');\n mockWebSocket.readyState = 'test';\n assert.equal(socket.readyState, 'test');\n });\n });\n\n describe('#url', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.url, 'test');\n mockWebSocket.url = 'test';\n assert.equal(socket.url, 'test');\n });\n });\n\n describe('#open()', () => {\n it('requires a url parameter', () => {\n const s = new Socket();\n\n return assert.isRejected(s.open(), /`url` is required/);\n });\n\n it('cannot be called more than once', () =>\n assert.isRejected(\n socket.open('ws://example.com'),\n /Socket#open\\(\\) can only be called once/\n ));\n\n it(\"sets the underlying socket's binary type\", () =>\n assert.equal(socket.binaryType, 'arraybuffer'));\n\n describe('when connection fails because this is a service account', () => {\n it('rejects with a BadRequest', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4400,\n reason: \"Service accounts can't use this endpoint\",\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, BadRequest);\n assert.match(reason.code, 4400);\n assert.match(reason.reason, /Service accounts can't use this endpoint/);\n assert.match(reason.message, /Service accounts can't use this endpoint/);\n\n return s.close();\n });\n });\n });\n\n describe('when connection fails because of an invalid token', () => {\n it('rejects with a NotAuthorized', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4401,\n reason: 'Authorization Failed',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, NotAuthorized);\n assert.match(reason.code, 4401);\n assert.match(reason.reason, /Authorization Failed/);\n assert.match(reason.message, /Authorization Failed/);\n\n return s.close();\n });\n });\n });\n\n describe('when connection fails because of a missing entitlement', () => {\n it('rejects with a Forbidden', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4403,\n reason: 'Not entitled',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, Forbidden);\n assert.match(reason.code, 4403);\n assert.match(reason.reason, /Not entitled/);\n assert.match(reason.message, /Not entitled/);\n\n return s.close();\n });\n });\n });\n\n // describe(`when connection fails because the websocket registation has expired`, () => {\n // it(`rejects with a NotFound`, () => {\n // const s = new Socket();\n // const promise = s.open(`ws://example.com`, mockoptions);\n // mockWebSocket.readyState = 1;\n // mockWebSocket.emit(`open`);\n //\n // const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n // assert.equal(firstCallArgs.type, `authorization`);\n //\n // mockWebSocket.emit(`close`, {\n // code: 4404,\n // reason: `Expired registration`\n // });\n //\n // return assert.isRejected(promise)\n // .then((reason) => {\n // assert.instanceOf(reason, NotFound);\n // assert.match(reason.code, 4404);\n // assert.match(reason.reason, /Expired registration/);\n // assert.match(reason.message, /Expired registration/);\n // return s.close();\n // });\n // });\n // });\n\n describe('when connection fails for non-authorization reasons', () => {\n it(\"rejects with the close event's reason\", () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.emit('close', {\n code: 4001,\n reason: 'No',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, ConnectionError);\n assert.match(reason.code, 4001);\n assert.match(reason.reason, /No/);\n assert.match(reason.message, /No/);\n\n return s.close();\n });\n });\n });\n\n describe('when the connection succeeds', () => {\n it('sends an auth message up the socket', () => {\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n assert.property(firstCallArgs, 'data');\n assert.property(firstCallArgs.data, 'token');\n assert.equal(firstCallArgs.data.token, 'mocktoken');\n assert.property(firstCallArgs, 'trackingId');\n });\n\n describe('when logLevelToken is set', () => {\n it('includes auth payload with token', () => {\n const s = new Socket();\n\n s.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n wssResponseTimeout: mockoptions.wssResponseTimeout,\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n }).catch((reason) => console.error(reason));\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n assert.property(firstCallArgs, 'data');\n assert.equal(firstCallArgs.data.token, 'mocktoken');\n assert.property(firstCallArgs, 'trackingId');\n\n return s.close();\n });\n });\n\n it('resolves upon receiving response_event auth response', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return promise.then(() => s.close());\n });\n\n it('rejects upon receiving a non-2xx auth response_event', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse({statusCode: 401, statusMessage: 'Unauthorized'});\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, NotAuthorized);\n assert.equal(reason.code, 401);\n assert.match(reason.reason, /Unauthorized/);\n\n return s.close();\n });\n });\n });\n });\n\n describe('#close()', () => {\n it('closes the socket', () => socket.close().then(() => assert.called(mockWebSocket.close)));\n\n it('only accepts valid close codes', () =>\n Promise.all([\n assert.isRejected(\n socket.close({code: 1001}),\n /`options.code` must be 1000 or between 3000 and 4999 \\(inclusive\\)/\n ),\n socket.close({code: 1000}),\n ]));\n\n it('accepts a reason', () =>\n socket\n .close({\n code: 3001,\n reason: 'Custom Normal',\n })\n .then(() => assert.calledWith(mockWebSocket.close, 3001, 'Custom Normal')));\n\n it('accepts the logout reason', () =>\n socket\n .close({\n code: 3050,\n reason: 'done (permanent)',\n })\n .then(() => assert.calledWith(mockWebSocket.close, 3050, 'done (permanent)')));\n\n it('can safely be called called multiple times', () => {\n const p1 = socket.close();\n\n mockWebSocket.readyState = 2;\n const p2 = socket.close();\n\n return Promise.all([p1, p2]);\n });\n\n it('signals closure if no close frame is received within the specified window', () => {\n const socket = new Socket();\n const promise = socket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return promise.then(() => {\n const spy = sinon.spy();\n\n socket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const promise = socket.close();\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return promise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'Done (forced)',\n });\n });\n });\n });\n\n 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', () => {\n const socket = new Socket();\n const promise = socket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return promise.then(() => {\n const spy = sinon.spy();\n\n socket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const promise = socket.close({code: 3050, reason: 'done (permanent)'});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return promise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 3050,\n reason: 'done (permanent)',\n });\n });\n });\n });\n\n 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', () => {\n const socket = new Socket();\n const promise = socket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return promise.then(() => {\n const spy = sinon.spy();\n\n socket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const promise = socket.close({code: 1000, reason: 'test'});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return promise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'test',\n });\n });\n });\n });\n\n 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', () => {\n const socket = new Socket();\n const promise = socket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return promise.then(() => {\n const spy = sinon.spy();\n\n socket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const promise = socket.close({code: 1000});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return promise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'Done (unknown)',\n });\n });\n });\n });\n\n [\n {\n description: 'manually triggers close handler when socket is still connecting',\n closeOptions: {code: 3001, reason: 'Custom close while connecting'},\n expectedCode: 3001,\n expectedReason: 'Custom close while connecting',\n },\n {\n description:\n 'manually triggers close handler with default code when socket is connecting',\n closeOptions: undefined,\n expectedCode: 1000,\n expectedReason: 'Done',\n },\n ].forEach(({description, closeOptions, expectedCode, expectedReason}) => {\n it(description, async () => {\n const s = new Socket();\n let socketInstance;\n\n // Save the current stub and replace it\n const previousStub = Socket.getWebSocketConstructor;\n Socket.getWebSocketConstructor = sinon.stub().callsFake(\n () =>\n function (...args) {\n socketInstance = new MockWebSocket(...args);\n\n return socketInstance;\n }\n );\n\n // open the socket\n s.open('ws://example.com', mockoptions);\n\n // Keep socket in CONNECTING state (readyState 0)\n socketInstance.readyState = 0;\n\n const closeSpy = sinon.spy();\n s.on('close', closeSpy);\n\n // Call close and await the result\n const result = await s.close(closeOptions);\n\n // Verify the promise resolved with the correct close event\n assert.equal(result.code, expectedCode);\n assert.equal(result.reason, expectedReason);\n\n // Verify close handler was called with expected code/reason\n assert.calledOnce(closeSpy);\n assert.calledWith(closeSpy, {\n code: expectedCode,\n reason: expectedReason,\n });\n\n // Verify the underlying socket.close was called with the correct params\n assert.calledOnce(socketInstance.close);\n assert.calledWith(socketInstance.close, expectedCode, expectedReason);\n\n // Restore the previous stub\n Socket.getWebSocketConstructor = previousStub;\n });\n });\n });\n\n describe('#send()', () => {\n describe('when the socket is not in the OPEN state', () => {\n it('fails', () => {\n mockWebSocket.readyState = 0;\n\n return assert\n .isRejected(socket.send('test0'), /INVALID_STATE_ERROR/)\n .then(() => {\n mockWebSocket.readyState = 2;\n\n return assert.isRejected(socket.send('test2'), /INVALID_STATE_ERROR/);\n })\n .then(() => {\n mockWebSocket.readyState = 3;\n\n return assert.isRejected(socket.send('test3'), /INVALID_STATE_ERROR/);\n })\n .then(() => {\n mockWebSocket.readyState = 1;\n\n return socket.send('test1');\n });\n });\n });\n\n it('sends strings', () => {\n socket.send('this is a string');\n assert.calledWith(mockWebSocket.send, 'this is a string');\n });\n\n it('sends JSON.stringifyable object', () => {\n socket.send({\n json: true,\n });\n assert.calledWith(mockWebSocket.send, '{\"json\":true}');\n });\n });\n\n describe('#onclose()', () => {\n describe('when it receives close code 1005', () => {\n forEach(\n {\n Replaced: 4000,\n 'Authentication Failed': 1008,\n 'Authentication did not happen within the timeout window of 30000 seconds.': 1008,\n },\n (code, reason) => {\n it(`emits code ${code} for reason ${reason}`, () => {\n const spy = sinon.spy();\n\n socket.on('close', spy);\n\n mockWebSocket.emit('close', {\n code: 1005,\n reason,\n });\n assert.called(spy);\n assert.calledWith(spy, {\n code,\n reason,\n });\n });\n }\n );\n });\n\n describe('when it receives close code 3050', () => {\n it('emits code 3050 for code 3050', () => {\n const code = 3050;\n const reason = 'done (permanent)';\n const spy = sinon.spy();\n\n socket.on('close', spy);\n\n mockWebSocket.emit('close', {\n code,\n reason,\n });\n assert.called(spy);\n assert.calledWith(spy, {\n code,\n reason,\n });\n });\n });\n });\n\n describe('#onmessage()', () => {\n let spy;\n\n beforeEach(() => {\n spy = sinon.spy();\n socket.on('message', spy);\n });\n\n it('emits messages from the underlying socket', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n id: 'mockid',\n }),\n });\n\n assert.called(spy);\n });\n\n it('parses received messages', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n id: 'mockid',\n type: 'test',\n }),\n });\n\n assert.calledWith(spy, {\n data: {\n id: 'mockid',\n type: 'test',\n },\n });\n });\n\n it('preserves top-level type and eventId for async_event envelopes', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'async_event',\n trackingId: 'SRV_bb000000-0000-0000-0000-000000000006',\n eventId: 'f6a7b8c9-d0e1-2345-fabc-456789012345',\n data: {\n eventType: 'mobius.callinfo',\n callId: 'fcf86aa5-5539-4c9f-8b72-667786ae9b6c',\n deviceId: '334f3d50-1d26-4712-93f1-4972390cc565',\n },\n }),\n });\n\n assert.calledWith(spy, {\n data: {\n type: 'async_event',\n trackingId: 'SRV_bb000000-0000-0000-0000-000000000006',\n eventId: 'f6a7b8c9-d0e1-2345-fabc-456789012345',\n data: {\n eventType: 'mobius.callinfo',\n callId: 'fcf86aa5-5539-4c9f-8b72-667786ae9b6c',\n deviceId: '334f3d50-1d26-4712-93f1-4972390cc565',\n },\n },\n });\n });\n\n it('acknowledges async_event messages only', () => {\n sinon.spy(socket, '_acknowledge');\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'async_event',\n eventId: 'event-123',\n trackingId: 'tracking-123',\n }),\n });\n assert.called(socket._acknowledge);\n });\n\n it('does not acknowledge non-async_event messages', () => {\n sinon.spy(socket, '_acknowledge');\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'regular',\n id: 'mockid',\n }),\n });\n assert.notCalled(socket._acknowledge);\n });\n });\n\n describe('#_acknowledge', () => {\n it('requires an event', () =>\n assert.isRejected(socket._acknowledge(), /`event` is required/));\n\n it('acknowledges async events using event_ack and eventId', () =>\n socket\n ._acknowledge({\n data: {\n eventId: 'event-123',\n trackingId: 'tracking-123',\n },\n })\n .then(() => {\n assert.calledWith(\n mockWebSocket.send,\n JSON.stringify({\n type: MESSAGE_TYPES.EVENT_ACK,\n trackingId: 'tracking-123',\n eventId: 'event-123',\n })\n );\n }));\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.flaky = flaky;
|
|
8
|
+
exports.skipInBrowser = skipInBrowser;
|
|
9
|
+
/*!
|
|
10
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
function flaky(mochaMethod, envVar) {
|
|
14
|
+
if (!mochaMethod.skip) {
|
|
15
|
+
return mochaMethod;
|
|
16
|
+
}
|
|
17
|
+
var shouldSkip = envVar && envVar !== 'false' && !!envVar;
|
|
18
|
+
return shouldSkip ? mochaMethod.skip : mochaMethod;
|
|
19
|
+
}
|
|
20
|
+
function skipInBrowser(mochaMethod) {
|
|
21
|
+
return mochaMethod;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=mocha-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["flaky","mochaMethod","envVar","skip","shouldSkip","skipInBrowser"],"sources":["mocha-helpers.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nexport function flaky(mochaMethod, envVar) {\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n const shouldSkip = envVar && envVar !== 'false' && !!envVar;\n\n return shouldSkip ? mochaMethod.skip : mochaMethod;\n}\n\nexport function skipInBrowser(mochaMethod) {\n return mochaMethod;\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;;AAEO,SAASA,KAAKA,CAACC,WAAW,EAAEC,MAAM,EAAE;EACzC,IAAI,CAACD,WAAW,CAACE,IAAI,EAAE;IACrB,OAAOF,WAAW;EACpB;EAEA,IAAMG,UAAU,GAAGF,MAAM,IAAIA,MAAM,KAAK,OAAO,IAAI,CAAC,CAACA,MAAM;EAE3D,OAAOE,UAAU,GAAGH,WAAW,CAACE,IAAI,GAAGF,WAAW;AACpD;AAEO,SAASI,aAAaA,CAACJ,WAAW,EAAE;EACzC,OAAOA,WAAW;AACpB","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
5
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = promiseTick;
|
|
9
|
+
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
10
|
+
/*!
|
|
11
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Uses Promise#then to run some number of ticks
|
|
16
|
+
* @param {number} count
|
|
17
|
+
* @returns {Promise}
|
|
18
|
+
*/
|
|
19
|
+
function promiseTick(count) {
|
|
20
|
+
var promise = _promise.default.resolve();
|
|
21
|
+
while (count > 1) {
|
|
22
|
+
promise = promise.then(function () {
|
|
23
|
+
return promiseTick(1);
|
|
24
|
+
});
|
|
25
|
+
count -= 1;
|
|
26
|
+
}
|
|
27
|
+
return promise;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=promise-tick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["promiseTick","count","promise","_promise","default","resolve","then"],"sources":["promise-tick.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * Uses Promise#then to run some number of ticks\n * @param {number} count\n * @returns {Promise}\n */\nexport default function promiseTick(count) {\n let promise = Promise.resolve();\n\n while (count > 1) {\n promise = promise.then(() => promiseTick(1));\n count -= 1;\n }\n\n return promise;\n}\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACe,SAASA,WAAWA,CAACC,KAAK,EAAE;EACzC,IAAIC,OAAO,GAAGC,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAAC,CAAC;EAE/B,OAAOJ,KAAK,GAAG,CAAC,EAAE;IAChBC,OAAO,GAAGA,OAAO,CAACI,IAAI,CAAC;MAAA,OAAMN,WAAW,CAAC,CAAC,CAAC;IAAA,EAAC;IAC5CC,KAAK,IAAI,CAAC;EACZ;EAEA,OAAOC,OAAO;AAChB","ignoreList":[]}
|
|
@@ -180,6 +180,16 @@ export class Registration {
|
|
|
180
180
|
}
|
|
181
181
|
async restorePreviousRegistration(caller) {
|
|
182
182
|
let abort = false;
|
|
183
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
184
|
+
log.info(`Disconnecting from Mobius socket to restore previous registration.`, {
|
|
185
|
+
file: REGISTRATION_FILE,
|
|
186
|
+
method: 'restorePreviousRegistration',
|
|
187
|
+
});
|
|
188
|
+
await this.apiRequest.disconnectFromMobiusSocket({
|
|
189
|
+
code: 3050,
|
|
190
|
+
reason: 'done (permanent)',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
183
193
|
if (this.activeMobiusUrl) {
|
|
184
194
|
abort = await this.attemptRegistrationWithServers(caller, [this.activeMobiusUrl]);
|
|
185
195
|
if (this.retryAfter) {
|
|
@@ -193,7 +203,7 @@ export class Registration {
|
|
|
193
203
|
abort = await this.attemptRegistrationWithServers(caller, this.backupMobiusUris);
|
|
194
204
|
}
|
|
195
205
|
else {
|
|
196
|
-
this.restartRegistration(caller);
|
|
206
|
+
await this.restartRegistration(caller);
|
|
197
207
|
}
|
|
198
208
|
this.retryAfter = undefined;
|
|
199
209
|
return true;
|
|
@@ -287,6 +297,13 @@ export class Registration {
|
|
|
287
297
|
log.log(`Scheduled retry with primary in ${interval} seconds, number of attempts : ${attempt}`, loggerContext);
|
|
288
298
|
}
|
|
289
299
|
else if (this.backupMobiusUris.length) {
|
|
300
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
301
|
+
log.info('Disconnecting from primary Mobius socket for failover to backup servers', loggerContext);
|
|
302
|
+
await this.apiRequest.disconnectFromMobiusSocket({
|
|
303
|
+
code: 3050,
|
|
304
|
+
reason: 'done (permanent)',
|
|
305
|
+
});
|
|
306
|
+
}
|
|
290
307
|
this.saveFailoverState({
|
|
291
308
|
attempt,
|
|
292
309
|
timeElapsed,
|
|
@@ -587,18 +604,17 @@ export class Registration {
|
|
|
587
604
|
break;
|
|
588
605
|
}
|
|
589
606
|
catch (err) {
|
|
590
|
-
connectedWebSocketUrl = undefined;
|
|
591
|
-
await this.apiRequest.disconnectFromMobiusSocket({ code: 3050, reason: 'done (permanent)' });
|
|
592
607
|
const body = err;
|
|
593
|
-
|
|
594
|
-
if (
|
|
608
|
+
const { finalError, shouldDisconnect } = await handleRegistrationErrors(body, (clientError, isFinalError) => {
|
|
609
|
+
if (isFinalError) {
|
|
595
610
|
this.lineEmitter(LINE_EVENTS.ERROR, undefined, clientError);
|
|
596
611
|
}
|
|
597
612
|
else {
|
|
598
613
|
this.lineEmitter(LINE_EVENTS.UNREGISTERED);
|
|
599
614
|
}
|
|
600
615
|
this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION_ERROR, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, caller, serverType, body.headers?.trackingid ?? '', undefined, clientError);
|
|
601
|
-
}, { method: caller, file: REGISTRATION_FILE }, (retryAfter, retryCaller) => this.handle429Retry(retryAfter, retryCaller), this.restoreRegistrationCallBack());
|
|
616
|
+
}, { method: caller, file: REGISTRATION_FILE }, (retryAfter, retryCaller) => this.handle429Retry(retryAfter, retryCaller), this.restoreRegistrationCallBack(), servers.length);
|
|
617
|
+
abort = finalError;
|
|
602
618
|
if (this.registrationStatus === RegistrationStatus.ACTIVE) {
|
|
603
619
|
log.info(`[${caller}] : Device is already restored, active mobius url: ${this.activeMobiusUrl}`, {
|
|
604
620
|
file: REGISTRATION_FILE,
|
|
@@ -606,6 +622,13 @@ export class Registration {
|
|
|
606
622
|
});
|
|
607
623
|
break;
|
|
608
624
|
}
|
|
625
|
+
if (shouldDisconnect && this.apiRequest.isSocketEnabled()) {
|
|
626
|
+
connectedWebSocketUrl = undefined;
|
|
627
|
+
await this.apiRequest.disconnectFromMobiusSocket({
|
|
628
|
+
code: 3050,
|
|
629
|
+
reason: 'done (permanent)',
|
|
630
|
+
});
|
|
631
|
+
}
|
|
609
632
|
if (abort) {
|
|
610
633
|
this.setStatus(RegistrationStatus.INACTIVE);
|
|
611
634
|
await uploadLogs();
|
|
@@ -666,7 +689,7 @@ export class Registration {
|
|
|
666
689
|
if (event.data.type === WorkerMessageType.KEEPALIVE_FAILURE) {
|
|
667
690
|
const error = event.data.err;
|
|
668
691
|
log.warn(`Keep-alive missed ${event.data.keepAliveRetryCount} times. Status -> ${error.statusCode} `, logContext);
|
|
669
|
-
const abort = await handleRegistrationErrors(error, (clientError, finalError) => {
|
|
692
|
+
const { finalError: abort } = await handleRegistrationErrors(error, (clientError, finalError) => {
|
|
670
693
|
if (finalError) {
|
|
671
694
|
this.lineEmitter(LINE_EVENTS.ERROR, undefined, clientError);
|
|
672
695
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { v4 as uuid } from 'uuid';
|
|
2
|
-
import { getMobiusSocketInstance } from '
|
|
2
|
+
import { getMobiusSocketInstance } from '../../mobius-socket';
|
|
3
3
|
import log from '../../Logger';
|
|
4
4
|
import { deriveMobiusSocketMessageType, isSupplementaryServiceMessageType, } from './mobiusSocketMapper';
|
|
5
5
|
import { MOBIUS_SOCKET_MESSAGE_TYPE } from './constants';
|
|
@@ -106,7 +106,8 @@ export function emitFinalFailure(emitterCb, loggerContext, message) {
|
|
|
106
106
|
'An unknown error occurred. Wait a moment and try again. Please contact the administrator if the problem persists.', RegistrationStatus.INACTIVE, clientError);
|
|
107
107
|
emitterCb(clientError);
|
|
108
108
|
}
|
|
109
|
-
export async function handleRegistrationErrors(err, emitterCb, loggerContext, retry429Cb, restoreRegCb) {
|
|
109
|
+
export async function handleRegistrationErrors(err, emitterCb, loggerContext, retry429Cb, restoreRegCb, serverCount = 1) {
|
|
110
|
+
let shouldDisconnect = false;
|
|
110
111
|
const lineError = createLineError('', {}, ERROR_TYPE.DEFAULT, RegistrationStatus.INACTIVE);
|
|
111
112
|
const errorCode = Number(err.statusCode);
|
|
112
113
|
let finalError = false;
|
|
@@ -117,6 +118,7 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
117
118
|
log.warn(`400 Bad Request`, loggerContext);
|
|
118
119
|
updateLineErrorContext(loggerContext, ERROR_TYPE.BAD_REQUEST, 'Invalid input. Please verify the required parameters, sign out and then sign back in with the valid data', RegistrationStatus.INACTIVE, lineError);
|
|
119
120
|
emitterCb(lineError, finalError);
|
|
121
|
+
shouldDisconnect = serverCount > 1;
|
|
120
122
|
break;
|
|
121
123
|
}
|
|
122
124
|
case ERROR_CODE.UNAUTHORIZED: {
|
|
@@ -124,6 +126,7 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
124
126
|
log.warn(`401 Unauthorized`, loggerContext);
|
|
125
127
|
updateLineErrorContext(loggerContext, ERROR_TYPE.TOKEN_ERROR, 'User is unauthorized due to an expired token. Sign out, then sign back in.', RegistrationStatus.INACTIVE, lineError);
|
|
126
128
|
emitterCb(lineError, finalError);
|
|
129
|
+
shouldDisconnect = serverCount > 1;
|
|
127
130
|
break;
|
|
128
131
|
}
|
|
129
132
|
case ERROR_CODE.DEVICE_NOT_FOUND: {
|
|
@@ -131,6 +134,7 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
131
134
|
log.warn(`404 Device Not Found`, loggerContext);
|
|
132
135
|
updateLineErrorContext(loggerContext, ERROR_TYPE.NOT_FOUND, 'Webex Calling is unable to find your device. Sign out, then sign back in', RegistrationStatus.INACTIVE, lineError);
|
|
133
136
|
emitterCb(lineError, finalError);
|
|
137
|
+
shouldDisconnect = serverCount > 1;
|
|
134
138
|
break;
|
|
135
139
|
}
|
|
136
140
|
case ERROR_CODE.TOO_MANY_REQUESTS: {
|
|
@@ -139,20 +143,23 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
139
143
|
const caller = loggerContext.method || 'handleErrors';
|
|
140
144
|
if (retry429Cb && err.headers) {
|
|
141
145
|
const retryAfter = Number(err.headers['retry-after']);
|
|
142
|
-
retry429Cb(retryAfter, caller);
|
|
146
|
+
await retry429Cb(retryAfter, caller);
|
|
143
147
|
}
|
|
148
|
+
shouldDisconnect = false;
|
|
144
149
|
break;
|
|
145
150
|
}
|
|
146
151
|
case ERROR_CODE.INTERNAL_SERVER_ERROR: {
|
|
147
152
|
log.warn(`500 Internal Server Error`, loggerContext);
|
|
148
153
|
updateLineErrorContext(loggerContext, ERROR_TYPE.SERVER_ERROR, 'An unknown error occurred while placing the request. Wait a moment and try again.', RegistrationStatus.INACTIVE, lineError);
|
|
149
154
|
emitterCb(lineError, finalError);
|
|
155
|
+
shouldDisconnect = serverCount > 1;
|
|
150
156
|
break;
|
|
151
157
|
}
|
|
152
158
|
case ERROR_CODE.SERVICE_UNAVAILABLE: {
|
|
153
159
|
log.warn(`503 Service Unavailable`, loggerContext);
|
|
154
160
|
updateLineErrorContext(loggerContext, ERROR_TYPE.SERVICE_UNAVAILABLE, 'An error occurred on the server while processing the request. Wait a moment and try again.', RegistrationStatus.INACTIVE, lineError);
|
|
155
161
|
emitterCb(lineError, finalError);
|
|
162
|
+
shouldDisconnect = serverCount > 1;
|
|
156
163
|
break;
|
|
157
164
|
}
|
|
158
165
|
case ERROR_CODE.FORBIDDEN: {
|
|
@@ -162,7 +169,8 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
162
169
|
log.warn('Error response has no body, throwing default error', loggerContext);
|
|
163
170
|
updateLineErrorContext(loggerContext, ERROR_TYPE.FORBIDDEN_ERROR, 'An unauthorized action has been received. This action has been blocked. Please contact the administrator if this persists.', RegistrationStatus.INACTIVE, lineError);
|
|
164
171
|
emitterCb(lineError, finalError);
|
|
165
|
-
|
|
172
|
+
shouldDisconnect = serverCount > 1;
|
|
173
|
+
return { finalError, shouldDisconnect };
|
|
166
174
|
}
|
|
167
175
|
const code = Number(errorBody.errorCode);
|
|
168
176
|
log.warn(`Error code found : ${code}`, loggerContext);
|
|
@@ -174,6 +182,7 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
174
182
|
const caller = loggerContext.method || 'handleErrors';
|
|
175
183
|
await restoreRegCb(errorBody, caller);
|
|
176
184
|
}
|
|
185
|
+
shouldDisconnect = false;
|
|
177
186
|
break;
|
|
178
187
|
}
|
|
179
188
|
case DEVICE_ERROR_CODE.DEVICE_CREATION_DISABLED: {
|
|
@@ -182,6 +191,7 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
182
191
|
updateLineErrorContext(loggerContext, ERROR_TYPE.FORBIDDEN_ERROR, errorMessage, RegistrationStatus.INACTIVE, lineError);
|
|
183
192
|
log.warn(errorMessage, loggerContext);
|
|
184
193
|
emitterCb(lineError, true);
|
|
194
|
+
shouldDisconnect = true;
|
|
185
195
|
break;
|
|
186
196
|
}
|
|
187
197
|
case DEVICE_ERROR_CODE.DEVICE_CREATION_FAILED: {
|
|
@@ -189,6 +199,7 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
189
199
|
updateLineErrorContext(loggerContext, ERROR_TYPE.FORBIDDEN_ERROR, errorMessage, RegistrationStatus.INACTIVE, lineError);
|
|
190
200
|
log.warn(errorMessage, loggerContext);
|
|
191
201
|
emitterCb(lineError, finalError);
|
|
202
|
+
shouldDisconnect = serverCount > 1;
|
|
192
203
|
break;
|
|
193
204
|
}
|
|
194
205
|
default: {
|
|
@@ -196,6 +207,7 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
196
207
|
updateLineErrorContext(loggerContext, ERROR_TYPE.FORBIDDEN_ERROR, errorMessage, RegistrationStatus.INACTIVE, lineError);
|
|
197
208
|
log.warn(errorMessage, loggerContext);
|
|
198
209
|
emitterCb(lineError, finalError);
|
|
210
|
+
shouldDisconnect = serverCount > 1;
|
|
199
211
|
}
|
|
200
212
|
}
|
|
201
213
|
break;
|
|
@@ -204,9 +216,10 @@ export async function handleRegistrationErrors(err, emitterCb, loggerContext, re
|
|
|
204
216
|
updateLineErrorContext(loggerContext, ERROR_TYPE.DEFAULT, 'Unknown error', RegistrationStatus.INACTIVE, lineError);
|
|
205
217
|
log.warn(`Unknown Error`, loggerContext);
|
|
206
218
|
emitterCb(lineError, finalError);
|
|
219
|
+
shouldDisconnect = serverCount > 1;
|
|
207
220
|
}
|
|
208
221
|
}
|
|
209
|
-
return finalError;
|
|
222
|
+
return { finalError, shouldDisconnect };
|
|
210
223
|
}
|
|
211
224
|
export async function handleCallingClientErrors(err, emitterCb, loggerContext) {
|
|
212
225
|
const clientError = createClientError('', {}, ERROR_TYPE.DEFAULT, RegistrationStatus.INACTIVE);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
const mobiusSocketConfig = {
|
|
5
|
+
wssResponseTimeout: process.env.MOBIUS_SOCKET_RESPONSE_TIMEOUT ||
|
|
6
|
+
process.env.MOBIUS_SOCKET_AUTH_RESPONSE_TIMEOUT ||
|
|
7
|
+
10000,
|
|
8
|
+
backoffTimeMax: process.env.MOBIUS_SOCKET_BACKOFF_TIME_MAX || 32000,
|
|
9
|
+
backoffTimeReset: process.env.MOBIUS_SOCKET_BACKOFF_TIME_RESET || 1000,
|
|
10
|
+
initialConnectionMaxRetries: process.env.MOBIUS_SOCKET_INITIAL_CONNECTION_MAX_RETRIES || 0,
|
|
11
|
+
maxRetries: process.env.MOBIUS_SOCKET_MAX_RETRIES || 0,
|
|
12
|
+
forceCloseDelay: process.env.MOBIUS_SOCKET_FORCE_CLOSE_DELAY || 2000,
|
|
13
|
+
beforeLogoutOptionsCloseReason: process.env.MOBIUS_SOCKET_LOGOUT_REASON || 'done (forced)',
|
|
14
|
+
dedupCacheMaxSize: process.env.MOBIUS_SOCKET_DEDUP_CACHE_MAX_SIZE || 1000,
|
|
15
|
+
};
|
|
16
|
+
export default {
|
|
17
|
+
mobiusSocket: mobiusSocketConfig,
|
|
18
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
import { Exception } from '@webex/common';
|
|
5
|
+
export class ConnectionError extends Exception {
|
|
6
|
+
static defaultMessage = 'Failed to connect to socket';
|
|
7
|
+
parse(event = {}) {
|
|
8
|
+
Object.defineProperties(this, {
|
|
9
|
+
code: {
|
|
10
|
+
value: event.code,
|
|
11
|
+
},
|
|
12
|
+
reason: {
|
|
13
|
+
value: event.reason,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
return event.reason;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class UnknownResponse extends ConnectionError {
|
|
20
|
+
static defaultMessage = 'UnknownResponse is produced by IE when we receive a 4XXX. You probably want to treat this like a NotFound';
|
|
21
|
+
}
|
|
22
|
+
export class BadRequest extends ConnectionError {
|
|
23
|
+
static defaultMessage = 'BadRequest usually implies an attempt to use service account credentials';
|
|
24
|
+
}
|
|
25
|
+
export class NotAuthorized extends ConnectionError {
|
|
26
|
+
static defaultMessage = 'Please refresh your access token';
|
|
27
|
+
}
|
|
28
|
+
export class Forbidden extends ConnectionError {
|
|
29
|
+
static defaultMessage = 'Forbidden usually implies these credentials are not entitled for Webex';
|
|
30
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
import '@webex/internal-plugin-device';
|
|
5
|
+
import '@webex/internal-plugin-feature';
|
|
6
|
+
import '@webex/internal-plugin-metrics';
|
|
7
|
+
import MobiusSocket from './mobius-socket';
|
|
8
|
+
import config from './config';
|
|
9
|
+
let mobiusSocketInstance;
|
|
10
|
+
export function getMobiusSocketInstance(webex, mobiusSocketConfig) {
|
|
11
|
+
if (mobiusSocketInstance) {
|
|
12
|
+
return mobiusSocketInstance;
|
|
13
|
+
}
|
|
14
|
+
mobiusSocketInstance = new MobiusSocket(webex, mobiusSocketConfig || config.mobiusSocket);
|
|
15
|
+
return mobiusSocketInstance;
|
|
16
|
+
}
|
|
17
|
+
export function resetMobiusSocketInstance() {
|
|
18
|
+
mobiusSocketInstance = undefined;
|
|
19
|
+
}
|
|
20
|
+
export default MobiusSocket;
|
|
21
|
+
export { MobiusSocket };
|
|
22
|
+
export { default as Socket } from './socket';
|
|
23
|
+
export { config };
|
|
24
|
+
export { BadRequest, ConnectionError, Forbidden, NotAuthorized, UnknownResponse } from './errors';
|