@webex/contact-center 0.0.0-next.1
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/README.md +81 -0
- package/__mocks__/workerMock.js +15 -0
- package/babel.config.js +15 -0
- package/dist/cc.js +1416 -0
- package/dist/cc.js.map +1 -0
- package/dist/config.js +72 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.js +58 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.js +142 -0
- package/dist/index.js.map +1 -0
- package/dist/logger-proxy.js +115 -0
- package/dist/logger-proxy.js.map +1 -0
- package/dist/metrics/MetricsManager.js +474 -0
- package/dist/metrics/MetricsManager.js.map +1 -0
- package/dist/metrics/behavioral-events.js +322 -0
- package/dist/metrics/behavioral-events.js.map +1 -0
- package/dist/metrics/constants.js +134 -0
- package/dist/metrics/constants.js.map +1 -0
- package/dist/services/WebCallingService.js +323 -0
- package/dist/services/WebCallingService.js.map +1 -0
- package/dist/services/agent/index.js +177 -0
- package/dist/services/agent/index.js.map +1 -0
- package/dist/services/agent/types.js +137 -0
- package/dist/services/agent/types.js.map +1 -0
- package/dist/services/config/Util.js +203 -0
- package/dist/services/config/Util.js.map +1 -0
- package/dist/services/config/constants.js +221 -0
- package/dist/services/config/constants.js.map +1 -0
- package/dist/services/config/index.js +607 -0
- package/dist/services/config/index.js.map +1 -0
- package/dist/services/config/types.js +334 -0
- package/dist/services/config/types.js.map +1 -0
- package/dist/services/constants.js +117 -0
- package/dist/services/constants.js.map +1 -0
- package/dist/services/core/Err.js +43 -0
- package/dist/services/core/Err.js.map +1 -0
- package/dist/services/core/GlobalTypes.js +6 -0
- package/dist/services/core/GlobalTypes.js.map +1 -0
- package/dist/services/core/Utils.js +126 -0
- package/dist/services/core/Utils.js.map +1 -0
- package/dist/services/core/WebexRequest.js +96 -0
- package/dist/services/core/WebexRequest.js.map +1 -0
- package/dist/services/core/aqm-reqs.js +246 -0
- package/dist/services/core/aqm-reqs.js.map +1 -0
- package/dist/services/core/constants.js +109 -0
- package/dist/services/core/constants.js.map +1 -0
- package/dist/services/core/types.js +6 -0
- package/dist/services/core/types.js.map +1 -0
- package/dist/services/core/websocket/WebSocketManager.js +187 -0
- package/dist/services/core/websocket/WebSocketManager.js.map +1 -0
- package/dist/services/core/websocket/connection-service.js +111 -0
- package/dist/services/core/websocket/connection-service.js.map +1 -0
- package/dist/services/core/websocket/keepalive.worker.js +94 -0
- package/dist/services/core/websocket/keepalive.worker.js.map +1 -0
- package/dist/services/core/websocket/types.js +6 -0
- package/dist/services/core/websocket/types.js.map +1 -0
- package/dist/services/index.js +78 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/task/AutoWrapup.js +88 -0
- package/dist/services/task/AutoWrapup.js.map +1 -0
- package/dist/services/task/TaskManager.js +369 -0
- package/dist/services/task/TaskManager.js.map +1 -0
- package/dist/services/task/constants.js +58 -0
- package/dist/services/task/constants.js.map +1 -0
- package/dist/services/task/contact.js +464 -0
- package/dist/services/task/contact.js.map +1 -0
- package/dist/services/task/dialer.js +60 -0
- package/dist/services/task/dialer.js.map +1 -0
- package/dist/services/task/index.js +1188 -0
- package/dist/services/task/index.js.map +1 -0
- package/dist/services/task/types.js +214 -0
- package/dist/services/task/types.js.map +1 -0
- package/dist/types/cc.d.ts +676 -0
- package/dist/types/config.d.ts +66 -0
- package/dist/types/constants.d.ts +45 -0
- package/dist/types/index.d.ts +178 -0
- package/dist/types/logger-proxy.d.ts +71 -0
- package/dist/types/metrics/MetricsManager.d.ts +223 -0
- package/dist/types/metrics/behavioral-events.d.ts +29 -0
- package/dist/types/metrics/constants.d.ts +127 -0
- package/dist/types/services/WebCallingService.d.ts +1 -0
- package/dist/types/services/agent/index.d.ts +46 -0
- package/dist/types/services/agent/types.d.ts +413 -0
- package/dist/types/services/config/Util.d.ts +19 -0
- package/dist/types/services/config/constants.d.ts +203 -0
- package/dist/types/services/config/index.d.ts +171 -0
- package/dist/types/services/config/types.d.ts +1113 -0
- package/dist/types/services/constants.d.ts +97 -0
- package/dist/types/services/core/Err.d.ts +119 -0
- package/dist/types/services/core/GlobalTypes.d.ts +33 -0
- package/dist/types/services/core/Utils.d.ts +36 -0
- package/dist/types/services/core/WebexRequest.d.ts +22 -0
- package/dist/types/services/core/aqm-reqs.d.ts +16 -0
- package/dist/types/services/core/constants.d.ts +85 -0
- package/dist/types/services/core/types.d.ts +47 -0
- package/dist/types/services/core/websocket/WebSocketManager.d.ts +34 -0
- package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
- package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
- package/dist/types/services/core/websocket/types.d.ts +37 -0
- package/dist/types/services/index.d.ts +52 -0
- package/dist/types/services/task/AutoWrapup.d.ts +40 -0
- package/dist/types/services/task/TaskManager.d.ts +1 -0
- package/dist/types/services/task/constants.d.ts +46 -0
- package/dist/types/services/task/contact.d.ts +59 -0
- package/dist/types/services/task/dialer.d.ts +28 -0
- package/dist/types/services/task/index.d.ts +569 -0
- package/dist/types/services/task/types.d.ts +1041 -0
- package/dist/types/types.d.ts +452 -0
- package/dist/types/webex-config.d.ts +53 -0
- package/dist/types/webex.d.ts +7 -0
- package/dist/types.js +292 -0
- package/dist/types.js.map +1 -0
- package/dist/webex-config.js +60 -0
- package/dist/webex-config.js.map +1 -0
- package/dist/webex.js +99 -0
- package/dist/webex.js.map +1 -0
- package/jest.config.js +45 -0
- package/package.json +83 -0
- package/src/cc.ts +1618 -0
- package/src/config.ts +65 -0
- package/src/constants.ts +51 -0
- package/src/index.ts +220 -0
- package/src/logger-proxy.ts +110 -0
- package/src/metrics/MetricsManager.ts +512 -0
- package/src/metrics/behavioral-events.ts +332 -0
- package/src/metrics/constants.ts +135 -0
- package/src/services/WebCallingService.ts +351 -0
- package/src/services/agent/index.ts +149 -0
- package/src/services/agent/types.ts +440 -0
- package/src/services/config/Util.ts +261 -0
- package/src/services/config/constants.ts +249 -0
- package/src/services/config/index.ts +743 -0
- package/src/services/config/types.ts +1117 -0
- package/src/services/constants.ts +111 -0
- package/src/services/core/Err.ts +126 -0
- package/src/services/core/GlobalTypes.ts +34 -0
- package/src/services/core/Utils.ts +132 -0
- package/src/services/core/WebexRequest.ts +103 -0
- package/src/services/core/aqm-reqs.ts +272 -0
- package/src/services/core/constants.ts +106 -0
- package/src/services/core/types.ts +48 -0
- package/src/services/core/websocket/WebSocketManager.ts +196 -0
- package/src/services/core/websocket/connection-service.ts +142 -0
- package/src/services/core/websocket/keepalive.worker.js +88 -0
- package/src/services/core/websocket/types.ts +40 -0
- package/src/services/index.ts +71 -0
- package/src/services/task/AutoWrapup.ts +86 -0
- package/src/services/task/TaskManager.ts +420 -0
- package/src/services/task/constants.ts +52 -0
- package/src/services/task/contact.ts +429 -0
- package/src/services/task/dialer.ts +52 -0
- package/src/services/task/index.ts +1375 -0
- package/src/services/task/types.ts +1113 -0
- package/src/types.ts +639 -0
- package/src/webex-config.ts +54 -0
- package/src/webex.js +96 -0
- package/test/unit/spec/cc.ts +1985 -0
- package/test/unit/spec/metrics/MetricsManager.ts +491 -0
- package/test/unit/spec/metrics/behavioral-events.ts +102 -0
- package/test/unit/spec/services/WebCallingService.ts +416 -0
- package/test/unit/spec/services/agent/index.ts +65 -0
- package/test/unit/spec/services/config/index.ts +1035 -0
- package/test/unit/spec/services/core/Utils.ts +279 -0
- package/test/unit/spec/services/core/WebexRequest.ts +144 -0
- package/test/unit/spec/services/core/aqm-reqs.ts +570 -0
- package/test/unit/spec/services/core/websocket/WebSocketManager.ts +378 -0
- package/test/unit/spec/services/core/websocket/connection-service.ts +178 -0
- package/test/unit/spec/services/task/TaskManager.ts +1351 -0
- package/test/unit/spec/services/task/contact.ts +204 -0
- package/test/unit/spec/services/task/dialer.ts +157 -0
- package/test/unit/spec/services/task/index.ts +1474 -0
- package/tsconfig.json +6 -0
- package/typedoc.json +37 -0
- package/typedoc.md +240 -0
- package/umd/contact-center.min.js +3 -0
- package/umd/contact-center.min.js.map +1 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Message = exports.Details = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Err module provides a structured way to handle errors in the Contact Center plugin.
|
|
9
|
+
* @ignore
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
class Message extends Error {
|
|
13
|
+
constructor(id, value) {
|
|
14
|
+
super();
|
|
15
|
+
this.id = id;
|
|
16
|
+
this.stack = new Error().stack;
|
|
17
|
+
if (typeof value === 'string') {
|
|
18
|
+
this.message = value;
|
|
19
|
+
} else if (value instanceof Error) {
|
|
20
|
+
this.message = value.message;
|
|
21
|
+
this.name = value.name;
|
|
22
|
+
} else {
|
|
23
|
+
this.message = '';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Marker to distinct Err class from other errors
|
|
28
|
+
isErr = 'yes';
|
|
29
|
+
}
|
|
30
|
+
exports.Message = Message;
|
|
31
|
+
class Details extends Error {
|
|
32
|
+
constructor(id, details) {
|
|
33
|
+
super();
|
|
34
|
+
this.id = id;
|
|
35
|
+
this.stack = new Error().stack;
|
|
36
|
+
this.details = details;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Marker to distinct Err class from other errors
|
|
40
|
+
isErr = 'yes';
|
|
41
|
+
}
|
|
42
|
+
exports.Details = Details;
|
|
43
|
+
//# sourceMappingURL=Err.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Message","Error","constructor","id","value","stack","message","name","isErr","exports","Details","details"],"sources":["Err.ts"],"sourcesContent":["import {WebexRequestPayload} from '../../types';\nimport {Failure} from './GlobalTypes';\n\n/**\n * Err module provides a structured way to handle errors in the Contact Center plugin.\n * @ignore\n */\n\nexport type ErrDetails = {status: number; type: string; trackingId: string};\n\nexport type AgentErrorIds =\n | {'Service.aqm.agent.stationLogin': ErrDetails}\n | {'Service.aqm.agent.stationLoginFailed': Failure}\n | {'Service.aqm.agent.stateChange': Failure}\n | {'Service.aqm.agent.reload': Failure}\n | {'Service.aqm.agent.logout': Failure}\n | {'Service.reqs.generic.failure': {trackingId: string}}\n | {'Service.aqm.agent.BuddyAgentsRetrieveFailed': Failure};\n\nexport type vteamType = 'inboundqueue' | 'inboundentrypoint' | string;\n\nexport type TaskErrorIds =\n | {'Service.aqm.task.accept': Failure}\n | {'Service.aqm.task.end': Failure}\n | {'Service.aqm.task.wrapup': Failure}\n | {'Service.aqm.task.AgentVteamTransferFailed': Failure}\n | {'Service.aqm.task.AgentBlindTransferFailedEvent': Failure}\n | {'Service.aqm.task.AgentConsultTransferFailed': Failure}\n | {'Service.aqm.task.consult': Failure}\n | {'Service.aqm.err.trackingId': {trackingId: string}}\n | {'Service.aqm.task.consultAccept': Failure}\n | {'Service.aqm.task.consultConference': Failure}\n | {'Service.aqm.task.consultEnd': Failure}\n | {'Service.aqm.task.cancelCtq': Failure}\n | {'Service.aqm.task.hold': Failure}\n | {'Service.aqm.task.unHold': Failure}\n | {'Service.aqm.task.VteamListFailed': Failure}\n | {'Service.aqm.task.pauseRecording': Failure}\n | {'Service.aqm.task.resumeRecording': Failure}\n | {'Service.aqm.dialer.startOutdial': Failure}\n | {'Service.reqs.generic.failure': {trackingId: string}};\n\nexport type ReqError =\n | 'Service.aqm.reqs.GenericRequestError'\n | {'Service.aqm.reqs.Pending': {key: string; msg: string}}\n | {'Service.aqm.reqs.PendingEvent': {key: string}}\n | {'Service.aqm.reqs.Timeout': {key: string; response: WebexRequestPayload}}\n | {'Service.aqm.reqs.TimeoutEvent': {key: string}};\n\nexport interface Ids {\n 'Service.aqm.agent': AgentErrorIds;\n 'Service.aqm.reqs': ReqError;\n 'Service.aqm.task': TaskErrorIds;\n}\n\nexport type IdsGlobal =\n | 'system' // to handle errors that was not created by 'new Err.WithId()'\n | 'handle'\n | 'fallback';\n\nexport type IdsSub = Ids[keyof Ids];\n\nexport type IdsMessage = IdsGlobal | keyof Ids | Exclude<IdsSub, object>;\n\nexport type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I\n) => void\n ? I\n : never;\n\nexport type FlattenUnion<T> = {\n [K in keyof UnionToIntersection<T>]: K extends keyof T\n ? T[K] extends any[]\n ? T[K]\n : T[K] extends object\n ? FlattenUnion<T[K]>\n : T[K]\n : UnionToIntersection<T>[K];\n};\nexport type IdsDetailsType = FlattenUnion<Exclude<IdsSub, string>>;\n\nexport type IdsDetails = keyof IdsDetailsType;\n\nexport type Id = IdsMessage | IdsDetails;\n\nexport class Message extends Error {\n readonly id: Id;\n\n constructor(id: IdsMessage);\n constructor(id: IdsMessage, message: string);\n constructor(id: IdsMessage, errror: Error);\n constructor(id: IdsMessage, value?: string | Error) {\n super();\n\n this.id = id;\n this.stack = new Error().stack!;\n\n if (typeof value === 'string') {\n this.message = value;\n } else if (value instanceof Error) {\n this.message = value.message;\n this.name = value.name;\n } else {\n this.message = '';\n }\n }\n\n // Marker to distinct Err class from other errors\n private isErr = 'yes';\n}\n\nexport class Details<T extends IdsDetails> extends Error {\n readonly id: Id;\n readonly details: IdsDetailsType[T];\n\n constructor(id: T, details: IdsDetailsType[T]) {\n super();\n\n this.id = id;\n this.stack = new Error().stack!;\n this.details = details;\n }\n\n // Marker to distinct Err class from other errors\n private isErr = 'yes';\n}\n"],"mappings":";;;;;;AAGA;AACA;AACA;AACA;;AA+EO,MAAMA,OAAO,SAASC,KAAK,CAAC;EAMjCC,WAAWA,CAACC,EAAc,EAAEC,KAAsB,EAAE;IAClD,KAAK,CAAC,CAAC;IAEP,IAAI,CAACD,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACE,KAAK,GAAG,IAAIJ,KAAK,CAAC,CAAC,CAACI,KAAM;IAE/B,IAAI,OAAOD,KAAK,KAAK,QAAQ,EAAE;MAC7B,IAAI,CAACE,OAAO,GAAGF,KAAK;IACtB,CAAC,MAAM,IAAIA,KAAK,YAAYH,KAAK,EAAE;MACjC,IAAI,CAACK,OAAO,GAAGF,KAAK,CAACE,OAAO;MAC5B,IAAI,CAACC,IAAI,GAAGH,KAAK,CAACG,IAAI;IACxB,CAAC,MAAM;MACL,IAAI,CAACD,OAAO,GAAG,EAAE;IACnB;EACF;;EAEA;EACQE,KAAK,GAAG,KAAK;AACvB;AAACC,OAAA,CAAAT,OAAA,GAAAA,OAAA;AAEM,MAAMU,OAAO,SAA+BT,KAAK,CAAC;EAIvDC,WAAWA,CAACC,EAAK,EAAEQ,OAA0B,EAAE;IAC7C,KAAK,CAAC,CAAC;IAEP,IAAI,CAACR,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACE,KAAK,GAAG,IAAIJ,KAAK,CAAC,CAAC,CAACI,KAAM;IAC/B,IAAI,CAACM,OAAO,GAAGA,OAAO;EACxB;;EAEA;EACQH,KAAK,GAAG,KAAK;AACvB;AAACC,OAAA,CAAAC,OAAA,GAAAA,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["GlobalTypes.ts"],"sourcesContent":["/**\n * Generic message interface used throughout the plugin\n * @template T - Type of the data payload (defaults to any)\n * @private\n * @ignore\n */\nexport type Msg<T = any> = {\n /** Message/Event type identifier */\n type: string;\n /** Organization identifier */\n orgId: string;\n /** Unique tracking identifier for the message/Event */\n trackingId: string;\n /** Message/Event payload data */\n data: T;\n};\n\n/**\n * Represents a failure message with specific error details\n * @private\n * @ignore\n */\nexport type Failure = Msg<{\n /** Agent identifier associated with the failure */\n agentId: string;\n /** Tracking identifier for the failure event */\n trackingId: string;\n /** Numeric code indicating the reason for failure */\n reasonCode: number;\n /** Organization identifier */\n orgId: string;\n /** Human-readable description of the failure reason */\n reason: string;\n}>;\n"],"mappings":""}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isValidDialNumber = exports.getStationLoginErrorData = exports.getErrorDetails = exports.createErrDetailsObject = void 0;
|
|
7
|
+
var Err = _interopRequireWildcard(require("./Err"));
|
|
8
|
+
var _types = require("../../types");
|
|
9
|
+
var _loggerProxy = _interopRequireDefault(require("../../logger-proxy"));
|
|
10
|
+
var _WebexRequest = _interopRequireDefault(require("./WebexRequest"));
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
|
+
/**
|
|
15
|
+
* Extracts common error details from a Webex request payload.
|
|
16
|
+
*
|
|
17
|
+
* @param errObj - The Webex request payload object.
|
|
18
|
+
* @returns An object containing the tracking ID and message body.
|
|
19
|
+
* @private
|
|
20
|
+
* @ignore
|
|
21
|
+
*/
|
|
22
|
+
const getCommonErrorDetails = errObj => {
|
|
23
|
+
return {
|
|
24
|
+
trackingId: errObj?.headers?.trackingid || errObj?.headers?.TrackingID,
|
|
25
|
+
msg: errObj?.body
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
const isValidDialNumber = input => {
|
|
29
|
+
// This regex checks for a valid dial number format for only few countries such as US, Canada.
|
|
30
|
+
const regexForDn = /1[0-9]{3}[2-9][0-9]{6}([,]{1,10}[0-9]+){0,1}/;
|
|
31
|
+
return regexForDn.test(input);
|
|
32
|
+
};
|
|
33
|
+
exports.isValidDialNumber = isValidDialNumber;
|
|
34
|
+
const getStationLoginErrorData = (failure, loginOption) => {
|
|
35
|
+
let duplicateLocationMessage = 'This value is already in use';
|
|
36
|
+
if (loginOption === _types.LoginOption.EXTENSION) {
|
|
37
|
+
duplicateLocationMessage = 'This extension is already in use';
|
|
38
|
+
}
|
|
39
|
+
if (loginOption === _types.LoginOption.AGENT_DN) {
|
|
40
|
+
duplicateLocationMessage = 'Dial number is in use. Try a different one. For help, reach out to your administrator or support team.';
|
|
41
|
+
}
|
|
42
|
+
const errorCodeMessageMap = {
|
|
43
|
+
DUPLICATE_LOCATION: {
|
|
44
|
+
message: duplicateLocationMessage,
|
|
45
|
+
fieldName: loginOption
|
|
46
|
+
},
|
|
47
|
+
INVALID_DIAL_NUMBER: {
|
|
48
|
+
message: 'Enter a valid US dial number. For help, reach out to your administrator or support team.',
|
|
49
|
+
fieldName: loginOption
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const defaultMessage = 'An error occurred while logging in to the station';
|
|
53
|
+
const defaultFieldName = 'generic';
|
|
54
|
+
const reason = failure?.data?.reason || '';
|
|
55
|
+
return {
|
|
56
|
+
message: errorCodeMessageMap[reason]?.message || defaultMessage,
|
|
57
|
+
fieldName: errorCodeMessageMap[reason]?.fieldName || defaultFieldName
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Extracts error details and logs the error. Also uploads logs for the error unless it is a silent relogin agent not found error.
|
|
63
|
+
*
|
|
64
|
+
* @param error - The error object, expected to have a `details` property of type Failure.
|
|
65
|
+
* @param methodName - The name of the method where the error occurred.
|
|
66
|
+
* @param moduleName - The name of the module where the error occurred.
|
|
67
|
+
* @returns An object containing the error instance and the reason string.
|
|
68
|
+
* @public
|
|
69
|
+
* @example
|
|
70
|
+
* const details = getErrorDetails(error, 'fetchData', 'DataModule');
|
|
71
|
+
* if (details.error) { handleError(details.error); }
|
|
72
|
+
* @ignore
|
|
73
|
+
*/
|
|
74
|
+
exports.getStationLoginErrorData = getStationLoginErrorData;
|
|
75
|
+
const getErrorDetails = (error, methodName, moduleName) => {
|
|
76
|
+
let errData = {
|
|
77
|
+
message: '',
|
|
78
|
+
fieldName: ''
|
|
79
|
+
};
|
|
80
|
+
const failure = error.details;
|
|
81
|
+
const reason = failure?.data?.reason ?? `Error while performing ${methodName}`;
|
|
82
|
+
if (!(reason === 'AGENT_NOT_FOUND' && methodName === 'silentRelogin')) {
|
|
83
|
+
_loggerProxy.default.error(`${methodName} failed with reason: ${reason}`, {
|
|
84
|
+
module: moduleName,
|
|
85
|
+
method: methodName,
|
|
86
|
+
trackingId: failure?.trackingId
|
|
87
|
+
});
|
|
88
|
+
// we can add more conditions here if not needed for specific cases eg: silentReLogin
|
|
89
|
+
_WebexRequest.default.getInstance().uploadLogs({
|
|
90
|
+
correlationId: failure?.trackingId
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (methodName === 'stationLogin') {
|
|
94
|
+
errData = getStationLoginErrorData(failure, error.loginOption);
|
|
95
|
+
_loggerProxy.default.error(`${methodName} failed with reason: ${reason}, message: ${errData.message}, fieldName: ${errData.fieldName}`, {
|
|
96
|
+
module: moduleName,
|
|
97
|
+
method: methodName,
|
|
98
|
+
trackingId: failure?.trackingId
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const err = new Error(reason ?? `Error while performing ${methodName}`);
|
|
102
|
+
// @ts-ignore - add custom property to the error object for backward compatibility
|
|
103
|
+
err.data = errData;
|
|
104
|
+
return {
|
|
105
|
+
error: err,
|
|
106
|
+
reason
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Creates an error details object suitable for use with the Err.Details class.
|
|
112
|
+
*
|
|
113
|
+
* @param errObj - The Webex request payload object.
|
|
114
|
+
* @returns An instance of Err.Details with the generic failure message and extracted details.
|
|
115
|
+
* @public
|
|
116
|
+
* @example
|
|
117
|
+
* const errDetails = createErrDetailsObject(webexRequestPayload);
|
|
118
|
+
* @ignore
|
|
119
|
+
*/
|
|
120
|
+
exports.getErrorDetails = getErrorDetails;
|
|
121
|
+
const createErrDetailsObject = errObj => {
|
|
122
|
+
const details = getCommonErrorDetails(errObj);
|
|
123
|
+
return new Err.Details('Service.reqs.generic.failure', details);
|
|
124
|
+
};
|
|
125
|
+
exports.createErrDetailsObject = createErrDetailsObject;
|
|
126
|
+
//# sourceMappingURL=Utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Err","_interopRequireWildcard","require","_types","_loggerProxy","_interopRequireDefault","_WebexRequest","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","getCommonErrorDetails","errObj","trackingId","headers","trackingid","TrackingID","msg","body","isValidDialNumber","input","regexForDn","test","exports","getStationLoginErrorData","failure","loginOption","duplicateLocationMessage","LoginOption","EXTENSION","AGENT_DN","errorCodeMessageMap","DUPLICATE_LOCATION","message","fieldName","INVALID_DIAL_NUMBER","defaultMessage","defaultFieldName","reason","data","getErrorDetails","error","methodName","moduleName","errData","details","LoggerProxy","module","method","WebexRequest","getInstance","uploadLogs","correlationId","err","Error","createErrDetailsObject","Details"],"sources":["Utils.ts"],"sourcesContent":["import * as Err from './Err';\nimport {LoginOption, WebexRequestPayload} from '../../types';\nimport {Failure} from './GlobalTypes';\nimport LoggerProxy from '../../logger-proxy';\nimport WebexRequest from './WebexRequest';\n\n/**\n * Extracts common error details from a Webex request payload.\n *\n * @param errObj - The Webex request payload object.\n * @returns An object containing the tracking ID and message body.\n * @private\n * @ignore\n */\nconst getCommonErrorDetails = (errObj: WebexRequestPayload) => {\n return {\n trackingId: errObj?.headers?.trackingid || errObj?.headers?.TrackingID,\n msg: errObj?.body,\n };\n};\n\nexport const isValidDialNumber = (input: string): boolean => {\n // This regex checks for a valid dial number format for only few countries such as US, Canada.\n const regexForDn = /1[0-9]{3}[2-9][0-9]{6}([,]{1,10}[0-9]+){0,1}/;\n\n return regexForDn.test(input);\n};\n\nexport const getStationLoginErrorData = (failure: Failure, loginOption: LoginOption) => {\n let duplicateLocationMessage = 'This value is already in use';\n\n if (loginOption === LoginOption.EXTENSION) {\n duplicateLocationMessage = 'This extension is already in use';\n }\n\n if (loginOption === LoginOption.AGENT_DN) {\n duplicateLocationMessage =\n 'Dial number is in use. Try a different one. For help, reach out to your administrator or support team.';\n }\n\n const errorCodeMessageMap = {\n DUPLICATE_LOCATION: {\n message: duplicateLocationMessage,\n fieldName: loginOption,\n },\n INVALID_DIAL_NUMBER: {\n message:\n 'Enter a valid US dial number. For help, reach out to your administrator or support team.',\n fieldName: loginOption,\n },\n };\n\n const defaultMessage = 'An error occurred while logging in to the station';\n const defaultFieldName = 'generic';\n\n const reason = failure?.data?.reason || '';\n\n return {\n message: errorCodeMessageMap[reason]?.message || defaultMessage,\n fieldName: errorCodeMessageMap[reason]?.fieldName || defaultFieldName,\n };\n};\n\n/**\n * Extracts error details and logs the error. Also uploads logs for the error unless it is a silent relogin agent not found error.\n *\n * @param error - The error object, expected to have a `details` property of type Failure.\n * @param methodName - The name of the method where the error occurred.\n * @param moduleName - The name of the module where the error occurred.\n * @returns An object containing the error instance and the reason string.\n * @public\n * @example\n * const details = getErrorDetails(error, 'fetchData', 'DataModule');\n * if (details.error) { handleError(details.error); }\n * @ignore\n */\nexport const getErrorDetails = (error: any, methodName: string, moduleName: string) => {\n let errData = {message: '', fieldName: ''};\n\n const failure = error.details as Failure;\n const reason = failure?.data?.reason ?? `Error while performing ${methodName}`;\n\n if (!(reason === 'AGENT_NOT_FOUND' && methodName === 'silentRelogin')) {\n LoggerProxy.error(`${methodName} failed with reason: ${reason}`, {\n module: moduleName,\n method: methodName,\n trackingId: failure?.trackingId,\n });\n // we can add more conditions here if not needed for specific cases eg: silentReLogin\n WebexRequest.getInstance().uploadLogs({\n correlationId: failure?.trackingId,\n });\n }\n\n if (methodName === 'stationLogin') {\n errData = getStationLoginErrorData(failure, error.loginOption);\n\n LoggerProxy.error(\n `${methodName} failed with reason: ${reason}, message: ${errData.message}, fieldName: ${errData.fieldName}`,\n {\n module: moduleName,\n method: methodName,\n trackingId: failure?.trackingId,\n }\n );\n }\n\n const err = new Error(reason ?? `Error while performing ${methodName}`);\n // @ts-ignore - add custom property to the error object for backward compatibility\n err.data = errData;\n\n return {\n error: err,\n reason,\n };\n};\n\n/**\n * Creates an error details object suitable for use with the Err.Details class.\n *\n * @param errObj - The Webex request payload object.\n * @returns An instance of Err.Details with the generic failure message and extracted details.\n * @public\n * @example\n * const errDetails = createErrDetailsObject(webexRequestPayload);\n * @ignore\n */\nexport const createErrDetailsObject = (errObj: WebexRequestPayload) => {\n const details = getCommonErrorDetails(errObj);\n\n return new Err.Details('Service.reqs.generic.failure', details);\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _constants = require("../../constants");
|
|
8
|
+
var _loggerProxy = _interopRequireDefault(require("../../logger-proxy"));
|
|
9
|
+
var _constants2 = require("./constants");
|
|
10
|
+
var _constants3 = require("../../metrics/constants");
|
|
11
|
+
var _MetricsManager = _interopRequireDefault(require("../../metrics/MetricsManager"));
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
class WebexRequest {
|
|
14
|
+
static getInstance(options) {
|
|
15
|
+
if (!WebexRequest.instance && options && options.webex) {
|
|
16
|
+
WebexRequest.instance = new WebexRequest(options);
|
|
17
|
+
}
|
|
18
|
+
return WebexRequest.instance;
|
|
19
|
+
}
|
|
20
|
+
constructor(options) {
|
|
21
|
+
const {
|
|
22
|
+
webex
|
|
23
|
+
} = options;
|
|
24
|
+
this.webex = webex;
|
|
25
|
+
}
|
|
26
|
+
async request(options) {
|
|
27
|
+
const {
|
|
28
|
+
service,
|
|
29
|
+
resource,
|
|
30
|
+
method,
|
|
31
|
+
body
|
|
32
|
+
} = options;
|
|
33
|
+
return this.webex.request({
|
|
34
|
+
service,
|
|
35
|
+
resource,
|
|
36
|
+
method,
|
|
37
|
+
body
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* This is used for uploading the logs to backend/mats.
|
|
43
|
+
*
|
|
44
|
+
* @param metaData - meta data to be uploaded.
|
|
45
|
+
*/
|
|
46
|
+
async uploadLogs(metaData = {}) {
|
|
47
|
+
const feedbackId = crypto.randomUUID();
|
|
48
|
+
try {
|
|
49
|
+
const response = await this.webex.internal.support.submitLogs({
|
|
50
|
+
...metaData,
|
|
51
|
+
feedbackId
|
|
52
|
+
}, undefined,
|
|
53
|
+
// we dont send logs but take from webex logger
|
|
54
|
+
{
|
|
55
|
+
type: 'diff'
|
|
56
|
+
} // this is to take the diff logs from previous upload
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
_loggerProxy.default.info(`Logs uploaded successfully with feedbackId: ${feedbackId}`, {
|
|
60
|
+
module: _constants.WEBEX_REQUEST_FILE,
|
|
61
|
+
method: _constants2.METHODS.UPLOAD_LOGS
|
|
62
|
+
});
|
|
63
|
+
_MetricsManager.default.getInstance().trackEvent(_constants3.METRIC_EVENT_NAMES.UPLOAD_LOGS_SUCCESS, {
|
|
64
|
+
trackingId: response?.trackingid,
|
|
65
|
+
feedbackId,
|
|
66
|
+
correlationId: metaData?.correlationId
|
|
67
|
+
}, ['behavioral']);
|
|
68
|
+
return {
|
|
69
|
+
trackingid: response.trackingid,
|
|
70
|
+
...(response.url ? {
|
|
71
|
+
url: response.url
|
|
72
|
+
} : {}),
|
|
73
|
+
...(response.userId ? {
|
|
74
|
+
userId: response.userId
|
|
75
|
+
} : {}),
|
|
76
|
+
...(response.correlationId ? {
|
|
77
|
+
correlationId: response.correlationId
|
|
78
|
+
} : {}),
|
|
79
|
+
feedbackId
|
|
80
|
+
};
|
|
81
|
+
} catch (error) {
|
|
82
|
+
_loggerProxy.default.error(`Error uploading logs: ${error}`, {
|
|
83
|
+
module: _constants.WEBEX_REQUEST_FILE,
|
|
84
|
+
method: _constants2.METHODS.UPLOAD_LOGS
|
|
85
|
+
});
|
|
86
|
+
_MetricsManager.default.getInstance().trackEvent(_constants3.METRIC_EVENT_NAMES.UPLOAD_LOGS_FAILED, {
|
|
87
|
+
stack: error?.stack,
|
|
88
|
+
feedbackId,
|
|
89
|
+
correlationId: metaData?.correlationId
|
|
90
|
+
}, ['behavioral']);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
var _default = exports.default = WebexRequest;
|
|
96
|
+
//# sourceMappingURL=WebexRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_constants","require","_loggerProxy","_interopRequireDefault","_constants2","_constants3","_MetricsManager","obj","__esModule","default","WebexRequest","getInstance","options","instance","webex","constructor","request","service","resource","method","body","uploadLogs","metaData","feedbackId","crypto","randomUUID","response","internal","support","submitLogs","undefined","type","LoggerProxy","info","module","WEBEX_REQUEST_FILE","METHODS","UPLOAD_LOGS","MetricsManager","trackEvent","METRIC_EVENT_NAMES","UPLOAD_LOGS_SUCCESS","trackingId","trackingid","correlationId","url","userId","error","UPLOAD_LOGS_FAILED","stack","_default","exports"],"sources":["WebexRequest.ts"],"sourcesContent":["import {WEBEX_REQUEST_FILE} from '../../constants';\nimport LoggerProxy from '../../logger-proxy';\nimport {METHODS} from './constants';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {\n WebexSDK,\n HTTP_METHODS,\n IHttpResponse,\n RequestBody,\n UploadLogsResponse,\n LogsMetaData,\n} from '../../types';\n\nclass WebexRequest {\n private webex: WebexSDK;\n private static instance: WebexRequest;\n\n public static getInstance(options?: {webex: WebexSDK}): WebexRequest {\n if (!WebexRequest.instance && options && options.webex) {\n WebexRequest.instance = new WebexRequest(options);\n }\n\n return WebexRequest.instance;\n }\n\n private constructor(options: {webex: WebexSDK}) {\n const {webex} = options;\n this.webex = webex;\n }\n\n public async request(options: {\n service: string;\n resource: string;\n method: HTTP_METHODS;\n body?: RequestBody;\n }): Promise<IHttpResponse> {\n const {service, resource, method, body} = options;\n\n return this.webex.request({\n service,\n resource,\n method,\n body,\n });\n }\n\n /**\n * This is used for uploading the logs to backend/mats.\n *\n * @param metaData - meta data to be uploaded.\n */\n public async uploadLogs(metaData: LogsMetaData = {}): Promise<UploadLogsResponse> {\n const feedbackId = crypto.randomUUID();\n try {\n const response = await this.webex.internal.support.submitLogs(\n {...metaData, feedbackId},\n undefined, // we dont send logs but take from webex logger\n {type: 'diff'} // this is to take the diff logs from previous upload\n );\n LoggerProxy.info(`Logs uploaded successfully with feedbackId: ${feedbackId}`, {\n module: WEBEX_REQUEST_FILE,\n method: METHODS.UPLOAD_LOGS,\n });\n\n MetricsManager.getInstance().trackEvent(\n METRIC_EVENT_NAMES.UPLOAD_LOGS_SUCCESS,\n {\n trackingId: response?.trackingid,\n feedbackId,\n correlationId: metaData?.correlationId,\n },\n ['behavioral']\n );\n\n return {\n trackingid: response.trackingid,\n ...(response.url ? {url: response.url} : {}),\n ...(response.userId ? {userId: response.userId} : {}),\n ...(response.correlationId ? {correlationId: response.correlationId} : {}),\n feedbackId,\n };\n } catch (error) {\n LoggerProxy.error(`Error uploading logs: ${error}`, {\n module: WEBEX_REQUEST_FILE,\n method: METHODS.UPLOAD_LOGS,\n });\n\n MetricsManager.getInstance().trackEvent(\n METRIC_EVENT_NAMES.UPLOAD_LOGS_FAILED,\n {\n stack: error?.stack,\n feedbackId,\n correlationId: metaData?.correlationId,\n },\n ['behavioral']\n );\n throw error;\n }\n }\n}\n\nexport default WebexRequest;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var Err = _interopRequireWildcard(require("./Err"));
|
|
8
|
+
var _types = require("../../types");
|
|
9
|
+
var _loggerProxy = _interopRequireDefault(require("../../logger-proxy"));
|
|
10
|
+
var _constants = require("./constants");
|
|
11
|
+
var _constants2 = require("../../constants");
|
|
12
|
+
var _WebexRequest = _interopRequireDefault(require("./WebexRequest"));
|
|
13
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
+
class AqmReqs {
|
|
17
|
+
pendingRequests = {};
|
|
18
|
+
pendingNotifCancelrequest = {};
|
|
19
|
+
constructor(webSocketManager) {
|
|
20
|
+
this.webexRequest = _WebexRequest.default.getInstance();
|
|
21
|
+
this.webSocketManager = webSocketManager;
|
|
22
|
+
this.webSocketManager.on('message', this.onMessage.bind(this));
|
|
23
|
+
}
|
|
24
|
+
req(c) {
|
|
25
|
+
return (p, cbRes) => this.makeAPIRequest(c(p), cbRes);
|
|
26
|
+
}
|
|
27
|
+
reqEmpty(c) {
|
|
28
|
+
return cbRes => this.makeAPIRequest(c(), cbRes);
|
|
29
|
+
}
|
|
30
|
+
async makeAPIRequest(c, cbRes) {
|
|
31
|
+
return this.createPromise(c, cbRes);
|
|
32
|
+
}
|
|
33
|
+
createPromise(c, cbRes) {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
const keySuccess = this.bindPrint(c.notifSuccess.bind);
|
|
36
|
+
const keyFail = c.notifFail ? this.bindPrint(c.notifFail.bind) : null;
|
|
37
|
+
const keyCancel = c.notifCancel?.bind ? this.bindPrint(c.notifCancel.bind) : null;
|
|
38
|
+
let k = '';
|
|
39
|
+
if (this.pendingRequests[keySuccess]) {
|
|
40
|
+
k = keySuccess;
|
|
41
|
+
}
|
|
42
|
+
if (keyFail && this.pendingRequests[keyFail]) {
|
|
43
|
+
k += keyFail;
|
|
44
|
+
}
|
|
45
|
+
if (k && c.timeout !== 'disabled') {
|
|
46
|
+
reject(new Err.Details('Service.aqm.reqs.Pending', {
|
|
47
|
+
key: k,
|
|
48
|
+
msg: 'The request has been already created, multiple requests are not allowed.'
|
|
49
|
+
}));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
let isClear = false;
|
|
53
|
+
const clear = () => {
|
|
54
|
+
delete this.pendingRequests[keySuccess];
|
|
55
|
+
if (keyFail) {
|
|
56
|
+
delete this.pendingRequests[keyFail];
|
|
57
|
+
}
|
|
58
|
+
if (keyCancel) {
|
|
59
|
+
delete this.pendingNotifCancelrequest[keyCancel];
|
|
60
|
+
}
|
|
61
|
+
isClear = true;
|
|
62
|
+
};
|
|
63
|
+
this.pendingRequests[keySuccess] = {
|
|
64
|
+
check: msg => this.bindCheck(c.notifSuccess.bind, msg),
|
|
65
|
+
handle: msg => {
|
|
66
|
+
clear();
|
|
67
|
+
resolve(msg);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
if (keyCancel) {
|
|
71
|
+
this.pendingRequests[keySuccess].alternateBind = keyCancel;
|
|
72
|
+
this.pendingNotifCancelrequest[keyCancel] = {
|
|
73
|
+
check: msg => this.bindCheck(c.notifCancel?.bind, msg),
|
|
74
|
+
handle: msg => {
|
|
75
|
+
const alternateBindKey = this.pendingNotifCancelrequest[keyCancel].alternateBind;
|
|
76
|
+
if (alternateBindKey) {
|
|
77
|
+
this.pendingRequests[alternateBindKey].handle(msg);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
alternateBind: keySuccess
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (keyFail) {
|
|
84
|
+
this.pendingRequests[keyFail] = {
|
|
85
|
+
check: msg => this.bindCheck(c.notifFail.bind, msg),
|
|
86
|
+
handle: msg => {
|
|
87
|
+
clear();
|
|
88
|
+
const notifFail = c.notifFail;
|
|
89
|
+
if ('errId' in notifFail) {
|
|
90
|
+
_loggerProxy.default.log(`Routing request failed: ${JSON.stringify(msg)}`, {
|
|
91
|
+
module: _constants2.AQM_REQS_FILE,
|
|
92
|
+
method: _constants.METHODS.CREATE_PROMISE
|
|
93
|
+
});
|
|
94
|
+
const eerr = new Err.Details(notifFail.errId, msg);
|
|
95
|
+
_loggerProxy.default.log(`Routing request failed: ${eerr}`, {
|
|
96
|
+
module: _constants2.AQM_REQS_FILE,
|
|
97
|
+
method: _constants.METHODS.CREATE_PROMISE
|
|
98
|
+
});
|
|
99
|
+
reject(eerr);
|
|
100
|
+
} else {
|
|
101
|
+
reject(notifFail.err(msg));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
let response = null;
|
|
107
|
+
this.webexRequest.request({
|
|
108
|
+
service: c.host ?? '',
|
|
109
|
+
resource: c.url,
|
|
110
|
+
// eslint-disable-next-line no-nested-ternary
|
|
111
|
+
method: c.method ? c.method : c.data ? _types.HTTP_METHODS.POST : _types.HTTP_METHODS.GET,
|
|
112
|
+
body: c.data
|
|
113
|
+
}).then(res => {
|
|
114
|
+
response = res;
|
|
115
|
+
if (cbRes) {
|
|
116
|
+
cbRes(res);
|
|
117
|
+
}
|
|
118
|
+
}).catch(error => {
|
|
119
|
+
clear();
|
|
120
|
+
if (error?.headers) {
|
|
121
|
+
error.headers.Authorization = '*';
|
|
122
|
+
}
|
|
123
|
+
if (error?.headers) {
|
|
124
|
+
error.headers.Authorization = '*';
|
|
125
|
+
}
|
|
126
|
+
if (typeof c.err === 'function') {
|
|
127
|
+
reject(c.err(error));
|
|
128
|
+
} else if (typeof c.err === 'string') {
|
|
129
|
+
reject(new Err.Message(c.err));
|
|
130
|
+
} else {
|
|
131
|
+
reject(new Err.Message('Service.aqm.reqs.GenericRequestError'));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
if (c.timeout !== 'disabled') {
|
|
135
|
+
window.setTimeout(() => {
|
|
136
|
+
if (isClear) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
clear();
|
|
140
|
+
if (response?.headers) {
|
|
141
|
+
response.headers.Authorization = '*';
|
|
142
|
+
}
|
|
143
|
+
_loggerProxy.default.error(`Routing request timeout${keySuccess}${response}${c.url}`, {
|
|
144
|
+
module: _constants2.AQM_REQS_FILE,
|
|
145
|
+
method: _constants.METHODS.CREATE_PROMISE
|
|
146
|
+
});
|
|
147
|
+
reject(new Err.Details('Service.aqm.reqs.Timeout', {
|
|
148
|
+
key: keySuccess,
|
|
149
|
+
response: response
|
|
150
|
+
}));
|
|
151
|
+
}, c.timeout && c.timeout > 0 ? c.timeout : _constants.TIMEOUT_REQ);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
bindPrint(bind) {
|
|
156
|
+
let result = '';
|
|
157
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
158
|
+
for (const k in bind) {
|
|
159
|
+
if (Array.isArray(bind[k])) {
|
|
160
|
+
result += `${k}=[${bind[k].join(',')}],`;
|
|
161
|
+
} else if (typeof bind[k] === 'object' && bind[k] !== null) {
|
|
162
|
+
result += `${k}=(${this.bindPrint(bind[k])}),`;
|
|
163
|
+
} else {
|
|
164
|
+
result += `${k}=${bind[k]},`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return result ? result.slice(0, -1) : result;
|
|
168
|
+
}
|
|
169
|
+
bindCheck(bind, msg) {
|
|
170
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
171
|
+
for (const k in bind) {
|
|
172
|
+
if (Array.isArray(bind[k])) {
|
|
173
|
+
// Check if the message value matches any of the values in the array
|
|
174
|
+
if (!bind[k].includes(msg[k])) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
} else if (typeof bind[k] === 'object' && bind[k] !== null) {
|
|
178
|
+
if (typeof msg[k] === 'object' && msg[k] !== null) {
|
|
179
|
+
if (!this.bindCheck(bind[k], msg[k])) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
} else if (!msg[k] || msg[k] !== bind[k]) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// must be lambda
|
|
193
|
+
onMessage = msg => {
|
|
194
|
+
const event = JSON.parse(msg);
|
|
195
|
+
if (event.type === 'Welcome') {
|
|
196
|
+
_loggerProxy.default.info(`Welcome message from Notifs Websocket`, {
|
|
197
|
+
module: _constants2.AQM_REQS_FILE,
|
|
198
|
+
method: _constants.METHODS.ON_MESSAGE
|
|
199
|
+
});
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (event.keepalive === 'true') {
|
|
203
|
+
_loggerProxy.default.info(`Keepalive from web socket`, {
|
|
204
|
+
module: _constants2.AQM_REQS_FILE,
|
|
205
|
+
method: _constants.METHODS.ON_MESSAGE
|
|
206
|
+
});
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (event.type === 'AgentReloginFailed') {
|
|
210
|
+
_loggerProxy.default.info('Silently handling the agent relogin fail', {
|
|
211
|
+
module: _constants2.AQM_REQS_FILE,
|
|
212
|
+
method: _constants.METHODS.ON_MESSAGE
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
let isHandled = false;
|
|
216
|
+
const kReq = Object.keys(this.pendingRequests);
|
|
217
|
+
for (const thisReq of kReq) {
|
|
218
|
+
const req = this.pendingRequests[thisReq];
|
|
219
|
+
if (req.check(event)) {
|
|
220
|
+
req.handle(event);
|
|
221
|
+
isHandled = true;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// pendingNotifCancelrequest stores the secondary bind key, checks for the secondary bind key and handles the event
|
|
226
|
+
const kReqAlt = Object.keys(this.pendingNotifCancelrequest);
|
|
227
|
+
for (const thisReq of kReqAlt) {
|
|
228
|
+
const req = this.pendingNotifCancelrequest[thisReq];
|
|
229
|
+
if (req.check(event)) {
|
|
230
|
+
req.handle(event);
|
|
231
|
+
isHandled = true;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// TODO: add event emitter for unhandled events to replicate event.listen or .on
|
|
236
|
+
|
|
237
|
+
if (!isHandled) {
|
|
238
|
+
_loggerProxy.default.info(`event=missingEventHandler | [AqmReqs] missing routing message handler`, {
|
|
239
|
+
module: _constants2.AQM_REQS_FILE,
|
|
240
|
+
method: _constants.METHODS.ON_MESSAGE
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
exports.default = AqmReqs;
|
|
246
|
+
//# sourceMappingURL=aqm-reqs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Err","_interopRequireWildcard","require","_types","_loggerProxy","_interopRequireDefault","_constants","_constants2","_WebexRequest","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","AqmReqs","pendingRequests","pendingNotifCancelrequest","constructor","webSocketManager","webexRequest","WebexRequest","getInstance","on","onMessage","bind","req","c","p","cbRes","makeAPIRequest","reqEmpty","createPromise","Promise","resolve","reject","keySuccess","bindPrint","notifSuccess","keyFail","notifFail","keyCancel","notifCancel","k","timeout","Details","key","msg","isClear","clear","check","bindCheck","handle","alternateBind","alternateBindKey","LoggerProxy","log","JSON","stringify","module","AQM_REQS_FILE","method","METHODS","CREATE_PROMISE","eerr","errId","err","response","request","service","host","resource","url","data","HTTP_METHODS","POST","GET","body","then","res","catch","error","headers","Authorization","Message","window","setTimeout","TIMEOUT_REQ","result","Array","isArray","join","slice","includes","event","parse","type","info","ON_MESSAGE","keepalive","isHandled","kReq","keys","thisReq","kReqAlt","exports"],"sources":["aqm-reqs.ts"],"sourcesContent":["import {Msg} from './GlobalTypes';\nimport * as Err from './Err';\nimport {HTTP_METHODS, WebexRequestPayload} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport {CbRes, Conf, ConfEmpty, Pending, Req, Res, ResEmpty} from './types';\nimport {TIMEOUT_REQ, METHODS} from './constants';\nimport {AQM_REQS_FILE} from '../../constants';\nimport WebexRequest from './WebexRequest';\nimport {WebSocketManager} from './websocket/WebSocketManager';\n\nexport default class AqmReqs {\n private pendingRequests: Record<string, Pending> = {};\n private pendingNotifCancelrequest: Record<string, Pending> = {};\n private webexRequest: WebexRequest;\n private webSocketManager: WebSocketManager;\n\n constructor(webSocketManager: WebSocketManager) {\n this.webexRequest = WebexRequest.getInstance();\n this.webSocketManager = webSocketManager;\n this.webSocketManager.on('message', this.onMessage.bind(this));\n }\n\n req<TRes, TErr, TReq>(c: Conf<TRes, TErr, TReq>): Res<TRes, TReq> {\n return (p: TReq, cbRes?: CbRes<TRes>) => this.makeAPIRequest(c(p), cbRes);\n }\n\n reqEmpty<TRes, TErr>(c: ConfEmpty<TRes, TErr>): ResEmpty<TRes> {\n return (cbRes?: CbRes<TRes>) => this.makeAPIRequest(c(), cbRes);\n }\n\n private async makeAPIRequest<TRes, TErr>(c: Req<TRes, TErr>, cbRes?: CbRes<TRes>): Promise<TRes> {\n return this.createPromise(c, cbRes);\n }\n\n private createPromise<TRes, TErr>(c: Req<TRes, TErr>, cbRes?: CbRes<TRes>) {\n return new Promise<TRes>((resolve, reject) => {\n const keySuccess = this.bindPrint(c.notifSuccess.bind);\n const keyFail = c.notifFail ? this.bindPrint(c.notifFail.bind) : null;\n const keyCancel = c.notifCancel?.bind ? this.bindPrint(c.notifCancel.bind) : null;\n let k = '';\n if (this.pendingRequests[keySuccess]) {\n k = keySuccess;\n }\n if (keyFail && this.pendingRequests[keyFail]) {\n k += keyFail;\n }\n if (k && c.timeout !== 'disabled') {\n reject(\n new Err.Details('Service.aqm.reqs.Pending', {\n key: k,\n msg: 'The request has been already created, multiple requests are not allowed.',\n })\n );\n\n return;\n }\n\n let isClear = false;\n const clear = () => {\n delete this.pendingRequests[keySuccess];\n if (keyFail) {\n delete this.pendingRequests[keyFail];\n }\n if (keyCancel) {\n delete this.pendingNotifCancelrequest[keyCancel];\n }\n isClear = true;\n };\n\n this.pendingRequests[keySuccess] = {\n check: (msg: Msg) => this.bindCheck(c.notifSuccess.bind, msg),\n handle: (msg: Msg) => {\n clear();\n resolve(msg as any);\n },\n };\n if (keyCancel) {\n this.pendingRequests[keySuccess].alternateBind = keyCancel;\n this.pendingNotifCancelrequest[keyCancel] = {\n check: (msg: Msg) => this.bindCheck(c.notifCancel?.bind, msg),\n handle: (msg: Msg) => {\n const alternateBindKey = this.pendingNotifCancelrequest[keyCancel].alternateBind;\n if (alternateBindKey) {\n this.pendingRequests[alternateBindKey].handle(msg);\n }\n },\n alternateBind: keySuccess,\n };\n }\n\n if (keyFail) {\n this.pendingRequests[keyFail] = {\n check: (msg: Msg) => this.bindCheck(c.notifFail!.bind, msg),\n handle: (msg: Msg) => {\n clear();\n const notifFail = c.notifFail!;\n if ('errId' in notifFail) {\n LoggerProxy.log(`Routing request failed: ${JSON.stringify(msg)}`, {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n });\n const eerr = new Err.Details(notifFail.errId, msg as any);\n LoggerProxy.log(`Routing request failed: ${eerr}`, {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n });\n reject(eerr);\n } else {\n reject(notifFail.err(msg as any));\n }\n },\n };\n }\n let response: WebexRequestPayload | null = null;\n this.webexRequest\n .request({\n service: c.host ?? '',\n resource: c.url,\n // eslint-disable-next-line no-nested-ternary\n method: c.method ? c.method : c.data ? HTTP_METHODS.POST : HTTP_METHODS.GET,\n\n body: c.data,\n })\n .then((res: any) => {\n response = res;\n if (cbRes) {\n cbRes(res);\n }\n })\n .catch((error: WebexRequestPayload) => {\n clear();\n if (error?.headers) {\n error.headers.Authorization = '*';\n }\n if (error?.headers) {\n error.headers.Authorization = '*';\n }\n if (typeof c.err === 'function') {\n reject(c.err(error));\n } else if (typeof c.err === 'string') {\n reject(new Err.Message(c.err));\n } else {\n reject(new Err.Message('Service.aqm.reqs.GenericRequestError'));\n }\n });\n\n if (c.timeout !== 'disabled') {\n window.setTimeout(\n () => {\n if (isClear) {\n return;\n }\n clear();\n if (response?.headers) {\n response.headers.Authorization = '*';\n }\n LoggerProxy.error(`Routing request timeout${keySuccess}${response!}${c.url}`, {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n });\n reject(\n new Err.Details('Service.aqm.reqs.Timeout', {\n key: keySuccess,\n response: response!,\n })\n );\n },\n c.timeout && c.timeout > 0 ? c.timeout : TIMEOUT_REQ\n );\n }\n });\n }\n\n private bindPrint(bind: any) {\n let result = '';\n // eslint-disable-next-line no-restricted-syntax\n for (const k in bind) {\n if (Array.isArray(bind[k])) {\n result += `${k}=[${bind[k].join(',')}],`;\n } else if (typeof bind[k] === 'object' && bind[k] !== null) {\n result += `${k}=(${this.bindPrint(bind[k])}),`;\n } else {\n result += `${k}=${bind[k]},`;\n }\n }\n\n return result ? result.slice(0, -1) : result;\n }\n\n private bindCheck(bind: any, msg: any) {\n // eslint-disable-next-line no-restricted-syntax\n for (const k in bind) {\n if (Array.isArray(bind[k])) {\n // Check if the message value matches any of the values in the array\n if (!bind[k].includes(msg[k])) {\n return false;\n }\n } else if (typeof bind[k] === 'object' && bind[k] !== null) {\n if (typeof msg[k] === 'object' && msg[k] !== null) {\n if (!this.bindCheck(bind[k], msg[k])) {\n return false;\n }\n } else {\n return false;\n }\n } else if (!msg[k] || msg[k] !== bind[k]) {\n return false;\n }\n }\n\n return true;\n }\n\n // must be lambda\n private readonly onMessage = (msg: any) => {\n const event = JSON.parse(msg);\n if (event.type === 'Welcome') {\n LoggerProxy.info(`Welcome message from Notifs Websocket`, {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n\n return;\n }\n\n if (event.keepalive === 'true') {\n LoggerProxy.info(`Keepalive from web socket`, {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n\n return;\n }\n\n if (event.type === 'AgentReloginFailed') {\n LoggerProxy.info('Silently handling the agent relogin fail', {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n }\n\n let isHandled = false;\n\n const kReq = Object.keys(this.pendingRequests);\n for (const thisReq of kReq) {\n const req = this.pendingRequests[thisReq];\n if (req.check(event)) {\n req.handle(event);\n isHandled = true;\n break;\n }\n }\n // pendingNotifCancelrequest stores the secondary bind key, checks for the secondary bind key and handles the event\n const kReqAlt = Object.keys(this.pendingNotifCancelrequest);\n for (const thisReq of kReqAlt) {\n const req = this.pendingNotifCancelrequest[thisReq];\n if (req.check(event)) {\n req.handle(event);\n isHandled = true;\n }\n }\n\n // TODO: add event emitter for unhandled events to replicate event.listen or .on\n\n if (!isHandled) {\n LoggerProxy.info(`event=missingEventHandler | [AqmReqs] missing routing message handler`, {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n }\n };\n}\n"],"mappings":";;;;;;AACA,IAAAA,GAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,aAAA,GAAAH,sBAAA,CAAAH,OAAA;AAA0C,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAZ,wBAAAY,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAH,UAAA,SAAAG,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAF,OAAA,EAAAE,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAC,GAAA,CAAAJ,CAAA,UAAAG,CAAA,CAAAE,GAAA,CAAAL,CAAA,OAAAM,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAZ,CAAA,oBAAAY,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAY,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAX,CAAA,EAAAY,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAZ,CAAA,CAAAY,CAAA,YAAAN,CAAA,CAAAR,OAAA,GAAAE,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAc,GAAA,CAAAjB,CAAA,EAAAM,CAAA,GAAAA,CAAA;AAG3B,MAAMY,OAAO,CAAC;EACnBC,eAAe,GAA4B,CAAC,CAAC;EAC7CC,yBAAyB,GAA4B,CAAC,CAAC;EAI/DC,WAAWA,CAACC,gBAAkC,EAAE;IAC9C,IAAI,CAACC,YAAY,GAAGC,qBAAY,CAACC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAACH,gBAAgB,GAAGA,gBAAgB;IACxC,IAAI,CAACA,gBAAgB,CAACI,EAAE,CAAC,SAAS,EAAE,IAAI,CAACC,SAAS,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;EAChE;EAEAC,GAAGA,CAAmBC,CAAyB,EAAmB;IAChE,OAAO,CAACC,CAAO,EAAEC,KAAmB,KAAK,IAAI,CAACC,cAAc,CAACH,CAAC,CAACC,CAAC,CAAC,EAAEC,KAAK,CAAC;EAC3E;EAEAE,QAAQA,CAAaJ,CAAwB,EAAkB;IAC7D,OAAQE,KAAmB,IAAK,IAAI,CAACC,cAAc,CAACH,CAAC,CAAC,CAAC,EAAEE,KAAK,CAAC;EACjE;EAEA,MAAcC,cAAcA,CAAaH,CAAkB,EAAEE,KAAmB,EAAiB;IAC/F,OAAO,IAAI,CAACG,aAAa,CAACL,CAAC,EAAEE,KAAK,CAAC;EACrC;EAEQG,aAAaA,CAAaL,CAAkB,EAAEE,KAAmB,EAAE;IACzE,OAAO,IAAII,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;MAC5C,MAAMC,UAAU,GAAG,IAAI,CAACC,SAAS,CAACV,CAAC,CAACW,YAAY,CAACb,IAAI,CAAC;MACtD,MAAMc,OAAO,GAAGZ,CAAC,CAACa,SAAS,GAAG,IAAI,CAACH,SAAS,CAACV,CAAC,CAACa,SAAS,CAACf,IAAI,CAAC,GAAG,IAAI;MACrE,MAAMgB,SAAS,GAAGd,CAAC,CAACe,WAAW,EAAEjB,IAAI,GAAG,IAAI,CAACY,SAAS,CAACV,CAAC,CAACe,WAAW,CAACjB,IAAI,CAAC,GAAG,IAAI;MACjF,IAAIkB,CAAC,GAAG,EAAE;MACV,IAAI,IAAI,CAAC3B,eAAe,CAACoB,UAAU,CAAC,EAAE;QACpCO,CAAC,GAAGP,UAAU;MAChB;MACA,IAAIG,OAAO,IAAI,IAAI,CAACvB,eAAe,CAACuB,OAAO,CAAC,EAAE;QAC5CI,CAAC,IAAIJ,OAAO;MACd;MACA,IAAII,CAAC,IAAIhB,CAAC,CAACiB,OAAO,KAAK,UAAU,EAAE;QACjCT,MAAM,CACJ,IAAInD,GAAG,CAAC6D,OAAO,CAAC,0BAA0B,EAAE;UAC1CC,GAAG,EAAEH,CAAC;UACNI,GAAG,EAAE;QACP,CAAC,CACH,CAAC;QAED;MACF;MAEA,IAAIC,OAAO,GAAG,KAAK;MACnB,MAAMC,KAAK,GAAGA,CAAA,KAAM;QAClB,OAAO,IAAI,CAACjC,eAAe,CAACoB,UAAU,CAAC;QACvC,IAAIG,OAAO,EAAE;UACX,OAAO,IAAI,CAACvB,eAAe,CAACuB,OAAO,CAAC;QACtC;QACA,IAAIE,SAAS,EAAE;UACb,OAAO,IAAI,CAACxB,yBAAyB,CAACwB,SAAS,CAAC;QAClD;QACAO,OAAO,GAAG,IAAI;MAChB,CAAC;MAED,IAAI,CAAChC,eAAe,CAACoB,UAAU,CAAC,GAAG;QACjCc,KAAK,EAAGH,GAAQ,IAAK,IAAI,CAACI,SAAS,CAACxB,CAAC,CAACW,YAAY,CAACb,IAAI,EAAEsB,GAAG,CAAC;QAC7DK,MAAM,EAAGL,GAAQ,IAAK;UACpBE,KAAK,CAAC,CAAC;UACPf,OAAO,CAACa,GAAU,CAAC;QACrB;MACF,CAAC;MACD,IAAIN,SAAS,EAAE;QACb,IAAI,CAACzB,eAAe,CAACoB,UAAU,CAAC,CAACiB,aAAa,GAAGZ,SAAS;QAC1D,IAAI,CAACxB,yBAAyB,CAACwB,SAAS,CAAC,GAAG;UAC1CS,KAAK,EAAGH,GAAQ,IAAK,IAAI,CAACI,SAAS,CAACxB,CAAC,CAACe,WAAW,EAAEjB,IAAI,EAAEsB,GAAG,CAAC;UAC7DK,MAAM,EAAGL,GAAQ,IAAK;YACpB,MAAMO,gBAAgB,GAAG,IAAI,CAACrC,yBAAyB,CAACwB,SAAS,CAAC,CAACY,aAAa;YAChF,IAAIC,gBAAgB,EAAE;cACpB,IAAI,CAACtC,eAAe,CAACsC,gBAAgB,CAAC,CAACF,MAAM,CAACL,GAAG,CAAC;YACpD;UACF,CAAC;UACDM,aAAa,EAAEjB;QACjB,CAAC;MACH;MAEA,IAAIG,OAAO,EAAE;QACX,IAAI,CAACvB,eAAe,CAACuB,OAAO,CAAC,GAAG;UAC9BW,KAAK,EAAGH,GAAQ,IAAK,IAAI,CAACI,SAAS,CAACxB,CAAC,CAACa,SAAS,CAAEf,IAAI,EAAEsB,GAAG,CAAC;UAC3DK,MAAM,EAAGL,GAAQ,IAAK;YACpBE,KAAK,CAAC,CAAC;YACP,MAAMT,SAAS,GAAGb,CAAC,CAACa,SAAU;YAC9B,IAAI,OAAO,IAAIA,SAAS,EAAE;cACxBe,oBAAW,CAACC,GAAG,CAAE,2BAA0BC,IAAI,CAACC,SAAS,CAACX,GAAG,CAAE,EAAC,EAAE;gBAChEY,MAAM,EAAEC,yBAAa;gBACrBC,MAAM,EAAEC,kBAAO,CAACC;cAClB,CAAC,CAAC;cACF,MAAMC,IAAI,GAAG,IAAIhF,GAAG,CAAC6D,OAAO,CAACL,SAAS,CAACyB,KAAK,EAAElB,GAAU,CAAC;cACzDQ,oBAAW,CAACC,GAAG,CAAE,2BAA0BQ,IAAK,EAAC,EAAE;gBACjDL,MAAM,EAAEC,yBAAa;gBACrBC,MAAM,EAAEC,kBAAO,CAACC;cAClB,CAAC,CAAC;cACF5B,MAAM,CAAC6B,IAAI,CAAC;YACd,CAAC,MAAM;cACL7B,MAAM,CAACK,SAAS,CAAC0B,GAAG,CAACnB,GAAU,CAAC,CAAC;YACnC;UACF;QACF,CAAC;MACH;MACA,IAAIoB,QAAoC,GAAG,IAAI;MAC/C,IAAI,CAAC/C,YAAY,CACdgD,OAAO,CAAC;QACPC,OAAO,EAAE1C,CAAC,CAAC2C,IAAI,IAAI,EAAE;QACrBC,QAAQ,EAAE5C,CAAC,CAAC6C,GAAG;QACf;QACAX,MAAM,EAAElC,CAAC,CAACkC,MAAM,GAAGlC,CAAC,CAACkC,MAAM,GAAGlC,CAAC,CAAC8C,IAAI,GAAGC,mBAAY,CAACC,IAAI,GAAGD,mBAAY,CAACE,GAAG;QAE3EC,IAAI,EAAElD,CAAC,CAAC8C;MACV,CAAC,CAAC,CACDK,IAAI,CAAEC,GAAQ,IAAK;QAClBZ,QAAQ,GAAGY,GAAG;QACd,IAAIlD,KAAK,EAAE;UACTA,KAAK,CAACkD,GAAG,CAAC;QACZ;MACF,CAAC,CAAC,CACDC,KAAK,CAAEC,KAA0B,IAAK;QACrChC,KAAK,CAAC,CAAC;QACP,IAAIgC,KAAK,EAAEC,OAAO,EAAE;UAClBD,KAAK,CAACC,OAAO,CAACC,aAAa,GAAG,GAAG;QACnC;QACA,IAAIF,KAAK,EAAEC,OAAO,EAAE;UAClBD,KAAK,CAACC,OAAO,CAACC,aAAa,GAAG,GAAG;QACnC;QACA,IAAI,OAAOxD,CAAC,CAACuC,GAAG,KAAK,UAAU,EAAE;UAC/B/B,MAAM,CAACR,CAAC,CAACuC,GAAG,CAACe,KAAK,CAAC,CAAC;QACtB,CAAC,MAAM,IAAI,OAAOtD,CAAC,CAACuC,GAAG,KAAK,QAAQ,EAAE;UACpC/B,MAAM,CAAC,IAAInD,GAAG,CAACoG,OAAO,CAACzD,CAAC,CAACuC,GAAG,CAAC,CAAC;QAChC,CAAC,MAAM;UACL/B,MAAM,CAAC,IAAInD,GAAG,CAACoG,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACjE;MACF,CAAC,CAAC;MAEJ,IAAIzD,CAAC,CAACiB,OAAO,KAAK,UAAU,EAAE;QAC5ByC,MAAM,CAACC,UAAU,CACf,MAAM;UACJ,IAAItC,OAAO,EAAE;YACX;UACF;UACAC,KAAK,CAAC,CAAC;UACP,IAAIkB,QAAQ,EAAEe,OAAO,EAAE;YACrBf,QAAQ,CAACe,OAAO,CAACC,aAAa,GAAG,GAAG;UACtC;UACA5B,oBAAW,CAAC0B,KAAK,CAAE,0BAAyB7C,UAAW,GAAE+B,QAAU,GAAExC,CAAC,CAAC6C,GAAI,EAAC,EAAE;YAC5Eb,MAAM,EAAEC,yBAAa;YACrBC,MAAM,EAAEC,kBAAO,CAACC;UAClB,CAAC,CAAC;UACF5B,MAAM,CACJ,IAAInD,GAAG,CAAC6D,OAAO,CAAC,0BAA0B,EAAE;YAC1CC,GAAG,EAAEV,UAAU;YACf+B,QAAQ,EAAEA;UACZ,CAAC,CACH,CAAC;QACH,CAAC,EACDxC,CAAC,CAACiB,OAAO,IAAIjB,CAAC,CAACiB,OAAO,GAAG,CAAC,GAAGjB,CAAC,CAACiB,OAAO,GAAG2C,sBAC3C,CAAC;MACH;IACF,CAAC,CAAC;EACJ;EAEQlD,SAASA,CAACZ,IAAS,EAAE;IAC3B,IAAI+D,MAAM,GAAG,EAAE;IACf;IACA,KAAK,MAAM7C,CAAC,IAAIlB,IAAI,EAAE;MACpB,IAAIgE,KAAK,CAACC,OAAO,CAACjE,IAAI,CAACkB,CAAC,CAAC,CAAC,EAAE;QAC1B6C,MAAM,IAAK,GAAE7C,CAAE,KAAIlB,IAAI,CAACkB,CAAC,CAAC,CAACgD,IAAI,CAAC,GAAG,CAAE,IAAG;MAC1C,CAAC,MAAM,IAAI,OAAOlE,IAAI,CAACkB,CAAC,CAAC,KAAK,QAAQ,IAAIlB,IAAI,CAACkB,CAAC,CAAC,KAAK,IAAI,EAAE;QAC1D6C,MAAM,IAAK,GAAE7C,CAAE,KAAI,IAAI,CAACN,SAAS,CAACZ,IAAI,CAACkB,CAAC,CAAC,CAAE,IAAG;MAChD,CAAC,MAAM;QACL6C,MAAM,IAAK,GAAE7C,CAAE,IAAGlB,IAAI,CAACkB,CAAC,CAAE,GAAE;MAC9B;IACF;IAEA,OAAO6C,MAAM,GAAGA,MAAM,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGJ,MAAM;EAC9C;EAEQrC,SAASA,CAAC1B,IAAS,EAAEsB,GAAQ,EAAE;IACrC;IACA,KAAK,MAAMJ,CAAC,IAAIlB,IAAI,EAAE;MACpB,IAAIgE,KAAK,CAACC,OAAO,CAACjE,IAAI,CAACkB,CAAC,CAAC,CAAC,EAAE;QAC1B;QACA,IAAI,CAAClB,IAAI,CAACkB,CAAC,CAAC,CAACkD,QAAQ,CAAC9C,GAAG,CAACJ,CAAC,CAAC,CAAC,EAAE;UAC7B,OAAO,KAAK;QACd;MACF,CAAC,MAAM,IAAI,OAAOlB,IAAI,CAACkB,CAAC,CAAC,KAAK,QAAQ,IAAIlB,IAAI,CAACkB,CAAC,CAAC,KAAK,IAAI,EAAE;QAC1D,IAAI,OAAOI,GAAG,CAACJ,CAAC,CAAC,KAAK,QAAQ,IAAII,GAAG,CAACJ,CAAC,CAAC,KAAK,IAAI,EAAE;UACjD,IAAI,CAAC,IAAI,CAACQ,SAAS,CAAC1B,IAAI,CAACkB,CAAC,CAAC,EAAEI,GAAG,CAACJ,CAAC,CAAC,CAAC,EAAE;YACpC,OAAO,KAAK;UACd;QACF,CAAC,MAAM;UACL,OAAO,KAAK;QACd;MACF,CAAC,MAAM,IAAI,CAACI,GAAG,CAACJ,CAAC,CAAC,IAAII,GAAG,CAACJ,CAAC,CAAC,KAAKlB,IAAI,CAACkB,CAAC,CAAC,EAAE;QACxC,OAAO,KAAK;MACd;IACF;IAEA,OAAO,IAAI;EACb;;EAEA;EACiBnB,SAAS,GAAIuB,GAAQ,IAAK;IACzC,MAAM+C,KAAK,GAAGrC,IAAI,CAACsC,KAAK,CAAChD,GAAG,CAAC;IAC7B,IAAI+C,KAAK,CAACE,IAAI,KAAK,SAAS,EAAE;MAC5BzC,oBAAW,CAAC0C,IAAI,CAAE,uCAAsC,EAAE;QACxDtC,MAAM,EAAEC,yBAAa;QACrBC,MAAM,EAAEC,kBAAO,CAACoC;MAClB,CAAC,CAAC;MAEF;IACF;IAEA,IAAIJ,KAAK,CAACK,SAAS,KAAK,MAAM,EAAE;MAC9B5C,oBAAW,CAAC0C,IAAI,CAAE,2BAA0B,EAAE;QAC5CtC,MAAM,EAAEC,yBAAa;QACrBC,MAAM,EAAEC,kBAAO,CAACoC;MAClB,CAAC,CAAC;MAEF;IACF;IAEA,IAAIJ,KAAK,CAACE,IAAI,KAAK,oBAAoB,EAAE;MACvCzC,oBAAW,CAAC0C,IAAI,CAAC,0CAA0C,EAAE;QAC3DtC,MAAM,EAAEC,yBAAa;QACrBC,MAAM,EAAEC,kBAAO,CAACoC;MAClB,CAAC,CAAC;IACJ;IAEA,IAAIE,SAAS,GAAG,KAAK;IAErB,MAAMC,IAAI,GAAG/F,MAAM,CAACgG,IAAI,CAAC,IAAI,CAACtF,eAAe,CAAC;IAC9C,KAAK,MAAMuF,OAAO,IAAIF,IAAI,EAAE;MAC1B,MAAM3E,GAAG,GAAG,IAAI,CAACV,eAAe,CAACuF,OAAO,CAAC;MACzC,IAAI7E,GAAG,CAACwB,KAAK,CAAC4C,KAAK,CAAC,EAAE;QACpBpE,GAAG,CAAC0B,MAAM,CAAC0C,KAAK,CAAC;QACjBM,SAAS,GAAG,IAAI;QAChB;MACF;IACF;IACA;IACA,MAAMI,OAAO,GAAGlG,MAAM,CAACgG,IAAI,CAAC,IAAI,CAACrF,yBAAyB,CAAC;IAC3D,KAAK,MAAMsF,OAAO,IAAIC,OAAO,EAAE;MAC7B,MAAM9E,GAAG,GAAG,IAAI,CAACT,yBAAyB,CAACsF,OAAO,CAAC;MACnD,IAAI7E,GAAG,CAACwB,KAAK,CAAC4C,KAAK,CAAC,EAAE;QACpBpE,GAAG,CAAC0B,MAAM,CAAC0C,KAAK,CAAC;QACjBM,SAAS,GAAG,IAAI;MAClB;IACF;;IAEA;;IAEA,IAAI,CAACA,SAAS,EAAE;MACd7C,oBAAW,CAAC0C,IAAI,CAAE,uEAAsE,EAAE;QACxFtC,MAAM,EAAEC,yBAAa;QACrBC,MAAM,EAAEC,kBAAO,CAACoC;MAClB,CAAC,CAAC;IACJ;EACF,CAAC;AACH;AAACO,OAAA,CAAA9G,OAAA,GAAAoB,OAAA"}
|