@next-core/easyops-runtime 0.6.26 → 0.6.28

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.
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createPageView = createPageView;
7
+ exports.earlyFinishPageView = earlyFinishPageView;
8
+ exports.finishPageView = finishPageView;
9
+ exports.initialize = initialize;
10
+ exports.pushApiMetric = pushApiMetric;
11
+ let initialized = false;
12
+ let pageState = null;
13
+ let isFirstPageView = true;
14
+ const stashedApiMetrics = [];
15
+ const allMetrics = [];
16
+ function initialize(api) {
17
+ if (initialized) {
18
+ return;
19
+ }
20
+ initialized = true;
21
+ function upload() {
22
+ const headers = {
23
+ type: "application/json"
24
+ };
25
+ const data = {
26
+ model: "easyops.FRONTEND_STAT",
27
+ columns: ["_ver", "st", "et", "lt", "size", "time", "traceId", "code", "duration", "page", "uid", "username", "api", "type", "msg", "status", "pageId", "route", "apiCount", "maxApiTimeCost", "apiSizeCost", "pageTitle"],
28
+ data: allMetrics
29
+ };
30
+ const blob = new Blob([JSON.stringify(data)], headers);
31
+ allMetrics.length = 0;
32
+ window.navigator.sendBeacon(api, blob);
33
+ }
34
+ window.addEventListener("beforeunload", upload, false);
35
+ }
36
+ function createPageView() {
37
+ stashedApiMetrics.length = 0;
38
+ pageState = null;
39
+ }
40
+ function finishPageView(metric) {
41
+ const pageId = generateUUID();
42
+ const {
43
+ lt,
44
+ route
45
+ } = metric;
46
+ pageState = {
47
+ lt,
48
+ route,
49
+ pageId
50
+ };
51
+ allMetrics.push({
52
+ ...metric,
53
+ pageId,
54
+ apiCount: stashedApiMetrics.length,
55
+ maxApiTimeCost: Math.max(0, ...stashedApiMetrics.map(api => api.duration)),
56
+ size: stashedApiMetrics.map(api => api.size).filter(size => size > 0).reduce((prev, current) => prev + current, 0)
57
+ });
58
+ for (const item of stashedApiMetrics) {
59
+ allMetrics.push({
60
+ ...item,
61
+ ...pageState
62
+ });
63
+ }
64
+ stashedApiMetrics.length = 0;
65
+ }
66
+ function earlyFinishPageView() {
67
+ allMetrics.push(...stashedApiMetrics);
68
+ stashedApiMetrics.length = 0;
69
+ }
70
+ function pushApiMetric(metric) {
71
+ if (pageState) {
72
+ allMetrics.push({
73
+ ...metric,
74
+ type: "apiRequest",
75
+ ...pageState
76
+ });
77
+ } else {
78
+ stashedApiMetrics.push(metric);
79
+ }
80
+ }
81
+
82
+ // Ref https://medium.com/teads-engineering/generating-uuids-at-scale-on-the-web-2877f529d2a2
83
+ function generateUUID() {
84
+ const url = URL.createObjectURL(new Blob([]));
85
+ let uuid = url.substring(url.lastIndexOf("/") + 1);
86
+ URL.revokeObjectURL(url);
87
+ // 第一次渲染加上特殊标记
88
+ if (isFirstPageView) {
89
+ uuid = "88-" + uuid;
90
+ isFirstPageView = false;
91
+ }
92
+ return uuid;
93
+ }
94
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","names":["initialized","pageState","isFirstPageView","stashedApiMetrics","allMetrics","initialize","api","upload","headers","type","data","model","columns","blob","Blob","JSON","stringify","length","window","navigator","sendBeacon","addEventListener","createPageView","finishPageView","metric","pageId","generateUUID","lt","route","push","apiCount","maxApiTimeCost","Math","max","map","duration","size","filter","reduce","prev","current","item","earlyFinishPageView","pushApiMetric","url","URL","createObjectURL","uuid","substring","lastIndexOf","revokeObjectURL"],"sources":["../../../src/analytics/analytics.ts"],"sourcesContent":["import type {\n ApiMetric,\n ApiPageState,\n PageViewMetric,\n PartialPageViewMetric,\n} from \"./interfaces.js\";\n\nlet initialized = false;\nlet pageState: ApiPageState | null = null;\nlet isFirstPageView = true;\nconst stashedApiMetrics: ApiMetric[] = [];\n\nconst allMetrics: (ApiMetric | PageViewMetric)[] = [];\n\nexport function initialize(api: string) {\n if (initialized) {\n return;\n }\n initialized = true;\n\n function upload() {\n const headers = {\n type: \"application/json\",\n };\n const data = {\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: allMetrics,\n };\n const blob = new Blob([JSON.stringify(data)], headers);\n allMetrics.length = 0;\n\n window.navigator.sendBeacon(api, blob);\n }\n\n window.addEventListener(\"beforeunload\", upload, false);\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 allMetrics.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 allMetrics.push({\n ...item,\n ...pageState,\n });\n }\n stashedApiMetrics.length = 0;\n}\n\nexport function earlyFinishPageView() {\n allMetrics.push(...stashedApiMetrics);\n stashedApiMetrics.length = 0;\n}\n\nexport function pushApiMetric(metric: ApiMetric) {\n if (pageState) {\n allMetrics.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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"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.onRequest = onRequest;
7
+ exports.onResponse = onResponse;
8
+ exports.onResponseError = onResponseError;
9
+ var _http = require("@next-core/http");
10
+ var _general = require("@next-core/utils/general");
11
+ var _auth = require("../auth.js");
12
+ var _analytics = require("./analytics.js");
13
+ const symbolHttpAnalytics = Symbol("HttpAnalytics");
14
+ function onRequest(config) {
15
+ const perfStartTime = Math.round(performance.now());
16
+ const st = Date.now();
17
+ config[symbolHttpAnalytics] = {
18
+ st,
19
+ time: Math.round(st / 1000),
20
+ perfStartTime
21
+ };
22
+ return config;
23
+ }
24
+ function onResponse(response, config) {
25
+ return onResponseOrError(false, response, config);
26
+ }
27
+ function onResponseError(error, config) {
28
+ return onResponseOrError(true, error, config);
29
+ }
30
+ function onResponseOrError(hasError, responseOrError, config) {
31
+ const perfEndTime = Math.round(performance.now());
32
+ const et = Date.now();
33
+ const {
34
+ [symbolHttpAnalytics]: meta,
35
+ url
36
+ } = config;
37
+ if (meta && !(hasError && responseOrError instanceof _http.HttpAbortError)) {
38
+ var _code, _message, _traceId;
39
+ delete config[symbolHttpAnalytics];
40
+ const {
41
+ st,
42
+ time,
43
+ perfStartTime
44
+ } = meta;
45
+ const {
46
+ userInstanceId: uid,
47
+ username
48
+ } = (0, _auth.getAuth)();
49
+ let code;
50
+ let message;
51
+ let traceId;
52
+ let size;
53
+ let status;
54
+ let headers;
55
+ let data;
56
+ if (hasError) {
57
+ const isHttpResponseError = responseOrError instanceof _http.HttpResponseError;
58
+ if (isHttpResponseError || responseOrError instanceof _http.HttpParseError) {
59
+ ({
60
+ status,
61
+ headers
62
+ } = responseOrError.response);
63
+ if (isHttpResponseError) {
64
+ data = responseOrError.responseJson;
65
+ }
66
+ }
67
+ } else {
68
+ ({
69
+ status,
70
+ data,
71
+ headers
72
+ } = responseOrError);
73
+ }
74
+ if ((0, _general.isObject)(data)) {
75
+ ({
76
+ code,
77
+ message
78
+ } = data);
79
+ }
80
+ if (headers instanceof Headers) {
81
+ traceId = headers.get("x-b3-traceid");
82
+ size = headers.get("content-length");
83
+ }
84
+ (0, _analytics.pushApiMetric)({
85
+ st,
86
+ _ver: st,
87
+ uid,
88
+ username,
89
+ time,
90
+ et,
91
+ page: location.href,
92
+ duration: perfEndTime - perfStartTime,
93
+ api: url,
94
+ type: "api",
95
+ code: (_code = code) !== null && _code !== void 0 ? _code : -1,
96
+ msg: (_message = message) !== null && _message !== void 0 ? _message : "",
97
+ status,
98
+ traceId: (_traceId = traceId) !== null && _traceId !== void 0 ? _traceId : "",
99
+ size: size ? Number(size) : -1
100
+ });
101
+ }
102
+ return hasError ? Promise.reject(responseOrError) : responseOrError;
103
+ }
104
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","names":["_http","require","_general","_auth","_analytics","symbolHttpAnalytics","Symbol","onRequest","config","perfStartTime","Math","round","performance","now","st","Date","time","onResponse","response","onResponseOrError","onResponseError","error","hasError","responseOrError","perfEndTime","et","meta","url","HttpAbortError","_code","_message","_traceId","userInstanceId","uid","username","getAuth","code","message","traceId","size","status","headers","data","isHttpResponseError","HttpResponseError","HttpParseError","responseJson","isObject","Headers","get","pushApiMetric","_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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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.http = void 0;
8
+ Object.defineProperty(exports, "initialize", {
9
+ enumerable: true,
10
+ get: function () {
11
+ return _analytics.initialize;
12
+ }
13
+ });
14
+ exports.pageView = void 0;
15
+ var http = _interopRequireWildcard(require("./http.js"));
16
+ exports.http = http;
17
+ var pageView = _interopRequireWildcard(require("./pageView.js"));
18
+ exports.pageView = pageView;
19
+ var _analytics = require("./analytics.js");
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["http","_interopRequireWildcard","require","exports","pageView","_analytics"],"sources":["../../../src/analytics/index.ts"],"sourcesContent":["import * as http from \"./http.js\";\nimport * as pageView from \"./pageView.js\";\nimport { initialize } from \"./analytics.js\";\n\nexport { initialize, http, pageView };\n"],"mappings":";;;;;;;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,uBAAA,CAAAC,OAAA;AAAkCC,OAAA,CAAAH,IAAA,GAAAA,IAAA;AAClC,IAAAI,QAAA,GAAAH,uBAAA,CAAAC,OAAA;AAA0CC,OAAA,CAAAC,QAAA,GAAAA,QAAA;AAC1C,IAAAC,UAAA,GAAAH,OAAA"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","names":[],"sources":["../../../src/analytics/interfaces.ts"],"sourcesContent":["export interface HttpAnalyticsMeta {\n st: number;\n time: number;\n perfStartTime: number;\n}\n\nexport interface ApiMetric extends BaseMetric {\n type: \"api\" | \"apiRequest\";\n uid: string | undefined;\n time: number;\n duration: number;\n api: string;\n code: number;\n status: number | undefined;\n msg: string;\n traceId: string;\n}\n\nexport interface PageViewMetric extends BaseMetric {\n type: \"page\";\n apiCount: number;\n maxApiTimeCost: number;\n pageTitle: string | undefined;\n lt: number;\n route: string | undefined;\n pageId: string;\n}\n\nexport type PartialPageViewMetric = Omit<\n PageViewMetric,\n \"apiCount\" | \"maxApiTimeCost\" | \"size\" | \"pageId\"\n>;\n\nexport type ApiPageState = Pick<PageViewMetric, \"lt\" | \"route\" | \"pageId\">;\n\nexport interface BaseMetric {\n type: string;\n st: number;\n et: number;\n _ver: number;\n username: string | undefined;\n page: string;\n size: number;\n}\n"],"mappings":""}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.create = create;
7
+ var _analytics = require("./analytics.js");
8
+ var _auth = require("../auth.js");
9
+ function create() {
10
+ const perfStartTime = Math.round(performance.now());
11
+ const startTime = Date.now();
12
+ (0, _analytics.createPageView)();
13
+ return function finish({
14
+ status,
15
+ path,
16
+ pageTitle
17
+ }) {
18
+ if (status !== "ok") {
19
+ (0, _analytics.earlyFinishPageView)();
20
+ return;
21
+ }
22
+ const renderTime = Math.round(performance.now()) - perfStartTime;
23
+ const endTime = Date.now();
24
+ const {
25
+ username
26
+ } = (0, _auth.getAuth)();
27
+ (0, _analytics.finishPageView)({
28
+ type: "page",
29
+ page: location.href,
30
+ _ver: startTime,
31
+ st: startTime,
32
+ et: endTime,
33
+ lt: renderTime,
34
+ pageTitle,
35
+ username,
36
+ route: path
37
+ });
38
+
39
+ // For bricks which would take actions with render time.
40
+ window.dispatchEvent(new CustomEvent("route.render", {
41
+ detail: {
42
+ renderTime
43
+ }
44
+ }));
45
+ };
46
+ }
47
+ //# sourceMappingURL=pageView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageView.js","names":["_analytics","require","_auth","create","perfStartTime","Math","round","performance","now","startTime","Date","createPageView","finish","status","path","pageTitle","earlyFinishPageView","renderTime","endTime","username","getAuth","finishPageView","type","page","location","href","_ver","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 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,IAAAA,UAAA,GAAAC,OAAA;AAKA,IAAAC,KAAA,GAAAD,OAAA;AAEO,SAASE,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;EAC5B,IAAAG,yBAAc,EAAC,CAAC;EAEhB,OAAO,SAASC,MAAMA,CAAC;IAAEC,MAAM;IAAEC,IAAI;IAAEC;EAAwB,CAAC,EAAE;IAChE,IAAIF,MAAM,KAAK,IAAI,EAAE;MACnB,IAAAG,8BAAmB,EAAC,CAAC;MACrB;IACF;IAEA,MAAMC,UAAU,GAAGZ,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC,GAAGJ,aAAa;IAChE,MAAMc,OAAO,GAAGR,IAAI,CAACF,GAAG,CAAC,CAAC;IAC1B,MAAM;MAAEW;IAAS,CAAC,GAAG,IAAAC,aAAO,EAAC,CAAC;IAE9B,IAAAC,yBAAc,EAAC;MACbC,IAAI,EAAE,MAAM;MACZC,IAAI,EAAEC,QAAQ,CAACC,IAAI;MACnBC,IAAI,EAAEjB,SAAS;MACfkB,EAAE,EAAElB,SAAS;MACbmB,EAAE,EAAEV,OAAO;MACXW,EAAE,EAAEZ,UAAU;MACdF,SAAS;MACTI,QAAQ;MACRW,KAAK,EAAEhB;IACT,CAAC,CAAC;;IAEF;IACAiB,MAAM,CAACC,aAAa,CAClB,IAAIC,WAAW,CAAC,cAAc,EAAE;MAC9BC,MAAM,EAAE;QACNjB;MACF;IACF,CAAC,CACH,CAAC;EACH,CAAC;AACH"}
package/dist/cjs/index.js CHANGED
@@ -4,7 +4,7 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.messageDispatcher = exports.menu = exports.flowApi = exports.checkPermissions = exports.checkInstalledApps = exports.auth = void 0;
7
+ exports.messageDispatcher = exports.menu = exports.flowApi = exports.checkPermissions = exports.checkInstalledApps = exports.auth = exports.analytics = void 0;
8
8
  var _checkPermissions2 = require("./checkPermissions.js");
9
9
  var _MessageDispatcher = require("./websocket/MessageDispatcher.js");
10
10
  var _checkInstalledApps = _interopRequireWildcard(require("./checkInstalledApps.js"));
@@ -15,6 +15,8 @@ var _auth = _interopRequireWildcard(require("./auth.js"));
15
15
  exports.auth = _auth;
16
16
  var _menu = _interopRequireWildcard(require("./menu/index.js"));
17
17
  exports.menu = _menu;
18
+ var _analytics = _interopRequireWildcard(require("./analytics/index.js"));
19
+ exports.analytics = _analytics;
18
20
  // istanbul ignore file
19
21
 
20
22
  const checkPermissions = Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_checkPermissions2","require","_MessageDispatcher","_checkInstalledApps","_interopRequireWildcard","exports","checkInstalledApps","_flowApi","flowApi","_auth","auth","_menu","menu","checkPermissions","Object","freeze","_checkPermissions","preCheckPermissions","preCheckPermissionsForBrickOrRoute","messageDispatcher","MessageDispatcher"],"sources":["../../src/index.ts"],"sourcesContent":["// istanbul ignore file\nimport {\n checkPermissions as _checkPermissions,\n preCheckPermissions,\n preCheckPermissionsForBrickOrRoute,\n} from \"./checkPermissions.js\";\n\nimport { MessageDispatcher } from \"./websocket/MessageDispatcher.js\";\n\nexport * as checkInstalledApps from \"./checkInstalledApps.js\";\nexport * as flowApi from \"./flowApi/index.js\";\nexport * as auth from \"./auth.js\";\nexport * as menu from \"./menu/index.js\";\n\nexport const checkPermissions = Object.freeze({\n checkPermissions: _checkPermissions,\n preCheckPermissions,\n preCheckPermissionsForBrickOrRoute,\n});\n\nexport const messageDispatcher = new MessageDispatcher();\n"],"mappings":";;;;;;;AACA,IAAAA,kBAAA,GAAAC,OAAA;AAMA,IAAAC,kBAAA,GAAAD,OAAA;AAAqE,IAAAE,mBAAA,GAAAC,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAC,kBAAA,GAAAH,mBAAA;AAAA,IAAAI,QAAA,GAAAH,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAG,OAAA,GAAAD,QAAA;AAAA,IAAAE,KAAA,GAAAL,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAK,IAAA,GAAAD,KAAA;AAAA,IAAAE,KAAA,GAAAP,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAO,IAAA,GAAAD,KAAA;AAPrE;;AAcO,MAAME,gBAAgB,GAAGC,MAAM,CAACC,MAAM,CAAC;EAC5CF,gBAAgB,EAAEG,mCAAiB;EACnCC,mBAAmB,EAAnBA,sCAAmB;EACnBC,kCAAkC,EAAlCA;AACF,CAAC,CAAC;AAACb,OAAA,CAAAQ,gBAAA,GAAAA,gBAAA;AAEI,MAAMM,iBAAiB,GAAG,IAAIC,oCAAiB,CAAC,CAAC;AAACf,OAAA,CAAAc,iBAAA,GAAAA,iBAAA"}
1
+ {"version":3,"file":"index.js","names":["_checkPermissions2","require","_MessageDispatcher","_checkInstalledApps","_interopRequireWildcard","exports","checkInstalledApps","_flowApi","flowApi","_auth","auth","_menu","menu","_analytics","analytics","checkPermissions","Object","freeze","_checkPermissions","preCheckPermissions","preCheckPermissionsForBrickOrRoute","messageDispatcher","MessageDispatcher"],"sources":["../../src/index.ts"],"sourcesContent":["// istanbul ignore file\nimport {\n checkPermissions as _checkPermissions,\n preCheckPermissions,\n preCheckPermissionsForBrickOrRoute,\n} from \"./checkPermissions.js\";\n\nimport { MessageDispatcher } from \"./websocket/MessageDispatcher.js\";\n\nexport * as checkInstalledApps from \"./checkInstalledApps.js\";\nexport * as flowApi from \"./flowApi/index.js\";\nexport * as auth from \"./auth.js\";\nexport * as menu from \"./menu/index.js\";\nexport * as analytics from \"./analytics/index.js\";\n\nexport const checkPermissions = Object.freeze({\n checkPermissions: _checkPermissions,\n preCheckPermissions,\n preCheckPermissionsForBrickOrRoute,\n});\n\nexport const messageDispatcher = new MessageDispatcher();\n"],"mappings":";;;;;;;AACA,IAAAA,kBAAA,GAAAC,OAAA;AAMA,IAAAC,kBAAA,GAAAD,OAAA;AAAqE,IAAAE,mBAAA,GAAAC,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAC,kBAAA,GAAAH,mBAAA;AAAA,IAAAI,QAAA,GAAAH,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAG,OAAA,GAAAD,QAAA;AAAA,IAAAE,KAAA,GAAAL,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAK,IAAA,GAAAD,KAAA;AAAA,IAAAE,KAAA,GAAAP,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAO,IAAA,GAAAD,KAAA;AAAA,IAAAE,UAAA,GAAAT,uBAAA,CAAAH,OAAA;AAAAI,OAAA,CAAAS,SAAA,GAAAD,UAAA;AAPrE;;AAeO,MAAME,gBAAgB,GAAGC,MAAM,CAACC,MAAM,CAAC;EAC5CF,gBAAgB,EAAEG,mCAAiB;EACnCC,mBAAmB,EAAnBA,sCAAmB;EACnBC,kCAAkC,EAAlCA;AACF,CAAC,CAAC;AAACf,OAAA,CAAAU,gBAAA,GAAAA,gBAAA;AAEI,MAAMM,iBAAiB,GAAG,IAAIC,oCAAiB,CAAC,CAAC;AAACjB,OAAA,CAAAgB,iBAAA,GAAAA,iBAAA"}
@@ -0,0 +1,79 @@
1
+ import _objectSpread from "@babel/runtime/helpers/objectSpread2";
2
+ var initialized = false;
3
+ var pageState = null;
4
+ var isFirstPageView = true;
5
+ var stashedApiMetrics = [];
6
+ var allMetrics = [];
7
+ export function initialize(api) {
8
+ if (initialized) {
9
+ return;
10
+ }
11
+ initialized = true;
12
+ function upload() {
13
+ var headers = {
14
+ type: "application/json"
15
+ };
16
+ var data = {
17
+ model: "easyops.FRONTEND_STAT",
18
+ columns: ["_ver", "st", "et", "lt", "size", "time", "traceId", "code", "duration", "page", "uid", "username", "api", "type", "msg", "status", "pageId", "route", "apiCount", "maxApiTimeCost", "apiSizeCost", "pageTitle"],
19
+ data: allMetrics
20
+ };
21
+ var blob = new Blob([JSON.stringify(data)], headers);
22
+ allMetrics.length = 0;
23
+ window.navigator.sendBeacon(api, blob);
24
+ }
25
+ window.addEventListener("beforeunload", upload, false);
26
+ }
27
+ export function createPageView() {
28
+ stashedApiMetrics.length = 0;
29
+ pageState = null;
30
+ }
31
+ export function finishPageView(metric) {
32
+ var pageId = generateUUID();
33
+ var {
34
+ lt,
35
+ route
36
+ } = metric;
37
+ pageState = {
38
+ lt,
39
+ route,
40
+ pageId
41
+ };
42
+ allMetrics.push(_objectSpread(_objectSpread({}, metric), {}, {
43
+ pageId,
44
+ apiCount: stashedApiMetrics.length,
45
+ maxApiTimeCost: Math.max(0, ...stashedApiMetrics.map(api => api.duration)),
46
+ size: stashedApiMetrics.map(api => api.size).filter(size => size > 0).reduce((prev, current) => prev + current, 0)
47
+ }));
48
+ for (var item of stashedApiMetrics) {
49
+ allMetrics.push(_objectSpread(_objectSpread({}, item), pageState));
50
+ }
51
+ stashedApiMetrics.length = 0;
52
+ }
53
+ export function earlyFinishPageView() {
54
+ allMetrics.push(...stashedApiMetrics);
55
+ stashedApiMetrics.length = 0;
56
+ }
57
+ export function pushApiMetric(metric) {
58
+ if (pageState) {
59
+ allMetrics.push(_objectSpread(_objectSpread({}, metric), {}, {
60
+ type: "apiRequest"
61
+ }, pageState));
62
+ } else {
63
+ stashedApiMetrics.push(metric);
64
+ }
65
+ }
66
+
67
+ // Ref https://medium.com/teads-engineering/generating-uuids-at-scale-on-the-web-2877f529d2a2
68
+ function generateUUID() {
69
+ var url = URL.createObjectURL(new Blob([]));
70
+ var uuid = url.substring(url.lastIndexOf("/") + 1);
71
+ URL.revokeObjectURL(url);
72
+ // 第一次渲染加上特殊标记
73
+ if (isFirstPageView) {
74
+ uuid = "88-" + uuid;
75
+ isFirstPageView = false;
76
+ }
77
+ return uuid;
78
+ }
79
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","names":["initialized","pageState","isFirstPageView","stashedApiMetrics","allMetrics","initialize","api","upload","headers","type","data","model","columns","blob","Blob","JSON","stringify","length","window","navigator","sendBeacon","addEventListener","createPageView","finishPageView","metric","pageId","generateUUID","lt","route","push","_objectSpread","apiCount","maxApiTimeCost","Math","max","map","duration","size","filter","reduce","prev","current","item","earlyFinishPageView","pushApiMetric","url","URL","createObjectURL","uuid","substring","lastIndexOf","revokeObjectURL"],"sources":["../../../src/analytics/analytics.ts"],"sourcesContent":["import type {\n ApiMetric,\n ApiPageState,\n PageViewMetric,\n PartialPageViewMetric,\n} from \"./interfaces.js\";\n\nlet initialized = false;\nlet pageState: ApiPageState | null = null;\nlet isFirstPageView = true;\nconst stashedApiMetrics: ApiMetric[] = [];\n\nconst allMetrics: (ApiMetric | PageViewMetric)[] = [];\n\nexport function initialize(api: string) {\n if (initialized) {\n return;\n }\n initialized = true;\n\n function upload() {\n const headers = {\n type: \"application/json\",\n };\n const data = {\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: allMetrics,\n };\n const blob = new Blob([JSON.stringify(data)], headers);\n allMetrics.length = 0;\n\n window.navigator.sendBeacon(api, blob);\n }\n\n window.addEventListener(\"beforeunload\", upload, false);\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 allMetrics.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 allMetrics.push({\n ...item,\n ...pageState,\n });\n }\n stashedApiMetrics.length = 0;\n}\n\nexport function earlyFinishPageView() {\n allMetrics.push(...stashedApiMetrics);\n stashedApiMetrics.length = 0;\n}\n\nexport function pushApiMetric(metric: ApiMetric) {\n if (pageState) {\n allMetrics.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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"}
@@ -0,0 +1,96 @@
1
+ import { HttpResponseError, HttpParseError, HttpAbortError } from "@next-core/http";
2
+ import { isObject } from "@next-core/utils/general";
3
+ import { getAuth } from "../auth.js";
4
+ import { pushApiMetric } from "./analytics.js";
5
+ var symbolHttpAnalytics = Symbol("HttpAnalytics");
6
+ export function onRequest(config) {
7
+ var perfStartTime = Math.round(performance.now());
8
+ var st = Date.now();
9
+ config[symbolHttpAnalytics] = {
10
+ st,
11
+ time: Math.round(st / 1000),
12
+ perfStartTime
13
+ };
14
+ return config;
15
+ }
16
+ export function onResponse(response, config) {
17
+ return onResponseOrError(false, response, config);
18
+ }
19
+ export function onResponseError(error, config) {
20
+ return onResponseOrError(true, error, config);
21
+ }
22
+ function onResponseOrError(hasError, responseOrError, config) {
23
+ var perfEndTime = Math.round(performance.now());
24
+ var et = Date.now();
25
+ var {
26
+ [symbolHttpAnalytics]: meta,
27
+ url
28
+ } = config;
29
+ if (meta && !(hasError && responseOrError instanceof HttpAbortError)) {
30
+ var _code, _message, _traceId;
31
+ delete config[symbolHttpAnalytics];
32
+ var {
33
+ st,
34
+ time,
35
+ perfStartTime
36
+ } = meta;
37
+ var {
38
+ userInstanceId: uid,
39
+ username
40
+ } = getAuth();
41
+ var code;
42
+ var message;
43
+ var traceId;
44
+ var size;
45
+ var status;
46
+ var headers;
47
+ var data;
48
+ if (hasError) {
49
+ var isHttpResponseError = responseOrError instanceof HttpResponseError;
50
+ if (isHttpResponseError || responseOrError instanceof HttpParseError) {
51
+ ({
52
+ status,
53
+ headers
54
+ } = responseOrError.response);
55
+ if (isHttpResponseError) {
56
+ data = responseOrError.responseJson;
57
+ }
58
+ }
59
+ } else {
60
+ ({
61
+ status,
62
+ data,
63
+ headers
64
+ } = responseOrError);
65
+ }
66
+ if (isObject(data)) {
67
+ ({
68
+ code,
69
+ message
70
+ } = data);
71
+ }
72
+ if (headers instanceof Headers) {
73
+ traceId = headers.get("x-b3-traceid");
74
+ size = headers.get("content-length");
75
+ }
76
+ pushApiMetric({
77
+ st,
78
+ _ver: st,
79
+ uid,
80
+ username,
81
+ time,
82
+ et,
83
+ page: location.href,
84
+ duration: perfEndTime - perfStartTime,
85
+ api: url,
86
+ type: "api",
87
+ code: (_code = code) !== null && _code !== void 0 ? _code : -1,
88
+ msg: (_message = message) !== null && _message !== void 0 ? _message : "",
89
+ status,
90
+ traceId: (_traceId = traceId) !== null && _traceId !== void 0 ? _traceId : "",
91
+ size: size ? Number(size) : -1
92
+ });
93
+ }
94
+ return hasError ? Promise.reject(responseOrError) : responseOrError;
95
+ }
96
+ //# sourceMappingURL=http.js.map
@@ -0,0 +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","_code","_message","_traceId","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":"AAAA,SACEA,iBAAiB,EACjBC,cAAc,EACdC,cAAc,QAIT,iBAAiB;AACxB,SAASC,QAAQ,QAAQ,0BAA0B;AACnD,SAASC,OAAO,QAAQ,YAAY;AAEpC,SAASC,aAAa,QAAQ,gBAAgB;AAE9C,IAAMC,mBAAmB,GAAGC,MAAM,CAAC,eAAe,CAAC;AAMnD,OAAO,SAASC,SAASA,CACvBC,MAA0C,EACvB;EACnB,IAAMC,aAAa,GAAGC,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC;EACnD,IAAMC,EAAE,GAAGC,IAAI,CAACF,GAAG,CAAC,CAAC;EACrBL,MAAM,CAACH,mBAAmB,CAAC,GAAG;IAC5BS,EAAE;IACFE,IAAI,EAAEN,IAAI,CAACC,KAAK,CAACG,EAAE,GAAG,IAAI,CAAC;IAC3BL;EACF,CAAC;EACD,OAAOD,MAAM;AACf;AAEA,OAAO,SAASS,UAAUA,CACxBC,QAAsB,EACtBV,MAA0C,EAC5B;EACd,OAAOW,iBAAiB,CAAC,KAAK,EAAED,QAAQ,EAAEV,MAAM,CAAC;AACnD;AAEA,OAAO,SAASY,eAAeA,CAC7BC,KAAgB,EAChBb,MAA0C,EACtB;EACpB,OAAOW,iBAAiB,CAAC,IAAI,EAAEE,KAAK,EAAEb,MAAM,CAAC;AAC/C;AAYA,SAASW,iBAAiBA,CACxBG,QAAiB,EACjBC,eAAyC,EACzCf,MAA0C,EACP;EACnC,IAAMgB,WAAW,GAAGd,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC;EACjD,IAAMY,EAAE,GAAGV,IAAI,CAACF,GAAG,CAAC,CAAC;EACrB,IAAM;IAAE,CAACR,mBAAmB,GAAGqB,IAAI;IAAEC;EAAI,CAAC,GAAGnB,MAAM;EACnD,IAAIkB,IAAI,IAAI,EAAEJ,QAAQ,IAAIC,eAAe,YAAYtB,cAAc,CAAC,EAAE;IAAA,IAAA2B,KAAA,EAAAC,QAAA,EAAAC,QAAA;IACpE,OAAOtB,MAAM,CAACH,mBAAmB,CAAC;IAClC,IAAM;MAAES,EAAE;MAAEE,IAAI;MAAEP;IAAc,CAAC,GAAGiB,IAAI;IACxC,IAAM;MAAEK,cAAc,EAAEC,GAAG;MAAEC;IAAS,CAAC,GAAG9B,OAAO,CAAC,CAAC;IAEnD,IAAI+B,IAAwB;IAC5B,IAAIC,OAA2B;IAC/B,IAAIC,OAAkC;IACtC,IAAIC,IAA+B;IACnC,IAAIC,MAA0B;IAE9B,IAAIC,OAA4B;IAChC,IAAIC,IAAa;IAEjB,IAAIlB,QAAQ,EAAE;MACZ,IAAMmB,mBAAmB,GAAGlB,eAAe,YAAYxB,iBAAiB;MACxE,IAAI0C,mBAAmB,IAAIlB,eAAe,YAAYvB,cAAc,EAAE;QACpE,CAAC;UAAEsC,MAAM;UAAEC;QAAQ,CAAC,GAAGhB,eAAe,CAACL,QAAQ;QAC/C,IAAIuB,mBAAmB,EAAE;UACvBD,IAAI,GAAGjB,eAAe,CAACmB,YAAY;QACrC;MACF;IACF,CAAC,MAAM;MACL,CAAC;QAAEJ,MAAM;QAAEE,IAAI;QAAED;MAAQ,CAAC,GAAGhB,eAA+B;IAC9D;IAEA,IAAIrB,QAAQ,CAACsC,IAAI,CAAC,EAAE;MAClB,CAAC;QAAEN,IAAI;QAAEC;MAAQ,CAAC,GAAGK,IAA2C;IAClE;IAEA,IAAID,OAAO,YAAYI,OAAO,EAAE;MAC9BP,OAAO,GAAGG,OAAO,CAACK,GAAG,CAAC,cAAc,CAAC;MACrCP,IAAI,GAAGE,OAAO,CAACK,GAAG,CAAC,gBAAgB,CAAC;IACtC;IAEAxC,aAAa,CAAC;MACZU,EAAE;MACF+B,IAAI,EAAE/B,EAAE;MACRkB,GAAG;MACHC,QAAQ;MACRjB,IAAI;MACJS,EAAE;MACFqB,IAAI,EAAEC,QAAQ,CAACC,IAAI;MACnBC,QAAQ,EAAEzB,WAAW,GAAGf,aAAa;MACrCyC,GAAG,EAAEvB,GAAG;MACRwB,IAAI,EAAE,KAAK;MACXjB,IAAI,GAAAN,KAAA,GAAEM,IAAI,cAAAN,KAAA,cAAAA,KAAA,GAAI,CAAC,CAAC;MAChBwB,GAAG,GAAAvB,QAAA,GAAEM,OAAO,cAAAN,QAAA,cAAAA,QAAA,GAAI,EAAE;MAClBS,MAAM;MACNF,OAAO,GAAAN,QAAA,GAAEM,OAAO,cAAAN,QAAA,cAAAA,QAAA,GAAI,EAAE;MACtBO,IAAI,EAAEA,IAAI,GAAGgB,MAAM,CAAChB,IAAI,CAAC,GAAG,CAAC;IAC/B,CAAC,CAAC;EACJ;EAEA,OAAOf,QAAQ,GACXgC,OAAO,CAACC,MAAM,CAAChC,eAAe,CAAC,GAC9BA,eAAgC;AACvC"}
@@ -0,0 +1,5 @@
1
+ import * as http from "./http.js";
2
+ import * as pageView from "./pageView.js";
3
+ import { initialize } from "./analytics.js";
4
+ export { initialize, http, pageView };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["http","pageView","initialize"],"sources":["../../../src/analytics/index.ts"],"sourcesContent":["import * as http from \"./http.js\";\nimport * as pageView from \"./pageView.js\";\nimport { initialize } from \"./analytics.js\";\n\nexport { initialize, http, pageView };\n"],"mappings":"AAAA,OAAO,KAAKA,IAAI,MAAM,WAAW;AACjC,OAAO,KAAKC,QAAQ,MAAM,eAAe;AACzC,SAASC,UAAU,QAAQ,gBAAgB;AAE3C,SAASA,UAAU,EAAEF,IAAI,EAAEC,QAAQ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","names":[],"sources":["../../../src/analytics/interfaces.ts"],"sourcesContent":["export interface HttpAnalyticsMeta {\n st: number;\n time: number;\n perfStartTime: number;\n}\n\nexport interface ApiMetric extends BaseMetric {\n type: \"api\" | \"apiRequest\";\n uid: string | undefined;\n time: number;\n duration: number;\n api: string;\n code: number;\n status: number | undefined;\n msg: string;\n traceId: string;\n}\n\nexport interface PageViewMetric extends BaseMetric {\n type: \"page\";\n apiCount: number;\n maxApiTimeCost: number;\n pageTitle: string | undefined;\n lt: number;\n route: string | undefined;\n pageId: string;\n}\n\nexport type PartialPageViewMetric = Omit<\n PageViewMetric,\n \"apiCount\" | \"maxApiTimeCost\" | \"size\" | \"pageId\"\n>;\n\nexport type ApiPageState = Pick<PageViewMetric, \"lt\" | \"route\" | \"pageId\">;\n\nexport interface BaseMetric {\n type: string;\n st: number;\n et: number;\n _ver: number;\n username: string | undefined;\n page: string;\n size: number;\n}\n"],"mappings":""}
@@ -0,0 +1,42 @@
1
+ import { createPageView, earlyFinishPageView, finishPageView } from "./analytics.js";
2
+ import { getAuth } from "../auth.js";
3
+ export function create() {
4
+ var perfStartTime = Math.round(performance.now());
5
+ var startTime = Date.now();
6
+ createPageView();
7
+ return function finish(_ref) {
8
+ var {
9
+ status,
10
+ path,
11
+ pageTitle
12
+ } = _ref;
13
+ if (status !== "ok") {
14
+ earlyFinishPageView();
15
+ return;
16
+ }
17
+ var renderTime = Math.round(performance.now()) - perfStartTime;
18
+ var endTime = Date.now();
19
+ var {
20
+ username
21
+ } = getAuth();
22
+ finishPageView({
23
+ type: "page",
24
+ page: location.href,
25
+ _ver: startTime,
26
+ st: startTime,
27
+ et: endTime,
28
+ lt: renderTime,
29
+ pageTitle,
30
+ username,
31
+ route: path
32
+ });
33
+
34
+ // For bricks which would take actions with render time.
35
+ window.dispatchEvent(new CustomEvent("route.render", {
36
+ detail: {
37
+ renderTime
38
+ }
39
+ }));
40
+ };
41
+ }
42
+ //# sourceMappingURL=pageView.js.map
@@ -0,0 +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","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 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,IAAMC,aAAa,GAAGC,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC;EACnD,IAAMC,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,IAAMgB,UAAU,GAAGX,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC,GAAGJ,aAAa;IAChE,IAAMa,OAAO,GAAGP,IAAI,CAACF,GAAG,CAAC,CAAC;IAC1B,IAAM;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,EAAE,EAAEf,SAAS;MACbgB,EAAE,EAAER,OAAO;MACXS,EAAE,EAAEV,UAAU;MACdD,SAAS;MACTG,QAAQ;MACRS,KAAK,EAAEb;IACT,CAAC,CAAC;;IAEF;IACAc,MAAM,CAACC,aAAa,CAClB,IAAIC,WAAW,CAAC,cAAc,EAAE;MAC9BC,MAAM,EAAE;QACNf;MACF;IACF,CAAC,CACH,CAAC;EACH,CAAC;AACH"}
package/dist/esm/index.js CHANGED
@@ -9,6 +9,8 @@ import * as _auth from "./auth.js";
9
9
  export { _auth as auth };
10
10
  import * as _menu from "./menu/index.js";
11
11
  export { _menu as menu };
12
+ import * as _analytics from "./analytics/index.js";
13
+ export { _analytics as analytics };
12
14
  export var checkPermissions = Object.freeze({
13
15
  checkPermissions: _checkPermissions,
14
16
  preCheckPermissions,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["checkPermissions","_checkPermissions","preCheckPermissions","preCheckPermissionsForBrickOrRoute","MessageDispatcher","_checkInstalledApps","checkInstalledApps","_flowApi","flowApi","_auth","auth","_menu","menu","Object","freeze","messageDispatcher"],"sources":["../../src/index.ts"],"sourcesContent":["// istanbul ignore file\nimport {\n checkPermissions as _checkPermissions,\n preCheckPermissions,\n preCheckPermissionsForBrickOrRoute,\n} from \"./checkPermissions.js\";\n\nimport { MessageDispatcher } from \"./websocket/MessageDispatcher.js\";\n\nexport * as checkInstalledApps from \"./checkInstalledApps.js\";\nexport * as flowApi from \"./flowApi/index.js\";\nexport * as auth from \"./auth.js\";\nexport * as menu from \"./menu/index.js\";\n\nexport const checkPermissions = Object.freeze({\n checkPermissions: _checkPermissions,\n preCheckPermissions,\n preCheckPermissionsForBrickOrRoute,\n});\n\nexport const messageDispatcher = new MessageDispatcher();\n"],"mappings":"AAAA;AACA,SACEA,gBAAgB,IAAIC,iBAAiB,EACrCC,mBAAmB,EACnBC,kCAAkC,QAC7B,uBAAuB;AAE9B,SAASC,iBAAiB,QAAQ,kCAAkC;AAAC,YAAAC,mBAAA,MAEjC,yBAAyB;AAAA,SAAAA,mBAAA,IAAjDC,kBAAkB;AAAA,YAAAC,QAAA,MACL,oBAAoB;AAAA,SAAAA,QAAA,IAAjCC,OAAO;AAAA,YAAAC,KAAA,MACG,WAAW;AAAA,SAAAA,KAAA,IAArBC,IAAI;AAAA,YAAAC,KAAA,MACM,iBAAiB;AAAA,SAAAA,KAAA,IAA3BC,IAAI;AAEhB,OAAO,IAAMZ,gBAAgB,GAAGa,MAAM,CAACC,MAAM,CAAC;EAC5Cd,gBAAgB,EAAEC,iBAAiB;EACnCC,mBAAmB;EACnBC;AACF,CAAC,CAAC;AAEF,OAAO,IAAMY,iBAAiB,GAAG,IAAIX,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","names":["checkPermissions","_checkPermissions","preCheckPermissions","preCheckPermissionsForBrickOrRoute","MessageDispatcher","_checkInstalledApps","checkInstalledApps","_flowApi","flowApi","_auth","auth","_menu","menu","_analytics","analytics","Object","freeze","messageDispatcher"],"sources":["../../src/index.ts"],"sourcesContent":["// istanbul ignore file\nimport {\n checkPermissions as _checkPermissions,\n preCheckPermissions,\n preCheckPermissionsForBrickOrRoute,\n} from \"./checkPermissions.js\";\n\nimport { MessageDispatcher } from \"./websocket/MessageDispatcher.js\";\n\nexport * as checkInstalledApps from \"./checkInstalledApps.js\";\nexport * as flowApi from \"./flowApi/index.js\";\nexport * as auth from \"./auth.js\";\nexport * as menu from \"./menu/index.js\";\nexport * as analytics from \"./analytics/index.js\";\n\nexport const checkPermissions = Object.freeze({\n checkPermissions: _checkPermissions,\n preCheckPermissions,\n preCheckPermissionsForBrickOrRoute,\n});\n\nexport const messageDispatcher = new MessageDispatcher();\n"],"mappings":"AAAA;AACA,SACEA,gBAAgB,IAAIC,iBAAiB,EACrCC,mBAAmB,EACnBC,kCAAkC,QAC7B,uBAAuB;AAE9B,SAASC,iBAAiB,QAAQ,kCAAkC;AAAC,YAAAC,mBAAA,MAEjC,yBAAyB;AAAA,SAAAA,mBAAA,IAAjDC,kBAAkB;AAAA,YAAAC,QAAA,MACL,oBAAoB;AAAA,SAAAA,QAAA,IAAjCC,OAAO;AAAA,YAAAC,KAAA,MACG,WAAW;AAAA,SAAAA,KAAA,IAArBC,IAAI;AAAA,YAAAC,KAAA,MACM,iBAAiB;AAAA,SAAAA,KAAA,IAA3BC,IAAI;AAAA,YAAAC,UAAA,MACW,sBAAsB;AAAA,SAAAA,UAAA,IAArCC,SAAS;AAErB,OAAO,IAAMd,gBAAgB,GAAGe,MAAM,CAACC,MAAM,CAAC;EAC5ChB,gBAAgB,EAAEC,iBAAiB;EACnCC,mBAAmB;EACnBC;AACF,CAAC,CAAC;AAEF,OAAO,IAAMc,iBAAiB,GAAG,IAAIb,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ApiMetric, PartialPageViewMetric } from "./interfaces.js";
2
+ export declare function initialize(api: string): void;
3
+ export declare function createPageView(): void;
4
+ export declare function finishPageView(metric: PartialPageViewMetric): void;
5
+ export declare function earlyFinishPageView(): void;
6
+ export declare function pushApiMetric(metric: ApiMetric): void;
@@ -0,0 +1,10 @@
1
+ import { type HttpError, type HttpRequestConfig, type HttpResponse } from "@next-core/http";
2
+ import type { HttpAnalyticsMeta } from "./interfaces.js";
3
+ declare const symbolHttpAnalytics: unique symbol;
4
+ interface HttpRequestConfigWithAnalyticsMeta extends HttpRequestConfig {
5
+ [symbolHttpAnalytics]?: HttpAnalyticsMeta;
6
+ }
7
+ export declare function onRequest(config: HttpRequestConfigWithAnalyticsMeta): HttpRequestConfig;
8
+ export declare function onResponse(response: HttpResponse, config: HttpRequestConfigWithAnalyticsMeta): HttpResponse;
9
+ export declare function onResponseError(error: HttpError, config: HttpRequestConfigWithAnalyticsMeta): Promise<HttpError>;
10
+ export {};
@@ -0,0 +1,4 @@
1
+ import * as http from "./http.js";
2
+ import * as pageView from "./pageView.js";
3
+ import { initialize } from "./analytics.js";
4
+ export { initialize, http, pageView };
@@ -0,0 +1,36 @@
1
+ export interface HttpAnalyticsMeta {
2
+ st: number;
3
+ time: number;
4
+ perfStartTime: number;
5
+ }
6
+ export interface ApiMetric extends BaseMetric {
7
+ type: "api" | "apiRequest";
8
+ uid: string | undefined;
9
+ time: number;
10
+ duration: number;
11
+ api: string;
12
+ code: number;
13
+ status: number | undefined;
14
+ msg: string;
15
+ traceId: string;
16
+ }
17
+ export interface PageViewMetric extends BaseMetric {
18
+ type: "page";
19
+ apiCount: number;
20
+ maxApiTimeCost: number;
21
+ pageTitle: string | undefined;
22
+ lt: number;
23
+ route: string | undefined;
24
+ pageId: string;
25
+ }
26
+ export type PartialPageViewMetric = Omit<PageViewMetric, "apiCount" | "maxApiTimeCost" | "size" | "pageId">;
27
+ export type ApiPageState = Pick<PageViewMetric, "lt" | "route" | "pageId">;
28
+ export interface BaseMetric {
29
+ type: string;
30
+ st: number;
31
+ et: number;
32
+ _ver: number;
33
+ username: string | undefined;
34
+ page: string;
35
+ size: number;
36
+ }
@@ -0,0 +1,2 @@
1
+ import type { PageViewInfo } from "@next-core/runtime";
2
+ export declare function create(): ({ status, path, pageTitle }: PageViewInfo) => void;
@@ -4,6 +4,7 @@ export * as checkInstalledApps from "./checkInstalledApps.js";
4
4
  export * as flowApi from "./flowApi/index.js";
5
5
  export * as auth from "./auth.js";
6
6
  export * as menu from "./menu/index.js";
7
+ export * as analytics from "./analytics/index.js";
7
8
  export declare const checkPermissions: Readonly<{
8
9
  checkPermissions: typeof _checkPermissions;
9
10
  preCheckPermissions: typeof preCheckPermissions;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-core/easyops-runtime",
3
- "version": "0.6.26",
3
+ "version": "0.6.28",
4
4
  "homepage": "https://github.com/easyops-cn/next-core/tree/v3/packages/easyops-runtime",
5
5
  "license": "GPL-3.0",
6
6
  "repository": {
@@ -45,9 +45,9 @@
45
45
  "@next-api-sdk/micro-app-sdk": "^1.2.1",
46
46
  "@next-api-sdk/micro-app-standalone-sdk": "^1.1.0",
47
47
  "@next-core/cook": "^2.2.5",
48
- "@next-core/http": "^1.1.1",
48
+ "@next-core/http": "^1.1.2",
49
49
  "@next-core/pipes": "^2.0.9",
50
- "@next-core/runtime": "^1.22.4",
50
+ "@next-core/runtime": "^1.22.6",
51
51
  "@next-core/types": "^1.6.1",
52
52
  "@next-core/utils": "^1.5.8",
53
53
  "js-yaml": "^3.14.1",
@@ -56,7 +56,8 @@
56
56
  "devDependencies": {
57
57
  "@next-core/build-next-libs": "^1.0.7",
58
58
  "@next-core/test-next": "^1.0.9",
59
- "jest-websocket-mock": "^2.4.1"
59
+ "jest-websocket-mock": "^2.4.1",
60
+ "whatwg-fetch": "^3.6.18"
60
61
  },
61
- "gitHead": "ca72173601442dd993dc425aaeed85cbd47c6336"
62
+ "gitHead": "77e71491fb621a73e40d4a39ef564d327febde97"
62
63
  }