@whnz/frontend-experience-core 1.0.3 → 1.0.5
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/index.d.ts +1 -1
- package/dist/index.js +30 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -40,6 +40,7 @@ function initReporter(fn) {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
function report(event) {
|
|
43
|
+
console.log("reporting event", event);
|
|
43
44
|
if (!reporterFn) return;
|
|
44
45
|
if (!shouldSample()) return;
|
|
45
46
|
const payload = {
|
|
@@ -53,26 +54,48 @@ function report(event) {
|
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
var queue = [];
|
|
57
|
+
var scheduled = false;
|
|
56
58
|
var flushing = false;
|
|
57
59
|
function enqueue(payload) {
|
|
58
60
|
queue.push(payload);
|
|
59
61
|
scheduleFlush();
|
|
60
62
|
}
|
|
61
63
|
function scheduleFlush() {
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
+
if (scheduled) return;
|
|
65
|
+
scheduled = true;
|
|
64
66
|
requestIdleCallback(
|
|
65
67
|
() => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
scheduled = false;
|
|
69
|
+
flushLoop();
|
|
68
70
|
},
|
|
69
71
|
{ timeout: 2e3 }
|
|
70
72
|
);
|
|
71
73
|
}
|
|
72
|
-
function
|
|
74
|
+
function flushLoop() {
|
|
75
|
+
if (flushing) return;
|
|
76
|
+
flushing = true;
|
|
77
|
+
try {
|
|
78
|
+
while (queue.length) {
|
|
79
|
+
const batch = queue.splice(0, 20);
|
|
80
|
+
reporterFn == null ? void 0 : reporterFn(batch.length === 1 ? batch[0] : batch);
|
|
81
|
+
if (queue.length) {
|
|
82
|
+
scheduleFlush();
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} finally {
|
|
87
|
+
flushing = false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
window.addEventListener("visibilitychange", () => {
|
|
91
|
+
if (document.visibilityState === "hidden") {
|
|
92
|
+
flushSync();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
function flushSync() {
|
|
73
96
|
if (!queue.length) return;
|
|
74
|
-
const batch = queue.splice(0
|
|
75
|
-
reporterFn == null ? void 0 : reporterFn(batch
|
|
97
|
+
const batch = queue.splice(0);
|
|
98
|
+
reporterFn == null ? void 0 : reporterFn(batch);
|
|
76
99
|
}
|
|
77
100
|
|
|
78
101
|
// src/init.ts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context.ts","../src/sampler.ts","../src/reporter.ts","../src/init.ts"],"names":[],"mappings":";AACA,IAAM,OAAA,GAA6B;AAAA,EACjC,GAAA,EAAK,EAAA;AAAA,EACL,OAAA,EAAS,EAAA;AAAA,EACT,GAAA,EAAK,MAAA;AAAA,EACL,KAAA,EAAO;AACT,CAAA;AACO,SAAS,YAAY,OAAA,EAAqC;AAC/D,EAAA,MAAA,CAAO,MAAA,CAAO,SAAS,OAAO,CAAA;AAChC;AACO,SAAS,SAAS,KAAA,EAAe;AACtC,EAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA;AAClB;AACO,SAAS,UAAU,MAAA,EAAgB;AACxC,EAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AACnB;AACO,SAAS,UAAA,GAAgC;AAC9C,EAAA,OAAO,EAAE,GAAG,OAAA,EAAQ;AACtB;;;AClBA,IAAI,UAAA,GAAa,CAAA;AACV,SAAS,WAAA,CAAY,OAAO,CAAA,EAAG;AACpC,EAAA,UAAA,GAAa,IAAA;AACf;AACO,SAAS,YAAA,GAAwB;AACtC,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,IAAA;AAC5B,EAAA,OAAO,IAAA,CAAK,QAAO,GAAI,UAAA;AACzB;;;ACJA,IAAI,UAAA,GAA4C,IAAA;AACzC,SAAS,aAAa,EAAA,EAAqC;AAChE,EAAA,IAAI,OAAO,OAAO,QAAA,EAAU;AAC1B,IAAA,UAAA,GAAa,CAAC,KAAA,KAAU;AACtB,MAAA,SAAA,CAAU,UAAA,CAAW,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IAChD,CAAA;AAAA,EACF,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,EAAA;AAAA,EACf;AACF;AACO,SAAS,OAAO,KAAA,EAAwB;AAC7C,EAAA,IAAI,CAAC,UAAA,EAAY;AACjB,EAAA,IAAI,CAAC,cAAa,EAAG;AACrB,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAG,KAAA;AAAA,IACH,GAAG,UAAA,EAAW;AAAA,IACd,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA;AAAI,GACzC;AACA,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,EACjB,SAAS,CAAA,EAAG;AAAA,EAEZ;AACF;AACA,IAAM,QAAe,EAAC;
|
|
1
|
+
{"version":3,"sources":["../src/context.ts","../src/sampler.ts","../src/reporter.ts","../src/init.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { ExperienceContext } from './types';\nconst context: ExperienceContext = {\n app: '',\n version: '',\n env: 'prod',\n route: '/',\n};\nexport function initContext(partial: Partial<ExperienceContext>) {\n Object.assign(context, partial);\n}\nexport function setRoute(route: string) {\n context.route = route;\n}\nexport function setUserId(userId: string) {\n context.userId = userId;\n}\nexport function getContext(): ExperienceContext {\n return { ...context };\n}\n","let sampleRate = 1;\nexport function initSampler(rate = 1) {\n sampleRate = rate;\n}\nexport function shouldSample(): boolean {\n if (sampleRate >= 1) return true;\n return Math.random() < sampleRate;\n}\n","import { ExperienceEvent } from './types';\nimport { getContext } from './context';\nimport { shouldSample } from './sampler';\nlet reporterFn: ((event: any) => void) | null = null;\nexport function initReporter(fn: string | ((event: any) => void)) {\n if (typeof fn === 'string') {\n reporterFn = (event) => {\n navigator.sendBeacon(fn, JSON.stringify(event));\n };\n } else {\n reporterFn = fn;\n }\n}\nexport function report(event: ExperienceEvent) {\n console.log('reporting event', event);\n if (!reporterFn) return;\n if (!shouldSample()) return;\n const payload = {\n ...event,\n ...getContext(),\n timestamp: event.timestamp || Date.now(),\n };\n try {\n enqueue(payload);\n } catch (e) {\n // core 永远不能抛异常\n }\n}\nconst queue: any[] = [];\n\nlet scheduled = false;\nlet flushing = false;\n\nfunction enqueue(payload: any) {\n queue.push(payload);\n scheduleFlush();\n}\n\nfunction scheduleFlush() {\n if (scheduled) return;\n scheduled = true;\n\n requestIdleCallback(\n () => {\n scheduled = false;\n flushLoop();\n },\n { timeout: 2000 },\n );\n}\n\nfunction flushLoop() {\n if (flushing) return;\n flushing = true;\n\n try {\n while (queue.length) {\n const batch = queue.splice(0, 20);\n reporterFn?.(batch.length === 1 ? batch[0] : batch);\n\n // 给浏览器一次喘息机会(避免长任务)\n if (queue.length) {\n scheduleFlush();\n break;\n }\n }\n } finally {\n flushing = false;\n }\n}\n\nwindow.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n flushSync();\n }\n});\n\nfunction flushSync() {\n if (!queue.length) return;\n const batch = queue.splice(0);\n reporterFn?.(batch);\n}\n","import { InitCoreOptions } from './types';\nimport { initContext } from './context';\nimport { initReporter } from './reporter';\nimport { initSampler } from './sampler';\n\nlet inited = false;\nexport function initCore(options: InitCoreOptions) {\n if (inited) return;\n inited = true;\n initContext({\n app: options.app,\n version: options.version,\n env: options.env,\n route: location.pathname,\n });\n initReporter(options.reporter);\n initSampler(options.sampleRate ?? 1);\n}\n"]}
|