feat(sdk): 0.2.0接线——归属快照/区间停留/清洗对齐/响应契约全链路
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
+7
-6
@@ -2,11 +2,11 @@ import type { Transport } from "./transport";
|
||||
import { pageContext } from "./context";
|
||||
import { uuid } from "./util";
|
||||
|
||||
// 来源信号(Navigation Timing L2):startPageTracking 仅 init 时调用一次,
|
||||
// 读一次 Navigation Entry 即冻结进 page_view——nav_type ∈ navigate/reload/
|
||||
// 来源信号(Navigation Timing L2):page_view 构造时读取,
|
||||
// 读一次 Navigation Entry 即冻结——nav_type ∈ navigate/reload/
|
||||
// back_forward(浏览器不给则空串);activationStart>0 = 页面由预渲染激活
|
||||
// (AI 搜索/聚合器预加载的强指纹)。任何环境异常静默(spec §4.5 红线)。
|
||||
// T6 起导出供 page.ts 的 page_view 复用(T7 拆分后保留于此)。
|
||||
// page.ts 的 page_view 复用本函数(T6 起导出)。
|
||||
export function navSignals(): { nav_type: string; prerendering: boolean } {
|
||||
try {
|
||||
const nav = performance.getEntriesByType("navigation")[0] as
|
||||
@@ -19,9 +19,10 @@ export function navSignals(): { nav_type: string; prerendering: boolean } {
|
||||
|
||||
// T7 拆分:有效停留(区间制重做)移至 stay.ts(startStayTracking 与 PageSession
|
||||
// 协作:单调时钟区间 / 15s 周期切分 / hidden-pagehide 共享结算幂等)。
|
||||
// 本函数保留 v1 接线兼容(index.ts 过渡期仍调用,T10 改接 page.ts+stay.ts):
|
||||
// 只发 page_view,并在 hidden/pagehide 时 flush(true)(沿 v1 卸载 beacon 路径,
|
||||
// 防首屏事件随页面关闭丢失),不再产生 page_stay。
|
||||
// T10 起 index.ts 改接 page.ts+stay.ts,本函数不再接线——保留是因为
|
||||
// events.test.ts 仍守 v1 行为基线(page_view 形态与卸载 flush 路径)。
|
||||
// 行为:只发 page_view,并在 hidden/pagehide 时 flush(true)(沿 v1 卸载
|
||||
// beacon 路径,防首屏事件随页面关闭丢失),不产生 page_stay。
|
||||
// 红线:任何回调异常不得冒泡到宿主页(spec §4.5)。
|
||||
export function startPageTracking(t: Transport) {
|
||||
// emit 内 pageContext() 只取一次(pc)复用于 path/title——避免多次读取间
|
||||
|
||||
+14
-2
@@ -1,7 +1,8 @@
|
||||
import { uuid } from "./util";
|
||||
import { mergeConfig } from "./config";
|
||||
import { Transport } from "./transport";
|
||||
import { startPageTracking } from "./events";
|
||||
import { startPageSession } from "./page";
|
||||
import { startStayTracking } from "./stay";
|
||||
import { buildEnvContext, collectHighEntropyHints, pageContext } from "./context";
|
||||
import { SDK_VERSION, BUILD_ID, SCHEMA_VERSION, CONFIG_VERSION } from "./types";
|
||||
import type { CtkConfig } from "./config";
|
||||
@@ -44,6 +45,14 @@ function dispatch(cmd: string, arg?: unknown) {
|
||||
/* 静默:绝不冒泡到宿主页(spec §4.5) */
|
||||
});
|
||||
transport = new Transport(cfg);
|
||||
// 0.2.0 接线(T10):PageSession 发初始 page_view(携带归属快照)并安装
|
||||
// SPA 切段/bfcache/交互 hook;stay.ts 区间停留(onClose 已挂钩
|
||||
// route_change/pagehide 结算)。交互监听双份属过渡期设计(page.ts 用于
|
||||
// 会话恢复判定、stay.ts 用于活动窗口判定)——8 个 passive capture 监听
|
||||
// 性能可忽略,不合并(合并会耦合两个模块的测试,收益低)。
|
||||
const ps = startPageSession(transport);
|
||||
// sdk_loaded 先于 startStayTracking 入队:即使 stay 极端环境注册抛错,
|
||||
// init 心跳(版本组诊断)也不丢失(dispatch 外层 catch 只兜异常不补事件)
|
||||
transport.push({
|
||||
event_id: uuid(),
|
||||
event_name: "sdk_loaded",
|
||||
@@ -51,8 +60,11 @@ function dispatch(cmd: string, arg?: unknown) {
|
||||
path: pc.path,
|
||||
title: pc.title,
|
||||
properties: { sdk_version: SDK_VERSION, build_id: BUILD_ID, schema_version: SCHEMA_VERSION, config_version: CONFIG_VERSION },
|
||||
// 顶层归属快照展开(...a 含 V1.1 预留 null 位——attribution() 将来填
|
||||
// 实值时事件自动携带,不会静默漏);seq 在初始 page_view 之后自增
|
||||
...ps.attribution(),
|
||||
});
|
||||
startPageTracking(transport);
|
||||
startStayTracking(transport, ps);
|
||||
} else if (cmd === "track" && transport) {
|
||||
transport.push(arg as object);
|
||||
} else if (cmd === "flush" && transport) {
|
||||
|
||||
Reference in New Issue
Block a user