@m4ike1/ion-telemetry 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -2
- package/dist/index.d.ts +23 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -6
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +13 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +120 -21
- package/dist/memory.js.map +1 -1
- package/dist/noop.d.ts.map +1 -1
- package/dist/noop.js +9 -1
- package/dist/noop.js.map +1 -1
- package/dist/redaction.d.ts +7 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +30 -0
- package/dist/redaction.js.map +1 -0
- package/dist/testing/conformance.d.ts.map +1 -1
- package/dist/testing/conformance.js +178 -1
- package/dist/testing/conformance.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -50,7 +50,57 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
50
50
|
var e = new Error(message);
|
|
51
51
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
52
|
});
|
|
53
|
-
import { deepStrictEqual, doesNotThrow, fail, ok, strictEqual } from "node:assert/strict";
|
|
53
|
+
import { deepStrictEqual, doesNotThrow, fail, notDeepStrictEqual, ok, strictEqual } from "node:assert/strict";
|
|
54
|
+
const sensitiveSpanSchema = {
|
|
55
|
+
description: "Span with sensitive attributes",
|
|
56
|
+
parents: { kind: "any" },
|
|
57
|
+
startAttributes: {
|
|
58
|
+
startSecret: { type: "string", required: true, sensitive: true, description: "Sensitive start value" },
|
|
59
|
+
startSecretNumber: { type: "number", required: true, sensitive: true, description: "Sensitive number" },
|
|
60
|
+
startSecretBoolean: { type: "boolean", required: true, sensitive: true, description: "Sensitive boolean" },
|
|
61
|
+
startSecretArray: { type: "string[]", required: true, sensitive: true, description: "Sensitive string array" },
|
|
62
|
+
startSecretNumberArray: {
|
|
63
|
+
type: "number[]",
|
|
64
|
+
required: true,
|
|
65
|
+
sensitive: true,
|
|
66
|
+
description: "Sensitive number array",
|
|
67
|
+
},
|
|
68
|
+
startSecretBooleanArray: {
|
|
69
|
+
type: "boolean[]",
|
|
70
|
+
required: true,
|
|
71
|
+
sensitive: true,
|
|
72
|
+
description: "Sensitive boolean array",
|
|
73
|
+
},
|
|
74
|
+
startSafe: { type: "string", required: true, sensitive: false, description: "Safe start value" },
|
|
75
|
+
},
|
|
76
|
+
endAttributes: {
|
|
77
|
+
endSecret: { type: "string", sensitive: true, description: "Sensitive end value" },
|
|
78
|
+
endSecretNumber: { type: "number", sensitive: true, description: "Sensitive end number" },
|
|
79
|
+
},
|
|
80
|
+
events: {
|
|
81
|
+
result: {
|
|
82
|
+
description: "Result event",
|
|
83
|
+
attributes: {
|
|
84
|
+
eventSecret: { type: "string", required: true, sensitive: true, description: "Sensitive event value" },
|
|
85
|
+
eventSecretBoolean: {
|
|
86
|
+
type: "boolean",
|
|
87
|
+
required: true,
|
|
88
|
+
sensitive: true,
|
|
89
|
+
description: "Sensitive event boolean",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
status: { default: "ok", errorWhen: "The operation fails" },
|
|
95
|
+
};
|
|
96
|
+
function assertTraceparent(value) {
|
|
97
|
+
ok(value, "Expected a traceparent");
|
|
98
|
+
const match = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/.exec(value);
|
|
99
|
+
ok(match, "Expected a valid W3C traceparent");
|
|
100
|
+
ok(match[1] !== "0".repeat(32), "Expected a non-zero trace ID");
|
|
101
|
+
ok(match[2] !== "0".repeat(16), "Expected a non-zero span ID");
|
|
102
|
+
ok(match[3] === "00" || match[3] === "01", "Expected only the sampled trace flag");
|
|
103
|
+
}
|
|
54
104
|
function createCase(factory, group, name, test) {
|
|
55
105
|
return {
|
|
56
106
|
group,
|
|
@@ -115,6 +165,7 @@ export function createTelemetryAdapterConformance(factory) {
|
|
|
115
165
|
calls++;
|
|
116
166
|
return expected;
|
|
117
167
|
});
|
|
168
|
+
ok(!(result instanceof Promise), "Expected a synchronous callback result to remain synchronous");
|
|
118
169
|
strictEqual(admitted, true);
|
|
119
170
|
strictEqual(calls, 1);
|
|
120
171
|
strictEqual(await result, expected);
|
|
@@ -225,6 +276,7 @@ export function createTelemetryAdapterConformance(factory) {
|
|
|
225
276
|
return 7;
|
|
226
277
|
});
|
|
227
278
|
strictEqual(childAdmitted, true);
|
|
279
|
+
ok(!(childResult instanceof Promise), "Expected a synchronous child result to remain synchronous");
|
|
228
280
|
strictEqual(await childResult, 7);
|
|
229
281
|
const spans = await fixture.getSpans();
|
|
230
282
|
strictEqual(spans.length, 1);
|
|
@@ -257,6 +309,131 @@ export function createTelemetryAdapterConformance(factory) {
|
|
|
257
309
|
ok(second.endSequence < first.endSequence);
|
|
258
310
|
ok(first.endSequence < parent.endSequence);
|
|
259
311
|
}),
|
|
312
|
+
createCase(factory, "privacy", "redacts schema-declared sensitive attributes", async (fixture) => {
|
|
313
|
+
const startSecret = "start-secret-value";
|
|
314
|
+
const startSecretNumber = 42;
|
|
315
|
+
const startSecretBoolean = true;
|
|
316
|
+
const startSecretArray = ["one", "two"];
|
|
317
|
+
const startSecretNumberArray = [1, 2];
|
|
318
|
+
const startSecretBooleanArray = [true, false];
|
|
319
|
+
const endSecret = "end-secret-value";
|
|
320
|
+
const endSecretNumber = 84;
|
|
321
|
+
const eventSecret = "event-secret-value";
|
|
322
|
+
const eventSecretBoolean = false;
|
|
323
|
+
await fixture.context.startSpan({
|
|
324
|
+
name: "sensitive",
|
|
325
|
+
schema: sensitiveSpanSchema,
|
|
326
|
+
attributes: {
|
|
327
|
+
startSecret,
|
|
328
|
+
startSecretNumber,
|
|
329
|
+
startSecretBoolean,
|
|
330
|
+
startSecretArray,
|
|
331
|
+
startSecretNumberArray,
|
|
332
|
+
startSecretBooleanArray,
|
|
333
|
+
startSafe: "retained",
|
|
334
|
+
},
|
|
335
|
+
}, (span) => {
|
|
336
|
+
span.setAttributes({ endSecret, endSecretNumber });
|
|
337
|
+
span.addEvent("result", { eventSecret, eventSecretBoolean });
|
|
338
|
+
});
|
|
339
|
+
const span = findSpan(await fixture.getSpans(), "sensitive");
|
|
340
|
+
notDeepStrictEqual(span.attributes.startSecret, startSecret);
|
|
341
|
+
notDeepStrictEqual(span.attributes.startSecretNumber, startSecretNumber);
|
|
342
|
+
notDeepStrictEqual(span.attributes.startSecretBoolean, startSecretBoolean);
|
|
343
|
+
notDeepStrictEqual(span.attributes.startSecretArray, startSecretArray);
|
|
344
|
+
notDeepStrictEqual(span.attributes.startSecretNumberArray, startSecretNumberArray);
|
|
345
|
+
notDeepStrictEqual(span.attributes.startSecretBooleanArray, startSecretBooleanArray);
|
|
346
|
+
notDeepStrictEqual(span.attributes.endSecret, endSecret);
|
|
347
|
+
notDeepStrictEqual(span.attributes.endSecretNumber, endSecretNumber);
|
|
348
|
+
deepStrictEqual(span.attributes.startSafe, "retained");
|
|
349
|
+
const event = span.events.find((candidate) => candidate.name === "result");
|
|
350
|
+
ok(event);
|
|
351
|
+
notDeepStrictEqual(event.attributes.eventSecret, eventSecret);
|
|
352
|
+
notDeepStrictEqual(event.attributes.eventSecretBoolean, eventSecretBoolean);
|
|
353
|
+
}),
|
|
354
|
+
createCase(factory, "recording", "skips disabled spans without skipping callbacks", async (fixture) => {
|
|
355
|
+
let admitted = false;
|
|
356
|
+
const result = fixture.context.startSpan({ name: "disabled", enabled: false }, () => {
|
|
357
|
+
admitted = true;
|
|
358
|
+
return 17;
|
|
359
|
+
});
|
|
360
|
+
strictEqual(admitted, true);
|
|
361
|
+
strictEqual(result, 17);
|
|
362
|
+
deepStrictEqual(await fixture.getSpans(), []);
|
|
363
|
+
}),
|
|
364
|
+
createCase(factory, "timing", "records a sane elapsed duration", async (fixture) => {
|
|
365
|
+
await fixture.context.startSpan({ name: "timed" }, async () => {
|
|
366
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
367
|
+
});
|
|
368
|
+
const span = findSpan(await fixture.getSpans(), "timed");
|
|
369
|
+
ok(span.startedAt !== undefined);
|
|
370
|
+
ok(Number.isFinite(span.startedAt));
|
|
371
|
+
ok(span.endedAt !== undefined);
|
|
372
|
+
ok(Number.isFinite(span.endedAt));
|
|
373
|
+
ok(span.duration !== undefined);
|
|
374
|
+
ok(Number.isFinite(span.duration));
|
|
375
|
+
ok(span.endedAt >= span.startedAt, "Expected a non-decreasing clock");
|
|
376
|
+
ok(span.duration > 0, "Expected a positive elapsed duration");
|
|
377
|
+
ok(span.duration < 60_000, "Expected an implausibly long duration to fail");
|
|
378
|
+
strictEqual(span.duration, span.endedAt - span.startedAt);
|
|
379
|
+
}),
|
|
380
|
+
createCase(factory, "parentage", "preserves W3C parentage across a context boundary", async (fixture) => {
|
|
381
|
+
await fixture.context.startSpan({ name: "boundary-parent" }, async (parent) => {
|
|
382
|
+
const traceparent = fixture.context.inject(parent);
|
|
383
|
+
assertTraceparent(traceparent);
|
|
384
|
+
const remote = fixture.context.extract(traceparent);
|
|
385
|
+
await remote.startSpan({ name: "boundary-child" }, (child) => {
|
|
386
|
+
const childTraceparent = remote.inject(child);
|
|
387
|
+
assertTraceparent(childTraceparent);
|
|
388
|
+
strictEqual(childTraceparent.slice(0, 35), traceparent.slice(0, 35));
|
|
389
|
+
notDeepStrictEqual(childTraceparent.slice(36, 52), traceparent.slice(36, 52));
|
|
390
|
+
});
|
|
391
|
+
const invalidFromSpan = parent.extract("not-a-traceparent");
|
|
392
|
+
await invalidFromSpan.startSpan({ name: "invalid-span-extract" }, () => undefined);
|
|
393
|
+
const missingFromSpan = parent.extract(undefined);
|
|
394
|
+
await missingFromSpan.startSpan({ name: "missing-span-extract" }, () => undefined);
|
|
395
|
+
});
|
|
396
|
+
const spans = await fixture.getSpans();
|
|
397
|
+
const parent = findSpan(spans, "boundary-parent");
|
|
398
|
+
const child = findSpan(spans, "boundary-child");
|
|
399
|
+
assertTraceparent(parent.traceparent);
|
|
400
|
+
assertTraceparent(child.traceparent);
|
|
401
|
+
strictEqual(child.parentId, null);
|
|
402
|
+
strictEqual(child.parentTraceparent, parent.traceparent);
|
|
403
|
+
strictEqual(child.traceparent.slice(0, 35), parent.traceparent.slice(0, 35));
|
|
404
|
+
const invalid = fixture.context.extract("not-a-traceparent");
|
|
405
|
+
await invalid.startSpan({ name: "invalid-boundary" }, () => undefined);
|
|
406
|
+
strictEqual(findSpan(await fixture.getSpans(), "invalid-boundary").parentTraceparent, null);
|
|
407
|
+
const unsampled = fixture.context.extract("00-11111111111111111111111111111111-2222222222222222-00");
|
|
408
|
+
await unsampled.startSpan({ name: "unsampled-boundary" }, (child) => {
|
|
409
|
+
const childTraceparent = unsampled.inject(child);
|
|
410
|
+
assertTraceparent(childTraceparent);
|
|
411
|
+
strictEqual(childTraceparent.slice(0, 35), "00-11111111111111111111111111111111");
|
|
412
|
+
strictEqual(childTraceparent.slice(53), "00");
|
|
413
|
+
});
|
|
414
|
+
const reservedFlags = fixture.context.extract("00-77777777777777777777777777777777-8888888888888888-03");
|
|
415
|
+
await reservedFlags.startSpan({ name: "reserved-flags-boundary" }, (child) => {
|
|
416
|
+
const childTraceparent = reservedFlags.inject(child);
|
|
417
|
+
assertTraceparent(childTraceparent);
|
|
418
|
+
strictEqual(childTraceparent.slice(53), "01");
|
|
419
|
+
});
|
|
420
|
+
const future = fixture.context.extract("01-33333333333333333333333333333333-4444444444444444-03-future-extension");
|
|
421
|
+
await future.startSpan({ name: "future-boundary" }, (child) => {
|
|
422
|
+
const childTraceparent = future.inject(child);
|
|
423
|
+
assertTraceparent(childTraceparent);
|
|
424
|
+
strictEqual(childTraceparent.slice(0, 35), "00-33333333333333333333333333333333");
|
|
425
|
+
strictEqual(childTraceparent.slice(53), "01");
|
|
426
|
+
});
|
|
427
|
+
const directParent = "00-55555555555555555555555555555555-6666666666666666-01";
|
|
428
|
+
await fixture.context.startSpan({ name: "direct-boundary", traceparent: directParent }, (child) => {
|
|
429
|
+
const childTraceparent = fixture.context.inject(child);
|
|
430
|
+
assertTraceparent(childTraceparent);
|
|
431
|
+
strictEqual(childTraceparent.slice(0, 35), directParent.slice(0, 35));
|
|
432
|
+
});
|
|
433
|
+
strictEqual(findSpan(await fixture.getSpans(), "direct-boundary").parentTraceparent, directParent);
|
|
434
|
+
strictEqual(findSpan(await fixture.getSpans(), "invalid-span-extract").parentTraceparent, null);
|
|
435
|
+
strictEqual(findSpan(await fixture.getSpans(), "missing-span-extract").parentTraceparent, null);
|
|
436
|
+
}),
|
|
260
437
|
createCase(factory, "passivity", "suppresses unreadable telemetry payload failures", async (fixture) => {
|
|
261
438
|
let calls = 0;
|
|
262
439
|
const options = unreadable({ name: "unreadable-options", attributes: { secret: "value" } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepStrictEqual, doesNotThrow, fail, ok, strictEqual } from \"node:assert/strict\";\nimport type { SpanAttributes, SpanOptions, SpanStatus, TelemetrySpan } from \"../index.ts\";\nimport type { RecordedTelemetrySpan } from \"../memory.ts\";\nimport type {\n\tTelemetryAdapterConformanceCase,\n\tTelemetryAdapterFixture,\n\tTelemetryAdapterFixtureFactory,\n} from \"./types.ts\";\n\ntype ConformanceTest = (fixture: TelemetryAdapterFixture) => Promise<void>;\n\nfunction createCase(\n\tfactory: TelemetryAdapterFixtureFactory,\n\tgroup: string,\n\tname: string,\n\ttest: ConformanceTest,\n): TelemetryAdapterConformanceCase {\n\treturn {\n\t\tgroup,\n\t\tname,\n\t\tasync run() {\n\t\t\tawait using fixture = await factory();\n\t\t\tawait test(fixture);\n\t\t},\n\t};\n}\n\nfunction findSpan(spans: readonly RecordedTelemetrySpan[], name: string): RecordedTelemetrySpan {\n\tconst span = spans.find((candidate) => candidate.name === name);\n\tok(span, `Expected recorded span ${name}`);\n\treturn span;\n}\n\nasync function rejectsWithSameValue(operation: Promise<unknown>, expected: unknown): Promise<void> {\n\ttry {\n\t\tawait operation;\n\t\tfail(\"Expected operation to reject\");\n\t} catch (error) {\n\t\tstrictEqual(error, expected);\n\t}\n}\n\nfunction unreadable<T extends object>(value: T): T {\n\treturn new Proxy(value, {\n\t\tget: () => {\n\t\t\tthrow new Error(\"read\");\n\t\t},\n\t\tgetOwnPropertyDescriptor: () => {\n\t\t\tthrow new Error(\"inspect\");\n\t\t},\n\t\tgetPrototypeOf: () => {\n\t\t\tthrow new Error(\"prototype\");\n\t\t},\n\t\townKeys: () => {\n\t\t\tthrow new Error(\"enumerate\");\n\t\t},\n\t});\n}\n\n/** Creates runner-independent cases for the callback telemetry adapter contract. */\nexport function createTelemetryAdapterConformance(\n\tfactory: TelemetryAdapterFixtureFactory,\n): readonly TelemetryAdapterConformanceCase[] {\n\treturn [\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"callback lifecycle\",\n\t\t\t\"admits once synchronously and preserves the result\",\n\t\t\tasync (fixture) => {\n\t\t\t\tlet admitted = false;\n\t\t\t\tlet calls = 0;\n\t\t\t\tconst expected = { value: 42 };\n\t\t\t\tconst result = fixture.context.startSpan({ name: \"success\" }, () => {\n\t\t\t\t\tadmitted = true;\n\t\t\t\t\tcalls++;\n\t\t\t\t\treturn expected;\n\t\t\t\t});\n\n\t\t\t\tstrictEqual(admitted, true);\n\t\t\t\tstrictEqual(calls, 1);\n\t\t\t\tstrictEqual(await result, expected);\n\t\t\t\tdeepStrictEqual(findSpan(await fixture.getSpans(), \"success\").status, { status: \"ok\" });\n\t\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"success\").settled, true);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"callback lifecycle\",\n\t\t\t\"preserves synchronous and asynchronous rejection values\",\n\t\t\tasync (fixture) => {\n\t\t\t\tconst syncError = new Error(\"sync\");\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"sync-error\" }, () => {\n\t\t\t\t\t\tthrow syncError;\n\t\t\t\t\t}),\n\t\t\t\t\tsyncError,\n\t\t\t\t);\n\n\t\t\t\tconst asyncError = { kind: \"async\" };\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"async-error\" }, async () => {\n\t\t\t\t\t\tthrow asyncError;\n\t\t\t\t\t}),\n\t\t\t\t\tasyncError,\n\t\t\t\t);\n\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"undefined-error\" }, () => Promise.reject(undefined)),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\n\t\t\t\tconst unreadableError = unreadable({ kind: \"unreadable\" });\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"unreadable-error\" }, () => {\n\t\t\t\t\t\tthrow unreadableError;\n\t\t\t\t\t}),\n\t\t\t\t\tunreadableError,\n\t\t\t\t);\n\n\t\t\t\tconst asyncUnreadableError = unreadable({ kind: \"async-unreadable\" });\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"async-unreadable-error\" }, () =>\n\t\t\t\t\t\tPromise.reject(asyncUnreadableError),\n\t\t\t\t\t),\n\t\t\t\t\tasyncUnreadableError,\n\t\t\t\t);\n\n\t\t\t\tconst spans = await fixture.getSpans();\n\t\t\t\tfor (const name of [\n\t\t\t\t\t\"sync-error\",\n\t\t\t\t\t\"async-error\",\n\t\t\t\t\t\"undefined-error\",\n\t\t\t\t\t\"unreadable-error\",\n\t\t\t\t\t\"async-unreadable-error\",\n\t\t\t\t]) {\n\t\t\t\t\tstrictEqual(findSpan(spans, name).status.status, \"error\");\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"status\", \"uses last explicit status without automatic overwrite\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"last-status\" }, (span) => {\n\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"first\" } });\n\t\t\t\tspan.setStatus({ status: \"ok\" });\n\t\t\t});\n\n\t\t\tconst thrown = new Error(\"after explicit status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"explicit-before-throw\" }, (span) => {\n\t\t\t\t\tspan.setStatus({ status: \"ok\" });\n\t\t\t\t\tthrow thrown;\n\t\t\t\t}),\n\t\t\t\tthrown,\n\t\t\t);\n\n\t\t\tconst rejected = new Error(\"after async explicit status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"explicit-before-rejection\" }, (span) => {\n\t\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"async failure\" } });\n\t\t\t\t\treturn Promise.reject(rejected);\n\t\t\t\t}),\n\t\t\t\trejected,\n\t\t\t);\n\n\t\t\tawait fixture.context.startSpan({ name: \"expected-failure\" }, (span) => {\n\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"returned failure\" } });\n\t\t\t\treturn { ok: false };\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tdeepStrictEqual(findSpan(spans, \"last-status\").status, { status: \"ok\" });\n\t\t\tdeepStrictEqual(findSpan(spans, \"explicit-before-throw\").status, { status: \"ok\" });\n\t\t\tdeepStrictEqual(findSpan(spans, \"explicit-before-rejection\").status, {\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror: { name: \"Expected\", message: \"async failure\" },\n\t\t\t});\n\t\t\tdeepStrictEqual(findSpan(spans, \"expected-failure\").status, {\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror: { name: \"Expected\", message: \"returned failure\" },\n\t\t\t});\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"merges attributes and records ordered events\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan(\n\t\t\t\t{\n\t\t\t\t\tname: \"recording\",\n\t\t\t\t\tattributes: { start: \"value\", overwrite: \"start\", ignored: undefined },\n\t\t\t\t},\n\t\t\t\t(span) => {\n\t\t\t\t\tspan.setAttributes({ count: 1, overwrite: \"middle\" });\n\t\t\t\t\tspan.setAttributes({ count: undefined, overwrite: \"end\" });\n\t\t\t\t\tspan.addEvent(\"first\", { index: 1, ignored: undefined });\n\t\t\t\t\tspan.addEvent(\"second\", { index: 2 });\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst span = findSpan(await fixture.getSpans(), \"recording\");\n\t\t\tdeepStrictEqual(span.attributes, { start: \"value\", overwrite: \"end\", count: 1 });\n\t\t\tdeepStrictEqual(span.events, [\n\t\t\t\t{ name: \"first\", attributes: { index: 1 } },\n\t\t\t\t{ name: \"second\", attributes: { index: 2 } },\n\t\t\t]);\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"ignores failed attribute calls atomically\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"atomic-attributes\", attributes: { retained: \"value\" } }, (span) => {\n\t\t\t\tconst attributes: SpanAttributes = {\n\t\t\t\t\tpartial: \"must not survive\",\n\t\t\t\t\tunreadable: unreadable([\"value\"]),\n\t\t\t\t};\n\t\t\t\tdoesNotThrow(() => span.setAttributes(attributes));\n\t\t\t});\n\n\t\t\tdeepStrictEqual(findSpan(await fixture.getSpans(), \"atomic-attributes\").attributes, {\n\t\t\t\tretained: \"value\",\n\t\t\t});\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"makes calls after settlement inert\", async (fixture) => {\n\t\t\tlet settledSpan: TelemetrySpan | undefined;\n\t\t\tawait fixture.context.startSpan({ name: \"settled\", attributes: { value: \"initial\" } }, (span) => {\n\t\t\t\tsettledSpan = span;\n\t\t\t});\n\t\t\tconst capturedSpan = settledSpan;\n\t\t\tif (!capturedSpan) throw new Error(\"Expected callback span\");\n\n\t\t\tdoesNotThrow(() => capturedSpan.setAttributes({ value: \"late\" }));\n\t\t\tdoesNotThrow(() => capturedSpan.addEvent(\"late\", { value: true }));\n\t\t\tdoesNotThrow(() => capturedSpan.setStatus({ status: \"error\" }));\n\t\t\tlet childAdmitted = false;\n\t\t\tconst childResult = capturedSpan.startSpan({ name: \"late-child\" }, () => {\n\t\t\t\tchildAdmitted = true;\n\t\t\t\treturn 7;\n\t\t\t});\n\t\t\tstrictEqual(childAdmitted, true);\n\t\t\tstrictEqual(await childResult, 7);\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tstrictEqual(spans.length, 1);\n\t\t\tdeepStrictEqual(spans[0]?.attributes, { value: \"initial\" });\n\t\t\tdeepStrictEqual(spans[0]?.events, []);\n\t\t\tdeepStrictEqual(spans[0]?.status, { status: \"ok\" });\n\t\t}),\n\n\t\tcreateCase(factory, \"parentage\", \"records nested and concurrent child relationships\", async (fixture) => {\n\t\t\tlet releaseFirst: (() => void) | undefined;\n\t\t\tconst firstGate = new Promise<void>((resolve) => {\n\t\t\t\treleaseFirst = resolve;\n\t\t\t});\n\n\t\t\tawait fixture.context.startSpan({ name: \"parent\" }, async (parent) => {\n\t\t\t\tconst first = parent.startSpan({ name: \"first-child\" }, async () => {\n\t\t\t\t\tawait firstGate;\n\t\t\t\t});\n\t\t\t\tconst second = parent.startSpan({ name: \"second-child\" }, () => \"done\");\n\t\t\t\tstrictEqual(await second, \"done\");\n\t\t\t\treleaseFirst?.();\n\t\t\t\tawait first;\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tconst parent = findSpan(spans, \"parent\");\n\t\t\tconst first = findSpan(spans, \"first-child\");\n\t\t\tconst second = findSpan(spans, \"second-child\");\n\t\t\tstrictEqual(parent.parentId, null);\n\t\t\tstrictEqual(first.parentId, parent.id);\n\t\t\tstrictEqual(second.parentId, parent.id);\n\t\t\tok(second.endSequence !== undefined && first.endSequence !== undefined && parent.endSequence !== undefined);\n\t\t\tok(second.endSequence < first.endSequence);\n\t\t\tok(first.endSequence < parent.endSequence);\n\t\t}),\n\n\t\tcreateCase(factory, \"passivity\", \"suppresses unreadable telemetry payload failures\", async (fixture) => {\n\t\t\tlet calls = 0;\n\t\t\tconst options = unreadable<SpanOptions>({ name: \"unreadable-options\", attributes: { secret: \"value\" } });\n\t\t\tconst result = fixture.context.startSpan(options, () => {\n\t\t\t\tcalls++;\n\t\t\t\treturn 9;\n\t\t\t});\n\n\t\t\tstrictEqual(calls, 1);\n\t\t\tstrictEqual(await result, 9);\n\t\t\tdeepStrictEqual(await fixture.getSpans(), []);\n\n\t\t\tawait fixture.context.startSpan({ name: \"unreadable-recording\" }, (span) => {\n\t\t\t\tconst attributes = unreadable<SpanAttributes>({ secret: \"value\" });\n\t\t\t\tconst status = unreadable<SpanStatus>({ status: \"ok\" });\n\t\t\t\tdoesNotThrow(() => span.setAttributes(attributes));\n\t\t\t\tdoesNotThrow(() => span.addEvent(\"unreadable-event\", attributes));\n\t\t\t\tdoesNotThrow(() => span.setStatus(status));\n\t\t\t});\n\n\t\t\tconst recorded = await fixture.getSpans();\n\t\t\tstrictEqual(recorded.length, 1);\n\t\t\tdeepStrictEqual(recorded[0]?.attributes, {});\n\t\t\tdeepStrictEqual(recorded[0]?.events, []);\n\t\t\tdeepStrictEqual(recorded[0]?.status, { status: \"ok\" });\n\t\t}),\n\n\t\tcreateCase(factory, \"passivity\", \"ignores failed status calls atomically\", async (fixture) => {\n\t\t\tconst rejection = new Error(\"rejected after unreadable status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"unreadable-status\" }, (span) => {\n\t\t\t\t\tconst status = unreadable<SpanStatus>({ status: \"ok\" });\n\t\t\t\t\tdoesNotThrow(() => span.setStatus(status));\n\t\t\t\t\treturn Promise.reject(rejection);\n\t\t\t\t}),\n\t\t\t\trejection,\n\t\t\t);\n\n\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"unreadable-status\").status.status, \"error\");\n\t\t}),\n\t];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAS9G,MAAM,mBAAmB,GAAG;IAC3B,WAAW,EAAE,gCAAgC;IAC7C,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;IACxB,eAAe,EAAE;QAChB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE;QACtG,iBAAiB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE;QACvG,kBAAkB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE;QAC1G,gBAAgB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,wBAAwB,EAAE;QAC9G,sBAAsB,EAAE;YACvB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,wBAAwB;SACrC;QACD,uBAAuB,EAAE;YACxB,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,yBAAyB;SACtC;QACD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE;KAChG;IACD,aAAa,EAAE;QACd,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,qBAAqB,EAAE;QAClF,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE;KACzF;IACD,MAAM,EAAE;QACP,MAAM,EAAE;YACP,WAAW,EAAE,cAAc;YAC3B,UAAU,EAAE;gBACX,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE;gBACtG,kBAAkB,EAAE;oBACnB,IAAI,EAAE,SAAS;oBACf,QAAQ,EAAE,IAAI;oBACd,SAAS,EAAE,IAAI;oBACf,WAAW,EAAE,yBAAyB;iBACtC;aACD;SACD;KACD;IACD,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE;CACzB,CAAC;AAIpC,SAAS,iBAAiB,CAAC,KAAyB,EAA2B;IAC9E,EAAE,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,kDAAkD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7E,EAAE,CAAC,KAAK,EAAE,kCAAkC,CAAC,CAAC;IAC9C,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAChE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,6BAA6B,CAAC,CAAC;IAC/D,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,sCAAsC,CAAC,CAAC;AAAA,CACnF;AAED,SAAS,UAAU,CAClB,OAAuC,EACvC,KAAa,EACb,IAAY,EACZ,IAAqB,EACa;IAClC,OAAO;QACN,KAAK;QACL,IAAI;QACJ,KAAK,CAAC,GAAG,GAAG;;;gBACX,MAAY,OAAO,kCAAG,MAAM,OAAO,EAAE,OAAA,CAAC;gBACtC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;;;;;;;;;;;QAAA,CACpB;KACD,CAAC;AAAA,CACF;AAED,SAAS,QAAQ,CAAC,KAAuC,EAAE,IAAY,EAAyB;IAC/F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChE,EAAE,CAAC,IAAI,EAAE,0BAA0B,IAAI,EAAE,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,KAAK,UAAU,oBAAoB,CAAS,SAAmC,EAAE,QAAiB,EAAiB;IAClH,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC;QAChB,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9B,CAAC;AAAA,CACD;AAED,SAAS,UAAU,CAAmB,KAAQ,EAAK;IAClD,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;QACvB,GAAG,EAAE,GAAG,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAAA,CACxB;QACD,wBAAwB,EAAE,GAAG,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAAA,CAC3B;QACD,cAAc,EAAE,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAAA,CAC7B;QACD,OAAO,EAAE,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAAA,CAC7B;KACD,CAAC,CAAC;AAAA,CACH;AAED,oFAAoF;AACpF,MAAM,UAAU,iCAAiC,CAChD,OAAuC,EACM;IAC7C,OAAO;QACN,UAAU,CACT,OAAO,EACP,oBAAoB,EACpB,oDAAoD,EACpD,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YAClB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC;gBACnE,QAAQ,GAAG,IAAI,CAAC;gBAChB,KAAK,EAAE,CAAC;gBACR,OAAO,QAAQ,CAAC;YAAA,CAChB,CAAC,CAAC;YAEH,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,OAAO,CAAC,EAAE,8DAA8D,CAAC,CAAC;YACjG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5B,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtB,WAAW,CAAC,MAAM,MAAM,EAAE,QAAQ,CAAC,CAAC;YACpC,eAAe,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,WAAW,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAAA,CACzE,CACD;QAED,UAAU,CACT,OAAO,EACP,oBAAoB,EACpB,yDAAyD,EACzD,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,oBAAoB,CACzB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC;gBACvD,MAAM,SAAS,CAAC;YAAA,CAChB,CAAC,EACF,SAAS,CACT,CAAC;YAEF,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACrC,MAAM,oBAAoB,CACzB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC9D,MAAM,UAAU,CAAC;YAAA,CACjB,CAAC,EACF,UAAU,CACV,CAAC;YAEF,MAAM,oBAAoB,CACzB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EACvF,SAAS,CACT,CAAC;YAEF,MAAM,eAAe,GAAG,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAC3D,MAAM,oBAAoB,CACzB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC;gBAC7D,MAAM,eAAe,CAAC;YAAA,CACtB,CAAC,EACF,eAAe,CACf,CAAC;YAEF,MAAM,oBAAoB,GAAG,UAAU,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACtE,MAAM,oBAAoB,CACzB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,EAAE,GAAG,EAAE,CAClE,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,CACpC,EACD,oBAAoB,CACpB,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI;gBAClB,YAAY;gBACZ,aAAa;gBACb,iBAAiB;gBACjB,kBAAkB;gBAClB,wBAAwB;aACxB,EAAE,CAAC;gBACH,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC3D,CAAC;QAAA,CACD,CACD;QAED,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,uDAAuD,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACzG,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;gBACnF,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAAA,CACjC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAClD,MAAM,oBAAoB,CACzB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBACtE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjC,MAAM,MAAM,CAAC;YAAA,CACb,CAAC,EACF,MAAM,CACN,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC1D,MAAM,oBAAoB,CACzB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1E,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;gBAC3F,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAA,CAChC,CAAC,EACF,QAAQ,CACR,CAAC;YAEF,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBACvE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;gBAC9F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAAA,CACrB,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACzE,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC,MAAM,EAAE;gBACpE,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE;aACrD,CAAC,CAAC;YACH,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,MAAM,EAAE;gBAC3D,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE;aACxD,CAAC,CAAC;QAAA,CACH,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,8CAA8C,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACnG,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAC9B;gBACC,IAAI,EAAE,WAAW;gBACjB,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;aACtE,EACD,CAAC,IAAI,EAAE,EAAE,CAAC;gBACT,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACtD,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;gBACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAAA,CACtC,CACD,CAAC;YAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAC;YAC7D,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACjF,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC5B,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC3C,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;aAC5C,CAAC,CAAC;QAAA,CACH,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,2CAA2C,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YAChG,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3G,MAAM,UAAU,GAAmB;oBAClC,OAAO,EAAE,kBAAkB;oBAC3B,UAAU,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;iBACjC,CAAC;gBACF,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YAAA,CACnD,CAAC,CAAC;YAEH,eAAe,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,mBAAmB,CAAC,CAAC,UAAU,EAAE;gBACnF,QAAQ,EAAE,OAAO;aACjB,CAAC,CAAC;QAAA,CACH,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,oCAAoC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACzF,IAAI,WAAsC,CAAC;YAC3C,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChG,WAAW,GAAG,IAAI,CAAC;YAAA,CACnB,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,WAAW,CAAC;YACjC,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAE7D,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAClE,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACnE,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAChE,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC;gBACxE,aAAa,GAAG,IAAI,CAAC;gBACrB,OAAO,CAAC,CAAC;YAAA,CACT,CAAC,CAAC;YACH,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YACjC,EAAE,CAAC,CAAC,CAAC,WAAW,YAAY,OAAO,CAAC,EAAE,2DAA2D,CAAC,CAAC;YACnG,WAAW,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC;YAElC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7B,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5D,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACtC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAAA,CACpD,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,mDAAmD,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACxG,IAAI,YAAsC,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChD,YAAY,GAAG,OAAO,CAAC;YAAA,CACvB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;gBACrE,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC;oBACnE,MAAM,SAAS,CAAC;gBAAA,CAChB,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;gBACxE,WAAW,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC;gBAClC,YAAY,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,CAAC;YAAA,CACZ,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAC/C,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACnC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACvC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACxC,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;YAC5G,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3C,EAAE,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAAA,CAC3C,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,8CAA8C,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACjG,MAAM,WAAW,GAAG,oBAAoB,CAAC;YACzC,MAAM,iBAAiB,GAAG,EAAE,CAAC;YAC7B,MAAM,kBAAkB,GAAG,IAAI,CAAC;YAChC,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxC,MAAM,sBAAsB,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,kBAAkB,CAAC;YACrC,MAAM,eAAe,GAAG,EAAE,CAAC;YAC3B,MAAM,WAAW,GAAG,oBAAoB,CAAC;YACzC,MAAM,kBAAkB,GAAG,KAAK,CAAC;YACjC,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAC9B;gBACC,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,mBAAmB;gBAC3B,UAAU,EAAE;oBACX,WAAW;oBACX,iBAAiB;oBACjB,kBAAkB;oBAClB,gBAAgB;oBAChB,sBAAsB;oBACtB,uBAAuB;oBACvB,SAAS,EAAE,UAAU;iBACrB;aACD,EACD,CAAC,IAAI,EAAE,EAAE,CAAC;gBACT,IAAI,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;gBACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAAA,CAC7D,CACD,CAAC;YAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAC;YAC7D,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC7D,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;YACzE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;YAC3E,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;YACvE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,CAAC;YACnF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC;YACrF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACzD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;YACrE,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC3E,EAAE,CAAC,KAAK,CAAC,CAAC;YACV,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC9D,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;QAAA,CAC5E,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,iDAAiD,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACtG,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC;gBACpF,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,EAAE,CAAC;YAAA,CACV,CAAC,CAAC;YAEH,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5B,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxB,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAAA,CAC9C,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,iCAAiC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACnF,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC9D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAAA,CAC9D,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;YACzD,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;YACjC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACpC,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;YAC/B,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAClC,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnC,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;YACtE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAC;YAC9D,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,+CAA+C,CAAC,CAAC;YAC5E,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1D,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,mDAAmD,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACxG,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;gBAC9E,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnD,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACpD,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;oBAC7D,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC9C,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;oBACpC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBACrE,kBAAkB,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAAA,CAC9E,CAAC,CAAC;gBACH,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;gBAC5D,MAAM,eAAe,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACnF,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAClD,MAAM,eAAe,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAAA,CACnF,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAChD,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACtC,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACrC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClC,WAAW,CAAC,KAAK,CAAC,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACzD,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAE7E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAC7D,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACvE,WAAW,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,kBAAkB,CAAC,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;YAE5F,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;YACrG,MAAM,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBACpE,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjD,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;gBACpC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,qCAAqC,CAAC,CAAC;gBAClF,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAAA,CAC9C,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;YACzG,MAAM,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC7E,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrD,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;gBACpC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAAA,CAC9C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CACrC,0EAA0E,CAC1E,CAAC;YACF,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC9D,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC9C,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;gBACpC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,qCAAqC,CAAC,CAAC;gBAClF,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAAA,CAC9C,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,yDAAyD,CAAC;YAC/E,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBAClG,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvD,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;gBACpC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAAA,CACtE,CAAC,CAAC;YACH,WAAW,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAEnG,WAAW,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,sBAAsB,CAAC,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;YAChG,WAAW,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,sBAAsB,CAAC,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAAA,CAChG,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,kDAAkD,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YACvG,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,UAAU,CAAc,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACzG,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;gBACvD,KAAK,EAAE,CAAC;gBACR,OAAO,CAAC,CAAC;YAAA,CACT,CAAC,CAAC;YAEH,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtB,WAAW,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7B,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAE9C,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3E,MAAM,UAAU,GAAG,UAAU,CAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;gBACnE,MAAM,MAAM,GAAG,UAAU,CAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;gBACnD,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAC;gBAClE,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAAA,CAC3C,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC1C,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAChC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAC7C,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACzC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAAA,CACvD,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,wCAAwC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7F,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAChE,MAAM,oBAAoB,CACzB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,UAAU,CAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAAA,CACjC,CAAC,EACF,SAAS,CACT,CAAC;YAEF,WAAW,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,mBAAmB,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAA,CAC5F,CAAC;KACF,CAAC;AAAA,CACF","sourcesContent":["import { deepStrictEqual, doesNotThrow, fail, notDeepStrictEqual, ok, strictEqual } from \"node:assert/strict\";\nimport type { SpanAttributes, SpanOptions, SpanStatus, TelemetrySpan, TelemetrySpanDefinition } from \"../index.ts\";\nimport type { RecordedTelemetrySpan } from \"../memory.ts\";\nimport type {\n\tTelemetryAdapterConformanceCase,\n\tTelemetryAdapterFixture,\n\tTelemetryAdapterFixtureFactory,\n} from \"./types.ts\";\n\nconst sensitiveSpanSchema = {\n\tdescription: \"Span with sensitive attributes\",\n\tparents: { kind: \"any\" },\n\tstartAttributes: {\n\t\tstartSecret: { type: \"string\", required: true, sensitive: true, description: \"Sensitive start value\" },\n\t\tstartSecretNumber: { type: \"number\", required: true, sensitive: true, description: \"Sensitive number\" },\n\t\tstartSecretBoolean: { type: \"boolean\", required: true, sensitive: true, description: \"Sensitive boolean\" },\n\t\tstartSecretArray: { type: \"string[]\", required: true, sensitive: true, description: \"Sensitive string array\" },\n\t\tstartSecretNumberArray: {\n\t\t\ttype: \"number[]\",\n\t\t\trequired: true,\n\t\t\tsensitive: true,\n\t\t\tdescription: \"Sensitive number array\",\n\t\t},\n\t\tstartSecretBooleanArray: {\n\t\t\ttype: \"boolean[]\",\n\t\t\trequired: true,\n\t\t\tsensitive: true,\n\t\t\tdescription: \"Sensitive boolean array\",\n\t\t},\n\t\tstartSafe: { type: \"string\", required: true, sensitive: false, description: \"Safe start value\" },\n\t},\n\tendAttributes: {\n\t\tendSecret: { type: \"string\", sensitive: true, description: \"Sensitive end value\" },\n\t\tendSecretNumber: { type: \"number\", sensitive: true, description: \"Sensitive end number\" },\n\t},\n\tevents: {\n\t\tresult: {\n\t\t\tdescription: \"Result event\",\n\t\t\tattributes: {\n\t\t\t\teventSecret: { type: \"string\", required: true, sensitive: true, description: \"Sensitive event value\" },\n\t\t\t\teventSecretBoolean: {\n\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tsensitive: true,\n\t\t\t\t\tdescription: \"Sensitive event boolean\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\tstatus: { default: \"ok\", errorWhen: \"The operation fails\" },\n} satisfies TelemetrySpanDefinition;\n\ntype ConformanceTest = (fixture: TelemetryAdapterFixture) => Promise<void>;\n\nfunction assertTraceparent(value: string | undefined): asserts value is string {\n\tok(value, \"Expected a traceparent\");\n\tconst match = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/.exec(value);\n\tok(match, \"Expected a valid W3C traceparent\");\n\tok(match[1] !== \"0\".repeat(32), \"Expected a non-zero trace ID\");\n\tok(match[2] !== \"0\".repeat(16), \"Expected a non-zero span ID\");\n\tok(match[3] === \"00\" || match[3] === \"01\", \"Expected only the sampled trace flag\");\n}\n\nfunction createCase(\n\tfactory: TelemetryAdapterFixtureFactory,\n\tgroup: string,\n\tname: string,\n\ttest: ConformanceTest,\n): TelemetryAdapterConformanceCase {\n\treturn {\n\t\tgroup,\n\t\tname,\n\t\tasync run() {\n\t\t\tawait using fixture = await factory();\n\t\t\tawait test(fixture);\n\t\t},\n\t};\n}\n\nfunction findSpan(spans: readonly RecordedTelemetrySpan[], name: string): RecordedTelemetrySpan {\n\tconst span = spans.find((candidate) => candidate.name === name);\n\tok(span, `Expected recorded span ${name}`);\n\treturn span;\n}\n\nasync function rejectsWithSameValue<Result>(operation: Result | Promise<Result>, expected: unknown): Promise<void> {\n\ttry {\n\t\tawait operation;\n\t\tfail(\"Expected operation to reject\");\n\t} catch (error) {\n\t\tstrictEqual(error, expected);\n\t}\n}\n\nfunction unreadable<T extends object>(value: T): T {\n\treturn new Proxy(value, {\n\t\tget: () => {\n\t\t\tthrow new Error(\"read\");\n\t\t},\n\t\tgetOwnPropertyDescriptor: () => {\n\t\t\tthrow new Error(\"inspect\");\n\t\t},\n\t\tgetPrototypeOf: () => {\n\t\t\tthrow new Error(\"prototype\");\n\t\t},\n\t\townKeys: () => {\n\t\t\tthrow new Error(\"enumerate\");\n\t\t},\n\t});\n}\n\n/** Creates runner-independent cases for the callback telemetry adapter contract. */\nexport function createTelemetryAdapterConformance(\n\tfactory: TelemetryAdapterFixtureFactory,\n): readonly TelemetryAdapterConformanceCase[] {\n\treturn [\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"callback lifecycle\",\n\t\t\t\"admits once synchronously and preserves the result\",\n\t\t\tasync (fixture) => {\n\t\t\t\tlet admitted = false;\n\t\t\t\tlet calls = 0;\n\t\t\t\tconst expected = { value: 42 };\n\t\t\t\tconst result = fixture.context.startSpan({ name: \"success\" }, () => {\n\t\t\t\t\tadmitted = true;\n\t\t\t\t\tcalls++;\n\t\t\t\t\treturn expected;\n\t\t\t\t});\n\n\t\t\t\tok(!(result instanceof Promise), \"Expected a synchronous callback result to remain synchronous\");\n\t\t\t\tstrictEqual(admitted, true);\n\t\t\t\tstrictEqual(calls, 1);\n\t\t\t\tstrictEqual(await result, expected);\n\t\t\t\tdeepStrictEqual(findSpan(await fixture.getSpans(), \"success\").status, { status: \"ok\" });\n\t\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"success\").settled, true);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"callback lifecycle\",\n\t\t\t\"preserves synchronous and asynchronous rejection values\",\n\t\t\tasync (fixture) => {\n\t\t\t\tconst syncError = new Error(\"sync\");\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"sync-error\" }, () => {\n\t\t\t\t\t\tthrow syncError;\n\t\t\t\t\t}),\n\t\t\t\t\tsyncError,\n\t\t\t\t);\n\n\t\t\t\tconst asyncError = { kind: \"async\" };\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"async-error\" }, async () => {\n\t\t\t\t\t\tthrow asyncError;\n\t\t\t\t\t}),\n\t\t\t\t\tasyncError,\n\t\t\t\t);\n\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"undefined-error\" }, () => Promise.reject(undefined)),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\n\t\t\t\tconst unreadableError = unreadable({ kind: \"unreadable\" });\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"unreadable-error\" }, () => {\n\t\t\t\t\t\tthrow unreadableError;\n\t\t\t\t\t}),\n\t\t\t\t\tunreadableError,\n\t\t\t\t);\n\n\t\t\t\tconst asyncUnreadableError = unreadable({ kind: \"async-unreadable\" });\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"async-unreadable-error\" }, () =>\n\t\t\t\t\t\tPromise.reject(asyncUnreadableError),\n\t\t\t\t\t),\n\t\t\t\t\tasyncUnreadableError,\n\t\t\t\t);\n\n\t\t\t\tconst spans = await fixture.getSpans();\n\t\t\t\tfor (const name of [\n\t\t\t\t\t\"sync-error\",\n\t\t\t\t\t\"async-error\",\n\t\t\t\t\t\"undefined-error\",\n\t\t\t\t\t\"unreadable-error\",\n\t\t\t\t\t\"async-unreadable-error\",\n\t\t\t\t]) {\n\t\t\t\t\tstrictEqual(findSpan(spans, name).status.status, \"error\");\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"status\", \"uses last explicit status without automatic overwrite\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"last-status\" }, (span) => {\n\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"first\" } });\n\t\t\t\tspan.setStatus({ status: \"ok\" });\n\t\t\t});\n\n\t\t\tconst thrown = new Error(\"after explicit status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"explicit-before-throw\" }, (span) => {\n\t\t\t\t\tspan.setStatus({ status: \"ok\" });\n\t\t\t\t\tthrow thrown;\n\t\t\t\t}),\n\t\t\t\tthrown,\n\t\t\t);\n\n\t\t\tconst rejected = new Error(\"after async explicit status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"explicit-before-rejection\" }, (span) => {\n\t\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"async failure\" } });\n\t\t\t\t\treturn Promise.reject(rejected);\n\t\t\t\t}),\n\t\t\t\trejected,\n\t\t\t);\n\n\t\t\tawait fixture.context.startSpan({ name: \"expected-failure\" }, (span) => {\n\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"returned failure\" } });\n\t\t\t\treturn { ok: false };\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tdeepStrictEqual(findSpan(spans, \"last-status\").status, { status: \"ok\" });\n\t\t\tdeepStrictEqual(findSpan(spans, \"explicit-before-throw\").status, { status: \"ok\" });\n\t\t\tdeepStrictEqual(findSpan(spans, \"explicit-before-rejection\").status, {\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror: { name: \"Expected\", message: \"async failure\" },\n\t\t\t});\n\t\t\tdeepStrictEqual(findSpan(spans, \"expected-failure\").status, {\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror: { name: \"Expected\", message: \"returned failure\" },\n\t\t\t});\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"merges attributes and records ordered events\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan(\n\t\t\t\t{\n\t\t\t\t\tname: \"recording\",\n\t\t\t\t\tattributes: { start: \"value\", overwrite: \"start\", ignored: undefined },\n\t\t\t\t},\n\t\t\t\t(span) => {\n\t\t\t\t\tspan.setAttributes({ count: 1, overwrite: \"middle\" });\n\t\t\t\t\tspan.setAttributes({ count: undefined, overwrite: \"end\" });\n\t\t\t\t\tspan.addEvent(\"first\", { index: 1, ignored: undefined });\n\t\t\t\t\tspan.addEvent(\"second\", { index: 2 });\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst span = findSpan(await fixture.getSpans(), \"recording\");\n\t\t\tdeepStrictEqual(span.attributes, { start: \"value\", overwrite: \"end\", count: 1 });\n\t\t\tdeepStrictEqual(span.events, [\n\t\t\t\t{ name: \"first\", attributes: { index: 1 } },\n\t\t\t\t{ name: \"second\", attributes: { index: 2 } },\n\t\t\t]);\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"ignores failed attribute calls atomically\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"atomic-attributes\", attributes: { retained: \"value\" } }, (span) => {\n\t\t\t\tconst attributes: SpanAttributes = {\n\t\t\t\t\tpartial: \"must not survive\",\n\t\t\t\t\tunreadable: unreadable([\"value\"]),\n\t\t\t\t};\n\t\t\t\tdoesNotThrow(() => span.setAttributes(attributes));\n\t\t\t});\n\n\t\t\tdeepStrictEqual(findSpan(await fixture.getSpans(), \"atomic-attributes\").attributes, {\n\t\t\t\tretained: \"value\",\n\t\t\t});\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"makes calls after settlement inert\", async (fixture) => {\n\t\t\tlet settledSpan: TelemetrySpan | undefined;\n\t\t\tawait fixture.context.startSpan({ name: \"settled\", attributes: { value: \"initial\" } }, (span) => {\n\t\t\t\tsettledSpan = span;\n\t\t\t});\n\t\t\tconst capturedSpan = settledSpan;\n\t\t\tif (!capturedSpan) throw new Error(\"Expected callback span\");\n\n\t\t\tdoesNotThrow(() => capturedSpan.setAttributes({ value: \"late\" }));\n\t\t\tdoesNotThrow(() => capturedSpan.addEvent(\"late\", { value: true }));\n\t\t\tdoesNotThrow(() => capturedSpan.setStatus({ status: \"error\" }));\n\t\t\tlet childAdmitted = false;\n\t\t\tconst childResult = capturedSpan.startSpan({ name: \"late-child\" }, () => {\n\t\t\t\tchildAdmitted = true;\n\t\t\t\treturn 7;\n\t\t\t});\n\t\t\tstrictEqual(childAdmitted, true);\n\t\t\tok(!(childResult instanceof Promise), \"Expected a synchronous child result to remain synchronous\");\n\t\t\tstrictEqual(await childResult, 7);\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tstrictEqual(spans.length, 1);\n\t\t\tdeepStrictEqual(spans[0]?.attributes, { value: \"initial\" });\n\t\t\tdeepStrictEqual(spans[0]?.events, []);\n\t\t\tdeepStrictEqual(spans[0]?.status, { status: \"ok\" });\n\t\t}),\n\n\t\tcreateCase(factory, \"parentage\", \"records nested and concurrent child relationships\", async (fixture) => {\n\t\t\tlet releaseFirst: (() => void) | undefined;\n\t\t\tconst firstGate = new Promise<void>((resolve) => {\n\t\t\t\treleaseFirst = resolve;\n\t\t\t});\n\n\t\t\tawait fixture.context.startSpan({ name: \"parent\" }, async (parent) => {\n\t\t\t\tconst first = parent.startSpan({ name: \"first-child\" }, async () => {\n\t\t\t\t\tawait firstGate;\n\t\t\t\t});\n\t\t\t\tconst second = parent.startSpan({ name: \"second-child\" }, () => \"done\");\n\t\t\t\tstrictEqual(await second, \"done\");\n\t\t\t\treleaseFirst?.();\n\t\t\t\tawait first;\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tconst parent = findSpan(spans, \"parent\");\n\t\t\tconst first = findSpan(spans, \"first-child\");\n\t\t\tconst second = findSpan(spans, \"second-child\");\n\t\t\tstrictEqual(parent.parentId, null);\n\t\t\tstrictEqual(first.parentId, parent.id);\n\t\t\tstrictEqual(second.parentId, parent.id);\n\t\t\tok(second.endSequence !== undefined && first.endSequence !== undefined && parent.endSequence !== undefined);\n\t\t\tok(second.endSequence < first.endSequence);\n\t\t\tok(first.endSequence < parent.endSequence);\n\t\t}),\n\n\t\tcreateCase(factory, \"privacy\", \"redacts schema-declared sensitive attributes\", async (fixture) => {\n\t\t\tconst startSecret = \"start-secret-value\";\n\t\t\tconst startSecretNumber = 42;\n\t\t\tconst startSecretBoolean = true;\n\t\t\tconst startSecretArray = [\"one\", \"two\"];\n\t\t\tconst startSecretNumberArray = [1, 2];\n\t\t\tconst startSecretBooleanArray = [true, false];\n\t\t\tconst endSecret = \"end-secret-value\";\n\t\t\tconst endSecretNumber = 84;\n\t\t\tconst eventSecret = \"event-secret-value\";\n\t\t\tconst eventSecretBoolean = false;\n\t\t\tawait fixture.context.startSpan(\n\t\t\t\t{\n\t\t\t\t\tname: \"sensitive\",\n\t\t\t\t\tschema: sensitiveSpanSchema,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tstartSecret,\n\t\t\t\t\t\tstartSecretNumber,\n\t\t\t\t\t\tstartSecretBoolean,\n\t\t\t\t\t\tstartSecretArray,\n\t\t\t\t\t\tstartSecretNumberArray,\n\t\t\t\t\t\tstartSecretBooleanArray,\n\t\t\t\t\t\tstartSafe: \"retained\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t(span) => {\n\t\t\t\t\tspan.setAttributes({ endSecret, endSecretNumber });\n\t\t\t\t\tspan.addEvent(\"result\", { eventSecret, eventSecretBoolean });\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst span = findSpan(await fixture.getSpans(), \"sensitive\");\n\t\t\tnotDeepStrictEqual(span.attributes.startSecret, startSecret);\n\t\t\tnotDeepStrictEqual(span.attributes.startSecretNumber, startSecretNumber);\n\t\t\tnotDeepStrictEqual(span.attributes.startSecretBoolean, startSecretBoolean);\n\t\t\tnotDeepStrictEqual(span.attributes.startSecretArray, startSecretArray);\n\t\t\tnotDeepStrictEqual(span.attributes.startSecretNumberArray, startSecretNumberArray);\n\t\t\tnotDeepStrictEqual(span.attributes.startSecretBooleanArray, startSecretBooleanArray);\n\t\t\tnotDeepStrictEqual(span.attributes.endSecret, endSecret);\n\t\t\tnotDeepStrictEqual(span.attributes.endSecretNumber, endSecretNumber);\n\t\t\tdeepStrictEqual(span.attributes.startSafe, \"retained\");\n\t\t\tconst event = span.events.find((candidate) => candidate.name === \"result\");\n\t\t\tok(event);\n\t\t\tnotDeepStrictEqual(event.attributes.eventSecret, eventSecret);\n\t\t\tnotDeepStrictEqual(event.attributes.eventSecretBoolean, eventSecretBoolean);\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"skips disabled spans without skipping callbacks\", async (fixture) => {\n\t\t\tlet admitted = false;\n\t\t\tconst result = fixture.context.startSpan({ name: \"disabled\", enabled: false }, () => {\n\t\t\t\tadmitted = true;\n\t\t\t\treturn 17;\n\t\t\t});\n\n\t\t\tstrictEqual(admitted, true);\n\t\t\tstrictEqual(result, 17);\n\t\t\tdeepStrictEqual(await fixture.getSpans(), []);\n\t\t}),\n\n\t\tcreateCase(factory, \"timing\", \"records a sane elapsed duration\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"timed\" }, async () => {\n\t\t\t\tawait new Promise<void>((resolve) => setTimeout(resolve, 10));\n\t\t\t});\n\n\t\t\tconst span = findSpan(await fixture.getSpans(), \"timed\");\n\t\t\tok(span.startedAt !== undefined);\n\t\t\tok(Number.isFinite(span.startedAt));\n\t\t\tok(span.endedAt !== undefined);\n\t\t\tok(Number.isFinite(span.endedAt));\n\t\t\tok(span.duration !== undefined);\n\t\t\tok(Number.isFinite(span.duration));\n\t\t\tok(span.endedAt >= span.startedAt, \"Expected a non-decreasing clock\");\n\t\t\tok(span.duration > 0, \"Expected a positive elapsed duration\");\n\t\t\tok(span.duration < 60_000, \"Expected an implausibly long duration to fail\");\n\t\t\tstrictEqual(span.duration, span.endedAt - span.startedAt);\n\t\t}),\n\n\t\tcreateCase(factory, \"parentage\", \"preserves W3C parentage across a context boundary\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"boundary-parent\" }, async (parent) => {\n\t\t\t\tconst traceparent = fixture.context.inject(parent);\n\t\t\t\tassertTraceparent(traceparent);\n\t\t\t\tconst remote = fixture.context.extract(traceparent);\n\t\t\t\tawait remote.startSpan({ name: \"boundary-child\" }, (child) => {\n\t\t\t\t\tconst childTraceparent = remote.inject(child);\n\t\t\t\t\tassertTraceparent(childTraceparent);\n\t\t\t\t\tstrictEqual(childTraceparent.slice(0, 35), traceparent.slice(0, 35));\n\t\t\t\t\tnotDeepStrictEqual(childTraceparent.slice(36, 52), traceparent.slice(36, 52));\n\t\t\t\t});\n\t\t\t\tconst invalidFromSpan = parent.extract(\"not-a-traceparent\");\n\t\t\t\tawait invalidFromSpan.startSpan({ name: \"invalid-span-extract\" }, () => undefined);\n\t\t\t\tconst missingFromSpan = parent.extract(undefined);\n\t\t\t\tawait missingFromSpan.startSpan({ name: \"missing-span-extract\" }, () => undefined);\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tconst parent = findSpan(spans, \"boundary-parent\");\n\t\t\tconst child = findSpan(spans, \"boundary-child\");\n\t\t\tassertTraceparent(parent.traceparent);\n\t\t\tassertTraceparent(child.traceparent);\n\t\t\tstrictEqual(child.parentId, null);\n\t\t\tstrictEqual(child.parentTraceparent, parent.traceparent);\n\t\t\tstrictEqual(child.traceparent.slice(0, 35), parent.traceparent.slice(0, 35));\n\n\t\t\tconst invalid = fixture.context.extract(\"not-a-traceparent\");\n\t\t\tawait invalid.startSpan({ name: \"invalid-boundary\" }, () => undefined);\n\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"invalid-boundary\").parentTraceparent, null);\n\n\t\t\tconst unsampled = fixture.context.extract(\"00-11111111111111111111111111111111-2222222222222222-00\");\n\t\t\tawait unsampled.startSpan({ name: \"unsampled-boundary\" }, (child) => {\n\t\t\t\tconst childTraceparent = unsampled.inject(child);\n\t\t\t\tassertTraceparent(childTraceparent);\n\t\t\t\tstrictEqual(childTraceparent.slice(0, 35), \"00-11111111111111111111111111111111\");\n\t\t\t\tstrictEqual(childTraceparent.slice(53), \"00\");\n\t\t\t});\n\n\t\t\tconst reservedFlags = fixture.context.extract(\"00-77777777777777777777777777777777-8888888888888888-03\");\n\t\t\tawait reservedFlags.startSpan({ name: \"reserved-flags-boundary\" }, (child) => {\n\t\t\t\tconst childTraceparent = reservedFlags.inject(child);\n\t\t\t\tassertTraceparent(childTraceparent);\n\t\t\t\tstrictEqual(childTraceparent.slice(53), \"01\");\n\t\t\t});\n\n\t\t\tconst future = fixture.context.extract(\n\t\t\t\t\"01-33333333333333333333333333333333-4444444444444444-03-future-extension\",\n\t\t\t);\n\t\t\tawait future.startSpan({ name: \"future-boundary\" }, (child) => {\n\t\t\t\tconst childTraceparent = future.inject(child);\n\t\t\t\tassertTraceparent(childTraceparent);\n\t\t\t\tstrictEqual(childTraceparent.slice(0, 35), \"00-33333333333333333333333333333333\");\n\t\t\t\tstrictEqual(childTraceparent.slice(53), \"01\");\n\t\t\t});\n\n\t\t\tconst directParent = \"00-55555555555555555555555555555555-6666666666666666-01\";\n\t\t\tawait fixture.context.startSpan({ name: \"direct-boundary\", traceparent: directParent }, (child) => {\n\t\t\t\tconst childTraceparent = fixture.context.inject(child);\n\t\t\t\tassertTraceparent(childTraceparent);\n\t\t\t\tstrictEqual(childTraceparent.slice(0, 35), directParent.slice(0, 35));\n\t\t\t});\n\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"direct-boundary\").parentTraceparent, directParent);\n\n\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"invalid-span-extract\").parentTraceparent, null);\n\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"missing-span-extract\").parentTraceparent, null);\n\t\t}),\n\n\t\tcreateCase(factory, \"passivity\", \"suppresses unreadable telemetry payload failures\", async (fixture) => {\n\t\t\tlet calls = 0;\n\t\t\tconst options = unreadable<SpanOptions>({ name: \"unreadable-options\", attributes: { secret: \"value\" } });\n\t\t\tconst result = fixture.context.startSpan(options, () => {\n\t\t\t\tcalls++;\n\t\t\t\treturn 9;\n\t\t\t});\n\n\t\t\tstrictEqual(calls, 1);\n\t\t\tstrictEqual(await result, 9);\n\t\t\tdeepStrictEqual(await fixture.getSpans(), []);\n\n\t\t\tawait fixture.context.startSpan({ name: \"unreadable-recording\" }, (span) => {\n\t\t\t\tconst attributes = unreadable<SpanAttributes>({ secret: \"value\" });\n\t\t\t\tconst status = unreadable<SpanStatus>({ status: \"ok\" });\n\t\t\t\tdoesNotThrow(() => span.setAttributes(attributes));\n\t\t\t\tdoesNotThrow(() => span.addEvent(\"unreadable-event\", attributes));\n\t\t\t\tdoesNotThrow(() => span.setStatus(status));\n\t\t\t});\n\n\t\t\tconst recorded = await fixture.getSpans();\n\t\t\tstrictEqual(recorded.length, 1);\n\t\t\tdeepStrictEqual(recorded[0]?.attributes, {});\n\t\t\tdeepStrictEqual(recorded[0]?.events, []);\n\t\t\tdeepStrictEqual(recorded[0]?.status, { status: \"ok\" });\n\t\t}),\n\n\t\tcreateCase(factory, \"passivity\", \"ignores failed status calls atomically\", async (fixture) => {\n\t\t\tconst rejection = new Error(\"rejected after unreadable status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"unreadable-status\" }, (span) => {\n\t\t\t\t\tconst status = unreadable<SpanStatus>({ status: \"ok\" });\n\t\t\t\t\tdoesNotThrow(() => span.setStatus(status));\n\t\t\t\t\treturn Promise.reject(rejection);\n\t\t\t\t}),\n\t\t\t\trejection,\n\t\t\t);\n\n\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"unreadable-status\").status.status, \"error\");\n\t\t}),\n\t];\n}\n"]}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { redactAttributes } from "../redaction.ts";
|
|
1
2
|
export { createTelemetryAdapterConformance } from "./conformance.ts";
|
|
2
3
|
export type { TelemetryAdapterConformanceCase, TelemetryAdapterFixture, TelemetryAdapterFixtureFactory, } from "./types.ts";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AACrE,YAAY,EACX,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,GAC9B,MAAM,YAAY,CAAC","sourcesContent":["export { createTelemetryAdapterConformance } from \"./conformance.ts\";\nexport type {\n\tTelemetryAdapterConformanceCase,\n\tTelemetryAdapterFixture,\n\tTelemetryAdapterFixtureFactory,\n} from \"./types.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AACrE,YAAY,EACX,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,GAC9B,MAAM,YAAY,CAAC","sourcesContent":["export { redactAttributes } from \"../redaction.ts\";\nexport { createTelemetryAdapterConformance } from \"./conformance.ts\";\nexport type {\n\tTelemetryAdapterConformanceCase,\n\tTelemetryAdapterFixture,\n\tTelemetryAdapterFixtureFactory,\n} from \"./types.ts\";\n"]}
|
package/dist/testing/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { createTelemetryAdapterConformance } from \"./conformance.ts\";\nexport type {\n\tTelemetryAdapterConformanceCase,\n\tTelemetryAdapterFixture,\n\tTelemetryAdapterFixtureFactory,\n} from \"./types.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { redactAttributes } from \"../redaction.ts\";\nexport { createTelemetryAdapterConformance } from \"./conformance.ts\";\nexport type {\n\tTelemetryAdapterConformanceCase,\n\tTelemetryAdapterFixture,\n\tTelemetryAdapterFixtureFactory,\n} from \"./types.ts\";\n"]}
|