@origintrail-official/dkg-agent 10.0.6 → 10.0.7
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/chain-reconciler.d.ts +62 -10
- package/dist/chain-reconciler.d.ts.map +1 -1
- package/dist/chain-reconciler.js +318 -25
- package/dist/chain-reconciler.js.map +1 -1
- package/dist/context-graph-join-admission-lock.d.ts +25 -0
- package/dist/context-graph-join-admission-lock.d.ts.map +1 -0
- package/dist/context-graph-join-admission-lock.js +50 -0
- package/dist/context-graph-join-admission-lock.js.map +1 -0
- package/dist/context-graph-join-admission.d.ts +106 -0
- package/dist/context-graph-join-admission.d.ts.map +1 -0
- package/dist/context-graph-join-admission.js +435 -0
- package/dist/context-graph-join-admission.js.map +1 -0
- package/dist/context-graph-membership-mutation.d.ts +21 -0
- package/dist/context-graph-membership-mutation.d.ts.map +1 -0
- package/dist/context-graph-membership-mutation.js +27 -0
- package/dist/context-graph-membership-mutation.js.map +1 -0
- package/dist/context-graph-meta-projection.d.ts +9 -0
- package/dist/context-graph-meta-projection.d.ts.map +1 -1
- package/dist/context-graph-meta-projection.js +69 -0
- package/dist/context-graph-meta-projection.js.map +1 -1
- package/dist/context-graph-private-meta-proof.d.ts +15 -0
- package/dist/context-graph-private-meta-proof.d.ts.map +1 -0
- package/dist/context-graph-private-meta-proof.js +183 -0
- package/dist/context-graph-private-meta-proof.js.map +1 -0
- package/dist/curator-meta-refresh.d.ts +20 -0
- package/dist/curator-meta-refresh.d.ts.map +1 -0
- package/dist/curator-meta-refresh.js +359 -0
- package/dist/curator-meta-refresh.js.map +1 -0
- package/dist/dkg-agent-base.d.ts +70 -27
- package/dist/dkg-agent-base.d.ts.map +1 -1
- package/dist/dkg-agent-base.js +81 -15
- package/dist/dkg-agent-base.js.map +1 -1
- package/dist/dkg-agent-ccl.d.ts.map +1 -1
- package/dist/dkg-agent-ccl.js.map +1 -1
- package/dist/dkg-agent-cg-registry.d.ts.map +1 -1
- package/dist/dkg-agent-cg-registry.js +2 -1
- package/dist/dkg-agent-cg-registry.js.map +1 -1
- package/dist/dkg-agent-cg-resolve.d.ts +2 -3
- package/dist/dkg-agent-cg-resolve.d.ts.map +1 -1
- package/dist/dkg-agent-cg-resolve.js +77 -101
- package/dist/dkg-agent-cg-resolve.js.map +1 -1
- package/dist/dkg-agent-constants.d.ts +31 -2
- package/dist/dkg-agent-constants.d.ts.map +1 -1
- package/dist/dkg-agent-constants.js +38 -1
- package/dist/dkg-agent-constants.js.map +1 -1
- package/dist/dkg-agent-context-graph.d.ts +33 -1
- package/dist/dkg-agent-context-graph.d.ts.map +1 -1
- package/dist/dkg-agent-context-graph.js +141 -91
- package/dist/dkg-agent-context-graph.js.map +1 -1
- package/dist/dkg-agent-crypto.d.ts.map +1 -1
- package/dist/dkg-agent-crypto.js +37 -77
- package/dist/dkg-agent-crypto.js.map +1 -1
- package/dist/dkg-agent-endorse.d.ts.map +1 -1
- package/dist/dkg-agent-endorse.js.map +1 -1
- package/dist/dkg-agent-helpers.d.ts +1 -23
- package/dist/dkg-agent-helpers.d.ts.map +1 -1
- package/dist/dkg-agent-helpers.js +3 -61
- package/dist/dkg-agent-helpers.js.map +1 -1
- package/dist/dkg-agent-join.d.ts +178 -24
- package/dist/dkg-agent-join.d.ts.map +1 -1
- package/dist/dkg-agent-join.js +1278 -193
- package/dist/dkg-agent-join.js.map +1 -1
- package/dist/dkg-agent-lifecycle.d.ts +37 -7
- package/dist/dkg-agent-lifecycle.d.ts.map +1 -1
- package/dist/dkg-agent-lifecycle.js +1420 -393
- package/dist/dkg-agent-lifecycle.js.map +1 -1
- package/dist/dkg-agent-ownership.d.ts +12 -33
- package/dist/dkg-agent-ownership.d.ts.map +1 -1
- package/dist/dkg-agent-ownership.js +18 -34
- package/dist/dkg-agent-ownership.js.map +1 -1
- package/dist/dkg-agent-publish.d.ts +70 -34
- package/dist/dkg-agent-publish.d.ts.map +1 -1
- package/dist/dkg-agent-publish.js +1384 -663
- package/dist/dkg-agent-publish.js.map +1 -1
- package/dist/dkg-agent-query.d.ts.map +1 -1
- package/dist/dkg-agent-query.js.map +1 -1
- package/dist/dkg-agent-registry.d.ts +1 -0
- package/dist/dkg-agent-registry.d.ts.map +1 -1
- package/dist/dkg-agent-registry.js +28 -9
- package/dist/dkg-agent-registry.js.map +1 -1
- package/dist/dkg-agent-swm-host.d.ts +26 -8
- package/dist/dkg-agent-swm-host.d.ts.map +1 -1
- package/dist/dkg-agent-swm-host.js +287 -97
- package/dist/dkg-agent-swm-host.js.map +1 -1
- package/dist/dkg-agent-swm-substrate.d.ts.map +1 -1
- package/dist/dkg-agent-swm-substrate.js +4 -5
- package/dist/dkg-agent-swm-substrate.js.map +1 -1
- package/dist/dkg-agent-types.d.ts +170 -8
- package/dist/dkg-agent-types.d.ts.map +1 -1
- package/dist/dkg-agent-types.js.map +1 -1
- package/dist/dkg-agent-utils.d.ts +5 -7
- package/dist/dkg-agent-utils.d.ts.map +1 -1
- package/dist/dkg-agent-utils.js +15 -196
- package/dist/dkg-agent-utils.js.map +1 -1
- package/dist/dkg-agent.d.ts +46 -18
- package/dist/dkg-agent.d.ts.map +1 -1
- package/dist/dkg-agent.js +261 -284
- package/dist/dkg-agent.js.map +1 -1
- package/dist/finalization-handler.d.ts +54 -2
- package/dist/finalization-handler.d.ts.map +1 -1
- package/dist/finalization-handler.js +945 -21
- package/dist/finalization-handler.js.map +1 -1
- package/dist/finalized-lifecycle-scope.d.ts +15 -0
- package/dist/finalized-lifecycle-scope.d.ts.map +1 -0
- package/dist/finalized-lifecycle-scope.js +31 -0
- package/dist/finalized-lifecycle-scope.js.map +1 -0
- package/dist/gossip-publish-handler.d.ts +10 -5
- package/dist/gossip-publish-handler.d.ts.map +1 -1
- package/dist/gossip-publish-handler.js +271 -26
- package/dist/gossip-publish-handler.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/join-request-retention.d.ts +16 -0
- package/dist/join-request-retention.d.ts.map +1 -0
- package/dist/join-request-retention.js +95 -0
- package/dist/join-request-retention.js.map +1 -0
- package/dist/named-ka-publish-recovery.d.ts +35 -0
- package/dist/named-ka-publish-recovery.d.ts.map +1 -0
- package/dist/named-ka-publish-recovery.js +155 -0
- package/dist/named-ka-publish-recovery.js.map +1 -0
- package/dist/named-ka-vm-lifecycle.d.ts +14 -0
- package/dist/named-ka-vm-lifecycle.d.ts.map +1 -0
- package/dist/named-ka-vm-lifecycle.js +68 -0
- package/dist/named-ka-vm-lifecycle.js.map +1 -0
- package/dist/p2p/messenger.d.ts +42 -6
- package/dist/p2p/messenger.d.ts.map +1 -1
- package/dist/p2p/messenger.js +71 -4
- package/dist/p2p/messenger.js.map +1 -1
- package/dist/p2p/network-admission-protocol-adapter.d.ts +11 -0
- package/dist/p2p/network-admission-protocol-adapter.d.ts.map +1 -0
- package/dist/p2p/network-admission-protocol-adapter.js +25 -0
- package/dist/p2p/network-admission-protocol-adapter.js.map +1 -0
- package/dist/p2p/sync-transport.d.ts +18 -3
- package/dist/p2p/sync-transport.d.ts.map +1 -1
- package/dist/p2p/sync-transport.js +12 -0
- package/dist/p2p/sync-transport.js.map +1 -1
- package/dist/rootless-update-error.d.ts +9 -0
- package/dist/rootless-update-error.d.ts.map +1 -0
- package/dist/rootless-update-error.js +23 -0
- package/dist/rootless-update-error.js.map +1 -0
- package/dist/startup-jitter.d.ts +11 -0
- package/dist/startup-jitter.d.ts.map +1 -0
- package/dist/startup-jitter.js +29 -0
- package/dist/startup-jitter.js.map +1 -0
- package/dist/sync/auth/request-build.d.ts +11 -0
- package/dist/sync/auth/request-build.d.ts.map +1 -1
- package/dist/sync/auth/request-build.js +15 -2
- package/dist/sync/auth/request-build.js.map +1 -1
- package/dist/sync/backpressure.d.ts +16 -2
- package/dist/sync/backpressure.d.ts.map +1 -1
- package/dist/sync/backpressure.js +76 -57
- package/dist/sync/backpressure.js.map +1 -1
- package/dist/sync/durable-integrity.d.ts +79 -0
- package/dist/sync/durable-integrity.d.ts.map +1 -0
- package/dist/sync/durable-integrity.js +1056 -0
- package/dist/sync/durable-integrity.js.map +1 -0
- package/dist/sync/durable-progress.d.ts +51 -0
- package/dist/sync/durable-progress.d.ts.map +1 -0
- package/dist/sync/durable-progress.js +89 -0
- package/dist/sync/durable-progress.js.map +1 -0
- package/dist/sync/graph-scoped-swm-recovery.d.ts +52 -0
- package/dist/sync/graph-scoped-swm-recovery.d.ts.map +1 -0
- package/dist/sync/graph-scoped-swm-recovery.js +329 -0
- package/dist/sync/graph-scoped-swm-recovery.js.map +1 -0
- package/dist/sync/on-connect/sync-on-connect.d.ts +4 -13
- package/dist/sync/on-connect/sync-on-connect.d.ts.map +1 -1
- package/dist/sync/on-connect/sync-on-connect.js +60 -60
- package/dist/sync/on-connect/sync-on-connect.js.map +1 -1
- package/dist/sync/oversize-filter.d.ts +19 -0
- package/dist/sync/oversize-filter.d.ts.map +1 -1
- package/dist/sync/oversize-filter.js +67 -2
- package/dist/sync/oversize-filter.js.map +1 -1
- package/dist/sync/policy.d.ts +24 -0
- package/dist/sync/policy.d.ts.map +1 -0
- package/dist/sync/policy.js +81 -0
- package/dist/sync/policy.js.map +1 -0
- package/dist/sync/priority-admission-queue.d.ts +74 -0
- package/dist/sync/priority-admission-queue.d.ts.map +1 -0
- package/dist/sync/priority-admission-queue.js +260 -0
- package/dist/sync/priority-admission-queue.js.map +1 -0
- package/dist/sync/requester/changelog-sync.d.ts +29 -20
- package/dist/sync/requester/changelog-sync.d.ts.map +1 -1
- package/dist/sync/requester/changelog-sync.js +78 -30
- package/dist/sync/requester/changelog-sync.js.map +1 -1
- package/dist/sync/requester/durable-sync.d.ts +21 -1
- package/dist/sync/requester/durable-sync.d.ts.map +1 -1
- package/dist/sync/requester/durable-sync.js +308 -25
- package/dist/sync/requester/durable-sync.js.map +1 -1
- package/dist/sync/requester/graph-scoped-materialization.d.ts +33 -0
- package/dist/sync/requester/graph-scoped-materialization.d.ts.map +1 -0
- package/dist/sync/requester/graph-scoped-materialization.js +242 -0
- package/dist/sync/requester/graph-scoped-materialization.js.map +1 -0
- package/dist/sync/requester/ordered-sync.d.ts +24 -0
- package/dist/sync/requester/ordered-sync.d.ts.map +1 -0
- package/dist/sync/requester/ordered-sync.js +45 -0
- package/dist/sync/requester/ordered-sync.js.map +1 -0
- package/dist/sync/requester/page-fetch.d.ts +13 -2
- package/dist/sync/requester/page-fetch.d.ts.map +1 -1
- package/dist/sync/requester/page-fetch.js +53 -5
- package/dist/sync/requester/page-fetch.js.map +1 -1
- package/dist/sync/requester/shared-memory-sync.d.ts +36 -0
- package/dist/sync/requester/shared-memory-sync.d.ts.map +1 -1
- package/dist/sync/requester/shared-memory-sync.js +59 -12
- package/dist/sync/requester/shared-memory-sync.js.map +1 -1
- package/dist/sync/requester/swm-recovery-apply.d.ts +2 -0
- package/dist/sync/requester/swm-recovery-apply.d.ts.map +1 -1
- package/dist/sync/requester/swm-recovery-apply.js.map +1 -1
- package/dist/sync/requester/swm-recovery.d.ts +43 -30
- package/dist/sync/requester/swm-recovery.d.ts.map +1 -1
- package/dist/sync/requester/swm-recovery.js +239 -16
- package/dist/sync/requester/swm-recovery.js.map +1 -1
- package/dist/sync/responder/durable-meta-admission.d.ts +10 -0
- package/dist/sync/responder/durable-meta-admission.d.ts.map +1 -0
- package/dist/sync/responder/durable-meta-admission.js +28 -0
- package/dist/sync/responder/durable-meta-admission.js.map +1 -0
- package/dist/sync/responder/graph-plan.d.ts +82 -1
- package/dist/sync/responder/graph-plan.d.ts.map +1 -1
- package/dist/sync/responder/graph-plan.js +1375 -217
- package/dist/sync/responder/graph-plan.js.map +1 -1
- package/dist/sync/responder/snapshot-budget.d.ts +2 -0
- package/dist/sync/responder/snapshot-budget.d.ts.map +1 -1
- package/dist/sync/responder/snapshot-budget.js +3 -0
- package/dist/sync/responder/snapshot-budget.js.map +1 -1
- package/dist/sync/responder/snapshot-cache.d.ts +22 -0
- package/dist/sync/responder/snapshot-cache.d.ts.map +1 -1
- package/dist/sync/responder/snapshot-cache.js +103 -25
- package/dist/sync/responder/snapshot-cache.js.map +1 -1
- package/dist/sync/responder/sync-handler.d.ts +13 -2
- package/dist/sync/responder/sync-handler.d.ts.map +1 -1
- package/dist/sync/responder/sync-handler.js +261 -129
- package/dist/sync/responder/sync-handler.js.map +1 -1
- package/dist/sync-verify-worker-impl.d.ts +2 -1
- package/dist/sync-verify-worker-impl.d.ts.map +1 -1
- package/dist/sync-verify-worker-impl.js +89 -181
- package/dist/sync-verify-worker-impl.js.map +1 -1
- package/dist/sync-verify-worker.d.ts +34 -1
- package/dist/sync-verify-worker.d.ts.map +1 -1
- package/dist/sync-verify-worker.js +39 -2
- package/dist/sync-verify-worker.js.map +1 -1
- package/dist/vm-reconcile-service.d.ts +40 -0
- package/dist/vm-reconcile-service.d.ts.map +1 -0
- package/dist/vm-reconcile-service.js +32 -0
- package/dist/vm-reconcile-service.js.map +1 -0
- package/package.json +7 -7
- package/dist/finalized-lifecycle-swm.d.ts +0 -53
- package/dist/finalized-lifecycle-swm.d.ts.map +0 -1
- package/dist/finalized-lifecycle-swm.js +0 -80
- package/dist/finalized-lifecycle-swm.js.map +0 -1
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
* with a single trailing re-run if more events land mid-sweep.
|
|
24
24
|
*/
|
|
25
25
|
import { type CursorState } from './reconcile-cursor.js';
|
|
26
|
+
import { type VmReconcileSource } from './vm-reconcile-service.js';
|
|
26
27
|
/**
|
|
27
28
|
* Outcome of attempting to reconcile a single per-CG registration ordinal.
|
|
28
29
|
* - `reconciled` — promoted to VM this pass; eligible to advance the watermark
|
|
@@ -81,20 +82,71 @@ export interface ReconcileResult {
|
|
|
81
82
|
* if it moved. Mutates `state` in place (the agent owns one `CursorState` per CG).
|
|
82
83
|
*/
|
|
83
84
|
export declare function reconcileContextGraph(deps: ChainReconcilerDeps, state: CursorState, localCgId: string, onChainCgId: bigint): Promise<ReconcileResult>;
|
|
85
|
+
export interface VmReconcileDispatcherOptions {
|
|
86
|
+
concurrency?: number;
|
|
87
|
+
maxPending?: number;
|
|
88
|
+
maxForegroundBurst?: number;
|
|
89
|
+
}
|
|
84
90
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
91
|
+
* Single admission and scheduling policy for chain-driven VM reconciliation.
|
|
92
|
+
*
|
|
93
|
+
* This dispatcher owns per-CG coalescing, live failure holds, pending priority
|
|
94
|
+
* upgrades, global concurrency, overload bounds, foreground fairness, and
|
|
95
|
+
* shutdown. Keeping those decisions in one state machine prevents a CG from
|
|
96
|
+
* looking active to one scheduler while it is only queued in another.
|
|
89
97
|
*/
|
|
90
|
-
export declare class
|
|
98
|
+
export declare class VmReconcileDispatcher<T> {
|
|
91
99
|
private readonly run;
|
|
92
|
-
private readonly
|
|
93
|
-
private
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
100
|
+
private readonly onFailure;
|
|
101
|
+
private active;
|
|
102
|
+
private queued;
|
|
103
|
+
private sequence;
|
|
104
|
+
private foregroundBurst;
|
|
105
|
+
private closed;
|
|
106
|
+
private readonly states;
|
|
107
|
+
private readonly pending;
|
|
108
|
+
private readonly idleWaiters;
|
|
109
|
+
private readonly keyIdleWaiters;
|
|
110
|
+
private readonly concurrency;
|
|
111
|
+
private readonly maxPending;
|
|
112
|
+
private readonly maxForegroundBurst;
|
|
113
|
+
constructor(run: (key: string, source: VmReconcileSource) => Promise<T>, onFailure: (key: string, error: unknown) => void, options?: VmReconcileDispatcherOptions);
|
|
114
|
+
/** Enqueue a low-latency chain-event nudge; suppressed until a sweep after failure. */
|
|
115
|
+
triggerLive(key: string): void;
|
|
116
|
+
/** Enqueue the reliability path; every periodic sweep gets one failure retry. */
|
|
117
|
+
triggerPeriodic(key: string): void;
|
|
118
|
+
/**
|
|
119
|
+
* Attempt periodic admission without hiding bounded-queue overflow.
|
|
120
|
+
*
|
|
121
|
+
* Sweep orchestration retains its round-robin cursor at the first rejected
|
|
122
|
+
* key, so stable iteration order cannot permanently starve the tail.
|
|
123
|
+
*/
|
|
124
|
+
tryTriggerPeriodic(key: string): boolean;
|
|
125
|
+
/** Operator path; errors and the typed domain result propagate to the API. */
|
|
126
|
+
triggerManual(key: string): Promise<T>;
|
|
127
|
+
/** Typed admission used by the canonical agent operation and focused tests. */
|
|
128
|
+
dispatch(key: string, source: VmReconcileSource): Promise<T>;
|
|
97
129
|
isInFlight(key: string): boolean;
|
|
130
|
+
pendingSource(key: string): VmReconcileSource | undefined;
|
|
131
|
+
snapshot(): {
|
|
132
|
+
active: number;
|
|
133
|
+
queued: number;
|
|
134
|
+
closed: boolean;
|
|
135
|
+
};
|
|
136
|
+
/** Reject queued work immediately and wait only for already-active work. */
|
|
137
|
+
close(): Promise<void>;
|
|
138
|
+
/** Wait globally for shutdown, or for one CG including its trailing pass. */
|
|
139
|
+
waitForIdle(key?: string): Promise<void>;
|
|
140
|
+
private stateFor;
|
|
141
|
+
private canAdmitWithoutOverflow;
|
|
142
|
+
private admit;
|
|
143
|
+
private createQueuedWork;
|
|
144
|
+
private sortPending;
|
|
145
|
+
private mergeWork;
|
|
146
|
+
private takeNext;
|
|
147
|
+
private resolveIdleWaiters;
|
|
148
|
+
private resolveKeyIdleWaiters;
|
|
149
|
+
private drain;
|
|
98
150
|
}
|
|
99
151
|
/**
|
|
100
152
|
* Bounded LRU-ish dedupe set for recently-reconciled UALs, so a burst of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-reconciler.d.ts","sourceRoot":"","sources":["../src/chain-reconciler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"chain-reconciler.d.ts","sourceRoot":"","sources":["../src/chain-reconciler.ts"],"names":[],"mappings":"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"}
|
package/dist/chain-reconciler.js
CHANGED
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
* with a single trailing re-run if more events land mid-sweep.
|
|
24
24
|
*/
|
|
25
25
|
import { recordCompletion, absorbConfirmed, ordinalsToReconcile, } from './reconcile-cursor.js';
|
|
26
|
+
import { VmReconcileQueueClosedError, VmReconcileQueueFullError, } from './vm-reconcile-service.js';
|
|
26
27
|
/**
|
|
27
28
|
* One sweep pass for a single CG: reconcile every ordinal in `[watermark, head)`
|
|
28
29
|
* (skipping ones already completed and held in the cursor), then advance the
|
|
@@ -32,6 +33,13 @@ import { recordCompletion, absorbConfirmed, ordinalsToReconcile, } from './recon
|
|
|
32
33
|
export async function reconcileContextGraph(deps, state, localCgId, onChainCgId) {
|
|
33
34
|
const head = await deps.getKCCount(onChainCgId);
|
|
34
35
|
const before = state.watermark;
|
|
36
|
+
// The persisted contiguous watermark is durable completeness evidence. If
|
|
37
|
+
// it already covers the chain head, avoid the head-block RPC and all ordinal
|
|
38
|
+
// work. A watermark ahead of the observed head is surfaced by the caller as
|
|
39
|
+
// an evidence mismatch, but is equally non-actionable in this pass.
|
|
40
|
+
if (before >= head) {
|
|
41
|
+
return { head, watermark: before, reconciled: 0, pending: 0 };
|
|
42
|
+
}
|
|
35
43
|
// Keep transient head-fetch failures distinct from truly head-less chains.
|
|
36
44
|
// A thrown head read means the chain is temporarily unavailable; skip
|
|
37
45
|
// materialization for this pass so reconcileOrdinal never falls back to a
|
|
@@ -80,39 +88,324 @@ export async function reconcileContextGraph(deps, state, localCgId, onChainCgId)
|
|
|
80
88
|
}
|
|
81
89
|
return { head, watermark: state.watermark, reconciled, pending };
|
|
82
90
|
}
|
|
91
|
+
function vmReconcileSourceRank(source) {
|
|
92
|
+
if (source === 'manual')
|
|
93
|
+
return 2;
|
|
94
|
+
if (source === 'live')
|
|
95
|
+
return 1;
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
83
98
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
99
|
+
* Single admission and scheduling policy for chain-driven VM reconciliation.
|
|
100
|
+
*
|
|
101
|
+
* This dispatcher owns per-CG coalescing, live failure holds, pending priority
|
|
102
|
+
* upgrades, global concurrency, overload bounds, foreground fairness, and
|
|
103
|
+
* shutdown. Keeping those decisions in one state machine prevents a CG from
|
|
104
|
+
* looking active to one scheduler while it is only queued in another.
|
|
88
105
|
*/
|
|
89
|
-
export class
|
|
106
|
+
export class VmReconcileDispatcher {
|
|
90
107
|
run;
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
108
|
+
onFailure;
|
|
109
|
+
active = 0;
|
|
110
|
+
queued = 0;
|
|
111
|
+
sequence = 0;
|
|
112
|
+
foregroundBurst = 0;
|
|
113
|
+
closed = false;
|
|
114
|
+
states = new Map();
|
|
115
|
+
pending = [];
|
|
116
|
+
idleWaiters = new Set();
|
|
117
|
+
keyIdleWaiters = new Map();
|
|
118
|
+
concurrency;
|
|
119
|
+
maxPending;
|
|
120
|
+
maxForegroundBurst;
|
|
121
|
+
constructor(run, onFailure, options = {}) {
|
|
94
122
|
this.run = run;
|
|
123
|
+
this.onFailure = onFailure;
|
|
124
|
+
const { concurrency = 1, maxPending = 256, maxForegroundBurst = 8, } = options;
|
|
125
|
+
if (!Number.isSafeInteger(concurrency) || concurrency < 1) {
|
|
126
|
+
throw new Error(`VM reconcile concurrency must be a positive safe integer, got ${concurrency}`);
|
|
127
|
+
}
|
|
128
|
+
if (!Number.isSafeInteger(maxPending) || maxPending < 1) {
|
|
129
|
+
throw new Error(`VM reconcile maxPending must be a positive safe integer, got ${maxPending}`);
|
|
130
|
+
}
|
|
131
|
+
if (!Number.isSafeInteger(maxForegroundBurst) || maxForegroundBurst < 1) {
|
|
132
|
+
throw new Error(`VM reconcile maxForegroundBurst must be a positive safe integer, got ${maxForegroundBurst}`);
|
|
133
|
+
}
|
|
134
|
+
this.concurrency = concurrency;
|
|
135
|
+
this.maxPending = maxPending;
|
|
136
|
+
this.maxForegroundBurst = maxForegroundBurst;
|
|
137
|
+
}
|
|
138
|
+
/** Enqueue a low-latency chain-event nudge; suppressed until a sweep after failure. */
|
|
139
|
+
triggerLive(key) {
|
|
140
|
+
if (this.states.get(key)?.hold === 'live-blocked')
|
|
141
|
+
return;
|
|
142
|
+
void this.admit(key, 'live').catch(() => undefined);
|
|
143
|
+
}
|
|
144
|
+
/** Enqueue the reliability path; every periodic sweep gets one failure retry. */
|
|
145
|
+
triggerPeriodic(key) {
|
|
146
|
+
void this.admit(key, 'periodic').catch(() => undefined);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Attempt periodic admission without hiding bounded-queue overflow.
|
|
150
|
+
*
|
|
151
|
+
* Sweep orchestration retains its round-robin cursor at the first rejected
|
|
152
|
+
* key, so stable iteration order cannot permanently starve the tail.
|
|
153
|
+
*/
|
|
154
|
+
tryTriggerPeriodic(key) {
|
|
155
|
+
if (!this.canAdmitWithoutOverflow(key))
|
|
156
|
+
return false;
|
|
157
|
+
void this.admit(key, 'periodic').catch(() => undefined);
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
/** Operator path; errors and the typed domain result propagate to the API. */
|
|
161
|
+
triggerManual(key) {
|
|
162
|
+
return this.dispatch(key, 'manual');
|
|
163
|
+
}
|
|
164
|
+
/** Typed admission used by the canonical agent operation and focused tests. */
|
|
165
|
+
dispatch(key, source) {
|
|
166
|
+
return this.admit(key, source);
|
|
167
|
+
}
|
|
168
|
+
isInFlight(key) {
|
|
169
|
+
const state = this.states.get(key);
|
|
170
|
+
return Boolean(state?.active || state?.pending || state?.trailing);
|
|
171
|
+
}
|
|
172
|
+
pendingSource(key) {
|
|
173
|
+
return this.states.get(key)?.pending?.source;
|
|
174
|
+
}
|
|
175
|
+
snapshot() {
|
|
176
|
+
return { active: this.active, queued: this.queued, closed: this.closed };
|
|
177
|
+
}
|
|
178
|
+
/** Reject queued work immediately and wait only for already-active work. */
|
|
179
|
+
close() {
|
|
180
|
+
if (!this.closed) {
|
|
181
|
+
this.closed = true;
|
|
182
|
+
const error = new VmReconcileQueueClosedError();
|
|
183
|
+
for (const work of this.pending.splice(0)) {
|
|
184
|
+
const state = this.states.get(work.key);
|
|
185
|
+
if (state?.pending === work)
|
|
186
|
+
state.pending = undefined;
|
|
187
|
+
work.reject(error);
|
|
188
|
+
}
|
|
189
|
+
for (const [key, state] of this.states) {
|
|
190
|
+
if (state.trailing) {
|
|
191
|
+
state.trailing.reject(error);
|
|
192
|
+
state.trailing = undefined;
|
|
193
|
+
}
|
|
194
|
+
if (!state.active)
|
|
195
|
+
this.states.delete(key);
|
|
196
|
+
this.resolveKeyIdleWaiters(key);
|
|
197
|
+
}
|
|
198
|
+
this.queued = 0;
|
|
199
|
+
this.resolveIdleWaiters();
|
|
200
|
+
}
|
|
201
|
+
return this.waitForIdle();
|
|
202
|
+
}
|
|
203
|
+
/** Wait globally for shutdown, or for one CG including its trailing pass. */
|
|
204
|
+
waitForIdle(key) {
|
|
205
|
+
if (key !== undefined) {
|
|
206
|
+
if (!this.isInFlight(key))
|
|
207
|
+
return Promise.resolve();
|
|
208
|
+
return new Promise((resolve) => {
|
|
209
|
+
let waiters = this.keyIdleWaiters.get(key);
|
|
210
|
+
if (!waiters) {
|
|
211
|
+
waiters = new Set();
|
|
212
|
+
this.keyIdleWaiters.set(key, waiters);
|
|
213
|
+
}
|
|
214
|
+
waiters.add(resolve);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
if (this.active === 0 && this.queued === 0)
|
|
218
|
+
return Promise.resolve();
|
|
219
|
+
return new Promise((resolve) => this.idleWaiters.add(resolve));
|
|
95
220
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (
|
|
99
|
-
|
|
100
|
-
this.
|
|
101
|
-
return existing;
|
|
221
|
+
stateFor(key) {
|
|
222
|
+
let state = this.states.get(key);
|
|
223
|
+
if (!state) {
|
|
224
|
+
state = { hold: 'ready' };
|
|
225
|
+
this.states.set(key, state);
|
|
102
226
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
227
|
+
return state;
|
|
228
|
+
}
|
|
229
|
+
canAdmitWithoutOverflow(key) {
|
|
230
|
+
if (this.closed)
|
|
231
|
+
return false;
|
|
232
|
+
const state = this.states.get(key);
|
|
233
|
+
if (state?.pending || state?.trailing)
|
|
234
|
+
return true;
|
|
235
|
+
return this.queued < this.maxPending;
|
|
236
|
+
}
|
|
237
|
+
admit(key, source) {
|
|
238
|
+
if (this.closed)
|
|
239
|
+
return Promise.reject(new VmReconcileQueueClosedError());
|
|
240
|
+
const state = this.stateFor(key);
|
|
241
|
+
if (state.pending) {
|
|
242
|
+
this.mergeWork(state.pending, source);
|
|
243
|
+
this.sortPending();
|
|
244
|
+
return state.pending.promise;
|
|
245
|
+
}
|
|
246
|
+
if (state.active) {
|
|
247
|
+
// An operator request must observe a head snapshot taken no earlier than
|
|
248
|
+
// that request. It may share an already-active operator pass, but never
|
|
249
|
+
// an older automatic pass. In that case it joins or creates one fresh
|
|
250
|
+
// trailing pass; repeated operator requests coalesce there.
|
|
251
|
+
if (source === 'manual' && state.active.source === 'manual') {
|
|
252
|
+
return state.active.promise;
|
|
253
|
+
}
|
|
254
|
+
if (state.trailing) {
|
|
255
|
+
this.mergeWork(state.trailing, source);
|
|
256
|
+
return state.trailing.promise;
|
|
257
|
+
}
|
|
258
|
+
const trailing = this.createQueuedWork(key, source);
|
|
259
|
+
if (!trailing)
|
|
260
|
+
return Promise.reject(new VmReconcileQueueFullError(this.maxPending));
|
|
261
|
+
state.trailing = trailing;
|
|
262
|
+
return trailing.promise;
|
|
263
|
+
}
|
|
264
|
+
const work = this.createQueuedWork(key, source);
|
|
265
|
+
if (!work) {
|
|
266
|
+
if (state.hold === 'ready')
|
|
267
|
+
this.states.delete(key);
|
|
268
|
+
return Promise.reject(new VmReconcileQueueFullError(this.maxPending));
|
|
269
|
+
}
|
|
270
|
+
state.pending = work;
|
|
271
|
+
this.pending.push(work);
|
|
272
|
+
this.sortPending();
|
|
273
|
+
this.drain();
|
|
274
|
+
return work.promise;
|
|
275
|
+
}
|
|
276
|
+
createQueuedWork(key, source) {
|
|
277
|
+
if (this.queued >= this.maxPending)
|
|
278
|
+
return undefined;
|
|
279
|
+
let resolveWork;
|
|
280
|
+
let rejectWork;
|
|
281
|
+
const promise = new Promise((resolve, reject) => {
|
|
282
|
+
resolveWork = resolve;
|
|
283
|
+
rejectWork = reject;
|
|
109
284
|
});
|
|
110
|
-
this.
|
|
111
|
-
return
|
|
285
|
+
this.queued += 1;
|
|
286
|
+
return {
|
|
287
|
+
key,
|
|
288
|
+
source,
|
|
289
|
+
automatic: source !== 'manual',
|
|
290
|
+
periodicRequested: source === 'periodic',
|
|
291
|
+
sequence: this.sequence++,
|
|
292
|
+
promise,
|
|
293
|
+
resolve: resolveWork,
|
|
294
|
+
reject: rejectWork,
|
|
295
|
+
};
|
|
112
296
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
297
|
+
sortPending() {
|
|
298
|
+
this.pending.sort((a, b) => {
|
|
299
|
+
const priorityDelta = (a.source === 'periodic' ? 1 : 0)
|
|
300
|
+
- (b.source === 'periodic' ? 1 : 0);
|
|
301
|
+
return priorityDelta || a.sequence - b.sequence;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
mergeWork(work, source) {
|
|
305
|
+
work.automatic ||= source !== 'manual';
|
|
306
|
+
work.periodicRequested ||= source === 'periodic';
|
|
307
|
+
if (vmReconcileSourceRank(source) > vmReconcileSourceRank(work.source)) {
|
|
308
|
+
work.source = source;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
takeNext() {
|
|
312
|
+
if (this.pending.length === 0)
|
|
313
|
+
return undefined;
|
|
314
|
+
let index = 0;
|
|
315
|
+
if (this.foregroundBurst >= this.maxForegroundBurst) {
|
|
316
|
+
const backgroundIndex = this.pending.findIndex((work) => work.source === 'periodic');
|
|
317
|
+
if (backgroundIndex >= 0)
|
|
318
|
+
index = backgroundIndex;
|
|
319
|
+
}
|
|
320
|
+
const [work] = this.pending.splice(index, 1);
|
|
321
|
+
if (!work)
|
|
322
|
+
return undefined;
|
|
323
|
+
const state = this.states.get(work.key);
|
|
324
|
+
if (state?.pending === work)
|
|
325
|
+
state.pending = undefined;
|
|
326
|
+
this.queued -= 1;
|
|
327
|
+
if (work.source !== 'periodic')
|
|
328
|
+
this.foregroundBurst += 1;
|
|
329
|
+
else
|
|
330
|
+
this.foregroundBurst = 0;
|
|
331
|
+
return work;
|
|
332
|
+
}
|
|
333
|
+
resolveIdleWaiters() {
|
|
334
|
+
if (this.active !== 0 || this.queued !== 0)
|
|
335
|
+
return;
|
|
336
|
+
for (const resolve of this.idleWaiters)
|
|
337
|
+
resolve();
|
|
338
|
+
this.idleWaiters.clear();
|
|
339
|
+
}
|
|
340
|
+
resolveKeyIdleWaiters(key) {
|
|
341
|
+
if (this.isInFlight(key))
|
|
342
|
+
return;
|
|
343
|
+
const waiters = this.keyIdleWaiters.get(key);
|
|
344
|
+
if (!waiters)
|
|
345
|
+
return;
|
|
346
|
+
this.keyIdleWaiters.delete(key);
|
|
347
|
+
for (const resolve of waiters)
|
|
348
|
+
resolve();
|
|
349
|
+
}
|
|
350
|
+
drain() {
|
|
351
|
+
while (!this.closed && this.active < this.concurrency && this.pending.length > 0) {
|
|
352
|
+
const work = this.takeNext();
|
|
353
|
+
if (!work)
|
|
354
|
+
return;
|
|
355
|
+
const state = this.stateFor(work.key);
|
|
356
|
+
state.active = work;
|
|
357
|
+
if (work.periodicRequested)
|
|
358
|
+
state.hold = 'ready';
|
|
359
|
+
this.active += 1;
|
|
360
|
+
let failure;
|
|
361
|
+
void Promise.resolve()
|
|
362
|
+
.then(() => this.run(work.key, work.source))
|
|
363
|
+
.then((result) => {
|
|
364
|
+
// Any successful full pass, including an operator-forced recovery,
|
|
365
|
+
// proves the failed-live hold can be released.
|
|
366
|
+
state.hold = 'ready';
|
|
367
|
+
work.resolve(result);
|
|
368
|
+
}, (error) => {
|
|
369
|
+
failure = error;
|
|
370
|
+
if (work.automatic) {
|
|
371
|
+
state.hold = 'live-blocked';
|
|
372
|
+
try {
|
|
373
|
+
this.onFailure(work.key, error);
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
// Observability must never break admission or callers.
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
work.reject(error);
|
|
380
|
+
})
|
|
381
|
+
.finally(() => {
|
|
382
|
+
this.active -= 1;
|
|
383
|
+
state.active = undefined;
|
|
384
|
+
const trailing = state.trailing;
|
|
385
|
+
state.trailing = undefined;
|
|
386
|
+
if (trailing
|
|
387
|
+
&& state.hold === 'live-blocked'
|
|
388
|
+
&& trailing.source === 'live'
|
|
389
|
+
&& !trailing.periodicRequested) {
|
|
390
|
+
// A failing live pass must not immediately retry itself. Preserve
|
|
391
|
+
// the failure hold until the periodic reliability path arrives.
|
|
392
|
+
// A manual completion boundary is never suppressed by this rule.
|
|
393
|
+
this.queued -= 1;
|
|
394
|
+
trailing.reject(failure);
|
|
395
|
+
}
|
|
396
|
+
else if (trailing && !this.closed) {
|
|
397
|
+
state.pending = trailing;
|
|
398
|
+
this.pending.push(trailing);
|
|
399
|
+
this.sortPending();
|
|
400
|
+
}
|
|
401
|
+
else if (!trailing && state.hold === 'ready') {
|
|
402
|
+
this.states.delete(work.key);
|
|
403
|
+
}
|
|
404
|
+
this.drain();
|
|
405
|
+
this.resolveIdleWaiters();
|
|
406
|
+
this.resolveKeyIdleWaiters(work.key);
|
|
407
|
+
});
|
|
408
|
+
}
|
|
116
409
|
}
|
|
117
410
|
}
|
|
118
411
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-reconciler.js","sourceRoot":"","sources":["../src/chain-reconciler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAEL,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAuD/B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAyB,EACzB,KAAkB,EAClB,SAAiB,EACjB,WAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAE/B,2EAA2E;IAC3E,sEAAsE;IACtE,0EAA0E;IAC1E,iDAAiD;IACjD,IAAI,SAA6B,CAAC;IAClC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAe,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,aAAa,SAAS,6CAA6C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnI,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,oEAAoE;IACpE,IAAI,SAAS,KAAK,SAAS;QAAE,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAEvF,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACpE,UAAU,IAAI,CAAC,CAAC;gBAChB,qEAAqE;gBACrE,sEAAsE;gBACtE,mCAAmC;gBACnC,gBAAgB,CACd,KAAK,EACL,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,EAC7C,SAAS,IAAI,OAAO,CAAC,WAAW,EAChC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CACrD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,aAAa,SAAS,eAAe,MAAM,OAAO,KAAK,CAAC,SAAS,UAAU,IAAI,gBAAgB,UAAU,aAAa,OAAO,GAAG,CAAC,CAAC;IAC7I,CAAC;SAAM,IAAI,UAAU,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,aAAa,SAAS,uBAAuB,KAAK,CAAC,SAAS,UAAU,IAAI,gBAAgB,UAAU,aAAa,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrL,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IAIA;IAHZ,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC5C,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,YAA6B,GAAmC;QAAnC,QAAG,GAAH,GAAG,CAAgC;IAAG,CAAC;IAEpE,OAAO,CAAC,GAAW;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,mEAAmE;YACnE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;aAC1B,KAAK,CAAC,GAAG,EAAE,GAAgD,CAAC,CAAC;aAC7D,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;gBAAE,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,sDAAsD;IACtD,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAEM;IADZ,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,YAA6B,MAAM,IAAI;QAAV,QAAG,GAAH,GAAG,CAAO;IAAG,CAAC;IAE3C,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC7C,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,cAAc,CAAC,MAAc,EAAE,MAAe;QAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"chain-reconciler.js","sourceRoot":"","sources":["../src/chain-reconciler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nominal capability issued while one context graph's admission lane is held.
|
|
3
|
+
* The brand is intentionally private to this module: callers can pass tokens
|
|
4
|
+
* around, but cannot construct one without an unsafe type assertion. Runtime
|
|
5
|
+
* validation below rejects asserted/forged objects as well.
|
|
6
|
+
*/
|
|
7
|
+
declare const contextGraphJoinAdmissionLockTokenBrand: unique symbol;
|
|
8
|
+
export type ContextGraphJoinAdmissionLockToken = Readonly<{
|
|
9
|
+
[contextGraphJoinAdmissionLockTokenBrand]: true;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* Process-local, per-context-graph admission serializer.
|
|
13
|
+
*
|
|
14
|
+
* Tokens are registered in this manager's private WeakMap only for the
|
|
15
|
+
* lifetime of the callback. Consequently a token from another manager, for a
|
|
16
|
+
* different context graph, or retained after the callback returns is invalid.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ContextGraphJoinAdmissionLockManager {
|
|
19
|
+
private readonly queues;
|
|
20
|
+
private readonly liveTokens;
|
|
21
|
+
withLock<T>(contextGraphId: string, operation: (token: ContextGraphJoinAdmissionLockToken) => Promise<T>): Promise<T>;
|
|
22
|
+
assertHeld(contextGraphId: string, token: ContextGraphJoinAdmissionLockToken | undefined): void;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=context-graph-join-admission-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-graph-join-admission-lock.d.ts","sourceRoot":"","sources":["../src/context-graph-join-admission-lock.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,QAAA,MAAM,uCAAuC,EAAE,OAAO,MAErD,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG,QAAQ,CAAC;IACxD,CAAC,uCAAuC,CAAC,EAAE,IAAI,CAAC;CACjD,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,qBAAa,oCAAoC;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAEtD,QAAQ,CAAC,CAAC,EACd,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,CAAC,KAAK,EAAE,kCAAkC,KAAK,OAAO,CAAC,CAAC,CAAC,GACnE,OAAO,CAAC,CAAC,CAAC;IAuBb,UAAU,CACR,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,kCAAkC,GAAG,SAAS,GACpD,IAAI;CAYR"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Nominal capability issued while one context graph's admission lane is held.
|
|
4
|
+
* The brand is intentionally private to this module: callers can pass tokens
|
|
5
|
+
* around, but cannot construct one without an unsafe type assertion. Runtime
|
|
6
|
+
* validation below rejects asserted/forged objects as well.
|
|
7
|
+
*/
|
|
8
|
+
const contextGraphJoinAdmissionLockTokenBrand = Symbol('ContextGraphJoinAdmissionLockToken');
|
|
9
|
+
/**
|
|
10
|
+
* Process-local, per-context-graph admission serializer.
|
|
11
|
+
*
|
|
12
|
+
* Tokens are registered in this manager's private WeakMap only for the
|
|
13
|
+
* lifetime of the callback. Consequently a token from another manager, for a
|
|
14
|
+
* different context graph, or retained after the callback returns is invalid.
|
|
15
|
+
*/
|
|
16
|
+
export class ContextGraphJoinAdmissionLockManager {
|
|
17
|
+
queues = new Map();
|
|
18
|
+
liveTokens = new WeakMap();
|
|
19
|
+
async withLock(contextGraphId, operation) {
|
|
20
|
+
const previous = this.queues.get(contextGraphId) ?? Promise.resolve();
|
|
21
|
+
let release;
|
|
22
|
+
const gate = new Promise((resolve) => { release = resolve; });
|
|
23
|
+
const current = previous.catch(() => { }).then(() => gate);
|
|
24
|
+
this.queues.set(contextGraphId, current);
|
|
25
|
+
await previous.catch(() => { });
|
|
26
|
+
const token = Object.freeze({
|
|
27
|
+
[contextGraphJoinAdmissionLockTokenBrand]: true,
|
|
28
|
+
});
|
|
29
|
+
this.liveTokens.set(token, contextGraphId);
|
|
30
|
+
try {
|
|
31
|
+
return await operation(token);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
this.liveTokens.delete(token);
|
|
35
|
+
release();
|
|
36
|
+
if (this.queues.get(contextGraphId) === current) {
|
|
37
|
+
this.queues.delete(contextGraphId);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
assertHeld(contextGraphId, token) {
|
|
42
|
+
if (token === undefined
|
|
43
|
+
|| typeof token !== 'object'
|
|
44
|
+
|| token === null
|
|
45
|
+
|| this.liveTokens.get(token) !== contextGraphId) {
|
|
46
|
+
throw new Error(`Context graph admission mutation for "${contextGraphId}" requires its live admission-lock token.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=context-graph-join-admission-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-graph-join-admission-lock.js","sourceRoot":"","sources":["../src/context-graph-join-admission-lock.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AACH,MAAM,uCAAuC,GAAkB,MAAM,CACnE,oCAAoC,CACrC,CAAC;AAMF;;;;;;GAMG;AACH,MAAM,OAAO,oCAAoC;IAC9B,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1C,UAAU,GAAG,IAAI,OAAO,EAAkB,CAAC;IAE5D,KAAK,CAAC,QAAQ,CACZ,cAAsB,EACtB,SAAoE;QAEpE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,IAAI,OAAoB,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,CAAC,uCAAuC,CAAC,EAAE,IAAI;SAChD,CAAuC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO,EAAE,CAAC;YACV,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,OAAO,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CACR,cAAsB,EACtB,KAAqD;QAErD,IACE,KAAK,KAAK,SAAS;eAChB,OAAO,KAAK,KAAK,QAAQ;eACzB,KAAK,KAAK,IAAI;eACd,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,cAAc,EAChD,CAAC;YACD,MAAM,IAAI,KAAK,CACb,yCAAyC,cAAc,2CAA2C,CACnG,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|