telemetry.js 1.09 KB
import * as v from 'valibot'

/**
 * 埋点事件信封 —— 前端 `@drama/telemetry` SDK 上报的原始事件形态,
 * 也是后端 `@drama/telemetry-ingest` 校验落库的单一事实来源。
 *
 * 字段与前端 `EventEnvelope`(`@drama/telemetry` 的 `envelope.js`)逐项对齐:
 * 同一份契约前端产、后端校验,避免前后端事件形态漂移。`props` 用 `record` 以
 * 容纳任意业务属性(一期不约束业务字段,只保证信封骨架完整)。
 *
 * `ts` 是客户端事件发生时刻的 epoch 毫秒数(number),非 DB DATETIME 字段,保持 number。
 *
 * @typedef {{
 *   name: string,
 *   props: Record<string, unknown>,
 *   ts: number,
 *   device_id: string,
 *   anon_id: string | null,
 *   locale: string,
 *   session_id: string,
 *   sdk_version: string
 * }} TelemetryEventT
 */
export const TelemetryEvent = v.object({
  name: v.string(),
  props: v.record(v.string(), v.unknown()),
  ts: v.number(),
  device_id: v.string(),
  anon_id: v.nullable(v.string()),
  locale: v.string(),
  session_id: v.string(),
  sdk_version: v.string(),
})