UNPKG

clarity-decode

Version:

An analytics library that uses web page interactions to generate aggregated insights

124 lines (120 loc) 5.98 kB
import { Data } from "clarity-js"; import { Constant, DataEvent } from "../types/data"; export function decode(tokens: Data.Token[]): DataEvent { let time = tokens[0] as number; let event = tokens[1] as Data.Event; switch (event) { case Data.Event.Ping: let ping: Data.PingData = { gap: tokens[2] as number }; return { time, event, data: ping }; case Data.Event.Limit: let limit: Data.LimitData = { check: tokens[2] as number }; return { time, event, data: limit }; case Data.Event.Custom: let custom: Data.CustomData = { key: tokens[2] as string, value: tokens[3] as string }; return { time, event, data: custom }; case Data.Event.Upgrade: let upgrade: Data.UpgradeData = { key: tokens[2] as string }; return { time, event, data: upgrade }; case Data.Event.Upload: let upload: Data.UploadData = { sequence: tokens[2] as number, attempts: tokens[3] as number, status: tokens[4] as number }; return { time, event, data: upload }; case Data.Event.Metric: let m = 2; // Start from 3rd index since first two are used for time & event let metrics: Data.MetricData = {}; while (m < tokens.length) { metrics[tokens[m++] as number] = tokens[m++] as number; } return { time, event, data: metrics }; case Data.Event.Dimension: let d = 2; // Start from 3rd index since first two are used for time & event let dimensions: Data.DimensionData = {}; while (d < tokens.length) { dimensions[tokens[d++] as number] = tokens[d++] as string[]; } return { time, event, data: dimensions }; case Data.Event.Summary: let s = 2; // Start from 3rd index since first two are used for time & event let summary: Data.SummaryData = {}; while (s < tokens.length) { let key = tokens[s++] as number; let values = tokens[s++] as number[]; summary[key] = []; for (let i = 0; i < values.length - 1; i += 2) { summary[key].push([values[i], values[i + 1]]); } } return { time, event, data: summary }; case Data.Event.Baseline: const tokenLength = tokens.length; let baselineData: Data.BaselineData = { visible: tokens[2] as number, docWidth: tokens[3] as number, docHeight: tokens[4] as number, screenWidth: tokens[5] as number, screenHeight: tokens[6] as number, scrollX: tokens[7] as number, scrollY: tokens[8] as number, pointerX: tokens[9] as number, pointerY: tokens[10] as number, activityTime: tokens[11] as number, scrollTime: tokenLength > 12 ? tokens[12] as number: null, pointerTime: tokenLength > 13 ? tokens[13] as number: null, moveX: tokenLength > 14 ? tokens[14] as number: null, moveY: tokenLength > 15 ? tokens[15] as number: null, moveTime: tokenLength > 16 ? tokens[16] as number: null, downX: tokenLength > 17 ? tokens[17] as number: null, downY: tokenLength > 18 ? tokens[18] as number: null, downTime: tokenLength > 19 ? tokens[19] as number: null, upX: tokenLength > 20 ? tokens[20] as number: null, upY: tokenLength > 21 ? tokens[21] as number: null, upTime: tokenLength > 22 ? tokens[22] as number: null, pointerPrevX: tokenLength > 23 ? tokens[23] as number: null, pointerPrevY: tokenLength > 24 ? tokens[24] as number: null, pointerPrevTime: tokenLength > 25 ? tokens[25] as number: null, } return { time, event, data: baselineData }; case Data.Event.Variable: let v = 2; // Start from 3rd index since first two are used for time & event let variables: Data.VariableData = {}; while (v < tokens.length) { variables[tokens[v++] as string] = typeof tokens[v + 1] == Constant.String ? [tokens[v++] as string] : tokens[v++] as string[]; } return { time, event, data: variables }; case Data.Event.Extract: let e = 2; // Start from 3rd index since first two are used for time & event let extract: Data.ExtractData = {}; while (e < tokens.length) { // For backward compatibility from version 0.7.4 if (typeof(tokens[e + 1]) == Constant.String) { extract[tokens[e++] as string | number] = tokens[e++] as string; } else { let key = tokens[e++] as number; let values = tokens[e++] as (number | string)[]; extract[key] = []; for (let i = 0; i < values.length - 1; i += 2) { extract[key][values[i] as number] = values[i + 1] as string; } } } return { time, event, data: extract }; } return null; } export function envelope(tokens: Data.Token[]): Data.Envelope { return { version: tokens[0] as string, sequence: tokens[1] as number, start: tokens[2] as number, duration: tokens[3] as number, projectId: tokens[4] as string, userId: tokens[5] as string, sessionId: tokens[6] as string, pageNum: tokens[7] as number, upload: tokens[8] as Data.Upload, end: tokens[9] as Data.BooleanFlag, applicationPlatform: tokens[10] as number, url: tokens[11] as string }; }