uniapp-tracing
Version:
uniapp小程序端埋点
71 lines (60 loc) • 2.06 kB
JavaScript
// Config
import { tracingQueueKey } from "../config/cache-keys";
import { sendOption } from "../config/setting";
import { platform, deviceId, initOption } from "../config/constants";
// Hooks
import { getCookie, removeCookie, setCookie } from "../hooks/useCookie";
import useRequest from "../hooks/useRequest";
/**
* 获取本地缓存的埋点队列数据
* @returns 埋点队列数据
*/
function getCurrentQueue() {
return getCookie(tracingQueueKey) || [];
}
/**
* 获取要发送至服务器的埋点数据
* @param {Array} eventInfo 埋点队列数据
*/
function formatTracingData(eventInfo = []) {
// 注意:针对超充小程序的缓存拿userId
const { userId = "" } = getCookie("KYI_USERINFO") || {};
const { appName } = initOption;
const basicInfo = { appName, platform, deviceId, userId };
return { basicInfo, eventInfo };
}
/**
* 发送埋点
* 注意:失败时合并当前缓存数据一并发送
* @param {Array} eventInfo 要发送的埋点事件
*/
async function sendQueue(eventInfo = []) {
const data = formatTracingData(eventInfo);
try {
// 删除队列记录再发送至服务器,避免失败时再发送时埋点信息重复
removeCookie(tracingQueueKey);
await useRequest(data);
} catch (error) {
// 发送失败再缓存合并至本地
const currentQueue = getCurrentQueue();
const queue = [...eventInfo, ...currentQueue];
setCookie(tracingQueueKey, queue);
}
}
/**
* 埋点数据处理延迟发送
* 1.小于最大缓存数,记录于本地缓存,< max
* 2.达到最大缓存数发送埋点数据,>= max
* @param {Object} event 一个类型的埋点数据
*/
async function handleQueue(event = {}) {
const eventInfo = getCurrentQueue();
eventInfo.push(event);
// 小于最大缓存数时,记录在本地缓存
if (eventInfo.length < sendOption.max) {
setCookie(tracingQueueKey, eventInfo);
return;
}
sendQueue(eventInfo);
}
export default handleQueue;