@cotal-ai/auth 0.12.0 → 0.13.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/admission-mediator.d.ts +319 -0
- package/dist/admission-mediator.d.ts.map +1 -0
- package/dist/admission-mediator.js +1033 -0
- package/dist/admission-mediator.js.map +1 -0
- package/dist/auth-admin.d.ts +29 -0
- package/dist/auth-admin.d.ts.map +1 -0
- package/dist/auth-admin.js +224 -0
- package/dist/auth-admin.js.map +1 -0
- package/dist/authority-client.d.ts +215 -0
- package/dist/authority-client.d.ts.map +1 -0
- package/dist/authority-client.js +346 -0
- package/dist/authority-client.js.map +1 -0
- package/dist/barrier-evict.d.ts +16 -0
- package/dist/barrier-evict.d.ts.map +1 -0
- package/dist/barrier-evict.js +100 -0
- package/dist/barrier-evict.js.map +1 -0
- package/dist/connect-reader.d.ts +72 -0
- package/dist/connect-reader.d.ts.map +1 -0
- package/dist/connect-reader.js +154 -0
- package/dist/connect-reader.js.map +1 -0
- package/dist/continuity.d.ts.map +1 -1
- package/dist/continuity.js +3 -0
- package/dist/continuity.js.map +1 -1
- package/dist/credential-ledger.d.ts +343 -0
- package/dist/credential-ledger.d.ts.map +1 -0
- package/dist/credential-ledger.js +732 -0
- package/dist/credential-ledger.js.map +1 -0
- package/dist/drain-repair.d.ts +95 -0
- package/dist/drain-repair.d.ts.map +1 -0
- package/dist/drain-repair.js +305 -0
- package/dist/drain-repair.js.map +1 -0
- package/dist/idp.d.ts +19 -0
- package/dist/idp.d.ts.map +1 -1
- package/dist/idp.js +17 -0
- package/dist/idp.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -2
- package/dist/index.js.map +1 -1
- package/dist/issuer.d.ts +8 -0
- package/dist/issuer.d.ts.map +1 -1
- package/dist/issuer.js +4 -2
- package/dist/issuer.js.map +1 -1
- package/dist/ledger-scanner.d.ts +98 -0
- package/dist/ledger-scanner.d.ts.map +1 -0
- package/dist/ledger-scanner.js +352 -0
- package/dist/ledger-scanner.js.map +1 -0
- package/dist/ledger.d.ts +7 -0
- package/dist/ledger.d.ts.map +1 -1
- package/dist/ledger.js +53 -5
- package/dist/ledger.js.map +1 -1
- package/dist/lifecycle-registry.d.ts +397 -0
- package/dist/lifecycle-registry.d.ts.map +1 -0
- package/dist/lifecycle-registry.js +819 -0
- package/dist/lifecycle-registry.js.map +1 -0
- package/dist/permissions.d.ts +5 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +29 -6
- package/dist/permissions.js.map +1 -1
- package/dist/plane-claim.d.ts +83 -0
- package/dist/plane-claim.d.ts.map +1 -0
- package/dist/plane-claim.js +290 -0
- package/dist/plane-claim.js.map +1 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +2 -1
- package/dist/provider.js.map +1 -1
- package/dist/records-scanner.d.ts +78 -0
- package/dist/records-scanner.d.ts.map +1 -0
- package/dist/records-scanner.js +320 -0
- package/dist/records-scanner.js.map +1 -0
- package/dist/retirement-barrier.d.ts +217 -0
- package/dist/retirement-barrier.d.ts.map +1 -0
- package/dist/retirement-barrier.js +624 -0
- package/dist/retirement-barrier.js.map +1 -0
- package/dist/retirement-cleaner.d.ts +54 -0
- package/dist/retirement-cleaner.d.ts.map +1 -0
- package/dist/retirement-cleaner.js +158 -0
- package/dist/retirement-cleaner.js.map +1 -0
- package/dist/root-credential.d.ts +26 -0
- package/dist/root-credential.d.ts.map +1 -0
- package/dist/root-credential.js +116 -0
- package/dist/root-credential.js.map +1 -0
- package/dist/service.d.ts +60 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +317 -10
- package/dist/service.js.map +1 -1
- package/dist/session-ledger.d.ts +224 -0
- package/dist/session-ledger.d.ts.map +1 -0
- package/dist/session-ledger.js +713 -0
- package/dist/session-ledger.js.map +1 -0
- package/dist/token.d.ts +17 -0
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +30 -2
- package/dist/token.js.map +1 -1
- package/package.json +5 -3
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { NatsConnection } from "@nats-io/transport-node";
|
|
2
|
+
import { type PlaneConnTuple } from "@cotal-ai/core";
|
|
3
|
+
import type { ScanGuard } from "./plane-claim.js";
|
|
4
|
+
/** One raw enumerated entry, WITH its KV operation so the domain parse layer (admission-mediator's
|
|
5
|
+
* {@link enumerateObligationRows}) can treat a DEL/PURGE marker as corruption. SEAM NOTE: consumed
|
|
6
|
+
* ONLY by that parse layer, which turns each entry into a closed parsed obligation row BEFORE
|
|
7
|
+
* anything leaves; it is never placed on a barrier/mediator dependency (those receive parsed rows). */
|
|
8
|
+
export interface RawRecordsEntry {
|
|
9
|
+
key: string;
|
|
10
|
+
data: Uint8Array;
|
|
11
|
+
seq: number;
|
|
12
|
+
op: string | undefined;
|
|
13
|
+
}
|
|
14
|
+
/** The sealed records-obligation scanner: the CLOSED, validated op only — no raw prefix, no
|
|
15
|
+
* NATS/JS handle, no credential. The filter is confined to `oblig.<...>.>`. */
|
|
16
|
+
export interface RecordsScanner {
|
|
17
|
+
/** LastPerSubject over `$KV.<records>.<filter>` (filter confined to `oblig.<...>.>`) — the current
|
|
18
|
+
* last of every obligation row under the filter (markers included, so the caller sees a DEL/PURGE
|
|
19
|
+
* a bucket's own `keys()`/`watch()` would hide). */
|
|
20
|
+
scanObligations(filter: string): Promise<RawRecordsEntry[]>;
|
|
21
|
+
/** Tear down the owned credential+connection. */
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/** Assert `scanner` was built by this module for exactly `space`. */
|
|
25
|
+
export declare function assertRecordsScannerSpace(scanner: RecordsScanner, space: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Open the sealed records-obligation scanner over the space's records stream: a DEDICATED
|
|
28
|
+
* self-minted connection carrying ONLY {@link recordsScannerGrants}. The returned object exposes
|
|
29
|
+
* only the closed op; the connection, credential, and raw scan are never handed out.
|
|
30
|
+
*/
|
|
31
|
+
export interface RecordsScannerCandidate {
|
|
32
|
+
/** The connection's claim-pinnable broker identity (#29 HIGH 3, SPEC 13.13). */
|
|
33
|
+
tuple: PlaneConnTuple;
|
|
34
|
+
/** Resolves when the non-reconnecting connection is permanently gone (the fencing signal). */
|
|
35
|
+
gone: Promise<void>;
|
|
36
|
+
/** WINNER-ONLY, once: build the branded sealed scanner, its scan wrapped in the plane guard. */
|
|
37
|
+
activate(guard: ScanGuard): RecordsScanner;
|
|
38
|
+
close(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
export declare function openRecordsScannerCandidate(opts: {
|
|
41
|
+
server: string;
|
|
42
|
+
space: string;
|
|
43
|
+
dataAccount: {
|
|
44
|
+
pub: string;
|
|
45
|
+
signingSeed: string;
|
|
46
|
+
};
|
|
47
|
+
log: (line: string) => void;
|
|
48
|
+
}): Promise<RecordsScannerCandidate>;
|
|
49
|
+
/**
|
|
50
|
+
* TEST/SMOKE-ONLY: build the sealed records scanner over an EXISTING connection. A plain-auth test
|
|
51
|
+
* broker has no data-account signing seed to self-mint a JWT, so the JWT-owning
|
|
52
|
+
* {@link openRecordsScannerCandidate} (the PRODUCTION seam) does not apply. This factory's `close()` does
|
|
53
|
+
* NOT close the caller's connection (the harness owns it); it is never a production composition path
|
|
54
|
+
* and is never registered as a mintable profile.
|
|
55
|
+
*/
|
|
56
|
+
export declare function makeRecordsScannerOverConnection(nc: NatsConnection, space: string, probe?: RecordsScannerProbe, guard?: ScanGuard): RecordsScanner;
|
|
57
|
+
/** SMOKE-ONLY probes (mirroring the auth scanner). Never set in production.
|
|
58
|
+
* - `afterCreate` fires ONCE after create + bind-verify but BEFORE the drain (the create→drain race).
|
|
59
|
+
* - `afterFirstFetch` fires ONCE after the FIRST drain fetch (the mid-drain settle race). */
|
|
60
|
+
export interface RecordsScannerProbe {
|
|
61
|
+
afterCreate?: () => Promise<void>;
|
|
62
|
+
afterFirstFetch?: () => Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The SEALED records scanner's credential grant on the RECORDS stream (SPEC 13.9): exactly the ONE
|
|
66
|
+
* literal enumeration consumer's lifecycle (CREATE/INFO/NEXT/DELETE pinned to
|
|
67
|
+
* {@link RECORDS_SCANNER_CONSUMER_NAME}, the CREATE filter confined to the `oblig.` subtree) + the
|
|
68
|
+
* stream shape read + the scoped inbox. This is the ONLY profile that holds `CONSUMER.CREATE` on
|
|
69
|
+
* `KV_cotal_records_<space>` for obligation enumeration; {@link openRecordsScannerCandidate} opens it for the
|
|
70
|
+
* trusted process and it is NEVER registered as an external/mintable profile. The bucket is DERIVED
|
|
71
|
+
* from the validated space and the name is the module constant, so no caller-supplied token forms a
|
|
72
|
+
* privileged subject.
|
|
73
|
+
*/
|
|
74
|
+
export declare function recordsScannerGrants(space: string, connId: string): {
|
|
75
|
+
publish: string[];
|
|
76
|
+
subscribe: string[];
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=records-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records-scanner.d.ts","sourceRoot":"","sources":["../src/records-scanner.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAA0E,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE7H,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA0DlD;;;wGAGwG;AACxG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;CACxB;AAED;gFACgF;AAChF,MAAM,WAAW,cAAc;IAC7B;;yDAEqD;IACrD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5D,iDAAiD;IACjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAgBD,qEAAqE;AACrE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMtF;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,gFAAgF;IAChF,KAAK,EAAE,cAAc,CAAC;IACtB,8FAA8F;IAC9F,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,gGAAgG;IAChG,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CAAC;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAuBnC;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,cAAc,CAElJ;AAED;;8FAE8F;AAC9F,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAuID;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAe9G"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SEALED records-obligation scanner: the LastPerSubject enumeration over the space's ONE
|
|
3
|
+
* records KV stream (`KV_cotal_records_<space>`), confined to the `oblig.` subtree, and the ONLY
|
|
4
|
+
* place a `CONSUMER.CREATE` on that stream lives for obligation enumeration.
|
|
5
|
+
*
|
|
6
|
+
* WHY IT EXISTS (SPEC 13.9, site 3 — the records-stream analogue of {@link ./ledger-scanner.ts}):
|
|
7
|
+
* a consumer-create request BODY is NOT subject-ACL confinable — the extended
|
|
8
|
+
* `CONSUMER.CREATE.<stream>.<name>.<filter>` grant the admission mediator used to hold still
|
|
9
|
+
* admits a `durable_name` + PUSH `deliver_subject` body (nats-server#8274), i.e. a durable exporter
|
|
10
|
+
* of every current/future obligation row that SURVIVES the holder's connection and JWT revoke.
|
|
11
|
+
* Reproduced live against the prior grant: a mediator-scoped credential created a PUSH exporter of
|
|
12
|
+
* its endpoint's whole `oblig.` subtree. So NO standing or runtime-reachable credential (the
|
|
13
|
+
* admission mediator, the retirement barrier's obligation drain) may hold `CONSUMER.CREATE` on the
|
|
14
|
+
* records stream. The dynamic obligation-enumeration CREATE lives ONLY here.
|
|
15
|
+
*
|
|
16
|
+
* THE SEAL is the auth scanner's, verbatim: {@link openRecordsScannerCandidate} opens a DEDICATED, minimal
|
|
17
|
+
* credential+connection ({@link recordsScannerGrants}: exactly the one literal consumer name's
|
|
18
|
+
* CREATE/INFO/NEXT/DELETE pinned to the `oblig.` subtree + the stream shape read, nothing else) and
|
|
19
|
+
* never exposes it. Callers receive only the CLOSED, validated {@link RecordsScanner.scanObligations}
|
|
20
|
+
* op, which confines every filter to `oblig.<...>.>`. `close()` tears the owned client down.
|
|
21
|
+
* A process-memory compromise of the trusted process reaches this CREATE — the SAME residual class
|
|
22
|
+
* as the data-account signing seed the process already holds — not broker confinement.
|
|
23
|
+
*
|
|
24
|
+
* THE SCAN (why LastPerSubject, no fence): under the normative records store an obligation row's
|
|
25
|
+
* `provisional→accepted/rejected` settle is a same-subject overwrite (history=1). A seq/INFO cutoff
|
|
26
|
+
* would drop a subject overwritten during the scan; a LastPerSubject consumer carries NO upper
|
|
27
|
+
* fence, so it delivers each subject's CURRENT last and a concurrent settle is SEEN, never dropped —
|
|
28
|
+
* the completeness the retirement barrier's drain-to-quiescence requires. The pre-clean, forced
|
|
29
|
+
* pull/LastPerSubject shape, full bind-verify, and fresh-zero drain are the auth scanner's, and the
|
|
30
|
+
* injected scanner is BRANDED to its exact space ({@link assertRecordsScannerSpace}) so a
|
|
31
|
+
* hand-assembled or foreign-space scanner can never silently empty a drain.
|
|
32
|
+
*
|
|
33
|
+
* CAPABILITY INTEGRITY + SERIALIZATION (panel HIGHs on the seal claim):
|
|
34
|
+
* - The returned handle is FROZEN: the brand proves construction identity, the freeze proves the
|
|
35
|
+
* reference's ops are still the module's (a post-brand `scanObligations = async () => []` swap
|
|
36
|
+
* throws instead of surviving the injection assert). The ops close over module-private state, so
|
|
37
|
+
* the frozen handle carries the registry/mediator seal's integrity in one object. The swap vector
|
|
38
|
+
* was reachable only from inside the trusted process (the signing-seed residual class), never
|
|
39
|
+
* externally; it is refused anyway because the invariant must be enforced, not asserted.
|
|
40
|
+
* - fact-5 is ENFORCED, not asserted: every scan over a space's ONE literal consumer name
|
|
41
|
+
* serializes on a MODULE-LEVEL per-space chain, so a second branded instance (however composed)
|
|
42
|
+
* can never interleave pre-clean/create/fetch/delete with a live scan and hand back a partial
|
|
43
|
+
* map. ONE shared instance per space stays the composition rule (#29 injects one), but safety no
|
|
44
|
+
* longer depends on it. Cross-PROCESS duplication is the two-authority-planes split-brain class
|
|
45
|
+
* (excluded by the one-plane-per-space composition); the per-message filter revalidation in the
|
|
46
|
+
* drain makes an OUT-OF-FILTER delivery from a foreign re-resolution loud, while a foreign
|
|
47
|
+
* same-or-narrower filter stays covered by that composition assumption, not by the check.
|
|
48
|
+
*/
|
|
49
|
+
import { AckPolicy, DeliverPolicy, JetStreamApiCodes, JetStreamApiError, jetstream, jetstreamManager } from "@nats-io/jetstream";
|
|
50
|
+
import { EpEnvelopeError, assertInboxConnId, recordsBucket, recordsKvStreamName } from "@cotal-ai/core";
|
|
51
|
+
import { openAuthorityClient } from "./authority-client.js";
|
|
52
|
+
/** The ONE literal consumer name every obligation scan over the records stream reuses (the grant
|
|
53
|
+
* pins exactly this token; separate from the auth-ledger scanner's — fact-5, one name per stream).
|
|
54
|
+
* Scans over it serialize on the MODULE-LEVEL per-space chain below, never a per-instance lock. */
|
|
55
|
+
const RECORDS_SCANNER_CONSUMER_NAME = "cotal-records-scan";
|
|
56
|
+
/** fact-5 ENFORCED (panel HIGH): the serialization critical section for a space's literal consumer
|
|
57
|
+
* name lives at MODULE level, keyed by space, so two branded same-space instances share one chain
|
|
58
|
+
* and can never interleave pre-clean/create/fetch/delete on that name (a per-instance lock cannot
|
|
59
|
+
* see a sibling instance). */
|
|
60
|
+
const SPACE_SCAN_CHAINS = new Map();
|
|
61
|
+
const serializedForSpace = (space, fn) => {
|
|
62
|
+
const tail = SPACE_SCAN_CHAINS.get(space) ?? Promise.resolve();
|
|
63
|
+
const run = tail.then(fn, fn);
|
|
64
|
+
SPACE_SCAN_CHAINS.set(space, run.then(() => undefined, () => undefined));
|
|
65
|
+
return run;
|
|
66
|
+
};
|
|
67
|
+
/** Does a concrete delivered subject match the requested consumer filter (`*` one token, trailing
|
|
68
|
+
* `>` a non-empty remainder)? Revalidated PER MESSAGE in the drain: bind-verify proves the config
|
|
69
|
+
* once at create, this proves every delivered row still belongs to THIS scan's filter, so a
|
|
70
|
+
* foreign re-resolution of the literal name (a config swapped under the scan) is refused loud. */
|
|
71
|
+
const matchesFilter = (subject, pattern) => {
|
|
72
|
+
const s = subject.split("."), p = pattern.split(".");
|
|
73
|
+
for (let i = 0; i < p.length; i++) {
|
|
74
|
+
if (p[i] === ">")
|
|
75
|
+
return s.length > i;
|
|
76
|
+
if (i >= s.length || (p[i] !== "*" && p[i] !== s[i]))
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
return s.length === p.length;
|
|
80
|
+
};
|
|
81
|
+
/** Bounded inactivity (ns): a leaked orphan (a run that crashed before its unconditional delete) is
|
|
82
|
+
* broker-collected within this window, and the next run's pre-clean removes it by name. */
|
|
83
|
+
const INACTIVE_THRESHOLD_NS = 30_000_000_000;
|
|
84
|
+
/** Drain bounds (fail-closed, not spin) — the auth scanner's rationale (a quiescent subtree settles
|
|
85
|
+
* in a handful of rounds; a concurrent settle adds a bounded burst the next round re-reads). */
|
|
86
|
+
const MAX_DRAIN_ROUNDS = 4096;
|
|
87
|
+
/** Consecutive rounds that observe pending > 0 yet deliver nothing before the scan fails closed. */
|
|
88
|
+
const MAX_NO_PROGRESS_ROUNDS = 8;
|
|
89
|
+
/** One KV key segment (no dots — the separator — no wildcards). */
|
|
90
|
+
const KEY_SEGMENT = /^[A-Za-z0-9_-]+$/;
|
|
91
|
+
/** Confine a caller's obligation filter to the `oblig.` subtree: it must be `oblig.<...>.>` where
|
|
92
|
+
* each middle segment is a KV-safe token or the `*` position wildcard (the mediator's target
|
|
93
|
+
* wildcard `oblig.*.<ep>.>`, the barrier's target pin `oblig.<uid>.>`). Anything else — a widen to
|
|
94
|
+
* the records root, a head/govern/lease subtree, a dotted injection — is refused, so the closed op
|
|
95
|
+
* can never enumerate outside `oblig.`. */
|
|
96
|
+
function assertObligFilter(filter) {
|
|
97
|
+
const parts = filter.split(".");
|
|
98
|
+
if (parts.length < 2 || parts[0] !== "oblig" || parts[parts.length - 1] !== ">")
|
|
99
|
+
throw new EpEnvelopeError("failed-precondition", `the records scanner filter ${JSON.stringify(filter)} is not an oblig subtree filter (must be oblig.<...>.>) (SPEC 13.9)`);
|
|
100
|
+
for (const seg of parts.slice(1, -1))
|
|
101
|
+
if (seg !== "*" && !KEY_SEGMENT.test(seg))
|
|
102
|
+
throw new EpEnvelopeError("failed-precondition", `the records scanner filter segment ${JSON.stringify(seg)} is neither a KV-safe token nor the * wildcard (SPEC 13.9)`);
|
|
103
|
+
return filter;
|
|
104
|
+
}
|
|
105
|
+
/** STRUCTURAL not-found classification (not a message regex): @nats-io/jetstream throws a
|
|
106
|
+
* JetStreamApiError whose `.code` is the JS API err_code (`JetStreamApiCodes.ConsumerNotFound` =
|
|
107
|
+
* 10014); `.status` is the HTTP 404. The pre-clean proceeds ONLY on this exact structured shape. */
|
|
108
|
+
const isConsumerNotFound = (e) => e instanceof JetStreamApiError && e.code === JetStreamApiCodes.ConsumerNotFound;
|
|
109
|
+
/** The records scanner's BRAND (site-3, mirroring the auth scanner): the ONLY way to be a
|
|
110
|
+
* RecordsScanner a registry/mediator accepts is to be built by {@link buildScanner} in THIS module,
|
|
111
|
+
* which pins the scanner's exact space. A hand-assembled structural object (e.g. one whose op
|
|
112
|
+
* returns `[]`) or a real scanner for a DIFFERENT space is rejected by
|
|
113
|
+
* {@link assertRecordsScannerSpace}, so a drain can never enumerate an empty/foreign subtree and
|
|
114
|
+
* declare quiescence over live obligations. */
|
|
115
|
+
const RECORDS_SCANNER_BRAND = new WeakMap();
|
|
116
|
+
/** Assert `scanner` was built by this module for exactly `space`. */
|
|
117
|
+
export function assertRecordsScannerSpace(scanner, space) {
|
|
118
|
+
const bonded = RECORDS_SCANNER_BRAND.get(scanner);
|
|
119
|
+
if (bonded === undefined)
|
|
120
|
+
throw new EpEnvelopeError("failed-precondition", "the injected records scanner was not built by openRecordsScannerCandidate/makeRecordsScannerOverConnection; a hand-assembled scanner never authorizes an enumeration (SPEC 13.12)");
|
|
121
|
+
if (bonded !== space)
|
|
122
|
+
throw new EpEnvelopeError("failed-precondition", `the injected records scanner is bonded to space ${JSON.stringify(bonded)}, not ${JSON.stringify(space)}; a foreign-space scanner would enumerate the wrong (or an empty) subtree and let a drain declare quiescence over live obligations (SPEC 13.1/13.12)`);
|
|
123
|
+
}
|
|
124
|
+
export async function openRecordsScannerCandidate(opts) {
|
|
125
|
+
const client = await openAuthorityClient({
|
|
126
|
+
server: opts.server, space: opts.space, dataAccount: opts.dataAccount, label: `cotal:records-scan:${opts.space}`,
|
|
127
|
+
grants: (id) => recordsScannerGrants(opts.space, id), log: opts.log, planeCandidate: true,
|
|
128
|
+
});
|
|
129
|
+
if (client.tuple === undefined || client.gone === undefined)
|
|
130
|
+
throw new EpEnvelopeError("internal", "a plane-candidate authority client carries a tuple and a gone signal by contract (SPEC 13.13)");
|
|
131
|
+
let activated = false;
|
|
132
|
+
let closed = false;
|
|
133
|
+
return {
|
|
134
|
+
tuple: client.tuple,
|
|
135
|
+
gone: client.gone,
|
|
136
|
+
activate: (guard) => {
|
|
137
|
+
if (closed)
|
|
138
|
+
throw new EpEnvelopeError("failed-precondition", "this records scanner candidate is closed (a losing plane open never activates)");
|
|
139
|
+
if (activated)
|
|
140
|
+
throw new EpEnvelopeError("failed-precondition", "this records scanner candidate is already activated (one branded scanner per candidate)");
|
|
141
|
+
activated = true;
|
|
142
|
+
return buildScanner(client.nc, opts.space, () => client.close(), undefined, guard);
|
|
143
|
+
},
|
|
144
|
+
close: async () => {
|
|
145
|
+
closed = true;
|
|
146
|
+
await client.close();
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* TEST/SMOKE-ONLY: build the sealed records scanner over an EXISTING connection. A plain-auth test
|
|
152
|
+
* broker has no data-account signing seed to self-mint a JWT, so the JWT-owning
|
|
153
|
+
* {@link openRecordsScannerCandidate} (the PRODUCTION seam) does not apply. This factory's `close()` does
|
|
154
|
+
* NOT close the caller's connection (the harness owns it); it is never a production composition path
|
|
155
|
+
* and is never registered as a mintable profile.
|
|
156
|
+
*/
|
|
157
|
+
export function makeRecordsScannerOverConnection(nc, space, probe, guard) {
|
|
158
|
+
return buildScanner(nc, space, async () => { }, probe, guard);
|
|
159
|
+
}
|
|
160
|
+
function buildScanner(nc, space, onClose, probe, guard) {
|
|
161
|
+
const bucket = recordsBucket(space);
|
|
162
|
+
const stream = recordsKvStreamName(space);
|
|
163
|
+
const keyPrefixLen = `$KV.${bucket}.`.length;
|
|
164
|
+
let jsmP;
|
|
165
|
+
let jsRef;
|
|
166
|
+
const jsmOf = () => (jsmP ??= jetstreamManager(nc));
|
|
167
|
+
const jsOf = () => (jsRef ??= jetstream(nc));
|
|
168
|
+
const scanOnce = async (rawFilter) => {
|
|
169
|
+
const jsm = await jsmOf();
|
|
170
|
+
const js = jsOf();
|
|
171
|
+
const filter = `$KV.${bucket}.${assertObligFilter(rawFilter)}`;
|
|
172
|
+
// 1. FAIL-CLOSED pre-clean: PROVE the literal name absent before create. Absence is proved ONLY
|
|
173
|
+
// by a confirmed delete (`delete(...) === true`) or a structured ConsumerNotFound; a `false`
|
|
174
|
+
// return or any other error fails the scan (a surviving stale AckNone consumer could otherwise
|
|
175
|
+
// advance deliveries and make this run silently omit rows).
|
|
176
|
+
let provedAbsent = false;
|
|
177
|
+
try {
|
|
178
|
+
provedAbsent = (await jsm.consumers.delete(stream, RECORDS_SCANNER_CONSUMER_NAME)) === true;
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
if (isConsumerNotFound(e))
|
|
182
|
+
provedAbsent = true;
|
|
183
|
+
else
|
|
184
|
+
throw new EpEnvelopeError("unavailable", `the records scanner could not prove its literal consumer absent on ${stream} before create (pre-clean fails closed, SPEC 13.9): ${e?.message ?? String(e)}`);
|
|
185
|
+
}
|
|
186
|
+
if (!provedAbsent)
|
|
187
|
+
throw new EpEnvelopeError("unavailable", `the records scanner's pre-clean did not confirm the literal consumer deleted or absent on ${stream}; refusing to create over an unproven consumer (fail-closed, SPEC 13.9)`);
|
|
188
|
+
// 2. Create with the FORCED config ONLY (the seam derives every field; no caller config).
|
|
189
|
+
try {
|
|
190
|
+
await jsm.consumers.add(stream, {
|
|
191
|
+
name: RECORDS_SCANNER_CONSUMER_NAME,
|
|
192
|
+
filter_subject: filter,
|
|
193
|
+
ack_policy: AckPolicy.None,
|
|
194
|
+
deliver_policy: DeliverPolicy.LastPerSubject,
|
|
195
|
+
mem_storage: true,
|
|
196
|
+
inactive_threshold: INACTIVE_THRESHOLD_NS,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
throw new EpEnvelopeError("unavailable", `the records scanner could not create its consumer on ${stream} (${rawFilter}); the scan fails closed (SPEC 13.9): ${e?.message ?? String(e)}`);
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
// 3. FULL bind-verify: the created consumer must carry EXACTLY the forced shape — the exact
|
|
204
|
+
// name and single filter (no multi-filter), pull (no `deliver_subject`), ephemeral (no
|
|
205
|
+
// `durable_name`), AckNone/LastPerSubject, memory storage, the bounded exact inactivity.
|
|
206
|
+
const info = await jsm.consumers.info(stream, RECORDS_SCANNER_CONSUMER_NAME);
|
|
207
|
+
const cfg = info.config;
|
|
208
|
+
const drift = cfg.name !== RECORDS_SCANNER_CONSUMER_NAME ? `name=${cfg.name}` :
|
|
209
|
+
cfg.filter_subject !== filter ? `filter=${cfg.filter_subject}` :
|
|
210
|
+
(Array.isArray(cfg.filter_subjects) && cfg.filter_subjects.length > 0) ? `filter_subjects=${JSON.stringify(cfg.filter_subjects)}` :
|
|
211
|
+
cfg.deliver_subject !== undefined ? `deliver_subject=${cfg.deliver_subject}` :
|
|
212
|
+
cfg.durable_name !== undefined ? `durable=${cfg.durable_name}` :
|
|
213
|
+
cfg.ack_policy !== AckPolicy.None ? `ack=${cfg.ack_policy}` :
|
|
214
|
+
cfg.deliver_policy !== DeliverPolicy.LastPerSubject ? `deliver=${cfg.deliver_policy}` :
|
|
215
|
+
cfg.mem_storage !== true ? `mem_storage=${cfg.mem_storage}` :
|
|
216
|
+
cfg.inactive_threshold !== INACTIVE_THRESHOLD_NS ? `inactive_threshold=${cfg.inactive_threshold}` :
|
|
217
|
+
undefined;
|
|
218
|
+
if (drift !== undefined)
|
|
219
|
+
throw new EpEnvelopeError("failed-precondition", `the records scanner's consumer on ${stream} does not carry the forced pull/LastPerSubject shape (${drift}); refusing the scan (SPEC 13.9)`);
|
|
220
|
+
// SMOKE-ONLY race window: force a concurrent settle between create and drain.
|
|
221
|
+
if (probe?.afterCreate)
|
|
222
|
+
await probe.afterCreate();
|
|
223
|
+
// 4. Drain to a FRESHLY-OBSERVED zero. `num_pending` is re-read each round (never a stale
|
|
224
|
+
// initial count): a subject settled while draining re-appears as pending and is fetched in a
|
|
225
|
+
// later round, so the result is one CURRENT row per subject. The fence is num_pending===0 —
|
|
226
|
+
// NOT a per-fetch got===want assertion, which a concurrent settle would trip falsely.
|
|
227
|
+
const latest = new Map();
|
|
228
|
+
const consumer = await js.consumers.get(stream, RECORDS_SCANNER_CONSUMER_NAME);
|
|
229
|
+
let noProgress = 0;
|
|
230
|
+
for (let round = 0;; round++) {
|
|
231
|
+
const pending = (await consumer.info()).num_pending;
|
|
232
|
+
if (pending === 0)
|
|
233
|
+
break;
|
|
234
|
+
if (round >= MAX_DRAIN_ROUNDS)
|
|
235
|
+
throw new EpEnvelopeError("unavailable", `the records scanner under ${rawFilter} never settled to zero pending after ${round} rounds; the scan fails closed (SPEC 13.9)`);
|
|
236
|
+
const want = Math.min(pending, 256);
|
|
237
|
+
const iter = await consumer.fetch({ max_messages: want, expires: 5_000 });
|
|
238
|
+
let got = 0;
|
|
239
|
+
for await (const m of iter) {
|
|
240
|
+
got++;
|
|
241
|
+
// CLOSED subject validation, PER MESSAGE against THIS scan's exact filter (not just the
|
|
242
|
+
// oblig root): a foreign subject never enters the result, and a literal-name consumer
|
|
243
|
+
// swapped to a different config under the scan is refused loud instead of contaminating.
|
|
244
|
+
if (!matchesFilter(m.subject, filter))
|
|
245
|
+
throw new EpEnvelopeError("internal", `the records scanner received subject ${m.subject} outside its requested filter ${filter}; refusing (a foreign re-resolution of the literal consumer name never feeds a scan, SPEC 13.9)`);
|
|
246
|
+
if (!Number.isSafeInteger(m.seq) || m.seq <= 0)
|
|
247
|
+
throw new EpEnvelopeError("internal", `the records scanner received a non-positive/unsafe sequence ${m.seq} for ${m.subject}; refusing (SPEC 13.9)`);
|
|
248
|
+
const prev = latest.get(m.subject);
|
|
249
|
+
if (prev === undefined || m.seq > prev.seq)
|
|
250
|
+
latest.set(m.subject, { data: m.data, seq: m.seq, op: m.headers?.get("KV-Operation") || undefined });
|
|
251
|
+
}
|
|
252
|
+
if (round === 0 && probe?.afterFirstFetch)
|
|
253
|
+
await probe.afterFirstFetch();
|
|
254
|
+
if (got === 0) {
|
|
255
|
+
if (++noProgress >= MAX_NO_PROGRESS_ROUNDS)
|
|
256
|
+
throw new EpEnvelopeError("unavailable", `the records scanner under ${rawFilter} reported pending but delivered nothing for ${noProgress} rounds; the scan fails closed (SPEC 13.9)`);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
noProgress = 0;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const out = [];
|
|
263
|
+
for (const [subject, v] of latest)
|
|
264
|
+
out.push({ key: subject.slice(keyPrefixLen), data: v.data, seq: v.seq, op: v.op });
|
|
265
|
+
return out;
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
// 5. Unconditional cleanup (a leaked orphan is collected by the bounded inactivity).
|
|
269
|
+
try {
|
|
270
|
+
await jsm.consumers.delete(stream, RECORDS_SCANNER_CONSUMER_NAME);
|
|
271
|
+
}
|
|
272
|
+
catch { /* orphan collected by inactivity */ }
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
// FROZEN before branding (capability integrity): the brand keys this exact reference, and the
|
|
276
|
+
// freeze guarantees its ops are still the module's when an install seam asserts the brand — a
|
|
277
|
+
// post-brand method swap throws (strict mode) instead of surviving as a silent-empty scanner.
|
|
278
|
+
const scanner = Object.freeze({
|
|
279
|
+
// The PLANE guard (#29 HIGH 3, SPEC 13.13) wraps the scan INSIDE the serialized critical
|
|
280
|
+
// section: claim re-validated before (refuse to enumerate) and after (discard the result).
|
|
281
|
+
scanObligations: (filter) => serializedForSpace(space, async () => {
|
|
282
|
+
if (guard === undefined)
|
|
283
|
+
return scanOnce(filter);
|
|
284
|
+
await guard.assertHeld("before");
|
|
285
|
+
const out = await scanOnce(filter);
|
|
286
|
+
await guard.assertHeld("after");
|
|
287
|
+
return out;
|
|
288
|
+
}),
|
|
289
|
+
close: onClose,
|
|
290
|
+
});
|
|
291
|
+
RECORDS_SCANNER_BRAND.set(scanner, space);
|
|
292
|
+
return scanner;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* The SEALED records scanner's credential grant on the RECORDS stream (SPEC 13.9): exactly the ONE
|
|
296
|
+
* literal enumeration consumer's lifecycle (CREATE/INFO/NEXT/DELETE pinned to
|
|
297
|
+
* {@link RECORDS_SCANNER_CONSUMER_NAME}, the CREATE filter confined to the `oblig.` subtree) + the
|
|
298
|
+
* stream shape read + the scoped inbox. This is the ONLY profile that holds `CONSUMER.CREATE` on
|
|
299
|
+
* `KV_cotal_records_<space>` for obligation enumeration; {@link openRecordsScannerCandidate} opens it for the
|
|
300
|
+
* trusted process and it is NEVER registered as an external/mintable profile. The bucket is DERIVED
|
|
301
|
+
* from the validated space and the name is the module constant, so no caller-supplied token forms a
|
|
302
|
+
* privileged subject.
|
|
303
|
+
*/
|
|
304
|
+
export function recordsScannerGrants(space, connId) {
|
|
305
|
+
const bucket = recordsBucket(space);
|
|
306
|
+
const stream = recordsKvStreamName(space);
|
|
307
|
+
const inbox = assertInboxConnId(connId);
|
|
308
|
+
return {
|
|
309
|
+
publish: [
|
|
310
|
+
"$JS.API.INFO",
|
|
311
|
+
`$JS.API.STREAM.INFO.${stream}`,
|
|
312
|
+
`$JS.API.CONSUMER.CREATE.${stream}.${RECORDS_SCANNER_CONSUMER_NAME}.$KV.${bucket}.oblig.>`,
|
|
313
|
+
`$JS.API.CONSUMER.INFO.${stream}.${RECORDS_SCANNER_CONSUMER_NAME}`,
|
|
314
|
+
`$JS.API.CONSUMER.MSG.NEXT.${stream}.${RECORDS_SCANNER_CONSUMER_NAME}`,
|
|
315
|
+
`$JS.API.CONSUMER.DELETE.${stream}.${RECORDS_SCANNER_CONSUMER_NAME}`,
|
|
316
|
+
],
|
|
317
|
+
subscribe: [`_INBOX_${inbox}.>`],
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=records-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records-scanner.js","sourceRoot":"","sources":["../src/records-scanner.ts"],"names":[],"mappings":"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"}
|