@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.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/build/hooks/attach-hooks.d.ts +3 -0
- package/build/hooks/attach-hooks.d.ts.map +1 -0
- package/build/hooks/attach-hooks.js +52 -0
- package/build/index.d.ts +32 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +32 -0
- package/build/providers/async-flow.provider.d.ts +40 -0
- package/build/providers/async-flow.provider.d.ts.map +1 -0
- package/build/providers/async-flow.provider.js +128 -0
- package/build/providers/dive-otel.provider.d.ts +51 -0
- package/build/providers/dive-otel.provider.d.ts.map +1 -0
- package/build/providers/dive-otel.provider.js +238 -0
- package/build/providers/mnemonica-otel.provider.d.ts +12 -0
- package/build/providers/mnemonica-otel.provider.d.ts.map +1 -0
- package/build/providers/mnemonica-otel.provider.js +113 -0
- package/build/request-scope.d.ts +41 -0
- package/build/request-scope.d.ts.map +1 -0
- package/build/request-scope.js +35 -0
- package/build/thunderstruck/feed-from-request.d.ts +21 -0
- package/build/thunderstruck/feed-from-request.d.ts.map +1 -0
- package/build/thunderstruck/feed-from-request.js +34 -0
- package/build/thunderstruck/pre-root.d.ts +67 -0
- package/build/thunderstruck/pre-root.d.ts.map +1 -0
- package/build/thunderstruck/pre-root.js +78 -0
- package/build/unblind.d.ts +46 -0
- package/build/unblind.d.ts.map +1 -0
- package/build/unblind.js +120 -0
- package/build/utils/dive-flow.d.ts +24 -0
- package/build/utils/dive-flow.d.ts.map +1 -0
- package/build/utils/dive-flow.js +33 -0
- package/build/utils/is-mnemonica-instance.d.ts +2 -0
- package/build/utils/is-mnemonica-instance.d.ts.map +1 -0
- package/build/utils/is-mnemonica-instance.js +9 -0
- package/build-cjs/hooks/attach-hooks.js +55 -0
- package/build-cjs/index.js +52 -0
- package/build-cjs/package.json +1 -0
- package/build-cjs/providers/async-flow.provider.js +132 -0
- package/build-cjs/providers/dive-otel.provider.js +242 -0
- package/build-cjs/providers/mnemonica-otel.provider.js +117 -0
- package/build-cjs/request-scope.js +38 -0
- package/build-cjs/thunderstruck/feed-from-request.js +37 -0
- package/build-cjs/thunderstruck/pre-root.js +83 -0
- package/build-cjs/unblind.js +127 -0
- package/build-cjs/utils/dive-flow.js +37 -0
- package/build-cjs/utils/is-mnemonica-instance.js +12 -0
- 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
|
+
}
|