@arms/rum-core
ARMS RUM SDK 多端方案的核心抽象层,为各平台 shell(browser / uniapp / miniapp / minigame / electron / reactnative 等)提供统一的角色模型、事件协议与跨运行时工具。
角色模型
- Client:装载并编排
Collector/Processor/Reporter,串联事件管线。 - Context:运行时上下文,承载
config/session/views/emitter/identity。 - Shell:对外 API 入口,提供
sendCustom/sendView/sendException/sendResource/sendAction/setUser等。 - Identity:业务身份状态机(产品分析),维护登录 / 匿名状态、属性操作折叠、匿名区间回填与 outbox 重发。
- ConfigManager:本地+远端配置编排,支持
launch-first/remote-first两种模式。 - Collector / Processor / Reporter:平台扩展点,分别负责数据采集、加工、上报。
事件流:Collector → sendEvent → Processor 链 → Reporter(队列 / 合并 / 按会话与登录身份分组打包 / 重试) → Transport。
Shell 对外 API
| API | 说明 |
|---|---|
sendCustom(payload) | 自定义业务事件(name / type 必填) |
sendAction(payload) | 自定义行为事件(name 必填,超 100 字符截断;group / properties 可选) |
sendView(payload) | 自定义视图性能打点(type='custom' 时 t1 / t2 / t3 至少提供一个) |
sendException(payload) | 异常上报(接受 RumExceptionEvent | Error,source 默认 'custom') |
sendResource(payload) | 资源 / 请求上报(name / type / duration 必填) |
startView(name, options?) | 手动开启 view(配合 trackViewsManually;同名去重,创建新 view 时结束上一个并上报 view 事件) |
setUser(user) | 登录 / 切换用户(name + properties / propertiesOnce) |
setUserProperties(props, propertiesOnce?) / unsetUserProperties(keys) | 身份属性补充 / 删除(未登录时暂存,登录时随身份事件一起上报) |
reset() | 退出登录(清除本地身份状态;匿名用户 ID 与当前会话不变) |
sendEvent(event, options?) | 底层事件入口(面向 shell / 高级用法);options.immediate 入队后立即 flush,options.single 独立打包上报 |
init完成前的setUser/sendAction等 Shell 调用会被缓存(上限 50 条),init 完成后按调用顺序回放;身份事件不受会话采样影响(未命中采样的会话仅发送identify事件)。
关键工具(节选)
interceptFunction/restoreFunction:函数拦截支持多订阅共存——重复拦截同一方法仅追加订阅、不再嵌套代理,restoreFunction可按订阅者逐个退订;支持isPrototype声明回调的this语义。parseTracingContext/makeTracingHeaders:多协议 Trace 上下文解析与生成(traceparent / b3 / b3multi / jaeger / sw8),兼容Headers实例与普通对象、键名大小写不敏感。parseActionProperties/verifyProperties:埋点属性解析与校验(key ≤ 50 字符、string 值 ≤ 2000 字符、单次 ≤ 20 项;可选allowBoolean支持布尔值)。
支持运行时
浏览器(ES2017+,不含 IE)、Node.js 16+、Deno、Bun、Electron、React Native 0.68+、微信/支付宝/字节小程序(基础库 2.10+ 同等能力)、uni-app 3.x。
core 自身不依赖任何浏览器或 Node 专属 API(window / document / fetch / localStorage / XMLHttpRequest 等);host API 通过 env/ 抽象由 shell 注入。
开发
npm run build # 产出 lib/ (CJS) + es/ (ESM)
npm test # 单元测试(先 build 后 test,重构后改为直接跑 ts 源码)