UNPKG

tctx

Version:

W3C Trace Contexts made simple

65 lines (64 loc) 1.94 kB
import { random as r } from "@lukeed/csprng"; const W3C_TRACEPARENT_VERSION = "00"; export const FLAG_SAMPLE = 0b00000001; export const FLAG_RANDOM = 0b00000010; function traceparent(version, trace_id, parent_id, flags) { return { version, trace_id, parent_id, flags, child() { return traceparent(this.version, this.trace_id, random(8), this.flags); }, toString() { let flags = this.flags.toString(16).padStart(2, "0"); return `${this.version}-${this.trace_id}-${this.parent_id}-${flags}`; } }; } export function make() { let id = random(24); return traceparent(W3C_TRACEPARENT_VERSION, id.slice(0, 32), id.slice(32), FLAG_SAMPLE | FLAG_RANDOM); } export function parse(value) { value = value.trim(); if (value.length < 55) return null; if (~value.indexOf("_")) return null; let segs = value.split("-"); if (/\D/.test(segs[3])) return null; let v = segs[0], t = segs[1], p = segs[2], f = segs[3]; if (v.length > 2 || /\W/.test(v)) return null; if (v === W3C_TRACEPARENT_VERSION && segs.length > 4) return null; if (v === "ff") return null; else v = W3C_TRACEPARENT_VERSION; if (t.length !== 32 || /\W/.test(t) || !/[^0]/.test(t)) t = null; if (p.length !== 16 || /\W/.test(p) || !/[^0]/.test(p)) t = p = null; if (f.length !== 2) return null; else f = parseInt(segs[3], 16); if (t == null || p == null) { let id = random(24); t ||= id.slice(0, 32); p ||= id.slice(32); } return traceparent(v, t, p, f); } export function sample(id) { id.flags |= FLAG_SAMPLE; } export function unsample(id) { id.flags &= ~FLAG_SAMPLE; } export function is_sampled(id) { return (id.flags & FLAG_SAMPLE) == FLAG_SAMPLE; } export function is_randomed(id) { return (id.flags & FLAG_RANDOM) == FLAG_RANDOM; } let IDX = 256, HEX = []; for (; IDX--;) HEX[IDX] = (IDX + 256).toString(16).substring(1); function random(size) { let a = r(size), i = 0, o = ""; for (; i < a.length; i++) o += HEX[a[i]]; return o; }