@powerhousedao/reactor 6.2.2-dev.50 → 6.2.2-dev.52
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/{build-worker-executor-CkuJGUlJ.js → build-worker-executor-NT9b3rNm.js} +2 -2
- package/dist/{build-worker-executor-CkuJGUlJ.js.map → build-worker-executor-NT9b3rNm.js.map} +1 -1
- package/dist/{drive-container-types-BoY5t12r.js → drive-container-types-RZa1wukO.js} +193 -167
- package/dist/drive-container-types-RZa1wukO.js.map +1 -0
- package/dist/entry.js +2 -2
- package/dist/index.d.ts +274 -101
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +135 -11
- package/dist/index.js.map +1 -1
- package/dist/projection-entry.js +2 -2
- package/dist/{worker-BCMw-hBw.js → worker-sw2vjrd3.js} +2 -2
- package/dist/{worker-BCMw-hBw.js.map → worker-sw2vjrd3.js.map} +1 -1
- package/package.json +4 -4
- package/dist/drive-container-types-BoY5t12r.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as DocumentMetaCache,
|
|
1
|
+
import { _ as DocumentMetaCache, c as KyselyKeyframeStore, f as KyselyExecutionScope, g as KyselyOperationIndex, h as KyselyWriteCache, l as DocumentModelRegistry, m as EventBus, n as REACTOR_SCHEMA, s as KyselyOperationStore, t as DEFAULT_DRIVE_CONTAINER_TYPES, u as SimpleJobExecutor, v as CollectionMembershipCache } from "./drive-container-types-RZa1wukO.js";
|
|
2
2
|
import { n as ReactorEventTypes } from "./types-DMKLa0Ok.js";
|
|
3
3
|
//#region src/executor/worker/build-worker-executor.ts
|
|
4
4
|
async function defaultLoadFactory(spec) {
|
|
@@ -80,4 +80,4 @@ async function buildWorkerExecutor(options) {
|
|
|
80
80
|
//#endregion
|
|
81
81
|
export { defaultLoadFactory as n, buildWorkerExecutor as t };
|
|
82
82
|
|
|
83
|
-
//# sourceMappingURL=build-worker-executor-
|
|
83
|
+
//# sourceMappingURL=build-worker-executor-NT9b3rNm.js.map
|
package/dist/{build-worker-executor-CkuJGUlJ.js.map → build-worker-executor-NT9b3rNm.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-worker-executor-
|
|
1
|
+
{"version":3,"file":"build-worker-executor-NT9b3rNm.js","names":[],"sources":["../src/executor/worker/build-worker-executor.ts"],"sourcesContent":["import type {\n DocumentModelModule,\n OperationWithContext,\n} from \"@powerhousedao/shared/document-model\";\nimport type { ILogger } from \"document-model\";\nimport type { Kysely } from \"kysely\";\nimport { CollectionMembershipCache } from \"../../cache/collection-membership-cache.js\";\nimport { DocumentMetaCache } from \"../../cache/document-meta-cache.js\";\nimport { KyselyOperationIndex } from \"../../cache/kysely-operation-index.js\";\nimport { KyselyWriteCache } from \"../../cache/kysely-write-cache.js\";\nimport type { WriteCacheConfig } from \"../../cache/write-cache-types.js\";\nimport { DEFAULT_DRIVE_CONTAINER_TYPES } from \"../../core/drive-container-types.js\";\nimport type { Database } from \"../../core/types.js\";\nimport { EventBus } from \"../../events/event-bus.js\";\nimport {\n ReactorEventTypes,\n type JobWriteReadyEvent,\n} from \"../../events/types.js\";\nimport { DocumentModelRegistry } from \"../../registry/implementation.js\";\nimport type { JobMeta } from \"../../shared/types.js\";\nimport type { SignatureVerificationHandler } from \"../../signer/types.js\";\nimport { KyselyKeyframeStore } from \"../../storage/kysely/keyframe-store.js\";\nimport { KyselyOperationStore } from \"../../storage/kysely/store.js\";\nimport type { Database as StorageDatabase } from \"../../storage/kysely/types.js\";\nimport { REACTOR_SCHEMA } from \"../../storage/migrations/migrator.js\";\nimport { KyselyExecutionScope } from \"../execution-scope.js\";\nimport { SimpleJobExecutor } from \"../simple-job-executor.js\";\nimport type { JobExecutorConfig } from \"../types.js\";\nimport type {\n FactorySpec,\n InitMessage,\n ModelManifestEntry,\n} from \"./protocol.js\";\n\n/**\n * In-worker capture of the JOB_WRITE_READY event emitted by the executor.\n * The worker forwards `operations` and `jobMeta` back to the parent; the\n * parent re-enriches `collectionMemberships` at emit time.\n */\nexport type WorkerWriteReadyCapture = {\n operations: OperationWithContext[];\n jobMeta: JobMeta;\n};\n\nexport type WorkerExecutorStack = {\n executor: SimpleJobExecutor;\n registry: DocumentModelRegistry;\n /**\n * Synchronously pops the most-recent JOB_WRITE_READY captured on this\n * worker's local event bus and clears it. Returns null if the executor\n * did not produce one for this job.\n */\n takeLastWriteReady(): WorkerWriteReadyCapture | null;\n};\n\nexport type BuildWorkerExecutorOptions = {\n init: InitMessage;\n database: Kysely<Database>;\n logger: ILogger;\n executorConfig?: JobExecutorConfig;\n driveContainerTypes?: ReadonlySet<string>;\n /**\n * Override the module loader used to materialize factory specs. Tests\n * can inject a deterministic resolver instead of touching the real\n * Node module loader.\n */\n loadFactory?: (spec: FactorySpec) => Promise<unknown>;\n};\n\nexport async function defaultLoadFactory(spec: FactorySpec): Promise<unknown> {\n const ref = spec.module;\n const specifier =\n \"filePath\" in ref\n ? new URL(`file://${ref.filePath}`).href\n : ref.packageName;\n const mod = (await import(specifier)) as Record<string, unknown>;\n const exported = mod[ref.exportName];\n if (typeof exported === \"function\") {\n return (exported as (args: unknown) => unknown)(spec.initArgs);\n }\n return exported;\n}\n\nasync function loadModelManifest(\n entries: ModelManifestEntry[],\n loadFactory: (spec: FactorySpec) => Promise<unknown>,\n registry: DocumentModelRegistry,\n logger: ILogger,\n): Promise<void> {\n for (const entry of entries) {\n let module: DocumentModelModule;\n try {\n module = (await loadFactory(entry.spec)) as DocumentModelModule;\n } catch (error) {\n logger.error(\n \"worker failed to load document model: @entry @error\",\n entry,\n error,\n );\n throw error;\n }\n const [result] = registry.registerModules(module);\n if (result.status === \"error\") {\n logger.error(\n \"worker failed to register document model: @entry @error\",\n entry,\n result.error,\n );\n throw result.error;\n }\n }\n}\n\n/**\n * Assembles the in-worker storage stack plus a {@link SimpleJobExecutor}\n * bound to a pre-built Kysely instance. The parent owns the wire protocol\n * and routing; the worker owns everything below `SimpleJobExecutor`.\n *\n * The local event bus exists only to satisfy the executor's contract: its\n * JOB_WRITE_READY emissions are captured here and shipped to the parent\n * via {@link WorkerExecutorStack.takeLastWriteReady}.\n */\nexport async function buildWorkerExecutor(\n options: BuildWorkerExecutorOptions,\n): Promise<WorkerExecutorStack> {\n const { init, database: baseDatabase, logger } = options;\n const driveContainerTypes =\n options.driveContainerTypes ?? DEFAULT_DRIVE_CONTAINER_TYPES;\n const loadFactory = options.loadFactory ?? defaultLoadFactory;\n\n const registry = new DocumentModelRegistry();\n await loadModelManifest(init.models, loadFactory, registry, logger);\n\n let signatureVerifier: SignatureVerificationHandler | undefined;\n if (init.signatureVerifier) {\n try {\n signatureVerifier = (await loadFactory(\n init.signatureVerifier,\n )) as SignatureVerificationHandler;\n } catch (error) {\n logger.error(\n \"worker failed to load signature verifier: @spec @error\",\n init.signatureVerifier,\n error,\n );\n throw error;\n }\n }\n\n const database = baseDatabase.withSchema(REACTOR_SCHEMA);\n const operationStore = new KyselyOperationStore(\n database as unknown as Kysely<StorageDatabase>,\n );\n const keyframeStore = new KyselyKeyframeStore(\n database as unknown as Kysely<StorageDatabase>,\n );\n\n const cacheConfig: WriteCacheConfig = {\n maxDocuments: 100,\n ringBufferSize: 10,\n keyframeInterval: 10,\n };\n const writeCache = new KyselyWriteCache(\n keyframeStore,\n operationStore,\n registry,\n cacheConfig,\n );\n await writeCache.startup();\n\n const operationIndex = new KyselyOperationIndex(\n database as unknown as Kysely<StorageDatabase>,\n );\n\n const documentMetaCache = new DocumentMetaCache(operationStore, {\n maxDocuments: 1000,\n });\n await documentMetaCache.startup();\n\n const collectionMembershipCache = new CollectionMembershipCache(\n operationIndex,\n );\n\n const executionScope = new KyselyExecutionScope(\n database as unknown as Kysely<StorageDatabase>,\n operationStore,\n operationIndex,\n keyframeStore,\n writeCache,\n documentMetaCache,\n collectionMembershipCache,\n );\n\n const eventBus = new EventBus();\n let lastWriteReady: WorkerWriteReadyCapture | null = null;\n eventBus.subscribe(\n ReactorEventTypes.JOB_WRITE_READY,\n (_t: number, event: JobWriteReadyEvent) => {\n lastWriteReady = {\n operations: event.operations,\n jobMeta: event.jobMeta,\n };\n },\n );\n\n const executorConfig = options.executorConfig ?? {};\n const executor = new SimpleJobExecutor(\n logger,\n registry,\n operationStore,\n eventBus,\n writeCache,\n operationIndex,\n documentMetaCache,\n collectionMembershipCache,\n driveContainerTypes,\n executorConfig,\n signatureVerifier,\n executionScope,\n );\n\n return {\n executor,\n registry,\n takeLastWriteReady(): WorkerWriteReadyCapture | null {\n const captured = lastWriteReady;\n lastWriteReady = null;\n return captured;\n },\n };\n}\n"],"mappings":";;;AAqEA,eAAsB,mBAAmB,MAAqC;CAC5E,MAAM,MAAM,KAAK;CAMjB,MAAM,YADO,OAHX,cAAc,MAAA,OACV,IAAI,IAAI,UAAU,IAAI,WAAW,CAAC,QAAA,OAClC,IAAI,eAEW,IAAI;AACzB,KAAI,OAAO,aAAa,WACtB,QAAQ,SAAwC,KAAK,SAAS;AAEhE,QAAO;;AAGT,eAAe,kBACb,SACA,aACA,UACA,QACe;AACf,MAAK,MAAM,SAAS,SAAS;EAC3B,IAAI;AACJ,MAAI;AACF,YAAU,MAAM,YAAY,MAAM,KAAK;WAChC,OAAO;AACd,UAAO,MACL,uDACA,OACA,MACD;AACD,SAAM;;EAER,MAAM,CAAC,UAAU,SAAS,gBAAgB,OAAO;AACjD,MAAI,OAAO,WAAW,SAAS;AAC7B,UAAO,MACL,2DACA,OACA,OAAO,MACR;AACD,SAAM,OAAO;;;;;;;;;;;;;AAcnB,eAAsB,oBACpB,SAC8B;CAC9B,MAAM,EAAE,MAAM,UAAU,cAAc,WAAW;CACjD,MAAM,sBACJ,QAAQ,uBAAuB;CACjC,MAAM,cAAc,QAAQ,eAAe;CAE3C,MAAM,WAAW,IAAI,uBAAuB;AAC5C,OAAM,kBAAkB,KAAK,QAAQ,aAAa,UAAU,OAAO;CAEnE,IAAI;AACJ,KAAI,KAAK,kBACP,KAAI;AACF,sBAAqB,MAAM,YACzB,KAAK,kBACN;UACM,OAAO;AACd,SAAO,MACL,0DACA,KAAK,mBACL,MACD;AACD,QAAM;;CAIV,MAAM,WAAW,aAAa,WAAW,eAAe;CACxD,MAAM,iBAAiB,IAAI,qBACzB,SACD;CACD,MAAM,gBAAgB,IAAI,oBACxB,SACD;CAOD,MAAM,aAAa,IAAI,iBACrB,eACA,gBACA,UARoC;EACpC,cAAc;EACd,gBAAgB;EAChB,kBAAkB;EACnB,CAMA;AACD,OAAM,WAAW,SAAS;CAE1B,MAAM,iBAAiB,IAAI,qBACzB,SACD;CAED,MAAM,oBAAoB,IAAI,kBAAkB,gBAAgB,EAC9D,cAAc,KACf,CAAC;AACF,OAAM,kBAAkB,SAAS;CAEjC,MAAM,4BAA4B,IAAI,0BACpC,eACD;CAED,MAAM,iBAAiB,IAAI,qBACzB,UACA,gBACA,gBACA,eACA,YACA,mBACA,0BACD;CAED,MAAM,WAAW,IAAI,UAAU;CAC/B,IAAI,iBAAiD;AACrD,UAAS,UACP,kBAAkB,kBACjB,IAAY,UAA8B;AACzC,mBAAiB;GACf,YAAY,MAAM;GAClB,SAAS,MAAM;GAChB;GAEJ;AAkBD,QAAO;EACL,UAhBe,IAAI,kBACnB,QACA,UACA,gBACA,UACA,YACA,gBACA,mBACA,2BACA,qBAVqB,QAAQ,kBAAkB,EAAE,EAYjD,mBACA,eACD;EAIC;EACA,qBAAqD;GACnD,MAAM,WAAW;AACjB,oBAAiB;AACjB,UAAO;;EAEV"}
|
|
@@ -218,6 +218,32 @@ var DocumentNotFoundError = class DocumentNotFoundError extends Error {
|
|
|
218
218
|
return Error.isError(error) && error.name === "DocumentNotFoundError";
|
|
219
219
|
}
|
|
220
220
|
};
|
|
221
|
+
/**
|
|
222
|
+
* An authorization preflight was asked for while the reactor's decision model
|
|
223
|
+
* is off, so there is no model to answer from.
|
|
224
|
+
*
|
|
225
|
+
* Thrown rather than answered from the legacy host-side permission tables. The
|
|
226
|
+
* two systems do not compose: the tables record which addresses a host lets
|
|
227
|
+
* near a drive, the policy records what a document's own grants permit, and an
|
|
228
|
+
* answer stitched from both would report an admission verdict neither system
|
|
229
|
+
* would reach. A caller that cannot get a prediction disables nothing, which
|
|
230
|
+
* leaves the submit path -- and its real gate -- as the only authority.
|
|
231
|
+
*
|
|
232
|
+
* Detection is by `name`, not `instanceof`: the SharedWorker RPC boundary
|
|
233
|
+
* rebuilds a thrown error from `{ name, message, stack, cause }` alone
|
|
234
|
+
* (`reactor-browser/src/rpc/error-info.ts`), so the class identity and any
|
|
235
|
+
* custom field are lost in transit. This error therefore carries no fields.
|
|
236
|
+
*/
|
|
237
|
+
var AuthEnforcementDisabledError = class AuthEnforcementDisabledError extends Error {
|
|
238
|
+
constructor() {
|
|
239
|
+
super("Authorization evaluation requires the authEnforcement feature flag; this reactor holds no decision model, and the legacy host-table permission system cannot answer for one");
|
|
240
|
+
this.name = "AuthEnforcementDisabledError";
|
|
241
|
+
Error.captureStackTrace(this, AuthEnforcementDisabledError);
|
|
242
|
+
}
|
|
243
|
+
static isError(error) {
|
|
244
|
+
return Error.isError(error) && error.name === "AuthEnforcementDisabledError";
|
|
245
|
+
}
|
|
246
|
+
};
|
|
221
247
|
//#endregion
|
|
222
248
|
//#region src/decision/build-decision-model.ts
|
|
223
249
|
/**
|
|
@@ -570,171 +596,6 @@ function selectDecisionModel(flags, registry) {
|
|
|
570
596
|
return flags.authEnforcement ? authDecisionModel : documentDecisionModel;
|
|
571
597
|
}
|
|
572
598
|
//#endregion
|
|
573
|
-
//#region src/registry/errors.ts
|
|
574
|
-
/**
|
|
575
|
-
* Error thrown when a document model module is not found in the registry.
|
|
576
|
-
*/
|
|
577
|
-
var ModuleNotFoundError = class extends Error {
|
|
578
|
-
documentType;
|
|
579
|
-
requestedVersion;
|
|
580
|
-
constructor(documentType, version) {
|
|
581
|
-
const versionSuffix = version !== void 0 ? ` version ${version}` : "";
|
|
582
|
-
super(`Document model module not found for type: ${documentType}${versionSuffix}`);
|
|
583
|
-
this.name = "ModuleNotFoundError";
|
|
584
|
-
this.documentType = documentType;
|
|
585
|
-
this.requestedVersion = version;
|
|
586
|
-
}
|
|
587
|
-
static isError(error) {
|
|
588
|
-
return Error.isError(error) && error.name === "ModuleNotFoundError";
|
|
589
|
-
}
|
|
590
|
-
};
|
|
591
|
-
/**
|
|
592
|
-
* Error thrown when attempting to register a module that already exists.
|
|
593
|
-
*/
|
|
594
|
-
var DuplicateModuleError = class extends Error {
|
|
595
|
-
constructor(documentType, version) {
|
|
596
|
-
const versionSuffix = version !== void 0 ? ` (version ${version})` : "";
|
|
597
|
-
super(`Document model module already registered for type: ${documentType}${versionSuffix}`);
|
|
598
|
-
this.name = "DuplicateModuleError";
|
|
599
|
-
}
|
|
600
|
-
static isError(error) {
|
|
601
|
-
return Error.isError(error) && error.name === "DuplicateModuleError";
|
|
602
|
-
}
|
|
603
|
-
};
|
|
604
|
-
/**
|
|
605
|
-
* Error thrown when a module is invalid or malformed.
|
|
606
|
-
*/
|
|
607
|
-
var InvalidModuleError = class extends Error {
|
|
608
|
-
constructor(message) {
|
|
609
|
-
super(`Invalid document model module: ${message}`);
|
|
610
|
-
this.name = "InvalidModuleError";
|
|
611
|
-
}
|
|
612
|
-
};
|
|
613
|
-
/**
|
|
614
|
-
* Error thrown when attempting to register an upgrade manifest that already exists.
|
|
615
|
-
*/
|
|
616
|
-
var DuplicateManifestError = class extends Error {
|
|
617
|
-
constructor(documentType) {
|
|
618
|
-
super(`Upgrade manifest already registered for type: ${documentType}`);
|
|
619
|
-
this.name = "DuplicateManifestError";
|
|
620
|
-
}
|
|
621
|
-
static isError(error) {
|
|
622
|
-
return Error.isError(error) && error.name === "DuplicateManifestError";
|
|
623
|
-
}
|
|
624
|
-
};
|
|
625
|
-
/**
|
|
626
|
-
* Error thrown when an upgrade manifest is not found.
|
|
627
|
-
*/
|
|
628
|
-
var ManifestNotFoundError = class extends Error {
|
|
629
|
-
constructor(documentType) {
|
|
630
|
-
super(`Upgrade manifest not found for type: ${documentType}`);
|
|
631
|
-
this.name = "ManifestNotFoundError";
|
|
632
|
-
}
|
|
633
|
-
};
|
|
634
|
-
/**
|
|
635
|
-
* Error thrown when a required upgrade transition is missing from the manifest.
|
|
636
|
-
*/
|
|
637
|
-
var MissingUpgradeTransitionError = class extends Error {
|
|
638
|
-
constructor(documentType, fromVersion, toVersion) {
|
|
639
|
-
super(`Missing upgrade transition for ${documentType}: v${fromVersion} to v${toVersion}`);
|
|
640
|
-
this.name = "MissingUpgradeTransitionError";
|
|
641
|
-
}
|
|
642
|
-
};
|
|
643
|
-
/**
|
|
644
|
-
* Error thrown when getUpgradeReducer is called with a non-single-step version increment.
|
|
645
|
-
*/
|
|
646
|
-
var InvalidUpgradeStepError = class extends Error {
|
|
647
|
-
constructor(documentType, fromVersion, toVersion) {
|
|
648
|
-
super(`Invalid upgrade step for ${documentType}: must be single version increment, got v${fromVersion} to v${toVersion}`);
|
|
649
|
-
this.name = "InvalidUpgradeStepError";
|
|
650
|
-
}
|
|
651
|
-
};
|
|
652
|
-
//#endregion
|
|
653
|
-
//#region src/storage/interfaces.ts
|
|
654
|
-
/**
|
|
655
|
-
* Thrown when an operation with the same identity already exists in the store.
|
|
656
|
-
*/
|
|
657
|
-
var DuplicateOperationError = class extends Error {
|
|
658
|
-
constructor(description) {
|
|
659
|
-
super(`Duplicate operation: ${description}`);
|
|
660
|
-
this.name = "DuplicateOperationError";
|
|
661
|
-
}
|
|
662
|
-
};
|
|
663
|
-
/**
|
|
664
|
-
* Thrown when a concurrent write conflict is detected during an atomic apply.
|
|
665
|
-
*/
|
|
666
|
-
var OptimisticLockError = class extends Error {
|
|
667
|
-
constructor(message) {
|
|
668
|
-
super(message);
|
|
669
|
-
this.name = "OptimisticLockError";
|
|
670
|
-
}
|
|
671
|
-
};
|
|
672
|
-
/**
|
|
673
|
-
* Thrown when the caller-provided revision does not match the current
|
|
674
|
-
* stored revision, indicating a stale read.
|
|
675
|
-
*/
|
|
676
|
-
var RevisionMismatchError = class extends Error {
|
|
677
|
-
constructor(expected, actual) {
|
|
678
|
-
super(`Revision mismatch: expected ${expected}, got ${actual}`);
|
|
679
|
-
this.name = "RevisionMismatchError";
|
|
680
|
-
}
|
|
681
|
-
};
|
|
682
|
-
/** Error history keeps messages, not classes, so failures match by prefix. */
|
|
683
|
-
const APPEND_CONDITION_FAILED_PREFIX = "Append condition failed: ";
|
|
684
|
-
/**
|
|
685
|
-
* A read-set stream grew before the append committed. A concurrency
|
|
686
|
-
* conflict, not a fault: the caller retries against the new stream heads.
|
|
687
|
-
*/
|
|
688
|
-
var AppendConditionFailedError = class extends Error {
|
|
689
|
-
constructor(condition) {
|
|
690
|
-
const streams = condition.streams.map((s) => `${s.documentId}:${s.scope}:${s.branch}@${s.revision}`).join(", ");
|
|
691
|
-
super(`${APPEND_CONDITION_FAILED_PREFIX}a read-set stream advanced [${streams}]`);
|
|
692
|
-
this.condition = condition;
|
|
693
|
-
this.name = "AppendConditionFailedError";
|
|
694
|
-
}
|
|
695
|
-
static isError(error) {
|
|
696
|
-
return Error.isError(error) && error.name === "AppendConditionFailedError";
|
|
697
|
-
}
|
|
698
|
-
/** True when a recorded error message is an append-condition failure. */
|
|
699
|
-
static isFailureMessage(message) {
|
|
700
|
-
return message.startsWith(APPEND_CONDITION_FAILED_PREFIX);
|
|
701
|
-
}
|
|
702
|
-
};
|
|
703
|
-
//#endregion
|
|
704
|
-
//#region src/cache/collection-membership-cache.ts
|
|
705
|
-
var CollectionMembershipCache = class CollectionMembershipCache {
|
|
706
|
-
cache = /* @__PURE__ */ new Map();
|
|
707
|
-
constructor(operationIndex) {
|
|
708
|
-
this.operationIndex = operationIndex;
|
|
709
|
-
}
|
|
710
|
-
withScopedIndex(operationIndex) {
|
|
711
|
-
const scoped = new CollectionMembershipCache(operationIndex);
|
|
712
|
-
scoped.cache = this.cache;
|
|
713
|
-
return scoped;
|
|
714
|
-
}
|
|
715
|
-
async getCollectionsForDocuments(documentIds) {
|
|
716
|
-
const result = {};
|
|
717
|
-
const missing = [];
|
|
718
|
-
for (const docId of documentIds) {
|
|
719
|
-
const cached = this.cache.get(docId);
|
|
720
|
-
if (cached !== void 0) result[docId] = cached;
|
|
721
|
-
else missing.push(docId);
|
|
722
|
-
}
|
|
723
|
-
if (missing.length > 0) {
|
|
724
|
-
const fromDb = await this.operationIndex.getCollectionsForDocuments(missing);
|
|
725
|
-
for (const docId of missing) {
|
|
726
|
-
const collections = fromDb[docId] ?? [];
|
|
727
|
-
result[docId] = collections;
|
|
728
|
-
this.cache.set(docId, collections);
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
return result;
|
|
732
|
-
}
|
|
733
|
-
invalidate(documentId) {
|
|
734
|
-
this.cache.delete(documentId);
|
|
735
|
-
}
|
|
736
|
-
};
|
|
737
|
-
//#endregion
|
|
738
599
|
//#region src/executor/util.ts
|
|
739
600
|
/** Actions the reactor reduces itself, onto the document scope. */
|
|
740
601
|
const DOCUMENT_SCOPE_ACTIONS = new Set([
|
|
@@ -920,6 +781,171 @@ function isGenesisOperation(operation) {
|
|
|
920
781
|
return operation.action.input.fromVersion === 0;
|
|
921
782
|
}
|
|
922
783
|
//#endregion
|
|
784
|
+
//#region src/registry/errors.ts
|
|
785
|
+
/**
|
|
786
|
+
* Error thrown when a document model module is not found in the registry.
|
|
787
|
+
*/
|
|
788
|
+
var ModuleNotFoundError = class extends Error {
|
|
789
|
+
documentType;
|
|
790
|
+
requestedVersion;
|
|
791
|
+
constructor(documentType, version) {
|
|
792
|
+
const versionSuffix = version !== void 0 ? ` version ${version}` : "";
|
|
793
|
+
super(`Document model module not found for type: ${documentType}${versionSuffix}`);
|
|
794
|
+
this.name = "ModuleNotFoundError";
|
|
795
|
+
this.documentType = documentType;
|
|
796
|
+
this.requestedVersion = version;
|
|
797
|
+
}
|
|
798
|
+
static isError(error) {
|
|
799
|
+
return Error.isError(error) && error.name === "ModuleNotFoundError";
|
|
800
|
+
}
|
|
801
|
+
};
|
|
802
|
+
/**
|
|
803
|
+
* Error thrown when attempting to register a module that already exists.
|
|
804
|
+
*/
|
|
805
|
+
var DuplicateModuleError = class extends Error {
|
|
806
|
+
constructor(documentType, version) {
|
|
807
|
+
const versionSuffix = version !== void 0 ? ` (version ${version})` : "";
|
|
808
|
+
super(`Document model module already registered for type: ${documentType}${versionSuffix}`);
|
|
809
|
+
this.name = "DuplicateModuleError";
|
|
810
|
+
}
|
|
811
|
+
static isError(error) {
|
|
812
|
+
return Error.isError(error) && error.name === "DuplicateModuleError";
|
|
813
|
+
}
|
|
814
|
+
};
|
|
815
|
+
/**
|
|
816
|
+
* Error thrown when a module is invalid or malformed.
|
|
817
|
+
*/
|
|
818
|
+
var InvalidModuleError = class extends Error {
|
|
819
|
+
constructor(message) {
|
|
820
|
+
super(`Invalid document model module: ${message}`);
|
|
821
|
+
this.name = "InvalidModuleError";
|
|
822
|
+
}
|
|
823
|
+
};
|
|
824
|
+
/**
|
|
825
|
+
* Error thrown when attempting to register an upgrade manifest that already exists.
|
|
826
|
+
*/
|
|
827
|
+
var DuplicateManifestError = class extends Error {
|
|
828
|
+
constructor(documentType) {
|
|
829
|
+
super(`Upgrade manifest already registered for type: ${documentType}`);
|
|
830
|
+
this.name = "DuplicateManifestError";
|
|
831
|
+
}
|
|
832
|
+
static isError(error) {
|
|
833
|
+
return Error.isError(error) && error.name === "DuplicateManifestError";
|
|
834
|
+
}
|
|
835
|
+
};
|
|
836
|
+
/**
|
|
837
|
+
* Error thrown when an upgrade manifest is not found.
|
|
838
|
+
*/
|
|
839
|
+
var ManifestNotFoundError = class extends Error {
|
|
840
|
+
constructor(documentType) {
|
|
841
|
+
super(`Upgrade manifest not found for type: ${documentType}`);
|
|
842
|
+
this.name = "ManifestNotFoundError";
|
|
843
|
+
}
|
|
844
|
+
};
|
|
845
|
+
/**
|
|
846
|
+
* Error thrown when a required upgrade transition is missing from the manifest.
|
|
847
|
+
*/
|
|
848
|
+
var MissingUpgradeTransitionError = class extends Error {
|
|
849
|
+
constructor(documentType, fromVersion, toVersion) {
|
|
850
|
+
super(`Missing upgrade transition for ${documentType}: v${fromVersion} to v${toVersion}`);
|
|
851
|
+
this.name = "MissingUpgradeTransitionError";
|
|
852
|
+
}
|
|
853
|
+
};
|
|
854
|
+
/**
|
|
855
|
+
* Error thrown when getUpgradeReducer is called with a non-single-step version increment.
|
|
856
|
+
*/
|
|
857
|
+
var InvalidUpgradeStepError = class extends Error {
|
|
858
|
+
constructor(documentType, fromVersion, toVersion) {
|
|
859
|
+
super(`Invalid upgrade step for ${documentType}: must be single version increment, got v${fromVersion} to v${toVersion}`);
|
|
860
|
+
this.name = "InvalidUpgradeStepError";
|
|
861
|
+
}
|
|
862
|
+
};
|
|
863
|
+
//#endregion
|
|
864
|
+
//#region src/storage/interfaces.ts
|
|
865
|
+
/**
|
|
866
|
+
* Thrown when an operation with the same identity already exists in the store.
|
|
867
|
+
*/
|
|
868
|
+
var DuplicateOperationError = class extends Error {
|
|
869
|
+
constructor(description) {
|
|
870
|
+
super(`Duplicate operation: ${description}`);
|
|
871
|
+
this.name = "DuplicateOperationError";
|
|
872
|
+
}
|
|
873
|
+
};
|
|
874
|
+
/**
|
|
875
|
+
* Thrown when a concurrent write conflict is detected during an atomic apply.
|
|
876
|
+
*/
|
|
877
|
+
var OptimisticLockError = class extends Error {
|
|
878
|
+
constructor(message) {
|
|
879
|
+
super(message);
|
|
880
|
+
this.name = "OptimisticLockError";
|
|
881
|
+
}
|
|
882
|
+
};
|
|
883
|
+
/**
|
|
884
|
+
* Thrown when the caller-provided revision does not match the current
|
|
885
|
+
* stored revision, indicating a stale read.
|
|
886
|
+
*/
|
|
887
|
+
var RevisionMismatchError = class extends Error {
|
|
888
|
+
constructor(expected, actual) {
|
|
889
|
+
super(`Revision mismatch: expected ${expected}, got ${actual}`);
|
|
890
|
+
this.name = "RevisionMismatchError";
|
|
891
|
+
}
|
|
892
|
+
};
|
|
893
|
+
/** Error history keeps messages, not classes, so failures match by prefix. */
|
|
894
|
+
const APPEND_CONDITION_FAILED_PREFIX = "Append condition failed: ";
|
|
895
|
+
/**
|
|
896
|
+
* A read-set stream grew before the append committed. A concurrency
|
|
897
|
+
* conflict, not a fault: the caller retries against the new stream heads.
|
|
898
|
+
*/
|
|
899
|
+
var AppendConditionFailedError = class extends Error {
|
|
900
|
+
constructor(condition) {
|
|
901
|
+
const streams = condition.streams.map((s) => `${s.documentId}:${s.scope}:${s.branch}@${s.revision}`).join(", ");
|
|
902
|
+
super(`${APPEND_CONDITION_FAILED_PREFIX}a read-set stream advanced [${streams}]`);
|
|
903
|
+
this.condition = condition;
|
|
904
|
+
this.name = "AppendConditionFailedError";
|
|
905
|
+
}
|
|
906
|
+
static isError(error) {
|
|
907
|
+
return Error.isError(error) && error.name === "AppendConditionFailedError";
|
|
908
|
+
}
|
|
909
|
+
/** True when a recorded error message is an append-condition failure. */
|
|
910
|
+
static isFailureMessage(message) {
|
|
911
|
+
return message.startsWith(APPEND_CONDITION_FAILED_PREFIX);
|
|
912
|
+
}
|
|
913
|
+
};
|
|
914
|
+
//#endregion
|
|
915
|
+
//#region src/cache/collection-membership-cache.ts
|
|
916
|
+
var CollectionMembershipCache = class CollectionMembershipCache {
|
|
917
|
+
cache = /* @__PURE__ */ new Map();
|
|
918
|
+
constructor(operationIndex) {
|
|
919
|
+
this.operationIndex = operationIndex;
|
|
920
|
+
}
|
|
921
|
+
withScopedIndex(operationIndex) {
|
|
922
|
+
const scoped = new CollectionMembershipCache(operationIndex);
|
|
923
|
+
scoped.cache = this.cache;
|
|
924
|
+
return scoped;
|
|
925
|
+
}
|
|
926
|
+
async getCollectionsForDocuments(documentIds) {
|
|
927
|
+
const result = {};
|
|
928
|
+
const missing = [];
|
|
929
|
+
for (const docId of documentIds) {
|
|
930
|
+
const cached = this.cache.get(docId);
|
|
931
|
+
if (cached !== void 0) result[docId] = cached;
|
|
932
|
+
else missing.push(docId);
|
|
933
|
+
}
|
|
934
|
+
if (missing.length > 0) {
|
|
935
|
+
const fromDb = await this.operationIndex.getCollectionsForDocuments(missing);
|
|
936
|
+
for (const docId of missing) {
|
|
937
|
+
const collections = fromDb[docId] ?? [];
|
|
938
|
+
result[docId] = collections;
|
|
939
|
+
this.cache.set(docId, collections);
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
return result;
|
|
943
|
+
}
|
|
944
|
+
invalidate(documentId) {
|
|
945
|
+
this.cache.delete(documentId);
|
|
946
|
+
}
|
|
947
|
+
};
|
|
948
|
+
//#endregion
|
|
923
949
|
//#region src/cache/lru/lru-tracker.ts
|
|
924
950
|
var LRUNode = class {
|
|
925
951
|
key;
|
|
@@ -4821,6 +4847,6 @@ async function getMigrationStatus(db, schema = REACTOR_SCHEMA) {
|
|
|
4821
4847
|
//#region src/core/drive-container-types.ts
|
|
4822
4848
|
const DEFAULT_DRIVE_CONTAINER_TYPES = new Set(["powerhouse/document-drive", "powerhouse/reactor-drive"]);
|
|
4823
4849
|
//#endregion
|
|
4824
|
-
export {
|
|
4850
|
+
export { createEmptyConsistencyToken as A, DocumentDeletedError as B, RevisionMismatchError as C, ModuleNotFoundError as D, InvalidModuleError as E, authDecisionModel as F, matchesScope as G, ExcessiveReshuffleError as H, buildDecisionModel as I, __exportAll as J, parsePagingOptions as K, AuthEnforcementDisabledError as L, decideAtHead as M, selectDecisionModel as N, GATED_DOCUMENT_ACTIONS as O, documentDecisionModel as P, AuthTimestampNotMonotonicError as R, OptimisticLockError as S, DuplicateModuleError as T, InvalidOperationTimestampError as U, DocumentNotFoundError as V, UpgradePreconditionFailedError as W, DocumentMetaCache as _, createForwardingPoolInstrumentation as a, AppendConditionFailedError as b, KyselyKeyframeStore as c, DriveCollectionId as d, KyselyExecutionScope as f, KyselyOperationIndex as g, KyselyWriteCache as h, runMigrations as i, targetDocumentId as j, createConsistencyToken as k, DocumentModelRegistry as l, EventBus as m, REACTOR_SCHEMA as n, instrumentPgPool as o, resolveFeatureFlags as p, throwIfAborted as q, getMigrationStatus as r, KyselyOperationStore as s, DEFAULT_DRIVE_CONTAINER_TYPES as t, SimpleJobExecutor as u, CollectionMembershipCache as v, DuplicateManifestError as w, DuplicateOperationError as x, APPEND_CONDITION_FAILED_PREFIX as y, AuthorizationDeniedError as z };
|
|
4825
4851
|
|
|
4826
|
-
//# sourceMappingURL=drive-container-types-
|
|
4852
|
+
//# sourceMappingURL=drive-container-types-RZa1wukO.js.map
|