fix(sdk): §4.5 红线补全(act/重放包裹)+ beacon-false 丢批计数 + 空闲负向测试 + es2020
- events.ts:act 回调与 visibilitychange 监听体包 try/catch(字面红线) - transport.ts:sendBeacon 返回 false(64KB 超限等)按批事件数计 dropped ——与 stringify 丢包计数对称的缺口 - index.ts:顶层队列重放双层包裹,单个坏条目只跳过自身不吞后续 init/track - 测试:30s 空闲负向(active_ms=29000 后停止)、beacon-false 丢批;44→46 - build.mjs target es2018→es2020(代码依赖 globalThis,目标诚实化) Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
+10
-2
@@ -10,7 +10,11 @@ export function startPageTracking(t: Transport) {
|
||||
let activeMs = 0;
|
||||
let lastAct = Date.now();
|
||||
const act = () => {
|
||||
lastAct = Date.now();
|
||||
try {
|
||||
lastAct = Date.now();
|
||||
} catch {
|
||||
/* 静默(spec §4.5 红线:监听器异常不得冒泡到宿主页) */
|
||||
}
|
||||
};
|
||||
["pointerdown", "keydown", "wheel", "touchstart"].forEach((e) =>
|
||||
document.addEventListener(e, act, { passive: true, capture: true })
|
||||
@@ -59,7 +63,11 @@ export function startPageTracking(t: Transport) {
|
||||
}
|
||||
};
|
||||
document.addEventListener("visibilitychange", () => {
|
||||
if (document.hidden) close();
|
||||
try {
|
||||
if (document.hidden) close();
|
||||
} catch {
|
||||
/* 静默:document.hidden 读取本身也不得冒泡异常(close 内部已自包) */
|
||||
}
|
||||
});
|
||||
window.addEventListener("pagehide", close);
|
||||
}
|
||||
|
||||
+15
-2
@@ -49,6 +49,19 @@ function dispatch(cmd: string, arg?: unknown) {
|
||||
}
|
||||
}
|
||||
|
||||
// 必须先替换全局入口再重放队列:重放期间宿主新调用直接进 dispatch,不再排队
|
||||
// 必须先替换全局入口再重放队列:重放期间宿主新调用直接进 dispatch,不再排队。
|
||||
// 宿主队列数据不可信(非可迭代项等)——模块顶层也不得抛(spec §4.5 唯一未保护路径);
|
||||
// 单个坏条目只跳过自身,不吞掉后续排队的 init/track
|
||||
g.ctk = dispatch;
|
||||
q.forEach(([c, a]) => dispatch(c, a));
|
||||
try {
|
||||
q.forEach((entry) => {
|
||||
try {
|
||||
const [c, a] = entry as Cmd;
|
||||
dispatch(c, a);
|
||||
} catch {
|
||||
/* 静默:坏条目跳过,继续重放 */
|
||||
}
|
||||
});
|
||||
} catch {
|
||||
/* 静默:q 本身不可迭代/无 forEach——放弃重放,入口已接管 */
|
||||
}
|
||||
|
||||
@@ -49,10 +49,12 @@ export class Transport {
|
||||
events,
|
||||
});
|
||||
if (beacon && navigator.sendBeacon) {
|
||||
navigator.sendBeacon(
|
||||
// 返回 false=浏览器拒收(队列满/载荷超 64KB 等)→ 整批丢,须计 dropped
|
||||
const ok = navigator.sendBeacon(
|
||||
this.cfg.endpoint,
|
||||
new Blob([body], { type: "text/plain" })
|
||||
);
|
||||
if (!ok) this.dropped += n;
|
||||
return;
|
||||
}
|
||||
this.send(body, events.length);
|
||||
|
||||
Reference in New Issue
Block a user