UNPKG

1.59 kBJavaScriptView Raw
1import { random } from '@lukeed/csprng';
2
3let IDX = 256, HEX = [];
4for (; IDX--;)
5 HEX[IDX] = (IDX + 256).toString(16).substring(1);
6/*#__INLINE__*/
7const to_hex = (arr) => {
8 let i = 0, output = '';
9 // @ts-ignore
10 for (; i < arr.length; i++)
11 output += HEX[arr[i]];
12 return output;
13};
14/*
15Anatomy of a Traceparent
16
1700-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
18^ ^ ^ ^
19| | | |
20| | | flags (2 hex)
21| | parent-id (16 hex)
22| trace-id (32 hex)
23version (2 hex)
24*/
25const trace_id_size = 16;
26const parent_id_size = 8;
27const W3C_TRACEPARENT_VERSION = '00';
28const sampled_flag = '00';
29const traceparent = (version, trace_id, parent_id, flags) => ({
30 version,
31 trace_id,
32 parent_id,
33 flags,
34 child() {
35 return traceparent(this.version, this.trace_id, to_hex(random(parent_id_size)), this.flags);
36 },
37 toString() {
38 return `${this.version}-${this.trace_id}-${this.parent_id}-${this.flags}`;
39 },
40});
41const make = () => {
42 const total_size = trace_id_size + parent_id_size;
43 const id = random(total_size);
44 return traceparent(W3C_TRACEPARENT_VERSION, to_hex(id.slice(0, trace_id_size)), to_hex(id.slice(trace_id_size, total_size)), sampled_flag);
45};
46const parse = (value) => {
47 if (value.length > 55)
48 return null;
49 const segs = value.split('-');
50 return traceparent(segs[0], segs[1], segs[2], segs[3]);
51};
52
53export { make, parse };