import { Transport, ReportItemWithContext, TransportOptions } from '@tencent/merlin-core'; import { BehaviorReporter, BehaviorReportItemData, serializeKvReportValue } from '@tencent/merlin-behavior'; import { waitJsapiReady } from '../utils'; export interface KvTransportOptions extends TransportOptions { /** mmdata 协议 Id */ logId: number; /** 格式化函数,将原始上报项转换为 Mmdata 字段数组,若返回 `false`,则起到 filter 的作用 */ parser: (record: ReportItemWithContext) => any[] | false; } /** kvReport 上报器 */ export class KvTransport extends Transport { protected logId: number; protected parser: (record: ReportItemWithContext) => any[] | false; constructor(options: KvTransportOptions) { super({ // KV 不支持批量上报,立刻上报即可 bufferSize: 0, flushInterval: 0, ...options, }); this.logId = options.logId; this.parser = options.parser; } protected async send(records: ReportItemWithContext[]) { await waitJsapiReady(); return records.map((record) => { const parsedRecord = this.parser(record); if (parsedRecord === false) { // 跳过此项 return Promise.resolve(); } const value = serializeKvReportValue(parsedRecord); globalThis.WeixinJSBridge?.invoke('kvReport', { id: this.logId, value, is_important: 1, is_report_now: 1, }); return Promise.resolve(); }); } }