@webex/calling 3.9.0-webinar5k.1 → 3.10.0
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/CallHistory/CallHistory.js +51 -46
- package/dist/CallHistory/CallHistory.js.map +1 -1
- package/dist/CallHistory/CallHistory.test.js +146 -147
- package/dist/CallHistory/CallHistory.test.js.map +1 -1
- package/dist/CallHistory/callHistoryFixtures.js.map +1 -1
- package/dist/CallHistory/constants.js.map +1 -1
- package/dist/CallHistory/types.js.map +1 -1
- package/dist/CallSettings/CallSettings.js +8 -8
- package/dist/CallSettings/CallSettings.js.map +1 -1
- package/dist/CallSettings/CallSettings.test.js +1 -1
- package/dist/CallSettings/CallSettings.test.js.map +1 -1
- package/dist/CallSettings/UcmBackendConnector.js +12 -11
- package/dist/CallSettings/UcmBackendConnector.js.map +1 -1
- package/dist/CallSettings/UcmBackendConnector.test.js +9 -10
- package/dist/CallSettings/UcmBackendConnector.test.js.map +1 -1
- package/dist/CallSettings/WxCallBackendConnector.js +66 -59
- package/dist/CallSettings/WxCallBackendConnector.js.map +1 -1
- package/dist/CallSettings/WxCallBackendConnector.test.js +108 -109
- package/dist/CallSettings/WxCallBackendConnector.test.js.map +1 -1
- package/dist/CallSettings/constants.js.map +1 -1
- package/dist/CallSettings/testFixtures.js.map +1 -1
- package/dist/CallSettings/types.js.map +1 -1
- package/dist/CallingClient/CallingClient.js +457 -201
- package/dist/CallingClient/CallingClient.js.map +1 -1
- package/dist/CallingClient/CallingClient.test.js +458 -315
- package/dist/CallingClient/CallingClient.test.js.map +1 -1
- package/dist/CallingClient/callRecordFixtures.js.map +1 -1
- package/dist/CallingClient/calling/CallerId/index.js +2 -2
- package/dist/CallingClient/calling/CallerId/index.js.map +1 -1
- package/dist/CallingClient/calling/CallerId/index.test.js +8 -7
- package/dist/CallingClient/calling/CallerId/index.test.js.map +1 -1
- package/dist/CallingClient/calling/CallerId/types.js.map +1 -1
- package/dist/CallingClient/calling/call.js +369 -333
- package/dist/CallingClient/calling/call.js.map +1 -1
- package/dist/CallingClient/calling/call.test.js +411 -410
- package/dist/CallingClient/calling/call.test.js.map +1 -1
- package/dist/CallingClient/calling/callManager.js +3 -4
- package/dist/CallingClient/calling/callManager.js.map +1 -1
- package/dist/CallingClient/calling/callManager.test.js +67 -68
- package/dist/CallingClient/calling/callManager.test.js.map +1 -1
- package/dist/CallingClient/calling/index.js.map +1 -1
- package/dist/CallingClient/calling/types.js.map +1 -1
- package/dist/CallingClient/callingClientFixtures.js.map +1 -1
- package/dist/CallingClient/constants.js +9 -6
- package/dist/CallingClient/constants.js.map +1 -1
- package/dist/CallingClient/line/index.js +10 -11
- package/dist/CallingClient/line/index.js.map +1 -1
- package/dist/CallingClient/line/line.test.js +10 -9
- package/dist/CallingClient/line/line.test.js.map +1 -1
- package/dist/CallingClient/line/types.js.map +1 -1
- package/dist/CallingClient/registration/index.js.map +1 -1
- package/dist/CallingClient/registration/register.js +280 -201
- package/dist/CallingClient/registration/register.js.map +1 -1
- package/dist/CallingClient/registration/register.test.js +251 -180
- package/dist/CallingClient/registration/register.test.js.map +1 -1
- package/dist/CallingClient/registration/registerFixtures.js.map +1 -1
- package/dist/CallingClient/registration/types.js.map +1 -1
- package/dist/CallingClient/registration/webWorker.js +25 -10
- package/dist/CallingClient/registration/webWorker.js.map +1 -1
- package/dist/CallingClient/registration/webWorker.test.js +85 -38
- 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/types.js.map +1 -1
- package/dist/CallingClient/windowsChromiumIceWarmupUtils.js +142 -0
- package/dist/CallingClient/windowsChromiumIceWarmupUtils.js.map +1 -0
- package/dist/Contacts/ContactsClient.js +244 -238
- package/dist/Contacts/ContactsClient.js.map +1 -1
- package/dist/Contacts/ContactsClient.test.js +89 -90
- package/dist/Contacts/ContactsClient.test.js.map +1 -1
- package/dist/Contacts/constants.js +2 -2
- package/dist/Contacts/constants.js.map +1 -1
- package/dist/Contacts/contactFixtures.js.map +1 -1
- package/dist/Contacts/types.js.map +1 -1
- package/dist/Errors/catalog/CallError.js +2 -2
- package/dist/Errors/catalog/CallError.js.map +1 -1
- package/dist/Errors/catalog/CallingDeviceError.js +2 -2
- package/dist/Errors/catalog/CallingDeviceError.js.map +1 -1
- package/dist/Errors/catalog/ExtendedError.js +3 -3
- package/dist/Errors/catalog/ExtendedError.js.map +1 -1
- package/dist/Errors/catalog/LineError.js +2 -2
- package/dist/Errors/catalog/LineError.js.map +1 -1
- package/dist/Errors/index.js.map +1 -1
- package/dist/Errors/types.js.map +1 -1
- package/dist/Events/impl/index.js +2 -2
- package/dist/Events/impl/index.js.map +1 -1
- package/dist/Events/types.js.map +1 -1
- package/dist/Logger/index.js.map +1 -1
- package/dist/Logger/index.test.js.map +1 -1
- package/dist/Logger/types.js.map +1 -1
- package/dist/Metrics/index.js +221 -104
- package/dist/Metrics/index.js.map +1 -1
- package/dist/Metrics/index.test.js +112 -23
- package/dist/Metrics/index.test.js.map +1 -1
- package/dist/Metrics/types.js +15 -1
- package/dist/Metrics/types.js.map +1 -1
- package/dist/SDKConnector/index.js +0 -1
- package/dist/SDKConnector/index.js.map +1 -1
- package/dist/SDKConnector/index.test.js.map +1 -1
- package/dist/SDKConnector/types.js.map +1 -1
- package/dist/SDKConnector/utils.js.map +1 -1
- package/dist/SDKConnector/utils.test.js.map +1 -1
- package/dist/Voicemail/BroadworksBackendConnector.js +42 -39
- package/dist/Voicemail/BroadworksBackendConnector.js.map +1 -1
- package/dist/Voicemail/BroadworksBackendConnector.test.js +119 -120
- package/dist/Voicemail/BroadworksBackendConnector.test.js.map +1 -1
- package/dist/Voicemail/UcmBackendConnector.js +54 -47
- package/dist/Voicemail/UcmBackendConnector.js.map +1 -1
- package/dist/Voicemail/UcmBackendConnector.test.js +73 -74
- package/dist/Voicemail/UcmBackendConnector.test.js.map +1 -1
- package/dist/Voicemail/Voicemail.js +12 -11
- package/dist/Voicemail/Voicemail.js.map +1 -1
- package/dist/Voicemail/Voicemail.test.js +2 -2
- package/dist/Voicemail/Voicemail.test.js.map +1 -1
- package/dist/Voicemail/WxCallBackendConnector.js +78 -70
- package/dist/Voicemail/WxCallBackendConnector.js.map +1 -1
- package/dist/Voicemail/WxCallBackendConnector.test.js +184 -185
- package/dist/Voicemail/WxCallBackendConnector.test.js.map +1 -1
- package/dist/Voicemail/constants.js.map +1 -1
- package/dist/Voicemail/types.js.map +1 -1
- package/dist/Voicemail/voicemailFixture.js.map +1 -1
- package/dist/api.js.map +1 -1
- package/dist/common/Utils.js +84 -65
- package/dist/common/Utils.js.map +1 -1
- package/dist/common/Utils.test.js +111 -117
- package/dist/common/Utils.test.js.map +1 -1
- package/dist/common/constants.js.map +1 -1
- package/dist/common/index.js.map +1 -1
- package/dist/common/testUtil.js +1 -1
- package/dist/common/testUtil.js.map +1 -1
- package/dist/common/types.js.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/module/CallHistory/CallHistory.js +4 -0
- package/dist/module/CallSettings/UcmBackendConnector.js +1 -0
- package/dist/module/CallSettings/WxCallBackendConnector.js +7 -0
- package/dist/module/CallingClient/CallingClient.js +174 -32
- package/dist/module/CallingClient/calling/call.js +79 -43
- package/dist/module/CallingClient/constants.js +8 -4
- package/dist/module/CallingClient/line/index.js +3 -3
- package/dist/module/CallingClient/registration/register.js +34 -10
- package/dist/module/CallingClient/registration/webWorker.js +17 -3
- package/dist/module/CallingClient/registration/webWorkerStr.js +19 -3
- package/dist/module/CallingClient/windowsChromiumIceWarmupUtils.js +59 -0
- package/dist/module/Contacts/ContactsClient.js +23 -17
- package/dist/module/Contacts/constants.js +1 -1
- package/dist/module/Metrics/index.js +142 -55
- package/dist/module/Metrics/types.js +14 -0
- package/dist/module/Voicemail/BroadworksBackendConnector.js +3 -0
- package/dist/module/Voicemail/UcmBackendConnector.js +6 -0
- package/dist/module/Voicemail/WxCallBackendConnector.js +8 -0
- package/dist/module/common/Utils.js +27 -10
- package/dist/types/CallHistory/CallHistory.d.ts.map +1 -1
- package/dist/types/CallSettings/UcmBackendConnector.d.ts.map +1 -1
- package/dist/types/CallSettings/WxCallBackendConnector.d.ts.map +1 -1
- package/dist/types/CallingClient/CallingClient.d.ts +12 -1
- package/dist/types/CallingClient/CallingClient.d.ts.map +1 -1
- package/dist/types/CallingClient/calling/call.d.ts.map +1 -1
- package/dist/types/CallingClient/calling/types.d.ts +2 -1
- package/dist/types/CallingClient/calling/types.d.ts.map +1 -1
- package/dist/types/CallingClient/constants.d.ts +8 -4
- package/dist/types/CallingClient/constants.d.ts.map +1 -1
- package/dist/types/CallingClient/line/index.d.ts.map +1 -1
- package/dist/types/CallingClient/registration/register.d.ts +1 -0
- package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
- package/dist/types/CallingClient/registration/webWorker.d.ts +2 -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/windowsChromiumIceWarmupUtils.d.ts +5 -0
- package/dist/types/CallingClient/windowsChromiumIceWarmupUtils.d.ts.map +1 -0
- package/dist/types/Contacts/ContactsClient.d.ts.map +1 -1
- package/dist/types/Contacts/constants.d.ts +1 -1
- package/dist/types/Contacts/constants.d.ts.map +1 -1
- package/dist/types/Metrics/index.d.ts.map +1 -1
- package/dist/types/Metrics/types.d.ts +18 -3
- package/dist/types/Metrics/types.d.ts.map +1 -1
- package/dist/types/Voicemail/BroadworksBackendConnector.d.ts.map +1 -1
- package/dist/types/Voicemail/UcmBackendConnector.d.ts.map +1 -1
- package/dist/types/Voicemail/WxCallBackendConnector.d.ts.map +1 -1
- package/dist/types/common/Utils.d.ts.map +1 -1
- package/dist/types/common/types.d.ts +1 -0
- package/dist/types/common/types.d.ts.map +1 -1
- package/package.json +10 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import {IDeviceInfo, RegistrationStatus} from '../../common/types';\n\nexport type Header = {\n [key: string]: string;\n};\n\nexport type restoreRegistrationCallBack = (\n restoreData: IDeviceInfo,\n caller: string\n) => Promise<boolean>;\n\nexport type retry429CallBack = (retryAfter: number, caller: string) => void;\n\n/**\n * Represents an interface for managing registration-related operations.\n */\nexport interface IRegistration {\n /**\n * Sets the primary and backup Mobius server URLs.\n *\n * @param primaryMobiusUris - An array of primary Mobius server URLs.\n * @param backupMobiusUris - An array of backup Mobius server URLs.\n */\n setMobiusServers(primaryMobiusUris: string[], backupMobiusUris: string[]): void;\n\n /**\n * Triggers the registration process with the given list of servers\n * Registration is attempted with primary and backup until it succeeds or the list is exhausted\n */\n triggerRegistration(): Promise<void>;\n\n /**\n * Checks if the device is currently registered.\n *\n */\n isDeviceRegistered(): boolean;\n\n /**\n * Sets the status of the registration.\n *\n * @param value - The registration status to set.\n */\n setStatus(value: RegistrationStatus): void;\n\n /**\n * Retrieves the current registration status.\n *\n */\n getStatus(): RegistrationStatus;\n\n /**\n * Retrieves information about the device as {@link IDeviceInfo}.\n *\n */\n getDeviceInfo(): IDeviceInfo;\n\n /**\n * Clears the keep-alive timer used for registration.\n */\n clearKeepaliveTimer(): void;\n\n /**\n * Deregisters the device.\n */\n deregister(): void;\n\n /**\n * Sets the active Mobius server URL to use for registration.\n *\n * @param url - The Mobius server URL to set as active.\n */\n setActiveMobiusUrl(url: string): void;\n\n /**\n * Retrieves the active Mobius server URL.\n *\n */\n getActiveMobiusUrl(): string;\n\n /**\n * Attempts to reconnect after a connection failure.\n *\n * @param caller - The caller's identifier for reconnection.\n */\n reconnectOnFailure(caller: string): Promise<void>;\n\n /**\n * Checks if a reconnection attempt is pending.\n *\n */\n isReconnectPending(): boolean;\n\n /**\n * Restores the connection and attempts refreshing existing registration with server.\n * Allows retry if not restored in the first attempt.\n *\n * @param retry - Set to `true` to trigger a retry after restoration.\n */\n handleConnectionRestoration(retry: boolean): Promise<boolean>;\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import {IDeviceInfo, RegistrationStatus} from '../../common/types';\n\nexport type Header = {\n [key: string]: string;\n};\n\nexport type restoreRegistrationCallBack = (\n restoreData: IDeviceInfo,\n caller: string\n) => Promise<boolean>;\n\nexport type retry429CallBack = (retryAfter: number, caller: string) => void;\n\n/**\n * Represents an interface for managing registration-related operations.\n */\nexport interface IRegistration {\n /**\n * Sets the primary and backup Mobius server URLs.\n *\n * @param primaryMobiusUris - An array of primary Mobius server URLs.\n * @param backupMobiusUris - An array of backup Mobius server URLs.\n */\n setMobiusServers(primaryMobiusUris: string[], backupMobiusUris: string[]): void;\n\n /**\n * Triggers the registration process with the given list of servers\n * Registration is attempted with primary and backup until it succeeds or the list is exhausted\n */\n triggerRegistration(): Promise<void>;\n\n /**\n * Checks if the device is currently registered.\n *\n */\n isDeviceRegistered(): boolean;\n\n /**\n * Sets the status of the registration.\n *\n * @param value - The registration status to set.\n */\n setStatus(value: RegistrationStatus): void;\n\n /**\n * Retrieves the current registration status.\n *\n */\n getStatus(): RegistrationStatus;\n\n /**\n * Retrieves information about the device as {@link IDeviceInfo}.\n *\n */\n getDeviceInfo(): IDeviceInfo;\n\n /**\n * Clears the keep-alive timer used for registration.\n */\n clearKeepaliveTimer(): void;\n\n /**\n * Deregisters the device.\n */\n deregister(): void;\n\n /**\n * Sets the active Mobius server URL to use for registration.\n *\n * @param url - The Mobius server URL to set as active.\n */\n setActiveMobiusUrl(url: string): void;\n\n /**\n * Retrieves the active Mobius server URL.\n *\n */\n getActiveMobiusUrl(): string;\n\n /**\n * Attempts to reconnect after a connection failure.\n *\n * @param caller - The caller's identifier for reconnection.\n */\n reconnectOnFailure(caller: string): Promise<void>;\n\n /**\n * Checks if a reconnection attempt is pending.\n *\n */\n isReconnectPending(): boolean;\n\n /**\n * Restores the connection and attempts refreshing existing registration with server.\n * Allows retry if not restored in the first attempt.\n *\n * @param retry - Set to `true` to trigger a retry after restoration.\n */\n handleConnectionRestoration(retry: boolean): Promise<boolean>;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequ
|
|
|
5
5
|
_Object$defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.
|
|
8
|
+
exports.default = void 0;
|
|
9
9
|
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
|
10
10
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
11
11
|
var _uuid = require("uuid");
|
|
@@ -13,10 +13,10 @@ var _types = require("../../common/types");
|
|
|
13
13
|
/* eslint-env worker */
|
|
14
14
|
|
|
15
15
|
var keepaliveTimer;
|
|
16
|
-
var messageHandler =
|
|
16
|
+
var messageHandler = function messageHandler(event) {
|
|
17
17
|
var type = event.data.type;
|
|
18
18
|
var postKeepAlive = /*#__PURE__*/function () {
|
|
19
|
-
var _ref = (0, _asyncToGenerator2.default)(
|
|
19
|
+
var _ref = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(accessToken, deviceUrl, url) {
|
|
20
20
|
var response;
|
|
21
21
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
22
22
|
while (1) switch (_context.prev = _context.next) {
|
|
@@ -37,7 +37,7 @@ var messageHandler = exports.messageHandler = function messageHandler(event) {
|
|
|
37
37
|
_context.next = 5;
|
|
38
38
|
break;
|
|
39
39
|
}
|
|
40
|
-
throw
|
|
40
|
+
throw response;
|
|
41
41
|
case 5:
|
|
42
42
|
return _context.abrupt("return", response);
|
|
43
43
|
case 6:
|
|
@@ -62,13 +62,13 @@ var messageHandler = exports.messageHandler = function messageHandler(event) {
|
|
|
62
62
|
clearInterval(keepaliveTimer);
|
|
63
63
|
keepaliveTimer = undefined;
|
|
64
64
|
}
|
|
65
|
-
keepaliveTimer = setInterval(
|
|
66
|
-
var res, statusCode;
|
|
65
|
+
keepaliveTimer = setInterval(/*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
66
|
+
var res, statusCode, headers, error;
|
|
67
67
|
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
68
68
|
while (1) switch (_context2.prev = _context2.next) {
|
|
69
69
|
case 0:
|
|
70
70
|
if (!(keepAliveRetryCount < retryCountThreshold)) {
|
|
71
|
-
_context2.next =
|
|
71
|
+
_context2.next = 18;
|
|
72
72
|
break;
|
|
73
73
|
}
|
|
74
74
|
_context2.prev = 1;
|
|
@@ -84,18 +84,32 @@ var messageHandler = exports.messageHandler = function messageHandler(event) {
|
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
86
|
keepAliveRetryCount = 0;
|
|
87
|
-
_context2.next =
|
|
87
|
+
_context2.next = 18;
|
|
88
88
|
break;
|
|
89
89
|
case 10:
|
|
90
90
|
_context2.prev = 10;
|
|
91
91
|
_context2.t0 = _context2["catch"](1);
|
|
92
|
+
headers = {};
|
|
93
|
+
if (_context2.t0.headers.has('Retry-After')) {
|
|
94
|
+
headers['retry-after'] = _context2.t0.headers.get('Retry-After');
|
|
95
|
+
}
|
|
96
|
+
if (_context2.t0.headers.has('Trackingid')) {
|
|
97
|
+
// eslint-disable-next-line dot-notation
|
|
98
|
+
headers['trackingid'] = _context2.t0.headers.get('Trackingid');
|
|
99
|
+
}
|
|
100
|
+
error = {
|
|
101
|
+
headers: headers,
|
|
102
|
+
statusCode: _context2.t0.status,
|
|
103
|
+
statusText: _context2.t0.statusText,
|
|
104
|
+
type: _context2.t0.type
|
|
105
|
+
};
|
|
92
106
|
keepAliveRetryCount += 1;
|
|
93
107
|
postMessage({
|
|
94
108
|
type: _types.WorkerMessageType.KEEPALIVE_FAILURE,
|
|
95
|
-
err:
|
|
109
|
+
err: error,
|
|
96
110
|
keepAliveRetryCount: keepAliveRetryCount
|
|
97
111
|
});
|
|
98
|
-
case
|
|
112
|
+
case 18:
|
|
99
113
|
case "end":
|
|
100
114
|
return _context2.stop();
|
|
101
115
|
}
|
|
@@ -112,4 +126,5 @@ var messageHandler = exports.messageHandler = function messageHandler(event) {
|
|
|
112
126
|
|
|
113
127
|
// eslint-disable-next-line no-restricted-globals
|
|
114
128
|
self.addEventListener('message', messageHandler);
|
|
129
|
+
var _default = exports.default = messageHandler;
|
|
115
130
|
//# sourceMappingURL=webWorker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uuid","require","_types","keepaliveTimer","messageHandler","
|
|
1
|
+
{"version":3,"names":["_uuid","require","_types","keepaliveTimer","messageHandler","event","type","data","postKeepAlive","_ref","_asyncToGenerator2","default","_regenerator","mark","_callee","accessToken","deviceUrl","url","response","wrap","_callee$","_context","prev","next","fetch","concat","method","HTTP_METHODS","POST","headers","Authorization","trackingId","uuid","sent","ok","abrupt","stop","_x","_x2","_x3","apply","arguments","WorkerMessageType","START_KEEPALIVE","keepAliveRetryCount","_event$data","interval","retryCountThreshold","clearInterval","undefined","setInterval","_callee2","res","statusCode","error","_callee2$","_context2","status","postMessage","KEEPALIVE_SUCCESS","t0","has","get","statusText","KEEPALIVE_FAILURE","err","CLEAR_KEEPALIVE","self","addEventListener","_default","exports"],"sources":["webWorker.ts"],"sourcesContent":["/* eslint-env worker */\nimport {v4 as uuid} from 'uuid';\nimport {HTTP_METHODS, KeepaliveStatusMessage, WorkerMessageType} from '../../common/types';\n\nlet keepaliveTimer: NodeJS.Timeout | undefined;\n\nconst messageHandler = (event: MessageEvent) => {\n const {type} = event.data;\n\n const postKeepAlive = async (accessToken: string, deviceUrl: string, url: string) => {\n const response = await fetch(`${url}/status`, {\n method: HTTP_METHODS.POST,\n headers: {\n 'cisco-device-url': deviceUrl,\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: `${accessToken}`,\n trackingId: `web_worker_${uuid()}`,\n },\n });\n\n if (!response.ok) {\n throw response;\n }\n\n return response;\n };\n\n if (type === WorkerMessageType.START_KEEPALIVE) {\n let keepAliveRetryCount = 0;\n const {accessToken, deviceUrl, interval, retryCountThreshold, url} = event.data;\n\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n\n keepaliveTimer = setInterval(async () => {\n if (keepAliveRetryCount < retryCountThreshold) {\n try {\n const res = await postKeepAlive(accessToken, deviceUrl, url);\n const statusCode = res.status;\n if (keepAliveRetryCount > 0) {\n postMessage({\n type: WorkerMessageType.KEEPALIVE_SUCCESS,\n statusCode,\n } as KeepaliveStatusMessage);\n }\n keepAliveRetryCount = 0;\n } catch (err: any) {\n const headers = {} as Record<string, string>;\n if (err.headers.has('Retry-After')) {\n headers['retry-after'] = err.headers.get('Retry-After');\n }\n\n if (err.headers.has('Trackingid')) {\n // eslint-disable-next-line dot-notation\n headers['trackingid'] = err.headers.get('Trackingid');\n }\n\n const error = {\n headers,\n statusCode: err.status,\n statusText: err.statusText,\n type: err.type,\n };\n keepAliveRetryCount += 1;\n postMessage({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: error,\n keepAliveRetryCount,\n } as KeepaliveStatusMessage);\n }\n }\n }, interval * 1000);\n }\n\n if (type === WorkerMessageType.CLEAR_KEEPALIVE) {\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n }\n};\n\n// eslint-disable-next-line no-restricted-globals\nself.addEventListener('message', messageHandler);\nexport default messageHandler;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequ
|
|
|
4
4
|
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
|
5
5
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
6
6
|
var _uuid = require("uuid");
|
|
7
|
-
var _webWorker = require("./webWorker");
|
|
7
|
+
var _webWorker = _interopRequireDefault(require("./webWorker"));
|
|
8
8
|
var _types = require("../../common/types");
|
|
9
9
|
global.self = global;
|
|
10
10
|
jest.mock('uuid');
|
|
@@ -37,8 +37,8 @@ describe('webWorker', function () {
|
|
|
37
37
|
jest.clearAllTimers();
|
|
38
38
|
jest.useRealTimers();
|
|
39
39
|
});
|
|
40
|
-
it('should start keepalive lifecycle correctly', /*#__PURE__*/(0, _asyncToGenerator2.default)(
|
|
41
|
-
var fakeSuccessResponse,
|
|
40
|
+
it('should start keepalive lifecycle correctly', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
41
|
+
var fakeSuccessResponse, failureHeaders, fakeFailureResponse;
|
|
42
42
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
43
43
|
while (1) switch (_context.prev = _context.next) {
|
|
44
44
|
case 0:
|
|
@@ -47,7 +47,7 @@ describe('webWorker', function () {
|
|
|
47
47
|
status: 200
|
|
48
48
|
};
|
|
49
49
|
global.fetch.mockResolvedValue(fakeSuccessResponse);
|
|
50
|
-
(0, _webWorker.
|
|
50
|
+
(0, _webWorker.default)({
|
|
51
51
|
data: {
|
|
52
52
|
type: _types.WorkerMessageType.START_KEEPALIVE,
|
|
53
53
|
accessToken: 'dummy',
|
|
@@ -73,12 +73,25 @@ describe('webWorker', function () {
|
|
|
73
73
|
}
|
|
74
74
|
});
|
|
75
75
|
expect(postMessageSpy).not.toHaveBeenCalled();
|
|
76
|
-
|
|
76
|
+
failureHeaders = {
|
|
77
|
+
has: function has(key) {
|
|
78
|
+
return key === 'Retry-After' || key === 'Trackingid';
|
|
79
|
+
},
|
|
80
|
+
get: function get(key) {
|
|
81
|
+
return (
|
|
82
|
+
// eslint-disable-next-line no-nested-ternary
|
|
83
|
+
key === 'Retry-After' ? '10' : key === 'Trackingid' ? 'web_worker_mock-uuid' : null
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
fakeFailureResponse = {
|
|
77
88
|
ok: false,
|
|
78
|
-
status:
|
|
89
|
+
status: 429,
|
|
90
|
+
statusText: 'Too Many Requests',
|
|
91
|
+
headers: failureHeaders
|
|
79
92
|
};
|
|
80
|
-
global.fetch.mockResolvedValue(
|
|
81
|
-
(0, _webWorker.
|
|
93
|
+
global.fetch.mockResolvedValue(fakeFailureResponse);
|
|
94
|
+
(0, _webWorker.default)({
|
|
82
95
|
data: {
|
|
83
96
|
type: _types.WorkerMessageType.START_KEEPALIVE,
|
|
84
97
|
accessToken: 'dummy',
|
|
@@ -90,33 +103,49 @@ describe('webWorker', function () {
|
|
|
90
103
|
});
|
|
91
104
|
|
|
92
105
|
// Manually invoke the captured interval callback to simulate one tick
|
|
93
|
-
_context.next =
|
|
106
|
+
_context.next = 14;
|
|
94
107
|
return capturedIntervalCallback();
|
|
95
|
-
case
|
|
108
|
+
case 14:
|
|
96
109
|
expect(global.fetch.mock.calls.length).toBe(2);
|
|
97
110
|
expect(postMessageSpy).toHaveBeenCalledWith({
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
111
|
+
type: _types.WorkerMessageType.KEEPALIVE_FAILURE,
|
|
112
|
+
err: {
|
|
113
|
+
headers: {
|
|
114
|
+
'retry-after': '10',
|
|
115
|
+
trackingid: 'web_worker_mock-uuid'
|
|
116
|
+
},
|
|
117
|
+
statusCode: 429,
|
|
118
|
+
statusText: 'Too Many Requests',
|
|
119
|
+
type: undefined
|
|
120
|
+
},
|
|
121
|
+
keepAliveRetryCount: 1
|
|
101
122
|
});
|
|
102
|
-
case
|
|
123
|
+
case 16:
|
|
103
124
|
case "end":
|
|
104
125
|
return _context.stop();
|
|
105
126
|
}
|
|
106
127
|
}, _callee);
|
|
107
128
|
})));
|
|
108
|
-
it('should post KEEPALIVE_FAILURE when fetch fails', /*#__PURE__*/(0, _asyncToGenerator2.default)(
|
|
109
|
-
var
|
|
129
|
+
it('should post KEEPALIVE_FAILURE when fetch fails', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
130
|
+
var failureHeaders2;
|
|
110
131
|
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
111
132
|
while (1) switch (_context2.prev = _context2.next) {
|
|
112
133
|
case 0:
|
|
113
|
-
|
|
114
|
-
|
|
134
|
+
failureHeaders2 = {
|
|
135
|
+
has: function has(key) {
|
|
136
|
+
return key === 'Trackingid';
|
|
137
|
+
},
|
|
138
|
+
get: function get(key) {
|
|
139
|
+
return key === 'Trackingid' ? 'web_worker_mock-uuid' : null;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
global.fetch.mockResolvedValueOnce({
|
|
115
143
|
ok: false,
|
|
116
|
-
|
|
117
|
-
|
|
144
|
+
status: 401,
|
|
145
|
+
statusText: 'Unauthorized',
|
|
146
|
+
headers: failureHeaders2
|
|
118
147
|
});
|
|
119
|
-
(0, _webWorker.
|
|
148
|
+
(0, _webWorker.default)({
|
|
120
149
|
data: {
|
|
121
150
|
type: _types.WorkerMessageType.START_KEEPALIVE,
|
|
122
151
|
accessToken: 'dummy',
|
|
@@ -132,9 +161,12 @@ describe('webWorker', function () {
|
|
|
132
161
|
expect(postMessageSpy).toHaveBeenCalledWith({
|
|
133
162
|
type: _types.WorkerMessageType.KEEPALIVE_FAILURE,
|
|
134
163
|
err: {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
164
|
+
headers: {
|
|
165
|
+
trackingid: 'web_worker_mock-uuid'
|
|
166
|
+
},
|
|
167
|
+
statusCode: 401,
|
|
168
|
+
statusText: 'Unauthorized',
|
|
169
|
+
type: undefined
|
|
138
170
|
},
|
|
139
171
|
keepAliveRetryCount: 1
|
|
140
172
|
});
|
|
@@ -144,16 +176,31 @@ describe('webWorker', function () {
|
|
|
144
176
|
}
|
|
145
177
|
}, _callee2);
|
|
146
178
|
})));
|
|
147
|
-
it('should post KEEPALIVE_SUCCESS after a failure when fetch succeeds', /*#__PURE__*/(0, _asyncToGenerator2.default)(
|
|
179
|
+
it('should post KEEPALIVE_SUCCESS after a failure when fetch succeeds', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
|
|
180
|
+
var failureHeaders3, mockError;
|
|
148
181
|
return _regenerator.default.wrap(function _callee3$(_context3) {
|
|
149
182
|
while (1) switch (_context3.prev = _context3.next) {
|
|
150
183
|
case 0:
|
|
151
184
|
// Set fetch so that first tick rejects (failure) and second tick resolves (success)
|
|
152
|
-
|
|
185
|
+
failureHeaders3 = {
|
|
186
|
+
has: function has(key) {
|
|
187
|
+
return key === 'Trackingid';
|
|
188
|
+
},
|
|
189
|
+
get: function get(key) {
|
|
190
|
+
return key === 'Trackingid' ? 'web_worker_mock-uuid' : null;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
mockError = {
|
|
194
|
+
ok: false,
|
|
195
|
+
status: 404,
|
|
196
|
+
statusText: 'Not Found',
|
|
197
|
+
headers: failureHeaders3
|
|
198
|
+
};
|
|
199
|
+
global.fetch.mockResolvedValueOnce(mockError).mockResolvedValueOnce({
|
|
153
200
|
ok: true,
|
|
154
201
|
status: 200
|
|
155
202
|
});
|
|
156
|
-
(0, _webWorker.
|
|
203
|
+
(0, _webWorker.default)({
|
|
157
204
|
data: {
|
|
158
205
|
type: _types.WorkerMessageType.START_KEEPALIVE,
|
|
159
206
|
accessToken: 'dummy',
|
|
@@ -165,24 +212,24 @@ describe('webWorker', function () {
|
|
|
165
212
|
});
|
|
166
213
|
|
|
167
214
|
// First tick: trigger failure
|
|
168
|
-
_context3.next =
|
|
215
|
+
_context3.next = 6;
|
|
169
216
|
return capturedIntervalCallback();
|
|
170
|
-
case
|
|
217
|
+
case 6:
|
|
171
218
|
expect(postMessageSpy.mock.calls[0][0].type).toBe(_types.WorkerMessageType.KEEPALIVE_FAILURE);
|
|
172
219
|
|
|
173
220
|
// Second tick: trigger success.
|
|
174
|
-
_context3.next =
|
|
221
|
+
_context3.next = 9;
|
|
175
222
|
return capturedIntervalCallback();
|
|
176
|
-
case
|
|
223
|
+
case 9:
|
|
177
224
|
expect(postMessageSpy.mock.calls[1][0].type).toBe(_types.WorkerMessageType.KEEPALIVE_SUCCESS);
|
|
178
225
|
expect(postMessageSpy.mock.calls[1][0].statusCode).toBe(200);
|
|
179
|
-
case
|
|
226
|
+
case 11:
|
|
180
227
|
case "end":
|
|
181
228
|
return _context3.stop();
|
|
182
229
|
}
|
|
183
230
|
}, _callee3);
|
|
184
231
|
})));
|
|
185
|
-
it('should clear keepalive timer on receiving CLEAR_KEEPALIVE message', /*#__PURE__*/(0, _asyncToGenerator2.default)(
|
|
232
|
+
it('should clear keepalive timer on receiving CLEAR_KEEPALIVE message', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
|
|
186
233
|
var fakeSuccessResponse, startEvent;
|
|
187
234
|
return _regenerator.default.wrap(function _callee4$(_context4) {
|
|
188
235
|
while (1) switch (_context4.prev = _context4.next) {
|
|
@@ -202,8 +249,8 @@ describe('webWorker', function () {
|
|
|
202
249
|
url: 'http://example.com'
|
|
203
250
|
}
|
|
204
251
|
};
|
|
205
|
-
(0, _webWorker.
|
|
206
|
-
(0, _webWorker.
|
|
252
|
+
(0, _webWorker.default)(startEvent);
|
|
253
|
+
(0, _webWorker.default)({
|
|
207
254
|
data: {
|
|
208
255
|
type: _types.WorkerMessageType.CLEAR_KEEPALIVE
|
|
209
256
|
}
|
|
@@ -217,7 +264,7 @@ describe('webWorker', function () {
|
|
|
217
264
|
}
|
|
218
265
|
}, _callee4);
|
|
219
266
|
})));
|
|
220
|
-
it('improve coverage: should not clear keepalive timer on receiving CLEAR_KEEPALIVE message without keepTimer', /*#__PURE__*/(0, _asyncToGenerator2.default)(
|
|
267
|
+
it('improve coverage: should not clear keepalive timer on receiving CLEAR_KEEPALIVE message without keepTimer', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee5() {
|
|
221
268
|
var fakeSuccessResponse, startEvent;
|
|
222
269
|
return _regenerator.default.wrap(function _callee5$(_context5) {
|
|
223
270
|
while (1) switch (_context5.prev = _context5.next) {
|
|
@@ -238,8 +285,8 @@ describe('webWorker', function () {
|
|
|
238
285
|
url: 'http://example.com'
|
|
239
286
|
}
|
|
240
287
|
};
|
|
241
|
-
(0, _webWorker.
|
|
242
|
-
(0, _webWorker.
|
|
288
|
+
(0, _webWorker.default)(startEvent);
|
|
289
|
+
(0, _webWorker.default)({
|
|
243
290
|
data: {
|
|
244
291
|
type: _types.WorkerMessageType.CLEAR_KEEPALIVE
|
|
245
292
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uuid","require","_webWorker","_types","global","self","jest","mock","describe","postMessageSpy","capturedIntervalCallback","capturedIntervalTimer","clearIntervalSpy","beforeEach","useFakeTimers","fetch","fn","uuid","mockReturnValue","spyOn","mockImplementation","callback","interval","dummy","afterEach","clearAllMocks","clearAllTimers","useRealTimers","it","_asyncToGenerator2","default","_regenerator","mark","_callee","fakeSuccessResponse","fakeFailureRespponse","wrap","_callee$","_context","prev","next","ok","status","mockResolvedValue","messageHandler","data","type","WorkerMessageType","START_KEEPALIVE","accessToken","deviceUrl","retryCountThreshold","url","expect","calls","length","toBe","toHaveBeenCalledWith","method","headers","Authorization","trackingId","not","toHaveBeenCalled","err","Error","keepAliveRetryCount","stop","_callee2","mockError","_callee2$","_context2","mockRejectedValue","KEEPALIVE_FAILURE","_callee3","_callee3$","_context3","mockRejectedValueOnce","mockResolvedValueOnce","KEEPALIVE_SUCCESS","statusCode","_callee4","startEvent","_callee4$","_context4","CLEAR_KEEPALIVE","advanceTimersByTime","toBeLessThanOrEqual","_callee5","_callee5$","_context5","undefined"],"sources":["webWorker.test.ts"],"sourcesContent":["import {v4 as uuid} from 'uuid';\nimport {messageHandler} from './webWorker';\nimport {WorkerMessageType} from '../../common/types';\n\n(global as any).self = global;\n\njest.mock('uuid');\n\ndescribe('webWorker', () => {\n let postMessageSpy: jest.SpyInstance;\n let capturedIntervalCallback: any;\n let capturedIntervalTimer: any;\n let clearIntervalSpy: jest.SpyInstance;\n\n beforeEach(() => {\n jest.useFakeTimers();\n global.fetch = jest.fn();\n (uuid as jest.Mock).mockReturnValue('mock-uuid');\n\n postMessageSpy = jest.spyOn(global, 'postMessage').mockImplementation(() => {});\n clearIntervalSpy = jest.spyOn(global, 'clearInterval');\n\n // Overriding setInterval so that we capture the callback rather than schedule a timer\n jest.spyOn(global, 'setInterval').mockImplementation(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n (callback: any, interval: number): NodeJS.Timeout => {\n capturedIntervalCallback = callback;\n // Create a dummy timer object (could be any non-null value)\n capturedIntervalTimer = {dummy: true};\n\n return capturedIntervalTimer as NodeJS.Timeout;\n }\n );\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n jest.clearAllTimers();\n jest.useRealTimers();\n });\n\n it('should start keepalive lifecycle correctly', async () => {\n const fakeSuccessResponse = {ok: true, status: 200};\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // Manually invoke the captured interval callback to simulate one tick\n await capturedIntervalCallback();\n\n expect((global.fetch as jest.Mock).mock.calls.length).toBe(1);\n expect(global.fetch).toHaveBeenCalledWith('http://example.com/status', {\n method: 'POST',\n headers: {\n 'cisco-device-url': 'dummyDevice',\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: 'dummy',\n trackingId: 'web_worker_mock-uuid',\n },\n });\n expect(postMessageSpy).not.toHaveBeenCalled();\n\n const fakeFailureRespponse = {ok: false, status: 401};\n (global.fetch as jest.Mock).mockResolvedValue(fakeFailureRespponse);\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // Manually invoke the captured interval callback to simulate one tick\n await capturedIntervalCallback();\n\n expect((global.fetch as jest.Mock).mock.calls.length).toBe(2);\n expect(postMessageSpy).toHaveBeenCalledWith({\n err: new Error(`Keepalive failed with status: 401`),\n keepAliveRetryCount: 1,\n type: 'KEEPALIVE_FAILURE',\n });\n });\n\n it('should post KEEPALIVE_FAILURE when fetch fails', async () => {\n const mockError = new Error('Network error');\n (global.fetch as jest.Mock).mockRejectedValue({\n ok: false,\n err: mockError,\n status: 401,\n });\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n await capturedIntervalCallback();\n\n expect(postMessageSpy).toHaveBeenCalledWith({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: {\n ok: false,\n err: mockError,\n status: 401,\n },\n keepAliveRetryCount: 1,\n });\n });\n\n it('should post KEEPALIVE_SUCCESS after a failure when fetch succeeds', async () => {\n // Set fetch so that first tick rejects (failure) and second tick resolves (success)\n (global.fetch as jest.Mock)\n .mockRejectedValueOnce(new Error('first failure'))\n .mockResolvedValueOnce({ok: true, status: 200});\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // First tick: trigger failure\n await capturedIntervalCallback();\n expect(postMessageSpy.mock.calls[0][0].type).toBe(WorkerMessageType.KEEPALIVE_FAILURE);\n\n // Second tick: trigger success.\n await capturedIntervalCallback();\n expect(postMessageSpy.mock.calls[1][0].type).toBe(WorkerMessageType.KEEPALIVE_SUCCESS);\n expect(postMessageSpy.mock.calls[1][0].statusCode).toBe(200);\n });\n\n it('should clear keepalive timer on receiving CLEAR_KEEPALIVE message', async () => {\n const fakeSuccessResponse = {ok: true, status: 200};\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n const startEvent = {\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n };\n\n messageHandler(startEvent as MessageEvent);\n messageHandler({data: {type: WorkerMessageType.CLEAR_KEEPALIVE}} as MessageEvent);\n\n jest.advanceTimersByTime(3000);\n expect((global.fetch as jest.Mock).mock.calls.length).toBeLessThanOrEqual(3);\n expect(clearIntervalSpy).toHaveBeenCalled();\n });\n\n it('improve coverage: should not clear keepalive timer on receiving CLEAR_KEEPALIVE message without keepTimer', async () => {\n jest.spyOn(global, 'setInterval').mockReturnValue(undefined);\n const fakeSuccessResponse = {ok: true, status: 200};\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n const startEvent = {\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n };\n\n messageHandler(startEvent as MessageEvent);\n messageHandler({data: {type: WorkerMessageType.CLEAR_KEEPALIVE}} as MessageEvent);\n\n jest.advanceTimersByTime(3000);\n expect(clearIntervalSpy).not.toHaveBeenCalled();\n });\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_uuid","require","_webWorker","_interopRequireDefault","_types","global","self","jest","mock","describe","postMessageSpy","capturedIntervalCallback","capturedIntervalTimer","clearIntervalSpy","beforeEach","useFakeTimers","fetch","fn","uuid","mockReturnValue","spyOn","mockImplementation","callback","interval","dummy","afterEach","clearAllMocks","clearAllTimers","useRealTimers","it","_asyncToGenerator2","default","_regenerator","mark","_callee","fakeSuccessResponse","failureHeaders","fakeFailureResponse","wrap","_callee$","_context","prev","next","ok","status","mockResolvedValue","messageHandler","data","type","WorkerMessageType","START_KEEPALIVE","accessToken","deviceUrl","retryCountThreshold","url","expect","calls","length","toBe","toHaveBeenCalledWith","method","headers","Authorization","trackingId","not","toHaveBeenCalled","has","key","get","statusText","KEEPALIVE_FAILURE","err","trackingid","statusCode","undefined","keepAliveRetryCount","stop","_callee2","failureHeaders2","_callee2$","_context2","mockResolvedValueOnce","_callee3","failureHeaders3","mockError","_callee3$","_context3","KEEPALIVE_SUCCESS","_callee4","startEvent","_callee4$","_context4","CLEAR_KEEPALIVE","advanceTimersByTime","toBeLessThanOrEqual","_callee5","_callee5$","_context5"],"sources":["webWorker.test.ts"],"sourcesContent":["import {v4 as uuid} from 'uuid';\nimport messageHandler from './webWorker';\nimport {WorkerMessageType} from '../../common/types';\n\n(global as any).self = global;\n\njest.mock('uuid');\n\ndescribe('webWorker', () => {\n let postMessageSpy: jest.SpyInstance;\n let capturedIntervalCallback: any;\n let capturedIntervalTimer: any;\n let clearIntervalSpy: jest.SpyInstance;\n\n beforeEach(() => {\n jest.useFakeTimers();\n global.fetch = jest.fn();\n (uuid as jest.Mock).mockReturnValue('mock-uuid');\n\n postMessageSpy = jest.spyOn(global, 'postMessage').mockImplementation(() => {});\n clearIntervalSpy = jest.spyOn(global, 'clearInterval');\n\n // Overriding setInterval so that we capture the callback rather than schedule a timer\n jest.spyOn(global, 'setInterval').mockImplementation(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n (callback: any, interval: number): NodeJS.Timeout => {\n capturedIntervalCallback = callback;\n // Create a dummy timer object (could be any non-null value)\n capturedIntervalTimer = {dummy: true};\n\n return capturedIntervalTimer as NodeJS.Timeout;\n }\n );\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n jest.clearAllTimers();\n jest.useRealTimers();\n });\n\n it('should start keepalive lifecycle correctly', async () => {\n const fakeSuccessResponse = {\n ok: true,\n status: 200,\n };\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // Manually invoke the captured interval callback to simulate one tick\n await capturedIntervalCallback();\n\n expect((global.fetch as jest.Mock).mock.calls.length).toBe(1);\n expect(global.fetch).toHaveBeenCalledWith('http://example.com/status', {\n method: 'POST',\n headers: {\n 'cisco-device-url': 'dummyDevice',\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: 'dummy',\n trackingId: 'web_worker_mock-uuid',\n },\n });\n expect(postMessageSpy).not.toHaveBeenCalled();\n\n const failureHeaders = {\n has: (key: string) => key === 'Retry-After' || key === 'Trackingid',\n get: (key: string) =>\n // eslint-disable-next-line no-nested-ternary\n key === 'Retry-After' ? '10' : key === 'Trackingid' ? 'web_worker_mock-uuid' : null,\n };\n const fakeFailureResponse = {\n ok: false,\n status: 429,\n statusText: 'Too Many Requests',\n headers: failureHeaders,\n };\n (global.fetch as jest.Mock).mockResolvedValue(fakeFailureResponse);\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // Manually invoke the captured interval callback to simulate one tick\n await capturedIntervalCallback();\n\n expect((global.fetch as jest.Mock).mock.calls.length).toBe(2);\n expect(postMessageSpy).toHaveBeenCalledWith({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: {\n headers: {'retry-after': '10', trackingid: 'web_worker_mock-uuid'},\n statusCode: 429,\n statusText: 'Too Many Requests',\n type: undefined,\n },\n keepAliveRetryCount: 1,\n });\n });\n\n it('should post KEEPALIVE_FAILURE when fetch fails', async () => {\n const failureHeaders2 = {\n has: (key: string) => key === 'Trackingid',\n get: (key: string) => (key === 'Trackingid' ? 'web_worker_mock-uuid' : null),\n };\n (global.fetch as jest.Mock).mockResolvedValueOnce({\n ok: false,\n status: 401,\n statusText: 'Unauthorized',\n headers: failureHeaders2,\n });\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n await capturedIntervalCallback();\n\n expect(postMessageSpy).toHaveBeenCalledWith({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: {\n headers: {trackingid: 'web_worker_mock-uuid'},\n statusCode: 401,\n statusText: 'Unauthorized',\n type: undefined,\n },\n keepAliveRetryCount: 1,\n });\n });\n\n it('should post KEEPALIVE_SUCCESS after a failure when fetch succeeds', async () => {\n // Set fetch so that first tick rejects (failure) and second tick resolves (success)\n const failureHeaders3 = {\n has: (key: string) => key === 'Trackingid',\n get: (key: string) => (key === 'Trackingid' ? 'web_worker_mock-uuid' : null),\n };\n const mockError = {\n ok: false,\n status: 404,\n statusText: 'Not Found',\n headers: failureHeaders3,\n };\n\n (global.fetch as jest.Mock)\n .mockResolvedValueOnce(mockError)\n .mockResolvedValueOnce({ok: true, status: 200});\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // First tick: trigger failure\n await capturedIntervalCallback();\n expect(postMessageSpy.mock.calls[0][0].type).toBe(WorkerMessageType.KEEPALIVE_FAILURE);\n\n // Second tick: trigger success.\n await capturedIntervalCallback();\n expect(postMessageSpy.mock.calls[1][0].type).toBe(WorkerMessageType.KEEPALIVE_SUCCESS);\n expect(postMessageSpy.mock.calls[1][0].statusCode).toBe(200);\n });\n\n it('should clear keepalive timer on receiving CLEAR_KEEPALIVE message', async () => {\n const fakeSuccessResponse = {ok: true, status: 200};\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n const startEvent = {\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n };\n\n messageHandler(startEvent as MessageEvent);\n messageHandler({data: {type: WorkerMessageType.CLEAR_KEEPALIVE}} as MessageEvent);\n\n jest.advanceTimersByTime(3000);\n expect((global.fetch as jest.Mock).mock.calls.length).toBeLessThanOrEqual(3);\n expect(clearIntervalSpy).toHaveBeenCalled();\n });\n\n it('improve coverage: should not clear keepalive timer on receiving CLEAR_KEEPALIVE message without keepTimer', async () => {\n jest.spyOn(global, 'setInterval').mockReturnValue(undefined);\n const fakeSuccessResponse = {ok: true, status: 200};\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n const startEvent = {\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n };\n\n messageHandler(startEvent as MessageEvent);\n messageHandler({data: {type: WorkerMessageType.CLEAR_KEEPALIVE}} as MessageEvent);\n\n jest.advanceTimersByTime(3000);\n expect(clearIntervalSpy).not.toHaveBeenCalled();\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,6 +10,6 @@ exports.default = void 0;
|
|
|
10
10
|
* It can be used to create a Blob URL for the worker instead of loading it from a separate file
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
var webWorkerStr = "/* eslint-env worker */\n\nconst uuid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\n// Enum values from the original imports\nconst HTTP_METHODS = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n};\n\nconst WorkerMessageType = {\n START_KEEPALIVE: 'START_KEEPALIVE',\n CLEAR_KEEPALIVE: 'CLEAR_KEEPALIVE',\n KEEPALIVE_SUCCESS: 'KEEPALIVE_SUCCESS',\n KEEPALIVE_FAILURE: 'KEEPALIVE_FAILURE',\n};\n\nlet keepaliveTimer;\n\nconst messageHandler = (event) => {\n const {type} = event.data;\n\n const postKeepAlive = async (accessToken, deviceUrl, url) => {\n const response = await fetch(`${url}/status`, {\n method: HTTP_METHODS.POST,\n headers: {\n 'cisco-device-url': deviceUrl,\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: `${accessToken}`,\n trackingId: `web_worker_${uuid()}`,\n },\n });\n\n if (!response.ok) {\n throw
|
|
13
|
+
var webWorkerStr = "/* eslint-env worker */\n\nconst uuid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\n// Enum values from the original imports\nconst HTTP_METHODS = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n};\n\nconst WorkerMessageType = {\n START_KEEPALIVE: 'START_KEEPALIVE',\n CLEAR_KEEPALIVE: 'CLEAR_KEEPALIVE',\n KEEPALIVE_SUCCESS: 'KEEPALIVE_SUCCESS',\n KEEPALIVE_FAILURE: 'KEEPALIVE_FAILURE',\n};\n\nlet keepaliveTimer;\n\nconst messageHandler = (event) => {\n const {type} = event.data;\n\n const postKeepAlive = async (accessToken, deviceUrl, url) => {\n const response = await fetch(`${url}/status`, {\n method: HTTP_METHODS.POST,\n headers: {\n 'cisco-device-url': deviceUrl,\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: `${accessToken}`,\n trackingId: `web_worker_${uuid()}`,\n },\n });\n\n if (!response.ok) {\n throw response;\n }\n\n return response;\n };\n\n if (type === WorkerMessageType.START_KEEPALIVE) {\n let keepAliveRetryCount = 0;\n const {accessToken, deviceUrl, interval, retryCountThreshold, url} = event.data;\n\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n\n keepaliveTimer = setInterval(async () => {\n if (keepAliveRetryCount < retryCountThreshold) {\n try {\n const res = await postKeepAlive(accessToken, deviceUrl, url);\n const statusCode = res.status;\n if (keepAliveRetryCount > 0) {\n self.postMessage({\n type: WorkerMessageType.KEEPALIVE_SUCCESS,\n statusCode,\n });\n }\n keepAliveRetryCount = 0;\n } catch (err) {\n let headers = {};\n if(err.headers.has('Retry-After')) {\n headers['retry-after'] = err.headers.get('Retry-After');\n } \n\n if(err.headers.has('Trackingid')) {\n headers['trackingid'] = err.headers.get('Trackingid');\n } \n\n const error = {\n headers,\n statusCode: err.status,\n statusText: err.statusText,\n type: err.type,\n };\n\n keepAliveRetryCount += 1\n self.postMessage({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: error,\n keepAliveRetryCount,\n });\n }\n }\n }, interval * 1000);\n }\n\n if (type === WorkerMessageType.CLEAR_KEEPALIVE) {\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n }\n};\n\nself.addEventListener('message', messageHandler);\n";
|
|
14
14
|
var _default = exports.default = webWorkerStr;
|
|
15
15
|
//# sourceMappingURL=webWorkerStr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["webWorkerStr","_default","exports","default"],"sources":["webWorkerStr.ts"],"sourcesContent":["/**\n * This file contains the stringified version of the web worker code from webWorker.ts\n * It can be used to create a Blob URL for the worker instead of loading it from a separate file\n */\n\nconst webWorkerStr = `/* eslint-env worker */\n\nconst uuid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\n// Enum values from the original imports\nconst HTTP_METHODS = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n};\n\nconst WorkerMessageType = {\n START_KEEPALIVE: 'START_KEEPALIVE',\n CLEAR_KEEPALIVE: 'CLEAR_KEEPALIVE',\n KEEPALIVE_SUCCESS: 'KEEPALIVE_SUCCESS',\n KEEPALIVE_FAILURE: 'KEEPALIVE_FAILURE',\n};\n\nlet keepaliveTimer;\n\nconst messageHandler = (event) => {\n const {type} = event.data;\n\n const postKeepAlive = async (accessToken, deviceUrl, url) => {\n const response = await fetch(\\`\\${url}/status\\`, {\n method: HTTP_METHODS.POST,\n headers: {\n 'cisco-device-url': deviceUrl,\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: \\`\\${accessToken}\\`,\n trackingId: \\`web_worker_\\${uuid()}\\`,\n },\n });\n\n if (!response.ok) {\n throw
|
|
1
|
+
{"version":3,"names":["webWorkerStr","_default","exports","default"],"sources":["webWorkerStr.ts"],"sourcesContent":["/**\n * This file contains the stringified version of the web worker code from webWorker.ts\n * It can be used to create a Blob URL for the worker instead of loading it from a separate file\n */\n\nconst webWorkerStr = `/* eslint-env worker */\n\nconst uuid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\n// Enum values from the original imports\nconst HTTP_METHODS = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n};\n\nconst WorkerMessageType = {\n START_KEEPALIVE: 'START_KEEPALIVE',\n CLEAR_KEEPALIVE: 'CLEAR_KEEPALIVE',\n KEEPALIVE_SUCCESS: 'KEEPALIVE_SUCCESS',\n KEEPALIVE_FAILURE: 'KEEPALIVE_FAILURE',\n};\n\nlet keepaliveTimer;\n\nconst messageHandler = (event) => {\n const {type} = event.data;\n\n const postKeepAlive = async (accessToken, deviceUrl, url) => {\n const response = await fetch(\\`\\${url}/status\\`, {\n method: HTTP_METHODS.POST,\n headers: {\n 'cisco-device-url': deviceUrl,\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: \\`\\${accessToken}\\`,\n trackingId: \\`web_worker_\\${uuid()}\\`,\n },\n });\n\n if (!response.ok) {\n throw response;\n }\n\n return response;\n };\n\n if (type === WorkerMessageType.START_KEEPALIVE) {\n let keepAliveRetryCount = 0;\n const {accessToken, deviceUrl, interval, retryCountThreshold, url} = event.data;\n\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n\n keepaliveTimer = setInterval(async () => {\n if (keepAliveRetryCount < retryCountThreshold) {\n try {\n const res = await postKeepAlive(accessToken, deviceUrl, url);\n const statusCode = res.status;\n if (keepAliveRetryCount > 0) {\n self.postMessage({\n type: WorkerMessageType.KEEPALIVE_SUCCESS,\n statusCode,\n });\n }\n keepAliveRetryCount = 0;\n } catch (err) {\n let headers = {};\n if(err.headers.has('Retry-After')) {\n headers['retry-after'] = err.headers.get('Retry-After');\n } \n\n if(err.headers.has('Trackingid')) {\n headers['trackingid'] = err.headers.get('Trackingid');\n } \n\n const error = {\n headers,\n statusCode: err.status,\n statusText: err.statusText,\n type: err.type,\n };\n\n keepAliveRetryCount += 1\n self.postMessage({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: error,\n keepAliveRetryCount,\n });\n }\n }\n }, interval * 1000);\n }\n\n if (type === WorkerMessageType.CLEAR_KEEPALIVE) {\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n }\n};\n\nself.addEventListener('message', messageHandler);\n`;\n\nexport default webWorkerStr;\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;;AAEA,IAAMA,YAAY,yzFA2GjB;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEaH,YAAY","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import * as Media from '@webex/internal-media-core';\nimport {LOGGER} from '../Logger/types';\nimport {ISDKConnector} from '../SDKConnector/types';\nimport {Eventing} from '../Events/impl';\nimport {CallingClientEventTypes} from '../Events/types';\nimport {ServiceData} from '../common/types';\nimport {ICall} from './calling/types';\nimport {CallingClientError} from '../Errors';\nimport {ILine} from './line/types';\n\nexport interface LoggerConfig {\n level: LOGGER;\n}\n\ninterface DiscoveryConfig {\n country: string;\n region: string;\n}\n\nexport interface CallingClientConfig {\n logger?: LoggerConfig;\n discovery?: DiscoveryConfig;\n serviceData?: ServiceData;\n jwe?: string;\n}\n\nexport type CallingClientErrorEmitterCallback = (\n err: CallingClientError,\n finalError?: boolean\n) => void;\n\n/**\n * An interface for the `CallingClient` module.\n * The `CallingClient` module is designed to provide a set of APIs related to line registration and calling functionalities within the SDK.\n *\n * @example\n * ```javascript\n * const callingClient = createClient(webex, callingConfig);\n * ```\n */\nexport interface ICallingClient extends Eventing<CallingClientEventTypes> {\n /**\n * Represents the `mediaEngine for managing media-related operations within the CallingClient.\n * The media engine provides access to audio and video devices such as cameras, microphones, and speakers within the media layer.\n *\n * @public\n * @example\n * ```\n * const microphones = await callingClient.mediaEngine.Media.getMicrophones();\n * const speakers = await callingClient.mediaEngine.Media.getSpeakers();\n * const cameras = await callingClient.mediaEngine.Media.getCameras();\n * ```\n */\n mediaEngine: typeof Media;\n\n /**\n * @ignore\n */\n getSDKConnector(): ISDKConnector;\n\n /**\n * @ignore\n */\n getLoggingLevel(): LOGGER;\n\n /**\n * Retrieves details of the line object(s) belonging to a user.\n *\n * This method gathers all the {@link ILine} objects and organizes them into a dictionary\n * where keys represent `lineId`s and values are arrays of {@link ILine} objects registered with\n * the `callingClient`\n *\n * @example\n * ```typescript\n * const lines = callingClient.getLines();\n * ```\n * The `lines` response object will have `lineId` as its key and\n * a list {@link ILine} objects as it's value.\n * ```\n * {\n * 'lineId1': lineObj1,\n * 'lineId2': lineObj2,\n * }\n * ```\n */\n getLines(): Record<string, ILine>;\n\n /**\n * Retrieves a dictionary of active calls grouped by `lineId`.\n *\n * This method gathers active {@link ICall} objects and organizes them into a dictionary\n * where keys represent `lineId`s and values are arrays of {@link ICall} objects of active calls associated\n * with each line.\n *\n * @example\n * ```typescript\n * const activeCalls = callingClient.getActiveCalls();\n * ```\n * The `activeCalls` response object will have `lineId` as its key and\n * a list {@link ICall} objects as it's value.\n *\n * ```\n * {\n * 'line1': [call1, call2],\n * 'line2': [call3],\n * }\n * ```\n */\n getActiveCalls(): Record<string, ICall[]>;\n\n /**\n * Retrieves the {@link ICall} object for the currently connected call in the client.\n *\n * This method iterates through active call objects and returns the call\n * that is currently connected (not on hold).\n *\n * @example\n * ```typescript\n * const connectedCall : ICall = callingClient.getConnectedCall();\n * ```\n * The `connectedCall` object will be the Call object of the connected call with the client\n */\n getConnectedCall(): ICall | undefined;\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import * as Media from '@webex/internal-media-core';\nimport {LOGGER} from '../Logger/types';\nimport {ISDKConnector} from '../SDKConnector/types';\nimport {Eventing} from '../Events/impl';\nimport {CallingClientEventTypes} from '../Events/types';\nimport {ServiceData} from '../common/types';\nimport {ICall} from './calling/types';\nimport {CallingClientError} from '../Errors';\nimport {ILine} from './line/types';\n\nexport interface LoggerConfig {\n level: LOGGER;\n}\n\ninterface DiscoveryConfig {\n country: string;\n region: string;\n}\n\nexport interface CallingClientConfig {\n logger?: LoggerConfig;\n discovery?: DiscoveryConfig;\n serviceData?: ServiceData;\n jwe?: string;\n}\n\nexport type CallingClientErrorEmitterCallback = (\n err: CallingClientError,\n finalError?: boolean\n) => void;\n\n/**\n * An interface for the `CallingClient` module.\n * The `CallingClient` module is designed to provide a set of APIs related to line registration and calling functionalities within the SDK.\n *\n * @example\n * ```javascript\n * const callingClient = createClient(webex, callingConfig);\n * ```\n */\nexport interface ICallingClient extends Eventing<CallingClientEventTypes> {\n /**\n * Represents the `mediaEngine for managing media-related operations within the CallingClient.\n * The media engine provides access to audio and video devices such as cameras, microphones, and speakers within the media layer.\n *\n * @public\n * @example\n * ```\n * const microphones = await callingClient.mediaEngine.Media.getMicrophones();\n * const speakers = await callingClient.mediaEngine.Media.getSpeakers();\n * const cameras = await callingClient.mediaEngine.Media.getCameras();\n * ```\n */\n mediaEngine: typeof Media;\n\n /**\n * @ignore\n */\n getSDKConnector(): ISDKConnector;\n\n /**\n * @ignore\n */\n getLoggingLevel(): LOGGER;\n\n /**\n * Retrieves details of the line object(s) belonging to a user.\n *\n * This method gathers all the {@link ILine} objects and organizes them into a dictionary\n * where keys represent `lineId`s and values are arrays of {@link ILine} objects registered with\n * the `callingClient`\n *\n * @example\n * ```typescript\n * const lines = callingClient.getLines();\n * ```\n * The `lines` response object will have `lineId` as its key and\n * a list {@link ILine} objects as it's value.\n * ```\n * {\n * 'lineId1': lineObj1,\n * 'lineId2': lineObj2,\n * }\n * ```\n */\n getLines(): Record<string, ILine>;\n\n /**\n * Retrieves a dictionary of active calls grouped by `lineId`.\n *\n * This method gathers active {@link ICall} objects and organizes them into a dictionary\n * where keys represent `lineId`s and values are arrays of {@link ICall} objects of active calls associated\n * with each line.\n *\n * @example\n * ```typescript\n * const activeCalls = callingClient.getActiveCalls();\n * ```\n * The `activeCalls` response object will have `lineId` as its key and\n * a list {@link ICall} objects as it's value.\n *\n * ```\n * {\n * 'line1': [call1, call2],\n * 'line2': [call3],\n * }\n * ```\n */\n getActiveCalls(): Record<string, ICall[]>;\n\n /**\n * Retrieves the {@link ICall} object for the currently connected call in the client.\n *\n * This method iterates through active call objects and returns the call\n * that is currently connected (not on hold).\n *\n * @example\n * ```typescript\n * const connectedCall : ICall = callingClient.getConnectedCall();\n * ```\n * The `connectedCall` object will be the Call object of the connected call with the client\n */\n getConnectedCall(): ICall | undefined;\n}\n"],"mappings":"","ignoreList":[]}
|