@nifrajs/core 1.9.1 → 1.10.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/dist/assurance.d.ts +5 -0
- package/dist/assurance.d.ts.map +1 -1
- package/dist/assurance.js +8 -1
- package/dist/assurance.js.map +1 -1
- package/dist/budget.d.ts +91 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +172 -0
- package/dist/budget.js.map +1 -0
- package/dist/capabilities.d.ts +117 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +257 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/classification.d.ts +19 -0
- package/dist/classification.d.ts.map +1 -0
- package/dist/classification.js +33 -0
- package/dist/classification.js.map +1 -0
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/idempotency.d.ts +90 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +135 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/capability-runtime.d.ts +16 -0
- package/dist/internal/capability-runtime.d.ts.map +1 -0
- package/dist/internal/capability-runtime.js +27 -0
- package/dist/internal/capability-runtime.js.map +1 -0
- package/dist/internal/route-assurance.d.ts +1 -0
- package/dist/internal/route-assurance.d.ts.map +1 -1
- package/dist/internal/route-assurance.js +1 -0
- package/dist/internal/route-assurance.js.map +1 -1
- package/dist/reflection.d.ts +4 -0
- package/dist/reflection.d.ts.map +1 -1
- package/dist/reflection.js +9 -0
- package/dist/reflection.js.map +1 -1
- package/dist/server/context.d.ts +34 -1
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/contract.d.ts +8 -1
- package/dist/server/contract.d.ts.map +1 -1
- package/dist/server/contract.js +11 -1
- package/dist/server/contract.js.map +1 -1
- package/dist/server/server.d.ts +33 -0
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +139 -15
- package/dist/server/server.js.map +1 -1
- package/package.json +11 -4
- package/src/assurance.ts +15 -1
- package/src/budget.ts +267 -0
- package/src/capabilities.ts +430 -0
- package/src/classification.ts +44 -0
- package/src/errors.ts +1 -0
- package/src/idempotency.ts +205 -0
- package/src/index.ts +4 -1
- package/src/internal/capability-runtime.ts +49 -0
- package/src/internal/route-assurance.ts +1 -0
- package/src/reflection.ts +14 -0
- package/src/server/context.ts +35 -1
- package/src/server/contract.ts +19 -2
- package/src/server/server.ts +233 -20
package/dist/assurance.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Route assurance: reflection-time proof that every route is classified and carries the enforcement
|
|
3
3
|
* evidence its policy requires. Evaluation is pure and never runs on the request hot path.
|
|
4
4
|
*/
|
|
5
|
+
import { type CapabilityAssuranceReport, type CapabilityPolicy } from "./capabilities.js";
|
|
5
6
|
import type { AssuranceDeclaration, AssuranceEvidence, AssuranceScope } from "./internal/route-assurance.js";
|
|
6
7
|
import { withRouteAssurance } from "./internal/route-assurance.js";
|
|
7
8
|
import { type ReflectedRoute } from "./reflection.js";
|
|
@@ -13,6 +14,7 @@ export declare const NIFRA_ASSURANCE: Readonly<{
|
|
|
13
14
|
readonly AUTHENTICATED: "nifra.authenticated";
|
|
14
15
|
readonly BODY_BOUNDED: "nifra.body-bounded";
|
|
15
16
|
readonly CSRF: "nifra.csrf";
|
|
17
|
+
readonly DURABLE_COMMAND: "nifra.durable-command";
|
|
16
18
|
readonly IDEMPOTENCY_KEY: "nifra.idempotency-key";
|
|
17
19
|
readonly IP_RESTRICTED: "nifra.ip-restricted";
|
|
18
20
|
readonly RATE_LIMITED: "nifra.rate-limited";
|
|
@@ -64,10 +66,13 @@ export interface AssuranceReport {
|
|
|
64
66
|
readonly ok: boolean;
|
|
65
67
|
readonly routes: readonly AssuredRoute[];
|
|
66
68
|
readonly findings: readonly AssuranceFinding[];
|
|
69
|
+
/** Present when the config enables capability/effect assurance. */
|
|
70
|
+
readonly capabilities?: CapabilityAssuranceReport;
|
|
67
71
|
}
|
|
68
72
|
export interface AssuranceConfig {
|
|
69
73
|
readonly source: unknown;
|
|
70
74
|
readonly policy: AssurancePolicy;
|
|
75
|
+
readonly capabilities?: CapabilityPolicy;
|
|
71
76
|
}
|
|
72
77
|
/** Validate and freeze an ordered assurance policy. */
|
|
73
78
|
export declare function defineAssurancePolicy(policy: AssurancePolicy): AssurancePolicy;
|
package/dist/assurance.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assurance.d.ts","sourceRoot":"","sources":["../src/assurance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACf,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAKL,kBAAkB,EACnB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,iBAAiB,CAAA;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAE7B,6EAA6E;AAC7E,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"assurance.d.ts","sourceRoot":"","sources":["../src/assurance.ts"],"names":[],"mappings":"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"}
|
package/dist/assurance.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Route assurance: reflection-time proof that every route is classified and carries the enforcement
|
|
3
3
|
* evidence its policy requires. Evaluation is pure and never runs on the request hot path.
|
|
4
4
|
*/
|
|
5
|
+
import { defineCapabilityPolicy, } from "./capabilities.js";
|
|
5
6
|
import { NIFRA_ASSURANCE_IDS, routeGlob, validEvidenceId, validMethod, withRouteAssurance, } from "./internal/route-assurance.js";
|
|
6
7
|
import { reflectRoutes } from "./reflection.js";
|
|
7
8
|
export { withRouteAssurance };
|
|
@@ -79,7 +80,13 @@ export function defineAssurancePolicy(policy) {
|
|
|
79
80
|
}
|
|
80
81
|
/** Identity helper for a `nifra.assurance.ts` default export. */
|
|
81
82
|
export function defineAssuranceConfig(config) {
|
|
82
|
-
return Object.freeze({
|
|
83
|
+
return Object.freeze({
|
|
84
|
+
source: config.source,
|
|
85
|
+
policy: defineAssurancePolicy(config.policy),
|
|
86
|
+
...(config.capabilities !== undefined
|
|
87
|
+
? { capabilities: defineCapabilityPolicy(config.capabilities) }
|
|
88
|
+
: {}),
|
|
89
|
+
});
|
|
83
90
|
}
|
|
84
91
|
/** Shared selector semantics for policy rules and framework adapters. */
|
|
85
92
|
export function matchesAssuranceSelector(route, selector) {
|
package/dist/assurance.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assurance.js","sourceRoot":"","sources":["../src/assurance.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"assurance.js","sourceRoot":"","sources":["../src/assurance.ts"],"names":[],"mappings":"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"}
|
package/dist/budget.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portable request-deadline mechanics owned by core.
|
|
3
|
+
*
|
|
4
|
+
* A wire deadline is an absolute wall-clock instant so every hop shares one end time. Once admitted,
|
|
5
|
+
* remaining time is measured against a monotonic clock so NTP or manual wall-clock changes cannot
|
|
6
|
+
* add time back to an in-flight request. Policy stays out of this primitive.
|
|
7
|
+
*/
|
|
8
|
+
/** Canonical wire header carrying an absolute Unix epoch deadline in milliseconds. */
|
|
9
|
+
export declare const NIFRA_DEADLINE_HEADER = "x-nifra-deadline";
|
|
10
|
+
/** The only clocks deadline mechanics need. Inject both for deterministic tests. */
|
|
11
|
+
export interface BudgetClock {
|
|
12
|
+
/** Monotonic milliseconds; must never move backwards during the process lifetime. */
|
|
13
|
+
monotonic(): number;
|
|
14
|
+
/** Unix epoch milliseconds; used only to translate an absolute wire deadline on admission. */
|
|
15
|
+
wall(): number;
|
|
16
|
+
}
|
|
17
|
+
/** A time budget shared by one request and every downstream hop it initiates. */
|
|
18
|
+
export interface RequestBudget {
|
|
19
|
+
/** Absolute Unix epoch deadline for wire propagation. */
|
|
20
|
+
readonly deadline: number;
|
|
21
|
+
/** The request cancellation signal. Nifra drives this when its effective deadline elapses. */
|
|
22
|
+
readonly signal: AbortSignal;
|
|
23
|
+
/** Non-negative milliseconds remaining, measured with the monotonic clock. */
|
|
24
|
+
remaining(): number;
|
|
25
|
+
/** A view that finishes `reserveMs` before this budget, preserving time for response cleanup. */
|
|
26
|
+
child(reserveMs: number): RequestBudget;
|
|
27
|
+
}
|
|
28
|
+
export type DeadlineHeaderResult = {
|
|
29
|
+
readonly ok: true;
|
|
30
|
+
readonly deadline: number;
|
|
31
|
+
} | {
|
|
32
|
+
readonly ok: false;
|
|
33
|
+
readonly reason: "missing" | "malformed";
|
|
34
|
+
};
|
|
35
|
+
/** DOM-lib-independent subset accepted by the Web `Headers` constructor. */
|
|
36
|
+
export type DeadlineHeadersInit = Headers | Readonly<Record<string, string>> | [string, string][] | undefined;
|
|
37
|
+
export interface CreateRequestBudgetOptions {
|
|
38
|
+
/** Absolute Unix epoch deadline. */
|
|
39
|
+
readonly deadline: number;
|
|
40
|
+
readonly signal: AbortSignal;
|
|
41
|
+
readonly clock?: BudgetClock;
|
|
42
|
+
}
|
|
43
|
+
export interface DeadlineAdmissionOptions {
|
|
44
|
+
/** Local request timeout. `0` keeps requests without a wire deadline unbounded. */
|
|
45
|
+
readonly localTimeoutMs?: number;
|
|
46
|
+
/** Hard cap for a request carrying the wire header. Default 30 seconds. */
|
|
47
|
+
readonly maxInboundDeadlineMs?: number;
|
|
48
|
+
/** Injected wall clock for deterministic admission tests. */
|
|
49
|
+
readonly wallNow?: () => number;
|
|
50
|
+
}
|
|
51
|
+
export type DeadlineAdmission = {
|
|
52
|
+
readonly ok: true;
|
|
53
|
+
readonly inherited: boolean;
|
|
54
|
+
readonly timeoutMs: number;
|
|
55
|
+
/** Absent only for the unbounded no-header/no-local-timeout case. */
|
|
56
|
+
readonly deadline?: number;
|
|
57
|
+
} | {
|
|
58
|
+
readonly ok: false;
|
|
59
|
+
readonly status: 400 | 408;
|
|
60
|
+
readonly reason: "malformed_deadline" | "deadline_exceeded";
|
|
61
|
+
};
|
|
62
|
+
/** Sentinel used only for an unbounded local budget. It is never written to the wire. */
|
|
63
|
+
export declare const UNBOUNDED_DEADLINE: number;
|
|
64
|
+
export declare class DeadlineExceededError extends Error {
|
|
65
|
+
readonly remainingMs: number;
|
|
66
|
+
readonly requiredMs: number;
|
|
67
|
+
readonly code: "NIFRA_DEADLINE_EXCEEDED";
|
|
68
|
+
readonly status: 504;
|
|
69
|
+
constructor(remainingMs: number, requiredMs: number);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create a budget from an admitted absolute deadline. Wall time is sampled once; every subsequent
|
|
73
|
+
* `remaining()` call is monotonic. This function does not arm a timer—the owner of `signal` does.
|
|
74
|
+
*/
|
|
75
|
+
export declare function createRequestBudget(options: CreateRequestBudgetOptions): RequestBudget;
|
|
76
|
+
/** Create a local no-deadline view. Outbound header propagation deliberately omits it. */
|
|
77
|
+
export declare function createUnboundedRequestBudget(signal: AbortSignal): RequestBudget;
|
|
78
|
+
/** Parse the canonical deadline header without trusting or clamping it. */
|
|
79
|
+
export declare function parseDeadlineHeader(headers: Headers): DeadlineHeaderResult;
|
|
80
|
+
/**
|
|
81
|
+
* Validate and clamp an inbound absolute deadline. This is pure admission mechanics: callers supply
|
|
82
|
+
* local policy, then own the timer that drives their existing cancellation signal.
|
|
83
|
+
*/
|
|
84
|
+
export declare function admitDeadline(headers: Headers, options?: DeadlineAdmissionOptions): DeadlineAdmission;
|
|
85
|
+
/** Add this budget's absolute deadline to an outbound request. */
|
|
86
|
+
export declare function withDeadlineHeader(input: DeadlineHeadersInit, budget: RequestBudget, reserveMs?: number): Headers;
|
|
87
|
+
/** Fail before starting work that cannot fit inside the remaining time. */
|
|
88
|
+
export declare function assertBudgetRemaining(budget: RequestBudget, requiredMs?: number): void;
|
|
89
|
+
/** True only when a new attempt plus a caller-owned reserve can still fit. */
|
|
90
|
+
export declare function canAttempt(budget: RequestBudget, estimatedAttemptMs: number, reserveMs?: number): boolean;
|
|
91
|
+
//# sourceMappingURL=budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
|
package/dist/budget.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portable request-deadline mechanics owned by core.
|
|
3
|
+
*
|
|
4
|
+
* A wire deadline is an absolute wall-clock instant so every hop shares one end time. Once admitted,
|
|
5
|
+
* remaining time is measured against a monotonic clock so NTP or manual wall-clock changes cannot
|
|
6
|
+
* add time back to an in-flight request. Policy stays out of this primitive.
|
|
7
|
+
*/
|
|
8
|
+
/** Canonical wire header carrying an absolute Unix epoch deadline in milliseconds. */
|
|
9
|
+
export const NIFRA_DEADLINE_HEADER = "x-nifra-deadline";
|
|
10
|
+
const MISSING_DEADLINE = Object.freeze({ ok: false, reason: "missing" });
|
|
11
|
+
const MALFORMED_DEADLINE = Object.freeze({ ok: false, reason: "malformed" });
|
|
12
|
+
const UNBOUNDED_ADMISSION = Object.freeze({
|
|
13
|
+
ok: true,
|
|
14
|
+
inherited: false,
|
|
15
|
+
timeoutMs: 0,
|
|
16
|
+
});
|
|
17
|
+
/** Sentinel used only for an unbounded local budget. It is never written to the wire. */
|
|
18
|
+
export const UNBOUNDED_DEADLINE = Number.MAX_SAFE_INTEGER;
|
|
19
|
+
export class DeadlineExceededError extends Error {
|
|
20
|
+
remainingMs;
|
|
21
|
+
requiredMs;
|
|
22
|
+
code = "NIFRA_DEADLINE_EXCEEDED";
|
|
23
|
+
status = 504;
|
|
24
|
+
constructor(remainingMs, requiredMs) {
|
|
25
|
+
super(`request deadline exceeded: ${remainingMs}ms remaining, ${requiredMs}ms required`);
|
|
26
|
+
this.remainingMs = remainingMs;
|
|
27
|
+
this.requiredMs = requiredMs;
|
|
28
|
+
this.name = "DeadlineExceededError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const systemClock = {
|
|
32
|
+
monotonic: () => globalThis.performance?.now?.() ?? Date.now(),
|
|
33
|
+
wall: () => Date.now(),
|
|
34
|
+
};
|
|
35
|
+
const assertFiniteNonNegative = (name, value) => {
|
|
36
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
37
|
+
throw new RangeError(`@nifrajs/core/budget: ${name} must be a finite non-negative number`);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const assertDeadline = (deadline) => {
|
|
41
|
+
if (!Number.isSafeInteger(deadline) || deadline <= 0) {
|
|
42
|
+
throw new RangeError("@nifrajs/core/budget: deadline must be a positive safe-integer epoch-ms value");
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
class MonotonicRequestBudget {
|
|
46
|
+
deadline;
|
|
47
|
+
signal;
|
|
48
|
+
monotonicDeadline;
|
|
49
|
+
clock;
|
|
50
|
+
constructor(deadline, signal, monotonicDeadline, clock) {
|
|
51
|
+
this.deadline = deadline;
|
|
52
|
+
this.signal = signal;
|
|
53
|
+
this.monotonicDeadline = monotonicDeadline;
|
|
54
|
+
this.clock = clock;
|
|
55
|
+
}
|
|
56
|
+
remaining() {
|
|
57
|
+
if (this.signal.aborted)
|
|
58
|
+
return 0;
|
|
59
|
+
return Math.max(0, this.monotonicDeadline - this.clock.monotonic());
|
|
60
|
+
}
|
|
61
|
+
child(reserveMs) {
|
|
62
|
+
assertFiniteNonNegative("reserveMs", reserveMs);
|
|
63
|
+
return new MonotonicRequestBudget(Math.max(1, Math.floor(this.deadline - reserveMs)), this.signal, this.monotonicDeadline - reserveMs, this.clock);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
class UnboundedRequestBudget {
|
|
67
|
+
signal;
|
|
68
|
+
deadline = UNBOUNDED_DEADLINE;
|
|
69
|
+
constructor(signal) {
|
|
70
|
+
this.signal = signal;
|
|
71
|
+
}
|
|
72
|
+
remaining() {
|
|
73
|
+
return this.signal.aborted ? 0 : Number.POSITIVE_INFINITY;
|
|
74
|
+
}
|
|
75
|
+
child(reserveMs) {
|
|
76
|
+
assertFiniteNonNegative("reserveMs", reserveMs);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Create a budget from an admitted absolute deadline. Wall time is sampled once; every subsequent
|
|
82
|
+
* `remaining()` call is monotonic. This function does not arm a timer—the owner of `signal` does.
|
|
83
|
+
*/
|
|
84
|
+
export function createRequestBudget(options) {
|
|
85
|
+
assertDeadline(options.deadline);
|
|
86
|
+
const clock = options.clock ?? systemClock;
|
|
87
|
+
const wallAtStart = clock.wall();
|
|
88
|
+
const monotonicAtStart = clock.monotonic();
|
|
89
|
+
const admittedRemaining = Math.max(0, options.deadline - wallAtStart);
|
|
90
|
+
return new MonotonicRequestBudget(options.deadline, options.signal, monotonicAtStart + admittedRemaining, clock);
|
|
91
|
+
}
|
|
92
|
+
/** Create a local no-deadline view. Outbound header propagation deliberately omits it. */
|
|
93
|
+
export function createUnboundedRequestBudget(signal) {
|
|
94
|
+
return new UnboundedRequestBudget(signal);
|
|
95
|
+
}
|
|
96
|
+
/** Parse the canonical deadline header without trusting or clamping it. */
|
|
97
|
+
export function parseDeadlineHeader(headers) {
|
|
98
|
+
const raw = headers.get(NIFRA_DEADLINE_HEADER);
|
|
99
|
+
if (raw === null)
|
|
100
|
+
return MISSING_DEADLINE;
|
|
101
|
+
// A comma means multiple values were folded together. Ambiguous deadlines fail closed.
|
|
102
|
+
if (!/^[1-9]\d*$/.test(raw))
|
|
103
|
+
return MALFORMED_DEADLINE;
|
|
104
|
+
const deadline = Number(raw);
|
|
105
|
+
if (!Number.isSafeInteger(deadline))
|
|
106
|
+
return MALFORMED_DEADLINE;
|
|
107
|
+
return { ok: true, deadline };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Validate and clamp an inbound absolute deadline. This is pure admission mechanics: callers supply
|
|
111
|
+
* local policy, then own the timer that drives their existing cancellation signal.
|
|
112
|
+
*/
|
|
113
|
+
export function admitDeadline(headers, options = {}) {
|
|
114
|
+
const localTimeoutMs = options.localTimeoutMs ?? 0;
|
|
115
|
+
const maxInboundDeadlineMs = options.maxInboundDeadlineMs ?? 30_000;
|
|
116
|
+
assertFiniteNonNegative("localTimeoutMs", localTimeoutMs);
|
|
117
|
+
if (!Number.isFinite(maxInboundDeadlineMs) || maxInboundDeadlineMs <= 0) {
|
|
118
|
+
throw new RangeError("@nifrajs/core/budget: maxInboundDeadlineMs must be a finite positive number");
|
|
119
|
+
}
|
|
120
|
+
const parsed = parseDeadlineHeader(headers);
|
|
121
|
+
if (!parsed.ok) {
|
|
122
|
+
if (parsed.reason === "malformed") {
|
|
123
|
+
return { ok: false, status: 400, reason: "malformed_deadline" };
|
|
124
|
+
}
|
|
125
|
+
if (localTimeoutMs <= 0)
|
|
126
|
+
return UNBOUNDED_ADMISSION;
|
|
127
|
+
const now = options.wallNow?.() ?? Date.now();
|
|
128
|
+
return {
|
|
129
|
+
ok: true,
|
|
130
|
+
inherited: false,
|
|
131
|
+
timeoutMs: localTimeoutMs,
|
|
132
|
+
deadline: Math.floor(now + localTimeoutMs),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const now = options.wallNow?.() ?? Date.now();
|
|
136
|
+
const clientRemaining = parsed.deadline - now;
|
|
137
|
+
if (clientRemaining <= 0) {
|
|
138
|
+
return { ok: false, status: 408, reason: "deadline_exceeded" };
|
|
139
|
+
}
|
|
140
|
+
const localCap = localTimeoutMs > 0 ? Math.min(localTimeoutMs, maxInboundDeadlineMs) : maxInboundDeadlineMs;
|
|
141
|
+
const timeoutMs = Math.max(1, Math.min(clientRemaining, localCap));
|
|
142
|
+
return {
|
|
143
|
+
ok: true,
|
|
144
|
+
inherited: true,
|
|
145
|
+
timeoutMs,
|
|
146
|
+
deadline: Math.floor(Math.min(parsed.deadline, now + localCap)),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** Add this budget's absolute deadline to an outbound request. */
|
|
150
|
+
export function withDeadlineHeader(input, budget, reserveMs = 0) {
|
|
151
|
+
assertFiniteNonNegative("reserveMs", reserveMs);
|
|
152
|
+
const headers = new Headers(input);
|
|
153
|
+
if (!Number.isFinite(budget.remaining()))
|
|
154
|
+
return headers;
|
|
155
|
+
const deadline = Math.max(1, Math.floor(budget.deadline - reserveMs));
|
|
156
|
+
headers.set(NIFRA_DEADLINE_HEADER, String(deadline));
|
|
157
|
+
return headers;
|
|
158
|
+
}
|
|
159
|
+
/** Fail before starting work that cannot fit inside the remaining time. */
|
|
160
|
+
export function assertBudgetRemaining(budget, requiredMs = 0) {
|
|
161
|
+
assertFiniteNonNegative("requiredMs", requiredMs);
|
|
162
|
+
const remaining = budget.remaining();
|
|
163
|
+
if (remaining <= requiredMs)
|
|
164
|
+
throw new DeadlineExceededError(remaining, requiredMs);
|
|
165
|
+
}
|
|
166
|
+
/** True only when a new attempt plus a caller-owned reserve can still fit. */
|
|
167
|
+
export function canAttempt(budget, estimatedAttemptMs, reserveMs = 0) {
|
|
168
|
+
assertFiniteNonNegative("estimatedAttemptMs", estimatedAttemptMs);
|
|
169
|
+
assertFiniteNonNegative("reserveMs", reserveMs);
|
|
170
|
+
return budget.remaining() > estimatedAttemptMs + reserveMs;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route effect/capability assurance. Declarations are reflected at build/CI time; runtime beacons
|
|
3
|
+
* are a fail-closed defence at owned effect seams. Static provenance remains the security anchor.
|
|
4
|
+
*/
|
|
5
|
+
import type { DataClassification } from "./classification.js";
|
|
6
|
+
import { type CapabilityUseEvent, validCapabilityId } from "./internal/capability-runtime.js";
|
|
7
|
+
export type { CapabilityUseEvent };
|
|
8
|
+
export type CapabilityZone = "domain" | "operational";
|
|
9
|
+
export type CapabilityAccess = "read" | "write";
|
|
10
|
+
export type CapabilityIdempotency = "none" | "request" | "durable";
|
|
11
|
+
export interface CapabilityDefinition {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
/** Domain state is subject to HTTP method semantics; operational writes (logs/metrics) are not. */
|
|
14
|
+
readonly zone: CapabilityZone;
|
|
15
|
+
readonly access: CapabilityAccess;
|
|
16
|
+
/** Evidence required when this capability may execute. Default `none`. */
|
|
17
|
+
readonly idempotency?: CapabilityIdempotency;
|
|
18
|
+
}
|
|
19
|
+
export interface CapabilityImportRule {
|
|
20
|
+
/** Exact module specifier, or a trailing `/*` prefix rule. */
|
|
21
|
+
readonly specifier: string;
|
|
22
|
+
readonly capabilities: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export interface ForbiddenCapabilityImport {
|
|
25
|
+
/** Exact module specifier, or a trailing `/*` prefix rule. */
|
|
26
|
+
readonly specifier: string;
|
|
27
|
+
readonly reason: string;
|
|
28
|
+
}
|
|
29
|
+
export interface CapabilityRouteSelector {
|
|
30
|
+
readonly methods?: readonly string[];
|
|
31
|
+
readonly paths?: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
export interface CapabilityRouteModule {
|
|
34
|
+
readonly match: CapabilityRouteSelector;
|
|
35
|
+
/** Project-relative modules that implement the selected routes. */
|
|
36
|
+
readonly modules: readonly string[];
|
|
37
|
+
}
|
|
38
|
+
export interface CapabilityProvenancePolicy {
|
|
39
|
+
readonly imports: readonly CapabilityImportRule[];
|
|
40
|
+
readonly forbiddenImports: readonly ForbiddenCapabilityImport[];
|
|
41
|
+
/** Explicit associations for contract/generated routes that source scanning cannot locate. */
|
|
42
|
+
readonly routeModules?: readonly CapabilityRouteModule[];
|
|
43
|
+
}
|
|
44
|
+
export interface CapabilityPolicy {
|
|
45
|
+
readonly definitions: readonly CapabilityDefinition[];
|
|
46
|
+
/** Required: capability assurance without a static provenance firewall is incomplete. */
|
|
47
|
+
readonly provenance: CapabilityProvenancePolicy;
|
|
48
|
+
/** Default `capabilities.lock.json`. */
|
|
49
|
+
readonly lockfile?: string;
|
|
50
|
+
}
|
|
51
|
+
export type CapabilityEvidenceKind = "static" | "runtime";
|
|
52
|
+
/** Token-only effect evidence. `source` is an adapter/module id, never request or business data. */
|
|
53
|
+
export interface CapabilityEvidence {
|
|
54
|
+
readonly id: string;
|
|
55
|
+
readonly kind: CapabilityEvidenceKind;
|
|
56
|
+
readonly source: string;
|
|
57
|
+
}
|
|
58
|
+
export interface RouteCapabilityEvidence {
|
|
59
|
+
readonly method: string;
|
|
60
|
+
readonly path: string;
|
|
61
|
+
/** True only when the route's reachable module graph was actually scanned. */
|
|
62
|
+
readonly covered: boolean;
|
|
63
|
+
readonly evidence: readonly CapabilityEvidence[];
|
|
64
|
+
}
|
|
65
|
+
export interface CapabilityEvidenceSet {
|
|
66
|
+
readonly routes: readonly RouteCapabilityEvidence[];
|
|
67
|
+
}
|
|
68
|
+
export type CapabilityFindingCode = "unknown-capability" | "provenance-uncovered" | "undeclared-capability-evidence" | "safe-method-domain-write" | "missing-request-idempotency" | "missing-durable-idempotency" | "forbidden-effect-import";
|
|
69
|
+
export interface CapabilityFinding {
|
|
70
|
+
readonly code: CapabilityFindingCode;
|
|
71
|
+
readonly method: string;
|
|
72
|
+
readonly path: string;
|
|
73
|
+
readonly capability?: string;
|
|
74
|
+
readonly message: string;
|
|
75
|
+
}
|
|
76
|
+
export interface AssuredCapabilityRoute {
|
|
77
|
+
readonly method: string;
|
|
78
|
+
readonly path: string;
|
|
79
|
+
readonly declared: readonly string[];
|
|
80
|
+
readonly evidence: readonly CapabilityEvidence[];
|
|
81
|
+
/** Declared capabilities without static/runtime evidence. Informational, never treated as proof. */
|
|
82
|
+
readonly unproven: readonly string[];
|
|
83
|
+
readonly covered: boolean;
|
|
84
|
+
/** Highest data-sensitivity the response carries, when the route declares it. */
|
|
85
|
+
readonly classification?: DataClassification;
|
|
86
|
+
}
|
|
87
|
+
export interface CapabilityAssuranceReport {
|
|
88
|
+
readonly ok: boolean;
|
|
89
|
+
readonly routes: readonly AssuredCapabilityRoute[];
|
|
90
|
+
readonly findings: readonly CapabilityFinding[];
|
|
91
|
+
}
|
|
92
|
+
export interface CapabilitySnapshotRoute {
|
|
93
|
+
readonly method: string;
|
|
94
|
+
readonly path: string;
|
|
95
|
+
readonly declared: readonly string[];
|
|
96
|
+
readonly evidenced: readonly string[];
|
|
97
|
+
readonly unproven: readonly string[];
|
|
98
|
+
/** Recorded so a route that starts returning `pii`/`secret` flips the lockfile and forces a review. */
|
|
99
|
+
readonly classification?: DataClassification;
|
|
100
|
+
}
|
|
101
|
+
export interface CapabilitySnapshot {
|
|
102
|
+
readonly nifraCapabilities: 1;
|
|
103
|
+
readonly routes: readonly CapabilitySnapshotRoute[];
|
|
104
|
+
}
|
|
105
|
+
export { validCapabilityId };
|
|
106
|
+
/** Validate and freeze a capability/provenance policy. */
|
|
107
|
+
export declare function defineCapabilityPolicy(policy: CapabilityPolicy): CapabilityPolicy;
|
|
108
|
+
/** Compare declared route capabilities against coverage-qualified static/runtime evidence. */
|
|
109
|
+
export declare function evaluateCapabilityAssurance(source: unknown, policyInput: CapabilityPolicy, evidenceSet: CapabilityEvidenceSet): CapabilityAssuranceReport;
|
|
110
|
+
/**
|
|
111
|
+
* Runtime effect beacon for owned adapters. It fails closed when the route omitted the capability or
|
|
112
|
+
* when no route guard is present. Static provenance is still required: code can bypass a beacon.
|
|
113
|
+
*/
|
|
114
|
+
export declare function useCapability(context: object, capability: string): void;
|
|
115
|
+
/** Deterministic, PII-free lockfile material. */
|
|
116
|
+
export declare function snapshotCapabilities(report: CapabilityAssuranceReport): CapabilitySnapshot;
|
|
117
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|