@next-core/easyops-runtime 0.10.6 → 0.10.7
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/cjs/analytics/http.js +3 -4
- package/dist/cjs/analytics/http.js.map +1 -1
- package/dist/cjs/checkInstalledApps.js +1 -2
- package/dist/cjs/checkInstalledApps.js.map +1 -1
- package/dist/cjs/checkPermissions.js.map +1 -1
- package/dist/cjs/flowApi/CollectContracts.js.map +1 -1
- package/dist/cjs/flowApi/FlowApi.js +2 -2
- package/dist/cjs/flowApi/FlowApi.js.map +1 -1
- package/dist/cjs/flowApi/FlowApiProvider.js +5 -5
- package/dist/cjs/flowApi/FlowApiProvider.js.map +1 -1
- package/dist/cjs/menu/fetchMenuById.js.map +1 -1
- package/dist/cjs/menu/fetchMenuTitle.js +1 -1
- package/dist/cjs/menu/fetchMenuTitle.js.map +1 -1
- package/dist/cjs/menu/getMenusOfStandaloneApp.js +2 -2
- package/dist/cjs/menu/getMenusOfStandaloneApp.js.map +1 -1
- package/dist/cjs/menu/mergeMenu.js +1 -2
- package/dist/cjs/menu/mergeMenu.js.map +1 -1
- package/dist/cjs/menu/reorderMenuItems.js +1 -4
- package/dist/cjs/menu/reorderMenuItems.js.map +1 -1
- package/dist/cjs/websocket/MessageDispatcher.js.map +1 -1
- package/dist/cjs/websocket/MessageService.js.map +1 -1
- package/dist/esm/analytics/analytics.js +23 -18
- package/dist/esm/analytics/analytics.js.map +1 -1
- package/dist/esm/analytics/http.js +19 -20
- package/dist/esm/analytics/http.js.map +1 -1
- package/dist/esm/analytics/pageView.js +6 -6
- package/dist/esm/analytics/pageView.js.map +1 -1
- package/dist/esm/analytics/transport.js +12 -12
- package/dist/esm/analytics/transport.js.map +1 -1
- package/dist/esm/auth-v2.js +1 -1
- package/dist/esm/auth-v2.js.map +1 -1
- package/dist/esm/auth.js +5 -4
- package/dist/esm/auth.js.map +1 -1
- package/dist/esm/checkInstalledApps.js +19 -30
- package/dist/esm/checkInstalledApps.js.map +1 -1
- package/dist/esm/checkPermissions.js +35 -48
- package/dist/esm/checkPermissions.js.map +1 -1
- package/dist/esm/flowApi/CollectContracts.js +5 -5
- package/dist/esm/flowApi/CollectContracts.js.map +1 -1
- package/dist/esm/flowApi/FlowApi.js +68 -87
- package/dist/esm/flowApi/FlowApi.js.map +1 -1
- package/dist/esm/flowApi/FlowApiProvider.js +87 -87
- package/dist/esm/flowApi/FlowApiProvider.js.map +1 -1
- package/dist/esm/index.js +3 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/menu/computeMenuData.js +17 -24
- package/dist/esm/menu/computeMenuData.js.map +1 -1
- package/dist/esm/menu/constants.js +3 -3
- package/dist/esm/menu/constants.js.map +1 -1
- package/dist/esm/menu/fetchMenuById.js +61 -70
- package/dist/esm/menu/fetchMenuById.js.map +1 -1
- package/dist/esm/menu/fetchMenuTitle.js +27 -34
- package/dist/esm/menu/fetchMenuTitle.js.map +1 -1
- package/dist/esm/menu/getMenusOfStandaloneApp.js +11 -9
- package/dist/esm/menu/getMenusOfStandaloneApp.js.map +1 -1
- package/dist/esm/menu/loadDynamicMenuItems.js +17 -23
- package/dist/esm/menu/loadDynamicMenuItems.js.map +1 -1
- package/dist/esm/menu/mergeMenu.js +44 -54
- package/dist/esm/menu/mergeMenu.js.map +1 -1
- package/dist/esm/menu/reorderMenuItems.js +3 -6
- package/dist/esm/menu/reorderMenuItems.js.map +1 -1
- package/dist/esm/websocket/MessageDispatcher.js +19 -19
- package/dist/esm/websocket/MessageDispatcher.js.map +1 -1
- package/dist/esm/websocket/MessageService.js +9 -9
- package/dist/esm/websocket/MessageService.js.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageDispatcher.js","names":["_runtime","require","_lodash","_MessageService","_ms","WeakMap","_memoizedChannels","_channelPayloads","_MessageDispatcher_brand","WeakSet","MessageDispatcher","constructor","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","sub","Map","unsub","subscribe","channel","payload","stringifiedPayload","JSON","stringify","_assertClassBrand2","_subOrUnsub","call","unsubscribe","_classPrivateFieldGet3","get","msg","console","error","Promise","reject","Error","parse","result","delete","then","onMessage","listener","warned","_classPrivateGetter2","_get_ms","response","event","matchMessageChannel","message","onClose","reset","_classPrivateFieldGet2","clear","exports","_this","protocol","location","url","window","host","getBasePath","_classPrivateFieldSet2","MessageService","type","hit","request","promise","resolve","identity","getIdentity","isSuccess","isFailed","send","set","system","topic","responsePayload","includes","RegExp","replace","_m","p1","p2","escapeRegExp","test"],"sources":["../../../src/websocket/MessageDispatcher.ts"],"sourcesContent":["import { getBasePath } from \"@next-core/runtime\";\nimport { escapeRegExp } from \"lodash\";\nimport {\n MessageService,\n type MessageListener,\n CloseListener,\n} from \"./MessageService.js\";\n\ninterface MessageResponse {\n event:\n | \"TOPIC.SUB_SUCCESS\"\n | \"TOPIC.SUB_FAILED\"\n | \"TOPIC.UNSUB_SUCCESS\"\n | \"TOPIC.UNSUB_FAILED\"\n | \"MESSAGE.PUSH\";\n payload: MessagePayload;\n}\n\ninterface MessagePayload {\n source?: string;\n system: string;\n topic: string;\n message?: unknown;\n}\n\nexport class MessageDispatcher {\n #_ms: MessageService | undefined;\n #memoizedChannels = {\n sub: new Map<string, Promise<unknown>>(),\n unsub: new Map<string, Promise<unknown>>(),\n };\n #channelPayloads = new Map<string, string>();\n\n get #ms(): MessageService {\n if (!this.#_ms) {\n const protocol = location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const url = `${protocol}//${\n window.location.host\n }${getBasePath()}api/websocket_service/v1/ws`;\n this.#_ms = new MessageService(url);\n }\n return this.#_ms;\n }\n\n subscribe(channel: string, payload: MessagePayload): Promise<unknown> {\n const stringifiedPayload = JSON.stringify(payload);\n return this.#subOrUnsub(\"sub\", channel, payload, stringifiedPayload);\n }\n\n unsubscribe(channel: string): Promise<unknown> {\n const stringifiedPayload = this.#channelPayloads.get(channel);\n if (!stringifiedPayload) {\n const msg = `The message channel to unsubscribe \"${channel}\" is not found`;\n // eslint-disable-next-line no-console\n console.error(msg);\n return Promise.reject(new Error(msg));\n }\n\n const payload = JSON.parse(stringifiedPayload);\n const result = this.#subOrUnsub(\n \"unsub\",\n channel,\n payload,\n stringifiedPayload\n );\n\n this.#memoizedChannels.sub.delete(stringifiedPayload);\n\n result.then(() => {\n this.#channelPayloads.delete(channel);\n });\n\n return result;\n }\n\n onMessage(channel: string, listener: MessageListener): void {\n let stringifiedPayload = this.#channelPayloads.get(channel);\n let warned = false;\n\n this.#ms.onMessage<MessageResponse>((response) => {\n if (!stringifiedPayload) {\n stringifiedPayload = this.#channelPayloads.get(channel);\n }\n if (!stringifiedPayload) {\n if (!warned) {\n // eslint-disable-next-line no-console\n console.error(`Message channel: \"${channel}\" not found`);\n warned = true;\n }\n return;\n }\n if (\n response.event === \"MESSAGE.PUSH\" &&\n matchMessageChannel(stringifiedPayload, response.payload)\n ) {\n listener(response.payload.message);\n }\n });\n }\n\n onClose(listener: CloseListener): void {\n this.#ms.onClose(listener);\n }\n\n reset(): void {\n this.#memoizedChannels.sub.clear();\n this.#memoizedChannels.unsub.clear();\n this.#channelPayloads.clear();\n this.#_ms?.reset();\n }\n\n #subOrUnsub(\n type: \"sub\" | \"unsub\",\n channel: string,\n payload: MessagePayload,\n stringifiedPayload: string\n ): Promise<unknown> {\n const hit = this.#memoizedChannels[type].get(stringifiedPayload);\n if (hit) {\n return hit;\n }\n const request = {\n event: type === \"sub\" ? \"TOPIC.SUB\" : \"TOPIC.UNSUB\",\n payload,\n };\n const promise = new Promise((resolve, reject) => {\n const identity = getIdentity(payload);\n this.#ms.onMessage<MessageResponse>((response) => {\n const isSuccess =\n response.event ===\n (type === \"sub\" ? \"TOPIC.SUB_SUCCESS\" : \"TOPIC.UNSUB_SUCCESS\");\n const isFailed =\n response.event ===\n (type === \"sub\" ? \"TOPIC.SUB_FAILED\" : \"TOPIC.UNSUB_FAILED\");\n if (\n (isSuccess || isFailed) &&\n // Put this after event type checks, to prevent unnecessary\n // JSON stringify.\n identity === getIdentity(response.payload)\n ) {\n (isSuccess ? resolve : reject)(response);\n }\n });\n this.#ms.send(request);\n });\n\n if (type === \"sub\") {\n this.#channelPayloads.set(channel, stringifiedPayload);\n }\n this.#memoizedChannels[type].set(stringifiedPayload, promise);\n return promise;\n }\n}\n\nfunction getIdentity(payload: MessagePayload) {\n const { system, topic } = payload;\n return JSON.stringify({ system, topic });\n}\n\nfunction matchMessageChannel(\n stringifiedPayload: string,\n responsePayload: MessagePayload\n): boolean {\n const payload = JSON.parse(stringifiedPayload) as MessagePayload;\n return (\n payload.system === responsePayload.system &&\n // Exact match\n (payload.topic === responsePayload.topic ||\n // Wildcards match\n // For `ab.cd.*`:\n // - Matches `ab.cd.r` or `ab.cd.x.yz`\n // - DOES NOT match `ab.cd.x/yz` or `ab.x.cd` or `x.ab.cd.yz`\n (typeof payload.topic === \"string\" &&\n payload.topic.includes(\"*\") &&\n new RegExp(\n `^${payload.topic.replace(\n /([^*]*)\\*([^*]*)/g,\n (_m, p1, p2) => `${escapeRegExp(p1)}[^/]*${escapeRegExp(p2)}`\n )}$`\n ).test(responsePayload.topic)))\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MessageDispatcher.js","names":["_runtime","require","_lodash","_MessageService","_ms","WeakMap","_memoizedChannels","_channelPayloads","_MessageDispatcher_brand","WeakSet","MessageDispatcher","constructor","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","sub","Map","unsub","subscribe","channel","payload","stringifiedPayload","JSON","stringify","_assertClassBrand2","_subOrUnsub","call","unsubscribe","_classPrivateFieldGet3","get","msg","console","error","Promise","reject","Error","parse","result","delete","then","onMessage","listener","warned","_classPrivateGetter2","_get_ms","response","event","matchMessageChannel","message","onClose","reset","_classPrivateFieldGet2","clear","exports","_this","protocol","location","url","window","host","getBasePath","_classPrivateFieldSet2","MessageService","type","hit","request","promise","resolve","identity","getIdentity","isSuccess","isFailed","send","set","system","topic","responsePayload","includes","RegExp","replace","_m","p1","p2","escapeRegExp","test"],"sources":["../../../src/websocket/MessageDispatcher.ts"],"sourcesContent":["import { getBasePath } from \"@next-core/runtime\";\nimport { escapeRegExp } from \"lodash\";\nimport {\n MessageService,\n type MessageListener,\n CloseListener,\n} from \"./MessageService.js\";\n\ninterface MessageResponse {\n event:\n | \"TOPIC.SUB_SUCCESS\"\n | \"TOPIC.SUB_FAILED\"\n | \"TOPIC.UNSUB_SUCCESS\"\n | \"TOPIC.UNSUB_FAILED\"\n | \"MESSAGE.PUSH\";\n payload: MessagePayload;\n}\n\ninterface MessagePayload {\n source?: string;\n system: string;\n topic: string;\n message?: unknown;\n}\n\nexport class MessageDispatcher {\n #_ms: MessageService | undefined;\n #memoizedChannels = {\n sub: new Map<string, Promise<unknown>>(),\n unsub: new Map<string, Promise<unknown>>(),\n };\n #channelPayloads = new Map<string, string>();\n\n get #ms(): MessageService {\n if (!this.#_ms) {\n const protocol = location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const url = `${protocol}//${\n window.location.host\n }${getBasePath()}api/websocket_service/v1/ws`;\n this.#_ms = new MessageService(url);\n }\n return this.#_ms;\n }\n\n subscribe(channel: string, payload: MessagePayload): Promise<unknown> {\n const stringifiedPayload = JSON.stringify(payload);\n return this.#subOrUnsub(\"sub\", channel, payload, stringifiedPayload);\n }\n\n unsubscribe(channel: string): Promise<unknown> {\n const stringifiedPayload = this.#channelPayloads.get(channel);\n if (!stringifiedPayload) {\n const msg = `The message channel to unsubscribe \"${channel}\" is not found`;\n // eslint-disable-next-line no-console\n console.error(msg);\n return Promise.reject(new Error(msg));\n }\n\n const payload = JSON.parse(stringifiedPayload);\n const result = this.#subOrUnsub(\n \"unsub\",\n channel,\n payload,\n stringifiedPayload\n );\n\n this.#memoizedChannels.sub.delete(stringifiedPayload);\n\n result.then(() => {\n this.#channelPayloads.delete(channel);\n });\n\n return result;\n }\n\n onMessage(channel: string, listener: MessageListener): void {\n let stringifiedPayload = this.#channelPayloads.get(channel);\n let warned = false;\n\n this.#ms.onMessage<MessageResponse>((response) => {\n if (!stringifiedPayload) {\n stringifiedPayload = this.#channelPayloads.get(channel);\n }\n if (!stringifiedPayload) {\n if (!warned) {\n // eslint-disable-next-line no-console\n console.error(`Message channel: \"${channel}\" not found`);\n warned = true;\n }\n return;\n }\n if (\n response.event === \"MESSAGE.PUSH\" &&\n matchMessageChannel(stringifiedPayload, response.payload)\n ) {\n listener(response.payload.message);\n }\n });\n }\n\n onClose(listener: CloseListener): void {\n this.#ms.onClose(listener);\n }\n\n reset(): void {\n this.#memoizedChannels.sub.clear();\n this.#memoizedChannels.unsub.clear();\n this.#channelPayloads.clear();\n this.#_ms?.reset();\n }\n\n #subOrUnsub(\n type: \"sub\" | \"unsub\",\n channel: string,\n payload: MessagePayload,\n stringifiedPayload: string\n ): Promise<unknown> {\n const hit = this.#memoizedChannels[type].get(stringifiedPayload);\n if (hit) {\n return hit;\n }\n const request = {\n event: type === \"sub\" ? \"TOPIC.SUB\" : \"TOPIC.UNSUB\",\n payload,\n };\n const promise = new Promise((resolve, reject) => {\n const identity = getIdentity(payload);\n this.#ms.onMessage<MessageResponse>((response) => {\n const isSuccess =\n response.event ===\n (type === \"sub\" ? \"TOPIC.SUB_SUCCESS\" : \"TOPIC.UNSUB_SUCCESS\");\n const isFailed =\n response.event ===\n (type === \"sub\" ? \"TOPIC.SUB_FAILED\" : \"TOPIC.UNSUB_FAILED\");\n if (\n (isSuccess || isFailed) &&\n // Put this after event type checks, to prevent unnecessary\n // JSON stringify.\n identity === getIdentity(response.payload)\n ) {\n (isSuccess ? resolve : reject)(response);\n }\n });\n this.#ms.send(request);\n });\n\n if (type === \"sub\") {\n this.#channelPayloads.set(channel, stringifiedPayload);\n }\n this.#memoizedChannels[type].set(stringifiedPayload, promise);\n return promise;\n }\n}\n\nfunction getIdentity(payload: MessagePayload) {\n const { system, topic } = payload;\n return JSON.stringify({ system, topic });\n}\n\nfunction matchMessageChannel(\n stringifiedPayload: string,\n responsePayload: MessagePayload\n): boolean {\n const payload = JSON.parse(stringifiedPayload) as MessagePayload;\n return (\n payload.system === responsePayload.system &&\n // Exact match\n (payload.topic === responsePayload.topic ||\n // Wildcards match\n // For `ab.cd.*`:\n // - Matches `ab.cd.r` or `ab.cd.x.yz`\n // - DOES NOT match `ab.cd.x/yz` or `ab.x.cd` or `x.ab.cd.yz`\n (typeof payload.topic === \"string\" &&\n payload.topic.includes(\"*\") &&\n new RegExp(\n `^${payload.topic.replace(\n /([^*]*)\\*([^*]*)/g,\n (_m, p1, p2) => `${escapeRegExp(p1)}[^/]*${escapeRegExp(p2)}`\n )}$`\n ).test(responsePayload.topic)))\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageService.js","names":["RETRY_TIMEOUT_UNIT","RETRY_LIMIT","_url","WeakMap","_ws","_queuedMessages","_messageListeners","_closeListeners","_retryCount","_closed","_MessageService_brand","WeakSet","MessageService","constructor","url","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","Set","_classPrivateFieldSet2","send","data","_classPrivateFieldGet3","_assertClassBrand2","_connect","call","stringifiedData","JSON","stringify","readyState","WebSocket","OPEN","push","onMessage","listener","add","onClose","reset","length","clear","close","_classPrivateFieldGet2","exports","console","log","ws","addEventListener","e","msg","code","_reconnect","error","response","parse","delay","Math","pow","setTimeout","_this$retryCount","_this$retryCount2"],"sources":["../../../src/websocket/MessageService.ts"],"sourcesContent":["export type MessageListener<T = unknown> = (response: T) => void;\nexport type CloseListener = () => void;\n\nconst RETRY_TIMEOUT_UNIT = 1000;\nconst RETRY_LIMIT = 6;\n\nexport class MessageService {\n #url: string;\n #ws: WebSocket | undefined;\n #queuedMessages: string[] = [];\n #messageListeners = new Set<MessageListener>();\n #closeListeners = new Set<CloseListener>();\n #retryCount = 0;\n #closed = false;\n\n constructor(url: string) {\n this.#url = url;\n }\n\n #connect(): WebSocket {\n // eslint-disable-next-line no-console\n console.log(\"WebSocket connecting ...\");\n const ws = new WebSocket(this.#url);\n ws.addEventListener(\"open\", (e) => {\n // eslint-disable-next-line no-console\n console.log(\"WebSocket open:\", e);\n this.#retryCount = 0;\n for (const msg of this.#queuedMessages) {\n ws.send(msg);\n }\n this.#queuedMessages.length = 0;\n });\n ws.addEventListener(\"close\", (e) => {\n if (this.#closed) {\n return;\n }\n // eslint-disable-next-line no-console\n console.log(\"WebSocket close:\", e);\n for (const listener of this.#closeListeners) {\n listener();\n }\n // Error code 1000 means that the connection was closed normally.\n if (e.code !== 1000) {\n this.#reconnect();\n }\n });\n ws.addEventListener(\"error\", (e) => {\n // No need to reconnect in error event listener,\n // there will always be a close event along with the error event.\n // eslint-disable-next-line no-console\n console.error(\"WebSocket error:\", e);\n });\n ws.addEventListener(\"message\", (e: MessageEvent<string>) => {\n const response = JSON.parse(e.data);\n for (const listener of this.#messageListeners) {\n listener(response);\n }\n });\n return ws;\n }\n\n #reconnect() {\n // istanbul ignore next: currently can't mock this\n if (this.#retryCount >= RETRY_LIMIT) {\n // eslint-disable-next-line no-console\n console.error(\"WebSocket connect retry limit exceeded\");\n return;\n }\n // Double the timeout for each retry\n const delay = Math.pow(2, this.#retryCount) * RETRY_TIMEOUT_UNIT;\n // eslint-disable-next-line no-console\n console.log(\"WebSocket will reconnect after %d seconds\", delay / 1000);\n setTimeout(() => {\n this.#retryCount++;\n this.#ws = this.#connect();\n }, delay);\n }\n\n send(data: unknown): void {\n // Connect when data is sent for the first time\n if (!this.#ws) {\n this.#ws = this.#connect();\n }\n const stringifiedData = JSON.stringify(data);\n if (this.#ws.readyState === WebSocket.OPEN) {\n this.#ws.send(stringifiedData);\n } else {\n this.#queuedMessages.push(stringifiedData);\n }\n }\n\n onMessage<T = unknown>(listener: MessageListener<T>) {\n this.#messageListeners.add(listener as MessageListener<unknown>);\n }\n\n onClose(listener: CloseListener) {\n this.#closeListeners.add(listener);\n }\n\n reset() {\n this.#queuedMessages.length = 0;\n this.#messageListeners.clear();\n this.#closeListeners.clear();\n }\n\n close() {\n this.#closed = true;\n if (this.#ws?.readyState === WebSocket.OPEN) {\n this.#ws.close();\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;AAGA,MAAMA,kBAAkB,GAAG,IAAI;AAC/B,MAAMC,WAAW,GAAG,CAAC;AAAC,IAAAC,IAAA,oBAAAC,OAAA;AAAA,IAAAC,GAAA,oBAAAD,OAAA;AAAA,IAAAE,eAAA,oBAAAF,OAAA;AAAA,IAAAG,iBAAA,oBAAAH,OAAA;AAAA,IAAAI,eAAA,oBAAAJ,OAAA;AAAA,IAAAK,WAAA,oBAAAL,OAAA;AAAA,IAAAM,OAAA,oBAAAN,OAAA;AAAA,IAAAO,qBAAA,oBAAAC,OAAA;AAEf,MAAMC,cAAc,CAAC;EAS1BC,WAAWA,CAACC,GAAW,EAAE;IAAA,IAAAC,4BAAA,CAAAC,OAAA,QAAAN,qBAAA;
|
|
1
|
+
{"version":3,"file":"MessageService.js","names":["RETRY_TIMEOUT_UNIT","RETRY_LIMIT","_url","WeakMap","_ws","_queuedMessages","_messageListeners","_closeListeners","_retryCount","_closed","_MessageService_brand","WeakSet","MessageService","constructor","url","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","Set","_classPrivateFieldSet2","send","data","_classPrivateFieldGet3","_assertClassBrand2","_connect","call","stringifiedData","JSON","stringify","readyState","WebSocket","OPEN","push","onMessage","listener","add","onClose","reset","length","clear","close","_classPrivateFieldGet2","exports","console","log","ws","addEventListener","e","msg","code","_reconnect","error","response","parse","delay","Math","pow","setTimeout","_this$retryCount","_this$retryCount2"],"sources":["../../../src/websocket/MessageService.ts"],"sourcesContent":["export type MessageListener<T = unknown> = (response: T) => void;\nexport type CloseListener = () => void;\n\nconst RETRY_TIMEOUT_UNIT = 1000;\nconst RETRY_LIMIT = 6;\n\nexport class MessageService {\n #url: string;\n #ws: WebSocket | undefined;\n #queuedMessages: string[] = [];\n #messageListeners = new Set<MessageListener>();\n #closeListeners = new Set<CloseListener>();\n #retryCount = 0;\n #closed = false;\n\n constructor(url: string) {\n this.#url = url;\n }\n\n #connect(): WebSocket {\n // eslint-disable-next-line no-console\n console.log(\"WebSocket connecting ...\");\n const ws = new WebSocket(this.#url);\n ws.addEventListener(\"open\", (e) => {\n // eslint-disable-next-line no-console\n console.log(\"WebSocket open:\", e);\n this.#retryCount = 0;\n for (const msg of this.#queuedMessages) {\n ws.send(msg);\n }\n this.#queuedMessages.length = 0;\n });\n ws.addEventListener(\"close\", (e) => {\n if (this.#closed) {\n return;\n }\n // eslint-disable-next-line no-console\n console.log(\"WebSocket close:\", e);\n for (const listener of this.#closeListeners) {\n listener();\n }\n // Error code 1000 means that the connection was closed normally.\n if (e.code !== 1000) {\n this.#reconnect();\n }\n });\n ws.addEventListener(\"error\", (e) => {\n // No need to reconnect in error event listener,\n // there will always be a close event along with the error event.\n // eslint-disable-next-line no-console\n console.error(\"WebSocket error:\", e);\n });\n ws.addEventListener(\"message\", (e: MessageEvent<string>) => {\n const response = JSON.parse(e.data);\n for (const listener of this.#messageListeners) {\n listener(response);\n }\n });\n return ws;\n }\n\n #reconnect() {\n // istanbul ignore next: currently can't mock this\n if (this.#retryCount >= RETRY_LIMIT) {\n // eslint-disable-next-line no-console\n console.error(\"WebSocket connect retry limit exceeded\");\n return;\n }\n // Double the timeout for each retry\n const delay = Math.pow(2, this.#retryCount) * RETRY_TIMEOUT_UNIT;\n // eslint-disable-next-line no-console\n console.log(\"WebSocket will reconnect after %d seconds\", delay / 1000);\n setTimeout(() => {\n this.#retryCount++;\n this.#ws = this.#connect();\n }, delay);\n }\n\n send(data: unknown): void {\n // Connect when data is sent for the first time\n if (!this.#ws) {\n this.#ws = this.#connect();\n }\n const stringifiedData = JSON.stringify(data);\n if (this.#ws.readyState === WebSocket.OPEN) {\n this.#ws.send(stringifiedData);\n } else {\n this.#queuedMessages.push(stringifiedData);\n }\n }\n\n onMessage<T = unknown>(listener: MessageListener<T>) {\n this.#messageListeners.add(listener as MessageListener<unknown>);\n }\n\n onClose(listener: CloseListener) {\n this.#closeListeners.add(listener);\n }\n\n reset() {\n this.#queuedMessages.length = 0;\n this.#messageListeners.clear();\n this.#closeListeners.clear();\n }\n\n close() {\n this.#closed = true;\n if (this.#ws?.readyState === WebSocket.OPEN) {\n this.#ws.close();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
1
|
import { createTransport, events } from "./transport.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
let initialized = false;
|
|
3
|
+
let transport;
|
|
4
|
+
let pageState = null;
|
|
5
|
+
let isFirstPageView = true;
|
|
6
|
+
const stashedApiMetrics = [];
|
|
8
7
|
export function initialize(api) {
|
|
9
|
-
|
|
8
|
+
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
10
9
|
if (initialized) {
|
|
11
10
|
return;
|
|
12
11
|
}
|
|
@@ -21,8 +20,8 @@ export function createPageView() {
|
|
|
21
20
|
pageState = null;
|
|
22
21
|
}
|
|
23
22
|
export function finishPageView(metric) {
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
const pageId = generateUUID();
|
|
24
|
+
const {
|
|
26
25
|
lt,
|
|
27
26
|
route
|
|
28
27
|
} = metric;
|
|
@@ -31,14 +30,18 @@ export function finishPageView(metric) {
|
|
|
31
30
|
route,
|
|
32
31
|
pageId
|
|
33
32
|
};
|
|
34
|
-
events.push(
|
|
33
|
+
events.push({
|
|
34
|
+
...metric,
|
|
35
35
|
pageId,
|
|
36
36
|
apiCount: stashedApiMetrics.length,
|
|
37
37
|
maxApiTimeCost: Math.max(0, ...stashedApiMetrics.map(api => api.duration)),
|
|
38
38
|
size: stashedApiMetrics.map(api => api.size).filter(size => size > 0).reduce((prev, current) => prev + current, 0)
|
|
39
|
-
})
|
|
40
|
-
for (
|
|
41
|
-
events.push(
|
|
39
|
+
});
|
|
40
|
+
for (const item of stashedApiMetrics) {
|
|
41
|
+
events.push({
|
|
42
|
+
...item,
|
|
43
|
+
...pageState
|
|
44
|
+
});
|
|
42
45
|
}
|
|
43
46
|
stashedApiMetrics.length = 0;
|
|
44
47
|
transport.emit();
|
|
@@ -49,9 +52,11 @@ export function earlyFinishPageView() {
|
|
|
49
52
|
}
|
|
50
53
|
export function pushApiMetric(metric) {
|
|
51
54
|
if (pageState) {
|
|
52
|
-
events.push(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
events.push({
|
|
56
|
+
...metric,
|
|
57
|
+
type: "apiRequest",
|
|
58
|
+
...pageState
|
|
59
|
+
});
|
|
55
60
|
} else {
|
|
56
61
|
stashedApiMetrics.push(metric);
|
|
57
62
|
}
|
|
@@ -59,8 +64,8 @@ export function pushApiMetric(metric) {
|
|
|
59
64
|
|
|
60
65
|
// Ref https://medium.com/teads-engineering/generating-uuids-at-scale-on-the-web-2877f529d2a2
|
|
61
66
|
function generateUUID() {
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
const url = URL.createObjectURL(new Blob([]));
|
|
68
|
+
let uuid = url.substring(url.lastIndexOf("/") + 1);
|
|
64
69
|
URL.revokeObjectURL(url);
|
|
65
70
|
// 第一次渲染加上特殊标记
|
|
66
71
|
if (isFirstPageView) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","names":["createTransport","events","initialized","transport","pageState","isFirstPageView","stashedApiMetrics","initialize","api","options","arguments","length","undefined","sendOnExit","createPageView","finishPageView","metric","pageId","generateUUID","lt","route","push","
|
|
1
|
+
{"version":3,"file":"analytics.js","names":["createTransport","events","initialized","transport","pageState","isFirstPageView","stashedApiMetrics","initialize","api","options","arguments","length","undefined","sendOnExit","createPageView","finishPageView","metric","pageId","generateUUID","lt","route","push","apiCount","maxApiTimeCost","Math","max","map","duration","size","filter","reduce","prev","current","item","emit","earlyFinishPageView","pushApiMetric","type","url","URL","createObjectURL","Blob","uuid","substring","lastIndexOf","revokeObjectURL"],"sources":["../../../src/analytics/analytics.ts"],"sourcesContent":["import type {\n ApiMetric,\n ApiPageState,\n PartialPageViewMetric,\n} from \"./interfaces.js\";\nimport { createTransport, events, TransportOptions } from \"./transport.js\";\n\nlet initialized = false;\nlet transport: ReturnType<typeof createTransport>;\nlet pageState: ApiPageState | null = null;\nlet isFirstPageView = true;\nconst stashedApiMetrics: ApiMetric[] = [];\n\ntype Options = Partial<TransportOptions>;\n\nexport function initialize(api: string, options: Options = {}) {\n if (initialized) {\n return;\n }\n initialized = true;\n if (!transport) {\n transport = createTransport(api, options);\n transport.sendOnExit();\n }\n}\n\nexport function createPageView() {\n stashedApiMetrics.length = 0;\n pageState = null;\n}\n\nexport function finishPageView(metric: PartialPageViewMetric) {\n const pageId = generateUUID();\n const { lt, route } = metric;\n pageState = { lt, route, pageId };\n\n events.push({\n ...metric,\n pageId,\n apiCount: stashedApiMetrics.length,\n maxApiTimeCost: Math.max(\n 0,\n ...stashedApiMetrics.map((api) => api.duration)\n ),\n size: stashedApiMetrics\n .map((api) => api.size)\n .filter((size) => size > 0)\n .reduce((prev, current) => prev + current, 0),\n });\n\n for (const item of stashedApiMetrics) {\n events.push({\n ...item,\n ...pageState,\n });\n }\n stashedApiMetrics.length = 0;\n\n transport.emit();\n}\n\nexport function earlyFinishPageView() {\n events.push(...stashedApiMetrics);\n stashedApiMetrics.length = 0;\n}\n\nexport function pushApiMetric(metric: ApiMetric) {\n if (pageState) {\n events.push({\n ...metric,\n type: \"apiRequest\",\n ...pageState,\n });\n } else {\n stashedApiMetrics.push(metric);\n }\n}\n\n// Ref https://medium.com/teads-engineering/generating-uuids-at-scale-on-the-web-2877f529d2a2\nfunction generateUUID() {\n const url = URL.createObjectURL(new Blob([]));\n let uuid = url.substring(url.lastIndexOf(\"/\") + 1);\n URL.revokeObjectURL(url);\n // 第一次渲染加上特殊标记\n if (isFirstPageView) {\n uuid = \"88-\" + uuid;\n isFirstPageView = false;\n }\n return uuid;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,10 +2,10 @@ import { HttpResponseError, HttpParseError, HttpAbortError } from "@next-core/ht
|
|
|
2
2
|
import { isObject } from "@next-core/utils/general";
|
|
3
3
|
import { getAuth } from "../auth.js";
|
|
4
4
|
import { pushApiMetric } from "./analytics.js";
|
|
5
|
-
|
|
5
|
+
const symbolHttpAnalytics = Symbol("HttpAnalytics");
|
|
6
6
|
export function onRequest(config) {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const perfStartTime = Math.round(performance.now());
|
|
8
|
+
const st = Date.now();
|
|
9
9
|
config[symbolHttpAnalytics] = {
|
|
10
10
|
st,
|
|
11
11
|
time: Math.round(st / 1000),
|
|
@@ -20,33 +20,32 @@ export function onResponseError(error, config) {
|
|
|
20
20
|
return onResponseOrError(true, error, config);
|
|
21
21
|
}
|
|
22
22
|
function onResponseOrError(hasError, responseOrError, config) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
const perfEndTime = Math.round(performance.now());
|
|
24
|
+
const et = Date.now();
|
|
25
|
+
const {
|
|
26
26
|
[symbolHttpAnalytics]: meta,
|
|
27
27
|
url
|
|
28
28
|
} = config;
|
|
29
29
|
if (meta && !(hasError && responseOrError instanceof HttpAbortError)) {
|
|
30
|
-
var _code, _message, _traceId;
|
|
31
30
|
delete config[symbolHttpAnalytics];
|
|
32
|
-
|
|
31
|
+
const {
|
|
33
32
|
st,
|
|
34
33
|
time,
|
|
35
34
|
perfStartTime
|
|
36
35
|
} = meta;
|
|
37
|
-
|
|
36
|
+
const {
|
|
38
37
|
userInstanceId: uid,
|
|
39
38
|
username
|
|
40
39
|
} = getAuth();
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
let code;
|
|
41
|
+
let message;
|
|
42
|
+
let traceId;
|
|
43
|
+
let size;
|
|
44
|
+
let status;
|
|
45
|
+
let headers;
|
|
46
|
+
let data;
|
|
48
47
|
if (hasError) {
|
|
49
|
-
|
|
48
|
+
const isHttpResponseError = responseOrError instanceof HttpResponseError;
|
|
50
49
|
if (isHttpResponseError || responseOrError instanceof HttpParseError) {
|
|
51
50
|
({
|
|
52
51
|
status,
|
|
@@ -84,10 +83,10 @@ function onResponseOrError(hasError, responseOrError, config) {
|
|
|
84
83
|
duration: perfEndTime - perfStartTime,
|
|
85
84
|
api: url,
|
|
86
85
|
type: "api",
|
|
87
|
-
code:
|
|
88
|
-
msg:
|
|
86
|
+
code: code ?? -1,
|
|
87
|
+
msg: message ?? "",
|
|
89
88
|
status,
|
|
90
|
-
traceId:
|
|
89
|
+
traceId: traceId ?? "",
|
|
91
90
|
size: size ? Number(size) : -1
|
|
92
91
|
});
|
|
93
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","names":["HttpResponseError","HttpParseError","HttpAbortError","isObject","getAuth","pushApiMetric","symbolHttpAnalytics","Symbol","onRequest","config","perfStartTime","Math","round","performance","now","st","Date","time","onResponse","response","onResponseOrError","onResponseError","error","hasError","responseOrError","perfEndTime","et","meta","url","
|
|
1
|
+
{"version":3,"file":"http.js","names":["HttpResponseError","HttpParseError","HttpAbortError","isObject","getAuth","pushApiMetric","symbolHttpAnalytics","Symbol","onRequest","config","perfStartTime","Math","round","performance","now","st","Date","time","onResponse","response","onResponseOrError","onResponseError","error","hasError","responseOrError","perfEndTime","et","meta","url","userInstanceId","uid","username","code","message","traceId","size","status","headers","data","isHttpResponseError","responseJson","Headers","get","_ver","page","location","href","duration","api","type","msg","Number","Promise","reject"],"sources":["../../../src/analytics/http.ts"],"sourcesContent":["import {\n HttpResponseError,\n HttpParseError,\n HttpAbortError,\n type HttpError,\n type HttpRequestConfig,\n type HttpResponse,\n} from \"@next-core/http\";\nimport { isObject } from \"@next-core/utils/general\";\nimport { getAuth } from \"../auth.js\";\nimport type { HttpAnalyticsMeta } from \"./interfaces.js\";\nimport { pushApiMetric } from \"./analytics.js\";\n\nconst symbolHttpAnalytics = Symbol(\"HttpAnalytics\");\n\ninterface HttpRequestConfigWithAnalyticsMeta extends HttpRequestConfig {\n [symbolHttpAnalytics]?: HttpAnalyticsMeta;\n}\n\nexport function onRequest(\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpRequestConfig {\n const perfStartTime = Math.round(performance.now());\n const st = Date.now();\n config[symbolHttpAnalytics] = {\n st,\n time: Math.round(st / 1000),\n perfStartTime,\n };\n return config;\n}\n\nexport function onResponse(\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse {\n return onResponseOrError(false, response, config);\n}\n\nexport function onResponseError(\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError> {\n return onResponseOrError(true, error, config);\n}\n\nfunction onResponseOrError(\n hasError: false,\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse;\nfunction onResponseOrError(\n hasError: true,\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError>;\nfunction onResponseOrError(\n hasError: boolean,\n responseOrError: HttpResponse | HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse | Promise<HttpError> {\n const perfEndTime = Math.round(performance.now());\n const et = Date.now();\n const { [symbolHttpAnalytics]: meta, url } = config;\n if (meta && !(hasError && responseOrError instanceof HttpAbortError)) {\n delete config[symbolHttpAnalytics];\n const { st, time, perfStartTime } = meta;\n const { userInstanceId: uid, username } = getAuth();\n\n let code: number | undefined;\n let message: string | undefined;\n let traceId: string | null | undefined;\n let size: string | null | undefined;\n let status: number | undefined;\n\n let headers: Headers | undefined;\n let data: unknown;\n\n if (hasError) {\n const isHttpResponseError = responseOrError instanceof HttpResponseError;\n if (isHttpResponseError || responseOrError instanceof HttpParseError) {\n ({ status, headers } = responseOrError.response);\n if (isHttpResponseError) {\n data = responseOrError.responseJson;\n }\n }\n } else {\n ({ status, data, headers } = responseOrError as HttpResponse);\n }\n\n if (isObject(data)) {\n ({ code, message } = data as { code?: number; message?: string });\n }\n\n if (headers instanceof Headers) {\n traceId = headers.get(\"x-b3-traceid\");\n size = headers.get(\"content-length\");\n }\n\n pushApiMetric({\n st,\n _ver: st,\n uid,\n username,\n time,\n et,\n page: location.href,\n duration: perfEndTime - perfStartTime,\n api: url,\n type: \"api\",\n code: code ?? -1,\n msg: message ?? \"\",\n status,\n traceId: traceId ?? \"\",\n size: size ? Number(size) : -1,\n });\n }\n\n return hasError\n ? Promise.reject(responseOrError)\n : (responseOrError as HttpResponse);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createPageView, earlyFinishPageView, finishPageView } from "./analytics.js";
|
|
2
2
|
import { getAuth } from "../auth.js";
|
|
3
3
|
export function create() {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const perfStartTime = Math.round(performance.now());
|
|
5
|
+
const startTime = Date.now();
|
|
6
6
|
createPageView();
|
|
7
7
|
return function finish(_ref) {
|
|
8
|
-
|
|
8
|
+
let {
|
|
9
9
|
status,
|
|
10
10
|
path,
|
|
11
11
|
pageTitle
|
|
@@ -14,9 +14,9 @@ export function create() {
|
|
|
14
14
|
earlyFinishPageView();
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const renderTime = Math.round(performance.now()) - perfStartTime;
|
|
18
|
+
const endTime = Date.now();
|
|
19
|
+
const {
|
|
20
20
|
username
|
|
21
21
|
} = getAuth();
|
|
22
22
|
finishPageView({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageView.js","names":["createPageView","earlyFinishPageView","finishPageView","getAuth","create","perfStartTime","Math","round","performance","now","startTime","Date","finish","_ref","status","path","pageTitle","renderTime","endTime","username","type","page","location","href","_ver","time","st","et","lt","route","window","dispatchEvent","CustomEvent","detail"],"sources":["../../../src/analytics/pageView.ts"],"sourcesContent":["import type { PageViewInfo } from \"@next-core/runtime\";\nimport {\n createPageView,\n earlyFinishPageView,\n finishPageView,\n} from \"./analytics.js\";\nimport { getAuth } from \"../auth.js\";\n\nexport function create() {\n const perfStartTime = Math.round(performance.now());\n const startTime = Date.now();\n createPageView();\n\n return function finish({ status, path, pageTitle }: PageViewInfo) {\n if (status !== \"ok\") {\n earlyFinishPageView();\n return;\n }\n\n const renderTime = Math.round(performance.now()) - perfStartTime;\n const endTime = Date.now();\n const { username } = getAuth();\n\n finishPageView({\n type: \"page\",\n page: location.href,\n _ver: startTime,\n time: Math.round(startTime / 1000),\n st: startTime,\n et: endTime,\n lt: renderTime,\n pageTitle,\n username,\n route: path,\n });\n\n // For bricks which would take actions with render time.\n window.dispatchEvent(\n new CustomEvent(\"route.render\", {\n detail: {\n renderTime,\n },\n })\n );\n };\n}\n"],"mappings":"AACA,SACEA,cAAc,EACdC,mBAAmB,EACnBC,cAAc,QACT,gBAAgB;AACvB,SAASC,OAAO,QAAQ,YAAY;AAEpC,OAAO,SAASC,MAAMA,CAAA,EAAG;EACvB,
|
|
1
|
+
{"version":3,"file":"pageView.js","names":["createPageView","earlyFinishPageView","finishPageView","getAuth","create","perfStartTime","Math","round","performance","now","startTime","Date","finish","_ref","status","path","pageTitle","renderTime","endTime","username","type","page","location","href","_ver","time","st","et","lt","route","window","dispatchEvent","CustomEvent","detail"],"sources":["../../../src/analytics/pageView.ts"],"sourcesContent":["import type { PageViewInfo } from \"@next-core/runtime\";\nimport {\n createPageView,\n earlyFinishPageView,\n finishPageView,\n} from \"./analytics.js\";\nimport { getAuth } from \"../auth.js\";\n\nexport function create() {\n const perfStartTime = Math.round(performance.now());\n const startTime = Date.now();\n createPageView();\n\n return function finish({ status, path, pageTitle }: PageViewInfo) {\n if (status !== \"ok\") {\n earlyFinishPageView();\n return;\n }\n\n const renderTime = Math.round(performance.now()) - perfStartTime;\n const endTime = Date.now();\n const { username } = getAuth();\n\n finishPageView({\n type: \"page\",\n page: location.href,\n _ver: startTime,\n time: Math.round(startTime / 1000),\n st: startTime,\n et: endTime,\n lt: renderTime,\n pageTitle,\n username,\n route: path,\n });\n\n // For bricks which would take actions with render time.\n window.dispatchEvent(\n new CustomEvent(\"route.render\", {\n detail: {\n renderTime,\n },\n })\n );\n };\n}\n"],"mappings":"AACA,SACEA,cAAc,EACdC,mBAAmB,EACnBC,cAAc,QACT,gBAAgB;AACvB,SAASC,OAAO,QAAQ,YAAY;AAEpC,OAAO,SAASC,MAAMA,CAAA,EAAG;EACvB,MAAMC,aAAa,GAAGC,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC;EACnD,MAAMC,SAAS,GAAGC,IAAI,CAACF,GAAG,CAAC,CAAC;EAC5BT,cAAc,CAAC,CAAC;EAEhB,OAAO,SAASY,MAAMA,CAAAC,IAAA,EAA4C;IAAA,IAA3C;MAAEC,MAAM;MAAEC,IAAI;MAAEC;IAAwB,CAAC,GAAAH,IAAA;IAC9D,IAAIC,MAAM,KAAK,IAAI,EAAE;MACnBb,mBAAmB,CAAC,CAAC;MACrB;IACF;IAEA,MAAMgB,UAAU,GAAGX,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC,GAAGJ,aAAa;IAChE,MAAMa,OAAO,GAAGP,IAAI,CAACF,GAAG,CAAC,CAAC;IAC1B,MAAM;MAAEU;IAAS,CAAC,GAAGhB,OAAO,CAAC,CAAC;IAE9BD,cAAc,CAAC;MACbkB,IAAI,EAAE,MAAM;MACZC,IAAI,EAAEC,QAAQ,CAACC,IAAI;MACnBC,IAAI,EAAEd,SAAS;MACfe,IAAI,EAAEnB,IAAI,CAACC,KAAK,CAACG,SAAS,GAAG,IAAI,CAAC;MAClCgB,EAAE,EAAEhB,SAAS;MACbiB,EAAE,EAAET,OAAO;MACXU,EAAE,EAAEX,UAAU;MACdD,SAAS;MACTG,QAAQ;MACRU,KAAK,EAAEd;IACT,CAAC,CAAC;;IAEF;IACAe,MAAM,CAACC,aAAa,CAClB,IAAIC,WAAW,CAAC,cAAc,EAAE;MAC9BC,MAAM,EAAE;QACNhB;MACF;IACF,CAAC,CACH,CAAC;EACH,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export var transportOptions = {
|
|
1
|
+
export const events = [];
|
|
2
|
+
const MAXIMUM_WAITING_TIME = 5 * 1000;
|
|
3
|
+
const MAXIMUM_LOGGED_EVENTS = 10;
|
|
4
|
+
let timer = null;
|
|
5
|
+
export const transportOptions = {
|
|
7
6
|
maxWaitingTime: MAXIMUM_WAITING_TIME,
|
|
8
7
|
maxLoggedEvents: MAXIMUM_LOGGED_EVENTS
|
|
9
8
|
};
|
|
10
9
|
export function createTransport(api, options) {
|
|
11
|
-
Object.assign(transportOptions,
|
|
10
|
+
Object.assign(transportOptions, {
|
|
11
|
+
...options,
|
|
12
12
|
api
|
|
13
|
-
})
|
|
13
|
+
});
|
|
14
14
|
return {
|
|
15
15
|
sendOnExit,
|
|
16
16
|
emit
|
|
@@ -27,16 +27,16 @@ function send() {
|
|
|
27
27
|
if (events.length === 0) {
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
const transportEvents = events.splice(0, transportOptions.maxLoggedEvents);
|
|
31
|
+
const transportData = buildTransportData(transportEvents);
|
|
32
32
|
sendBeacon(transportOptions.api, transportData);
|
|
33
33
|
events.length && nextTime(send);
|
|
34
34
|
}
|
|
35
35
|
function sendBeacon(requestUrl, data) {
|
|
36
|
-
|
|
36
|
+
const headers = {
|
|
37
37
|
type: "application/json"
|
|
38
38
|
};
|
|
39
|
-
|
|
39
|
+
const blob = new Blob([JSON.stringify(data)], headers);
|
|
40
40
|
window.navigator.sendBeacon(requestUrl, blob);
|
|
41
41
|
}
|
|
42
42
|
function sendOnExit() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","names":["events","MAXIMUM_WAITING_TIME","MAXIMUM_LOGGED_EVENTS","timer","transportOptions","maxWaitingTime","maxLoggedEvents","createTransport","api","options","Object","assign","
|
|
1
|
+
{"version":3,"file":"transport.js","names":["events","MAXIMUM_WAITING_TIME","MAXIMUM_LOGGED_EVENTS","timer","transportOptions","maxWaitingTime","maxLoggedEvents","createTransport","api","options","Object","assign","sendOnExit","emit","nextTime","callback","window","requestIdleCallback","requestAnimationFrame","cb","setTimeout","clearTimeout","length","send","transportEvents","splice","transportData","buildTransportData","sendBeacon","requestUrl","data","headers","type","blob","Blob","JSON","stringify","navigator","addEventListener","model","columns"],"sources":["../../../src/analytics/transport.ts"],"sourcesContent":["import { ApiMetric, PageViewMetric } from \"./interfaces.js\";\n\nexport const events: (ApiMetric | PageViewMetric)[] = [];\n\nconst MAXIMUM_WAITING_TIME = 5 * 1000;\nconst MAXIMUM_LOGGED_EVENTS = 10;\nlet timer: any = null;\n\nexport const transportOptions = {\n maxWaitingTime: MAXIMUM_WAITING_TIME,\n maxLoggedEvents: MAXIMUM_LOGGED_EVENTS,\n} as TransportOptions;\n\ntype TransportData = {\n model: string;\n columns: string[];\n data: (ApiMetric | PageViewMetric)[];\n};\n\nexport interface TransportOptions {\n api: string;\n maxWaitingTime: number;\n maxLoggedEvents: number;\n}\n\nexport function createTransport(\n api: string,\n options: Partial<TransportOptions>\n) {\n Object.assign(transportOptions, { ...options, api });\n return {\n sendOnExit,\n emit,\n };\n}\n\nfunction nextTime(callback: (data: unknown) => void): unknown {\n return (\n window.requestIdleCallback ||\n window.requestAnimationFrame ||\n ((cb: (data: Record<string, any>) => void) => setTimeout(cb, 17))\n )(callback);\n}\n\nfunction emit() {\n clearTimeout(timer);\n events.length > transportOptions.maxLoggedEvents\n ? send()\n : (timer = setTimeout(send, transportOptions.maxWaitingTime));\n}\n\nfunction send() {\n if (events.length === 0) {\n return;\n }\n const transportEvents = events.splice(0, transportOptions.maxLoggedEvents);\n const transportData = buildTransportData(transportEvents);\n\n sendBeacon(transportOptions.api, transportData);\n\n events.length && nextTime(send);\n}\n\nfunction sendBeacon(requestUrl: string, data: TransportData) {\n const headers = {\n type: \"application/json\",\n };\n\n const blob = new Blob([JSON.stringify(data)], headers);\n window.navigator.sendBeacon(requestUrl, blob);\n}\n\nfunction sendOnExit() {\n window.addEventListener(\"beforeunload\", send, false);\n}\n\nfunction buildTransportData(data: (ApiMetric | PageViewMetric)[]) {\n return {\n model: \"easyops.FRONTEND_STAT\",\n columns: [\n \"_ver\",\n \"st\",\n \"et\",\n \"lt\",\n \"size\",\n \"time\",\n \"traceId\",\n \"code\",\n \"duration\",\n \"page\",\n \"uid\",\n \"username\",\n \"api\",\n \"type\",\n \"msg\",\n \"status\",\n \"pageId\",\n \"route\",\n \"apiCount\",\n \"maxApiTimeCost\",\n \"apiSizeCost\",\n \"pageTitle\",\n ],\n data,\n };\n}\n"],"mappings":"AAEA,OAAO,MAAMA,MAAsC,GAAG,EAAE;AAExD,MAAMC,oBAAoB,GAAG,CAAC,GAAG,IAAI;AACrC,MAAMC,qBAAqB,GAAG,EAAE;AAChC,IAAIC,KAAU,GAAG,IAAI;AAErB,OAAO,MAAMC,gBAAgB,GAAG;EAC9BC,cAAc,EAAEJ,oBAAoB;EACpCK,eAAe,EAAEJ;AACnB,CAAqB;AAcrB,OAAO,SAASK,eAAeA,CAC7BC,GAAW,EACXC,OAAkC,EAClC;EACAC,MAAM,CAACC,MAAM,CAACP,gBAAgB,EAAE;IAAE,GAAGK,OAAO;IAAED;EAAI,CAAC,CAAC;EACpD,OAAO;IACLI,UAAU;IACVC;EACF,CAAC;AACH;AAEA,SAASC,QAAQA,CAACC,QAAiC,EAAW;EAC5D,OAAO,CACLC,MAAM,CAACC,mBAAmB,IAC1BD,MAAM,CAACE,qBAAqB,KAC1BC,EAAuC,IAAKC,UAAU,CAACD,EAAE,EAAE,EAAE,CAAC,CAAC,EACjEJ,QAAQ,CAAC;AACb;AAEA,SAASF,IAAIA,CAAA,EAAG;EACdQ,YAAY,CAAClB,KAAK,CAAC;EACnBH,MAAM,CAACsB,MAAM,GAAGlB,gBAAgB,CAACE,eAAe,GAC5CiB,IAAI,CAAC,CAAC,GACLpB,KAAK,GAAGiB,UAAU,CAACG,IAAI,EAAEnB,gBAAgB,CAACC,cAAc,CAAE;AACjE;AAEA,SAASkB,IAAIA,CAAA,EAAG;EACd,IAAIvB,MAAM,CAACsB,MAAM,KAAK,CAAC,EAAE;IACvB;EACF;EACA,MAAME,eAAe,GAAGxB,MAAM,CAACyB,MAAM,CAAC,CAAC,EAAErB,gBAAgB,CAACE,eAAe,CAAC;EAC1E,MAAMoB,aAAa,GAAGC,kBAAkB,CAACH,eAAe,CAAC;EAEzDI,UAAU,CAACxB,gBAAgB,CAACI,GAAG,EAAEkB,aAAa,CAAC;EAE/C1B,MAAM,CAACsB,MAAM,IAAIR,QAAQ,CAACS,IAAI,CAAC;AACjC;AAEA,SAASK,UAAUA,CAACC,UAAkB,EAAEC,IAAmB,EAAE;EAC3D,MAAMC,OAAO,GAAG;IACdC,IAAI,EAAE;EACR,CAAC;EAED,MAAMC,IAAI,GAAG,IAAIC,IAAI,CAAC,CAACC,IAAI,CAACC,SAAS,CAACN,IAAI,CAAC,CAAC,EAAEC,OAAO,CAAC;EACtDf,MAAM,CAACqB,SAAS,CAACT,UAAU,CAACC,UAAU,EAAEI,IAAI,CAAC;AAC/C;AAEA,SAASrB,UAAUA,CAAA,EAAG;EACpBI,MAAM,CAACsB,gBAAgB,CAAC,cAAc,EAAEf,IAAI,EAAE,KAAK,CAAC;AACtD;AAEA,SAASI,kBAAkBA,CAACG,IAAoC,EAAE;EAChE,OAAO;IACLS,KAAK,EAAE,uBAAuB;IAC9BC,OAAO,EAAE,CACP,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,MAAM,EACN,SAAS,EACT,MAAM,EACN,UAAU,EACV,MAAM,EACN,KAAK,EACL,UAAU,EACV,KAAK,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,CACZ;IACDV;EACF,CAAC;AACH","ignoreList":[]}
|
package/dist/esm/auth-v2.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { getV2RuntimeFromDll } from "@next-core/runtime";
|
|
3
3
|
import { pick } from "lodash";
|
|
4
4
|
export function authV2Factory() {
|
|
5
|
-
|
|
5
|
+
const v2Kit = getV2RuntimeFromDll();
|
|
6
6
|
if (v2Kit) {
|
|
7
7
|
return Object.freeze(pick(v2Kit, ["authenticate", "getAuth", "isLoggedIn", "logout"]));
|
|
8
8
|
}
|
package/dist/esm/auth-v2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-v2.js","names":["getV2RuntimeFromDll","pick","authV2Factory","v2Kit","Object","freeze"],"sources":["../../src/auth-v2.ts"],"sourcesContent":["// istanbul ignore file\nimport { getV2RuntimeFromDll } from \"@next-core/runtime\";\nimport { pick } from \"lodash\";\nimport type * as auth from \"./auth.js\";\n\nexport function authV2Factory() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze(\n pick(v2Kit, [\"authenticate\", \"getAuth\", \"isLoggedIn\", \"logout\"])\n ) as typeof auth;\n }\n}\n"],"mappings":"AAAA;AACA,SAASA,mBAAmB,QAAQ,oBAAoB;AACxD,SAASC,IAAI,QAAQ,QAAQ;AAG7B,OAAO,SAASC,aAAaA,CAAA,EAAG;EAC9B,
|
|
1
|
+
{"version":3,"file":"auth-v2.js","names":["getV2RuntimeFromDll","pick","authV2Factory","v2Kit","Object","freeze"],"sources":["../../src/auth-v2.ts"],"sourcesContent":["// istanbul ignore file\nimport { getV2RuntimeFromDll } from \"@next-core/runtime\";\nimport { pick } from \"lodash\";\nimport type * as auth from \"./auth.js\";\n\nexport function authV2Factory() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze(\n pick(v2Kit, [\"authenticate\", \"getAuth\", \"isLoggedIn\", \"logout\"])\n ) as typeof auth;\n }\n}\n"],"mappings":"AAAA;AACA,SAASA,mBAAmB,QAAQ,oBAAoB;AACxD,SAASC,IAAI,QAAQ,QAAQ;AAG7B,OAAO,SAASC,aAAaA,CAAA,EAAG;EAC9B,MAAMC,KAAK,GAAGH,mBAAmB,CAAC,CAAC;EACnC,IAAIG,KAAK,EAAE;IACT,OAAOC,MAAM,CAACC,MAAM,CAClBJ,IAAI,CAACE,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CACjE,CAAC;EACH;AACF","ignoreList":[]}
|
package/dist/esm/auth.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
1
|
import { resetPermissionPreChecks } from "./checkPermissions.js";
|
|
3
|
-
|
|
2
|
+
const auth = {};
|
|
4
3
|
|
|
5
4
|
/** @internal */
|
|
6
5
|
|
|
@@ -26,12 +25,14 @@ export function authenticate(newAuth) {
|
|
|
26
25
|
* @returns 当前登录认证信息。
|
|
27
26
|
*/
|
|
28
27
|
export function getAuth() {
|
|
29
|
-
return
|
|
28
|
+
return {
|
|
29
|
+
...auth
|
|
30
|
+
};
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
/** @internal */
|
|
33
34
|
export function logout() {
|
|
34
|
-
for (
|
|
35
|
+
for (const key of Object.keys(auth)) {
|
|
35
36
|
auth[key] = undefined;
|
|
36
37
|
}
|
|
37
38
|
resetPermissionPreChecks();
|
package/dist/esm/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","names":["resetPermissionPreChecks","auth","authenticate","newAuth","Object","assign","org","username","userInstanceId","loginFrom","accessRule","isAdmin","csrfToken","license","accessToken","userShowValue","getAuth","
|
|
1
|
+
{"version":3,"file":"auth.js","names":["resetPermissionPreChecks","auth","authenticate","newAuth","Object","assign","org","username","userInstanceId","loginFrom","accessRule","isAdmin","csrfToken","license","accessToken","userShowValue","getAuth","logout","key","keys","undefined","isLoggedIn"],"sources":["../../src/auth.ts"],"sourcesContent":["import type { AuthApi_CheckLoginResponseBody } from \"@next-api-sdk/api-gateway-sdk\";\nimport { resetPermissionPreChecks } from \"./checkPermissions.js\";\n\nconst auth: AuthInfo = {};\n\n/** @internal */\nexport type AuthInfo = Omit<AuthApi_CheckLoginResponseBody, \"loggedIn\">;\n\n/** @internal */\nexport function authenticate(newAuth: AuthInfo): void {\n Object.assign(auth, {\n org: newAuth.org,\n username: newAuth.username,\n userInstanceId: newAuth.userInstanceId,\n loginFrom: newAuth.loginFrom,\n accessRule: newAuth.accessRule,\n isAdmin: newAuth.isAdmin,\n csrfToken: newAuth.csrfToken,\n license: newAuth.license,\n accessToken: newAuth.accessToken,\n userShowValue: newAuth.userShowValue,\n });\n}\n\n/**\n * 获取当前登录认证信息。\n *\n * @returns 当前登录认证信息。\n */\nexport function getAuth(): AuthInfo {\n return {\n ...auth,\n };\n}\n\n/** @internal */\nexport function logout(): void {\n for (const key of Object.keys(auth) as (keyof AuthInfo)[]) {\n auth[key] = undefined;\n }\n resetPermissionPreChecks();\n}\n\n/**\n * 查看当前是否已登录。\n *\n * @returns 当前是否已登录。\n */\nexport function isLoggedIn(): boolean {\n return auth.username !== undefined;\n}\n"],"mappings":"AACA,SAASA,wBAAwB,QAAQ,uBAAuB;AAEhE,MAAMC,IAAc,GAAG,CAAC,CAAC;;AAEzB;;AAGA;AACA,OAAO,SAASC,YAAYA,CAACC,OAAiB,EAAQ;EACpDC,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE;IAClBK,GAAG,EAAEH,OAAO,CAACG,GAAG;IAChBC,QAAQ,EAAEJ,OAAO,CAACI,QAAQ;IAC1BC,cAAc,EAAEL,OAAO,CAACK,cAAc;IACtCC,SAAS,EAAEN,OAAO,CAACM,SAAS;IAC5BC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,OAAO,EAAER,OAAO,CAACQ,OAAO;IACxBC,SAAS,EAAET,OAAO,CAACS,SAAS;IAC5BC,OAAO,EAAEV,OAAO,CAACU,OAAO;IACxBC,WAAW,EAAEX,OAAO,CAACW,WAAW;IAChCC,aAAa,EAAEZ,OAAO,CAACY;EACzB,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAa;EAClC,OAAO;IACL,GAAGf;EACL,CAAC;AACH;;AAEA;AACA,OAAO,SAASgB,MAAMA,CAAA,EAAS;EAC7B,KAAK,MAAMC,GAAG,IAAId,MAAM,CAACe,IAAI,CAAClB,IAAI,CAAC,EAAwB;IACzDA,IAAI,CAACiB,GAAG,CAAC,GAAGE,SAAS;EACvB;EACApB,wBAAwB,CAAC,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASqB,UAAUA,CAAA,EAAY;EACpC,OAAOpB,IAAI,CAACM,QAAQ,KAAKa,SAAS;AACpC","ignoreList":[]}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
-
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
3
1
|
import { traverseStoryboardExpressions, collectInstalledAppsHasUsage } from "@next-core/utils/storyboard";
|
|
4
2
|
import { RuntimeApi_searchMicroAppStandalone } from "@next-api-sdk/micro-app-standalone-sdk";
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
const checkingApps = new Map();
|
|
4
|
+
const checkedApps = new Map();
|
|
7
5
|
export function preCheckInstalledApps(storyboard, hasAppInBootstrap) {
|
|
8
6
|
if (window.STANDALONE_MICRO_APPS && !window.NO_AUTH_GUARD) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
for (
|
|
7
|
+
const appIds = scanInstalledAppsUsage(storyboard);
|
|
8
|
+
const searchIds = [];
|
|
9
|
+
for (const appId of appIds) {
|
|
12
10
|
// Do not check these apps already checking or in bootstrap.
|
|
13
11
|
if (!checkingApps.has(appId) && !hasAppInBootstrap(appId)) {
|
|
14
12
|
searchIds.push(appId);
|
|
@@ -17,7 +15,7 @@ export function preCheckInstalledApps(storyboard, hasAppInBootstrap) {
|
|
|
17
15
|
if (searchIds.length === 0) {
|
|
18
16
|
return;
|
|
19
17
|
}
|
|
20
|
-
|
|
18
|
+
const promise = RuntimeApi_searchMicroAppStandalone({
|
|
21
19
|
query: {
|
|
22
20
|
appId: {
|
|
23
21
|
$in: searchIds
|
|
@@ -30,30 +28,22 @@ export function preCheckInstalledApps(storyboard, hasAppInBootstrap) {
|
|
|
30
28
|
// eslint-disable-next-line no-console
|
|
31
29
|
console.error("Get off site standalone micro-apps failed", error);
|
|
32
30
|
});
|
|
33
|
-
|
|
34
|
-
checkingApps.set(
|
|
31
|
+
for (const appId of searchIds) {
|
|
32
|
+
checkingApps.set(appId, promise.then(result => {
|
|
35
33
|
var _result$list;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
const app = result === null || result === void 0 || (_result$list = result.list) === null || _result$list === void 0 ? void 0 : _result$list.find(item => item.appId === appId);
|
|
35
|
+
const checkedApp = app ? {
|
|
36
|
+
...app,
|
|
37
|
+
id: appId
|
|
38
|
+
} : undefined;
|
|
39
|
+
checkedApps.set(appId, checkedApp);
|
|
41
40
|
return checkedApp;
|
|
42
41
|
}));
|
|
43
|
-
};
|
|
44
|
-
for (var _appId of searchIds) {
|
|
45
|
-
_loop(_appId);
|
|
46
42
|
}
|
|
47
43
|
}
|
|
48
44
|
}
|
|
49
|
-
export function waitForCheckingApps(
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
function _waitForCheckingApps() {
|
|
53
|
-
_waitForCheckingApps = _asyncToGenerator(function* (appIds) {
|
|
54
|
-
yield Promise.all(appIds.map(appId => checkingApps.get(appId)));
|
|
55
|
-
});
|
|
56
|
-
return _waitForCheckingApps.apply(this, arguments);
|
|
45
|
+
export async function waitForCheckingApps(appIds) {
|
|
46
|
+
await Promise.all(appIds.map(appId => checkingApps.get(appId)));
|
|
57
47
|
}
|
|
58
48
|
export function getCheckedApp(appId) {
|
|
59
49
|
if (window.STANDALONE_MICRO_APPS) {
|
|
@@ -61,15 +51,14 @@ export function getCheckedApp(appId) {
|
|
|
61
51
|
}
|
|
62
52
|
}
|
|
63
53
|
function scanInstalledAppsUsage(storyboard) {
|
|
64
|
-
|
|
65
|
-
var usage = {
|
|
54
|
+
const usage = {
|
|
66
55
|
usedArgs: new Set()
|
|
67
56
|
};
|
|
68
57
|
// `INSTALLED_APPS.has(...)` is not available in storyboard functions
|
|
69
|
-
|
|
58
|
+
const {
|
|
70
59
|
customTemplates,
|
|
71
60
|
menus
|
|
72
|
-
} =
|
|
61
|
+
} = storyboard.meta ?? {};
|
|
73
62
|
traverseStoryboardExpressions([storyboard.routes, customTemplates, menus], (node, parent) => {
|
|
74
63
|
collectInstalledAppsHasUsage(usage, node, parent);
|
|
75
64
|
}, "INSTALLED_APPS");
|