@powerhousedao/connect 6.2.3-dev.32 → 6.2.3-dev.34
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/{ClearStorageModal-D_qIH8xO.js → ClearStorageModal-EyWSaorr.js} +4 -4
- package/dist/{ClearStorageModal-D_qIH8xO.js.map → ClearStorageModal-EyWSaorr.js.map} +1 -1
- package/dist/{DebugSettingsModal-CqTKcFT6.js → DebugSettingsModal-DhaqEISq.js} +4 -4
- package/dist/{DebugSettingsModal-CqTKcFT6.js.map → DebugSettingsModal-DhaqEISq.js.map} +1 -1
- package/dist/{InspectorModal-tGsfYXkd.js → InspectorModal-DBKSYRfT.js} +56 -18
- package/dist/InspectorModal-DBKSYRfT.js.map +1 -0
- package/dist/{OpenFileDocumentsModal-DuMkAI98.js → OpenFileDocumentsModal-Bz28B0hm.js} +4 -4
- package/dist/{OpenFileDocumentsModal-DuMkAI98.js.map → OpenFileDocumentsModal-Bz28B0hm.js.map} +1 -1
- package/dist/{SettingsModal-B7cyFF6I.js → SettingsModal-ByG5GSWX.js} +5 -5
- package/dist/{SettingsModal-B7cyFF6I.js.map → SettingsModal-ByG5GSWX.js.map} +1 -1
- package/dist/{app-loader-DMtilkt3.js → app-loader-C50hw0IP.js} +49 -13
- package/dist/app-loader-C50hw0IP.js.map +1 -0
- package/dist/app-loader-D2FsMHjs.js +4 -0
- package/dist/{build-info-CQAER_nk.js → build-info-DY5f51wr.js} +5 -5
- package/dist/{build-info-CQAER_nk.js.map → build-info-DY5f51wr.js.map} +1 -1
- package/dist/{components-DOnhm8ra.js → components-DlHtXnSo.js} +3 -3
- package/dist/{connection-state-DJX_vUhI.js → connection-state-Eqc2izmt.js} +4 -4
- package/dist/{connection-state-DJX_vUhI.js.map → connection-state-Eqc2izmt.js.map} +1 -1
- package/dist/{load-uNwKzH6m.js → load-BA8JTqOJ.js} +7 -7
- package/dist/{load-uNwKzH6m.js.map → load-BA8JTqOJ.js.map} +1 -1
- package/dist/main.js +1 -1
- package/dist/{pglite-major-BbmMK26m.js → pglite-major-p4_YefAE.js} +23 -5
- package/dist/pglite-major-p4_YefAE.js.map +1 -0
- package/dist/{pglite-migrate-core-o88cWesm.js → pglite-migrate-core-BcXcImng.js} +4 -4
- package/dist/{pglite-migrate-core-o88cWesm.js.map → pglite-migrate-core-BcXcImng.js.map} +1 -1
- package/dist/{pglite-seed-AR1MKM1R.js → pglite-seed-Cl2d-iyl.js} +4 -4
- package/dist/{pglite-seed-AR1MKM1R.js.map → pglite-seed-Cl2d-iyl.js.map} +1 -1
- package/dist/{reactor-CHFsGnJ2.js → reactor-b2ygUUVW.js} +20 -10
- package/dist/reactor-b2ygUUVW.js.map +1 -0
- package/dist/reactor.worker.js +33 -6
- package/dist/reactor.worker.js.map +1 -1
- package/dist/start-connect.js +1 -1
- package/package.json +13 -13
- package/dist/InspectorModal-tGsfYXkd.js.map +0 -1
- package/dist/app-loader-DMtilkt3.js.map +0 -1
- package/dist/app-loader-DSuZw3NZ.js +0 -4
- package/dist/pglite-major-BbmMK26m.js.map +0 -1
- package/dist/reactor-CHFsGnJ2.js.map +0 -1
package/dist/reactor.worker.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="951f920d-891c-50dc-a918-f37ec9402372")}catch(e){}}();
|
|
3
3
|
import { t as createConnectSignerConfig } from "./renown-trust-DRgHpxlZ.js";
|
|
4
|
-
import { a as resolvePgMajorForRuntime, r as loadPGliteModule, t as coerceMajor, u as readPgVersionFile } from "./pglite-major-
|
|
5
|
-
import { a as writeFileData, i as readFileData, r as migrateIdb, t as clearFileData } from "./pglite-migrate-core-
|
|
4
|
+
import { a as resolvePgMajorForRuntime, f as toStoredDocumentsRefused, r as loadPGliteModule, t as coerceMajor, u as readPgVersionFile } from "./pglite-major-p4_YefAE.js";
|
|
5
|
+
import { a as writeFileData, i as readFileData, r as migrateIdb, t as clearFileData } from "./pglite-migrate-core-BcXcImng.js";
|
|
6
6
|
import { createRelationalDb } from "@powerhousedao/shared/processors";
|
|
7
7
|
import { ChannelScheme, DocumentIntegrityService, DriveCollectionId, InMemoryQueue, ReactorBuilder, ReactorClientBuilder } from "@powerhousedao/reactor";
|
|
8
8
|
import { baseDocumentModels } from "@powerhousedao/reactor-browser/base-document-models";
|
|
@@ -49,6 +49,7 @@ const owned = {};
|
|
|
49
49
|
let inspectorQueue;
|
|
50
50
|
let inspectorProcessors;
|
|
51
51
|
let inspectorIntegrity;
|
|
52
|
+
let inspectorCatchUp;
|
|
52
53
|
let currentIdentity = null;
|
|
53
54
|
const registeredKeys = /* @__PURE__ */ new Set();
|
|
54
55
|
function modelKey(module) {
|
|
@@ -120,6 +121,17 @@ const inMemoryBackup = {
|
|
|
120
121
|
discard: () => Promise.resolve(),
|
|
121
122
|
commit: () => Promise.resolve()
|
|
122
123
|
};
|
|
124
|
+
async function releaseStores() {
|
|
125
|
+
const stores = [relational.pg, owned.reactorPg];
|
|
126
|
+
relational.pg = void 0;
|
|
127
|
+
relational.db = void 0;
|
|
128
|
+
owned.reactorPg = void 0;
|
|
129
|
+
for (const store of stores) try {
|
|
130
|
+
await store?.close();
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error("[reactor.worker] closing a store failed:", error);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
123
135
|
const workerName = self.name ?? "";
|
|
124
136
|
const host = new ReactorHost({
|
|
125
137
|
namespace: workerName,
|
|
@@ -199,7 +211,9 @@ const host = new ReactorHost({
|
|
|
199
211
|
const jwtHandler = async () => currentIdentity ? crypto.getBearerToken(currentIdentity.address, { expiresIn: 10 }) : void 0;
|
|
200
212
|
phase = "building reactor module";
|
|
201
213
|
console.info(`[reactor.worker] boot: ${phase}`);
|
|
202
|
-
const
|
|
214
|
+
const reactorBuilder = new ReactorBuilder().withDocumentModelSources(models).withChannelScheme(ChannelScheme.CONNECT).withExecutorConfig({ featureFlags: construct.featureFlags ?? {} }).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) }));
|
|
215
|
+
if (construct.unsupportedStoredDocuments) reactorBuilder.withUnsupportedStoredDocuments(construct.unsupportedStoredDocuments);
|
|
216
|
+
const builder = new ReactorClientBuilder().withSigner(built.signerConfig).withReactorBuilder(reactorBuilder);
|
|
203
217
|
builder.withDocumentModelLoader(loader);
|
|
204
218
|
if (construct.createSignaturePolicy) builder.withCreateSignaturePolicy(construct.createSignaturePolicy);
|
|
205
219
|
const module = await builder.buildModule();
|
|
@@ -209,6 +223,7 @@ const host = new ReactorHost({
|
|
|
209
223
|
if (rm) {
|
|
210
224
|
inspectorQueue = rm.queue instanceof InMemoryQueue ? rm.queue : void 0;
|
|
211
225
|
inspectorProcessors = rm.processorManager;
|
|
226
|
+
inspectorCatchUp = rm.catchUp;
|
|
212
227
|
inspectorIntegrity = new DocumentIntegrityService(rm.keyframeStore, rm.operationStore, rm.writeCache, rm.documentView, rm.documentModelRegistry);
|
|
213
228
|
}
|
|
214
229
|
for (const m of models) registeredKeys.add(modelKey(m));
|
|
@@ -221,7 +236,8 @@ const host = new ReactorHost({
|
|
|
221
236
|
return module.client;
|
|
222
237
|
} catch (error) {
|
|
223
238
|
console.error(`[reactor.worker] boot failed at phase "${phase}":`, error);
|
|
224
|
-
|
|
239
|
+
await releaseStores();
|
|
240
|
+
throw toStoredDocumentsRefused(error);
|
|
225
241
|
}
|
|
226
242
|
},
|
|
227
243
|
registerPackages: async (specs) => {
|
|
@@ -244,6 +260,11 @@ const host = new ReactorHost({
|
|
|
244
260
|
case "bindRemote":
|
|
245
261
|
await syncManager.bindRemote(args[0], args[1]);
|
|
246
262
|
return;
|
|
263
|
+
case "setPeerManifest":
|
|
264
|
+
await syncManager.setPeerManifest(args[0], args[1]);
|
|
265
|
+
return;
|
|
266
|
+
case "peerAgreementBasis": return syncManager.agreement().basis();
|
|
267
|
+
case "listHolds": return syncManager.listHolds(args[0]);
|
|
247
268
|
case "remove":
|
|
248
269
|
await syncManager.remove(args[0]);
|
|
249
270
|
return;
|
|
@@ -315,6 +336,12 @@ const host = new ReactorHost({
|
|
|
315
336
|
await inspectorProcessors?.get(processorId)?.retry();
|
|
316
337
|
return;
|
|
317
338
|
}
|
|
339
|
+
case "catchUp.status":
|
|
340
|
+
if (!inspectorCatchUp) throw new Error("Catch-up not available");
|
|
341
|
+
return inspectorCatchUp.status();
|
|
342
|
+
case "catchUp.sweepNow":
|
|
343
|
+
if (!inspectorCatchUp) throw new Error("Catch-up not available");
|
|
344
|
+
return inspectorCatchUp.sweepNow();
|
|
318
345
|
case "integrity.validate": {
|
|
319
346
|
if (!inspectorIntegrity) throw new Error("Integrity service not available");
|
|
320
347
|
const [documentId, branch] = args;
|
|
@@ -357,4 +384,4 @@ globalScope.onconnect = (event) => {
|
|
|
357
384
|
//#endregion
|
|
358
385
|
|
|
359
386
|
//# sourceMappingURL=reactor.worker.js.map
|
|
360
|
-
//# debugId=
|
|
387
|
+
//# debugId=951f920d-891c-50dc-a918-f37ec9402372
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactor.worker.js","sources":["../src/reactor-worker-models.ts","../src/reactor-worker-signer.ts","../src/reactor.worker.ts"],"sourcesContent":["import type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\n\n// A `document-models` barrel also re-exports types, schemas and helpers; keep\n// only the entries that are document-model modules.\nexport function toDocumentModelModules(\n candidates: unknown[],\n): DocumentModelModule[] {\n return candidates.filter(\n (m): m is DocumentModelModule =>\n typeof m === \"object\" &&\n m !== null &&\n \"documentModel\" in m &&\n \"reducer\" in m,\n );\n}\n\n/** Which of the bundled-but-optional packages this worker registers. */\nexport type BundledModelFlags = {\n /** Builder mode: vetra's spec document models. */\n studioMode?: boolean;\n /** Powerhouse workflows: the workflow + connection document models. */\n workflowsEnabled?: boolean;\n};\n\nexport type BundledModelLoaders = {\n vetra: () => Promise<Record<string, unknown>>;\n workflow: () => Promise<Record<string, unknown>>;\n};\n\n// Neither package is CDN-loadable, so neither can ride the `packageSpecs`\n// path; each is a chunk fetched only when its own flag is on.\nexport const defaultBundledModelLoaders: BundledModelLoaders = {\n vetra: () => import(\"@powerhousedao/vetra/document-models\"),\n workflow: () => import(\"@powerhousedao/workflow/document-models\"),\n};\n\n// The flags are independent: studio mode does not imply workflows, nor the\n// other way round.\nexport async function loadFlaggedDocumentModels(\n flags: BundledModelFlags,\n loaders: BundledModelLoaders = defaultBundledModelLoaders,\n): Promise<DocumentModelModule[]> {\n const models: DocumentModelModule[] = [];\n if (flags.studioMode) {\n models.push(\n ...toDocumentModelModules(Object.values(await loaders.vetra())),\n );\n }\n if (flags.workflowsEnabled) {\n models.push(\n ...toDocumentModelModules(Object.values(await loaders.workflow())),\n );\n }\n return models;\n}\n","import type { ReactorFeatureFlags, SignerConfig } from \"@powerhousedao/reactor\";\nimport type { ReactorIdentity } from \"@powerhousedao/reactor-browser/rpc\";\nimport { RenownCryptoSigner, type IRenownCrypto } from \"@renown/sdk/crypto\";\nimport {\n createConnectSignerConfig,\n type RenownTrustEndpoints,\n} from \"./utils/renown-trust.js\";\n\n// Matches the main thread's RenownBuilder(\"connect\").\nexport const RENOWN_APP_NAME = \"connect\";\n\n/** The construct fields the worker's signer and trust policy read. */\nexport type WorkerSignerConstruct = {\n featureFlags?: Partial<ReactorFeatureFlags>;\n // Absent (a tab on an older build) fails the boot under authEnforcement.\n renownEndpoints?: RenownTrustEndpoints;\n};\n\n/** The worker's signer; its `user` is updated in place on identity changes. */\nexport async function createWorkerSignerConfig(\n crypto: IRenownCrypto,\n construct: WorkerSignerConstruct,\n identity: ReactorIdentity | undefined,\n): Promise<{ signer: RenownCryptoSigner; signerConfig: SignerConfig }> {\n const signer = new RenownCryptoSigner(crypto, RENOWN_APP_NAME, identity);\n const signerConfig = await createConnectSignerConfig(\n signer,\n construct.featureFlags,\n construct.renownEndpoints ?? {},\n );\n return { signer, signerConfig };\n}\n","import {\n ChannelScheme,\n DocumentIntegrityService,\n DriveCollectionId,\n InMemoryQueue,\n ReactorBuilder,\n ReactorClientBuilder,\n type ChannelConfig,\n type Database,\n type ISyncManager,\n type JwtHandler,\n type ReactorFeatureFlags,\n type Remote,\n type RemoteFilter,\n type RemoteOptions,\n} from \"@powerhousedao/reactor\";\nimport { baseDocumentModels } from \"@powerhousedao/reactor-browser/base-document-models\";\nimport {\n FORWARDED_EVENT_TYPES,\n ReactorHost,\n SYNC_STATUS_CHANGED_EVENT,\n WorkerPackageLoader,\n type ReactorIdentity,\n type WorkerMigrationState,\n} from \"@powerhousedao/reactor-browser/rpc\";\nimport type {\n DocumentModelModule,\n SignaturePolicy,\n} from \"@powerhousedao/shared/document-model\";\nimport {\n createRelationalDb,\n type IProcessorManager,\n type IRelationalDb,\n} from \"@powerhousedao/shared/processors\";\nimport * as commonDocumentModels from \"@powerhousedao/powerhouse-vetra-packages/document-models\";\nimport {\n loadFlaggedDocumentModels,\n toDocumentModelModules,\n} from \"./reactor-worker-models.js\";\nimport {\n BrowserKeyStorage,\n RenownCryptoBuilder,\n type RenownCryptoSigner,\n} from \"@renown/sdk/crypto\";\nimport { createWorkerSignerConfig } from \"./reactor-worker-signer.js\";\nimport type { RenownTrustEndpoints } from \"./utils/renown-trust.js\";\nimport type * as PgLiveModuleNs from \"@electric-sql/pglite/live\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport { readPgVersionFile } from \"./utils/pglite-idb.js\";\nimport {\n coerceMajor,\n CURRENT_PG_MAJOR,\n type DetectedMajor,\n loadPGliteModule,\n resolvePgMajorForRuntime,\n type SupportedPgMajor,\n} from \"./utils/pglite-major.js\";\nimport {\n type BackupStrategy,\n type FileDataEntry,\n clearFileData,\n migrateIdb,\n readFileData,\n writeFileData,\n} from \"./utils/pglite-migrate-core.js\";\n\nconsole.info(\"[reactor.worker] module evaluating\");\n\n// Common models the tab bundles as a local package; not CDN-loadable, so the\n// worker imports them directly. Vetra and workflow are flag-gated chunks.\nconst commonBundledModels = toDocumentModelModules(\n Object.values(commonDocumentModels),\n);\n\ntype WorkerConstruct = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\n // Absolute-URL shared-deps import map from the main thread; lets package\n // sources that import shared deps load as blobs in the worker (import\n // maps don't apply here).\n sharedImports?: Record<string, string>;\n studioMode?: boolean;\n // Loads the workflow package's document models. Independent of studioMode.\n workflowsEnabled?: boolean;\n // The worker has no runtime config, so the chain its bearer tokens are scoped\n // to is passed in; leaving it unset would sign for a chain nobody issues on.\n renownChainId?: number;\n // Same reason: enforcement flags arrive from the tab. Absent means all off,\n // which is what a tab on an older build sends.\n featureFlags?: Partial<ReactorFeatureFlags>;\n // What new documents are created as; absent means the reactor's default.\n createSignaturePolicy?: SignaturePolicy;\n // Where the trust policy verifies signers under authEnforcement.\n renownEndpoints?: RenownTrustEndpoints;\n};\n\ntype ModelRegistry = {\n registerModules: (...modules: DocumentModelModule[]) => void;\n};\n\nlet loader: WorkerPackageLoader | undefined;\nlet registry: ModelRegistry | undefined;\nlet signer: RenownCryptoSigner | undefined;\nlet syncManager: ISyncManager | undefined;\ntype RelationalState = {\n pg?: PgLiveModuleNs.PGliteWithLive;\n db?: IRelationalDb;\n};\nconst relational: RelationalState = {};\ntype OwnedStorage = {\n reactorPg?: {\n close: () => Promise<void>;\n query: (sql: string, params?: unknown[]) => Promise<{ rows: unknown[] }>;\n };\n reactorIdb?: string;\n relationalIdb?: string;\n};\nconst owned: OwnedStorage = {};\nlet inspectorQueue: InMemoryQueue | undefined;\nlet inspectorProcessors: IProcessorManager | undefined;\nlet inspectorIntegrity: DocumentIntegrityService | undefined;\nlet currentIdentity: ReactorIdentity | null = null;\nconst registeredKeys = new Set<string>();\n\nfunction modelKey(module: DocumentModelModule): string {\n return `${module.documentModel.global.id}@${module.version ?? 1}`;\n}\n\n// Cloneable projection of a Remote: meta (carries channelConfig) + connection snapshot.\nfunction toWireRemote(remote: Remote) {\n return {\n meta: remote.meta,\n connectionState: remote.channel.getConnectionState(),\n };\n}\n\n// Register only the delta; the registry rejects duplicate (type, version) pairs.\nfunction registerNewModules(): void {\n if (!loader || !registry) {\n return;\n }\n const fresh = loader.models.filter((m) => !registeredKeys.has(modelKey(m)));\n if (fresh.length === 0) {\n return;\n }\n registry.registerModules(...fresh);\n for (const m of fresh) {\n registeredKeys.add(modelKey(m));\n }\n}\n\n// Rebuild renown crypto from the shared renownKeyDB keypair (origin-scoped IndexedDB).\nasync function buildWorkerCrypto(chainId: number | undefined) {\n const keyStorage = await BrowserKeyStorage.create();\n const builder = new RenownCryptoBuilder().withKeyPairStorage(keyStorage);\n if (chainId !== undefined) {\n builder.withChainId(chainId);\n }\n return builder.build();\n}\n\n// Open against the major already on disk so a legacy PG16 dir isn't read by PG17.\nasync function openReactorPglite(namespace: string) {\n const detected = coerceMajor(await readPgVersionFile(`/pglite/${namespace}`));\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Running against legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const { PGlite } = await loadPGliteModule(major);\n const pg = new PGlite(`idb://${namespace}`, { relaxedDurability: true });\n await pg.waitReady;\n return { pg, detected };\n}\n\ntype PgLiveModule = typeof PgLiveModuleNs;\n\nasync function loadPgLive(major: SupportedPgMajor): Promise<PgLiveModule> {\n if (major === 16) {\n return import(\"pglite-legacy-02/live\") as unknown as Promise<PgLiveModule>;\n }\n return import(\"@electric-sql/pglite/live\");\n}\n\nasync function openRelational(namespace: string): Promise<DetectedMajor> {\n try {\n const detected = coerceMajor(\n await readPgVersionFile(`/pglite/${namespace}`),\n );\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Relational store opening legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const [{ PGlite }, { live }] = await Promise.all([\n loadPGliteModule(major),\n loadPgLive(major),\n ]);\n const pg = new PGlite(`idb://${namespace}`, {\n relaxedDurability: true,\n extensions: { live },\n });\n await pg.waitReady;\n relational.pg = pg as unknown as PgLiveModuleNs.PGliteWithLive;\n relational.db = createRelationalDb(\n new Kysely({ dialect: new PGliteDialect(pg) }),\n );\n console.info(\n `[reactor.worker] Relational store opened: idb://${namespace} (Postgres ${major}).`,\n );\n return detected;\n } catch (error) {\n console.error(\n \"[reactor.worker] Failed to open the relational store:\",\n error,\n );\n return null;\n }\n}\n\nlet migrationState: WorkerMigrationState = { status: \"idle\" };\n\nfunction setMigration(state: WorkerMigrationState): void {\n migrationState = state;\n host.setMigrationState(state);\n}\n\nconst inMemoryBackup: BackupStrategy = {\n snapshot: (idbName) => readFileData(idbName),\n rollback: (handle, idbName) =>\n writeFileData(idbName, handle as FileDataEntry[]),\n discard: () => Promise.resolve(),\n commit: () => Promise.resolve(),\n};\n\nconst workerName = (self as { name?: string }).name ?? \"\";\n\nconst host = new ReactorHost({\n namespace: workerName,\n onAdminRestart: () =>\n host.broadcastReload(\"admin restart\", crypto.randomUUID()),\n onAdminClearStorage: async () => {\n await relational.pg?.close();\n await owned.reactorPg?.close();\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await clearFileData(idbName);\n }\n }\n host.broadcastReload(\"storage cleared\", crypto.randomUUID());\n },\n onAdminMigrate: async () => {\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n });\n if (relational.pg) await relational.pg.close().catch(() => undefined);\n if (owned.reactorPg) await owned.reactorPg.close().catch(() => undefined);\n try {\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await migrateIdb(\n idbName,\n (phase) =>\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n phase,\n }),\n inMemoryBackup,\n );\n }\n }\n host.broadcastReload(\"migration complete\", crypto.randomUUID());\n } catch (error) {\n console.error(\"[reactor.worker] Migration failed:\", error);\n setMigration({\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n });\n host.broadcastReload(\"migration failed\", crypto.randomUUID());\n }\n },\n build: async (raw) => {\n let phase = \"init\";\n try {\n const construct = raw as WorkerConstruct;\n phase = \"loading packages\";\n console.info(`[reactor.worker] boot: ${phase}`);\n loader = new WorkerPackageLoader({\n cdnUrl: construct.cdnUrl,\n importPackage: (url) =>\n import(/* @vite-ignore */ url) as Promise<Record<string, unknown>>,\n sharedImports: construct.sharedImports,\n importSource: (source) =>\n import(\n /* @vite-ignore */ URL.createObjectURL(\n new Blob([source], { type: \"text/javascript\" }),\n )\n ) as Promise<Record<string, unknown>>,\n });\n const loaded = await loader.loadPackages(construct.packageSpecs);\n const flaggedModels = await loadFlaggedDocumentModels({\n studioMode: construct.studioMode,\n workflowsEnabled: construct.workflowsEnabled,\n });\n const models = baseDocumentModels.concat(\n commonBundledModels,\n flaggedModels,\n loaded,\n );\n phase = \"opening pglite stores\";\n console.info(`[reactor.worker] boot: ${phase}`);\n\n //this has to be serial: concurrent PGlite constructors consume the same\n // cached one-shot wasm \"Response\" object\n const reactor = await openReactorPglite(construct.namespace);\n const relationalMajor = await openRelational(\n construct.relationalNamespace,\n );\n const pg = reactor.pg;\n owned.reactorPg = pg;\n owned.reactorIdb = `/pglite/${construct.namespace}`;\n owned.relationalIdb = `/pglite/${construct.relationalNamespace}`;\n // A store is migratable when coerceMajor kept it (a supported legacy\n // major) and it is not the current one; openers already read PG_VERSION.\n const legacyMajor = [reactor.detected, relationalMajor].find(\n (m): m is SupportedPgMajor => m !== null && m !== CURRENT_PG_MAJOR,\n );\n if (legacyMajor !== undefined) {\n setMigration({ status: \"needed\", legacyMajor });\n }\n phase = \"building crypto\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const crypto = await buildWorkerCrypto(construct.renownChainId);\n phase = \"building signer\";\n const built = await createWorkerSignerConfig(\n crypto,\n construct,\n currentIdentity ?? undefined,\n );\n signer = built.signer;\n const jwtHandler: JwtHandler = async () =>\n currentIdentity\n ? crypto.getBearerToken(currentIdentity.address, { expiresIn: 10 })\n : undefined;\n phase = \"building reactor module\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const builder = new ReactorClientBuilder()\n .withSigner(built.signerConfig)\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModelSources(models)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withExecutorConfig({ featureFlags: construct.featureFlags ?? {} })\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({ dialect: new PGliteDialect(pg) }),\n ),\n );\n builder.withDocumentModelLoader(loader);\n if (construct.createSignaturePolicy) {\n builder.withCreateSignaturePolicy(construct.createSignaturePolicy);\n }\n const module = await builder.buildModule();\n registry = module.reactorModule?.documentModelRegistry;\n syncManager = module.reactorModule?.syncModule?.syncManager;\n const rm = module.reactorModule;\n if (rm) {\n inspectorQueue =\n rm.queue instanceof InMemoryQueue ? rm.queue : undefined;\n inspectorProcessors = rm.processorManager;\n inspectorIntegrity = new DocumentIntegrityService(\n rm.keyframeStore,\n rm.operationStore,\n rm.writeCache,\n rm.documentView,\n rm.documentModelRegistry,\n );\n }\n for (const m of models) {\n registeredKeys.add(modelKey(m));\n }\n for (const type of FORWARDED_EVENT_TYPES) {\n module.eventBus.subscribe(type, (forwardedType, event) =>\n host.broadcastBusEvent(forwardedType, event),\n );\n }\n syncManager?.onSyncStatusChange((documentId, status) =>\n host.broadcastBusEvent(SYNC_STATUS_CHANGED_EVENT, {\n documentId,\n status,\n }),\n );\n console.info(\"[reactor.worker] boot: complete\");\n return module.client;\n } catch (error) {\n console.error(`[reactor.worker] boot failed at phase \"${phase}\":`, error);\n throw error;\n }\n },\n registerPackages: async (specs) => {\n if (!loader) {\n return;\n }\n await loader.loadPackages(specs);\n registerNewModules();\n },\n onIdentity: (user) => {\n currentIdentity = user;\n if (signer) {\n signer.user = user ?? undefined;\n }\n },\n onSyncOp: async (method, args) => {\n if (!syncManager) {\n throw new Error(\"SyncManager not available\");\n }\n switch (method) {\n case \"list\":\n return syncManager.list().map(toWireRemote);\n case \"add\": {\n const [name, collectionIdKey, channelConfig, filter, options] =\n args as [\n string,\n string,\n ChannelConfig,\n RemoteFilter | undefined,\n RemoteOptions | undefined,\n ];\n const remote = await syncManager.add(\n name,\n DriveCollectionId.fromKey(collectionIdKey),\n channelConfig,\n filter,\n options,\n );\n return toWireRemote(remote);\n }\n case \"bindRemote\":\n await syncManager.bindRemote(args[0] as string, args[1] as string);\n return undefined;\n case \"remove\":\n await syncManager.remove(args[0] as string);\n return undefined;\n case \"triggerPull\":\n syncManager.triggerPull(args[0] as string);\n return undefined;\n default:\n throw new Error(`Unknown sync op: ${method}`);\n }\n },\n onDbOp: async (method, args) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n switch (method) {\n case \"query\": {\n const [sql, params] = args as [string, unknown[]];\n const result = await relational.pg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown db op: ${method}`);\n }\n },\n onLiveQuery: async (sql, params, onResults) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n const live = await relational.pg.live.query(sql, params, (results) =>\n onResults(results),\n );\n return () => {\n void live.unsubscribe();\n };\n },\n onInspectorOp: async (method, args) => {\n switch (method) {\n case \"queue.getState\": {\n if (!inspectorQueue) {\n return {\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n };\n }\n const pendingJobs = inspectorQueue.getPendingJobs();\n const executingJobs = [];\n for (const jobIds of inspectorQueue.getExecutingJobIds().values()) {\n for (const jobId of jobIds) {\n const job = inspectorQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n return {\n isPaused: inspectorQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n };\n }\n case \"queue.pause\":\n inspectorQueue?.pause();\n return undefined;\n case \"queue.resume\":\n await inspectorQueue?.resume();\n return undefined;\n case \"processors.getAll\":\n return (inspectorProcessors?.getAll() ?? []).map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n }));\n case \"processors.retry\": {\n const [processorId] = args as [string];\n await inspectorProcessors?.get(processorId)?.retry();\n return undefined;\n }\n case \"integrity.validate\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.validateDocument(documentId, branch);\n }\n case \"integrity.rebuildKeyframes\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildKeyframes(documentId, branch);\n }\n case \"integrity.rebuildSnapshots\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildSnapshots(documentId, branch);\n }\n case \"db.query\": {\n if (!owned.reactorPg) {\n throw new Error(\"Reactor store not available\");\n }\n const [sql, params] = args as [string, unknown[]];\n const result = await owned.reactorPg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown inspector op: ${method}`);\n }\n },\n});\n\ntype WorkerGlobalErrorEvent = {\n message?: string;\n error?: unknown;\n reason?: unknown;\n};\n\nconst globalScope = self as unknown as {\n addEventListener: (\n type: \"error\" | \"unhandledrejection\",\n listener: (event: WorkerGlobalErrorEvent) => void,\n ) => void;\n onconnect: ((event: MessageEvent) => void) | null;\n};\n\nglobalScope.addEventListener(\"error\", (event) => {\n console.error(\n \"[reactor.worker] uncaught error\",\n event.message ?? event.error ?? event,\n );\n});\nglobalScope.addEventListener(\"unhandledrejection\", (event) => {\n console.error(\"[reactor.worker] unhandled rejection\", event.reason);\n});\n\nglobalScope.onconnect = (event) => {\n const port = event.ports[0];\n if (port) {\n try {\n host.connectPort(port);\n } catch (error) {\n console.error(\"[reactor.worker] failed to connect port\", error);\n }\n }\n};\n"],"names":[],"mappings":"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","debug_id":"6ecb154f-352b-5cf3-bbbb-af9ed5168442"}
|
|
1
|
+
{"version":3,"file":"reactor.worker.js","sources":["../src/reactor-worker-models.ts","../src/reactor-worker-signer.ts","../src/reactor.worker.ts"],"sourcesContent":["import type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\n\n// A `document-models` barrel also re-exports types, schemas and helpers; keep\n// only the entries that are document-model modules.\nexport function toDocumentModelModules(\n candidates: unknown[],\n): DocumentModelModule[] {\n return candidates.filter(\n (m): m is DocumentModelModule =>\n typeof m === \"object\" &&\n m !== null &&\n \"documentModel\" in m &&\n \"reducer\" in m,\n );\n}\n\n/** Which of the bundled-but-optional packages this worker registers. */\nexport type BundledModelFlags = {\n /** Builder mode: vetra's spec document models. */\n studioMode?: boolean;\n /** Powerhouse workflows: the workflow + connection document models. */\n workflowsEnabled?: boolean;\n};\n\nexport type BundledModelLoaders = {\n vetra: () => Promise<Record<string, unknown>>;\n workflow: () => Promise<Record<string, unknown>>;\n};\n\n// Neither package is CDN-loadable, so neither can ride the `packageSpecs`\n// path; each is a chunk fetched only when its own flag is on.\nexport const defaultBundledModelLoaders: BundledModelLoaders = {\n vetra: () => import(\"@powerhousedao/vetra/document-models\"),\n workflow: () => import(\"@powerhousedao/workflow/document-models\"),\n};\n\n// The flags are independent: studio mode does not imply workflows, nor the\n// other way round.\nexport async function loadFlaggedDocumentModels(\n flags: BundledModelFlags,\n loaders: BundledModelLoaders = defaultBundledModelLoaders,\n): Promise<DocumentModelModule[]> {\n const models: DocumentModelModule[] = [];\n if (flags.studioMode) {\n models.push(\n ...toDocumentModelModules(Object.values(await loaders.vetra())),\n );\n }\n if (flags.workflowsEnabled) {\n models.push(\n ...toDocumentModelModules(Object.values(await loaders.workflow())),\n );\n }\n return models;\n}\n","import type { ReactorFeatureFlags, SignerConfig } from \"@powerhousedao/reactor\";\nimport type { ReactorIdentity } from \"@powerhousedao/reactor-browser/rpc\";\nimport { RenownCryptoSigner, type IRenownCrypto } from \"@renown/sdk/crypto\";\nimport {\n createConnectSignerConfig,\n type RenownTrustEndpoints,\n} from \"./utils/renown-trust.js\";\n\n// Matches the main thread's RenownBuilder(\"connect\").\nexport const RENOWN_APP_NAME = \"connect\";\n\n/** The construct fields the worker's signer and trust policy read. */\nexport type WorkerSignerConstruct = {\n featureFlags?: Partial<ReactorFeatureFlags>;\n // Absent (a tab on an older build) fails the boot under authEnforcement.\n renownEndpoints?: RenownTrustEndpoints;\n};\n\n/** The worker's signer; its `user` is updated in place on identity changes. */\nexport async function createWorkerSignerConfig(\n crypto: IRenownCrypto,\n construct: WorkerSignerConstruct,\n identity: ReactorIdentity | undefined,\n): Promise<{ signer: RenownCryptoSigner; signerConfig: SignerConfig }> {\n const signer = new RenownCryptoSigner(crypto, RENOWN_APP_NAME, identity);\n const signerConfig = await createConnectSignerConfig(\n signer,\n construct.featureFlags,\n construct.renownEndpoints ?? {},\n );\n return { signer, signerConfig };\n}\n","import {\n ChannelScheme,\n DocumentIntegrityService,\n DriveCollectionId,\n InMemoryQueue,\n ReactorBuilder,\n ReactorClientBuilder,\n type ChannelConfig,\n type Database,\n type ICatchUp,\n type ISyncManager,\n type JwtHandler,\n type ReactorFeatureFlags,\n type Remote,\n type RemoteFilter,\n type RemoteOptions,\n type UnsupportedStoredDocuments,\n} from \"@powerhousedao/reactor\";\nimport { baseDocumentModels } from \"@powerhousedao/reactor-browser/base-document-models\";\nimport {\n FORWARDED_EVENT_TYPES,\n ReactorHost,\n SYNC_STATUS_CHANGED_EVENT,\n WorkerPackageLoader,\n type ReactorIdentity,\n type WorkerMigrationState,\n} from \"@powerhousedao/reactor-browser/rpc\";\nimport type {\n DocumentModelModule,\n PeerManifest,\n SignaturePolicy,\n} from \"@powerhousedao/shared/document-model\";\nimport {\n createRelationalDb,\n type IProcessorManager,\n type IRelationalDb,\n} from \"@powerhousedao/shared/processors\";\nimport * as commonDocumentModels from \"@powerhousedao/powerhouse-vetra-packages/document-models\";\nimport {\n loadFlaggedDocumentModels,\n toDocumentModelModules,\n} from \"./reactor-worker-models.js\";\nimport {\n BrowserKeyStorage,\n RenownCryptoBuilder,\n type RenownCryptoSigner,\n} from \"@renown/sdk/crypto\";\nimport { createWorkerSignerConfig } from \"./reactor-worker-signer.js\";\nimport type { RenownTrustEndpoints } from \"./utils/renown-trust.js\";\nimport { toStoredDocumentsRefused } from \"./utils/stored-documents-refused.js\";\nimport type * as PgLiveModuleNs from \"@electric-sql/pglite/live\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport { readPgVersionFile } from \"./utils/pglite-idb.js\";\nimport {\n coerceMajor,\n CURRENT_PG_MAJOR,\n type DetectedMajor,\n loadPGliteModule,\n resolvePgMajorForRuntime,\n type SupportedPgMajor,\n} from \"./utils/pglite-major.js\";\nimport {\n type BackupStrategy,\n type FileDataEntry,\n clearFileData,\n migrateIdb,\n readFileData,\n writeFileData,\n} from \"./utils/pglite-migrate-core.js\";\n\nconsole.info(\"[reactor.worker] module evaluating\");\n\n// Common models the tab bundles as a local package; not CDN-loadable, so the\n// worker imports them directly. Vetra and workflow are flag-gated chunks.\nconst commonBundledModels = toDocumentModelModules(\n Object.values(commonDocumentModels),\n);\n\ntype WorkerConstruct = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\n // Absolute-URL shared-deps import map from the main thread; lets package\n // sources that import shared deps load as blobs in the worker (import\n // maps don't apply here).\n sharedImports?: Record<string, string>;\n studioMode?: boolean;\n // Loads the workflow package's document models. Independent of studioMode.\n workflowsEnabled?: boolean;\n // The worker has no runtime config, so the chain its bearer tokens are scoped\n // to is passed in; leaving it unset would sign for a chain nobody issues on.\n renownChainId?: number;\n // Same reason: enforcement flags arrive from the tab. Absent means all off,\n // which is what a tab on an older build sends.\n featureFlags?: Partial<ReactorFeatureFlags>;\n // What new documents are created as; absent means the reactor's default.\n createSignaturePolicy?: SignaturePolicy;\n // Absent means the reactor's default, refuse.\n unsupportedStoredDocuments?: UnsupportedStoredDocuments;\n // Where the trust policy verifies signers under authEnforcement.\n renownEndpoints?: RenownTrustEndpoints;\n};\n\ntype ModelRegistry = {\n registerModules: (...modules: DocumentModelModule[]) => void;\n};\n\nlet loader: WorkerPackageLoader | undefined;\nlet registry: ModelRegistry | undefined;\nlet signer: RenownCryptoSigner | undefined;\nlet syncManager: ISyncManager | undefined;\ntype RelationalState = {\n pg?: PgLiveModuleNs.PGliteWithLive;\n db?: IRelationalDb;\n};\nconst relational: RelationalState = {};\ntype OwnedStorage = {\n reactorPg?: {\n close: () => Promise<void>;\n query: (sql: string, params?: unknown[]) => Promise<{ rows: unknown[] }>;\n };\n reactorIdb?: string;\n relationalIdb?: string;\n};\nconst owned: OwnedStorage = {};\nlet inspectorQueue: InMemoryQueue | undefined;\nlet inspectorProcessors: IProcessorManager | undefined;\nlet inspectorIntegrity: DocumentIntegrityService | undefined;\nlet inspectorCatchUp: ICatchUp | undefined;\nlet currentIdentity: ReactorIdentity | null = null;\nconst registeredKeys = new Set<string>();\n\nfunction modelKey(module: DocumentModelModule): string {\n return `${module.documentModel.global.id}@${module.version ?? 1}`;\n}\n\n// Cloneable projection of a Remote: meta (carries channelConfig) + connection snapshot.\nfunction toWireRemote(remote: Remote) {\n return {\n meta: remote.meta,\n connectionState: remote.channel.getConnectionState(),\n };\n}\n\n// Register only the delta; the registry rejects duplicate (type, version) pairs.\nfunction registerNewModules(): void {\n if (!loader || !registry) {\n return;\n }\n const fresh = loader.models.filter((m) => !registeredKeys.has(modelKey(m)));\n if (fresh.length === 0) {\n return;\n }\n registry.registerModules(...fresh);\n for (const m of fresh) {\n registeredKeys.add(modelKey(m));\n }\n}\n\n// Rebuild renown crypto from the shared renownKeyDB keypair (origin-scoped IndexedDB).\nasync function buildWorkerCrypto(chainId: number | undefined) {\n const keyStorage = await BrowserKeyStorage.create();\n const builder = new RenownCryptoBuilder().withKeyPairStorage(keyStorage);\n if (chainId !== undefined) {\n builder.withChainId(chainId);\n }\n return builder.build();\n}\n\n// Open against the major already on disk so a legacy PG16 dir isn't read by PG17.\nasync function openReactorPglite(namespace: string) {\n const detected = coerceMajor(await readPgVersionFile(`/pglite/${namespace}`));\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Running against legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const { PGlite } = await loadPGliteModule(major);\n const pg = new PGlite(`idb://${namespace}`, { relaxedDurability: true });\n await pg.waitReady;\n return { pg, detected };\n}\n\ntype PgLiveModule = typeof PgLiveModuleNs;\n\nasync function loadPgLive(major: SupportedPgMajor): Promise<PgLiveModule> {\n if (major === 16) {\n return import(\"pglite-legacy-02/live\") as unknown as Promise<PgLiveModule>;\n }\n return import(\"@electric-sql/pglite/live\");\n}\n\nasync function openRelational(namespace: string): Promise<DetectedMajor> {\n try {\n const detected = coerceMajor(\n await readPgVersionFile(`/pglite/${namespace}`),\n );\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Relational store opening legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const [{ PGlite }, { live }] = await Promise.all([\n loadPGliteModule(major),\n loadPgLive(major),\n ]);\n const pg = new PGlite(`idb://${namespace}`, {\n relaxedDurability: true,\n extensions: { live },\n });\n await pg.waitReady;\n relational.pg = pg as unknown as PgLiveModuleNs.PGliteWithLive;\n relational.db = createRelationalDb(\n new Kysely({ dialect: new PGliteDialect(pg) }),\n );\n console.info(\n `[reactor.worker] Relational store opened: idb://${namespace} (Postgres ${major}).`,\n );\n return detected;\n } catch (error) {\n console.error(\n \"[reactor.worker] Failed to open the relational store:\",\n error,\n );\n return null;\n }\n}\n\nlet migrationState: WorkerMigrationState = { status: \"idle\" };\n\nfunction setMigration(state: WorkerMigrationState): void {\n migrationState = state;\n host.setMigrationState(state);\n}\n\nconst inMemoryBackup: BackupStrategy = {\n snapshot: (idbName) => readFileData(idbName),\n rollback: (handle, idbName) =>\n writeFileData(idbName, handle as FileDataEntry[]),\n discard: () => Promise.resolve(),\n commit: () => Promise.resolve(),\n};\n\nasync function releaseStores(): Promise<void> {\n const stores = [relational.pg, owned.reactorPg];\n relational.pg = undefined;\n relational.db = undefined;\n owned.reactorPg = undefined;\n for (const store of stores) {\n try {\n await store?.close();\n } catch (error) {\n console.error(\"[reactor.worker] closing a store failed:\", error);\n }\n }\n}\n\nconst workerName = (self as { name?: string }).name ?? \"\";\n\nconst host = new ReactorHost({\n namespace: workerName,\n onAdminRestart: () =>\n host.broadcastReload(\"admin restart\", crypto.randomUUID()),\n onAdminClearStorage: async () => {\n await relational.pg?.close();\n await owned.reactorPg?.close();\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await clearFileData(idbName);\n }\n }\n host.broadcastReload(\"storage cleared\", crypto.randomUUID());\n },\n onAdminMigrate: async () => {\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n });\n if (relational.pg) await relational.pg.close().catch(() => undefined);\n if (owned.reactorPg) await owned.reactorPg.close().catch(() => undefined);\n try {\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await migrateIdb(\n idbName,\n (phase) =>\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n phase,\n }),\n inMemoryBackup,\n );\n }\n }\n host.broadcastReload(\"migration complete\", crypto.randomUUID());\n } catch (error) {\n console.error(\"[reactor.worker] Migration failed:\", error);\n setMigration({\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n });\n host.broadcastReload(\"migration failed\", crypto.randomUUID());\n }\n },\n build: async (raw) => {\n let phase = \"init\";\n try {\n const construct = raw as WorkerConstruct;\n phase = \"loading packages\";\n console.info(`[reactor.worker] boot: ${phase}`);\n loader = new WorkerPackageLoader({\n cdnUrl: construct.cdnUrl,\n importPackage: (url) =>\n import(/* @vite-ignore */ url) as Promise<Record<string, unknown>>,\n sharedImports: construct.sharedImports,\n importSource: (source) =>\n import(\n /* @vite-ignore */ URL.createObjectURL(\n new Blob([source], { type: \"text/javascript\" }),\n )\n ) as Promise<Record<string, unknown>>,\n });\n const loaded = await loader.loadPackages(construct.packageSpecs);\n const flaggedModels = await loadFlaggedDocumentModels({\n studioMode: construct.studioMode,\n workflowsEnabled: construct.workflowsEnabled,\n });\n const models = baseDocumentModels.concat(\n commonBundledModels,\n flaggedModels,\n loaded,\n );\n phase = \"opening pglite stores\";\n console.info(`[reactor.worker] boot: ${phase}`);\n\n //this has to be serial: concurrent PGlite constructors consume the same\n // cached one-shot wasm \"Response\" object\n const reactor = await openReactorPglite(construct.namespace);\n const relationalMajor = await openRelational(\n construct.relationalNamespace,\n );\n const pg = reactor.pg;\n owned.reactorPg = pg;\n owned.reactorIdb = `/pglite/${construct.namespace}`;\n owned.relationalIdb = `/pglite/${construct.relationalNamespace}`;\n // A store is migratable when coerceMajor kept it (a supported legacy\n // major) and it is not the current one; openers already read PG_VERSION.\n const legacyMajor = [reactor.detected, relationalMajor].find(\n (m): m is SupportedPgMajor => m !== null && m !== CURRENT_PG_MAJOR,\n );\n if (legacyMajor !== undefined) {\n setMigration({ status: \"needed\", legacyMajor });\n }\n phase = \"building crypto\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const crypto = await buildWorkerCrypto(construct.renownChainId);\n phase = \"building signer\";\n const built = await createWorkerSignerConfig(\n crypto,\n construct,\n currentIdentity ?? undefined,\n );\n signer = built.signer;\n const jwtHandler: JwtHandler = async () =>\n currentIdentity\n ? crypto.getBearerToken(currentIdentity.address, { expiresIn: 10 })\n : undefined;\n phase = \"building reactor module\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const reactorBuilder = new ReactorBuilder()\n .withDocumentModelSources(models)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withExecutorConfig({ featureFlags: construct.featureFlags ?? {} })\n .withJwtHandler(jwtHandler)\n .withKysely(new Kysely<Database>({ dialect: new PGliteDialect(pg) }));\n if (construct.unsupportedStoredDocuments) {\n reactorBuilder.withUnsupportedStoredDocuments(\n construct.unsupportedStoredDocuments,\n );\n }\n const builder = new ReactorClientBuilder()\n .withSigner(built.signerConfig)\n .withReactorBuilder(reactorBuilder);\n builder.withDocumentModelLoader(loader);\n if (construct.createSignaturePolicy) {\n builder.withCreateSignaturePolicy(construct.createSignaturePolicy);\n }\n const module = await builder.buildModule();\n registry = module.reactorModule?.documentModelRegistry;\n syncManager = module.reactorModule?.syncModule?.syncManager;\n const rm = module.reactorModule;\n if (rm) {\n inspectorQueue =\n rm.queue instanceof InMemoryQueue ? rm.queue : undefined;\n inspectorProcessors = rm.processorManager;\n inspectorCatchUp = rm.catchUp;\n inspectorIntegrity = new DocumentIntegrityService(\n rm.keyframeStore,\n rm.operationStore,\n rm.writeCache,\n rm.documentView,\n rm.documentModelRegistry,\n );\n }\n for (const m of models) {\n registeredKeys.add(modelKey(m));\n }\n for (const type of FORWARDED_EVENT_TYPES) {\n module.eventBus.subscribe(type, (forwardedType, event) =>\n host.broadcastBusEvent(forwardedType, event),\n );\n }\n syncManager?.onSyncStatusChange((documentId, status) =>\n host.broadcastBusEvent(SYNC_STATUS_CHANGED_EVENT, {\n documentId,\n status,\n }),\n );\n console.info(\"[reactor.worker] boot: complete\");\n return module.client;\n } catch (error) {\n console.error(`[reactor.worker] boot failed at phase \"${phase}\":`, error);\n // The next hello rebuilds, which reopens both stores.\n await releaseStores();\n throw toStoredDocumentsRefused(error);\n }\n },\n registerPackages: async (specs) => {\n if (!loader) {\n return;\n }\n await loader.loadPackages(specs);\n registerNewModules();\n },\n onIdentity: (user) => {\n currentIdentity = user;\n if (signer) {\n signer.user = user ?? undefined;\n }\n },\n onSyncOp: async (method, args) => {\n if (!syncManager) {\n throw new Error(\"SyncManager not available\");\n }\n switch (method) {\n case \"list\":\n return syncManager.list().map(toWireRemote);\n case \"add\": {\n const [name, collectionIdKey, channelConfig, filter, options] =\n args as [\n string,\n string,\n ChannelConfig,\n RemoteFilter | undefined,\n RemoteOptions | undefined,\n ];\n const remote = await syncManager.add(\n name,\n DriveCollectionId.fromKey(collectionIdKey),\n channelConfig,\n filter,\n options,\n );\n return toWireRemote(remote);\n }\n case \"bindRemote\":\n await syncManager.bindRemote(args[0] as string, args[1] as string);\n return undefined;\n case \"setPeerManifest\":\n await syncManager.setPeerManifest(\n args[0] as string,\n args[1] as PeerManifest | null,\n );\n return undefined;\n case \"peerAgreementBasis\":\n return syncManager.agreement().basis();\n case \"listHolds\":\n return syncManager.listHolds(\n args[0] as { remoteName?: string; documentId?: string } | undefined,\n );\n case \"remove\":\n await syncManager.remove(args[0] as string);\n return undefined;\n case \"triggerPull\":\n syncManager.triggerPull(args[0] as string);\n return undefined;\n default:\n throw new Error(`Unknown sync op: ${method}`);\n }\n },\n onDbOp: async (method, args) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n switch (method) {\n case \"query\": {\n const [sql, params] = args as [string, unknown[]];\n const result = await relational.pg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown db op: ${method}`);\n }\n },\n onLiveQuery: async (sql, params, onResults) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n const live = await relational.pg.live.query(sql, params, (results) =>\n onResults(results),\n );\n return () => {\n void live.unsubscribe();\n };\n },\n onInspectorOp: async (method, args) => {\n switch (method) {\n case \"queue.getState\": {\n if (!inspectorQueue) {\n return {\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n };\n }\n const pendingJobs = inspectorQueue.getPendingJobs();\n const executingJobs = [];\n for (const jobIds of inspectorQueue.getExecutingJobIds().values()) {\n for (const jobId of jobIds) {\n const job = inspectorQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n return {\n isPaused: inspectorQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n };\n }\n case \"queue.pause\":\n inspectorQueue?.pause();\n return undefined;\n case \"queue.resume\":\n await inspectorQueue?.resume();\n return undefined;\n case \"processors.getAll\":\n return (inspectorProcessors?.getAll() ?? []).map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n }));\n case \"processors.retry\": {\n const [processorId] = args as [string];\n await inspectorProcessors?.get(processorId)?.retry();\n return undefined;\n }\n case \"catchUp.status\":\n if (!inspectorCatchUp) {\n throw new Error(\"Catch-up not available\");\n }\n return inspectorCatchUp.status();\n case \"catchUp.sweepNow\":\n if (!inspectorCatchUp) {\n throw new Error(\"Catch-up not available\");\n }\n return inspectorCatchUp.sweepNow();\n case \"integrity.validate\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.validateDocument(documentId, branch);\n }\n case \"integrity.rebuildKeyframes\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildKeyframes(documentId, branch);\n }\n case \"integrity.rebuildSnapshots\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildSnapshots(documentId, branch);\n }\n case \"db.query\": {\n if (!owned.reactorPg) {\n throw new Error(\"Reactor store not available\");\n }\n const [sql, params] = args as [string, unknown[]];\n const result = await owned.reactorPg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown inspector op: ${method}`);\n }\n },\n});\n\ntype WorkerGlobalErrorEvent = {\n message?: string;\n error?: unknown;\n reason?: unknown;\n};\n\nconst globalScope = self as unknown as {\n addEventListener: (\n type: \"error\" | \"unhandledrejection\",\n listener: (event: WorkerGlobalErrorEvent) => void,\n ) => void;\n onconnect: ((event: MessageEvent) => void) | null;\n};\n\nglobalScope.addEventListener(\"error\", (event) => {\n console.error(\n \"[reactor.worker] uncaught error\",\n event.message ?? event.error ?? event,\n );\n});\nglobalScope.addEventListener(\"unhandledrejection\", (event) => {\n console.error(\"[reactor.worker] unhandled rejection\", event.reason);\n});\n\nglobalScope.onconnect = (event) => {\n const port = event.ports[0];\n if (port) {\n try {\n host.connectPort(port);\n } catch (error) {\n console.error(\"[reactor.worker] failed to connect port\", error);\n }\n }\n};\n"],"names":[],"mappings":"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","debug_id":"951f920d-891c-50dc-a918-f37ec9402372"}
|
package/dist/start-connect.js
CHANGED
|
@@ -4,7 +4,7 @@ import { t as bootConnect } from "./boot-DPNEOI2A.js";
|
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
//#region start-connect.tsx
|
|
6
6
|
const root = await bootConnect();
|
|
7
|
-
const components = root ? await import("./components-
|
|
7
|
+
const components = root ? await import("./components-DlHtXnSo.js") : null;
|
|
8
8
|
function updateLocalPackage(pkg) {
|
|
9
9
|
window.ph?.vetraPackageManager?.updateLocalPackage(pkg);
|
|
10
10
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/connect",
|
|
3
3
|
"productName": "Powerhouse-Connect",
|
|
4
|
-
"version": "6.2.3-dev.
|
|
4
|
+
"version": "6.2.3-dev.34",
|
|
5
5
|
"description": "Powerhouse Connect",
|
|
6
6
|
"main": "dist/index.html",
|
|
7
7
|
"type": "module",
|
|
@@ -56,23 +56,23 @@
|
|
|
56
56
|
"@openfeature/core": "1.9.1",
|
|
57
57
|
"@openfeature/web-sdk": "1.6.2",
|
|
58
58
|
"@openpanel/web": "^1.4.1",
|
|
59
|
-
"@powerhousedao/config": "6.2.3-dev.
|
|
60
|
-
"@powerhousedao/design-system": "6.2.3-dev.
|
|
59
|
+
"@powerhousedao/config": "6.2.3-dev.34",
|
|
60
|
+
"@powerhousedao/design-system": "6.2.3-dev.34",
|
|
61
61
|
"@powerhousedao/document-engineering": "1.40.5",
|
|
62
|
-
"@powerhousedao/powerhouse-vetra-packages": "6.2.3-dev.
|
|
63
|
-
"@powerhousedao/reactor": "6.2.3-dev.
|
|
64
|
-
"@powerhousedao/reactor-attachments": "6.2.3-dev.
|
|
65
|
-
"@powerhousedao/reactor-browser": "6.2.3-dev.
|
|
66
|
-
"@powerhousedao/reactor-mcp": "6.2.3-dev.
|
|
67
|
-
"@powerhousedao/shared": "6.2.3-dev.
|
|
68
|
-
"@powerhousedao/vetra": "6.2.3-dev.
|
|
69
|
-
"@powerhousedao/workflow": "6.2.3-dev.
|
|
62
|
+
"@powerhousedao/powerhouse-vetra-packages": "6.2.3-dev.34",
|
|
63
|
+
"@powerhousedao/reactor": "6.2.3-dev.34",
|
|
64
|
+
"@powerhousedao/reactor-attachments": "6.2.3-dev.34",
|
|
65
|
+
"@powerhousedao/reactor-browser": "6.2.3-dev.34",
|
|
66
|
+
"@powerhousedao/reactor-mcp": "6.2.3-dev.34",
|
|
67
|
+
"@powerhousedao/shared": "6.2.3-dev.34",
|
|
68
|
+
"@powerhousedao/vetra": "6.2.3-dev.34",
|
|
69
|
+
"@powerhousedao/workflow": "6.2.3-dev.34",
|
|
70
70
|
"@privy-io/react-auth": "3.35.0",
|
|
71
71
|
"@rainbow-me/rainbowkit": "^2.2.11",
|
|
72
|
-
"@renown/sdk": "6.2.3-dev.
|
|
72
|
+
"@renown/sdk": "6.2.3-dev.34",
|
|
73
73
|
"@sentry/react": "^10.17.0",
|
|
74
74
|
"@tanstack/react-query": "^5.90.2",
|
|
75
|
-
"document-model": "6.2.3-dev.
|
|
75
|
+
"document-model": "6.2.3-dev.34",
|
|
76
76
|
"i18next": "^25.5.3",
|
|
77
77
|
"kysely": "0.28.16",
|
|
78
78
|
"kysely-pglite-dialect": "1.2.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InspectorModal-tGsfYXkd.js","sources":["../src/components/modal/modals/InspectorModal/useDbExplorer.ts","../src/components/modal/modals/InspectorModal/useDebugInspector.ts","../src/components/modal/modals/InspectorModal/useIntegrityInspector.ts","../src/components/modal/modals/InspectorModal/useProcessorsInspector.ts","../src/components/modal/modals/InspectorModal/useQueueInspector.ts","../src/components/modal/modals/InspectorModal/useRemotesInspector.ts","../src/components/modal/modals/InspectorModal/useWorkerInspector.ts","../src/components/modal/modals/InspectorModal/InspectorModal.tsx"],"sourcesContent":["import type { PGlite } from \"@electric-sql/pglite\";\nimport {\n getCachedReactorPgMajor,\n loadPgDump,\n resolvePgMajorForRuntime,\n} from \"@powerhousedao/connect/utils\";\nimport type {\n FilterGroup,\n SortOptions,\n} from \"@powerhousedao/design-system/connect\";\nimport type { Database } from \"@powerhousedao/reactor\";\nimport {\n REACTOR_SCHEMA,\n useDatabase,\n usePGlite,\n useReactorClientModule,\n type IQueue,\n} from \"@powerhousedao/reactor-browser\";\nimport type { IInspectorProxy } from \"@powerhousedao/reactor-browser/rpc\";\nimport { Kysely, sql } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport { useCallback, useMemo } from \"react\";\n\nasync function quiesceQueue(queue: IQueue): Promise<void> {\n await new Promise<void>((resolve) => queue.block(() => resolve()));\n}\n\n// The reactor runs with `relaxedDurability: true`, which makes PGlite's\n// `syncToFs()` fire the IDBFS→IndexedDB write and return without awaiting\n// Emscripten's syncfs callback. `close()` also doesn't flush. Calling\n// `FS.syncfs(false, cb)` directly gives us a callback that fires from the\n// IDBFS transaction's `oncomplete` — i.e. after IDB has actually committed.\nasync function syncPgliteToIdb(pglite: {\n readonly Module: {\n readonly FS: {\n syncfs(populate: boolean, cb: (err: Error | null) => void): void;\n };\n };\n}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n pglite.Module.FS.syncfs(false, (err) => (err ? reject(err) : resolve()));\n });\n}\n\ntype ColumnInfo = {\n readonly name: string;\n readonly dataType: string;\n readonly isNullable: boolean;\n};\n\ntype TableInfo = {\n readonly name: string;\n readonly columns: ColumnInfo[];\n};\n\ntype ColumnRow = {\n table_name: string;\n column_name: string;\n data_type: string;\n is_nullable: string;\n};\n\ntype GetTableRowsOptions = {\n readonly schema?: string;\n readonly limit: number;\n readonly offset: number;\n readonly sort?: SortOptions;\n readonly filters?: FilterGroup;\n};\n\ntype TablePage = {\n readonly columns: string[];\n readonly rows: Record<string, unknown>[];\n readonly total: number | null;\n};\n\nconst PRIORITY_COLUMNS = [\n \"documentType\",\n \"documentId\",\n \"scope\",\n \"branch\",\n \"index\",\n \"skip\",\n] as const;\n\ntype ReactorPgliteAdapter = {\n query: (\n sql: string,\n params?: unknown[],\n ) => Promise<{ rows: unknown[]; affectedRows?: number }>;\n};\n\nfunction createWorkerReactorDatabase(\n inspector: IInspectorProxy,\n): Kysely<Database> {\n const adapter: ReactorPgliteAdapter = {\n query: async (statement, params) => ({\n rows: (await inspector.queryReactorDb(statement, params)) as unknown[],\n }),\n };\n return new Kysely<Database>({\n dialect: new PGliteDialect(adapter as unknown as PGlite),\n });\n}\n\nexport function useDbExplorer() {\n const browserDatabase = useDatabase();\n const pglite = usePGlite();\n const module = useReactorClientModule();\n const reactorClientModule = module?.kind === \"browser\" ? module : undefined;\n const reactor = reactorClientModule?.reactorModule?.reactor;\n const queue = reactorClientModule?.reactorModule?.queue;\n const workerModule = module?.kind === \"worker\" ? module : undefined;\n const workerDatabase = useMemo(\n () =>\n workerModule\n ? createWorkerReactorDatabase(workerModule.inspector)\n : undefined,\n [workerModule],\n );\n const database = browserDatabase ?? workerDatabase;\n\n const getTables = useCallback(async (): Promise<TableInfo[]> => {\n if (!database) return [];\n\n const result = await sql<ColumnRow>`\n SELECT\n c.table_name,\n c.column_name,\n c.data_type,\n c.is_nullable\n FROM information_schema.columns c\n INNER JOIN information_schema.tables t\n ON c.table_name = t.table_name\n AND c.table_schema = t.table_schema\n WHERE c.table_schema = ${REACTOR_SCHEMA}\n AND t.table_type = 'BASE TABLE'\n ORDER BY c.table_name, c.ordinal_position\n `.execute(database);\n\n const tableMap = new Map<string, ColumnInfo[]>();\n for (const row of result.rows) {\n if (!tableMap.has(row.table_name)) {\n tableMap.set(row.table_name, []);\n }\n tableMap.get(row.table_name)!.push({\n name: row.column_name,\n dataType: row.data_type,\n isNullable: row.is_nullable === \"YES\",\n });\n }\n\n return Array.from(tableMap).map(([name, columns]) => {\n const columnNames = columns.map((col) => col.name);\n const orderedColumns = [\n ...PRIORITY_COLUMNS.filter((col) => columnNames.includes(col)).map(\n (col) => columns.find((c) => c.name === col)!,\n ),\n ...columns.filter(\n (col) =>\n !PRIORITY_COLUMNS.includes(\n col.name as (typeof PRIORITY_COLUMNS)[number],\n ),\n ),\n ];\n return {\n name,\n columns: orderedColumns,\n };\n });\n }, [database]);\n\n const getTableRows = useCallback(\n async (table: string, options: GetTableRowsOptions): Promise<TablePage> => {\n if (!database) {\n return { columns: [], rows: [], total: null };\n }\n\n const limit = options.limit;\n const offset = options.offset;\n const sort = options.sort;\n const filters = options.filters;\n const tableRef = sql.raw(`${REACTOR_SCHEMA}.\"${table}\"`);\n\n // Build WHERE clause from filters\n let whereClause = sql``;\n if (filters?.clauses && filters.clauses.length > 0) {\n const conditions: ReturnType<typeof sql>[] = [];\n\n for (let i = 0; i < filters.clauses.length; i++) {\n const clause = filters.clauses[i];\n if (!clause) continue;\n\n const columnRef = sql.raw(`\"${clause.column}\"`);\n\n let condition: ReturnType<typeof sql>;\n\n if (clause.operator === \"IS NULL\") {\n condition = sql`${columnRef} IS NULL`;\n } else if (clause.operator === \"IS NOT NULL\") {\n condition = sql`${columnRef} IS NOT NULL`;\n } else if (\n clause.operator === \"LIKE\" ||\n clause.operator === \"ILIKE\"\n ) {\n const value = clause.value;\n const operator =\n clause.operator === \"LIKE\" ? sql`LIKE` : sql`ILIKE`;\n condition = sql`${columnRef} ${operator} ${value}`;\n } else {\n // For =, !=, >, <, >=, <=\n const operator = sql.raw(clause.operator);\n const value = clause.value;\n\n // Try to parse as number if it looks like a number\n let parsedValue: string | number = value;\n if (value !== \"\" && !isNaN(Number(value)) && value.trim() !== \"\") {\n parsedValue = Number(value);\n }\n\n condition = sql`${columnRef} ${operator} ${parsedValue}`;\n }\n\n conditions.push(condition);\n\n // Add connector if not the last clause\n if (i < filters.clauses.length - 1) {\n const connector = filters.connectors?.[i] ?? \"AND\";\n conditions.push(sql.raw(connector));\n }\n }\n\n // Combine all conditions\n if (conditions.length > 0) {\n whereClause = sql`WHERE ${sql.join(conditions, sql` `)}`;\n }\n }\n\n // Build main query\n let query;\n if (sort) {\n const columnRef = sql.raw(`\"${sort.column}\"`);\n const direction = sort.direction === \"desc\" ? sql`DESC` : sql`ASC`;\n query = sql<Record<string, unknown>>`\n SELECT * FROM ${tableRef}\n ${whereClause}\n ORDER BY ${columnRef} ${direction}\n LIMIT ${limit} OFFSET ${offset}\n `;\n } else {\n query = sql<Record<string, unknown>>`\n SELECT * FROM ${tableRef}\n ${whereClause}\n LIMIT ${limit} OFFSET ${offset}\n `;\n }\n\n const result = await query.execute(database);\n\n // Build count query with same filters\n const countQuery = sql<{ count: string }>`\n SELECT COUNT(*) as count FROM ${tableRef}\n ${whereClause}\n `;\n const countResult = await countQuery.execute(database);\n const total = countResult.rows[0]\n ? parseInt(countResult.rows[0].count, 10)\n : null;\n\n const rawColumns =\n result.rows.length > 0 ? Object.keys(result.rows[0]) : [];\n const columns = [\n ...PRIORITY_COLUMNS.filter((col) => rawColumns.includes(col)),\n ...rawColumns.filter(\n (col) =>\n !PRIORITY_COLUMNS.includes(\n col as (typeof PRIORITY_COLUMNS)[number],\n ),\n ),\n ];\n\n return {\n columns,\n rows: result.rows,\n total,\n };\n },\n [database],\n );\n\n const onExportDb = useCallback(async () => {\n if (!pglite) return;\n\n if (queue) await quiesceQueue(queue);\n\n try {\n const major = resolvePgMajorForRuntime(getCachedReactorPgMajor() ?? null);\n const pgDump = await loadPgDump(major);\n const dump = await pgDump({ pg: pglite });\n const sqlContent = await dump.text();\n\n const blob = new Blob([sqlContent], { type: \"text/sql\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `database-export-${Date.now()}.sql`;\n a.click();\n URL.revokeObjectURL(url);\n } finally {\n queue?.unblock();\n }\n }, [pglite, queue]);\n\n const onImportDb = useCallback(\n async (sqlContent: string) => {\n if (!pglite) return;\n\n if (queue) await quiesceQueue(queue);\n\n if (reactor) {\n const status = reactor.kill();\n await status.completed;\n }\n\n // drop every user-created schema before restoring\n await pglite.transaction(async (tx) => {\n const schemas = await tx.query<{ nspname: string }>(\n `SELECT nspname FROM pg_namespace\n WHERE nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema', 'public')\n AND nspname NOT LIKE 'pg_temp_%'\n AND nspname NOT LIKE 'pg_toast_temp_%'`,\n );\n for (const { nspname } of schemas.rows) {\n await tx.exec(`DROP SCHEMA IF EXISTS \"${nspname}\" CASCADE`);\n }\n try {\n await tx.exec(\"SET standard_conforming_strings = off;\");\n } catch {\n // PG17 still accepts this but log if it ever fails.\n }\n await tx.exec(sqlContent);\n await tx.exec(`SET search_path TO ${REACTOR_SCHEMA}`);\n });\n\n // flush IDBFS → IndexedDB synchronously\n await syncPgliteToIdb(pglite);\n\n window.location.reload();\n\n // reload() is asynchronous; without blocking here the DBExplorer caller\n // would continue and call loadTables() against an in-flight shutdown.\n await new Promise(() => {});\n },\n [pglite, queue, reactor],\n );\n\n const getDefaultSort = useCallback(\n (table: string): SortOptions | undefined => {\n if (table === \"Operation\") {\n return { column: \"timestampUtcMs\", direction: \"desc\" };\n }\n return undefined;\n },\n [],\n );\n\n const canModifyDb = !!pglite;\n\n return {\n getTables,\n getTableRows,\n getDefaultSort,\n onExportDb: canModifyDb ? onExportDb : undefined,\n onImportDb: canModifyDb ? onImportDb : undefined,\n };\n}\n","import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport {\n getCachedReactorPgMajor,\n PENDING_PG_SEED_KEY,\n subscribeReactorPgMajor,\n} from \"@powerhousedao/connect/utils\";\nimport { useCallback, useSyncExternalStore } from \"react\";\n\nconst SUPPORTED_PG_VERSIONS = [16, 17] as const;\n\nexport function useDebugInspector() {\n const currentPgVersion = useSyncExternalStore(\n subscribeReactorPgMajor,\n getCachedReactorPgMajor,\n () => undefined,\n );\n\n const onResetToPgVersion = useCallback(async (major: number) => {\n console.info(`[debug-inspector] Reset requested: PG${major}`);\n try {\n localStorage.setItem(PENDING_PG_SEED_KEY, String(major));\n console.info(`[debug-inspector] Clearing reactor storage...`);\n await clearReactorStorage();\n console.info(`[debug-inspector] Storage cleared. Reloading...`);\n window.location.reload();\n } catch (err) {\n console.error(\"[debug-inspector] Reset failed:\", err);\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n throw err;\n }\n }, []);\n\n return {\n supportedPgVersions: SUPPORTED_PG_VERSIONS,\n currentPgVersion: currentPgVersion ?? null,\n onResetToPgVersion,\n };\n}\n","import type { IntegrityInspectorProps } from \"@powerhousedao/design-system/connect\";\nimport {\n DocumentIntegrityService,\n useReactorClientModule,\n type RebuildResult,\n type ValidationResult,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useIntegrityInspector(): IntegrityInspectorProps | undefined {\n const module = useReactorClientModule();\n const reactorModule =\n module?.kind === \"browser\" ? module.reactorModule : undefined;\n const inspector = module?.kind === \"worker\" ? module.inspector : undefined;\n\n const service = useMemo(() => {\n if (!reactorModule) return undefined;\n\n return new DocumentIntegrityService(\n reactorModule.keyframeStore,\n reactorModule.operationStore,\n reactorModule.writeCache,\n reactorModule.documentView,\n reactorModule.documentModelRegistry,\n );\n }, [reactorModule]);\n\n const onValidate = useCallback(\n async (documentId: string, branch?: string): Promise<ValidationResult> => {\n if (inspector) {\n return (await inspector.validateDocument(\n documentId,\n branch,\n )) as ValidationResult;\n }\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.validateDocument(documentId, branch);\n },\n [service, inspector],\n );\n\n const onRebuildKeyframes = useCallback(\n async (documentId: string, branch?: string): Promise<RebuildResult> => {\n if (inspector) {\n return (await inspector.rebuildKeyframes(\n documentId,\n branch,\n )) as RebuildResult;\n }\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.rebuildKeyframes(documentId, branch);\n },\n [service, inspector],\n );\n\n const onRebuildSnapshots = useCallback(\n async (documentId: string, branch?: string): Promise<RebuildResult> => {\n if (inspector) {\n return (await inspector.rebuildSnapshots(\n documentId,\n branch,\n )) as RebuildResult;\n }\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.rebuildSnapshots(documentId, branch);\n },\n [service, inspector],\n );\n\n if (!service && !inspector) {\n return undefined;\n }\n\n return {\n onValidate,\n onRebuildKeyframes,\n onRebuildSnapshots,\n };\n}\n","import type {\n ProcessorInfo,\n ProcessorsInspectorProps,\n} from \"@powerhousedao/design-system/connect\";\nimport { useReactorClientModule } from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useProcessorsInspector(): ProcessorsInspectorProps | undefined {\n const module = useReactorClientModule();\n const processorManager =\n module?.kind === \"browser\"\n ? module.reactorModule?.processorManager\n : undefined;\n const inspector = module?.kind === \"worker\" ? module.inspector : undefined;\n\n const available = useMemo(\n () => processorManager != null || inspector != null,\n [processorManager, inspector],\n );\n\n const getProcessors = useCallback((): Promise<ProcessorInfo[]> => {\n if (inspector) {\n return inspector.getProcessors() as Promise<ProcessorInfo[]>;\n }\n if (!processorManager) {\n return Promise.resolve([]);\n }\n return Promise.resolve(\n processorManager.getAll().map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n })),\n );\n }, [processorManager, inspector]);\n\n const onRetry = useCallback(\n async (processorId: string) => {\n if (inspector) {\n await inspector.retryProcessor(processorId);\n return;\n }\n if (!processorManager) return;\n const tracked = processorManager.get(processorId);\n if (tracked) {\n await tracked.retry();\n }\n },\n [processorManager, inspector],\n );\n\n if (!available) {\n return undefined;\n }\n\n return {\n getProcessors,\n onRetry,\n };\n}\n","import type {\n QueueInspectorProps,\n QueueState,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n InMemoryQueue,\n useReactorClientModule,\n type Job,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useQueueInspector(): QueueInspectorProps | undefined {\n const module = useReactorClientModule();\n const reactorClientModule = module?.kind === \"browser\" ? module : undefined;\n const inspector = module?.kind === \"worker\" ? module.inspector : undefined;\n const queue = reactorClientModule?.reactorModule?.queue;\n\n const inMemoryQueue = useMemo(() => {\n if (queue instanceof InMemoryQueue) {\n return queue;\n }\n return undefined;\n }, [queue]);\n\n const getQueueState = useCallback((): Promise<QueueState> => {\n if (inspector) {\n return inspector.getQueueState() as Promise<QueueState>;\n }\n if (!inMemoryQueue) {\n return Promise.resolve({\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n });\n }\n\n const pendingJobs = inMemoryQueue.getPendingJobs();\n const executingJobIds = inMemoryQueue.getExecutingJobIds();\n\n const executingJobs: Job[] = [];\n for (const jobIdSet of executingJobIds.values()) {\n for (const jobId of jobIdSet) {\n const job = inMemoryQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n\n return Promise.resolve({\n isPaused: inMemoryQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n });\n }, [inMemoryQueue, inspector]);\n\n const onPause = useCallback(async (): Promise<void> => {\n if (inspector) {\n await inspector.pauseQueue();\n return;\n }\n if (inMemoryQueue) {\n inMemoryQueue.pause();\n }\n }, [inMemoryQueue, inspector]);\n\n const onResume = useCallback(async (): Promise<void> => {\n if (inspector) {\n await inspector.resumeQueue();\n return;\n }\n if (inMemoryQueue) {\n await inMemoryQueue.resume();\n }\n }, [inMemoryQueue, inspector]);\n\n if (!inMemoryQueue && !inspector) {\n return undefined;\n }\n\n return {\n getQueueState,\n onPause,\n onResume,\n };\n}\n","import type {\n ConnectionStateSnapshot,\n Remote,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n addRemoteDrive,\n PollBehavior,\n useConnectionStates,\n useSync,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback } from \"react\";\n\nexport function useRemotesInspector(): {\n getRemotes: () => Promise<Remote[]>;\n removeRemote: (name: string) => Promise<void>;\n addRemoteManual: (url: string) => Promise<void>;\n triggerPull: (name: string) => void;\n connectionStates: ReadonlyMap<string, ConnectionStateSnapshot>;\n} {\n const syncManager = useSync();\n if (!syncManager) {\n throw new Error(\"Sync manager not found\");\n }\n\n const connectionStates = useConnectionStates();\n\n const getRemotes = useCallback(() => {\n return Promise.resolve(syncManager.list());\n }, [syncManager]);\n\n const removeRemote = useCallback(\n (name: string) => syncManager.remove(name),\n [syncManager],\n );\n\n const addRemoteManual = useCallback(async (url: string) => {\n await addRemoteDrive(url, undefined, {\n pollBehavior: PollBehavior.Manual,\n });\n }, []);\n\n const triggerPull = useCallback(\n (name: string) => syncManager.triggerPull(name),\n [syncManager],\n );\n\n return {\n getRemotes,\n removeRemote,\n addRemoteManual,\n triggerPull,\n connectionStates,\n };\n}\n","import type { WorkerInspectorProps } from \"@powerhousedao/design-system/connect\";\nimport { useReactorClientModule } from \"@powerhousedao/reactor-browser\";\nimport { useMemo } from \"react\";\n\nexport function useWorkerInspector(): WorkerInspectorProps | undefined {\n const module = useReactorClientModule();\n const adminClient =\n module?.kind === \"worker\" ? module.adminClient : undefined;\n\n return useMemo(() => {\n if (!adminClient) {\n return undefined;\n }\n return {\n getInfo: () => adminClient.info(),\n onRestart: () => adminClient.restart(),\n };\n }, [adminClient]);\n}\n","import { InspectorModal as ConnectInspectorModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n REACTOR_SCHEMA,\n usePHModal,\n} from \"@powerhousedao/reactor-browser\";\nimport { useDbExplorer } from \"./useDbExplorer.js\";\nimport { useDebugInspector } from \"./useDebugInspector.js\";\nimport { useIntegrityInspector } from \"./useIntegrityInspector.js\";\nimport { useProcessorsInspector } from \"./useProcessorsInspector.js\";\nimport { useQueueInspector } from \"./useQueueInspector.js\";\nimport { useRemotesInspector } from \"./useRemotesInspector.js\";\nimport { useWorkerInspector } from \"./useWorkerInspector.js\";\n\nconst DEFAULT_PAGE_SIZE = 25;\n\nexport const InspectorModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"inspector\";\n\n const { getTables, getTableRows, getDefaultSort, onExportDb, onImportDb } =\n useDbExplorer();\n const {\n getRemotes,\n removeRemote,\n addRemoteManual,\n triggerPull,\n connectionStates,\n } = useRemotesInspector();\n const queueInspectorProps = useQueueInspector();\n const processorsInspectorProps = useProcessorsInspector();\n const integrityInspectorProps = useIntegrityInspector();\n const workerInspectorProps = useWorkerInspector();\n const { currentPgVersion, supportedPgVersions, onResetToPgVersion } =\n useDebugInspector();\n\n return (\n <ConnectInspectorModal\n open={open}\n onOpenChange={(status) => {\n if (!status) closePHModal();\n }}\n dbExplorerProps={{\n schema: REACTOR_SCHEMA,\n getTables,\n getTableRows,\n getDefaultSort,\n pageSize: DEFAULT_PAGE_SIZE,\n onExportDb,\n onImportDb,\n pgVersionControl: {\n currentPgVersion,\n supportedPgVersions,\n onResetToPgVersion,\n },\n }}\n remotesInspectorProps={{\n getRemotes,\n removeRemote,\n addRemoteManual,\n triggerPull,\n connectionStates,\n }}\n queueInspectorProps={queueInspectorProps}\n processorsInspectorProps={processorsInspectorProps}\n integrityInspectorProps={integrityInspectorProps}\n workerInspectorProps={workerInspectorProps}\n />\n );\n};\n"],"names":["ConnectInspectorModal"],"mappings":"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","debug_id":"205e7c03-1768-5f5b-95b1-a767f9ba5e45"}
|