UNPKG

tctx

Version:

W3C Trace Contexts made simple

42 lines (41 loc) 1.23 kB
class Tracestate extends Map { set(key, value) { if (!valid_key(key) || !valid_value(value)) throw new TypeError("Invalid key or value"); key = key.trim(); if (this.has(key)) this.delete(key); else if (this.size >= 32) this.delete([...this.keys()][0]); return super.set(key, value); } toString() { let o = "", c = 0; let els = [...this].reverse(); while (c < Math.min(32, els.length) && (o += `${els[c][0]}=${els[c++][1]},`)); return o.slice(0, -1); } } export function make(initial) { return new Tracestate(initial); } export function parse(value) { let i = 0, c = 0, v = []; let pair, pairs = value.split(","); while (i < pairs.length) { pair = pairs[i++]; let idx = pair.indexOf("="); if (!~idx) continue; let key = pair.slice(0, idx).toLowerCase().trim(); let value = pair.slice(idx + 1).trimRight(); if (valid_key(key) && valid_value(value)) { v.unshift([key, value]); ++c; } } return make(v); } function valid_value(value) { let v = String(value); return /^[ -~]{0,255}[!-~]$/.test(v) && !(~v.indexOf(",") || ~v.indexOf("=")); } function valid_key(key) { return /^[a-z0-9][_0-9a-z-*/]{0,255}$/.test(key) || /^[a-z0-9][_0-9a-z-*/]{0,240}@[a-z][_0-9a-z-*/]{0,13}$/.test(key); }