@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.
- package/dist/cjs/analytics/analytics.js +94 -0
- package/dist/cjs/analytics/analytics.js.map +1 -0
- package/dist/cjs/analytics/http.js +104 -0
- package/dist/cjs/analytics/http.js.map +1 -0
- package/dist/cjs/analytics/index.js +20 -0
- package/dist/cjs/analytics/index.js.map +1 -0
- package/dist/cjs/analytics/interfaces.js +6 -0
- package/dist/cjs/analytics/interfaces.js.map +1 -0
- package/dist/cjs/analytics/pageView.js +47 -0
- package/dist/cjs/analytics/pageView.js.map +1 -0
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/analytics/analytics.js +79 -0
- package/dist/esm/analytics/analytics.js.map +1 -0
- package/dist/esm/analytics/http.js +96 -0
- package/dist/esm/analytics/http.js.map +1 -0
- package/dist/esm/analytics/index.js +5 -0
- package/dist/esm/analytics/index.js.map +1 -0
- package/dist/esm/analytics/interfaces.js +2 -0
- package/dist/esm/analytics/interfaces.js.map +1 -0
- package/dist/esm/analytics/pageView.js +42 -0
- package/dist/esm/analytics/pageView.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/types/analytics/analytics.d.ts +6 -0
- package/dist/types/analytics/http.d.ts +10 -0
- package/dist/types/analytics/index.d.ts +4 -0
- package/dist/types/analytics/interfaces.d.ts +36 -0
- package/dist/types/analytics/pageView.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +6 -5
|
@@ -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":";;;;;;;;;;AAOA,IAAIA,WAAW,GAAG,KAAK;AACvB,IAAIC,SAA8B,GAAG,IAAI;AACzC,IAAIC,eAAe,GAAG,IAAI;AAC1B,MAAMC,iBAA8B,GAAG,EAAE;AAEzC,MAAMC,UAA0C,GAAG,EAAE;AAE9C,SAASC,UAAUA,CAACC,GAAW,EAAE;EACtC,IAAIN,WAAW,EAAE;IACf;EACF;EACAA,WAAW,GAAG,IAAI;EAElB,SAASO,MAAMA,CAAA,EAAG;IAChB,MAAMC,OAAO,GAAG;MACdC,IAAI,EAAE;IACR,CAAC;IACD,MAAMC,IAAI,GAAG;MACXC,KAAK,EAAE,uBAAuB;MAC9BC,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;MACDF,IAAI,EAAEN;IACR,CAAC;IACD,MAAMS,IAAI,GAAG,IAAIC,IAAI,CAAC,CAACC,IAAI,CAACC,SAAS,CAACN,IAAI,CAAC,CAAC,EAAEF,OAAO,CAAC;IACtDJ,UAAU,CAACa,MAAM,GAAG,CAAC;IAErBC,MAAM,CAACC,SAAS,CAACC,UAAU,CAACd,GAAG,EAAEO,IAAI,CAAC;EACxC;EAEAK,MAAM,CAACG,gBAAgB,CAAC,cAAc,EAAEd,MAAM,EAAE,KAAK,CAAC;AACxD;AAEO,SAASe,cAAcA,CAAA,EAAG;EAC/BnB,iBAAiB,CAACc,MAAM,GAAG,CAAC;EAC5BhB,SAAS,GAAG,IAAI;AAClB;AAEO,SAASsB,cAAcA,CAACC,MAA6B,EAAE;EAC5D,MAAMC,MAAM,GAAGC,YAAY,CAAC,CAAC;EAC7B,MAAM;IAAEC,EAAE;IAAEC;EAAM,CAAC,GAAGJ,MAAM;EAC5BvB,SAAS,GAAG;IAAE0B,EAAE;IAAEC,KAAK;IAAEH;EAAO,CAAC;EAEjCrB,UAAU,CAACyB,IAAI,CAAC;IACd,GAAGL,MAAM;IACTC,MAAM;IACNK,QAAQ,EAAE3B,iBAAiB,CAACc,MAAM;IAClCc,cAAc,EAAEC,IAAI,CAACC,GAAG,CACtB,CAAC,EACD,GAAG9B,iBAAiB,CAAC+B,GAAG,CAAE5B,GAAG,IAAKA,GAAG,CAAC6B,QAAQ,CAChD,CAAC;IACDC,IAAI,EAAEjC,iBAAiB,CACpB+B,GAAG,CAAE5B,GAAG,IAAKA,GAAG,CAAC8B,IAAI,CAAC,CACtBC,MAAM,CAAED,IAAI,IAAKA,IAAI,GAAG,CAAC,CAAC,CAC1BE,MAAM,CAAC,CAACC,IAAI,EAAEC,OAAO,KAAKD,IAAI,GAAGC,OAAO,EAAE,CAAC;EAChD,CAAC,CAAC;EAEF,KAAK,MAAMC,IAAI,IAAItC,iBAAiB,EAAE;IACpCC,UAAU,CAACyB,IAAI,CAAC;MACd,GAAGY,IAAI;MACP,GAAGxC;IACL,CAAC,CAAC;EACJ;EACAE,iBAAiB,CAACc,MAAM,GAAG,CAAC;AAC9B;AAEO,SAASyB,mBAAmBA,CAAA,EAAG;EACpCtC,UAAU,CAACyB,IAAI,CAAC,GAAG1B,iBAAiB,CAAC;EACrCA,iBAAiB,CAACc,MAAM,GAAG,CAAC;AAC9B;AAEO,SAAS0B,aAAaA,CAACnB,MAAiB,EAAE;EAC/C,IAAIvB,SAAS,EAAE;IACbG,UAAU,CAACyB,IAAI,CAAC;MACd,GAAGL,MAAM;MACTf,IAAI,EAAE,YAAY;MAClB,GAAGR;IACL,CAAC,CAAC;EACJ,CAAC,MAAM;IACLE,iBAAiB,CAAC0B,IAAI,CAACL,MAAM,CAAC;EAChC;AACF;;AAEA;AACA,SAASE,YAAYA,CAAA,EAAG;EACtB,MAAMkB,GAAG,GAAGC,GAAG,CAACC,eAAe,CAAC,IAAIhC,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7C,IAAIiC,IAAI,GAAGH,GAAG,CAACI,SAAS,CAACJ,GAAG,CAACK,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EAClDJ,GAAG,CAACK,eAAe,CAACN,GAAG,CAAC;EACxB;EACA,IAAI1C,eAAe,EAAE;IACnB6C,IAAI,GAAG,KAAK,GAAGA,IAAI;IACnB7C,eAAe,GAAG,KAAK;EACzB;EACA,OAAO6C,IAAI;AACb"}
|
|
@@ -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 @@
|
|
|
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({
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -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;;
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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,
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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;
|
|
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,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
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
48
|
+
"@next-core/http": "^1.1.2",
|
|
49
49
|
"@next-core/pipes": "^2.0.9",
|
|
50
|
-
"@next-core/runtime": "^1.22.
|
|
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": "
|
|
62
|
+
"gitHead": "77e71491fb621a73e40d4a39ef564d327febde97"
|
|
62
63
|
}
|