@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,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thunderstruck pre-root correlation store (adapter side).
|
|
3
|
+
*
|
|
4
|
+
* The correlation key is OBJECT IDENTITY: the very body / query / params
|
|
5
|
+
* object the interceptor saw at the boundary is the same reference pipes and
|
|
6
|
+
* construct handlers receive later. A WeakMap<object, payloads> therefore
|
|
7
|
+
* correlates without AsyncLocalStorage and without races — concurrent
|
|
8
|
+
* requests can never read each other's payloads because each holds only its
|
|
9
|
+
* own objects.
|
|
10
|
+
*
|
|
11
|
+
* The payloads live INSIDE the WeakMap record: there is no other store and
|
|
12
|
+
* no release step. When the request objects are garbage-collected, the
|
|
13
|
+
* payloads go with them — retention is exactly the request's lifetime.
|
|
14
|
+
* Dive stays free of framework-specifics and of storage entirely: it is
|
|
15
|
+
* the tracing engine, not a warehouse.
|
|
16
|
+
*
|
|
17
|
+
* The optional `request` link (RawPreRootPayload.request) puts the raw
|
|
18
|
+
* request object inside its own record and stamps it as a key too, so
|
|
19
|
+
* getPreRoot(req) resolves from anywhere the request is reachable. The
|
|
20
|
+
* WeakMap's ephemeron semantics keep this value→key cycle collectable:
|
|
21
|
+
* retention stays exactly the request's lifetime.
|
|
22
|
+
*/
|
|
23
|
+
export interface RawPreRootPayload {
|
|
24
|
+
method: string;
|
|
25
|
+
url: string;
|
|
26
|
+
params?: unknown;
|
|
27
|
+
query?: unknown;
|
|
28
|
+
body?: unknown;
|
|
29
|
+
headers?: unknown;
|
|
30
|
+
/**
|
|
31
|
+
* Optional link to the raw request object (storeRequest flag). When
|
|
32
|
+
* present it is stamped as a correlation key too, so getPreRoot(req)
|
|
33
|
+
* resolves — e.g. from an exception filter holding only the request.
|
|
34
|
+
*/
|
|
35
|
+
request?: unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface PreRootRecord {
|
|
38
|
+
raw: unknown;
|
|
39
|
+
validated?: unknown;
|
|
40
|
+
}
|
|
41
|
+
export interface PreRootData {
|
|
42
|
+
raw?: unknown;
|
|
43
|
+
validated?: unknown;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Stash the raw boundary payload and stamp every request-part object
|
|
47
|
+
* (params / query / body / headers / request) so later stages correlate
|
|
48
|
+
* by the object they already hold. Primitive bodies are not correlatable —
|
|
49
|
+
* they are still inside the raw payload, just not resolvable via
|
|
50
|
+
* getPreRoot.
|
|
51
|
+
*/
|
|
52
|
+
export declare function feedPreRoot(raw: RawPreRootPayload): void;
|
|
53
|
+
/**
|
|
54
|
+
* Attach the validated DTO to the record of the boundary object it came
|
|
55
|
+
* from. Called by MnemonicaValidationPipe after class-validator passes.
|
|
56
|
+
* No-op when the object was never stamped (the interceptor is not active).
|
|
57
|
+
*/
|
|
58
|
+
export declare function feedValidatedPreRoot(forValue: unknown, validated: unknown): void;
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the pre-root payloads for a boundary object — the same body /
|
|
61
|
+
* query / params reference the interceptor stamped. Payloads live as long
|
|
62
|
+
* as the request objects do (WeakMap), so this resolves during construction
|
|
63
|
+
* AND afterwards — e.g. from an exception filter reporting which data
|
|
64
|
+
* caused the failure.
|
|
65
|
+
*/
|
|
66
|
+
export declare function getPreRoot(value: unknown): PreRootData | undefined;
|
|
67
|
+
//# sourceMappingURL=pre-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-root.d.ts","sourceRoot":"","sources":["../../src/thunderstruck/pre-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAI,MAAM,CAAC;IACjB,GAAG,EAAO,MAAM,CAAC;IACjB,MAAM,CAAC,EAAG,OAAO,CAAC;IAClB,KAAK,CAAC,EAAI,OAAO,CAAC;IAClB,IAAI,CAAC,EAAK,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAS,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC3B,GAAG,CAAC,EAAQ,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAOzD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CASjF;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAE,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAanE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thunderstruck pre-root correlation store (adapter side).
|
|
3
|
+
*
|
|
4
|
+
* The correlation key is OBJECT IDENTITY: the very body / query / params
|
|
5
|
+
* object the interceptor saw at the boundary is the same reference pipes and
|
|
6
|
+
* construct handlers receive later. A WeakMap<object, payloads> therefore
|
|
7
|
+
* correlates without AsyncLocalStorage and without races — concurrent
|
|
8
|
+
* requests can never read each other's payloads because each holds only its
|
|
9
|
+
* own objects.
|
|
10
|
+
*
|
|
11
|
+
* The payloads live INSIDE the WeakMap record: there is no other store and
|
|
12
|
+
* no release step. When the request objects are garbage-collected, the
|
|
13
|
+
* payloads go with them — retention is exactly the request's lifetime.
|
|
14
|
+
* Dive stays free of framework-specifics and of storage entirely: it is
|
|
15
|
+
* the tracing engine, not a warehouse.
|
|
16
|
+
*
|
|
17
|
+
* The optional `request` link (RawPreRootPayload.request) puts the raw
|
|
18
|
+
* request object inside its own record and stamps it as a key too, so
|
|
19
|
+
* getPreRoot(req) resolves from anywhere the request is reachable. The
|
|
20
|
+
* WeakMap's ephemeron semantics keep this value→key cycle collectable:
|
|
21
|
+
* retention stays exactly the request's lifetime.
|
|
22
|
+
*/
|
|
23
|
+
function isObjectKey(value) {
|
|
24
|
+
return value !== null && (typeof value === 'object' || typeof value === 'function');
|
|
25
|
+
}
|
|
26
|
+
const preRootRecords = new WeakMap();
|
|
27
|
+
/**
|
|
28
|
+
* Stash the raw boundary payload and stamp every request-part object
|
|
29
|
+
* (params / query / body / headers / request) so later stages correlate
|
|
30
|
+
* by the object they already hold. Primitive bodies are not correlatable —
|
|
31
|
+
* they are still inside the raw payload, just not resolvable via
|
|
32
|
+
* getPreRoot.
|
|
33
|
+
*/
|
|
34
|
+
export function feedPreRoot(raw) {
|
|
35
|
+
const record = { raw };
|
|
36
|
+
for (const part of [raw.params, raw.query, raw.body, raw.headers, raw.request]) {
|
|
37
|
+
if (isObjectKey(part)) {
|
|
38
|
+
preRootRecords.set(part, record);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Attach the validated DTO to the record of the boundary object it came
|
|
44
|
+
* from. Called by MnemonicaValidationPipe after class-validator passes.
|
|
45
|
+
* No-op when the object was never stamped (the interceptor is not active).
|
|
46
|
+
*/
|
|
47
|
+
export function feedValidatedPreRoot(forValue, validated) {
|
|
48
|
+
if (!isObjectKey(forValue)) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const record = preRootRecords.get(forValue);
|
|
52
|
+
if (!record) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
record.validated = validated;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Resolve the pre-root payloads for a boundary object — the same body /
|
|
59
|
+
* query / params reference the interceptor stamped. Payloads live as long
|
|
60
|
+
* as the request objects do (WeakMap), so this resolves during construction
|
|
61
|
+
* AND afterwards — e.g. from an exception filter reporting which data
|
|
62
|
+
* caused the failure.
|
|
63
|
+
*/
|
|
64
|
+
export function getPreRoot(value) {
|
|
65
|
+
if (!isObjectKey(value)) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const record = preRootRecords.get(value);
|
|
69
|
+
if (!record) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const result = {
|
|
73
|
+
raw: record.raw,
|
|
74
|
+
validated: record.validated,
|
|
75
|
+
};
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlLXJvb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGh1bmRlcnN0cnVjay9wcmUtcm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBMkJILFNBQVMsV0FBVyxDQUFFLEtBQWM7SUFDbkMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztBQUU1RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFFLEdBQXNCO0lBQ2xELE1BQU0sTUFBTSxHQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RDLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hGLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNGLENBQUM7QUFDRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBRSxRQUFpQixFQUFFLFNBQWtCO0lBQzFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPO0lBQ1IsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2IsT0FBTztJQUNSLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBRSxLQUFjO0lBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDYixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQWdCO1FBQzNCLEdBQUcsRUFBUyxNQUFNLENBQUMsR0FBRztRQUN0QixTQUFTLEVBQUcsTUFBTSxDQUFDLFNBQVM7S0FDNUIsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGh1bmRlcnN0cnVjayBwcmUtcm9vdCBjb3JyZWxhdGlvbiBzdG9yZSAoYWRhcHRlciBzaWRlKS5cbiAqXG4gKiBUaGUgY29ycmVsYXRpb24ga2V5IGlzIE9CSkVDVCBJREVOVElUWTogdGhlIHZlcnkgYm9keSAvIHF1ZXJ5IC8gcGFyYW1zXG4gKiBvYmplY3QgdGhlIGludGVyY2VwdG9yIHNhdyBhdCB0aGUgYm91bmRhcnkgaXMgdGhlIHNhbWUgcmVmZXJlbmNlIHBpcGVzIGFuZFxuICogY29uc3RydWN0IGhhbmRsZXJzIHJlY2VpdmUgbGF0ZXIuIEEgV2Vha01hcDxvYmplY3QsIHBheWxvYWRzPiB0aGVyZWZvcmVcbiAqIGNvcnJlbGF0ZXMgd2l0aG91dCBBc3luY0xvY2FsU3RvcmFnZSBhbmQgd2l0aG91dCByYWNlcyDigJQgY29uY3VycmVudFxuICogcmVxdWVzdHMgY2FuIG5ldmVyIHJlYWQgZWFjaCBvdGhlcidzIHBheWxvYWRzIGJlY2F1c2UgZWFjaCBob2xkcyBvbmx5IGl0c1xuICogb3duIG9iamVjdHMuXG4gKlxuICogVGhlIHBheWxvYWRzIGxpdmUgSU5TSURFIHRoZSBXZWFrTWFwIHJlY29yZDogdGhlcmUgaXMgbm8gb3RoZXIgc3RvcmUgYW5kXG4gKiBubyByZWxlYXNlIHN0ZXAuIFdoZW4gdGhlIHJlcXVlc3Qgb2JqZWN0cyBhcmUgZ2FyYmFnZS1jb2xsZWN0ZWQsIHRoZVxuICogcGF5bG9hZHMgZ28gd2l0aCB0aGVtIOKAlCByZXRlbnRpb24gaXMgZXhhY3RseSB0aGUgcmVxdWVzdCdzIGxpZmV0aW1lLlxuICogRGl2ZSBzdGF5cyBmcmVlIG9mIGZyYW1ld29yay1zcGVjaWZpY3MgYW5kIG9mIHN0b3JhZ2UgZW50aXJlbHk6IGl0IGlzXG4gKiB0aGUgdHJhY2luZyBlbmdpbmUsIG5vdCBhIHdhcmVob3VzZS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYHJlcXVlc3RgIGxpbmsgKFJhd1ByZVJvb3RQYXlsb2FkLnJlcXVlc3QpIHB1dHMgdGhlIHJhd1xuICogcmVxdWVzdCBvYmplY3QgaW5zaWRlIGl0cyBvd24gcmVjb3JkIGFuZCBzdGFtcHMgaXQgYXMgYSBrZXkgdG9vLCBzb1xuICogZ2V0UHJlUm9vdChyZXEpIHJlc29sdmVzIGZyb20gYW55d2hlcmUgdGhlIHJlcXVlc3QgaXMgcmVhY2hhYmxlLiBUaGVcbiAqIFdlYWtNYXAncyBlcGhlbWVyb24gc2VtYW50aWNzIGtlZXAgdGhpcyB2YWx1ZeKGkmtleSBjeWNsZSBjb2xsZWN0YWJsZTpcbiAqIHJldGVudGlvbiBzdGF5cyBleGFjdGx5IHRoZSByZXF1ZXN0J3MgbGlmZXRpbWUuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBSYXdQcmVSb290UGF5bG9hZCB7XG5cdG1ldGhvZCAgOiBzdHJpbmc7XG5cdHVybCAgICAgOiBzdHJpbmc7XG5cdHBhcmFtcz8gOiB1bmtub3duO1xuXHRxdWVyeT8gIDogdW5rbm93bjtcblx0Ym9keT8gICA6IHVua25vd247XG5cdGhlYWRlcnM/OiB1bmtub3duO1xuXHQvKipcblx0ICogT3B0aW9uYWwgbGluayB0byB0aGUgcmF3IHJlcXVlc3Qgb2JqZWN0IChzdG9yZVJlcXVlc3QgZmxhZykuIFdoZW5cblx0ICogcHJlc2VudCBpdCBpcyBzdGFtcGVkIGFzIGEgY29ycmVsYXRpb24ga2V5IHRvbywgc28gZ2V0UHJlUm9vdChyZXEpXG5cdCAqIHJlc29sdmVzIOKAlCBlLmcuIGZyb20gYW4gZXhjZXB0aW9uIGZpbHRlciBob2xkaW5nIG9ubHkgdGhlIHJlcXVlc3QuXG5cdCAqL1xuXHRyZXF1ZXN0PzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVSb290UmVjb3JkIHtcblx0cmF3ICAgICAgIDogdW5rbm93bjtcblx0dmFsaWRhdGVkPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVSb290RGF0YSB7XG5cdHJhdz8gICAgICA6IHVua25vd247XG5cdHZhbGlkYXRlZD86IHVua25vd247XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0S2V5ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG5cdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpO1xufVxuXG5jb25zdCBwcmVSb290UmVjb3JkcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgUHJlUm9vdFJlY29yZD4oKTtcblxuLyoqXG4gKiBTdGFzaCB0aGUgcmF3IGJvdW5kYXJ5IHBheWxvYWQgYW5kIHN0YW1wIGV2ZXJ5IHJlcXVlc3QtcGFydCBvYmplY3RcbiAqIChwYXJhbXMgLyBxdWVyeSAvIGJvZHkgLyBoZWFkZXJzIC8gcmVxdWVzdCkgc28gbGF0ZXIgc3RhZ2VzIGNvcnJlbGF0ZVxuICogYnkgdGhlIG9iamVjdCB0aGV5IGFscmVhZHkgaG9sZC4gUHJpbWl0aXZlIGJvZGllcyBhcmUgbm90IGNvcnJlbGF0YWJsZSDigJRcbiAqIHRoZXkgYXJlIHN0aWxsIGluc2lkZSB0aGUgcmF3IHBheWxvYWQsIGp1c3Qgbm90IHJlc29sdmFibGUgdmlhXG4gKiBnZXRQcmVSb290LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmVlZFByZVJvb3QgKHJhdzogUmF3UHJlUm9vdFBheWxvYWQpOiB2b2lkIHtcblx0Y29uc3QgcmVjb3JkOiBQcmVSb290UmVjb3JkID0geyByYXcgfTtcblx0Zm9yIChjb25zdCBwYXJ0IG9mIFtyYXcucGFyYW1zLCByYXcucXVlcnksIHJhdy5ib2R5LCByYXcuaGVhZGVycywgcmF3LnJlcXVlc3RdKSB7XG5cdFx0aWYgKGlzT2JqZWN0S2V5KHBhcnQpKSB7XG5cdFx0XHRwcmVSb290UmVjb3Jkcy5zZXQocGFydCwgcmVjb3JkKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBdHRhY2ggdGhlIHZhbGlkYXRlZCBEVE8gdG8gdGhlIHJlY29yZCBvZiB0aGUgYm91bmRhcnkgb2JqZWN0IGl0IGNhbWVcbiAqIGZyb20uIENhbGxlZCBieSBNbmVtb25pY2FWYWxpZGF0aW9uUGlwZSBhZnRlciBjbGFzcy12YWxpZGF0b3IgcGFzc2VzLlxuICogTm8tb3Agd2hlbiB0aGUgb2JqZWN0IHdhcyBuZXZlciBzdGFtcGVkICh0aGUgaW50ZXJjZXB0b3IgaXMgbm90IGFjdGl2ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWVkVmFsaWRhdGVkUHJlUm9vdCAoZm9yVmFsdWU6IHVua25vd24sIHZhbGlkYXRlZDogdW5rbm93bik6IHZvaWQge1xuXHRpZiAoIWlzT2JqZWN0S2V5KGZvclZhbHVlKSkge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCByZWNvcmQgPSBwcmVSb290UmVjb3Jkcy5nZXQoZm9yVmFsdWUpO1xuXHRpZiAoIXJlY29yZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRyZWNvcmQudmFsaWRhdGVkID0gdmFsaWRhdGVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHByZS1yb290IHBheWxvYWRzIGZvciBhIGJvdW5kYXJ5IG9iamVjdCDigJQgdGhlIHNhbWUgYm9keSAvXG4gKiBxdWVyeSAvIHBhcmFtcyByZWZlcmVuY2UgdGhlIGludGVyY2VwdG9yIHN0YW1wZWQuIFBheWxvYWRzIGxpdmUgYXMgbG9uZ1xuICogYXMgdGhlIHJlcXVlc3Qgb2JqZWN0cyBkbyAoV2Vha01hcCksIHNvIHRoaXMgcmVzb2x2ZXMgZHVyaW5nIGNvbnN0cnVjdGlvblxuICogQU5EIGFmdGVyd2FyZHMg4oCUIGUuZy4gZnJvbSBhbiBleGNlcHRpb24gZmlsdGVyIHJlcG9ydGluZyB3aGljaCBkYXRhXG4gKiBjYXVzZWQgdGhlIGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVSb290ICh2YWx1ZTogdW5rbm93bik6IFByZVJvb3REYXRhIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFpc09iamVjdEtleSh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IHJlY29yZCA9IHByZVJvb3RSZWNvcmRzLmdldCh2YWx1ZSk7XG5cdGlmICghcmVjb3JkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCByZXN1bHQ6IFByZVJvb3REYXRhID0ge1xuXHRcdHJhdyAgICAgICA6IHJlY29yZC5yYXcsXG5cdFx0dmFsaWRhdGVkIDogcmVjb3JkLnZhbGlkYXRlZCxcblx0fTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface UnblindReport {
|
|
2
|
+
kind: string;
|
|
3
|
+
message: string;
|
|
4
|
+
branch: string[];
|
|
5
|
+
erroredType: string | null;
|
|
6
|
+
erroredInstance: unknown;
|
|
7
|
+
attemptedArgs: unknown;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* extract() that cannot throw inside an error path — non-mnemonica
|
|
11
|
+
* values degrade to their key list.
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractSafe(instance: object): unknown;
|
|
14
|
+
/**
|
|
15
|
+
* The attempted constructor args of a FAILED mnemonica construction ride
|
|
16
|
+
* the errored instance itself: the caught object IS the errored shell
|
|
17
|
+
* (probed 2026-09-03: caught === creationError's inheritedInstance,
|
|
18
|
+
* instanceof Error via the spliced prototype chain), and core's own
|
|
19
|
+
* getProps exposes { args, originalError, … } off the props WeakMap.
|
|
20
|
+
* Plain errors yield undefined; anything unexpected degrades, never
|
|
21
|
+
* throws inside a filter.
|
|
22
|
+
*/
|
|
23
|
+
export declare function erroredArgsSafe(error: Error): unknown;
|
|
24
|
+
/**
|
|
25
|
+
* JSON.stringify that cannot throw inside an error path — circular or
|
|
26
|
+
* hostile values degrade to a marker instead of crashing the boundary
|
|
27
|
+
* (a throwing boundary is exactly the cascade this fights).
|
|
28
|
+
*/
|
|
29
|
+
export declare function stringifySafe(value: unknown): string;
|
|
30
|
+
/**
|
|
31
|
+
* Build the unblinded report for a caught failure: the dive branch, the
|
|
32
|
+
* errored construction edge, the attempted constructor args, the actual
|
|
33
|
+
* message. Non-Error throws are reported truthfully as such, never
|
|
34
|
+
* dressed up as Errors.
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildUnblindReport(error: unknown): UnblindReport;
|
|
37
|
+
/**
|
|
38
|
+
* The unconditional half: an ERROR span with the recorded exception + the
|
|
39
|
+
* dive branch — inside the request's async context, so the ALS context
|
|
40
|
+
* manager parents it under the request span on its own — and the stdout
|
|
41
|
+
* marker line. A non-Error throw is recorded as an attribute:
|
|
42
|
+
* recordException on a circular object could break exporter
|
|
43
|
+
* serialization.
|
|
44
|
+
*/
|
|
45
|
+
export declare function recordUnblindTelemetry(report: UnblindReport, error: unknown): void;
|
|
46
|
+
//# sourceMappingURL=unblind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unblind.d.ts","sourceRoot":"","sources":["../src/unblind.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAc,MAAM,CAAC;IACzB,OAAO,EAAW,MAAM,CAAC;IACzB,MAAM,EAAY,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAO,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAG,OAAO,CAAC;IAC1B,aAAa,EAAK,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAStD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAQrD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAqBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAkBnF"}
|
package/build/unblind.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Unblinder core (2026-09-03, Viktor) — framework-free error-boundary
|
|
3
|
+
* reporting: build the report from dive's trace + core's getProps, then
|
|
4
|
+
* record the telemetry. The framework wrapper owns the body discipline
|
|
5
|
+
* (status code, the headers-sent check, expected-client-error passthrough);
|
|
6
|
+
* this core owns the report and the UNCONDITIONAL telemetry.
|
|
7
|
+
*
|
|
8
|
+
* CONTRACT: report.kind ('caught-unblinded'), the span name
|
|
9
|
+
* ('mnemonica.caught-exception') and the [unblind] stdout marker are
|
|
10
|
+
* pinned by downstream consumers (runbooks grep the marker; framework
|
|
11
|
+
* adapters pin the report shape). Keep them stable.
|
|
12
|
+
*/
|
|
13
|
+
import { getFlow } from '@mnemonica/dive';
|
|
14
|
+
import { utils, getProps } from 'mnemonica';
|
|
15
|
+
import { trace, SpanStatusCode } from '@opentelemetry/api';
|
|
16
|
+
/**
|
|
17
|
+
* extract() that cannot throw inside an error path — non-mnemonica
|
|
18
|
+
* values degrade to their key list.
|
|
19
|
+
*/
|
|
20
|
+
export function extractSafe(instance) {
|
|
21
|
+
try {
|
|
22
|
+
const result = utils.extract(instance);
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
const result = Object.keys(instance);
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The attempted constructor args of a FAILED mnemonica construction ride
|
|
32
|
+
* the errored instance itself: the caught object IS the errored shell
|
|
33
|
+
* (probed 2026-09-03: caught === creationError's inheritedInstance,
|
|
34
|
+
* instanceof Error via the spliced prototype chain), and core's own
|
|
35
|
+
* getProps exposes { args, originalError, … } off the props WeakMap.
|
|
36
|
+
* Plain errors yield undefined; anything unexpected degrades, never
|
|
37
|
+
* throws inside a filter.
|
|
38
|
+
*/
|
|
39
|
+
export function erroredArgsSafe(error) {
|
|
40
|
+
try {
|
|
41
|
+
const props = getProps(error);
|
|
42
|
+
const result = props?.args;
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
const result = undefined;
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* JSON.stringify that cannot throw inside an error path — circular or
|
|
52
|
+
* hostile values degrade to a marker instead of crashing the boundary
|
|
53
|
+
* (a throwing boundary is exactly the cascade this fights).
|
|
54
|
+
*/
|
|
55
|
+
export function stringifySafe(value) {
|
|
56
|
+
try {
|
|
57
|
+
const result = JSON.stringify(value);
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
const result = '"[unserializable report payload]"';
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build the unblinded report for a caught failure: the dive branch, the
|
|
67
|
+
* errored construction edge, the attempted constructor args, the actual
|
|
68
|
+
* message. Non-Error throws are reported truthfully as such, never
|
|
69
|
+
* dressed up as Errors.
|
|
70
|
+
*/
|
|
71
|
+
export function buildUnblindReport(error) {
|
|
72
|
+
const isError = error instanceof Error;
|
|
73
|
+
const message = isError ? error.message : `non-Error thrown (${typeof error})`;
|
|
74
|
+
const flow = isError ? getFlow(error) : [];
|
|
75
|
+
// The errored create edge attributes the construction's PARENT
|
|
76
|
+
// instance (probed 2026-09-03: edge.instance === existentInstance).
|
|
77
|
+
// The attempted constructor ARGS ride the caught error itself — it
|
|
78
|
+
// IS the errored shell, and getProps exposes its args (see
|
|
79
|
+
// erroredArgsSafe above).
|
|
80
|
+
const erroredEdge = [...flow].reverse().find((edge) => edge.kind === 'create' && edge.status === 'error');
|
|
81
|
+
const erroredInstance = erroredEdge?.instance;
|
|
82
|
+
const attemptedArgs = isError ? erroredArgsSafe(error) : undefined;
|
|
83
|
+
const report = {
|
|
84
|
+
kind: 'caught-unblinded',
|
|
85
|
+
message,
|
|
86
|
+
branch: flow.map((edge) => `${edge.kind}:${edge.name}`),
|
|
87
|
+
erroredType: erroredEdge?.name ?? null,
|
|
88
|
+
erroredInstance: erroredInstance ? extractSafe(erroredInstance) : null,
|
|
89
|
+
attemptedArgs: attemptedArgs ?? null,
|
|
90
|
+
};
|
|
91
|
+
return report;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The unconditional half: an ERROR span with the recorded exception + the
|
|
95
|
+
* dive branch — inside the request's async context, so the ALS context
|
|
96
|
+
* manager parents it under the request span on its own — and the stdout
|
|
97
|
+
* marker line. A non-Error throw is recorded as an attribute:
|
|
98
|
+
* recordException on a circular object could break exporter
|
|
99
|
+
* serialization.
|
|
100
|
+
*/
|
|
101
|
+
export function recordUnblindTelemetry(report, error) {
|
|
102
|
+
const span = trace.getTracer('@mnemonica/otel').startSpan('mnemonica.caught-exception');
|
|
103
|
+
span.setAttribute('dive.branch', report.branch.join(' → '));
|
|
104
|
+
if (report.erroredType) {
|
|
105
|
+
span.setAttribute('mnemonica.errored_type', report.erroredType);
|
|
106
|
+
}
|
|
107
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: report.message });
|
|
108
|
+
if (error instanceof Error) {
|
|
109
|
+
span.recordException(error);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
span.setAttribute('exception.type', 'non-Error-throw');
|
|
113
|
+
}
|
|
114
|
+
span.end();
|
|
115
|
+
// The [unblind] prefix is a downstream contract — runbooks grep for
|
|
116
|
+
// exactly this marker.
|
|
117
|
+
// eslint-disable-next-line no-console
|
|
118
|
+
console.log(`[unblind] ${stringifySafe(report)}`);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5ibGluZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91bmJsaW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFXM0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBRSxRQUFnQjtJQUM1QyxJQUFJLENBQUM7UUFDSixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNSLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBRSxLQUFZO0lBQzVDLElBQUksQ0FBQztRQUNKLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQW1DLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQztRQUMzQixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFFLEtBQWM7SUFDNUMsSUFBSSxDQUFDO1FBQ0osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUixNQUFNLE1BQU0sR0FBRyxtQ0FBbUMsQ0FBQztRQUNuRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7QUFDRixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUUsS0FBYztJQUNqRCxNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMscUJBQXFCLE9BQU8sS0FBSyxHQUFHLENBQUM7SUFDL0UsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRCwrREFBK0Q7SUFDL0Qsb0VBQW9FO0lBQ3BFLG1FQUFtRTtJQUNuRSwyREFBMkQ7SUFDM0QsMEJBQTBCO0lBQzFCLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDMUcsTUFBTSxlQUFlLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FBQztJQUM5QyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzVFLE1BQU0sTUFBTSxHQUFrQjtRQUM3QixJQUFJLEVBQWMsa0JBQWtCO1FBQ3BDLE9BQU87UUFDUCxNQUFNLEVBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRSxXQUFXLEVBQU8sV0FBVyxFQUFFLElBQUksSUFBSSxJQUFJO1FBQzNDLGVBQWUsRUFBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN2RSxhQUFhLEVBQUssYUFBYSxJQUFJLElBQUk7S0FDdkMsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUUsTUFBcUIsRUFBRSxLQUFjO0lBQzVFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUN4RixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVELElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztTQUFNLENBQUM7UUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVYLG9FQUFvRTtJQUNwRSx1QkFBdUI7SUFDdkIsc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBVbmJsaW5kZXIgY29yZSAoMjAyNi0wOS0wMywgVmlrdG9yKSDigJQgZnJhbWV3b3JrLWZyZWUgZXJyb3ItYm91bmRhcnlcbiAqIHJlcG9ydGluZzogYnVpbGQgdGhlIHJlcG9ydCBmcm9tIGRpdmUncyB0cmFjZSArIGNvcmUncyBnZXRQcm9wcywgdGhlblxuICogcmVjb3JkIHRoZSB0ZWxlbWV0cnkuIFRoZSBmcmFtZXdvcmsgd3JhcHBlciBvd25zIHRoZSBib2R5IGRpc2NpcGxpbmVcbiAqIChzdGF0dXMgY29kZSwgdGhlIGhlYWRlcnMtc2VudCBjaGVjaywgZXhwZWN0ZWQtY2xpZW50LWVycm9yIHBhc3N0aHJvdWdoKTtcbiAqIHRoaXMgY29yZSBvd25zIHRoZSByZXBvcnQgYW5kIHRoZSBVTkNPTkRJVElPTkFMIHRlbGVtZXRyeS5cbiAqXG4gKiBDT05UUkFDVDogcmVwb3J0LmtpbmQgKCdjYXVnaHQtdW5ibGluZGVkJyksIHRoZSBzcGFuIG5hbWVcbiAqICgnbW5lbW9uaWNhLmNhdWdodC1leGNlcHRpb24nKSBhbmQgdGhlIFt1bmJsaW5kXSBzdGRvdXQgbWFya2VyIGFyZVxuICogcGlubmVkIGJ5IGRvd25zdHJlYW0gY29uc3VtZXJzIChydW5ib29rcyBncmVwIHRoZSBtYXJrZXI7IGZyYW1ld29ya1xuICogYWRhcHRlcnMgcGluIHRoZSByZXBvcnQgc2hhcGUpLiBLZWVwIHRoZW0gc3RhYmxlLlxuICovXG5pbXBvcnQgeyBnZXRGbG93IH0gZnJvbSAnQG1uZW1vbmljYS9kaXZlJztcbmltcG9ydCB7IHV0aWxzLCBnZXRQcm9wcyB9IGZyb20gJ21uZW1vbmljYSc7XG5pbXBvcnQgeyB0cmFjZSwgU3BhblN0YXR1c0NvZGUgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVuYmxpbmRSZXBvcnQge1xuXHRraW5kICAgICAgICAgICAgOiBzdHJpbmc7XG5cdG1lc3NhZ2UgICAgICAgICA6IHN0cmluZztcblx0YnJhbmNoICAgICAgICAgIDogc3RyaW5nW107XG5cdGVycm9yZWRUeXBlICAgICA6IHN0cmluZyB8IG51bGw7XG5cdGVycm9yZWRJbnN0YW5jZSA6IHVua25vd247XG5cdGF0dGVtcHRlZEFyZ3MgICA6IHVua25vd247XG59XG5cbi8qKlxuICogZXh0cmFjdCgpIHRoYXQgY2Fubm90IHRocm93IGluc2lkZSBhbiBlcnJvciBwYXRoIOKAlCBub24tbW5lbW9uaWNhXG4gKiB2YWx1ZXMgZGVncmFkZSB0byB0aGVpciBrZXkgbGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTYWZlIChpbnN0YW5jZTogb2JqZWN0KTogdW5rbm93biB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gdXRpbHMuZXh0cmFjdChpbnN0YW5jZSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSBjYXRjaCB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoaW5zdGFuY2UpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIGFyZ3Mgb2YgYSBGQUlMRUQgbW5lbW9uaWNhIGNvbnN0cnVjdGlvbiByaWRlXG4gKiB0aGUgZXJyb3JlZCBpbnN0YW5jZSBpdHNlbGY6IHRoZSBjYXVnaHQgb2JqZWN0IElTIHRoZSBlcnJvcmVkIHNoZWxsXG4gKiAocHJvYmVkIDIwMjYtMDktMDM6IGNhdWdodCA9PT0gY3JlYXRpb25FcnJvcidzIGluaGVyaXRlZEluc3RhbmNlLFxuICogaW5zdGFuY2VvZiBFcnJvciB2aWEgdGhlIHNwbGljZWQgcHJvdG90eXBlIGNoYWluKSwgYW5kIGNvcmUncyBvd25cbiAqIGdldFByb3BzIGV4cG9zZXMgeyBhcmdzLCBvcmlnaW5hbEVycm9yLCDigKYgfSBvZmYgdGhlIHByb3BzIFdlYWtNYXAuXG4gKiBQbGFpbiBlcnJvcnMgeWllbGQgdW5kZWZpbmVkOyBhbnl0aGluZyB1bmV4cGVjdGVkIGRlZ3JhZGVzLCBuZXZlclxuICogdGhyb3dzIGluc2lkZSBhIGZpbHRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yZWRBcmdzU2FmZSAoZXJyb3I6IEVycm9yKTogdW5rbm93biB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcHJvcHMgPSBnZXRQcm9wcyhlcnJvcikgYXMgeyBhcmdzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHJlc3VsdCA9IHByb3BzPy5hcmdzO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0gY2F0Y2gge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG5cbi8qKlxuICogSlNPTi5zdHJpbmdpZnkgdGhhdCBjYW5ub3QgdGhyb3cgaW5zaWRlIGFuIGVycm9yIHBhdGgg4oCUIGNpcmN1bGFyIG9yXG4gKiBob3N0aWxlIHZhbHVlcyBkZWdyYWRlIHRvIGEgbWFya2VyIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGJvdW5kYXJ5XG4gKiAoYSB0aHJvd2luZyBib3VuZGFyeSBpcyBleGFjdGx5IHRoZSBjYXNjYWRlIHRoaXMgZmlnaHRzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVNhZmUgKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcblx0dHJ5IHtcblx0XHRjb25zdCByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSBjYXRjaCB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gJ1wiW3Vuc2VyaWFsaXphYmxlIHJlcG9ydCBwYXlsb2FkXVwiJztcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHVuYmxpbmRlZCByZXBvcnQgZm9yIGEgY2F1Z2h0IGZhaWx1cmU6IHRoZSBkaXZlIGJyYW5jaCwgdGhlXG4gKiBlcnJvcmVkIGNvbnN0cnVjdGlvbiBlZGdlLCB0aGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIGFyZ3MsIHRoZSBhY3R1YWxcbiAqIG1lc3NhZ2UuIE5vbi1FcnJvciB0aHJvd3MgYXJlIHJlcG9ydGVkIHRydXRoZnVsbHkgYXMgc3VjaCwgbmV2ZXJcbiAqIGRyZXNzZWQgdXAgYXMgRXJyb3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRVbmJsaW5kUmVwb3J0IChlcnJvcjogdW5rbm93bik6IFVuYmxpbmRSZXBvcnQge1xuXHRjb25zdCBpc0Vycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvcjtcblx0Y29uc3QgbWVzc2FnZSA9IGlzRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogYG5vbi1FcnJvciB0aHJvd24gKCR7dHlwZW9mIGVycm9yfSlgO1xuXHRjb25zdCBmbG93ID0gaXNFcnJvciA/IGdldEZsb3coZXJyb3IgYXMgRXJyb3IpIDogW107XG5cdC8vIFRoZSBlcnJvcmVkIGNyZWF0ZSBlZGdlIGF0dHJpYnV0ZXMgdGhlIGNvbnN0cnVjdGlvbidzIFBBUkVOVFxuXHQvLyBpbnN0YW5jZSAocHJvYmVkIDIwMjYtMDktMDM6IGVkZ2UuaW5zdGFuY2UgPT09IGV4aXN0ZW50SW5zdGFuY2UpLlxuXHQvLyBUaGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIEFSR1MgcmlkZSB0aGUgY2F1Z2h0IGVycm9yIGl0c2VsZiDigJQgaXRcblx0Ly8gSVMgdGhlIGVycm9yZWQgc2hlbGwsIGFuZCBnZXRQcm9wcyBleHBvc2VzIGl0cyBhcmdzIChzZWVcblx0Ly8gZXJyb3JlZEFyZ3NTYWZlIGFib3ZlKS5cblx0Y29uc3QgZXJyb3JlZEVkZ2UgPSBbLi4uZmxvd10ucmV2ZXJzZSgpLmZpbmQoKGVkZ2UpID0+IGVkZ2Uua2luZCA9PT0gJ2NyZWF0ZScgJiYgZWRnZS5zdGF0dXMgPT09ICdlcnJvcicpO1xuXHRjb25zdCBlcnJvcmVkSW5zdGFuY2UgPSBlcnJvcmVkRWRnZT8uaW5zdGFuY2U7XG5cdGNvbnN0IGF0dGVtcHRlZEFyZ3MgPSBpc0Vycm9yID8gZXJyb3JlZEFyZ3NTYWZlKGVycm9yIGFzIEVycm9yKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcmVwb3J0OiBVbmJsaW5kUmVwb3J0ID0ge1xuXHRcdGtpbmQgICAgICAgICAgICA6ICdjYXVnaHQtdW5ibGluZGVkJyxcblx0XHRtZXNzYWdlLFxuXHRcdGJyYW5jaCAgICAgICAgICA6IGZsb3cubWFwKChlZGdlKSA9PiBgJHtlZGdlLmtpbmR9OiR7ZWRnZS5uYW1lfWApLFxuXHRcdGVycm9yZWRUeXBlICAgICA6IGVycm9yZWRFZGdlPy5uYW1lID8/IG51bGwsXG5cdFx0ZXJyb3JlZEluc3RhbmNlIDogZXJyb3JlZEluc3RhbmNlID8gZXh0cmFjdFNhZmUoZXJyb3JlZEluc3RhbmNlKSA6IG51bGwsXG5cdFx0YXR0ZW1wdGVkQXJncyAgIDogYXR0ZW1wdGVkQXJncyA/PyBudWxsLFxuXHR9O1xuXHRyZXR1cm4gcmVwb3J0O1xufVxuXG4vKipcbiAqIFRoZSB1bmNvbmRpdGlvbmFsIGhhbGY6IGFuIEVSUk9SIHNwYW4gd2l0aCB0aGUgcmVjb3JkZWQgZXhjZXB0aW9uICsgdGhlXG4gKiBkaXZlIGJyYW5jaCDigJQgaW5zaWRlIHRoZSByZXF1ZXN0J3MgYXN5bmMgY29udGV4dCwgc28gdGhlIEFMUyBjb250ZXh0XG4gKiBtYW5hZ2VyIHBhcmVudHMgaXQgdW5kZXIgdGhlIHJlcXVlc3Qgc3BhbiBvbiBpdHMgb3duIOKAlCBhbmQgdGhlIHN0ZG91dFxuICogbWFya2VyIGxpbmUuIEEgbm9uLUVycm9yIHRocm93IGlzIHJlY29yZGVkIGFzIGFuIGF0dHJpYnV0ZTpcbiAqIHJlY29yZEV4Y2VwdGlvbiBvbiBhIGNpcmN1bGFyIG9iamVjdCBjb3VsZCBicmVhayBleHBvcnRlclxuICogc2VyaWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFVuYmxpbmRUZWxlbWV0cnkgKHJlcG9ydDogVW5ibGluZFJlcG9ydCwgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcblx0Y29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcignQG1uZW1vbmljYS9vdGVsJykuc3RhcnRTcGFuKCdtbmVtb25pY2EuY2F1Z2h0LWV4Y2VwdGlvbicpO1xuXHRzcGFuLnNldEF0dHJpYnV0ZSgnZGl2ZS5icmFuY2gnLCByZXBvcnQuYnJhbmNoLmpvaW4oJyDihpIgJykpO1xuXHRpZiAocmVwb3J0LmVycm9yZWRUeXBlKSB7XG5cdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoJ21uZW1vbmljYS5lcnJvcmVkX3R5cGUnLCByZXBvcnQuZXJyb3JlZFR5cGUpO1xuXHR9XG5cdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsIG1lc3NhZ2U6IHJlcG9ydC5tZXNzYWdlIH0pO1xuXHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yKTtcblx0fSBlbHNlIHtcblx0XHRzcGFuLnNldEF0dHJpYnV0ZSgnZXhjZXB0aW9uLnR5cGUnLCAnbm9uLUVycm9yLXRocm93Jyk7XG5cdH1cblx0c3Bhbi5lbmQoKTtcblxuXHQvLyBUaGUgW3VuYmxpbmRdIHByZWZpeCBpcyBhIGRvd25zdHJlYW0gY29udHJhY3Qg4oCUIHJ1bmJvb2tzIGdyZXAgZm9yXG5cdC8vIGV4YWN0bHkgdGhpcyBtYXJrZXIuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG5cdGNvbnNvbGUubG9nKGBbdW5ibGluZF0gJHtzdHJpbmdpZnlTYWZlKHJlcG9ydCl9YCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FlowEdge } from '@mnemonica/dive';
|
|
2
|
+
/**
|
|
3
|
+
* JSON-safe shape of a trace edge: the FlowEdge without the live instance
|
|
4
|
+
* reference (mnemonica instances don't survive serialization), duration
|
|
5
|
+
* normalized to null while unsettled.
|
|
6
|
+
*/
|
|
7
|
+
export interface FormattedFlowEdge {
|
|
8
|
+
name: string;
|
|
9
|
+
kind: FlowEdge['kind'];
|
|
10
|
+
status: FlowEdge['status'];
|
|
11
|
+
duration: number | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Canonical edge → plain-JSON shaping for reports, filters and logs.
|
|
15
|
+
* Same target semantics as getFlow: Error | instance | current cursor.
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatFlow(target?: unknown): FormattedFlowEdge[];
|
|
18
|
+
/**
|
|
19
|
+
* The "who failed" fallback: the instance pinned to the error at its
|
|
20
|
+
* deepest wrapped boundary, or the current ambient context when the error
|
|
21
|
+
* never crossed one.
|
|
22
|
+
*/
|
|
23
|
+
export declare function errorContext(error: Error): object | undefined;
|
|
24
|
+
//# sourceMappingURL=dive-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dive-flow.d.ts","sourceRoot":"","sources":["../../src/utils/dive-flow.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAO,MAAM,CAAC;IAClB,IAAI,EAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9B,QAAQ,EAAG,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAE,MAAM,CAAC,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAWjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAI9D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-side helpers over @mnemonica/dive's trace — the two idioms error
|
|
3
|
+
* boundaries kept re-deriving by hand (four formatter copies and two
|
|
4
|
+
* fallback copies in finecut before these existed).
|
|
5
|
+
*/
|
|
6
|
+
import { getFlow, getErrorInstance, current } from '@mnemonica/dive';
|
|
7
|
+
/**
|
|
8
|
+
* Canonical edge → plain-JSON shaping for reports, filters and logs.
|
|
9
|
+
* Same target semantics as getFlow: Error | instance | current cursor.
|
|
10
|
+
*/
|
|
11
|
+
export function formatFlow(target) {
|
|
12
|
+
const result = getFlow(target).map((edge) => {
|
|
13
|
+
const formatted = {
|
|
14
|
+
name: edge.name,
|
|
15
|
+
kind: edge.kind,
|
|
16
|
+
status: edge.status,
|
|
17
|
+
duration: edge.duration ?? null,
|
|
18
|
+
};
|
|
19
|
+
return formatted;
|
|
20
|
+
});
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The "who failed" fallback: the instance pinned to the error at its
|
|
25
|
+
* deepest wrapped boundary, or the current ambient context when the error
|
|
26
|
+
* never crossed one.
|
|
27
|
+
*/
|
|
28
|
+
export function errorContext(error) {
|
|
29
|
+
const pinned = getErrorInstance(error);
|
|
30
|
+
const result = pinned ?? current();
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2ZS1mbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RpdmUtZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWVyRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFFLE1BQWdCO0lBQzNDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUMzQyxNQUFNLFNBQVMsR0FBc0I7WUFDcEMsSUFBSSxFQUFPLElBQUksQ0FBQyxJQUFJO1lBQ3BCLElBQUksRUFBTyxJQUFJLENBQUMsSUFBSTtZQUNwQixNQUFNLEVBQUssSUFBSSxDQUFDLE1BQU07WUFDdEIsUUFBUSxFQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSTtTQUNoQyxDQUFDO1FBQ0YsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBRSxLQUFZO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNuQyxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlYWQtc2lkZSBoZWxwZXJzIG92ZXIgQG1uZW1vbmljYS9kaXZlJ3MgdHJhY2Ug4oCUIHRoZSB0d28gaWRpb21zIGVycm9yXG4gKiBib3VuZGFyaWVzIGtlcHQgcmUtZGVyaXZpbmcgYnkgaGFuZCAoZm91ciBmb3JtYXR0ZXIgY29waWVzIGFuZCB0d29cbiAqIGZhbGxiYWNrIGNvcGllcyBpbiBmaW5lY3V0IGJlZm9yZSB0aGVzZSBleGlzdGVkKS5cbiAqL1xuaW1wb3J0IHsgZ2V0RmxvdywgZ2V0RXJyb3JJbnN0YW5jZSwgY3VycmVudCB9IGZyb20gJ0BtbmVtb25pY2EvZGl2ZSc7XG5pbXBvcnQgdHlwZSB7IEZsb3dFZGdlIH0gZnJvbSAnQG1uZW1vbmljYS9kaXZlJztcblxuLyoqXG4gKiBKU09OLXNhZmUgc2hhcGUgb2YgYSB0cmFjZSBlZGdlOiB0aGUgRmxvd0VkZ2Ugd2l0aG91dCB0aGUgbGl2ZSBpbnN0YW5jZVxuICogcmVmZXJlbmNlIChtbmVtb25pY2EgaW5zdGFuY2VzIGRvbid0IHN1cnZpdmUgc2VyaWFsaXphdGlvbiksIGR1cmF0aW9uXG4gKiBub3JtYWxpemVkIHRvIG51bGwgd2hpbGUgdW5zZXR0bGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZEZsb3dFZGdlIHtcblx0bmFtZSAgICAgOiBzdHJpbmc7XG5cdGtpbmQgICAgIDogRmxvd0VkZ2VbJ2tpbmQnXTtcblx0c3RhdHVzICAgOiBGbG93RWRnZVsnc3RhdHVzJ107XG5cdGR1cmF0aW9uIDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBDYW5vbmljYWwgZWRnZSDihpIgcGxhaW4tSlNPTiBzaGFwaW5nIGZvciByZXBvcnRzLCBmaWx0ZXJzIGFuZCBsb2dzLlxuICogU2FtZSB0YXJnZXQgc2VtYW50aWNzIGFzIGdldEZsb3c6IEVycm9yIHwgaW5zdGFuY2UgfCBjdXJyZW50IGN1cnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZsb3cgKHRhcmdldD86IHVua25vd24pOiBGb3JtYXR0ZWRGbG93RWRnZVtdIHtcblx0Y29uc3QgcmVzdWx0ID0gZ2V0Rmxvdyh0YXJnZXQpLm1hcCgoZWRnZSkgPT4ge1xuXHRcdGNvbnN0IGZvcm1hdHRlZDogRm9ybWF0dGVkRmxvd0VkZ2UgPSB7XG5cdFx0XHRuYW1lICAgICA6IGVkZ2UubmFtZSxcblx0XHRcdGtpbmQgICAgIDogZWRnZS5raW5kLFxuXHRcdFx0c3RhdHVzICAgOiBlZGdlLnN0YXR1cyxcblx0XHRcdGR1cmF0aW9uIDogZWRnZS5kdXJhdGlvbiA/PyBudWxsLFxuXHRcdH07XG5cdFx0cmV0dXJuIGZvcm1hdHRlZDtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIFwid2hvIGZhaWxlZFwiIGZhbGxiYWNrOiB0aGUgaW5zdGFuY2UgcGlubmVkIHRvIHRoZSBlcnJvciBhdCBpdHNcbiAqIGRlZXBlc3Qgd3JhcHBlZCBib3VuZGFyeSwgb3IgdGhlIGN1cnJlbnQgYW1iaWVudCBjb250ZXh0IHdoZW4gdGhlIGVycm9yXG4gKiBuZXZlciBjcm9zc2VkIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29udGV4dCAoZXJyb3I6IEVycm9yKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcGlubmVkID0gZ2V0RXJyb3JJbnN0YW5jZShlcnJvcik7XG5cdGNvbnN0IHJlc3VsdCA9IHBpbm5lZCA/PyBjdXJyZW50KCk7XG5cdHJldHVybiByZXN1bHQ7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-mnemonica-instance.d.ts","sourceRoot":"","sources":["../../src/utils/is-mnemonica-instance.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime type guard for mnemonica instances.
|
|
3
|
+
* Uses mnemonica's getProps() — no instanceof hacks, works across realms.
|
|
4
|
+
*/
|
|
5
|
+
import { getProps } from 'mnemonica/module';
|
|
6
|
+
export function isMnemonicaInstance(value) {
|
|
7
|
+
return value != null && typeof value === 'object' && getProps(value) !== undefined;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtbW5lbW9uaWNhLWluc3RhbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2lzLW1uZW1vbmljYS1pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsTUFBTSxVQUFVLG1CQUFtQixDQUFFLEtBQWM7SUFDbEQsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3BGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgbW5lbW9uaWNhIGluc3RhbmNlcy5cbiAqIFVzZXMgbW5lbW9uaWNhJ3MgZ2V0UHJvcHMoKSDigJQgbm8gaW5zdGFuY2VvZiBoYWNrcywgd29ya3MgYWNyb3NzIHJlYWxtcy5cbiAqL1xuaW1wb3J0IHsgZ2V0UHJvcHMgfSBmcm9tICdtbmVtb25pY2EvbW9kdWxlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW5lbW9uaWNhSW5zdGFuY2UgKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIGdldFByb3BzKHZhbHVlKSAhPT0gdW5kZWZpbmVkO1xufVxuIl19
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.attachHooks = attachHooks;
|
|
4
|
+
/**
|
|
5
|
+
* attachHooks — the mnemonica lifecycle wiring for @mnemonica/dive.
|
|
6
|
+
*
|
|
7
|
+
* This lived inside dive itself until dive became engine-only: dive imports
|
|
8
|
+
* nothing but node:crypto and exposes primitives (wrap, recordCreation, …);
|
|
9
|
+
* the knowledge of mnemonica's hook contract — hook names, hooksOpts fields,
|
|
10
|
+
* and what a ROOT construction is — belongs here at adapter level.
|
|
11
|
+
*
|
|
12
|
+
* preCreation → enter the parent (existentInstance) context BEFORE the
|
|
13
|
+
* constructor runs, and wrap any function arguments so
|
|
14
|
+
* callbacks handed to the constructor carry that context.
|
|
15
|
+
* postCreation → record the instance's 'create' edge via recordCreation,
|
|
16
|
+
* then wrap the instance's methods.
|
|
17
|
+
* creationError→ record a failed 'create' edge (status: 'error') under the
|
|
18
|
+
* surviving parent and pin the error to it: the failure is
|
|
19
|
+
* recoverable off the error object itself.
|
|
20
|
+
*/
|
|
21
|
+
const dive_1 = require("@mnemonica/dive");
|
|
22
|
+
function attachHooks(collection) {
|
|
23
|
+
collection.registerHook('preCreation', (hookData) => {
|
|
24
|
+
const parent = hookData.existentInstance;
|
|
25
|
+
if (parent) {
|
|
26
|
+
(0, dive_1.enterContext)(parent);
|
|
27
|
+
}
|
|
28
|
+
const args = hookData.args;
|
|
29
|
+
if (Array.isArray(args)) {
|
|
30
|
+
for (let i = 0; i < args.length; i++) {
|
|
31
|
+
const arg = args[i];
|
|
32
|
+
if (typeof arg === 'function' && !(0, dive_1.isWrappedFunction)(arg)) {
|
|
33
|
+
args[i] = (0, dive_1.wrapConstructorArg)(arg, parent);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
collection.registerHook('postCreation', (hookData) => {
|
|
39
|
+
const instance = hookData.inheritedInstance;
|
|
40
|
+
if (!instance) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(hookData.args)) {
|
|
44
|
+
for (const arg of hookData.args) {
|
|
45
|
+
(0, dive_1.upgradeConstructorArg)(arg, instance);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
(0, dive_1.recordCreation)(hookData.TypeName || 'anonymous', instance, hookData.existentInstance);
|
|
49
|
+
(0, dive_1.wrapInstanceMethods)(instance);
|
|
50
|
+
});
|
|
51
|
+
collection.registerHook('creationError', (hookData) => {
|
|
52
|
+
(0, dive_1.recordCreationError)(hookData.TypeName || 'anonymous', hookData.inheritedInstance, hookData.existentInstance);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNoLWhvb2tzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL2F0dGFjaC1ob29rcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTRCQSxrQ0FzQ0M7QUFsRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCwwQ0FReUI7QUFHekIsU0FBZ0IsV0FBVyxDQUFFLFVBQTJCO0lBQ3ZELFVBQVUsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDbkQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWixJQUFBLG1CQUFZLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUEsd0JBQWlCLEVBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUEseUJBQWtCLEVBQUMsR0FBbUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ3BELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztRQUM1QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZixPQUFPO1FBQ1IsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsSUFBQSw0QkFBcUIsRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFBLHFCQUFjLEVBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RGLElBQUEsMEJBQW1CLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ3JELElBQUEsMEJBQW1CLEVBQ2xCLFFBQVEsQ0FBQyxRQUFRLElBQUksV0FBVyxFQUNoQyxRQUFRLENBQUMsaUJBQWlCLEVBQzFCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDekIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0YWNoSG9va3Mg4oCUIHRoZSBtbmVtb25pY2EgbGlmZWN5Y2xlIHdpcmluZyBmb3IgQG1uZW1vbmljYS9kaXZlLlxuICpcbiAqIFRoaXMgbGl2ZWQgaW5zaWRlIGRpdmUgaXRzZWxmIHVudGlsIGRpdmUgYmVjYW1lIGVuZ2luZS1vbmx5OiBkaXZlIGltcG9ydHNcbiAqIG5vdGhpbmcgYnV0IG5vZGU6Y3J5cHRvIGFuZCBleHBvc2VzIHByaW1pdGl2ZXMgKHdyYXAsIHJlY29yZENyZWF0aW9uLCDigKYpO1xuICogdGhlIGtub3dsZWRnZSBvZiBtbmVtb25pY2EncyBob29rIGNvbnRyYWN0IOKAlCBob29rIG5hbWVzLCBob29rc09wdHMgZmllbGRzLFxuICogYW5kIHdoYXQgYSBST09UIGNvbnN0cnVjdGlvbiBpcyDigJQgYmVsb25ncyBoZXJlIGF0IGFkYXB0ZXIgbGV2ZWwuXG4gKlxuICogcHJlQ3JlYXRpb24gIOKGkiBlbnRlciB0aGUgcGFyZW50IChleGlzdGVudEluc3RhbmNlKSBjb250ZXh0IEJFRk9SRSB0aGVcbiAqICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIHJ1bnMsIGFuZCB3cmFwIGFueSBmdW5jdGlvbiBhcmd1bWVudHMgc29cbiAqICAgICAgICAgICAgICAgIGNhbGxiYWNrcyBoYW5kZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGNhcnJ5IHRoYXQgY29udGV4dC5cbiAqIHBvc3RDcmVhdGlvbiDihpIgcmVjb3JkIHRoZSBpbnN0YW5jZSdzICdjcmVhdGUnIGVkZ2UgdmlhIHJlY29yZENyZWF0aW9uLFxuICogICAgICAgICAgICAgICAgdGhlbiB3cmFwIHRoZSBpbnN0YW5jZSdzIG1ldGhvZHMuXG4gKiBjcmVhdGlvbkVycm9y4oaSIHJlY29yZCBhIGZhaWxlZCAnY3JlYXRlJyBlZGdlIChzdGF0dXM6ICdlcnJvcicpIHVuZGVyIHRoZVxuICogICAgICAgICAgICAgICAgc3Vydml2aW5nIHBhcmVudCBhbmQgcGluIHRoZSBlcnJvciB0byBpdDogdGhlIGZhaWx1cmUgaXNcbiAqICAgICAgICAgICAgICAgIHJlY292ZXJhYmxlIG9mZiB0aGUgZXJyb3Igb2JqZWN0IGl0c2VsZi5cbiAqL1xuaW1wb3J0IHtcblx0ZW50ZXJDb250ZXh0LFxuXHR3cmFwQ29uc3RydWN0b3JBcmcsXG5cdHVwZ3JhZGVDb25zdHJ1Y3RvckFyZyxcblx0d3JhcEluc3RhbmNlTWV0aG9kcyxcblx0cmVjb3JkQ3JlYXRpb24sXG5cdHJlY29yZENyZWF0aW9uRXJyb3IsXG5cdGlzV3JhcHBlZEZ1bmN0aW9uLFxufSBmcm9tICdAbW5lbW9uaWNhL2RpdmUnO1xuaW1wb3J0IHR5cGUgeyBUeXBlc0NvbGxlY3Rpb24gfSBmcm9tICdtbmVtb25pY2EvbW9kdWxlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaEhvb2tzIChjb2xsZWN0aW9uOiBUeXBlc0NvbGxlY3Rpb24pOiB2b2lkIHtcblx0Y29sbGVjdGlvbi5yZWdpc3Rlckhvb2soJ3ByZUNyZWF0aW9uJywgKGhvb2tEYXRhKSA9PiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gaG9va0RhdGEuZXhpc3RlbnRJbnN0YW5jZTtcblx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRlbnRlckNvbnRleHQocGFyZW50KTtcblx0XHR9XG5cdFx0Y29uc3QgYXJncyA9IGhvb2tEYXRhLmFyZ3M7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoYXJncykpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBhcmcgPSBhcmdzW2ldO1xuXHRcdFx0XHRpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNXcmFwcGVkRnVuY3Rpb24oYXJnKSkge1xuXHRcdFx0XHRcdGFyZ3NbaV0gPSB3cmFwQ29uc3RydWN0b3JBcmcoYXJnIGFzICguLi5hOiB1bmtub3duW10pID0+IHVua25vd24sIHBhcmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGNvbGxlY3Rpb24ucmVnaXN0ZXJIb29rKCdwb3N0Q3JlYXRpb24nLCAoaG9va0RhdGEpID0+IHtcblx0XHRjb25zdCBpbnN0YW5jZSA9IGhvb2tEYXRhLmluaGVyaXRlZEluc3RhbmNlO1xuXHRcdGlmICghaW5zdGFuY2UpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoaG9va0RhdGEuYXJncykpIHtcblx0XHRcdGZvciAoY29uc3QgYXJnIG9mIGhvb2tEYXRhLmFyZ3MpIHtcblx0XHRcdFx0dXBncmFkZUNvbnN0cnVjdG9yQXJnKGFyZywgaW5zdGFuY2UpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZWNvcmRDcmVhdGlvbihob29rRGF0YS5UeXBlTmFtZSB8fCAnYW5vbnltb3VzJywgaW5zdGFuY2UsIGhvb2tEYXRhLmV4aXN0ZW50SW5zdGFuY2UpO1xuXHRcdHdyYXBJbnN0YW5jZU1ldGhvZHMoaW5zdGFuY2UpO1xuXHR9KTtcblxuXHRjb2xsZWN0aW9uLnJlZ2lzdGVySG9vaygnY3JlYXRpb25FcnJvcicsIChob29rRGF0YSkgPT4ge1xuXHRcdHJlY29yZENyZWF0aW9uRXJyb3IoXG5cdFx0XHRob29rRGF0YS5UeXBlTmFtZSB8fCAnYW5vbnltb3VzJyxcblx0XHRcdGhvb2tEYXRhLmluaGVyaXRlZEluc3RhbmNlLFxuXHRcdFx0aG9va0RhdGEuZXhpc3RlbnRJbnN0YW5jZVxuXHRcdCk7XG5cdH0pO1xufVxuIl19
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @mnemonica/otel — the framework-free Node.js core of the mnemonica
|
|
4
|
+
* observability stack.
|
|
5
|
+
*
|
|
6
|
+
* Everything here works in ANY Node.js runtime (Express, Fastify, raw
|
|
7
|
+
* http, queue consumers, CLI); framework wiring lives in dedicated
|
|
8
|
+
* adapter packages built on these primitives.
|
|
9
|
+
*
|
|
10
|
+
* Provides:
|
|
11
|
+
* - attachHooks() — mnemonica lifecycle → dive edge wiring
|
|
12
|
+
* - MnemonicaOtelProvider — OTel spans for constructions
|
|
13
|
+
* - DiveOtelProvider — OTel spans for every dive-wrapped call
|
|
14
|
+
* - AsyncFlowProvider — ALS backbone attributing unwrapped async hops
|
|
15
|
+
* - runInRequestScope() — one request span + triple async scope
|
|
16
|
+
* - feedPreRoot()/feedValidatedPreRoot()/getPreRoot() — thunderstruck
|
|
17
|
+
* pre-root forensics store (identity-correlated, request-lifetime)
|
|
18
|
+
* - feedPreRootFromRequest() — boundary helper over any HTTP request
|
|
19
|
+
* - buildUnblindReport()/recordUnblindTelemetry() — the Unblinder core
|
|
20
|
+
* - isMnemonicaInstance() — realm-safe type guard
|
|
21
|
+
* - formatFlow()/errorContext() — read-side helpers over dive's trace
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.errorContext = exports.formatFlow = exports.isMnemonicaInstance = exports.stringifySafe = exports.erroredArgsSafe = exports.extractSafe = exports.recordUnblindTelemetry = exports.buildUnblindReport = exports.feedPreRootFromRequest = exports.getPreRoot = exports.feedValidatedPreRoot = exports.feedPreRoot = exports.runInRequestScope = exports.AsyncFlowProvider = exports.DiveOtelProvider = exports.MnemonicaOtelProvider = exports.attachHooks = void 0;
|
|
25
|
+
var attach_hooks_js_1 = require("./hooks/attach-hooks.js");
|
|
26
|
+
Object.defineProperty(exports, "attachHooks", { enumerable: true, get: function () { return attach_hooks_js_1.attachHooks; } });
|
|
27
|
+
var mnemonica_otel_provider_js_1 = require("./providers/mnemonica-otel.provider.js");
|
|
28
|
+
Object.defineProperty(exports, "MnemonicaOtelProvider", { enumerable: true, get: function () { return mnemonica_otel_provider_js_1.MnemonicaOtelProvider; } });
|
|
29
|
+
var dive_otel_provider_js_1 = require("./providers/dive-otel.provider.js");
|
|
30
|
+
Object.defineProperty(exports, "DiveOtelProvider", { enumerable: true, get: function () { return dive_otel_provider_js_1.DiveOtelProvider; } });
|
|
31
|
+
var async_flow_provider_js_1 = require("./providers/async-flow.provider.js");
|
|
32
|
+
Object.defineProperty(exports, "AsyncFlowProvider", { enumerable: true, get: function () { return async_flow_provider_js_1.AsyncFlowProvider; } });
|
|
33
|
+
var request_scope_js_1 = require("./request-scope.js");
|
|
34
|
+
Object.defineProperty(exports, "runInRequestScope", { enumerable: true, get: function () { return request_scope_js_1.runInRequestScope; } });
|
|
35
|
+
var pre_root_js_1 = require("./thunderstruck/pre-root.js");
|
|
36
|
+
Object.defineProperty(exports, "feedPreRoot", { enumerable: true, get: function () { return pre_root_js_1.feedPreRoot; } });
|
|
37
|
+
Object.defineProperty(exports, "feedValidatedPreRoot", { enumerable: true, get: function () { return pre_root_js_1.feedValidatedPreRoot; } });
|
|
38
|
+
Object.defineProperty(exports, "getPreRoot", { enumerable: true, get: function () { return pre_root_js_1.getPreRoot; } });
|
|
39
|
+
var feed_from_request_js_1 = require("./thunderstruck/feed-from-request.js");
|
|
40
|
+
Object.defineProperty(exports, "feedPreRootFromRequest", { enumerable: true, get: function () { return feed_from_request_js_1.feedPreRootFromRequest; } });
|
|
41
|
+
var unblind_js_1 = require("./unblind.js");
|
|
42
|
+
Object.defineProperty(exports, "buildUnblindReport", { enumerable: true, get: function () { return unblind_js_1.buildUnblindReport; } });
|
|
43
|
+
Object.defineProperty(exports, "recordUnblindTelemetry", { enumerable: true, get: function () { return unblind_js_1.recordUnblindTelemetry; } });
|
|
44
|
+
Object.defineProperty(exports, "extractSafe", { enumerable: true, get: function () { return unblind_js_1.extractSafe; } });
|
|
45
|
+
Object.defineProperty(exports, "erroredArgsSafe", { enumerable: true, get: function () { return unblind_js_1.erroredArgsSafe; } });
|
|
46
|
+
Object.defineProperty(exports, "stringifySafe", { enumerable: true, get: function () { return unblind_js_1.stringifySafe; } });
|
|
47
|
+
var is_mnemonica_instance_js_1 = require("./utils/is-mnemonica-instance.js");
|
|
48
|
+
Object.defineProperty(exports, "isMnemonicaInstance", { enumerable: true, get: function () { return is_mnemonica_instance_js_1.isMnemonicaInstance; } });
|
|
49
|
+
var dive_flow_js_1 = require("./utils/dive-flow.js");
|
|
50
|
+
Object.defineProperty(exports, "formatFlow", { enumerable: true, get: function () { return dive_flow_js_1.formatFlow; } });
|
|
51
|
+
Object.defineProperty(exports, "errorContext", { enumerable: true, get: function () { return dive_flow_js_1.errorContext; } });
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgsMkRBQXNEO0FBQTdDLDhHQUFBLFdBQVcsT0FBQTtBQUNwQixxRkFBK0U7QUFBdEUsbUlBQUEscUJBQXFCLE9BQUE7QUFDOUIsMkVBQXFFO0FBQTVELHlIQUFBLGdCQUFnQixPQUFBO0FBQ3pCLDZFQUEwRztBQUFqRywySEFBQSxpQkFBaUIsT0FBQTtBQUMxQix1REFBMkg7QUFBbEgscUhBQUEsaUJBQWlCLE9BQUE7QUFDMUIsMkRBT3FDO0FBTnBDLDBHQUFBLFdBQVcsT0FBQTtBQUNYLG1IQUFBLG9CQUFvQixPQUFBO0FBQ3BCLHlHQUFBLFVBQVUsT0FBQTtBQUtYLDZFQUF5SDtBQUFoSCw4SEFBQSxzQkFBc0IsT0FBQTtBQUMvQiwyQ0FPc0I7QUFOckIsZ0hBQUEsa0JBQWtCLE9BQUE7QUFDbEIsb0hBQUEsc0JBQXNCLE9BQUE7QUFDdEIseUdBQUEsV0FBVyxPQUFBO0FBQ1gsNkdBQUEsZUFBZSxPQUFBO0FBQ2YsMkdBQUEsYUFBYSxPQUFBO0FBR2QsNkVBQXVFO0FBQTlELCtIQUFBLG1CQUFtQixPQUFBO0FBQzVCLHFEQUF3RjtBQUEvRSwwR0FBQSxVQUFVLE9BQUE7QUFBRSw0R0FBQSxZQUFZLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtbmVtb25pY2Evb3RlbCDigJQgdGhlIGZyYW1ld29yay1mcmVlIE5vZGUuanMgY29yZSBvZiB0aGUgbW5lbW9uaWNhXG4gKiBvYnNlcnZhYmlsaXR5IHN0YWNrLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaGVyZSB3b3JrcyBpbiBBTlkgTm9kZS5qcyBydW50aW1lIChFeHByZXNzLCBGYXN0aWZ5LCByYXdcbiAqIGh0dHAsIHF1ZXVlIGNvbnN1bWVycywgQ0xJKTsgZnJhbWV3b3JrIHdpcmluZyBsaXZlcyBpbiBkZWRpY2F0ZWRcbiAqIGFkYXB0ZXIgcGFja2FnZXMgYnVpbHQgb24gdGhlc2UgcHJpbWl0aXZlcy5cbiAqXG4gKiBQcm92aWRlczpcbiAqICAgLSBhdHRhY2hIb29rcygpIOKAlCBtbmVtb25pY2EgbGlmZWN5Y2xlIOKGkiBkaXZlIGVkZ2Ugd2lyaW5nXG4gKiAgIC0gTW5lbW9uaWNhT3RlbFByb3ZpZGVyIOKAlCBPVGVsIHNwYW5zIGZvciBjb25zdHJ1Y3Rpb25zXG4gKiAgIC0gRGl2ZU90ZWxQcm92aWRlciDigJQgT1RlbCBzcGFucyBmb3IgZXZlcnkgZGl2ZS13cmFwcGVkIGNhbGxcbiAqICAgLSBBc3luY0Zsb3dQcm92aWRlciDigJQgQUxTIGJhY2tib25lIGF0dHJpYnV0aW5nIHVud3JhcHBlZCBhc3luYyBob3BzXG4gKiAgIC0gcnVuSW5SZXF1ZXN0U2NvcGUoKSDigJQgb25lIHJlcXVlc3Qgc3BhbiArIHRyaXBsZSBhc3luYyBzY29wZVxuICogICAtIGZlZWRQcmVSb290KCkvZmVlZFZhbGlkYXRlZFByZVJvb3QoKS9nZXRQcmVSb290KCkg4oCUIHRodW5kZXJzdHJ1Y2tcbiAqICAgICBwcmUtcm9vdCBmb3JlbnNpY3Mgc3RvcmUgKGlkZW50aXR5LWNvcnJlbGF0ZWQsIHJlcXVlc3QtbGlmZXRpbWUpXG4gKiAgIC0gZmVlZFByZVJvb3RGcm9tUmVxdWVzdCgpIOKAlCBib3VuZGFyeSBoZWxwZXIgb3ZlciBhbnkgSFRUUCByZXF1ZXN0XG4gKiAgIC0gYnVpbGRVbmJsaW5kUmVwb3J0KCkvcmVjb3JkVW5ibGluZFRlbGVtZXRyeSgpIOKAlCB0aGUgVW5ibGluZGVyIGNvcmVcbiAqICAgLSBpc01uZW1vbmljYUluc3RhbmNlKCkg4oCUIHJlYWxtLXNhZmUgdHlwZSBndWFyZFxuICogICAtIGZvcm1hdEZsb3coKS9lcnJvckNvbnRleHQoKSDigJQgcmVhZC1zaWRlIGhlbHBlcnMgb3ZlciBkaXZlJ3MgdHJhY2VcbiAqL1xuXG5leHBvcnQgeyBhdHRhY2hIb29rcyB9IGZyb20gJy4vaG9va3MvYXR0YWNoLWhvb2tzLmpzJztcbmV4cG9ydCB7IE1uZW1vbmljYU90ZWxQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL21uZW1vbmljYS1vdGVsLnByb3ZpZGVyLmpzJztcbmV4cG9ydCB7IERpdmVPdGVsUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9kaXZlLW90ZWwucHJvdmlkZXIuanMnO1xuZXhwb3J0IHsgQXN5bmNGbG93UHJvdmlkZXIsIHR5cGUgRmxvd0ZyYW1lLCB0eXBlIENyYXNoQ29udGV4dCB9IGZyb20gJy4vcHJvdmlkZXJzL2FzeW5jLWZsb3cucHJvdmlkZXIuanMnO1xuZXhwb3J0IHsgcnVuSW5SZXF1ZXN0U2NvcGUsIHR5cGUgSHR0cFJlcXVlc3RMaWtlLCB0eXBlIEh0dHBSZXNwb25zZUxpa2UsIHR5cGUgUmVxdWVzdFNjb3BlRGVwcyB9IGZyb20gJy4vcmVxdWVzdC1zY29wZS5qcyc7XG5leHBvcnQge1xuXHRmZWVkUHJlUm9vdCxcblx0ZmVlZFZhbGlkYXRlZFByZVJvb3QsXG5cdGdldFByZVJvb3QsXG5cdHR5cGUgUmF3UHJlUm9vdFBheWxvYWQsXG5cdHR5cGUgUHJlUm9vdFJlY29yZCxcblx0dHlwZSBQcmVSb290RGF0YSxcbn0gZnJvbSAnLi90aHVuZGVyc3RydWNrL3ByZS1yb290LmpzJztcbmV4cG9ydCB7IGZlZWRQcmVSb290RnJvbVJlcXVlc3QsIHR5cGUgUmVxdWVzdExpa2UsIHR5cGUgRmVlZFByZVJvb3RPcHRpb25zIH0gZnJvbSAnLi90aHVuZGVyc3RydWNrL2ZlZWQtZnJvbS1yZXF1ZXN0LmpzJztcbmV4cG9ydCB7XG5cdGJ1aWxkVW5ibGluZFJlcG9ydCxcblx0cmVjb3JkVW5ibGluZFRlbGVtZXRyeSxcblx0ZXh0cmFjdFNhZmUsXG5cdGVycm9yZWRBcmdzU2FmZSxcblx0c3RyaW5naWZ5U2FmZSxcblx0dHlwZSBVbmJsaW5kUmVwb3J0LFxufSBmcm9tICcuL3VuYmxpbmQuanMnO1xuZXhwb3J0IHsgaXNNbmVtb25pY2FJbnN0YW5jZSB9IGZyb20gJy4vdXRpbHMvaXMtbW5lbW9uaWNhLWluc3RhbmNlLmpzJztcbmV4cG9ydCB7IGZvcm1hdEZsb3csIGVycm9yQ29udGV4dCwgdHlwZSBGb3JtYXR0ZWRGbG93RWRnZSB9IGZyb20gJy4vdXRpbHMvZGl2ZS1mbG93LmpzJztcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|