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:
@@ -118,6 +118,21 @@ describe("events / startPageTracking", () => {
|
||||
expect(fetchMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("30s 无活动不累计:单次活动后空闲 35s → active_ms 恰为 29000 后停止", async () => {
|
||||
window.history.pushState({}, "", "/pidle");
|
||||
const t = mkTransport("site-idle");
|
||||
startPageTracking(t);
|
||||
document.dispatchEvent(new Event("pointerdown")); // 仅此一次活动
|
||||
await vi.advanceTimersByTimeAsync(35_000);
|
||||
|
||||
window.dispatchEvent(new Event("pagehide"));
|
||||
const bodies = await beaconBodies("site-idle");
|
||||
expect(bodies).toHaveLength(1);
|
||||
const stay = bodies[0].events.find((e) => e.event_name === "page_stay")!;
|
||||
// tick 于 +1s..+29s 时 Date.now()-lastAct<30000 成立(+30s 起等于 30000 不成立)
|
||||
expect(stay.properties.active_ms).toBe(29000);
|
||||
});
|
||||
|
||||
it("隐藏→恢复→再隐藏:两段 stay 各自正确(第二段从 0 重新累计)", async () => {
|
||||
window.history.pushState({}, "", "/p6");
|
||||
const t = mkTransport("site-t6");
|
||||
|
||||
@@ -177,6 +177,16 @@ describe("transport", () => {
|
||||
expect(t.dropped).toBe(1); // maxRetry=0 耗尽 → 按事件数丢弃
|
||||
});
|
||||
|
||||
it("sendBeacon 返回 false(队列满/载荷超限)按本批事件数计 dropped", () => {
|
||||
vi.stubGlobal("navigator", { sendBeacon: vi.fn().mockReturnValue(false) });
|
||||
const t = new Transport(mkCfg({ batchSize: 10 }));
|
||||
t.push({ event_id: "e1" });
|
||||
t.push({ event_id: "e2" });
|
||||
t.flush(true);
|
||||
expect(t.dropped).toBe(2); // 信标被浏览器拒收(64KB 上限等)→ 整批丢
|
||||
expect(fetchMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("stringify 抛错(track 引入宿主可控对象):已换出批次按事件数计 dropped", () => {
|
||||
const t = new Transport(mkCfg({ batchSize: 10, flushMs: 60000 }));
|
||||
const bad: { event_id: string; self?: unknown } = { event_id: "bad" };
|
||||
|
||||
Reference in New Issue
Block a user