@mnemonica/otel 0.1.0

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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/build/hooks/attach-hooks.d.ts +3 -0
  4. package/build/hooks/attach-hooks.d.ts.map +1 -0
  5. package/build/hooks/attach-hooks.js +52 -0
  6. package/build/index.d.ts +32 -0
  7. package/build/index.d.ts.map +1 -0
  8. package/build/index.js +32 -0
  9. package/build/providers/async-flow.provider.d.ts +40 -0
  10. package/build/providers/async-flow.provider.d.ts.map +1 -0
  11. package/build/providers/async-flow.provider.js +128 -0
  12. package/build/providers/dive-otel.provider.d.ts +51 -0
  13. package/build/providers/dive-otel.provider.d.ts.map +1 -0
  14. package/build/providers/dive-otel.provider.js +238 -0
  15. package/build/providers/mnemonica-otel.provider.d.ts +12 -0
  16. package/build/providers/mnemonica-otel.provider.d.ts.map +1 -0
  17. package/build/providers/mnemonica-otel.provider.js +113 -0
  18. package/build/request-scope.d.ts +41 -0
  19. package/build/request-scope.d.ts.map +1 -0
  20. package/build/request-scope.js +35 -0
  21. package/build/thunderstruck/feed-from-request.d.ts +21 -0
  22. package/build/thunderstruck/feed-from-request.d.ts.map +1 -0
  23. package/build/thunderstruck/feed-from-request.js +34 -0
  24. package/build/thunderstruck/pre-root.d.ts +67 -0
  25. package/build/thunderstruck/pre-root.d.ts.map +1 -0
  26. package/build/thunderstruck/pre-root.js +78 -0
  27. package/build/unblind.d.ts +46 -0
  28. package/build/unblind.d.ts.map +1 -0
  29. package/build/unblind.js +120 -0
  30. package/build/utils/dive-flow.d.ts +24 -0
  31. package/build/utils/dive-flow.d.ts.map +1 -0
  32. package/build/utils/dive-flow.js +33 -0
  33. package/build/utils/is-mnemonica-instance.d.ts +2 -0
  34. package/build/utils/is-mnemonica-instance.d.ts.map +1 -0
  35. package/build/utils/is-mnemonica-instance.js +9 -0
  36. package/build-cjs/hooks/attach-hooks.js +55 -0
  37. package/build-cjs/index.js +52 -0
  38. package/build-cjs/package.json +1 -0
  39. package/build-cjs/providers/async-flow.provider.js +132 -0
  40. package/build-cjs/providers/dive-otel.provider.js +242 -0
  41. package/build-cjs/providers/mnemonica-otel.provider.js +117 -0
  42. package/build-cjs/request-scope.js +38 -0
  43. package/build-cjs/thunderstruck/feed-from-request.js +37 -0
  44. package/build-cjs/thunderstruck/pre-root.js +83 -0
  45. package/build-cjs/unblind.js +127 -0
  46. package/build-cjs/utils/dive-flow.js +37 -0
  47. package/build-cjs/utils/is-mnemonica-instance.js +12 -0
  48. package/package.json +69 -0
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.feedPreRootFromRequest = feedPreRootFromRequest;
4
+ /**
5
+ * Thunderstruck boundary helper — the framework-free half of what a
6
+ * framework's interceptor/middleware does: shape any HTTP framework's
7
+ * request into the
8
+ * raw pre-root payload and stamp its part objects, so pipes and construct
9
+ * handlers correlate the payload by OBJECT IDENTITY (see pre-root.ts for
10
+ * the store's lifetime and correlation semantics).
11
+ *
12
+ * Framework mapping notes:
13
+ * - Express: pass `req` directly — method/url/params(→req.params)/
14
+ * query/body/headers all sit on it.
15
+ * - Fastify: pass the FastifyRequest — it exposes params/query/body/
16
+ * headers; `method`/`url` exist on it since Fastify v4 (fall back to
17
+ * `req.raw` if you target older majors).
18
+ * - raw http: `url`/`method` are on IncomingMessage; body/query/params
19
+ * are yours to parse first (or omit — primitives and missing parts
20
+ * simply don't correlate, the feed still records).
21
+ */
22
+ const pre_root_js_1 = require("./pre-root.js");
23
+ function feedPreRootFromRequest(req, options) {
24
+ const raw = {
25
+ method: req.method,
26
+ url: req.url,
27
+ params: req.params,
28
+ query: req.query,
29
+ body: req.body,
30
+ headers: req.headers,
31
+ };
32
+ if (options?.storeRequest === true) {
33
+ raw.request = req;
34
+ }
35
+ (0, pre_root_js_1.feedPreRoot)(raw);
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZC1mcm9tLXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGh1bmRlcnN0cnVjay9mZWVkLWZyb20tcmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXlDQSx3REFhQztBQXRERDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCwrQ0FBb0U7QUF1QnBFLFNBQWdCLHNCQUFzQixDQUFFLEdBQWdCLEVBQUUsT0FBNEI7SUFDckYsTUFBTSxHQUFHLEdBQXNCO1FBQzlCLE1BQU0sRUFBSyxHQUFHLENBQUMsTUFBTTtRQUNyQixHQUFHLEVBQVEsR0FBRyxDQUFDLEdBQUc7UUFDbEIsTUFBTSxFQUFLLEdBQUcsQ0FBQyxNQUFNO1FBQ3JCLEtBQUssRUFBTSxHQUFHLENBQUMsS0FBSztRQUNwQixJQUFJLEVBQU8sR0FBRyxDQUFDLElBQUk7UUFDbkIsT0FBTyxFQUFJLEdBQUcsQ0FBQyxPQUFPO0tBQ3RCLENBQUM7SUFDRixJQUFJLE9BQU8sRUFBRSxZQUFZLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUEseUJBQVcsRUFBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaHVuZGVyc3RydWNrIGJvdW5kYXJ5IGhlbHBlciDigJQgdGhlIGZyYW1ld29yay1mcmVlIGhhbGYgb2Ygd2hhdCBhXG4gKiBmcmFtZXdvcmsncyBpbnRlcmNlcHRvci9taWRkbGV3YXJlIGRvZXM6IHNoYXBlIGFueSBIVFRQIGZyYW1ld29yaydzXG4gKiByZXF1ZXN0IGludG8gdGhlXG4gKiByYXcgcHJlLXJvb3QgcGF5bG9hZCBhbmQgc3RhbXAgaXRzIHBhcnQgb2JqZWN0cywgc28gcGlwZXMgYW5kIGNvbnN0cnVjdFxuICogaGFuZGxlcnMgY29ycmVsYXRlIHRoZSBwYXlsb2FkIGJ5IE9CSkVDVCBJREVOVElUWSAoc2VlIHByZS1yb290LnRzIGZvclxuICogdGhlIHN0b3JlJ3MgbGlmZXRpbWUgYW5kIGNvcnJlbGF0aW9uIHNlbWFudGljcykuXG4gKlxuICogRnJhbWV3b3JrIG1hcHBpbmcgbm90ZXM6XG4gKiAgLSBFeHByZXNzOiBwYXNzIGByZXFgIGRpcmVjdGx5IOKAlCBtZXRob2QvdXJsL3BhcmFtcyjihpJyZXEucGFyYW1zKS9cbiAqICAgIHF1ZXJ5L2JvZHkvaGVhZGVycyBhbGwgc2l0IG9uIGl0LlxuICogIC0gRmFzdGlmeTogcGFzcyB0aGUgRmFzdGlmeVJlcXVlc3Qg4oCUIGl0IGV4cG9zZXMgcGFyYW1zL3F1ZXJ5L2JvZHkvXG4gKiAgICBoZWFkZXJzOyBgbWV0aG9kYC9gdXJsYCBleGlzdCBvbiBpdCBzaW5jZSBGYXN0aWZ5IHY0IChmYWxsIGJhY2sgdG9cbiAqICAgIGByZXEucmF3YCBpZiB5b3UgdGFyZ2V0IG9sZGVyIG1ham9ycykuXG4gKiAgLSByYXcgaHR0cDogYHVybGAvYG1ldGhvZGAgYXJlIG9uIEluY29taW5nTWVzc2FnZTsgYm9keS9xdWVyeS9wYXJhbXNcbiAqICAgIGFyZSB5b3VycyB0byBwYXJzZSBmaXJzdCAob3Igb21pdCDigJQgcHJpbWl0aXZlcyBhbmQgbWlzc2luZyBwYXJ0c1xuICogICAgc2ltcGx5IGRvbid0IGNvcnJlbGF0ZSwgdGhlIGZlZWQgc3RpbGwgcmVjb3JkcykuXG4gKi9cbmltcG9ydCB7IGZlZWRQcmVSb290LCB0eXBlIFJhd1ByZVJvb3RQYXlsb2FkIH0gZnJvbSAnLi9wcmUtcm9vdC5qcyc7XG5cbi8qKiBTdHJ1Y3R1cmFsIG1pbmltdW0gb2YgYW4gSFRUUCByZXF1ZXN0IGFueSBmcmFtZXdvcmsgY2FuIHNhdGlzZnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RMaWtlIHtcblx0bWV0aG9kICAgOiBzdHJpbmc7XG5cdHVybCAgICAgIDogc3RyaW5nO1xuXHRwYXJhbXM/ICA6IHVua25vd247XG5cdHF1ZXJ5PyAgIDogdW5rbm93bjtcblx0Ym9keT8gICAgOiB1bmtub3duO1xuXHRoZWFkZXJzPyA6IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVlZFByZVJvb3RPcHRpb25zIHtcblx0LyoqXG5cdCAqIExpbmsgdGhlIHJhdyByZXF1ZXN0IG9iamVjdCBpbnRvIHRoZSBwcmUtcm9vdCByZWNvcmQgKGByYXcucmVxdWVzdGApXG5cdCAqIEFORCBzdGFtcCBpdCBhcyBhIGNvcnJlbGF0aW9uIGtleSwgc28gZ2V0UHJlUm9vdChyZXEpIHJlc29sdmVzIGZyb21cblx0ICogYW55d2hlcmUgdGhlIHJlcXVlc3QgaXMgcmVhY2hhYmxlIOKAlCBlLmcuIGFuIGVycm9yIGJvdW5kYXJ5IGhvbGRpbmdcblx0ICogb25seSB0aGUgcmVxdWVzdC4gUmV0ZW50aW9uIGlzIHVuY2hhbmdlZDogdGhlIHJlY29yZCBkaWVzIHdpdGggdGhlXG5cdCAqIHJlcXVlc3QuXG5cdCAqL1xuXHRzdG9yZVJlcXVlc3Q/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVlZFByZVJvb3RGcm9tUmVxdWVzdCAocmVxOiBSZXF1ZXN0TGlrZSwgb3B0aW9ucz86IEZlZWRQcmVSb290T3B0aW9ucyk6IHZvaWQge1xuXHRjb25zdCByYXc6IFJhd1ByZVJvb3RQYXlsb2FkID0ge1xuXHRcdG1ldGhvZCAgIDogcmVxLm1ldGhvZCxcblx0XHR1cmwgICAgICA6IHJlcS51cmwsXG5cdFx0cGFyYW1zICAgOiByZXEucGFyYW1zLFxuXHRcdHF1ZXJ5ICAgIDogcmVxLnF1ZXJ5LFxuXHRcdGJvZHkgICAgIDogcmVxLmJvZHksXG5cdFx0aGVhZGVycyAgOiByZXEuaGVhZGVycyxcblx0fTtcblx0aWYgKG9wdGlvbnM/LnN0b3JlUmVxdWVzdCA9PT0gdHJ1ZSkge1xuXHRcdHJhdy5yZXF1ZXN0ID0gcmVxO1xuXHR9XG5cdGZlZWRQcmVSb290KHJhdyk7XG59XG4iXX0=
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ /**
3
+ * Thunderstruck pre-root correlation store (adapter side).
4
+ *
5
+ * The correlation key is OBJECT IDENTITY: the very body / query / params
6
+ * object the interceptor saw at the boundary is the same reference pipes and
7
+ * construct handlers receive later. A WeakMap<object, payloads> therefore
8
+ * correlates without AsyncLocalStorage and without races — concurrent
9
+ * requests can never read each other's payloads because each holds only its
10
+ * own objects.
11
+ *
12
+ * The payloads live INSIDE the WeakMap record: there is no other store and
13
+ * no release step. When the request objects are garbage-collected, the
14
+ * payloads go with them — retention is exactly the request's lifetime.
15
+ * Dive stays free of framework-specifics and of storage entirely: it is
16
+ * the tracing engine, not a warehouse.
17
+ *
18
+ * The optional `request` link (RawPreRootPayload.request) puts the raw
19
+ * request object inside its own record and stamps it as a key too, so
20
+ * getPreRoot(req) resolves from anywhere the request is reachable. The
21
+ * WeakMap's ephemeron semantics keep this value→key cycle collectable:
22
+ * retention stays exactly the request's lifetime.
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.feedPreRoot = feedPreRoot;
26
+ exports.feedValidatedPreRoot = feedValidatedPreRoot;
27
+ exports.getPreRoot = getPreRoot;
28
+ function isObjectKey(value) {
29
+ return value !== null && (typeof value === 'object' || typeof value === 'function');
30
+ }
31
+ const preRootRecords = new WeakMap();
32
+ /**
33
+ * Stash the raw boundary payload and stamp every request-part object
34
+ * (params / query / body / headers / request) so later stages correlate
35
+ * by the object they already hold. Primitive bodies are not correlatable —
36
+ * they are still inside the raw payload, just not resolvable via
37
+ * getPreRoot.
38
+ */
39
+ function feedPreRoot(raw) {
40
+ const record = { raw };
41
+ for (const part of [raw.params, raw.query, raw.body, raw.headers, raw.request]) {
42
+ if (isObjectKey(part)) {
43
+ preRootRecords.set(part, record);
44
+ }
45
+ }
46
+ }
47
+ /**
48
+ * Attach the validated DTO to the record of the boundary object it came
49
+ * from. Called by MnemonicaValidationPipe after class-validator passes.
50
+ * No-op when the object was never stamped (the interceptor is not active).
51
+ */
52
+ function feedValidatedPreRoot(forValue, validated) {
53
+ if (!isObjectKey(forValue)) {
54
+ return;
55
+ }
56
+ const record = preRootRecords.get(forValue);
57
+ if (!record) {
58
+ return;
59
+ }
60
+ record.validated = validated;
61
+ }
62
+ /**
63
+ * Resolve the pre-root payloads for a boundary object — the same body /
64
+ * query / params reference the interceptor stamped. Payloads live as long
65
+ * as the request objects do (WeakMap), so this resolves during construction
66
+ * AND afterwards — e.g. from an exception filter reporting which data
67
+ * caused the failure.
68
+ */
69
+ function getPreRoot(value) {
70
+ if (!isObjectKey(value)) {
71
+ return undefined;
72
+ }
73
+ const record = preRootRecords.get(value);
74
+ if (!record) {
75
+ return undefined;
76
+ }
77
+ const result = {
78
+ raw: record.raw,
79
+ validated: record.validated,
80
+ };
81
+ return result;
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlLXJvb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGh1bmRlcnN0cnVjay9wcmUtcm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRzs7QUF3Q0gsa0NBT0M7QUFPRCxvREFTQztBQVNELGdDQWFDO0FBMURELFNBQVMsV0FBVyxDQUFFLEtBQWM7SUFDbkMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztBQUU1RDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixXQUFXLENBQUUsR0FBc0I7SUFDbEQsTUFBTSxNQUFNLEdBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDaEYsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QixjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0YsQ0FBQztBQUNGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUUsUUFBaUIsRUFBRSxTQUFrQjtJQUMxRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTztJQUNSLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNiLE9BQU87SUFDUixDQUFDO0lBQ0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLFVBQVUsQ0FBRSxLQUFjO0lBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDYixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQWdCO1FBQzNCLEdBQUcsRUFBUyxNQUFNLENBQUMsR0FBRztRQUN0QixTQUFTLEVBQUcsTUFBTSxDQUFDLFNBQVM7S0FDNUIsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGh1bmRlcnN0cnVjayBwcmUtcm9vdCBjb3JyZWxhdGlvbiBzdG9yZSAoYWRhcHRlciBzaWRlKS5cbiAqXG4gKiBUaGUgY29ycmVsYXRpb24ga2V5IGlzIE9CSkVDVCBJREVOVElUWTogdGhlIHZlcnkgYm9keSAvIHF1ZXJ5IC8gcGFyYW1zXG4gKiBvYmplY3QgdGhlIGludGVyY2VwdG9yIHNhdyBhdCB0aGUgYm91bmRhcnkgaXMgdGhlIHNhbWUgcmVmZXJlbmNlIHBpcGVzIGFuZFxuICogY29uc3RydWN0IGhhbmRsZXJzIHJlY2VpdmUgbGF0ZXIuIEEgV2Vha01hcDxvYmplY3QsIHBheWxvYWRzPiB0aGVyZWZvcmVcbiAqIGNvcnJlbGF0ZXMgd2l0aG91dCBBc3luY0xvY2FsU3RvcmFnZSBhbmQgd2l0aG91dCByYWNlcyDigJQgY29uY3VycmVudFxuICogcmVxdWVzdHMgY2FuIG5ldmVyIHJlYWQgZWFjaCBvdGhlcidzIHBheWxvYWRzIGJlY2F1c2UgZWFjaCBob2xkcyBvbmx5IGl0c1xuICogb3duIG9iamVjdHMuXG4gKlxuICogVGhlIHBheWxvYWRzIGxpdmUgSU5TSURFIHRoZSBXZWFrTWFwIHJlY29yZDogdGhlcmUgaXMgbm8gb3RoZXIgc3RvcmUgYW5kXG4gKiBubyByZWxlYXNlIHN0ZXAuIFdoZW4gdGhlIHJlcXVlc3Qgb2JqZWN0cyBhcmUgZ2FyYmFnZS1jb2xsZWN0ZWQsIHRoZVxuICogcGF5bG9hZHMgZ28gd2l0aCB0aGVtIOKAlCByZXRlbnRpb24gaXMgZXhhY3RseSB0aGUgcmVxdWVzdCdzIGxpZmV0aW1lLlxuICogRGl2ZSBzdGF5cyBmcmVlIG9mIGZyYW1ld29yay1zcGVjaWZpY3MgYW5kIG9mIHN0b3JhZ2UgZW50aXJlbHk6IGl0IGlzXG4gKiB0aGUgdHJhY2luZyBlbmdpbmUsIG5vdCBhIHdhcmVob3VzZS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYHJlcXVlc3RgIGxpbmsgKFJhd1ByZVJvb3RQYXlsb2FkLnJlcXVlc3QpIHB1dHMgdGhlIHJhd1xuICogcmVxdWVzdCBvYmplY3QgaW5zaWRlIGl0cyBvd24gcmVjb3JkIGFuZCBzdGFtcHMgaXQgYXMgYSBrZXkgdG9vLCBzb1xuICogZ2V0UHJlUm9vdChyZXEpIHJlc29sdmVzIGZyb20gYW55d2hlcmUgdGhlIHJlcXVlc3QgaXMgcmVhY2hhYmxlLiBUaGVcbiAqIFdlYWtNYXAncyBlcGhlbWVyb24gc2VtYW50aWNzIGtlZXAgdGhpcyB2YWx1ZeKGkmtleSBjeWNsZSBjb2xsZWN0YWJsZTpcbiAqIHJldGVudGlvbiBzdGF5cyBleGFjdGx5IHRoZSByZXF1ZXN0J3MgbGlmZXRpbWUuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBSYXdQcmVSb290UGF5bG9hZCB7XG5cdG1ldGhvZCAgOiBzdHJpbmc7XG5cdHVybCAgICAgOiBzdHJpbmc7XG5cdHBhcmFtcz8gOiB1bmtub3duO1xuXHRxdWVyeT8gIDogdW5rbm93bjtcblx0Ym9keT8gICA6IHVua25vd247XG5cdGhlYWRlcnM/OiB1bmtub3duO1xuXHQvKipcblx0ICogT3B0aW9uYWwgbGluayB0byB0aGUgcmF3IHJlcXVlc3Qgb2JqZWN0IChzdG9yZVJlcXVlc3QgZmxhZykuIFdoZW5cblx0ICogcHJlc2VudCBpdCBpcyBzdGFtcGVkIGFzIGEgY29ycmVsYXRpb24ga2V5IHRvbywgc28gZ2V0UHJlUm9vdChyZXEpXG5cdCAqIHJlc29sdmVzIOKAlCBlLmcuIGZyb20gYW4gZXhjZXB0aW9uIGZpbHRlciBob2xkaW5nIG9ubHkgdGhlIHJlcXVlc3QuXG5cdCAqL1xuXHRyZXF1ZXN0PzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVSb290UmVjb3JkIHtcblx0cmF3ICAgICAgIDogdW5rbm93bjtcblx0dmFsaWRhdGVkPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVSb290RGF0YSB7XG5cdHJhdz8gICAgICA6IHVua25vd247XG5cdHZhbGlkYXRlZD86IHVua25vd247XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0S2V5ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG5cdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpO1xufVxuXG5jb25zdCBwcmVSb290UmVjb3JkcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgUHJlUm9vdFJlY29yZD4oKTtcblxuLyoqXG4gKiBTdGFzaCB0aGUgcmF3IGJvdW5kYXJ5IHBheWxvYWQgYW5kIHN0YW1wIGV2ZXJ5IHJlcXVlc3QtcGFydCBvYmplY3RcbiAqIChwYXJhbXMgLyBxdWVyeSAvIGJvZHkgLyBoZWFkZXJzIC8gcmVxdWVzdCkgc28gbGF0ZXIgc3RhZ2VzIGNvcnJlbGF0ZVxuICogYnkgdGhlIG9iamVjdCB0aGV5IGFscmVhZHkgaG9sZC4gUHJpbWl0aXZlIGJvZGllcyBhcmUgbm90IGNvcnJlbGF0YWJsZSDigJRcbiAqIHRoZXkgYXJlIHN0aWxsIGluc2lkZSB0aGUgcmF3IHBheWxvYWQsIGp1c3Qgbm90IHJlc29sdmFibGUgdmlhXG4gKiBnZXRQcmVSb290LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmVlZFByZVJvb3QgKHJhdzogUmF3UHJlUm9vdFBheWxvYWQpOiB2b2lkIHtcblx0Y29uc3QgcmVjb3JkOiBQcmVSb290UmVjb3JkID0geyByYXcgfTtcblx0Zm9yIChjb25zdCBwYXJ0IG9mIFtyYXcucGFyYW1zLCByYXcucXVlcnksIHJhdy5ib2R5LCByYXcuaGVhZGVycywgcmF3LnJlcXVlc3RdKSB7XG5cdFx0aWYgKGlzT2JqZWN0S2V5KHBhcnQpKSB7XG5cdFx0XHRwcmVSb290UmVjb3Jkcy5zZXQocGFydCwgcmVjb3JkKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBdHRhY2ggdGhlIHZhbGlkYXRlZCBEVE8gdG8gdGhlIHJlY29yZCBvZiB0aGUgYm91bmRhcnkgb2JqZWN0IGl0IGNhbWVcbiAqIGZyb20uIENhbGxlZCBieSBNbmVtb25pY2FWYWxpZGF0aW9uUGlwZSBhZnRlciBjbGFzcy12YWxpZGF0b3IgcGFzc2VzLlxuICogTm8tb3Agd2hlbiB0aGUgb2JqZWN0IHdhcyBuZXZlciBzdGFtcGVkICh0aGUgaW50ZXJjZXB0b3IgaXMgbm90IGFjdGl2ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWVkVmFsaWRhdGVkUHJlUm9vdCAoZm9yVmFsdWU6IHVua25vd24sIHZhbGlkYXRlZDogdW5rbm93bik6IHZvaWQge1xuXHRpZiAoIWlzT2JqZWN0S2V5KGZvclZhbHVlKSkge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCByZWNvcmQgPSBwcmVSb290UmVjb3Jkcy5nZXQoZm9yVmFsdWUpO1xuXHRpZiAoIXJlY29yZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRyZWNvcmQudmFsaWRhdGVkID0gdmFsaWRhdGVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHByZS1yb290IHBheWxvYWRzIGZvciBhIGJvdW5kYXJ5IG9iamVjdCDigJQgdGhlIHNhbWUgYm9keSAvXG4gKiBxdWVyeSAvIHBhcmFtcyByZWZlcmVuY2UgdGhlIGludGVyY2VwdG9yIHN0YW1wZWQuIFBheWxvYWRzIGxpdmUgYXMgbG9uZ1xuICogYXMgdGhlIHJlcXVlc3Qgb2JqZWN0cyBkbyAoV2Vha01hcCksIHNvIHRoaXMgcmVzb2x2ZXMgZHVyaW5nIGNvbnN0cnVjdGlvblxuICogQU5EIGFmdGVyd2FyZHMg4oCUIGUuZy4gZnJvbSBhbiBleGNlcHRpb24gZmlsdGVyIHJlcG9ydGluZyB3aGljaCBkYXRhXG4gKiBjYXVzZWQgdGhlIGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVSb290ICh2YWx1ZTogdW5rbm93bik6IFByZVJvb3REYXRhIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFpc09iamVjdEtleSh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IHJlY29yZCA9IHByZVJvb3RSZWNvcmRzLmdldCh2YWx1ZSk7XG5cdGlmICghcmVjb3JkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCByZXN1bHQ6IFByZVJvb3REYXRhID0ge1xuXHRcdHJhdyAgICAgICA6IHJlY29yZC5yYXcsXG5cdFx0dmFsaWRhdGVkIDogcmVjb3JkLnZhbGlkYXRlZCxcblx0fTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractSafe = extractSafe;
4
+ exports.erroredArgsSafe = erroredArgsSafe;
5
+ exports.stringifySafe = stringifySafe;
6
+ exports.buildUnblindReport = buildUnblindReport;
7
+ exports.recordUnblindTelemetry = recordUnblindTelemetry;
8
+ /**
9
+ * The Unblinder core (2026-09-03, Viktor) — framework-free error-boundary
10
+ * reporting: build the report from dive's trace + core's getProps, then
11
+ * record the telemetry. The framework wrapper owns the body discipline
12
+ * (status code, the headers-sent check, expected-client-error passthrough);
13
+ * this core owns the report and the UNCONDITIONAL telemetry.
14
+ *
15
+ * CONTRACT: report.kind ('caught-unblinded'), the span name
16
+ * ('mnemonica.caught-exception') and the [unblind] stdout marker are
17
+ * pinned by downstream consumers (runbooks grep the marker; framework
18
+ * adapters pin the report shape). Keep them stable.
19
+ */
20
+ const dive_1 = require("@mnemonica/dive");
21
+ const mnemonica_1 = require("mnemonica");
22
+ const api_1 = require("@opentelemetry/api");
23
+ /**
24
+ * extract() that cannot throw inside an error path — non-mnemonica
25
+ * values degrade to their key list.
26
+ */
27
+ function extractSafe(instance) {
28
+ try {
29
+ const result = mnemonica_1.utils.extract(instance);
30
+ return result;
31
+ }
32
+ catch {
33
+ const result = Object.keys(instance);
34
+ return result;
35
+ }
36
+ }
37
+ /**
38
+ * The attempted constructor args of a FAILED mnemonica construction ride
39
+ * the errored instance itself: the caught object IS the errored shell
40
+ * (probed 2026-09-03: caught === creationError's inheritedInstance,
41
+ * instanceof Error via the spliced prototype chain), and core's own
42
+ * getProps exposes { args, originalError, … } off the props WeakMap.
43
+ * Plain errors yield undefined; anything unexpected degrades, never
44
+ * throws inside a filter.
45
+ */
46
+ function erroredArgsSafe(error) {
47
+ try {
48
+ const props = (0, mnemonica_1.getProps)(error);
49
+ const result = props?.args;
50
+ return result;
51
+ }
52
+ catch {
53
+ const result = undefined;
54
+ return result;
55
+ }
56
+ }
57
+ /**
58
+ * JSON.stringify that cannot throw inside an error path — circular or
59
+ * hostile values degrade to a marker instead of crashing the boundary
60
+ * (a throwing boundary is exactly the cascade this fights).
61
+ */
62
+ function stringifySafe(value) {
63
+ try {
64
+ const result = JSON.stringify(value);
65
+ return result;
66
+ }
67
+ catch {
68
+ const result = '"[unserializable report payload]"';
69
+ return result;
70
+ }
71
+ }
72
+ /**
73
+ * Build the unblinded report for a caught failure: the dive branch, the
74
+ * errored construction edge, the attempted constructor args, the actual
75
+ * message. Non-Error throws are reported truthfully as such, never
76
+ * dressed up as Errors.
77
+ */
78
+ function buildUnblindReport(error) {
79
+ const isError = error instanceof Error;
80
+ const message = isError ? error.message : `non-Error thrown (${typeof error})`;
81
+ const flow = isError ? (0, dive_1.getFlow)(error) : [];
82
+ // The errored create edge attributes the construction's PARENT
83
+ // instance (probed 2026-09-03: edge.instance === existentInstance).
84
+ // The attempted constructor ARGS ride the caught error itself — it
85
+ // IS the errored shell, and getProps exposes its args (see
86
+ // erroredArgsSafe above).
87
+ const erroredEdge = [...flow].reverse().find((edge) => edge.kind === 'create' && edge.status === 'error');
88
+ const erroredInstance = erroredEdge?.instance;
89
+ const attemptedArgs = isError ? erroredArgsSafe(error) : undefined;
90
+ const report = {
91
+ kind: 'caught-unblinded',
92
+ message,
93
+ branch: flow.map((edge) => `${edge.kind}:${edge.name}`),
94
+ erroredType: erroredEdge?.name ?? null,
95
+ erroredInstance: erroredInstance ? extractSafe(erroredInstance) : null,
96
+ attemptedArgs: attemptedArgs ?? null,
97
+ };
98
+ return report;
99
+ }
100
+ /**
101
+ * The unconditional half: an ERROR span with the recorded exception + the
102
+ * dive branch — inside the request's async context, so the ALS context
103
+ * manager parents it under the request span on its own — and the stdout
104
+ * marker line. A non-Error throw is recorded as an attribute:
105
+ * recordException on a circular object could break exporter
106
+ * serialization.
107
+ */
108
+ function recordUnblindTelemetry(report, error) {
109
+ const span = api_1.trace.getTracer('@mnemonica/otel').startSpan('mnemonica.caught-exception');
110
+ span.setAttribute('dive.branch', report.branch.join(' → '));
111
+ if (report.erroredType) {
112
+ span.setAttribute('mnemonica.errored_type', report.erroredType);
113
+ }
114
+ span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: report.message });
115
+ if (error instanceof Error) {
116
+ span.recordException(error);
117
+ }
118
+ else {
119
+ span.setAttribute('exception.type', 'non-Error-throw');
120
+ }
121
+ span.end();
122
+ // The [unblind] prefix is a downstream contract — runbooks grep for
123
+ // exactly this marker.
124
+ // eslint-disable-next-line no-console
125
+ console.log(`[unblind] ${stringifySafe(report)}`);
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5ibGluZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91bmJsaW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNkJBLGtDQVFDO0FBV0QsMENBU0M7QUFPRCxzQ0FRQztBQVFELGdEQXFCQztBQVVELHdEQWtCQztBQWpJRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILDBDQUEwQztBQUMxQyx5Q0FBNEM7QUFDNUMsNENBQTJEO0FBVzNEOzs7R0FHRztBQUNILFNBQWdCLFdBQVcsQ0FBRSxRQUFnQjtJQUM1QyxJQUFJLENBQUM7UUFDSixNQUFNLE1BQU0sR0FBRyxpQkFBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztBQUNGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGVBQWUsQ0FBRSxLQUFZO0lBQzVDLElBQUksQ0FBQztRQUNKLE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVEsRUFBQyxLQUFLLENBQW1DLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQztRQUMzQixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixhQUFhLENBQUUsS0FBYztJQUM1QyxJQUFJLENBQUM7UUFDSixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUFDLE1BQU0sQ0FB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LCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBVbmJsaW5kZXIgY29yZSAoMjAyNi0wOS0wMywgVmlrdG9yKSDigJQgZnJhbWV3b3JrLWZyZWUgZXJyb3ItYm91bmRhcnlcbiAqIHJlcG9ydGluZzogYnVpbGQgdGhlIHJlcG9ydCBmcm9tIGRpdmUncyB0cmFjZSArIGNvcmUncyBnZXRQcm9wcywgdGhlblxuICogcmVjb3JkIHRoZSB0ZWxlbWV0cnkuIFRoZSBmcmFtZXdvcmsgd3JhcHBlciBvd25zIHRoZSBib2R5IGRpc2NpcGxpbmVcbiAqIChzdGF0dXMgY29kZSwgdGhlIGhlYWRlcnMtc2VudCBjaGVjaywgZXhwZWN0ZWQtY2xpZW50LWVycm9yIHBhc3N0aHJvdWdoKTtcbiAqIHRoaXMgY29yZSBvd25zIHRoZSByZXBvcnQgYW5kIHRoZSBVTkNPTkRJVElPTkFMIHRlbGVtZXRyeS5cbiAqXG4gKiBDT05UUkFDVDogcmVwb3J0LmtpbmQgKCdjYXVnaHQtdW5ibGluZGVkJyksIHRoZSBzcGFuIG5hbWVcbiAqICgnbW5lbW9uaWNhLmNhdWdodC1leGNlcHRpb24nKSBhbmQgdGhlIFt1bmJsaW5kXSBzdGRvdXQgbWFya2VyIGFyZVxuICogcGlubmVkIGJ5IGRvd25zdHJlYW0gY29uc3VtZXJzIChydW5ib29rcyBncmVwIHRoZSBtYXJrZXI7IGZyYW1ld29ya1xuICogYWRhcHRlcnMgcGluIHRoZSByZXBvcnQgc2hhcGUpLiBLZWVwIHRoZW0gc3RhYmxlLlxuICovXG5pbXBvcnQgeyBnZXRGbG93IH0gZnJvbSAnQG1uZW1vbmljYS9kaXZlJztcbmltcG9ydCB7IHV0aWxzLCBnZXRQcm9wcyB9IGZyb20gJ21uZW1vbmljYSc7XG5pbXBvcnQgeyB0cmFjZSwgU3BhblN0YXR1c0NvZGUgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVuYmxpbmRSZXBvcnQge1xuXHRraW5kICAgICAgICAgICAgOiBzdHJpbmc7XG5cdG1lc3NhZ2UgICAgICAgICA6IHN0cmluZztcblx0YnJhbmNoICAgICAgICAgIDogc3RyaW5nW107XG5cdGVycm9yZWRUeXBlICAgICA6IHN0cmluZyB8IG51bGw7XG5cdGVycm9yZWRJbnN0YW5jZSA6IHVua25vd247XG5cdGF0dGVtcHRlZEFyZ3MgICA6IHVua25vd247XG59XG5cbi8qKlxuICogZXh0cmFjdCgpIHRoYXQgY2Fubm90IHRocm93IGluc2lkZSBhbiBlcnJvciBwYXRoIOKAlCBub24tbW5lbW9uaWNhXG4gKiB2YWx1ZXMgZGVncmFkZSB0byB0aGVpciBrZXkgbGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTYWZlIChpbnN0YW5jZTogb2JqZWN0KTogdW5rbm93biB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gdXRpbHMuZXh0cmFjdChpbnN0YW5jZSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSBjYXRjaCB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoaW5zdGFuY2UpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIGFyZ3Mgb2YgYSBGQUlMRUQgbW5lbW9uaWNhIGNvbnN0cnVjdGlvbiByaWRlXG4gKiB0aGUgZXJyb3JlZCBpbnN0YW5jZSBpdHNlbGY6IHRoZSBjYXVnaHQgb2JqZWN0IElTIHRoZSBlcnJvcmVkIHNoZWxsXG4gKiAocHJvYmVkIDIwMjYtMDktMDM6IGNhdWdodCA9PT0gY3JlYXRpb25FcnJvcidzIGluaGVyaXRlZEluc3RhbmNlLFxuICogaW5zdGFuY2VvZiBFcnJvciB2aWEgdGhlIHNwbGljZWQgcHJvdG90eXBlIGNoYWluKSwgYW5kIGNvcmUncyBvd25cbiAqIGdldFByb3BzIGV4cG9zZXMgeyBhcmdzLCBvcmlnaW5hbEVycm9yLCDigKYgfSBvZmYgdGhlIHByb3BzIFdlYWtNYXAuXG4gKiBQbGFpbiBlcnJvcnMgeWllbGQgdW5kZWZpbmVkOyBhbnl0aGluZyB1bmV4cGVjdGVkIGRlZ3JhZGVzLCBuZXZlclxuICogdGhyb3dzIGluc2lkZSBhIGZpbHRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yZWRBcmdzU2FmZSAoZXJyb3I6IEVycm9yKTogdW5rbm93biB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcHJvcHMgPSBnZXRQcm9wcyhlcnJvcikgYXMgeyBhcmdzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHJlc3VsdCA9IHByb3BzPy5hcmdzO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0gY2F0Y2gge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG5cbi8qKlxuICogSlNPTi5zdHJpbmdpZnkgdGhhdCBjYW5ub3QgdGhyb3cgaW5zaWRlIGFuIGVycm9yIHBhdGgg4oCUIGNpcmN1bGFyIG9yXG4gKiBob3N0aWxlIHZhbHVlcyBkZWdyYWRlIHRvIGEgbWFya2VyIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGJvdW5kYXJ5XG4gKiAoYSB0aHJvd2luZyBib3VuZGFyeSBpcyBleGFjdGx5IHRoZSBjYXNjYWRlIHRoaXMgZmlnaHRzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVNhZmUgKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcblx0dHJ5IHtcblx0XHRjb25zdCByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSBjYXRjaCB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gJ1wiW3Vuc2VyaWFsaXphYmxlIHJlcG9ydCBwYXlsb2FkXVwiJztcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHVuYmxpbmRlZCByZXBvcnQgZm9yIGEgY2F1Z2h0IGZhaWx1cmU6IHRoZSBkaXZlIGJyYW5jaCwgdGhlXG4gKiBlcnJvcmVkIGNvbnN0cnVjdGlvbiBlZGdlLCB0aGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIGFyZ3MsIHRoZSBhY3R1YWxcbiAqIG1lc3NhZ2UuIE5vbi1FcnJvciB0aHJvd3MgYXJlIHJlcG9ydGVkIHRydXRoZnVsbHkgYXMgc3VjaCwgbmV2ZXJcbiAqIGRyZXNzZWQgdXAgYXMgRXJyb3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRVbmJsaW5kUmVwb3J0IChlcnJvcjogdW5rbm93bik6IFVuYmxpbmRSZXBvcnQge1xuXHRjb25zdCBpc0Vycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvcjtcblx0Y29uc3QgbWVzc2FnZSA9IGlzRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogYG5vbi1FcnJvciB0aHJvd24gKCR7dHlwZW9mIGVycm9yfSlgO1xuXHRjb25zdCBmbG93ID0gaXNFcnJvciA/IGdldEZsb3coZXJyb3IgYXMgRXJyb3IpIDogW107XG5cdC8vIFRoZSBlcnJvcmVkIGNyZWF0ZSBlZGdlIGF0dHJpYnV0ZXMgdGhlIGNvbnN0cnVjdGlvbidzIFBBUkVOVFxuXHQvLyBpbnN0YW5jZSAocHJvYmVkIDIwMjYtMDktMDM6IGVkZ2UuaW5zdGFuY2UgPT09IGV4aXN0ZW50SW5zdGFuY2UpLlxuXHQvLyBUaGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIEFSR1MgcmlkZSB0aGUgY2F1Z2h0IGVycm9yIGl0c2VsZiDigJQgaXRcblx0Ly8gSVMgdGhlIGVycm9yZWQgc2hlbGwsIGFuZCBnZXRQcm9wcyBleHBvc2VzIGl0cyBhcmdzIChzZWVcblx0Ly8gZXJyb3JlZEFyZ3NTYWZlIGFib3ZlKS5cblx0Y29uc3QgZXJyb3JlZEVkZ2UgPSBbLi4uZmxvd10ucmV2ZXJzZSgpLmZpbmQoKGVkZ2UpID0+IGVkZ2Uua2luZCA9PT0gJ2NyZWF0ZScgJiYgZWRnZS5zdGF0dXMgPT09ICdlcnJvcicpO1xuXHRjb25zdCBlcnJvcmVkSW5zdGFuY2UgPSBlcnJvcmVkRWRnZT8uaW5zdGFuY2U7XG5cdGNvbnN0IGF0dGVtcHRlZEFyZ3MgPSBpc0Vycm9yID8gZXJyb3JlZEFyZ3NTYWZlKGVycm9yIGFzIEVycm9yKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcmVwb3J0OiBVbmJsaW5kUmVwb3J0ID0ge1xuXHRcdGtpbmQgICAgICAgICAgICA6ICdjYXVnaHQtdW5ibGluZGVkJyxcblx0XHRtZXNzYWdlLFxuXHRcdGJyYW5jaCAgICAgICAgICA6IGZsb3cubWFwKChlZGdlKSA9PiBgJHtlZGdlLmtpbmR9OiR7ZWRnZS5uYW1lfWApLFxuXHRcdGVycm9yZWRUeXBlICAgICA6IGVycm9yZWRFZGdlPy5uYW1lID8/IG51bGwsXG5cdFx0ZXJyb3JlZEluc3RhbmNlIDogZXJyb3JlZEluc3RhbmNlID8gZXh0cmFjdFNhZmUoZXJyb3JlZEluc3RhbmNlKSA6IG51bGwsXG5cdFx0YXR0ZW1wdGVkQXJncyAgIDogYXR0ZW1wdGVkQXJncyA/PyBudWxsLFxuXHR9O1xuXHRyZXR1cm4gcmVwb3J0O1xufVxuXG4vKipcbiAqIFRoZSB1bmNvbmRpdGlvbmFsIGhhbGY6IGFuIEVSUk9SIHNwYW4gd2l0aCB0aGUgcmVjb3JkZWQgZXhjZXB0aW9uICsgdGhlXG4gKiBkaXZlIGJyYW5jaCDigJQgaW5zaWRlIHRoZSByZXF1ZXN0J3MgYXN5bmMgY29udGV4dCwgc28gdGhlIEFMUyBjb250ZXh0XG4gKiBtYW5hZ2VyIHBhcmVudHMgaXQgdW5kZXIgdGhlIHJlcXVlc3Qgc3BhbiBvbiBpdHMgb3duIOKAlCBhbmQgdGhlIHN0ZG91dFxuICogbWFya2VyIGxpbmUuIEEgbm9uLUVycm9yIHRocm93IGlzIHJlY29yZGVkIGFzIGFuIGF0dHJpYnV0ZTpcbiAqIHJlY29yZEV4Y2VwdGlvbiBvbiBhIGNpcmN1bGFyIG9iamVjdCBjb3VsZCBicmVhayBleHBvcnRlclxuICogc2VyaWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFVuYmxpbmRUZWxlbWV0cnkgKHJlcG9ydDogVW5ibGluZFJlcG9ydCwgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcblx0Y29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcignQG1uZW1vbmljYS9vdGVsJykuc3RhcnRTcGFuKCdtbmVtb25pY2EuY2F1Z2h0LWV4Y2VwdGlvbicpO1xuXHRzcGFuLnNldEF0dHJpYnV0ZSgnZGl2ZS5icmFuY2gnLCByZXBvcnQuYnJhbmNoLmpvaW4oJyDihpIgJykpO1xuXHRpZiAocmVwb3J0LmVycm9yZWRUeXBlKSB7XG5cdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoJ21uZW1vbmljYS5lcnJvcmVkX3R5cGUnLCByZXBvcnQuZXJyb3JlZFR5cGUpO1xuXHR9XG5cdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsIG1lc3NhZ2U6IHJlcG9ydC5tZXNzYWdlIH0pO1xuXHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yKTtcblx0fSBlbHNlIHtcblx0XHRzcGFuLnNldEF0dHJpYnV0ZSgnZXhjZXB0aW9uLnR5cGUnLCAnbm9uLUVycm9yLXRocm93Jyk7XG5cdH1cblx0c3Bhbi5lbmQoKTtcblxuXHQvLyBUaGUgW3VuYmxpbmRdIHByZWZpeCBpcyBhIGRvd25zdHJlYW0gY29udHJhY3Qg4oCUIHJ1bmJvb2tzIGdyZXAgZm9yXG5cdC8vIGV4YWN0bHkgdGhpcyBtYXJrZXIuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG5cdGNvbnNvbGUubG9nKGBbdW5ibGluZF0gJHtzdHJpbmdpZnlTYWZlKHJlcG9ydCl9YCk7XG59XG4iXX0=
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatFlow = formatFlow;
4
+ exports.errorContext = errorContext;
5
+ /**
6
+ * Read-side helpers over @mnemonica/dive's trace — the two idioms error
7
+ * boundaries kept re-deriving by hand (four formatter copies and two
8
+ * fallback copies in finecut before these existed).
9
+ */
10
+ const dive_1 = require("@mnemonica/dive");
11
+ /**
12
+ * Canonical edge → plain-JSON shaping for reports, filters and logs.
13
+ * Same target semantics as getFlow: Error | instance | current cursor.
14
+ */
15
+ function formatFlow(target) {
16
+ const result = (0, dive_1.getFlow)(target).map((edge) => {
17
+ const formatted = {
18
+ name: edge.name,
19
+ kind: edge.kind,
20
+ status: edge.status,
21
+ duration: edge.duration ?? null,
22
+ };
23
+ return formatted;
24
+ });
25
+ return result;
26
+ }
27
+ /**
28
+ * The "who failed" fallback: the instance pinned to the error at its
29
+ * deepest wrapped boundary, or the current ambient context when the error
30
+ * never crossed one.
31
+ */
32
+ function errorContext(error) {
33
+ const pinned = (0, dive_1.getErrorInstance)(error);
34
+ const result = pinned ?? (0, dive_1.current)();
35
+ return result;
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2ZS1mbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RpdmUtZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdCQSxnQ0FXQztBQU9ELG9DQUlDO0FBOUNEOzs7O0dBSUc7QUFDSCwwQ0FBcUU7QUFlckU7OztHQUdHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFFLE1BQWdCO0lBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUEsY0FBTyxFQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzNDLE1BQU0sU0FBUyxHQUFzQjtZQUNwQyxJQUFJLEVBQU8sSUFBSSxDQUFDLElBQUk7WUFDcEIsSUFBSSxFQUFPLElBQUksQ0FBQyxJQUFJO1lBQ3BCLE1BQU0sRUFBSyxJQUFJLENBQUMsTUFBTTtZQUN0QixRQUFRLEVBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJO1NBQ2hDLENBQUM7UUFDRixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixZQUFZLENBQUUsS0FBWTtJQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFBLGNBQU8sR0FBRSxDQUFDO0lBQ25DLE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVhZC1zaWRlIGhlbHBlcnMgb3ZlciBAbW5lbW9uaWNhL2RpdmUncyB0cmFjZSDigJQgdGhlIHR3byBpZGlvbXMgZXJyb3JcbiAqIGJvdW5kYXJpZXMga2VwdCByZS1kZXJpdmluZyBieSBoYW5kIChmb3VyIGZvcm1hdHRlciBjb3BpZXMgYW5kIHR3b1xuICogZmFsbGJhY2sgY29waWVzIGluIGZpbmVjdXQgYmVmb3JlIHRoZXNlIGV4aXN0ZWQpLlxuICovXG5pbXBvcnQgeyBnZXRGbG93LCBnZXRFcnJvckluc3RhbmNlLCBjdXJyZW50IH0gZnJvbSAnQG1uZW1vbmljYS9kaXZlJztcbmltcG9ydCB0eXBlIHsgRmxvd0VkZ2UgfSBmcm9tICdAbW5lbW9uaWNhL2RpdmUnO1xuXG4vKipcbiAqIEpTT04tc2FmZSBzaGFwZSBvZiBhIHRyYWNlIGVkZ2U6IHRoZSBGbG93RWRnZSB3aXRob3V0IHRoZSBsaXZlIGluc3RhbmNlXG4gKiByZWZlcmVuY2UgKG1uZW1vbmljYSBpbnN0YW5jZXMgZG9uJ3Qgc3Vydml2ZSBzZXJpYWxpemF0aW9uKSwgZHVyYXRpb25cbiAqIG5vcm1hbGl6ZWQgdG8gbnVsbCB3aGlsZSB1bnNldHRsZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVkRmxvd0VkZ2Uge1xuXHRuYW1lICAgICA6IHN0cmluZztcblx0a2luZCAgICAgOiBGbG93RWRnZVsna2luZCddO1xuXHRzdGF0dXMgICA6IEZsb3dFZGdlWydzdGF0dXMnXTtcblx0ZHVyYXRpb24gOiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBlZGdlIOKGkiBwbGFpbi1KU09OIHNoYXBpbmcgZm9yIHJlcG9ydHMsIGZpbHRlcnMgYW5kIGxvZ3MuXG4gKiBTYW1lIHRhcmdldCBzZW1hbnRpY3MgYXMgZ2V0RmxvdzogRXJyb3IgfCBpbnN0YW5jZSB8IGN1cnJlbnQgY3Vyc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RmxvdyAodGFyZ2V0PzogdW5rbm93bik6IEZvcm1hdHRlZEZsb3dFZGdlW10ge1xuXHRjb25zdCByZXN1bHQgPSBnZXRGbG93KHRhcmdldCkubWFwKChlZGdlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybWF0dGVkOiBGb3JtYXR0ZWRGbG93RWRnZSA9IHtcblx0XHRcdG5hbWUgICAgIDogZWRnZS5uYW1lLFxuXHRcdFx0a2luZCAgICAgOiBlZGdlLmtpbmQsXG5cdFx0XHRzdGF0dXMgICA6IGVkZ2Uuc3RhdHVzLFxuXHRcdFx0ZHVyYXRpb24gOiBlZGdlLmR1cmF0aW9uID8/IG51bGwsXG5cdFx0fTtcblx0XHRyZXR1cm4gZm9ybWF0dGVkO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgXCJ3aG8gZmFpbGVkXCIgZmFsbGJhY2s6IHRoZSBpbnN0YW5jZSBwaW5uZWQgdG8gdGhlIGVycm9yIGF0IGl0c1xuICogZGVlcGVzdCB3cmFwcGVkIGJvdW5kYXJ5LCBvciB0aGUgY3VycmVudCBhbWJpZW50IGNvbnRleHQgd2hlbiB0aGUgZXJyb3JcbiAqIG5ldmVyIGNyb3NzZWQgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JDb250ZXh0IChlcnJvcjogRXJyb3IpOiBvYmplY3QgfCB1bmRlZmluZWQge1xuXHRjb25zdCBwaW5uZWQgPSBnZXRFcnJvckluc3RhbmNlKGVycm9yKTtcblx0Y29uc3QgcmVzdWx0ID0gcGlubmVkID8/IGN1cnJlbnQoKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isMnemonicaInstance = isMnemonicaInstance;
4
+ /**
5
+ * Runtime type guard for mnemonica instances.
6
+ * Uses mnemonica's getProps() — no instanceof hacks, works across realms.
7
+ */
8
+ const module_1 = require("mnemonica/module");
9
+ function isMnemonicaInstance(value) {
10
+ return value != null && typeof value === 'object' && (0, module_1.getProps)(value) !== undefined;
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtbW5lbW9uaWNhLWluc3RhbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2lzLW1uZW1vbmljYS1pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU1BLGtEQUVDO0FBUkQ7OztHQUdHO0FBQ0gsNkNBQTRDO0FBRTVDLFNBQWdCLG1CQUFtQixDQUFFLEtBQWM7SUFDbEQsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFBLGlCQUFRLEVBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3BGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgbW5lbW9uaWNhIGluc3RhbmNlcy5cbiAqIFVzZXMgbW5lbW9uaWNhJ3MgZ2V0UHJvcHMoKSDigJQgbm8gaW5zdGFuY2VvZiBoYWNrcywgd29ya3MgYWNyb3NzIHJlYWxtcy5cbiAqL1xuaW1wb3J0IHsgZ2V0UHJvcHMgfSBmcm9tICdtbmVtb25pY2EvbW9kdWxlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW5lbW9uaWNhSW5zdGFuY2UgKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIGdldFByb3BzKHZhbHVlKSAhPT0gdW5kZWZpbmVkO1xufVxuIl19
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@mnemonica/otel",
3
+ "version": "0.1.0",
4
+ "description": "Framework-free Node.js core of the mnemonica observability stack — dive hook wiring, OpenTelemetry providers, ALS async-flow tracking, thunderstruck pre-root forensics, unblind error reports",
5
+ "type": "module",
6
+ "main": "./build/index.js",
7
+ "types": "./build/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./build/index.d.ts",
11
+ "require": "./build-cjs/index.js",
12
+ "default": "./build/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "build/",
17
+ "build-cjs/",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc && tsc -p tsconfig.cjs.json && node scripts/write-cjs-marker.js",
23
+ "build:watch": "tsc --watch",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "prepublishOnly": "npm run build && npm test && node scripts/assert-clean-build.js"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "peerDependencies": {
32
+ "@mnemonica/dive": "^0.7.0 || ^0.8.0",
33
+ "@opentelemetry/api": "^1.0.0",
34
+ "mnemonica": ">=1.2.7"
35
+ },
36
+ "devDependencies": {
37
+ "@mnemonica/dive": "^0.8.1",
38
+ "@opentelemetry/api": "^1.9.1",
39
+ "@opentelemetry/sdk-trace-node": "^1.30.1",
40
+ "@types/node": "^20.19.43",
41
+ "mnemonica": "^1.2.8",
42
+ "typescript": "^5.9.3",
43
+ "vitest": "^2.1.9"
44
+ },
45
+ "dependencies": {
46
+ "@mnemonica/dive": "^0.7.0 || ^0.8.0"
47
+ },
48
+ "keywords": [
49
+ "mnemonica",
50
+ "dive",
51
+ "opentelemetry",
52
+ "tracing",
53
+ "observability",
54
+ "async-local-storage",
55
+ "express",
56
+ "fastify",
57
+ "nodejs"
58
+ ],
59
+ "author": "went.out@gmail.com",
60
+ "license": "MIT",
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "git+https://github.com/mythographica/otel.git"
64
+ },
65
+ "bugs": {
66
+ "url": "https://github.com/mythographica/otel/issues"
67
+ },
68
+ "homepage": "https://github.com/mythographica/otel#readme"
69
+ }