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