tctx
Version:
W3C Trace Contexts made simple
65 lines (64 loc) • 1.94 kB
JavaScript
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;
}