@relkit/invocation 0.0.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 +5 -0
- package/dist/abort.d.ts +9 -0
- package/dist/abort.d.ts.map +1 -0
- package/dist/abort.js +80 -0
- package/dist/abort.js.map +1 -0
- package/dist/context.d.ts +7 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +39 -0
- package/dist/context.js.map +1 -0
- package/dist/contracts.d.ts +135 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +14 -0
- package/dist/contracts.js.map +1 -0
- package/dist/deadline.d.ts +12 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +57 -0
- package/dist/deadline.js.map +1 -0
- package/dist/dispatcher-context.d.ts +26 -0
- package/dist/dispatcher-context.d.ts.map +1 -0
- package/dist/dispatcher-context.js +90 -0
- package/dist/dispatcher-context.js.map +1 -0
- package/dist/dispatcher-scope.d.ts +4 -0
- package/dist/dispatcher-scope.d.ts.map +1 -0
- package/dist/dispatcher-scope.js +9 -0
- package/dist/dispatcher-scope.js.map +1 -0
- package/dist/dispatcher-types.d.ts +80 -0
- package/dist/dispatcher-types.d.ts.map +1 -0
- package/dist/dispatcher-types.js +8 -0
- package/dist/dispatcher-types.js.map +1 -0
- package/dist/dispatcher.d.ts +11 -0
- package/dist/dispatcher.d.ts.map +1 -0
- package/dist/dispatcher.js +12 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/error-retry.d.ts +12 -0
- package/dist/error-retry.d.ts.map +1 -0
- package/dist/error-retry.js +33 -0
- package/dist/error-retry.js.map +1 -0
- package/dist/failure-dependency.d.ts +6 -0
- package/dist/failure-dependency.d.ts.map +1 -0
- package/dist/failure-dependency.js +13 -0
- package/dist/failure-dependency.js.map +1 -0
- package/dist/failure-guards.d.ts +30 -0
- package/dist/failure-guards.d.ts.map +1 -0
- package/dist/failure-guards.js +58 -0
- package/dist/failure-guards.js.map +1 -0
- package/dist/failure-internals.d.ts +8 -0
- package/dist/failure-internals.d.ts.map +1 -0
- package/dist/failure-internals.js +20 -0
- package/dist/failure-internals.js.map +1 -0
- package/dist/failure-runtime.d.ts +30 -0
- package/dist/failure-runtime.d.ts.map +1 -0
- package/dist/failure-runtime.js +25 -0
- package/dist/failure-runtime.js.map +1 -0
- package/dist/failure-types.d.ts +89 -0
- package/dist/failure-types.d.ts.map +1 -0
- package/dist/failure-types.js +2 -0
- package/dist/failure-types.js.map +1 -0
- package/dist/failure.d.ts +18 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +128 -0
- package/dist/failure.js.map +1 -0
- package/dist/handler-bridge.d.ts +16 -0
- package/dist/handler-bridge.d.ts.map +1 -0
- package/dist/handler-bridge.js +75 -0
- package/dist/handler-bridge.js.map +1 -0
- package/dist/identity.d.ts +22 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +67 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +39 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +39 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/recursion.d.ts +31 -0
- package/dist/recursion.d.ts.map +1 -0
- package/dist/recursion.js +81 -0
- package/dist/recursion.js.map +1 -0
- package/dist/service-policy.d.ts +18 -0
- package/dist/service-policy.d.ts.map +1 -0
- package/dist/service-policy.js +113 -0
- package/dist/service-policy.js.map +1 -0
- package/dist/standalone-dispatcher.d.ts +3 -0
- package/dist/standalone-dispatcher.d.ts.map +1 -0
- package/dist/standalone-dispatcher.js +107 -0
- package/dist/standalone-dispatcher.js.map +1 -0
- package/dist/standalone-lifecycle.d.ts +20 -0
- package/dist/standalone-lifecycle.d.ts.map +1 -0
- package/dist/standalone-lifecycle.js +30 -0
- package/dist/standalone-lifecycle.js.map +1 -0
- package/dist/standalone-utils.d.ts +10 -0
- package/dist/standalone-utils.d.ts.map +1 -0
- package/dist/standalone-utils.js +52 -0
- package/dist/standalone-utils.js.map +1 -0
- package/dist/validation.d.ts +17 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +58 -0
- package/dist/validation.js.map +1 -0
- package/package.json +41 -0
package/dist/failure.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Cause } from "effect";
|
|
2
|
+
import { isJsonValue } from "@relkit/contracts";
|
|
3
|
+
import { isCancellation, isDependencyNotConfigured, isDeclaredError, isFunctionFailure, isProviderError, isTimeout, requiredText, } from "./failure-guards.js";
|
|
4
|
+
import { makeFailure, RuntimeFailure } from "./failure-runtime.js";
|
|
5
|
+
import { dependencyNotConfiguredFailure } from "./failure-dependency.js";
|
|
6
|
+
import { normalizeErrorRetry } from "./error-retry.js";
|
|
7
|
+
import { RecursionPolicyError } from "./recursion.js";
|
|
8
|
+
export function applicationFailure(options) {
|
|
9
|
+
const retry = normalizeErrorRetry(options.retry, options.afterMs);
|
|
10
|
+
return makeFailure({
|
|
11
|
+
_tag: "ApplicationFailure",
|
|
12
|
+
kind: "application",
|
|
13
|
+
outcome: "declared-error",
|
|
14
|
+
code: requiredText(options.id, "application failure id"),
|
|
15
|
+
message: requiredText(options.message, "application failure message"),
|
|
16
|
+
id: options.id,
|
|
17
|
+
data: options.data,
|
|
18
|
+
retry: retry.retry,
|
|
19
|
+
...(retry.afterMs === undefined ? {} : { afterMs: retry.afterMs }),
|
|
20
|
+
...(options.status === undefined ? {} : { status: options.status }),
|
|
21
|
+
}, options.cause);
|
|
22
|
+
}
|
|
23
|
+
export function providerFailure(cause, options = {}) {
|
|
24
|
+
return makeFailure({
|
|
25
|
+
_tag: "ProviderFailure",
|
|
26
|
+
kind: "provider",
|
|
27
|
+
outcome: "provider-failure",
|
|
28
|
+
code: "RELKIT_PROVIDER_FAILURE",
|
|
29
|
+
message: "Provider operation failed",
|
|
30
|
+
...options,
|
|
31
|
+
}, cause);
|
|
32
|
+
}
|
|
33
|
+
export const cancellationFailure = (cause) => makeFailure({
|
|
34
|
+
_tag: "Cancellation",
|
|
35
|
+
kind: "cancellation",
|
|
36
|
+
outcome: "cancelled",
|
|
37
|
+
code: "RELKIT_CANCELLED",
|
|
38
|
+
message: "Operation cancelled",
|
|
39
|
+
}, cause);
|
|
40
|
+
export const timeoutFailure = (cause) => makeFailure({
|
|
41
|
+
_tag: "Timeout",
|
|
42
|
+
kind: "timeout",
|
|
43
|
+
outcome: "timeout",
|
|
44
|
+
code: "RELKIT_TIMEOUT",
|
|
45
|
+
message: "Operation timed out",
|
|
46
|
+
}, cause);
|
|
47
|
+
export const unexpectedDefect = (cause, options) => makeFailure({
|
|
48
|
+
_tag: "UnexpectedDefect",
|
|
49
|
+
kind: "defect",
|
|
50
|
+
outcome: "defect",
|
|
51
|
+
code: options?.code ?? "RELKIT_UNEXPECTED_DEFECT",
|
|
52
|
+
message: options?.message ?? "Unexpected internal error",
|
|
53
|
+
}, cause);
|
|
54
|
+
export const defectFailure = unexpectedDefect;
|
|
55
|
+
export function normalizeFailure(value, options = {}) {
|
|
56
|
+
if (isInvocationFailure(value))
|
|
57
|
+
return value;
|
|
58
|
+
if (Cause.isCause(value)) {
|
|
59
|
+
if (options.timedOut)
|
|
60
|
+
return timeoutFailure(value);
|
|
61
|
+
if (Cause.hasInterruptsOnly(value) || options.signal?.aborted)
|
|
62
|
+
return cancellationFailure(value);
|
|
63
|
+
const reason = value.reasons.find((entry) => !Cause.isInterruptReason(entry));
|
|
64
|
+
if (reason === undefined)
|
|
65
|
+
return cancellationFailure(value);
|
|
66
|
+
const inner = Cause.isFailReason(reason)
|
|
67
|
+
? reason.error
|
|
68
|
+
: Cause.isDieReason(reason)
|
|
69
|
+
? reason.defect
|
|
70
|
+
: reason;
|
|
71
|
+
return normalizeValue(inner, value, options);
|
|
72
|
+
}
|
|
73
|
+
return normalizeValue(value, value, options);
|
|
74
|
+
}
|
|
75
|
+
function normalizeValue(value, detail, options) {
|
|
76
|
+
if (value instanceof RecursionPolicyError) {
|
|
77
|
+
return unexpectedDefect(detail, {
|
|
78
|
+
code: value.code,
|
|
79
|
+
message: "Invocation denied by recursion policy",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (isFunctionFailure(value))
|
|
83
|
+
return normalizeValue(value.error, detail, options);
|
|
84
|
+
if (options.timedOut || isTimeout(value))
|
|
85
|
+
return timeoutFailure(detail);
|
|
86
|
+
if (options.signal?.aborted || isCancellation(value))
|
|
87
|
+
return cancellationFailure(detail);
|
|
88
|
+
if (isDependencyNotConfigured(value))
|
|
89
|
+
return dependencyNotConfiguredFailure(value);
|
|
90
|
+
if (isDeclaredError(value)) {
|
|
91
|
+
const retry = normalizeErrorRetry(value.retry, value.afterMs);
|
|
92
|
+
return applicationFailure({
|
|
93
|
+
id: value.id,
|
|
94
|
+
data: value.data,
|
|
95
|
+
message: value.message,
|
|
96
|
+
retry: retry.retry,
|
|
97
|
+
...(retry.afterMs === undefined ? {} : { afterMs: retry.afterMs }),
|
|
98
|
+
...(value.http === undefined ? {} : { status: value.http.status }),
|
|
99
|
+
cause: detail,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (options.source === "provider" || isProviderError(value))
|
|
103
|
+
return providerFailure(detail, options.provider);
|
|
104
|
+
return unexpectedDefect(detail);
|
|
105
|
+
}
|
|
106
|
+
export function isInvocationFailure(value) {
|
|
107
|
+
return value instanceof RuntimeFailure;
|
|
108
|
+
}
|
|
109
|
+
export function toPublicEnvelope(value) {
|
|
110
|
+
const failure = normalizeFailure(value);
|
|
111
|
+
const base = {
|
|
112
|
+
kind: failure.kind,
|
|
113
|
+
outcome: failure.outcome,
|
|
114
|
+
code: failure.code,
|
|
115
|
+
message: failure.message,
|
|
116
|
+
};
|
|
117
|
+
if (failure._tag !== "ApplicationFailure")
|
|
118
|
+
return base;
|
|
119
|
+
const data = isJsonValue(failure.data) ? failure.data : undefined;
|
|
120
|
+
return {
|
|
121
|
+
...base,
|
|
122
|
+
...(data === undefined ? {} : { data }),
|
|
123
|
+
...(failure.status === undefined ? {} : { status: failure.status }),
|
|
124
|
+
retry: failure.retry,
|
|
125
|
+
...(failure.afterMs === undefined ? {} : { afterMs: failure.afterMs }),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure.js","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { MaybePromise } from "@relkit/contracts";
|
|
3
|
+
import type { InvocationFailure } from "./failure-types.js";
|
|
4
|
+
export interface HandlerBridgeOptions<Input, Output, Context extends object> {
|
|
5
|
+
readonly handler: (input: Input, context: Context) => MaybePromise<unknown>;
|
|
6
|
+
readonly input: Input;
|
|
7
|
+
readonly publicContext: Context;
|
|
8
|
+
readonly deadline?: number;
|
|
9
|
+
readonly timeoutMs?: number;
|
|
10
|
+
readonly onSignal?: (signal: AbortSignal) => void;
|
|
11
|
+
}
|
|
12
|
+
/** Converts one plain handler call into an Effect without creating a runtime. */
|
|
13
|
+
export declare function invokeUserHandler<Input, Output, Context extends {
|
|
14
|
+
readonly signal: AbortSignal;
|
|
15
|
+
}>(options: HandlerBridgeOptions<Input, Output, Context>): Effect.Effect<Output, InvocationFailure>;
|
|
16
|
+
//# sourceMappingURL=handler-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-bridge.d.ts","sourceRoot":"","sources":["../src/handler-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM;IACzE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5E,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CACnD;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,EAC/F,OAAO,EAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GACpD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAoD1C"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { createAbortBridge } from "./abort.js";
|
|
3
|
+
import { withDeadline, withTimeout } from "./deadline.js";
|
|
4
|
+
import { isDeclaredError, isFunctionFailure } from "./failure-guards.js";
|
|
5
|
+
import { normalizeFailure } from "./failure.js";
|
|
6
|
+
/** Converts one plain handler call into an Effect without creating a runtime. */
|
|
7
|
+
export function invokeUserHandler(options) {
|
|
8
|
+
const execution = Effect.callback((resume, fiberSignal) => {
|
|
9
|
+
const bridge = createAbortBridge(fiberSignal, options.publicContext.signal);
|
|
10
|
+
options.onSignal?.(bridge.signal);
|
|
11
|
+
let completed = false;
|
|
12
|
+
const cleanup = () => {
|
|
13
|
+
bridge.signal.removeEventListener("abort", onAbort);
|
|
14
|
+
bridge.dispose();
|
|
15
|
+
};
|
|
16
|
+
const complete = (effect) => {
|
|
17
|
+
if (completed)
|
|
18
|
+
return;
|
|
19
|
+
completed = true;
|
|
20
|
+
resume(effect.pipe(Effect.ensuring(Effect.sync(cleanup))));
|
|
21
|
+
};
|
|
22
|
+
const onAbort = () => complete(Effect.fail(normalizeFailure(bridge.signal.reason, {
|
|
23
|
+
signal: bridge.signal,
|
|
24
|
+
})));
|
|
25
|
+
if (bridge.signal.aborted) {
|
|
26
|
+
complete(Effect.fail(normalizeFailure(bridge.signal.reason, { signal: bridge.signal })));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
bridge.signal.addEventListener("abort", onAbort, { once: true });
|
|
30
|
+
const context = Object.freeze({ ...options.publicContext, signal: bridge.signal });
|
|
31
|
+
let result;
|
|
32
|
+
try {
|
|
33
|
+
result = options.handler(options.input, context);
|
|
34
|
+
}
|
|
35
|
+
catch (cause) {
|
|
36
|
+
complete(Effect.fail(normalizeFailure(cause, { signal: bridge.signal })));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
Promise.resolve(result).then((value) => completeValue(value, bridge.signal, complete), (cause) => complete(Effect.fail(normalizeFailure(cause, { signal: bridge.signal }))));
|
|
40
|
+
return Effect.sync(cleanup);
|
|
41
|
+
});
|
|
42
|
+
if (options.deadline === undefined && options.timeoutMs === undefined)
|
|
43
|
+
return execution;
|
|
44
|
+
const timed = options.timeoutMs === undefined
|
|
45
|
+
? withDeadline(execution, options.deadline)
|
|
46
|
+
: withTimeout(execution, options.timeoutMs, options.deadline);
|
|
47
|
+
return timed.pipe(Effect.mapError((cause) => normalizeFailure(cause)));
|
|
48
|
+
}
|
|
49
|
+
function completeValue(value, signal, complete) {
|
|
50
|
+
if (signal.aborted) {
|
|
51
|
+
complete(Effect.fail(normalizeFailure(signal.reason, { signal })));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (isFunctionFailure(value)) {
|
|
55
|
+
complete(Effect.fail(normalizeFailure(value.error, { signal })));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (isDeclaredError(value)) {
|
|
59
|
+
complete(Effect.fail(normalizeFailure(value, { signal })));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (Effect.isEffect(value)) {
|
|
63
|
+
const effect = value.pipe(Effect.flatMap((result) => signal.aborted
|
|
64
|
+
? Effect.fail(normalizeFailure(signal.reason, { signal }))
|
|
65
|
+
: isFunctionFailure(result)
|
|
66
|
+
? Effect.fail(normalizeFailure(result.error, { signal }))
|
|
67
|
+
: isDeclaredError(result)
|
|
68
|
+
? Effect.fail(normalizeFailure(result, { signal }))
|
|
69
|
+
: Effect.succeed(result)), Effect.mapError((cause) => normalizeFailure(cause, { signal })));
|
|
70
|
+
complete(effect);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
complete(Effect.succeed(value));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=handler-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-bridge.js","sourceRoot":"","sources":["../src/handler-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const UNBOUND_DESCRIPTOR_ID_PREFIX = "unbound.";
|
|
2
|
+
export interface DescriptorIdentitySource {
|
|
3
|
+
readonly id?: unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface ResolvedDescriptorIdentity {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly canonical: boolean;
|
|
8
|
+
readonly key: object | string;
|
|
9
|
+
}
|
|
10
|
+
export declare class DescriptorIdentityError extends TypeError {
|
|
11
|
+
readonly code: "RELKIT_DESCRIPTOR_IDENTITY_CONFLICT";
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
/** Creates a process-local diagnostic identity that is not a canonical address. */
|
|
15
|
+
export declare function createUnboundIdentity(): string;
|
|
16
|
+
/** Binds a canonical identity without mutating or cloning the executable descriptor. */
|
|
17
|
+
export declare function bindDescriptorIdentity<T extends object>(descriptor: T, id: string): T;
|
|
18
|
+
export declare function isDescriptorIdentityBound(descriptor: object): boolean;
|
|
19
|
+
export declare function resolveDescriptorIdentity(descriptor: object & DescriptorIdentitySource): ResolvedDescriptorIdentity;
|
|
20
|
+
export declare function getDescriptorIdentity(descriptor: object & DescriptorIdentitySource): string;
|
|
21
|
+
export declare function isUnboundIdentity(value: unknown): value is string;
|
|
22
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,aAAa,CAAC;AAEvD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,IAAI,EAAG,qCAAqC,CAAU;gBAEnD,OAAO,EAAE,MAAM;CAI5B;AAKD,mFAAmF;AACnF,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAiBrF;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,GAAG,wBAAwB,GAC5C,0BAA0B,CAa5B;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,wBAAwB,GAAG,MAAM,CAE3F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEjE"}
|
package/dist/identity.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { isStableId, normalizeId } from "@relkit/contracts";
|
|
2
|
+
export const UNBOUND_DESCRIPTOR_ID_PREFIX = "unbound.";
|
|
3
|
+
export class DescriptorIdentityError extends TypeError {
|
|
4
|
+
code = "RELKIT_DESCRIPTOR_IDENTITY_CONFLICT";
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "DescriptorIdentityError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const canonicalIdentities = new WeakMap();
|
|
11
|
+
const unboundIdentities = new WeakMap();
|
|
12
|
+
/** Creates a process-local diagnostic identity that is not a canonical address. */
|
|
13
|
+
export function createUnboundIdentity() {
|
|
14
|
+
return `${UNBOUND_DESCRIPTOR_ID_PREFIX}${crypto.randomUUID()}`;
|
|
15
|
+
}
|
|
16
|
+
/** Binds a canonical identity without mutating or cloning the executable descriptor. */
|
|
17
|
+
export function bindDescriptorIdentity(descriptor, id) {
|
|
18
|
+
assertObject(descriptor);
|
|
19
|
+
const canonical = normalizeId(id);
|
|
20
|
+
const existing = canonicalIdentities.get(descriptor);
|
|
21
|
+
if (existing !== undefined && existing !== canonical) {
|
|
22
|
+
throw new DescriptorIdentityError(`Descriptor identity is already bound to ${JSON.stringify(existing)}`);
|
|
23
|
+
}
|
|
24
|
+
const declared = readDeclaredId(descriptor);
|
|
25
|
+
if (declared !== undefined && !isUnboundIdentity(declared) && declared !== canonical) {
|
|
26
|
+
throw new DescriptorIdentityError(`Descriptor identity ${JSON.stringify(declared)} does not match ${JSON.stringify(canonical)}`);
|
|
27
|
+
}
|
|
28
|
+
canonicalIdentities.set(descriptor, canonical);
|
|
29
|
+
return descriptor;
|
|
30
|
+
}
|
|
31
|
+
export function isDescriptorIdentityBound(descriptor) {
|
|
32
|
+
return canonicalIdentities.has(descriptor);
|
|
33
|
+
}
|
|
34
|
+
export function resolveDescriptorIdentity(descriptor) {
|
|
35
|
+
assertObject(descriptor);
|
|
36
|
+
const bound = canonicalIdentities.get(descriptor);
|
|
37
|
+
if (bound !== undefined)
|
|
38
|
+
return Object.freeze({ id: bound, canonical: true, key: bound });
|
|
39
|
+
const declared = readDeclaredId(descriptor);
|
|
40
|
+
if (declared !== undefined && !isUnboundIdentity(declared)) {
|
|
41
|
+
return Object.freeze({ id: declared, canonical: true, key: declared });
|
|
42
|
+
}
|
|
43
|
+
const id = unboundIdentities.get(descriptor) ?? declared ?? createUnboundIdentity();
|
|
44
|
+
unboundIdentities.set(descriptor, id);
|
|
45
|
+
return Object.freeze({ id, canonical: false, key: descriptor });
|
|
46
|
+
}
|
|
47
|
+
export function getDescriptorIdentity(descriptor) {
|
|
48
|
+
return resolveDescriptorIdentity(descriptor).id;
|
|
49
|
+
}
|
|
50
|
+
export function isUnboundIdentity(value) {
|
|
51
|
+
return typeof value === "string" && value.startsWith(UNBOUND_DESCRIPTOR_ID_PREFIX);
|
|
52
|
+
}
|
|
53
|
+
function readDeclaredId(descriptor) {
|
|
54
|
+
const id = descriptor.id;
|
|
55
|
+
if (id === undefined)
|
|
56
|
+
return undefined;
|
|
57
|
+
if (typeof id !== "string" || !isStableId(id)) {
|
|
58
|
+
throw new DescriptorIdentityError("Descriptor identity must be a canonical stable ID");
|
|
59
|
+
}
|
|
60
|
+
return id;
|
|
61
|
+
}
|
|
62
|
+
function assertObject(value) {
|
|
63
|
+
if (value === null || (typeof value !== "object" && typeof value !== "function")) {
|
|
64
|
+
throw new TypeError("Descriptor identity requires an object");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export * from "./contracts.js";
|
|
2
|
+
export * from "./failure-types.js";
|
|
3
|
+
export * from "./failure-guards.js";
|
|
4
|
+
export * from "./failure-internals.js";
|
|
5
|
+
export * from "./failure-runtime.js";
|
|
6
|
+
export * from "./failure-dependency.js";
|
|
7
|
+
export * from "./error-retry.js";
|
|
8
|
+
export * from "./failure.js";
|
|
9
|
+
export * from "./abort.js";
|
|
10
|
+
export * from "./deadline.js";
|
|
11
|
+
export * from "./handler-bridge.js";
|
|
12
|
+
export * from "./lifecycle.js";
|
|
13
|
+
export * from "./dispatcher.js";
|
|
14
|
+
export * from "./dispatcher-context.js";
|
|
15
|
+
export * from "./context.js";
|
|
16
|
+
export * from "./validation.js";
|
|
17
|
+
export * from "./identity.js";
|
|
18
|
+
export * from "./recursion.js";
|
|
19
|
+
export * from "./service-policy.js";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export * from "./contracts.js";
|
|
2
|
+
export * from "./failure-types.js";
|
|
3
|
+
export * from "./failure-guards.js";
|
|
4
|
+
export * from "./failure-internals.js";
|
|
5
|
+
export * from "./failure-runtime.js";
|
|
6
|
+
export * from "./failure-dependency.js";
|
|
7
|
+
export * from "./error-retry.js";
|
|
8
|
+
export * from "./failure.js";
|
|
9
|
+
export * from "./abort.js";
|
|
10
|
+
export * from "./deadline.js";
|
|
11
|
+
export * from "./handler-bridge.js";
|
|
12
|
+
export * from "./lifecycle.js";
|
|
13
|
+
export * from "./dispatcher.js";
|
|
14
|
+
export * from "./dispatcher-context.js";
|
|
15
|
+
export * from "./context.js";
|
|
16
|
+
export * from "./validation.js";
|
|
17
|
+
export * from "./identity.js";
|
|
18
|
+
export * from "./recursion.js";
|
|
19
|
+
export * from "./service-policy.js";
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { StandardSchemaV1 } from "@relkit/schema";
|
|
3
|
+
import type { InvocationTarget } from "./contracts.js";
|
|
4
|
+
import type { InvocationValueHooks } from "./dispatcher-types.js";
|
|
5
|
+
import type { InvocationFailure } from "./failure-types.js";
|
|
6
|
+
interface LifecycleOptions<Context extends {
|
|
7
|
+
readonly signal: AbortSignal;
|
|
8
|
+
}> {
|
|
9
|
+
readonly target: InvocationTarget<unknown, unknown, Context>;
|
|
10
|
+
readonly input: unknown;
|
|
11
|
+
readonly context: Context;
|
|
12
|
+
readonly deadline?: number;
|
|
13
|
+
readonly onSignal?: (signal: AbortSignal) => void;
|
|
14
|
+
}
|
|
15
|
+
interface ValueHookOptions<Context extends {
|
|
16
|
+
readonly signal: AbortSignal;
|
|
17
|
+
}> {
|
|
18
|
+
readonly hook: InvocationValueHooks<Context>["onBefore"];
|
|
19
|
+
readonly value: unknown;
|
|
20
|
+
readonly schema: StandardSchemaV1;
|
|
21
|
+
readonly context: Context;
|
|
22
|
+
readonly deadline?: number;
|
|
23
|
+
readonly onSignal?: (signal: AbortSignal) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function invokeFunctionLifecycle<Context extends {
|
|
26
|
+
readonly signal: AbortSignal;
|
|
27
|
+
}>(options: LifecycleOptions<Context>): Effect.Effect<unknown, InvocationFailure>;
|
|
28
|
+
export declare function invokeValueHook<Context extends {
|
|
29
|
+
readonly signal: AbortSignal;
|
|
30
|
+
}>(options: ValueHookOptions<Context>): Effect.Effect<unknown, InvocationFailure>;
|
|
31
|
+
export declare function baseExecutionContext(value: unknown): {
|
|
32
|
+
readonly invocation: unknown;
|
|
33
|
+
readonly signal: AbortSignal;
|
|
34
|
+
readonly env: unknown;
|
|
35
|
+
readonly log: unknown;
|
|
36
|
+
readonly time: unknown;
|
|
37
|
+
};
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,UAAU,gBAAgB,CAAC,OAAO,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE;IACzE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CACnD;AAED,UAAU,gBAAgB,CAAC,OAAO,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE;IACzE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,EACtF,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,GACjC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CA8B3C;AAED,wBAAgB,eAAe,CAAC,OAAO,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,EAC9E,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,GACjC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAQ3C;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG;IACpD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CASA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { invokeUserHandler } from "./handler-bridge.js";
|
|
3
|
+
import { normalizeFailure } from "./failure.js";
|
|
4
|
+
import { validated } from "./validation.js";
|
|
5
|
+
export function invokeFunctionLifecycle(options) {
|
|
6
|
+
const before = invokeValue(options.target.onBefore, options.input, options.context, options.deadline, options.onSignal).pipe(Effect.flatMap((value) => validateOutput(options.target.input, value)));
|
|
7
|
+
return before.pipe(Effect.flatMap((input) => invokeValue(options.target.handler, input, options.context, options.deadline, options.onSignal)), Effect.flatMap((value) => validateOutput(options.target.output, value)), Effect.flatMap((output) => invokeValue(options.target.onAfter, output, options.context, options.deadline, options.onSignal)), Effect.flatMap((value) => validateOutput(options.target.output, value)));
|
|
8
|
+
}
|
|
9
|
+
export function invokeValueHook(options) {
|
|
10
|
+
return invokeValue(options.hook, options.value, options.context, options.deadline, options.onSignal).pipe(Effect.flatMap((value) => validateOutput(options.schema, value)));
|
|
11
|
+
}
|
|
12
|
+
export function baseExecutionContext(value) {
|
|
13
|
+
const context = value;
|
|
14
|
+
return Object.freeze({
|
|
15
|
+
invocation: context.invocation,
|
|
16
|
+
signal: context.signal,
|
|
17
|
+
env: context.env,
|
|
18
|
+
log: context.log,
|
|
19
|
+
time: context.time,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function invokeValue(handler, value, context, deadline, onSignal) {
|
|
23
|
+
if (handler === undefined)
|
|
24
|
+
return Effect.succeed(value);
|
|
25
|
+
return invokeUserHandler({
|
|
26
|
+
handler,
|
|
27
|
+
input: value,
|
|
28
|
+
publicContext: context,
|
|
29
|
+
...(deadline === undefined ? {} : { deadline }),
|
|
30
|
+
...(onSignal === undefined ? {} : { onSignal }),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function validateOutput(schema, value) {
|
|
34
|
+
return Effect.tryPromise({
|
|
35
|
+
try: () => validated(schema, value, "output"),
|
|
36
|
+
catch: (cause) => normalizeFailure(cause),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type DescriptorIdentitySource } from "./identity.js";
|
|
2
|
+
export interface InvocationCallFrame {
|
|
3
|
+
readonly functionId: string;
|
|
4
|
+
readonly invocationId?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class RecursionPolicyError extends Error {
|
|
7
|
+
readonly code: "RELKIT_RECURSION_DENIED";
|
|
8
|
+
readonly functionId: string;
|
|
9
|
+
readonly callStack: readonly string[];
|
|
10
|
+
readonly cycle: readonly string[];
|
|
11
|
+
constructor(functionId: string, callStack: readonly string[], cycle: readonly string[]);
|
|
12
|
+
}
|
|
13
|
+
/** Immutable invocation frames keep concurrent child paths independent. */
|
|
14
|
+
export declare class InvocationCallStack {
|
|
15
|
+
readonly frames: readonly InvocationCallFrame[];
|
|
16
|
+
private readonly keys;
|
|
17
|
+
private readonly descriptors;
|
|
18
|
+
constructor(frames?: readonly InvocationCallFrame[], keys?: readonly (object | string)[], descriptors?: readonly (object | undefined)[]);
|
|
19
|
+
get functionIds(): readonly string[];
|
|
20
|
+
has(functionId: string): boolean;
|
|
21
|
+
enter(frame: InvocationCallFrame): InvocationCallStack;
|
|
22
|
+
enter(functionId: string, invocationId?: string): InvocationCallStack;
|
|
23
|
+
enter(target: object & DescriptorIdentitySource, invocationId?: string): InvocationCallStack;
|
|
24
|
+
enterDescriptor(descriptor: object & DescriptorIdentitySource, invocationId?: string): InvocationCallStack;
|
|
25
|
+
enterTarget(descriptor: object & DescriptorIdentitySource, invocationId?: string): InvocationCallStack;
|
|
26
|
+
private enterFrame;
|
|
27
|
+
}
|
|
28
|
+
export declare function createInvocationCallStack(frames?: readonly InvocationCallFrame[]): InvocationCallStack;
|
|
29
|
+
export { InvocationCallStack as InvocationChain };
|
|
30
|
+
export declare const createInvocationChain: typeof createInvocationCallStack;
|
|
31
|
+
//# sourceMappingURL=recursion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursion.d.ts","sourceRoot":"","sources":["../src/recursion.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAG,yBAAyB,CAAU;IACnD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEtB,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE;CAOvF;AAED,2EAA2E;AAC3E,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;gBAG5D,MAAM,GAAE,SAAS,mBAAmB,EAAO,EAC3C,IAAI,GAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAA4C,EAC5E,WAAW,GAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAgC;IAU5E,IAAI,WAAW,IAAI,SAAS,MAAM,EAAE,CAEnC;IAED,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIhC,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB;IACtD,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,mBAAmB;IACrE,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAe5F,eAAe,CACb,UAAU,EAAE,MAAM,GAAG,wBAAwB,EAC7C,YAAY,CAAC,EAAE,MAAM,GACpB,mBAAmB;IAStB,WAAW,CACT,UAAU,EAAE,MAAM,GAAG,wBAAwB,EAC7C,YAAY,CAAC,EAAE,MAAM,GACpB,mBAAmB;IAItB,OAAO,CAAC,UAAU;CAsBnB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,GAAE,SAAS,mBAAmB,EAAO,GAC1C,mBAAmB,CAErB;AAED,OAAO,EAAE,mBAAmB,IAAI,eAAe,EAAE,CAAC;AAClD,eAAO,MAAM,qBAAqB,kCAA4B,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { resolveDescriptorIdentity } from "./identity.js";
|
|
2
|
+
export class RecursionPolicyError extends Error {
|
|
3
|
+
code = "RELKIT_RECURSION_DENIED";
|
|
4
|
+
functionId;
|
|
5
|
+
callStack;
|
|
6
|
+
cycle;
|
|
7
|
+
constructor(functionId, callStack, cycle) {
|
|
8
|
+
super("Invocation denied by recursion policy");
|
|
9
|
+
this.name = "RecursionPolicyError";
|
|
10
|
+
this.functionId = functionId;
|
|
11
|
+
this.callStack = Object.freeze([...callStack]);
|
|
12
|
+
this.cycle = Object.freeze([...cycle]);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Immutable invocation frames keep concurrent child paths independent. */
|
|
16
|
+
export class InvocationCallStack {
|
|
17
|
+
frames;
|
|
18
|
+
keys;
|
|
19
|
+
descriptors;
|
|
20
|
+
constructor(frames = [], keys = frames.map((frame) => frame.functionId), descriptors = frames.map(() => undefined)) {
|
|
21
|
+
if (keys.length !== frames.length || descriptors.length !== frames.length) {
|
|
22
|
+
throw new TypeError("Invocation call stack internals must match its frames");
|
|
23
|
+
}
|
|
24
|
+
this.frames = Object.freeze(frames.map((frame) => freezeFrame(frame)));
|
|
25
|
+
this.keys = Object.freeze([...keys]);
|
|
26
|
+
this.descriptors = Object.freeze([...descriptors]);
|
|
27
|
+
}
|
|
28
|
+
get functionIds() {
|
|
29
|
+
return Object.freeze(this.frames.map((frame) => frame.functionId));
|
|
30
|
+
}
|
|
31
|
+
has(functionId) {
|
|
32
|
+
return this.frames.some((frame) => frame.functionId === functionId);
|
|
33
|
+
}
|
|
34
|
+
enter(frameOrTarget, invocationId) {
|
|
35
|
+
if (typeof frameOrTarget === "string") {
|
|
36
|
+
return this.enterFrame({ functionId: frameOrTarget, ...(invocationId === undefined ? {} : { invocationId }) }, frameOrTarget);
|
|
37
|
+
}
|
|
38
|
+
if (isFrame(frameOrTarget))
|
|
39
|
+
return this.enterFrame(frameOrTarget, frameOrTarget.functionId);
|
|
40
|
+
return this.enterDescriptor(frameOrTarget, invocationId);
|
|
41
|
+
}
|
|
42
|
+
enterDescriptor(descriptor, invocationId) {
|
|
43
|
+
const identity = resolveDescriptorIdentity(descriptor);
|
|
44
|
+
return this.enterFrame({ functionId: identity.id, ...(invocationId === undefined ? {} : { invocationId }) }, identity.key, descriptor);
|
|
45
|
+
}
|
|
46
|
+
enterTarget(descriptor, invocationId) {
|
|
47
|
+
return this.enterDescriptor(descriptor, invocationId);
|
|
48
|
+
}
|
|
49
|
+
enterFrame(frame, key, descriptor) {
|
|
50
|
+
validateFunctionId(frame.functionId);
|
|
51
|
+
const repeatedAt = this.keys.findIndex((entry, index) => entry === key || (descriptor !== undefined && this.descriptors[index] === descriptor));
|
|
52
|
+
if (repeatedAt >= 0) {
|
|
53
|
+
throw new RecursionPolicyError(frame.functionId, this.functionIds, [
|
|
54
|
+
...this.functionIds.slice(repeatedAt),
|
|
55
|
+
frame.functionId,
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
return new InvocationCallStack([...this.frames, frame], [...this.keys, key], [...this.descriptors, descriptor]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function createInvocationCallStack(frames = []) {
|
|
62
|
+
return new InvocationCallStack(frames);
|
|
63
|
+
}
|
|
64
|
+
export { InvocationCallStack as InvocationChain };
|
|
65
|
+
export const createInvocationChain = createInvocationCallStack;
|
|
66
|
+
function freezeFrame(frame) {
|
|
67
|
+
validateFunctionId(frame.functionId);
|
|
68
|
+
return Object.freeze({
|
|
69
|
+
functionId: frame.functionId,
|
|
70
|
+
...(frame.invocationId === undefined ? {} : { invocationId: frame.invocationId }),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function validateFunctionId(functionId) {
|
|
74
|
+
if (typeof functionId !== "string" || functionId.trim().length === 0) {
|
|
75
|
+
throw new TypeError("functionId must be a non-empty string");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function isFrame(value) {
|
|
79
|
+
return "functionId" in value;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=recursion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursion.js","sourceRoot":"","sources":["../src/recursion.ts"],"names":[],"mappings":"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"}
|