@webex/calling 3.12.0-next.3 → 3.12.0-next.31
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.js +463 -205
- package/dist/CallingClient/CallingClient.js.map +1 -1
- package/dist/CallingClient/CallingClient.test.js +170 -77
- package/dist/CallingClient/CallingClient.test.js.map +1 -1
- package/dist/CallingClient/calling/call.js +32 -8
- package/dist/CallingClient/calling/call.js.map +1 -1
- package/dist/CallingClient/calling/call.test.js +581 -445
- package/dist/CallingClient/calling/call.test.js.map +1 -1
- package/dist/CallingClient/calling/callManager.js +53 -30
- package/dist/CallingClient/calling/callManager.js.map +1 -1
- package/dist/CallingClient/calling/callManager.test.js +35 -0
- package/dist/CallingClient/calling/callManager.test.js.map +1 -1
- package/dist/CallingClient/calling/types.js +2 -0
- package/dist/CallingClient/calling/types.js.map +1 -1
- package/dist/CallingClient/constants.js +24 -3
- package/dist/CallingClient/constants.js.map +1 -1
- package/dist/CallingClient/line/line.test.js +16 -1
- package/dist/CallingClient/line/line.test.js.map +1 -1
- package/dist/CallingClient/registration/register.js +694 -406
- package/dist/CallingClient/registration/register.js.map +1 -1
- package/dist/CallingClient/registration/register.test.js +202 -21
- package/dist/CallingClient/registration/register.test.js.map +1 -1
- package/dist/CallingClient/registration/types.js.map +1 -1
- package/dist/CallingClient/registration/webWorker.js +41 -104
- package/dist/CallingClient/registration/webWorker.js.map +1 -1
- package/dist/CallingClient/registration/webWorker.test.js +39 -153
- package/dist/CallingClient/registration/webWorker.test.js.map +1 -1
- package/dist/CallingClient/registration/webWorkerStr.js +1 -1
- package/dist/CallingClient/registration/webWorkerStr.js.map +1 -1
- package/dist/CallingClient/utils/constants.js +46 -0
- package/dist/CallingClient/utils/constants.js.map +1 -0
- package/dist/CallingClient/utils/index.js +63 -0
- package/dist/CallingClient/utils/index.js.map +1 -0
- package/dist/CallingClient/utils/mobiusSocketMapper.js +122 -0
- package/dist/CallingClient/utils/mobiusSocketMapper.js.map +1 -0
- package/dist/CallingClient/utils/mobiusSocketMapper.test.js +211 -0
- package/dist/CallingClient/utils/mobiusSocketMapper.test.js.map +1 -0
- package/dist/CallingClient/utils/request.js +349 -0
- package/dist/CallingClient/utils/request.js.map +1 -0
- package/dist/CallingClient/utils/request.test.js +881 -0
- package/dist/CallingClient/utils/request.test.js.map +1 -0
- package/dist/CallingClient/utils/types.js +7 -0
- package/dist/CallingClient/utils/types.js.map +1 -0
- package/dist/CallingClient/utils/wsFeatureFlag.js +70 -0
- package/dist/CallingClient/utils/wsFeatureFlag.js.map +1 -0
- package/dist/CallingClient/utils/wsFeatureFlag.test.js +139 -0
- package/dist/CallingClient/utils/wsFeatureFlag.test.js.map +1 -0
- package/dist/Contacts/ContactsClient.test.js +3 -8
- package/dist/Contacts/ContactsClient.test.js.map +1 -1
- package/dist/Events/types.js +1 -11
- package/dist/Events/types.js.map +1 -1
- package/dist/Metrics/index.js +60 -0
- package/dist/Metrics/index.js.map +1 -1
- package/dist/Metrics/index.test.js +356 -0
- package/dist/Metrics/index.test.js.map +1 -1
- package/dist/Metrics/types.js +11 -1
- package/dist/Metrics/types.js.map +1 -1
- package/dist/SDKConnector/types.js.map +1 -1
- package/dist/common/Utils.js +138 -44
- package/dist/common/Utils.js.map +1 -1
- package/dist/common/testUtil.js +8 -4
- package/dist/common/testUtil.js.map +1 -1
- package/dist/common/types.js +2 -0
- package/dist/common/types.js.map +1 -1
- package/dist/mobius-socket/config.js +24 -0
- package/dist/mobius-socket/config.js.map +1 -0
- package/dist/mobius-socket/errors.js +150 -0
- package/dist/mobius-socket/errors.js.map +1 -0
- package/dist/mobius-socket/index.js +57 -0
- package/dist/mobius-socket/index.js.map +1 -0
- package/dist/mobius-socket/mobius-socket-events.test.js +485 -0
- package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -0
- package/dist/mobius-socket/mobius-socket.js +804 -0
- package/dist/mobius-socket/mobius-socket.js.map +1 -0
- package/dist/mobius-socket/mobius-socket.test.js +1833 -0
- package/dist/mobius-socket/mobius-socket.test.js.map +1 -0
- package/dist/mobius-socket/socket/constants.js +34 -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 +604 -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 +26 -0
- package/dist/mobius-socket/socket/socket.shim.js.map +1 -0
- package/dist/mobius-socket/socket/types.js +7 -0
- package/dist/mobius-socket/socket/types.js.map +1 -0
- package/dist/mobius-socket/socket.test.js +727 -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 +28 -0
- package/dist/mobius-socket/test/promise-tick.js.map +1 -0
- package/dist/mobius-socket/types.js +7 -0
- package/dist/mobius-socket/types.js.map +1 -0
- package/dist/module/CallingClient/CallingClient.js +141 -10
- package/dist/module/CallingClient/calling/call.js +24 -6
- package/dist/module/CallingClient/calling/callManager.js +27 -7
- package/dist/module/CallingClient/calling/types.js +2 -0
- package/dist/module/CallingClient/constants.js +20 -0
- package/dist/module/CallingClient/registration/register.js +226 -62
- package/dist/module/CallingClient/registration/webWorker.js +42 -61
- package/dist/module/CallingClient/registration/webWorkerStr.js +47 -82
- package/dist/module/CallingClient/utils/constants.js +30 -0
- package/dist/module/CallingClient/utils/index.js +5 -0
- package/dist/module/CallingClient/utils/mobiusSocketMapper.js +72 -0
- package/dist/module/CallingClient/utils/request.js +162 -0
- package/dist/module/CallingClient/utils/types.js +1 -0
- package/dist/module/CallingClient/utils/wsFeatureFlag.js +41 -0
- package/dist/module/Events/types.js +0 -10
- package/dist/module/Metrics/index.js +46 -0
- package/dist/module/Metrics/types.js +10 -0
- package/dist/module/common/Utils.js +52 -12
- package/dist/module/common/testUtil.js +5 -1
- package/dist/module/common/types.js +2 -0
- package/dist/module/mobius-socket/config.js +15 -0
- package/dist/module/mobius-socket/errors.js +64 -0
- package/dist/module/mobius-socket/index.js +24 -0
- package/dist/module/mobius-socket/mobius-socket.js +571 -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 +368 -0
- package/dist/module/mobius-socket/socket/socket.js +9 -0
- package/dist/module/mobius-socket/socket/socket.shim.js +12 -0
- package/dist/module/mobius-socket/socket/types.js +1 -0
- package/dist/module/mobius-socket/types.js +1 -0
- package/dist/types/CallingClient/CallingClient.d.ts +7 -0
- package/dist/types/CallingClient/CallingClient.d.ts.map +1 -1
- package/dist/types/CallingClient/calling/call.d.ts +2 -0
- package/dist/types/CallingClient/calling/call.d.ts.map +1 -1
- package/dist/types/CallingClient/calling/callManager.d.ts +3 -2
- package/dist/types/CallingClient/calling/callManager.d.ts.map +1 -1
- package/dist/types/CallingClient/calling/types.d.ts +21 -9
- package/dist/types/CallingClient/calling/types.d.ts.map +1 -1
- package/dist/types/CallingClient/constants.d.ts +20 -0
- package/dist/types/CallingClient/constants.d.ts.map +1 -1
- package/dist/types/CallingClient/registration/register.d.ts +6 -0
- package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
- package/dist/types/CallingClient/registration/types.d.ts +3 -1
- package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
- package/dist/types/CallingClient/registration/webWorker.d.ts.map +1 -1
- package/dist/types/CallingClient/registration/webWorkerStr.d.ts +1 -1
- package/dist/types/CallingClient/registration/webWorkerStr.d.ts.map +1 -1
- package/dist/types/CallingClient/utils/constants.d.ts +30 -0
- package/dist/types/CallingClient/utils/constants.d.ts.map +1 -0
- package/dist/types/CallingClient/utils/index.d.ts +6 -0
- package/dist/types/CallingClient/utils/index.d.ts.map +1 -0
- package/dist/types/CallingClient/utils/mobiusSocketMapper.d.ts +5 -0
- package/dist/types/CallingClient/utils/mobiusSocketMapper.d.ts.map +1 -0
- package/dist/types/CallingClient/utils/request.d.ts +23 -0
- package/dist/types/CallingClient/utils/request.d.ts.map +1 -0
- package/dist/types/CallingClient/utils/types.d.ts +29 -0
- package/dist/types/CallingClient/utils/types.d.ts.map +1 -0
- package/dist/types/CallingClient/utils/wsFeatureFlag.d.ts +4 -0
- package/dist/types/CallingClient/utils/wsFeatureFlag.d.ts.map +1 -0
- package/dist/types/Events/types.d.ts +0 -10
- package/dist/types/Events/types.d.ts.map +1 -1
- package/dist/types/Metrics/index.d.ts.map +1 -1
- package/dist/types/Metrics/types.d.ts +11 -1
- package/dist/types/Metrics/types.d.ts.map +1 -1
- package/dist/types/SDKConnector/types.d.ts +24 -0
- package/dist/types/SDKConnector/types.d.ts.map +1 -1
- package/dist/types/common/Utils.d.ts +9 -2
- package/dist/types/common/Utils.d.ts.map +1 -1
- package/dist/types/common/testUtil.d.ts +4 -1
- package/dist/types/common/testUtil.d.ts.map +1 -1
- package/dist/types/common/types.d.ts +3 -0
- package/dist/types/common/types.d.ts.map +1 -1
- package/dist/types/mobius-socket/config.d.ts +17 -0
- package/dist/types/mobius-socket/config.d.ts.map +1 -0
- package/dist/types/mobius-socket/errors.d.ts +32 -0
- package/dist/types/mobius-socket/errors.d.ts.map +1 -0
- package/dist/types/mobius-socket/index.d.ts +14 -0
- package/dist/types/mobius-socket/index.d.ts.map +1 -0
- package/dist/types/mobius-socket/mobius-socket.d.ts +48 -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 +5 -0
- package/dist/types/mobius-socket/socket/index.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket-base.d.ts +43 -0
- package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket.d.ts +6 -0
- package/dist/types/mobius-socket/socket/socket.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket.shim.d.ts +6 -0
- package/dist/types/mobius-socket/socket/socket.shim.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/types.d.ts +61 -0
- package/dist/types/mobius-socket/socket/types.d.ts.map +1 -0
- package/dist/types/mobius-socket/types.d.ts +21 -0
- package/dist/types/mobius-socket/types.d.ts.map +1 -0
- package/package.json +20 -5
- package/src/mobius-socket/socket/socket.shim.ts +22 -0
- package/src/mobius-socket/socket/socket.ts +14 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { APIRequest } from '../utils/request';
|
|
1
2
|
import { METHOD_START_MESSAGE } from '../../common/constants';
|
|
2
3
|
import { CALL_MANAGER_FILE, METHODS } from '../constants';
|
|
3
4
|
import { CALLING_CLIENT_EVENT_KEYS, LINE_EVENT_KEYS } from '../../Events/types';
|
|
@@ -15,6 +16,7 @@ export class CallManager extends Eventing {
|
|
|
15
16
|
activeMobiusUrl;
|
|
16
17
|
serviceIndicator;
|
|
17
18
|
lineDict;
|
|
19
|
+
apiRequest;
|
|
18
20
|
constructor(webex, indicator) {
|
|
19
21
|
super();
|
|
20
22
|
this.sdkConnector = SDKConnector;
|
|
@@ -24,6 +26,7 @@ export class CallManager extends Eventing {
|
|
|
24
26
|
}
|
|
25
27
|
this.lineDict = {};
|
|
26
28
|
this.webex = this.sdkConnector.getWebex();
|
|
29
|
+
this.apiRequest = APIRequest.getInstance({ webex: this.webex });
|
|
27
30
|
this.callCollection = {};
|
|
28
31
|
this.activeMobiusUrl = '';
|
|
29
32
|
this.listenForWsEvents();
|
|
@@ -59,13 +62,15 @@ export class CallManager extends Eventing {
|
|
|
59
62
|
});
|
|
60
63
|
}
|
|
61
64
|
listenForWsEvents() {
|
|
62
|
-
this.
|
|
63
|
-
this.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
if (!this.apiRequest.isSocketEnabled()) {
|
|
66
|
+
this.sdkConnector.registerListener('event:mobius', async (event) => {
|
|
67
|
+
this.dequeueWsEvents(event);
|
|
68
|
+
});
|
|
69
|
+
log.info('Successfully registered listener for Mobius events', {
|
|
70
|
+
file: CALL_MANAGER_FILE,
|
|
71
|
+
method: METHODS.REGISTER_SESSIONS_LISTENER,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
69
74
|
}
|
|
70
75
|
dequeueWsEvents(event) {
|
|
71
76
|
log.info(`${METHOD_START_MESSAGE} with event ${event}`, {
|
|
@@ -147,6 +152,21 @@ export class CallManager extends Eventing {
|
|
|
147
152
|
call.sendCallStateMachineEvt({ type: 'E_RECV_CALL_PROGRESS', data: mobiusEvent.data });
|
|
148
153
|
break;
|
|
149
154
|
}
|
|
155
|
+
case MobiusEventType.CALL_INFO: {
|
|
156
|
+
log.log(`Received call info mobiusEvent for call: ${correlationId}`, {
|
|
157
|
+
file: CALL_MANAGER_FILE,
|
|
158
|
+
method: METHODS.DEQUEUE_WS_EVENTS,
|
|
159
|
+
});
|
|
160
|
+
const call = this.getCall(correlationId);
|
|
161
|
+
if (call && mobiusEvent.data.callerId) {
|
|
162
|
+
log.info('Processing Caller-Id data', {
|
|
163
|
+
file: CALL_MANAGER_FILE,
|
|
164
|
+
method: METHODS.DEQUEUE_WS_EVENTS,
|
|
165
|
+
});
|
|
166
|
+
call.startCallerIdResolution(mobiusEvent.data.callerId);
|
|
167
|
+
}
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
150
170
|
case MobiusEventType.CALL_MEDIA: {
|
|
151
171
|
log.log(`Received call media mobiusEvent for call: ${correlationId}`, {
|
|
152
172
|
file: CALL_MANAGER_FILE,
|
|
@@ -5,6 +5,8 @@ export var MobiusEventType;
|
|
|
5
5
|
MobiusEventType["CALL_CONNECTED"] = "mobius.callconnected";
|
|
6
6
|
MobiusEventType["CALL_MEDIA"] = "mobius.media";
|
|
7
7
|
MobiusEventType["CALL_DISCONNECTED"] = "mobius.calldisconnected";
|
|
8
|
+
MobiusEventType["CALL_INFO"] = "mobius.callinfo";
|
|
9
|
+
MobiusEventType["REGISTRATION_DOWN"] = "registration.down";
|
|
8
10
|
})(MobiusEventType || (MobiusEventType = {}));
|
|
9
11
|
export var MediaState;
|
|
10
12
|
(function (MediaState) {
|
|
@@ -69,6 +69,9 @@ export const CALL_FILE = 'call';
|
|
|
69
69
|
export const CALL_MANAGER_FILE = 'callManager';
|
|
70
70
|
export const METRIC_FILE = 'metric';
|
|
71
71
|
export const REGISTRATION_FILE = 'register';
|
|
72
|
+
export const REQUEST_FILE = 'REQUEST';
|
|
73
|
+
export const MOBIUS_SOCKET_MAPPER_FILE = 'mobiusSocketMapper';
|
|
74
|
+
export const WS_FEATURE_FLAG_FILE = 'wsFeatureFlag';
|
|
72
75
|
export const CODEC_ID = 'codecId';
|
|
73
76
|
export const MEDIA_ID = 'id';
|
|
74
77
|
export const RTC_ICE_CANDIDATE_PAIR = 'RTCIceCandidatePair_';
|
|
@@ -127,6 +130,7 @@ export const MOBIUS_EU_INT = 'mobius-eu-central-1.int.infra.webex.com';
|
|
|
127
130
|
export const FAILOVER_CACHE_PREFIX = 'wxc-failover-state';
|
|
128
131
|
export const ACTIVE_MOBIUS_STORAGE_KEY = 'wxc-active-mobius';
|
|
129
132
|
export const ICE_CANDIDATES_TIMEOUT = 3000;
|
|
133
|
+
export const WCC_CALLING_RTMS_DOMAIN = 'wcc-calling-rtms-domain';
|
|
130
134
|
export const METHODS = {
|
|
131
135
|
CONSTRUCTOR: 'constructor',
|
|
132
136
|
CREATE_CALL: 'createCall',
|
|
@@ -230,4 +234,20 @@ export const METHODS = {
|
|
|
230
234
|
UPLOAD_LOGS: 'uploadLogs',
|
|
231
235
|
GET_SDK_CONNECTOR: 'getSDKConnector',
|
|
232
236
|
GET_CONNECTED_CALL: 'getConnectedCall',
|
|
237
|
+
CONNECT_TO_MOBIUS_SOCKET: 'connectToMobiusSocket',
|
|
238
|
+
REGISTER_MOBIUS_SOCKET_LISTENER: 'registerMobiusSocketListener',
|
|
239
|
+
UNREGISTER_MOBIUS_SOCKET_LISTENER: 'unregisterMobiusSocketListener',
|
|
240
|
+
HANDLE_MOBIUS_ASYNC_EVENT: 'handleMobiusAsyncEvent',
|
|
241
|
+
HANDLE_REGISTRATION_DOWN_EVENT: 'handleRegistrationDownEvent',
|
|
242
|
+
DISCONNECT_FROM_MOBIUS_SOCKET: 'disconnectFromMobiusSocket',
|
|
243
|
+
MAKE_REQUEST: 'makeRequest',
|
|
244
|
+
DERIVE_MOBIUS_SOCKET_MESSAGE_TYPE: 'deriveMobiusSocketMessageType',
|
|
245
|
+
IS_MOBIUS_WSS_ENABLED: 'isMobiusWssEnabled',
|
|
246
|
+
RESTORE_PREVIOUS_REGISTRATION: 'restorePreviousRegistration',
|
|
247
|
+
RESTART_REGISTRATION: 'restartRegistration',
|
|
248
|
+
TRIGGER_REGISTRATION: 'triggerRegistration',
|
|
249
|
+
HANDLE_404_KEEPALIVE_FAILURE: 'handle404KeepaliveFailure',
|
|
250
|
+
INITIATE_FAILBACK: 'initiateFailback',
|
|
251
|
+
EXECUTE_FAILBACK: 'executeFailback',
|
|
252
|
+
GET_RTMS_DOMAIN: 'getRTMSDomain',
|
|
233
253
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { v4 as uuid } from 'uuid';
|
|
2
1
|
import { METHOD_START_MESSAGE } from '../../common/constants';
|
|
3
2
|
import { emitFinalFailure, handleRegistrationErrors, uploadLogs } from '../../common';
|
|
4
3
|
import webWorkerStr from './webWorkerStr';
|
|
@@ -8,8 +7,9 @@ import { getCallManager } from '../calling';
|
|
|
8
7
|
import log from '../../Logger';
|
|
9
8
|
import SDKConnector from '../../SDKConnector';
|
|
10
9
|
import { ALLOWED_SERVICES, HTTP_METHODS, RegistrationStatus, ServiceIndicator, WorkerMessageType, } from '../../common/types';
|
|
11
|
-
import { CALLING_USER_AGENT, CISCO_DEVICE_URL, DEVICES_ENDPOINT_RESOURCE, SPARK_USER_AGENT,
|
|
10
|
+
import { CALLING_USER_AGENT, CISCO_DEVICE_URL, DEVICES_ENDPOINT_RESOURCE, SPARK_USER_AGENT, BASE_REG_RETRY_TIMER_VAL_IN_SEC, BASE_REG_TIMER_MFACTOR, SEC_TO_MSEC_MFACTOR, REG_RANDOM_T_FACTOR_UPPER_LIMIT, REG_TRY_BACKUP_TIMER_VAL_IN_SEC, MINUTES_TO_SEC_MFACTOR, REG_429_RETRY_UTIL, REG_FAILBACK_429_MAX_RETRIES, FAILBACK_UTIL, REGISTRATION_FILE, DEFAULT_REHOMING_INTERVAL_MIN, DEFAULT_REHOMING_INTERVAL_MAX, DEFAULT_KEEPALIVE_INTERVAL, FAILOVER_UTIL, REGISTER_UTIL, RETRY_TIMER_UPPER_LIMIT, KEEPALIVE_UTIL, REGISTRATION_UTIL, METHODS, URL_ENDPOINT, RECONNECT_ON_FAILURE_UTIL, FAILOVER_CACHE_PREFIX, } from '../constants';
|
|
12
11
|
import { LINE_EVENTS } from '../line/types';
|
|
12
|
+
import { APIRequest } from '../utils/request';
|
|
13
13
|
export class Registration {
|
|
14
14
|
sdkConnector;
|
|
15
15
|
webex;
|
|
@@ -36,6 +36,7 @@ export class Registration {
|
|
|
36
36
|
retryAfter;
|
|
37
37
|
scheduled429Retry = false;
|
|
38
38
|
webWorker;
|
|
39
|
+
apiRequest;
|
|
39
40
|
constructor(webex, serviceData, mutex, lineEmitter, logLevel, jwe) {
|
|
40
41
|
this.jwe = jwe;
|
|
41
42
|
this.sdkConnector = SDKConnector;
|
|
@@ -57,6 +58,12 @@ export class Registration {
|
|
|
57
58
|
this.lineEmitter = lineEmitter;
|
|
58
59
|
this.primaryMobiusUris = [];
|
|
59
60
|
this.backupMobiusUris = [];
|
|
61
|
+
this.apiRequest = APIRequest.getInstance({ webex: this.webex });
|
|
62
|
+
}
|
|
63
|
+
getServerType(url) {
|
|
64
|
+
return ((this.primaryMobiusUris.includes(url) && 'PRIMARY') ||
|
|
65
|
+
(this.backupMobiusUris?.includes(url) && 'BACKUP') ||
|
|
66
|
+
'UNKNOWN');
|
|
60
67
|
}
|
|
61
68
|
getFailoverCacheKey() {
|
|
62
69
|
return `${FAILOVER_CACHE_PREFIX}.${this.userId || 'unknown'}`;
|
|
@@ -131,16 +138,22 @@ export class Registration {
|
|
|
131
138
|
}
|
|
132
139
|
async deleteRegistration(url, deviceId, deviceUrl) {
|
|
133
140
|
let response;
|
|
141
|
+
const requestObj = {
|
|
142
|
+
uri: `${url}${DEVICES_ENDPOINT_RESOURCE}/${deviceId}`,
|
|
143
|
+
method: HTTP_METHODS.DELETE,
|
|
144
|
+
headers: {
|
|
145
|
+
[CISCO_DEVICE_URL]: deviceUrl,
|
|
146
|
+
[SPARK_USER_AGENT]: CALLING_USER_AGENT,
|
|
147
|
+
},
|
|
148
|
+
service: ALLOWED_SERVICES.MOBIUS,
|
|
149
|
+
};
|
|
150
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
151
|
+
requestObj.body = {
|
|
152
|
+
deviceId,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
134
155
|
try {
|
|
135
|
-
response = await
|
|
136
|
-
method: HTTP_METHODS.DELETE,
|
|
137
|
-
headers: {
|
|
138
|
-
[CISCO_DEVICE_URL]: deviceUrl,
|
|
139
|
-
Authorization: await this.webex.credentials.getUserToken(),
|
|
140
|
-
trackingId: `${WEBEX_WEB_CLIENT}_${uuid()}`,
|
|
141
|
-
[SPARK_USER_AGENT]: CALLING_USER_AGENT,
|
|
142
|
-
},
|
|
143
|
-
});
|
|
156
|
+
response = await this.apiRequest.makeRequest(requestObj);
|
|
144
157
|
}
|
|
145
158
|
catch (error) {
|
|
146
159
|
log.warn(`Delete failed with Mobius: ${JSON.stringify(error)}`, {
|
|
@@ -151,7 +164,7 @@ export class Registration {
|
|
|
151
164
|
}
|
|
152
165
|
this.setStatus(RegistrationStatus.INACTIVE);
|
|
153
166
|
this.lineEmitter(LINE_EVENTS.UNREGISTERED);
|
|
154
|
-
return response
|
|
167
|
+
return response;
|
|
155
168
|
}
|
|
156
169
|
async postRegistration(url) {
|
|
157
170
|
const deviceInfo = {
|
|
@@ -159,7 +172,7 @@ export class Registration {
|
|
|
159
172
|
clientDeviceUri: this.webex.internal.device.url,
|
|
160
173
|
serviceData: this.jwe ? { ...this.serviceData, jwe: this.jwe } : this.serviceData,
|
|
161
174
|
};
|
|
162
|
-
return this.
|
|
175
|
+
return this.apiRequest.makeRequest({
|
|
163
176
|
uri: `${url}device`,
|
|
164
177
|
method: HTTP_METHODS.POST,
|
|
165
178
|
headers: {
|
|
@@ -171,7 +184,22 @@ export class Registration {
|
|
|
171
184
|
});
|
|
172
185
|
}
|
|
173
186
|
async restorePreviousRegistration(caller) {
|
|
187
|
+
const loggerContext = {
|
|
188
|
+
file: REGISTRATION_FILE,
|
|
189
|
+
method: METHODS.RESTORE_PREVIOUS_REGISTRATION,
|
|
190
|
+
};
|
|
191
|
+
log.info(`${METHOD_START_MESSAGE} - caller: ${caller}, activeMobiusUrl: ${this.activeMobiusUrl}`, loggerContext);
|
|
174
192
|
let abort = false;
|
|
193
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
194
|
+
log.info(`Disconnecting from Mobius socket to restore previous registration.`, {
|
|
195
|
+
file: REGISTRATION_FILE,
|
|
196
|
+
method: 'restorePreviousRegistration',
|
|
197
|
+
});
|
|
198
|
+
await this.apiRequest.disconnectFromMobiusSocket({
|
|
199
|
+
code: 3050,
|
|
200
|
+
reason: 'done (permanent)',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
175
203
|
if (this.activeMobiusUrl) {
|
|
176
204
|
abort = await this.attemptRegistrationWithServers(caller, [this.activeMobiusUrl]);
|
|
177
205
|
if (this.retryAfter) {
|
|
@@ -185,20 +213,31 @@ export class Registration {
|
|
|
185
213
|
abort = await this.attemptRegistrationWithServers(caller, this.backupMobiusUris);
|
|
186
214
|
}
|
|
187
215
|
else {
|
|
188
|
-
this.restartRegistration(caller);
|
|
216
|
+
await this.restartRegistration(caller);
|
|
189
217
|
}
|
|
190
218
|
this.retryAfter = undefined;
|
|
219
|
+
log.log(`restorePreviousRegistration completed via 429 retry-after path - caller: ${caller}`, loggerContext);
|
|
191
220
|
return true;
|
|
192
221
|
}
|
|
193
222
|
}
|
|
223
|
+
log.log(`restorePreviousRegistration completed - caller: ${caller}, deviceRegistered: ${this.isDeviceRegistered()}, abort: ${abort}`, loggerContext);
|
|
194
224
|
return abort;
|
|
195
225
|
}
|
|
196
226
|
async handle404KeepaliveFailure(caller) {
|
|
227
|
+
const loggerContext = {
|
|
228
|
+
file: REGISTRATION_FILE,
|
|
229
|
+
method: METHODS.HANDLE_404_KEEPALIVE_FAILURE,
|
|
230
|
+
};
|
|
231
|
+
log.info(`${METHOD_START_MESSAGE} - caller: ${caller}`, loggerContext);
|
|
197
232
|
if (caller === KEEPALIVE_UTIL) {
|
|
198
233
|
const abort = await this.attemptRegistrationWithServers(caller);
|
|
199
234
|
if (!abort && !this.isDeviceRegistered()) {
|
|
235
|
+
log.warn('Keepalive 404 recovery: re-registration did not complete, starting failover timer', loggerContext);
|
|
200
236
|
await this.startFailoverTimer();
|
|
201
237
|
}
|
|
238
|
+
else {
|
|
239
|
+
log.log(`Keepalive 404 recovery handled - deviceRegistered: ${this.isDeviceRegistered()}, abort: ${abort}`, loggerContext);
|
|
240
|
+
}
|
|
202
241
|
}
|
|
203
242
|
}
|
|
204
243
|
async handle429Retry(retryAfter, caller) {
|
|
@@ -279,6 +318,14 @@ export class Registration {
|
|
|
279
318
|
log.log(`Scheduled retry with primary in ${interval} seconds, number of attempts : ${attempt}`, loggerContext);
|
|
280
319
|
}
|
|
281
320
|
else if (this.backupMobiusUris.length) {
|
|
321
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
322
|
+
log.info('Disconnecting from primary Mobius socket for failover to backup servers', loggerContext);
|
|
323
|
+
await this.apiRequest.disconnectFromMobiusSocket({
|
|
324
|
+
code: 3050,
|
|
325
|
+
reason: 'done (permanent)',
|
|
326
|
+
});
|
|
327
|
+
log.log('Mobius socket disconnect complete prior to backup failover', loggerContext);
|
|
328
|
+
}
|
|
282
329
|
this.saveFailoverState({
|
|
283
330
|
attempt,
|
|
284
331
|
timeElapsed,
|
|
@@ -311,7 +358,7 @@ export class Registration {
|
|
|
311
358
|
await uploadLogs();
|
|
312
359
|
emitFinalFailure((clientError) => {
|
|
313
360
|
this.lineEmitter(LINE_EVENTS.ERROR, undefined, clientError);
|
|
314
|
-
}, loggerContext);
|
|
361
|
+
}, loggerContext, interval < 0 ? 'Timer threshold exceeded during failover' : undefined);
|
|
315
362
|
}
|
|
316
363
|
}
|
|
317
364
|
clearFailbackTimer() {
|
|
@@ -320,11 +367,25 @@ export class Registration {
|
|
|
320
367
|
this.failbackTimer = undefined;
|
|
321
368
|
}
|
|
322
369
|
}
|
|
370
|
+
async postKeepAlive(deviceUrl, url) {
|
|
371
|
+
return this.apiRequest.makeRequest({
|
|
372
|
+
uri: `${url}/status`,
|
|
373
|
+
method: HTTP_METHODS.POST,
|
|
374
|
+
headers: {
|
|
375
|
+
[CISCO_DEVICE_URL]: deviceUrl,
|
|
376
|
+
[SPARK_USER_AGENT]: CALLING_USER_AGENT,
|
|
377
|
+
},
|
|
378
|
+
body: {
|
|
379
|
+
deviceId: this.deviceInfo.device?.deviceId,
|
|
380
|
+
},
|
|
381
|
+
service: ALLOWED_SERVICES.MOBIUS,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
323
384
|
async isPrimaryActive() {
|
|
324
385
|
let status;
|
|
325
386
|
for (const mobiusUrl of this.primaryMobiusUris) {
|
|
326
387
|
try {
|
|
327
|
-
const baseUri = mobiusUrl.replace(URL_ENDPOINT, '/');
|
|
388
|
+
const baseUri = mobiusUrl.replace(URL_ENDPOINT, '/').replace('wss://', 'https://');
|
|
328
389
|
const response = await this.webex.request({
|
|
329
390
|
uri: `${baseUri}ping`,
|
|
330
391
|
method: HTTP_METHODS.GET,
|
|
@@ -362,14 +423,23 @@ export class Registration {
|
|
|
362
423
|
this.rehomingIntervalMin);
|
|
363
424
|
}
|
|
364
425
|
initiateFailback() {
|
|
426
|
+
const loggerContext = {
|
|
427
|
+
file: REGISTRATION_FILE,
|
|
428
|
+
method: METHODS.INITIATE_FAILBACK,
|
|
429
|
+
};
|
|
365
430
|
if (this.isFailbackRequired()) {
|
|
366
431
|
if (!this.failbackTimer) {
|
|
367
432
|
this.failback429RetryAttempts = 0;
|
|
368
433
|
const intervalInMinutes = this.getFailbackInterval();
|
|
434
|
+
log.info(`Scheduling failback to primary - intervalMinutes: ${intervalInMinutes}`, loggerContext);
|
|
369
435
|
this.startFailbackTimer(intervalInMinutes * MINUTES_TO_SEC_MFACTOR);
|
|
370
436
|
}
|
|
437
|
+
else {
|
|
438
|
+
log.info('Failback timer already scheduled, skipping', loggerContext);
|
|
439
|
+
}
|
|
371
440
|
}
|
|
372
441
|
else {
|
|
442
|
+
log.info('Failback not required, clearing any pending failback timer', loggerContext);
|
|
373
443
|
this.failback429RetryAttempts = 0;
|
|
374
444
|
this.clearFailbackTimer();
|
|
375
445
|
}
|
|
@@ -382,15 +452,25 @@ export class Registration {
|
|
|
382
452
|
});
|
|
383
453
|
}
|
|
384
454
|
async executeFailback() {
|
|
455
|
+
const loggerContext = {
|
|
456
|
+
file: REGISTRATION_FILE,
|
|
457
|
+
method: METHODS.EXECUTE_FAILBACK,
|
|
458
|
+
};
|
|
459
|
+
log.info(METHOD_START_MESSAGE, loggerContext);
|
|
385
460
|
await this.mutex.runExclusive(async () => {
|
|
386
461
|
if (this.isFailbackRequired()) {
|
|
387
462
|
const primaryServerStatus = await this.isPrimaryActive();
|
|
388
463
|
if (Object.keys(this.callManager.getActiveCalls()).length === 0 && primaryServerStatus) {
|
|
389
|
-
log.info(`Attempting failback to primary.`,
|
|
390
|
-
file: REGISTRATION_FILE,
|
|
391
|
-
method: this.executeFailback.name,
|
|
392
|
-
});
|
|
464
|
+
log.info(`Attempting failback to primary.`, loggerContext);
|
|
393
465
|
await this.deregister();
|
|
466
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
467
|
+
log.info('Disconnecting from backup Mobius socket for failback to primary', loggerContext);
|
|
468
|
+
await this.apiRequest.disconnectFromMobiusSocket({
|
|
469
|
+
code: 3050,
|
|
470
|
+
reason: 'done (permanent)',
|
|
471
|
+
});
|
|
472
|
+
log.log('Mobius socket disconnect complete prior to primary failback', loggerContext);
|
|
473
|
+
}
|
|
394
474
|
const abort = await this.attemptRegistrationWithServers(FAILBACK_UTIL);
|
|
395
475
|
if (this.scheduled429Retry || abort || this.isDeviceRegistered()) {
|
|
396
476
|
return;
|
|
@@ -401,7 +481,7 @@ export class Registration {
|
|
|
401
481
|
return;
|
|
402
482
|
}
|
|
403
483
|
if (!this.isDeviceRegistered()) {
|
|
404
|
-
await this.restartRegistration(
|
|
484
|
+
await this.restartRegistration(loggerContext.method);
|
|
405
485
|
}
|
|
406
486
|
else {
|
|
407
487
|
this.failbackTimer = undefined;
|
|
@@ -409,10 +489,7 @@ export class Registration {
|
|
|
409
489
|
}
|
|
410
490
|
}
|
|
411
491
|
else {
|
|
412
|
-
log.info('Active calls present or primary Mobius is down, deferring failback to next cycle.',
|
|
413
|
-
file: REGISTRATION_FILE,
|
|
414
|
-
method: this.executeFailback.name,
|
|
415
|
-
});
|
|
492
|
+
log.info('Active calls present or primary Mobius is down, deferring failback to next cycle.', loggerContext);
|
|
416
493
|
this.failbackTimer = undefined;
|
|
417
494
|
this.initiateFailback();
|
|
418
495
|
}
|
|
@@ -442,12 +519,18 @@ export class Registration {
|
|
|
442
519
|
this.registrationStatus = value;
|
|
443
520
|
}
|
|
444
521
|
async restartRegistration(caller) {
|
|
522
|
+
const loggerContext = {
|
|
523
|
+
file: REGISTRATION_FILE,
|
|
524
|
+
method: METHODS.RESTART_REGISTRATION,
|
|
525
|
+
};
|
|
526
|
+
log.info(`${METHOD_START_MESSAGE} - caller: ${caller}`, loggerContext);
|
|
445
527
|
this.clearFailbackTimer();
|
|
446
528
|
this.failback429RetryAttempts = 0;
|
|
447
529
|
const abort = await this.attemptRegistrationWithServers(caller, this.primaryMobiusUris);
|
|
448
530
|
if (!abort && !this.isDeviceRegistered()) {
|
|
449
531
|
await this.startFailoverTimer();
|
|
450
532
|
}
|
|
533
|
+
log.log(`restartRegistration completed - caller: ${caller}, deviceRegistered: ${this.isDeviceRegistered()}, abort: ${abort}`, loggerContext);
|
|
451
534
|
}
|
|
452
535
|
async handleConnectionRestoration(retry) {
|
|
453
536
|
log.info(METHOD_START_MESSAGE, {
|
|
@@ -500,7 +583,13 @@ export class Registration {
|
|
|
500
583
|
};
|
|
501
584
|
}
|
|
502
585
|
async triggerRegistration() {
|
|
586
|
+
const loggerContext = {
|
|
587
|
+
file: REGISTRATION_FILE,
|
|
588
|
+
method: METHODS.TRIGGER_REGISTRATION,
|
|
589
|
+
};
|
|
590
|
+
log.info(METHOD_START_MESSAGE, loggerContext);
|
|
503
591
|
if (await this.resumeFailover()) {
|
|
592
|
+
log.info('Registration trigger handled by resumeFailover path', loggerContext);
|
|
504
593
|
return;
|
|
505
594
|
}
|
|
506
595
|
if (this.primaryMobiusUris.length > 0) {
|
|
@@ -508,43 +597,48 @@ export class Registration {
|
|
|
508
597
|
if (!this.isDeviceRegistered() && !abort) {
|
|
509
598
|
await this.startFailoverTimer();
|
|
510
599
|
}
|
|
600
|
+
log.log(`triggerRegistration completed - deviceRegistered: ${this.isDeviceRegistered()}, abort: ${abort}`, loggerContext);
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
log.warn('triggerRegistration skipped: no primary Mobius URIs available', loggerContext);
|
|
511
604
|
}
|
|
512
605
|
}
|
|
513
606
|
async attemptRegistrationWithServers(caller, servers = this.primaryMobiusUris) {
|
|
607
|
+
const loggerContext = {
|
|
608
|
+
file: REGISTRATION_FILE,
|
|
609
|
+
method: REGISTER_UTIL,
|
|
610
|
+
};
|
|
514
611
|
let abort = false;
|
|
515
612
|
this.retryAfter = undefined;
|
|
613
|
+
let connectedWebSocketUrl;
|
|
516
614
|
if (this.failoverImmediately) {
|
|
517
615
|
return abort;
|
|
518
616
|
}
|
|
519
617
|
if (this.isDeviceRegistered()) {
|
|
520
|
-
log.info(`[${caller}] : Device already registered with : ${this.activeMobiusUrl}`,
|
|
521
|
-
file: REGISTRATION_FILE,
|
|
522
|
-
method: REGISTER_UTIL,
|
|
523
|
-
});
|
|
618
|
+
log.info(`[${caller}] : Device already registered with : ${this.activeMobiusUrl}`, loggerContext);
|
|
524
619
|
return abort;
|
|
525
620
|
}
|
|
526
621
|
for (const url of servers) {
|
|
527
|
-
const serverType =
|
|
528
|
-
(this.backupMobiusUris?.includes(url) && 'BACKUP') ||
|
|
529
|
-
'UNKNOWN';
|
|
622
|
+
const serverType = this.getServerType(url);
|
|
530
623
|
try {
|
|
531
624
|
abort = false;
|
|
532
625
|
this.registrationStatus = RegistrationStatus.INACTIVE;
|
|
533
626
|
this.lineEmitter(LINE_EVENTS.CONNECTING);
|
|
534
|
-
log.info(`[${caller}] : Mobius url to contact: ${url}`,
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
627
|
+
log.info(`[${caller}] : Mobius url to contact: ${url}`, loggerContext);
|
|
628
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
629
|
+
const wssNormalizedUrl = url.endsWith('/') ? url.slice(0, -1) : url;
|
|
630
|
+
log.info(`[${caller}] : Connecting to Mobius WebSocket - serverType: ${serverType}, wssUrl: ${wssNormalizedUrl}`, loggerContext);
|
|
631
|
+
connectedWebSocketUrl = await this.apiRequest.connectToMobiusSocket(wssNormalizedUrl);
|
|
632
|
+
connectedWebSocketUrl = connectedWebSocketUrl ? `${connectedWebSocketUrl}/` : undefined;
|
|
633
|
+
log.log(`[${caller}] : Mobius WebSocket connected - serverType: ${serverType}, connectedWebSocketUrl: ${connectedWebSocketUrl}`, loggerContext);
|
|
634
|
+
}
|
|
538
635
|
const resp = await this.postRegistration(url);
|
|
539
636
|
this.clearFailoverState();
|
|
540
637
|
this.deviceInfo = resp.body;
|
|
541
638
|
this.registrationStatus = RegistrationStatus.ACTIVE;
|
|
542
|
-
this.setActiveMobiusUrl(url);
|
|
639
|
+
this.setActiveMobiusUrl(connectedWebSocketUrl || url);
|
|
543
640
|
this.lineEmitter(LINE_EVENTS.REGISTERED, resp.body);
|
|
544
|
-
log.log(`Registration successful for deviceId: ${this.deviceInfo.device?.deviceId} userId: ${this.userId} responseTrackingId: ${resp.headers?.trackingid}`,
|
|
545
|
-
file: REGISTRATION_FILE,
|
|
546
|
-
method: METHODS.REGISTER,
|
|
547
|
-
});
|
|
641
|
+
log.log(`Registration successful for deviceId: ${this.deviceInfo.device?.deviceId} userId: ${this.userId} responseTrackingId: ${resp.headers?.trackingid}`, loggerContext);
|
|
548
642
|
this.setIntervalValues(this.deviceInfo);
|
|
549
643
|
this.metricManager.setDeviceInfo(this.deviceInfo);
|
|
550
644
|
this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, caller, serverType, resp.headers?.trackingid ?? '', undefined, undefined);
|
|
@@ -554,22 +648,29 @@ export class Registration {
|
|
|
554
648
|
}
|
|
555
649
|
catch (err) {
|
|
556
650
|
const body = err;
|
|
557
|
-
|
|
558
|
-
if (
|
|
651
|
+
const { finalError, shouldDisconnect } = await handleRegistrationErrors(body, (clientError, isFinalError) => {
|
|
652
|
+
if (isFinalError) {
|
|
559
653
|
this.lineEmitter(LINE_EVENTS.ERROR, undefined, clientError);
|
|
560
654
|
}
|
|
561
655
|
else {
|
|
562
656
|
this.lineEmitter(LINE_EVENTS.UNREGISTERED);
|
|
563
657
|
}
|
|
564
658
|
this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION_ERROR, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, caller, serverType, body.headers?.trackingid ?? '', undefined, clientError);
|
|
565
|
-
}, { method: caller, file: REGISTRATION_FILE }, (retryAfter, retryCaller) => this.handle429Retry(retryAfter, retryCaller), this.restoreRegistrationCallBack());
|
|
659
|
+
}, { method: caller, file: REGISTRATION_FILE }, (retryAfter, retryCaller) => this.handle429Retry(retryAfter, retryCaller), this.restoreRegistrationCallBack(), servers.length);
|
|
660
|
+
abort = finalError;
|
|
566
661
|
if (this.registrationStatus === RegistrationStatus.ACTIVE) {
|
|
567
|
-
log.info(`[${caller}] : Device is already restored, active mobius url: ${this.activeMobiusUrl}`,
|
|
568
|
-
file: REGISTRATION_FILE,
|
|
569
|
-
method: this.attemptRegistrationWithServers.name,
|
|
570
|
-
});
|
|
662
|
+
log.info(`[${caller}] : Device is already restored, active mobius url: ${this.activeMobiusUrl}`, loggerContext);
|
|
571
663
|
break;
|
|
572
664
|
}
|
|
665
|
+
if (shouldDisconnect && this.apiRequest.isSocketEnabled()) {
|
|
666
|
+
connectedWebSocketUrl = undefined;
|
|
667
|
+
log.info(`[${caller}] : Tearing down Mobius WebSocket after registration error - serverType: ${serverType}`, loggerContext);
|
|
668
|
+
await this.apiRequest.disconnectFromMobiusSocket({
|
|
669
|
+
code: 3050,
|
|
670
|
+
reason: 'done (permanent)',
|
|
671
|
+
});
|
|
672
|
+
log.log(`[${caller}] : Mobius WebSocket disconnect complete after registration error - serverType: ${serverType}`, loggerContext);
|
|
673
|
+
}
|
|
573
674
|
if (abort) {
|
|
574
675
|
this.setStatus(RegistrationStatus.INACTIVE);
|
|
575
676
|
await uploadLogs();
|
|
@@ -584,7 +685,6 @@ export class Registration {
|
|
|
584
685
|
const RETRY_COUNT_THRESHOLD = this.isCCFlow ? 4 : 5;
|
|
585
686
|
await this.mutex.runExclusive(async () => {
|
|
586
687
|
if (this.isDeviceRegistered()) {
|
|
587
|
-
const accessToken = await this.webex.credentials.getUserToken();
|
|
588
688
|
if (!this.webWorker) {
|
|
589
689
|
const blob = new Blob([webWorkerStr], { type: 'application/javascript' });
|
|
590
690
|
const blobUrl = URL.createObjectURL(blob);
|
|
@@ -592,17 +692,38 @@ export class Registration {
|
|
|
592
692
|
URL.revokeObjectURL(blobUrl);
|
|
593
693
|
this.webWorker.postMessage({
|
|
594
694
|
type: WorkerMessageType.START_KEEPALIVE,
|
|
595
|
-
accessToken: String(accessToken),
|
|
596
|
-
deviceUrl: String(this.webex.internal.device.url),
|
|
597
695
|
interval,
|
|
598
696
|
retryCountThreshold: RETRY_COUNT_THRESHOLD,
|
|
599
|
-
url,
|
|
600
697
|
});
|
|
601
698
|
this.webWorker.onmessage = async (event) => {
|
|
602
699
|
const logContext = {
|
|
603
700
|
file: REGISTRATION_FILE,
|
|
604
701
|
method: KEEPALIVE_UTIL,
|
|
605
702
|
};
|
|
703
|
+
if (event.data.type === WorkerMessageType.SEND_KEEPALIVE) {
|
|
704
|
+
try {
|
|
705
|
+
const res = await this.postKeepAlive(String(this.webex.internal.device.url), url);
|
|
706
|
+
this.webWorker?.postMessage({
|
|
707
|
+
type: WorkerMessageType.KEEPALIVE_RESULT,
|
|
708
|
+
statusCode: res.statusCode,
|
|
709
|
+
});
|
|
710
|
+
}
|
|
711
|
+
catch (err) {
|
|
712
|
+
const error = {
|
|
713
|
+
headers: {
|
|
714
|
+
trackingid: err.headers?.trackingid,
|
|
715
|
+
'retry-after': err.headers['retry-after'],
|
|
716
|
+
},
|
|
717
|
+
statusCode: err.statusCode,
|
|
718
|
+
statusText: err.statusText,
|
|
719
|
+
type: err.type,
|
|
720
|
+
};
|
|
721
|
+
this.webWorker?.postMessage({
|
|
722
|
+
type: WorkerMessageType.KEEPALIVE_RESULT,
|
|
723
|
+
err: error,
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
}
|
|
606
727
|
if (event.data.type === WorkerMessageType.KEEPALIVE_SUCCESS) {
|
|
607
728
|
log.info(`Sent Keepalive, status: ${event.data.statusCode}`, logContext);
|
|
608
729
|
this.lineEmitter(LINE_EVENTS.RECONNECTED);
|
|
@@ -610,7 +731,7 @@ export class Registration {
|
|
|
610
731
|
if (event.data.type === WorkerMessageType.KEEPALIVE_FAILURE) {
|
|
611
732
|
const error = event.data.err;
|
|
612
733
|
log.warn(`Keep-alive missed ${event.data.keepAliveRetryCount} times. Status -> ${error.statusCode} `, logContext);
|
|
613
|
-
const abort = await handleRegistrationErrors(error, (clientError, finalError) => {
|
|
734
|
+
const { finalError: abort } = await handleRegistrationErrors(error, (clientError, finalError) => {
|
|
614
735
|
if (finalError) {
|
|
615
736
|
this.lineEmitter(LINE_EVENTS.ERROR, undefined, clientError);
|
|
616
737
|
}
|
|
@@ -650,18 +771,17 @@ export class Registration {
|
|
|
650
771
|
return this.reconnectPending;
|
|
651
772
|
}
|
|
652
773
|
async deregister() {
|
|
774
|
+
const loggerContext = {
|
|
775
|
+
file: REGISTRATION_FILE,
|
|
776
|
+
method: METHODS.DEREGISTER,
|
|
777
|
+
};
|
|
778
|
+
log.info(METHOD_START_MESSAGE, loggerContext);
|
|
653
779
|
try {
|
|
654
780
|
await this.deleteRegistration(this.activeMobiusUrl, this.deviceInfo.device?.deviceId, this.deviceInfo.device?.clientDeviceUri);
|
|
655
|
-
log.log('Registration successfully deregistered',
|
|
656
|
-
file: REGISTRATION_FILE,
|
|
657
|
-
method: METHODS.DEREGISTER,
|
|
658
|
-
});
|
|
781
|
+
log.log('Registration successfully deregistered', loggerContext);
|
|
659
782
|
}
|
|
660
783
|
catch (err) {
|
|
661
|
-
log.warn(`Delete failed with Mobius: ${JSON.stringify(err)}`,
|
|
662
|
-
file: REGISTRATION_FILE,
|
|
663
|
-
method: METHODS.DEREGISTER,
|
|
664
|
-
});
|
|
784
|
+
log.warn(`Delete failed with Mobius: ${JSON.stringify(err)}`, loggerContext);
|
|
665
785
|
}
|
|
666
786
|
this.clearKeepaliveTimer();
|
|
667
787
|
this.setStatus(RegistrationStatus.INACTIVE);
|
|
@@ -683,7 +803,10 @@ export class Registration {
|
|
|
683
803
|
rehomingIntervalMin: DEFAULT_REHOMING_INTERVAL_MIN,
|
|
684
804
|
};
|
|
685
805
|
const stringToReplace = `${DEVICES_ENDPOINT_RESOURCE}/${restoreData.devices[0].deviceId}`;
|
|
686
|
-
|
|
806
|
+
let uri = restoreData.devices[0].uri.replace(stringToReplace, '');
|
|
807
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
808
|
+
uri = uri.replace('https://', 'wss://');
|
|
809
|
+
}
|
|
687
810
|
this.setActiveMobiusUrl(uri);
|
|
688
811
|
this.registrationStatus = RegistrationStatus.ACTIVE;
|
|
689
812
|
return true;
|
|
@@ -709,5 +832,46 @@ export class Registration {
|
|
|
709
832
|
}
|
|
710
833
|
}
|
|
711
834
|
}
|
|
835
|
+
async handleRegistrationDownEvent(event) {
|
|
836
|
+
const loggerContext = {
|
|
837
|
+
file: REGISTRATION_FILE,
|
|
838
|
+
method: METHODS.HANDLE_REGISTRATION_DOWN_EVENT,
|
|
839
|
+
};
|
|
840
|
+
log.info(`Registration down received - trackingId: ${event?.trackingId ?? 'unknown'}, eventId: ${event?.eventId ?? 'unknown'}`, loggerContext);
|
|
841
|
+
const [activeCall] = Object.values(this.callManager.getActiveCalls());
|
|
842
|
+
activeCall?.end();
|
|
843
|
+
await this.performRegistrationDownCleanup(METHODS.HANDLE_REGISTRATION_DOWN_EVENT);
|
|
844
|
+
}
|
|
845
|
+
async performRegistrationDownCleanup(caller) {
|
|
846
|
+
const loggerContext = {
|
|
847
|
+
file: REGISTRATION_FILE,
|
|
848
|
+
method: METHODS.HANDLE_REGISTRATION_DOWN_EVENT,
|
|
849
|
+
};
|
|
850
|
+
log.info(`[${caller}] : Running registration-down cleanup`, loggerContext);
|
|
851
|
+
await this.mutex.runExclusive(async () => {
|
|
852
|
+
this.clearFailbackTimer();
|
|
853
|
+
this.clearKeepaliveTimer();
|
|
854
|
+
this.reconnectPending = false;
|
|
855
|
+
this.scheduled429Retry = false;
|
|
856
|
+
this.failoverImmediately = false;
|
|
857
|
+
this.retryAfter = undefined;
|
|
858
|
+
this.registerRetry = false;
|
|
859
|
+
this.clearFailoverState();
|
|
860
|
+
this.setStatus(RegistrationStatus.INACTIVE);
|
|
861
|
+
if (this.apiRequest.isSocketEnabled()) {
|
|
862
|
+
try {
|
|
863
|
+
await this.apiRequest.disconnectFromMobiusSocket({
|
|
864
|
+
code: 3050,
|
|
865
|
+
reason: 'done (permanent)',
|
|
866
|
+
});
|
|
867
|
+
log.log('Mobius socket disconnect complete after registration-down', loggerContext);
|
|
868
|
+
}
|
|
869
|
+
catch (err) {
|
|
870
|
+
log.warn(`Mobius socket disconnect failed after registration-down: ${String(err)}`, loggerContext);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
this.lineEmitter(LINE_EVENTS.UNREGISTERED);
|
|
874
|
+
});
|
|
875
|
+
}
|
|
712
876
|
}
|
|
713
877
|
export const createRegistration = (webex, serviceData, mutex, lineEmitter, logLevel, jwe) => new Registration(webex, serviceData, mutex, lineEmitter, logLevel, jwe);
|