1 | import { random } from '@lukeed/csprng';
|
2 |
|
3 | let IDX = 256, HEX = [];
|
4 | for (; IDX--;)
|
5 | HEX[IDX] = (IDX + 256).toString(16).substring(1);
|
6 |
|
7 | const to_hex = (arr) => {
|
8 | let i = 0, output = '';
|
9 |
|
10 | for (; i < arr.length; i++)
|
11 | output += HEX[arr[i]];
|
12 | return output;
|
13 | };
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | const trace_id_size = 16;
|
26 | const parent_id_size = 8;
|
27 | const W3C_TRACEPARENT_VERSION = '00';
|
28 | const sampled_flag = '00';
|
29 | const 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 | });
|
41 | const 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 | };
|
46 | const 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 |
|
53 | export { make, parse };
|