@powerhousedao/connect 6.2.3-dev.9 → 6.2.3
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/{AddDriveModal-xAw48kdl.js → AddDriveModal-DhNfP94R.js} +5 -5
- package/dist/{AddDriveModal-xAw48kdl.js.map → AddDriveModal-DhNfP94R.js.map} +1 -1
- package/dist/{ClearStorageModal-C1BXHTq3.js → ClearStorageModal-DyU-FIgY.js} +5 -5
- package/dist/{ClearStorageModal-C1BXHTq3.js.map → ClearStorageModal-DyU-FIgY.js.map} +1 -1
- package/dist/{ConfirmDocumentUpgradeModal-FUOhZsk7.js → ConfirmDocumentUpgradeModal-DcOZy20m.js} +8 -7
- package/dist/{ConfirmDocumentUpgradeModal-FUOhZsk7.js.map → ConfirmDocumentUpgradeModal-DcOZy20m.js.map} +1 -1
- package/dist/{CookiesPolicyModal-BpyPPyxS.js → CookiesPolicyModal-BLw4pnhn.js} +4 -4
- package/dist/{CookiesPolicyModal-BpyPPyxS.js.map → CookiesPolicyModal-BLw4pnhn.js.map} +1 -1
- package/dist/{CreateDocumentModal-C45W8J0V.js → CreateDocumentModal-Bmv0V-kY.js} +6 -5
- package/dist/{CreateDocumentModal-C45W8J0V.js.map → CreateDocumentModal-Bmv0V-kY.js.map} +1 -1
- package/dist/{DebugSettingsModal-ClqHzcxM.js → DebugSettingsModal-CwUN9gIr.js} +7 -7
- package/dist/{DebugSettingsModal-ClqHzcxM.js.map → DebugSettingsModal-CwUN9gIr.js.map} +1 -1
- package/dist/{DeleteDriveModal-Dug84t1j.js → DeleteDriveModal-CjGnG0ht.js} +5 -5
- package/dist/{DeleteDriveModal-Dug84t1j.js.map → DeleteDriveModal-CjGnG0ht.js.map} +1 -1
- package/dist/{DeleteItemModal-mMzy3V8o.js → DeleteItemModal-BbY_4_xT.js} +5 -5
- package/dist/{DeleteItemModal-mMzy3V8o.js.map → DeleteItemModal-BbY_4_xT.js.map} +1 -1
- package/dist/{DisclaimerModal-DvpD5dPM.js → DisclaimerModal-DuglmEwL.js} +4 -4
- package/dist/{DisclaimerModal-DvpD5dPM.js.map → DisclaimerModal-DuglmEwL.js.map} +1 -1
- package/dist/{DocumentVersionUnsupportedModal-C3Q0V75l.js → DocumentVersionUnsupportedModal-C4fy7fZ6.js} +4 -4
- package/dist/{DocumentVersionUnsupportedModal-C3Q0V75l.js.map → DocumentVersionUnsupportedModal-C4fy7fZ6.js.map} +1 -1
- package/dist/{DownloadDocumentWithErrorsModal-IKl0ljQb.js → DownloadDocumentWithErrorsModal-BsPQ5qgy.js} +6 -5
- package/dist/{DownloadDocumentWithErrorsModal-IKl0ljQb.js.map → DownloadDocumentWithErrorsModal-BsPQ5qgy.js.map} +1 -1
- package/dist/{DriveAuthRequiredModal-DVK7ZQzO.js → DriveAuthRequiredModal-CtsB0kwH.js} +5 -5
- package/dist/{DriveAuthRequiredModal-DVK7ZQzO.js.map → DriveAuthRequiredModal-CtsB0kwH.js.map} +1 -1
- package/dist/{DriveSettingsModal-C6-mRQiv.js → DriveSettingsModal-d1L0eYof.js} +4 -4
- package/dist/{DriveSettingsModal-C6-mRQiv.js.map → DriveSettingsModal-d1L0eYof.js.map} +1 -1
- package/dist/{InspectorModal-7FQBTEzt.js → InspectorModal-Cd8kbCV8.js} +61 -21
- package/dist/InspectorModal-Cd8kbCV8.js.map +1 -0
- package/dist/{LoginModal-CybbOm3N.js → LoginModal-CI0ogC2-.js} +5 -5
- package/dist/{LoginModal-CybbOm3N.js.map → LoginModal-CI0ogC2-.js.map} +1 -1
- package/dist/{MissingPackageModal-nBnExqO0.js → MissingPackageModal-HFUPQMML.js} +5 -5
- package/dist/{MissingPackageModal-nBnExqO0.js.map → MissingPackageModal-HFUPQMML.js.map} +1 -1
- package/dist/{OpenFileDocumentsModal-DGaYJpXW.js → OpenFileDocumentsModal-BQsaBP4x.js} +8 -7
- package/dist/{OpenFileDocumentsModal-DGaYJpXW.js.map → OpenFileDocumentsModal-BQsaBP4x.js.map} +1 -1
- package/dist/{SettingsModal-CPv3_jmp.js → SettingsModal-CgjW-M2a.js} +17 -15
- package/dist/{SettingsModal-CPv3_jmp.js.map → SettingsModal-CgjW-M2a.js.map} +1 -1
- package/dist/{UpgradeDriveModal-_8t9slxQ.js → UpgradeDriveModal-CXX6D5Au.js} +4 -4
- package/dist/{UpgradeDriveModal-_8t9slxQ.js.map → UpgradeDriveModal-CXX6D5Au.js.map} +1 -1
- package/dist/app-loader-D2bV-77j.js +4 -0
- package/dist/{app-loader-DyGcBhGV.js → app-loader-l5wtQh5z.js} +1160 -1121
- package/dist/app-loader-l5wtQh5z.js.map +1 -0
- package/dist/app-skeleton--Me5zlSz.js +112 -0
- package/dist/app-skeleton--Me5zlSz.js.map +1 -0
- package/dist/app-skeleton-CBN4tenZ.js +4 -0
- package/dist/boot-DPNEOI2A.js +210 -0
- package/dist/boot-DPNEOI2A.js.map +1 -0
- package/dist/buffer-DNTcuap_.js +66 -0
- package/dist/buffer-DNTcuap_.js.map +1 -0
- package/dist/{build-info-D9_h0032.js → build-info-BV8UtyA4.js} +5 -5
- package/dist/{build-info-D9_h0032.js.map → build-info-BV8UtyA4.js.map} +1 -1
- package/dist/components-BH57lxCU.js +5 -0
- package/dist/{connect.config-DaHDEUrw.js → connect.config-CaXMoB42.js} +24 -12
- package/dist/connect.config-CaXMoB42.js.map +1 -0
- package/dist/{connection-state-3w4liC1X.js → connection-state-Eqc2izmt.js} +6 -6
- package/dist/{connection-state-3w4liC1X.js.map → connection-state-Eqc2izmt.js.map} +1 -1
- package/dist/{cookie-banner-BH6bIq24.js → cookie-banner-BxXvPdIY.js} +6 -6
- package/dist/{cookie-banner-BH6bIq24.js.map → cookie-banner-BxXvPdIY.js.map} +1 -1
- package/dist/{i18n-CWO0vYVd.js → i18n-CTgT1HG-.js} +3 -3
- package/dist/{i18n-CWO0vYVd.js.map → i18n-CTgT1HG-.js.map} +1 -1
- package/dist/{load-Cu7S9GPc.js → load-ftpCX1HI.js} +13 -11
- package/dist/{load-Cu7S9GPc.js.map → load-ftpCX1HI.js.map} +1 -1
- package/dist/main.d.ts +2 -1
- package/dist/main.js +8 -8
- package/dist/main.js.map +1 -1
- package/dist/package-manager-BbzIV9aN.js +485 -0
- package/dist/package-manager-BbzIV9aN.js.map +1 -0
- package/dist/{pglite-major-B39aOEiE.js → pglite-major-p4_YefAE.js} +23 -5
- package/dist/pglite-major-p4_YefAE.js.map +1 -0
- package/dist/{pglite-migrate-core-Boxqqx-c.js → pglite-migrate-core-BcXcImng.js} +8 -6
- package/dist/{pglite-migrate-core-Boxqqx-c.js.map → pglite-migrate-core-BcXcImng.js.map} +1 -1
- package/dist/{pglite-seed-BqAUvNFw.js → pglite-seed-Cl2d-iyl.js} +4 -4
- package/dist/{pglite-seed-BqAUvNFw.js.map → pglite-seed-Cl2d-iyl.js.map} +1 -1
- package/dist/pglite.worker.d.ts +2 -1
- package/dist/pglite.worker.js +4 -3
- package/dist/pglite.worker.js.map +1 -1
- package/dist/pglite.worker.legacy.d.ts +2 -1
- package/dist/pglite.worker.legacy.js +4 -3
- package/dist/pglite.worker.legacy.js.map +1 -1
- package/dist/{preferences-store-_5Cw4_YV.js → preferences-store-DZUIAkHE.js} +6 -25
- package/dist/preferences-store-DZUIAkHE.js.map +1 -0
- package/dist/{pwa-manifest-link-DIgOSo2Q.js → pwa-manifest-link-DQRJpF0r.js} +3 -3
- package/dist/{pwa-manifest-link-DIgOSo2Q.js.map → pwa-manifest-link-DQRJpF0r.js.map} +1 -1
- package/dist/{reactor-yC8BveHb.js → reactor-CItc8KaF.js} +68 -437
- package/dist/reactor-CItc8KaF.js.map +1 -0
- package/dist/reactor.worker.d.ts +2 -1
- package/dist/reactor.worker.js +76 -21
- package/dist/reactor.worker.js.map +1 -1
- package/dist/{registerServiceWorker-BSzbNfvz.js → registerServiceWorker-smkROQhm.js} +5 -5
- package/dist/{registerServiceWorker-BSzbNfvz.js.map → registerServiceWorker-smkROQhm.js.map} +1 -1
- package/dist/renown-trust-DRgHpxlZ.js +34 -0
- package/dist/renown-trust-DRgHpxlZ.js.map +1 -0
- package/dist/{runtime-config-DL3QjcfM.js → runtime-config-DtJIUgYw.js} +3 -3
- package/dist/{runtime-config-DL3QjcfM.js.map → runtime-config-DtJIUgYw.js.map} +1 -1
- package/dist/{sentry-QXKgQmr2.js → sentry-jfDyrxdX.js} +3 -3
- package/dist/{sentry-QXKgQmr2.js.map → sentry-jfDyrxdX.js.map} +1 -1
- package/dist/start-connect.d.ts +4 -5
- package/dist/start-connect.d.ts.map +1 -1
- package/dist/start-connect.js +6 -8
- package/dist/start-connect.js.map +1 -1
- package/dist/style.css +2907 -1
- package/dist/{toast-BXIGd4Eb.js → toast-C6WW-_O-.js} +3 -3
- package/dist/{toast-BXIGd4Eb.js.map → toast-C6WW-_O-.js.map} +1 -1
- package/dist/{use-renown-login-Cf3va6u_.js → use-renown-login-BzOSQETV.js} +3 -3
- package/dist/{use-renown-login-Cf3va6u_.js.map → use-renown-login-BzOSQETV.js.map} +1 -1
- package/dist/useIsEmbedded-BWJ0qb7w.js +26 -0
- package/dist/useIsEmbedded-BWJ0qb7w.js.map +1 -0
- package/dist/{useRegistryPackages-BnUcL_nZ.js → useRegistryPackages-DuoU75ap.js} +73 -10
- package/dist/useRegistryPackages-DuoU75ap.js.map +1 -0
- package/package.json +19 -19
- package/style.css +7 -5
- package/dist/InspectorModal-7FQBTEzt.js.map +0 -1
- package/dist/app-loader-C4pFYc82.js +0 -4
- package/dist/app-loader-DyGcBhGV.js.map +0 -1
- package/dist/components-MEmS6hgr.js +0 -4
- package/dist/connect.config-DaHDEUrw.js.map +0 -1
- package/dist/pglite-major-B39aOEiE.js.map +0 -1
- package/dist/preferences-store-_5Cw4_YV.js.map +0 -1
- package/dist/reactor-yC8BveHb.js.map +0 -1
- package/dist/useRegistryPackages-BnUcL_nZ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactor-CItc8KaF.js","sources":["../src/pglite.db.ts","../src/utils/reactor.ts","../src/feature-flags.ts","../src/no-registry-discovery.ts","../src/package-discovery.ts","../src/reactor-worker-name.ts","../src/reactor-worker-client.ts","../src/utils/reactor-worker-flag.ts","../src/store/processor-host-module.ts","../src/store/reactor.ts"],"sourcesContent":["import type { PGlite } from \"@electric-sql/pglite\";\nimport { createRelationalDb } from \"@powerhousedao/shared/processors\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport {\n detectReactorPgMajor,\n detectRelationalPgMajor,\n loadPGliteModule,\n resolvePgMajorForRuntime,\n type DetectedMajor,\n type SupportedPgMajor,\n} from \"./utils/pglite-runtime.js\";\nimport {\n REACTOR_PGLITE_NAME,\n RELATIONAL_PGLITE_NAME,\n} from \"./utils/storage-namespace.js\";\n\n// Separate reactor/relational instances so their transactions can't interleave\n// on one session; the wasm download is still shared — PGlite memoizes the\n// compiled module per JS realm.\n\n// Off by default: workers hide `Module.FS` (the Inspector needs it) and each\n// worker realm re-downloads the wasm.\nexport const PGLITE_USE_WORKER: boolean = false;\n\nasync function createMainThreadPGlite(\n major: SupportedPgMajor,\n dbName: string,\n): Promise<PGlite> {\n const { PGlite } = await loadPGliteModule(major);\n const { live } =\n major === 16\n ? await import(\"pglite-legacy-02/live\")\n : await import(\"@electric-sql/pglite/live\");\n return new PGlite(`idb://${dbName}`, {\n relaxedDurability: true,\n extensions: { live },\n }) as unknown as PGlite;\n}\n\nasync function createWorkerPGlite(\n major: SupportedPgMajor,\n dbName: string,\n): Promise<PGlite> {\n // dbName is owned here so the namespace matches the other origin-scoped stores.\n const meta = { dbName };\n if (major === 16) {\n const [legacyWorker, legacyLive] = await Promise.all([\n import(\"pglite-legacy-02/worker\"),\n import(\"pglite-legacy-02/live\"),\n ]);\n const worker = new Worker(\n new URL(\"./pglite.worker.legacy.js\", import.meta.url),\n { type: \"module\" },\n );\n return legacyWorker.PGliteWorker.create(worker, {\n meta,\n extensions: { live: legacyLive.live },\n }) as unknown as PGlite;\n }\n const [{ PGliteWorker }, { live }] = await Promise.all([\n import(\"@electric-sql/pglite/worker\"),\n import(\"@electric-sql/pglite/live\"),\n ]);\n const worker = new Worker(new URL(\"./pglite.worker.js\", import.meta.url), {\n type: \"module\",\n });\n return PGliteWorker.create(worker, {\n meta,\n extensions: { live },\n }) as unknown as PGlite;\n}\n\n// Overlapping cold boots race on PGlite's un-cloned wasm fetch Response and\n// re-fetch the fs bundle; chaining avoids both.\nlet bootChain: Promise<unknown> = Promise.resolve();\n\nfunction chainedCreate(create: () => Promise<PGlite>): Promise<PGlite> {\n const pending = bootChain.then(create, create);\n bootChain = pending.catch(() => undefined);\n return pending;\n}\n\nfunction pgliteSingleton(opts: {\n dbName: string;\n detectMajor: () => Promise<DetectedMajor>;\n label: string;\n}): () => Promise<PGlite> {\n let cached: Promise<PGlite> | undefined;\n return function getPGlite(): Promise<PGlite> {\n if (cached) return cached;\n const pending = chainedCreate(async () => {\n const major = resolvePgMajorForRuntime(await opts.detectMajor());\n if (major !== 17) {\n console.warn(\n `[${opts.label}] Opening legacy Postgres ${major} data dir. Migrate to PG17 from the banner or the Inspector → Debug tab.`,\n );\n }\n return PGLITE_USE_WORKER\n ? createWorkerPGlite(major, opts.dbName)\n : createMainThreadPGlite(major, opts.dbName);\n });\n // Don't cache a rejection: let a later call retry a transient IDB/wasm failure.\n cached = pending;\n pending.catch(() => {\n if (cached === pending) cached = undefined;\n });\n return pending;\n };\n}\n\nexport const getReactorPGlite = pgliteSingleton({\n dbName: REACTOR_PGLITE_NAME,\n detectMajor: detectReactorPgMajor,\n label: \"reactor\",\n});\n\nconst getRelationalPGlite = pgliteSingleton({\n dbName: RELATIONAL_PGLITE_NAME,\n detectMajor: detectRelationalPgMajor,\n label: \"relational\",\n});\n\nexport async function getDb() {\n const pgLite = await getRelationalPGlite();\n const relationalDb = createRelationalDb(\n new Kysely({\n dialect: new PGliteDialect(pgLite),\n }),\n );\n return { pgLite, relationalDb };\n}\n","import {\n addDrive,\n addRemoteDrive,\n ChannelScheme,\n isDriveAuthError,\n ReactorBuilder,\n ReactorClientBuilder,\n setDriveMetadata,\n waitForDocumentReady,\n type BrowserReactorClientModule,\n type Database,\n type IDocumentModelLoader,\n type JwtHandler,\n type ReactorFeatureFlags,\n} from \"@powerhousedao/reactor-browser\";\nimport type { UnsupportedStoredDocuments } from \"@powerhousedao/reactor\";\nimport type {\n PHConnectDefaultDrive,\n PHConnectDefaultDriveLocal,\n PHConnectDefaultDriveRemote,\n} from \"@powerhousedao/shared/clis\";\nimport type { RuntimePowerhouseConfig } from \"@powerhousedao/shared/connect\";\nimport type {\n DocumentModelModule,\n SignaturePolicy,\n UpgradeManifest,\n} from \"@powerhousedao/shared/document-model\";\nimport type { IRenown } from \"@renown/sdk\";\nimport { ConsoleLogger } from \"document-model\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport { getReactorPGlite } from \"../pglite.db.js\";\nimport { toStoredDocumentsRefused } from \"./stored-documents-refused.js\";\nimport {\n createConnectSignerConfig,\n type RenownTrustEndpoints,\n} from \"./renown-trust.js\";\n\n/**\n * Creates a Reactor that plugs into legacy storage but syncs through the new\n * Reactor GQL API.\n */\nexport async function createBrowserReactor(\n documentModelModules: DocumentModelModule[],\n upgradeManifests: UpgradeManifest<readonly number[]>[],\n renown: IRenown,\n featureFlags: Partial<ReactorFeatureFlags>,\n documentModelLoader?: IDocumentModelLoader,\n createSignaturePolicy?: SignaturePolicy,\n renownEndpoints: RenownTrustEndpoints = {},\n unsupportedStoredDocuments?: UnsupportedStoredDocuments,\n): Promise<BrowserReactorClientModule> {\n const signerConfig = await createConnectSignerConfig(\n renown.signer,\n featureFlags,\n renownEndpoints,\n );\n\n const jwtHandler: JwtHandler = async (_url: string) => {\n if (!renown.user) {\n return undefined;\n }\n // aud omitted: server verifies without an audience, so aud-bearing tokens\n // are rejected. Re-enable once both sides support audience restriction.\n return renown.getBearerToken({ expiresIn: 10 });\n };\n\n const pg = await getReactorPGlite();\n const logger = new ConsoleLogger([\"reactor-client\"]);\n const reactorBuilder = new ReactorBuilder()\n .withDocumentModelSources(documentModelModules)\n .withUpgradeManifests(upgradeManifests)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withExecutorConfig({ featureFlags })\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({\n dialect: new PGliteDialect(pg),\n }),\n );\n const builder = new ReactorClientBuilder()\n .withLogger(logger)\n .withSigner(signerConfig)\n .withReactorBuilder(reactorBuilder);\n\n if (documentModelLoader) {\n builder.withDocumentModelLoader(documentModelLoader);\n }\n if (createSignaturePolicy) {\n builder.withCreateSignaturePolicy(createSignaturePolicy);\n }\n if (unsupportedStoredDocuments) {\n reactorBuilder.withUnsupportedStoredDocuments(unsupportedStoredDocuments);\n }\n\n let module: Awaited<ReturnType<typeof builder.buildModule>>;\n try {\n module = await builder.buildModule();\n } catch (error) {\n throw toStoredDocumentsRefused(error);\n }\n return {\n ...module,\n kind: \"browser\",\n reactorModule: module.reactorModule\n ? { ...module.reactorModule, pg }\n : undefined,\n };\n}\n\nexport function getDefaultDrives(\n runtimeConfig: RuntimePowerhouseConfig,\n): PHConnectDefaultDrive[] {\n return runtimeConfig.connect.drives?.defaultDrives ?? [];\n}\n\n/**\n * Add default drives for the new reactor via sync manager.\n *\n * Drives register concurrently so a slow or unreachable drive can't delay the\n * others — in particular the one the URL slug resolves to. Remote drives\n * retry with linear backoff to handle the common race where Connect's dev\n * server is ready before the switchboard has finished binding its port.\n *\n * Each entry is either a remote drive (a URL registered with the sync\n * manager, waited on for initial backfill) or a local drive (created once in\n * this browser's local reactor; its fixed id makes later boots skip it).\n *\n * @param drives - Array of default-drive entries\n */\nexport async function addDefaultDrivesForNewReactor(\n drives: PHConnectDefaultDrive[],\n): Promise<void> {\n await Promise.all(\n drives.map((drive) =>\n \"url\" in drive\n ? addRemoteDefaultDrive(drive)\n : addLocalDefaultDrive(drive),\n ),\n );\n}\n\nasync function addRemoteDefaultDrive(\n drive: PHConnectDefaultDriveRemote,\n): Promise<void> {\n const MAX_ATTEMPTS = 3;\n const BACKOFF_MS = 2000;\n\n let driveId: string | undefined;\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n driveId = await addRemoteDrive(drive.url);\n break;\n } catch (error) {\n if (isDriveAuthError(error)) {\n // addRemoteDrive already surfaces the login modal; auth failures\n // don't self-heal, so don't burn the remaining retries.\n break;\n }\n if (attempt === MAX_ATTEMPTS) {\n console.error(\n `Failed to add default drive ${drive.url} after ${MAX_ATTEMPTS} attempts:`,\n error,\n );\n } else {\n const delay = BACKOFF_MS * attempt;\n console.warn(\n `Default drive ${drive.url} not reachable (attempt ${attempt}/${MAX_ATTEMPTS}), retrying in ${delay}ms...`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n if (driveId && (drive.name || drive.icon)) {\n try {\n // setDriveMetadata dispatches against the local drive document, which\n // only exists once initial backfill delivers it — wait for it first\n // so the name/icon override isn't lost to a sync race.\n // waitForDocumentReady needs the full reactor client\n const reactorClient = window.ph?.reactorClientModule?.client;\n if (reactorClient) {\n await waitForDocumentReady(reactorClient, driveId, {\n timeoutMs: 15_000,\n });\n }\n await setDriveMetadata(driveId, {\n name: drive.name,\n icon: drive.icon,\n });\n } catch (error) {\n console.warn(\n `Default drive ${drive.url} was added but metadata update failed:`,\n error,\n );\n }\n }\n}\n\n/**\n * Create a configured local default drive in this browser's local reactor.\n * The drive is only created when the configured id is not already taken, so\n * repeated boots are idempotent and a drive the user deleted stays deleted.\n * Name and icon are written straight into the created document's global state\n * (no setDriveMetadata round-trip), and `app` maps to the drive's preferred\n * editor.\n */\nasync function addLocalDefaultDrive(\n drive: PHConnectDefaultDriveLocal,\n): Promise<void> {\n // The union is discriminated on `url`, so a hand-edited config entry with\n // neither `url` nor `id` lands here. Without an id addDrive would mint a\n // random one, creating another drive on every boot.\n if (!drive.id) {\n console.error(\n \"Ignoring local default drive with no id:\",\n JSON.stringify(drive),\n );\n return;\n }\n\n try {\n // isDocumentIdTaken() lives on the full reactor client, not the browser\n // client the interactive addDrive action uses. It asks what the create\n // path asks — is the id reserved, deleted or not — where find() reports\n // only live documents, so a deleted drive would look absent and be\n // re-created (and rejected) on every boot.\n const reactorClient = window.ph?.reactorClientModule?.client;\n if (reactorClient) {\n const taken = await reactorClient.isDocumentIdTaken(drive.id);\n if (taken) {\n return; // created on an earlier boot, or deleted since\n }\n }\n await addDrive(\n {\n id: drive.id,\n global: {\n name: drive.name ?? \"\",\n icon: drive.icon ?? null,\n },\n },\n drive.app,\n );\n } catch (error) {\n console.error(`Failed to create local default drive ${drive.id}:`, error);\n }\n}\n","import {\n OpenFeature,\n type ErrorCode,\n type JsonValue,\n type Provider,\n type ResolutionDetails,\n} from \"@openfeature/web-sdk\";\nimport { logger, setLogLevel, type ILogger } from \"document-model\";\n\n/**\n * QueryParamProvider reads feature flags from URL query parameters.\n *\n * Usage:\n * const params = new URLSearchParams(window.location.search);\n * const provider = new QueryParamProvider(params);\n * await OpenFeature.setProviderAndWait(provider);\n *\n * Query parameter format:\n * ?FEATURE_DUAL_ACTION_CREATE_ENABLED=true&FEATURE_FOO=false\n */\nexport class QueryParamProvider implements Provider {\n public readonly runsOn = \"client\" as const;\n\n readonly metadata = {\n name: \"QueryParamProvider\",\n } as const;\n\n private flags: Map<string, string>;\n\n constructor(searchParams: URLSearchParams) {\n this.flags = new Map();\n\n // Extract all query parameters that look like feature flags\n for (const [key, value] of searchParams.entries()) {\n this.flags.set(key, value);\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n ): ResolutionDetails<boolean> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n // Parse boolean from string\n const boolValue = value.toLowerCase() === \"true\" || value === \"1\";\n\n return {\n value: boolValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n ): ResolutionDetails<string> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n return {\n value,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n ): ResolutionDetails<number> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n const numValue = Number(value);\n\n if (isNaN(numValue)) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse \"${value}\" as a number`,\n };\n }\n\n return {\n value: numValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n ): ResolutionDetails<T> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n try {\n const objValue = JSON.parse(value) as T;\n return {\n value: objValue,\n reason: \"STATIC\",\n variant: value,\n };\n } catch (error) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\n/**\n * Initialize OpenFeature with the QueryParamProvider.\n * Reads feature flags from query parameters.\n */\nexport async function initFeatureFlags(\n searchParams?: URLSearchParams,\n): Promise<Map<string, boolean>> {\n const params =\n searchParams ??\n (typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search)\n : new URLSearchParams());\n const provider = new QueryParamProvider(params);\n await OpenFeature.setProviderAndWait(provider);\n\n const features = new Map<string, boolean>();\n\n // Handle LOG_LEVEL query param override\n const logLevelParam = params.get(\"LOG_LEVEL\");\n if (logLevelParam) {\n const validLogLevels = [\"verbose\", \"debug\", \"info\", \"warn\", \"error\"];\n if (validLogLevels.includes(logLevelParam.toLowerCase())) {\n setLogLevel(logLevelParam.toLowerCase() as ILogger[\"level\"]);\n logger.info(\n \"Log level set to @level via query param\",\n logLevelParam.toLowerCase(),\n );\n } else {\n logger.warn(\n \"Invalid LOG_LEVEL query param: @param. Valid values: @validLevels\",\n logLevelParam,\n validLogLevels.join(\", \"),\n );\n }\n }\n\n return features;\n}\n","import {\n type IDocumentModelLoader,\n type IPackageDiscoveryService,\n type DiscoveryEvent,\n type DiscoveryEventListener,\n type FailedInstallation,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { BrowserPackageManager } from \"./package-manager.js\";\n\n/**\n * Discovery service used when no package registry is configured. Every load\n * for an unknown document type is recorded as a failure with reason\n * \"no-registry\" so the UI can surface the issue; the modal install flow is a\n * no-op because there is no registry to query.\n */\nexport class NoRegistryDiscoveryService\n implements IDocumentModelLoader, IPackageDiscoveryService\n{\n #packageManager: BrowserPackageManager;\n #failed = new Map<string, FailedInstallation>();\n #failedMemo: FailedInstallation[] = [];\n #failedSubscribers = new Set<() => void>();\n #eventSubscribers = new Set<DiscoveryEventListener>();\n\n constructor(packageManager: BrowserPackageManager) {\n this.#packageManager = packageManager;\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const existing = this.#findModuleInLoadedPackages(documentType);\n if (existing) {\n this.#clearFailed(documentType);\n return Promise.resolve(existing);\n }\n\n this.#recordFailure(documentType);\n return Promise.reject(\n new Error(\n `No package registry configured; cannot resolve \"${documentType}\"`,\n ),\n );\n }\n\n promptInstallation(): void {\n // no registry to query — nothing to prompt\n }\n\n approveInstallation(): Promise<void> {\n return Promise.resolve();\n }\n\n dismissInstallation(): void {\n // nothing to dismiss\n }\n\n getPendingInstallations(): PendingInstallation[] {\n return [];\n }\n\n subscribePending(): () => void {\n return () => {};\n }\n\n getFailedInstallations(): FailedInstallation[] {\n return this.#failedMemo;\n }\n\n subscribeFailed(listener: () => void): () => void {\n this.#failedSubscribers.add(listener);\n return () => {\n this.#failedSubscribers.delete(listener);\n };\n }\n\n subscribeEvents(listener: DiscoveryEventListener): () => void {\n this.#eventSubscribers.add(listener);\n return () => {\n this.#eventSubscribers.delete(listener);\n };\n }\n\n retryInstallation(documentType: string): Promise<void> {\n // Retry is a no-op without a registry, but re-emitting the failure lets\n // a UI that cleared the row know the underlying condition still holds.\n this.#recordFailure(documentType);\n return Promise.resolve();\n }\n\n #findModuleInLoadedPackages(\n documentType: string,\n ): DocumentModelModule<any> | undefined {\n return this.#packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n }\n\n #recordFailure(documentType: string): void {\n this.#failed.set(documentType, {\n documentType,\n reason: \"no-registry\",\n packageNames: [],\n error: null,\n });\n this.#emitEvent({\n type: \"load-failed\",\n documentType,\n reason: \"no-registry\",\n });\n this.#notifyFailedChanged();\n }\n\n #clearFailed(documentType: string): void {\n if (this.#failed.delete(documentType)) {\n this.#notifyFailedChanged();\n }\n }\n\n #notifyFailedChanged(): void {\n this.#failedMemo = Array.from(this.#failed.values());\n for (const listener of this.#failedSubscribers) {\n listener();\n }\n }\n\n #emitEvent(event: DiscoveryEvent): void {\n for (const listener of this.#eventSubscribers) {\n listener(event);\n }\n }\n}\n","import {\n BrowserLocalStorage,\n type IDocumentModelLoader,\n type IPackageDiscoveryService,\n type DiscoveryEvent,\n type DiscoveryEventListener,\n type FailedInstallation,\n type FailedInstallationReason,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport type { RegistryClient } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { BrowserPackageManager } from \"./package-manager.js\";\n\nexport type DiscoveryMode = \"immediate\" | \"manual\";\n\ntype DeferredEntry = {\n packageNames: string[];\n resolve: (module: DocumentModelModule<any>) => void;\n reject: (reason: unknown) => void;\n promise: Promise<DocumentModelModule<any>>;\n};\n\nexport class PackageDiscoveryService\n implements IDocumentModelLoader, IPackageDiscoveryService\n{\n #packageManager: BrowserPackageManager;\n #registryClient: RegistryClient;\n #mode: DiscoveryMode;\n\n #deferred = new Map<string, DeferredEntry>();\n #pending = new Map<string, PendingInstallation>();\n #pendingMemo: PendingInstallation[] = [];\n #pendingSubscribers = new Set<() => void>();\n #failed = new Map<string, FailedInstallation>();\n #failedMemo: FailedInstallation[] = [];\n #failedSubscribers = new Set<() => void>();\n #eventSubscribers = new Set<DiscoveryEventListener>();\n #dismissedStorage: BrowserLocalStorage<boolean>;\n #discoveredTypes = new Map<string, string[]>();\n\n constructor(\n packageManager: BrowserPackageManager,\n registryClient: RegistryClient,\n options: { mode: DiscoveryMode; storageKey: string },\n ) {\n this.#packageManager = packageManager;\n this.#registryClient = registryClient;\n this.#mode = options.mode;\n this.#dismissedStorage = new BrowserLocalStorage<boolean>(\n options.storageKey + \":PH_DISMISSED_TYPES\",\n );\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const existing = this.#findModuleInLoadedPackages(documentType);\n if (existing) {\n this.#clearFailed(documentType);\n return Promise.resolve(existing);\n }\n\n if (this.#dismissedStorage.has(documentType)) {\n this.#recordFailure(documentType, \"dismissed\", [], null);\n return Promise.reject(\n new Error(`Document type \"${documentType}\" was dismissed`),\n );\n }\n\n const tracked = this.#deferred.get(documentType);\n if (tracked) {\n return tracked.promise;\n }\n\n return this.#discover(documentType);\n }\n\n promptInstallation(documentType: string): void {\n const packageNames = this.#discoveredTypes.get(documentType);\n if (!packageNames) return;\n if (this.#pending.has(documentType)) return;\n\n this.#discoveredTypes.delete(documentType);\n this.#addToPending(documentType, packageNames);\n }\n\n async approveInstallation(packageName: string): Promise<void> {\n const affectedTypes = this.#findTypesByPackage(packageName);\n if (affectedTypes.length === 0) return;\n\n const result = await this.#packageManager.addPackage(packageName);\n if (result.type === \"error\") {\n this.#emitEvent({\n type: \"installation-failed\",\n packageName,\n error: result.error,\n });\n for (const documentType of affectedTypes) {\n const entry = this.#deferred.get(documentType);\n if (entry) {\n entry.reject(result.error);\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n }\n this.#recordFailure(\n documentType,\n \"install-failed\",\n [packageName],\n result.error,\n );\n }\n this.#notifyPendingChanged();\n return;\n }\n\n this.#emitEvent({\n type: \"installation-approved\",\n packageName,\n documentTypes: affectedTypes,\n });\n\n for (const documentType of affectedTypes) {\n const entry = this.#deferred.get(documentType);\n if (!entry) continue;\n\n const module = this.#findModuleInLoadedPackages(documentType);\n if (module) {\n entry.resolve(module);\n this.#clearFailed(documentType);\n } else {\n const error = new Error(\n `Package \"${packageName}\" installed but module for \"${documentType}\" not found`,\n );\n entry.reject(error);\n this.#recordFailure(\n documentType,\n \"install-failed\",\n [packageName],\n error,\n );\n }\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n }\n this.#notifyPendingChanged();\n }\n\n dismissInstallation(packageName: string): void {\n const affectedTypes = this.#findTypesByPackage(packageName);\n if (affectedTypes.length === 0) return;\n\n for (const documentType of affectedTypes) {\n this.#dismissedStorage.set(documentType, true);\n const entry = this.#deferred.get(documentType);\n if (entry) {\n entry.reject(\n new Error(`Document type \"${documentType}\" was dismissed`),\n );\n }\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n this.#discoveredTypes.delete(documentType);\n this.#recordFailure(documentType, \"dismissed\", [packageName], null);\n }\n\n this.#emitEvent({\n type: \"installation-dismissed\",\n packageName,\n documentTypes: affectedTypes,\n });\n this.#notifyPendingChanged();\n }\n\n getPendingInstallations(): PendingInstallation[] {\n return this.#pendingMemo;\n }\n\n subscribePending(listener: () => void): () => void {\n this.#pendingSubscribers.add(listener);\n return () => {\n this.#pendingSubscribers.delete(listener);\n };\n }\n\n getFailedInstallations(): FailedInstallation[] {\n return this.#failedMemo;\n }\n\n subscribeFailed(listener: () => void): () => void {\n this.#failedSubscribers.add(listener);\n return () => {\n this.#failedSubscribers.delete(listener);\n };\n }\n\n subscribeEvents(listener: DiscoveryEventListener): () => void {\n this.#eventSubscribers.add(listener);\n return () => {\n this.#eventSubscribers.delete(listener);\n };\n }\n\n async retryInstallation(documentType: string): Promise<void> {\n this.#dismissedStorage.delete(documentType);\n this.#clearFailed(documentType);\n try {\n await this.#discover(documentType);\n } catch {\n // failure has been recorded via #recordFailure; swallow so the\n // caller (UI button) doesn't have to handle the rejection\n }\n }\n\n async #discover(documentType: string): Promise<DocumentModelModule<any>> {\n // Offline: skip the doomed registry lookup and record an \"offline\" failure\n // so the banner shows an accurate, retryable message (not a generic registry\n // error). Only never-installed types reach here; cached editors rehydrate\n // from the SW.\n if (typeof navigator !== \"undefined\" && navigator.onLine === false) {\n this.#recordFailure(documentType, \"offline\", [], null);\n return Promise.reject(\n new Error(`Offline: cannot discover document type \"${documentType}\"`),\n );\n }\n\n let packageNames: string[];\n try {\n packageNames =\n await this.#registryClient.getPackagesByDocumentType(documentType);\n } catch (error) {\n const normalized =\n error instanceof Error ? error : new Error(String(error));\n this.#emitEvent({\n type: \"registry-query-failed\",\n documentType,\n error: normalized,\n });\n this.#recordFailure(documentType, \"registry-error\", [], normalized);\n return Promise.reject(normalized);\n }\n\n if (packageNames.length === 0) {\n this.#recordFailure(documentType, \"not-in-registry\", [], null);\n return Promise.reject(\n new Error(`No packages found for document type \"${documentType}\"`),\n );\n }\n\n const entry = this.#createDeferredEntry(documentType, packageNames);\n\n this.#emitEvent({\n type: \"type-discovered\",\n documentType,\n packageNames,\n });\n\n if (this.#mode === \"immediate\") {\n this.#addToPending(documentType, packageNames);\n } else {\n this.#discoveredTypes.set(documentType, packageNames);\n }\n\n return entry.promise;\n }\n\n #createDeferredEntry(\n documentType: string,\n packageNames: string[],\n ): DeferredEntry {\n let resolve!: (module: DocumentModelModule<any>) => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<DocumentModelModule<any>>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const entry: DeferredEntry = { packageNames, resolve, reject, promise };\n this.#deferred.set(documentType, entry);\n return entry;\n }\n\n #addToPending(documentType: string, packageNames: string[]): void {\n const installation: PendingInstallation = { documentType, packageNames };\n this.#pending.set(documentType, installation);\n this.#emitEvent({\n type: \"installation-prompted\",\n documentType,\n packageNames,\n });\n this.#notifyPendingChanged();\n }\n\n #findModuleInLoadedPackages(\n documentType: string,\n ): DocumentModelModule<any> | undefined {\n return this.#packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n }\n\n #findTypesByPackage(packageName: string): string[] {\n const types: string[] = [];\n for (const [documentType, entry] of this.#deferred) {\n if (entry.packageNames.includes(packageName)) {\n types.push(documentType);\n }\n }\n return types;\n }\n\n #notifyPendingChanged(): void {\n this.#pendingMemo = Array.from(this.#pending.values());\n for (const listener of this.#pendingSubscribers) {\n listener();\n }\n }\n\n #notifyFailedChanged(): void {\n this.#failedMemo = Array.from(this.#failed.values());\n for (const listener of this.#failedSubscribers) {\n listener();\n }\n }\n\n #recordFailure(\n documentType: string,\n reason: FailedInstallationReason,\n packageNames: string[],\n error: Error | null,\n ): void {\n this.#failed.set(documentType, {\n documentType,\n reason,\n packageNames,\n error,\n });\n this.#emitEvent({ type: \"load-failed\", documentType, reason });\n this.#notifyFailedChanged();\n }\n\n #clearFailed(documentType: string): void {\n if (this.#failed.delete(documentType)) {\n this.#notifyFailedChanged();\n }\n }\n\n #emitEvent(event: DiscoveryEvent): void {\n for (const listener of this.#eventSubscribers) {\n listener(event);\n }\n }\n}\n","const GEN_KEY_PREFIX = \"ph-reactor-gen:\";\n\n// A persisted generation token, bumped on restart, is folded into the\n// SharedWorker name so a restart spawns a fresh worker instance while the\n// IndexedDB namespace (and its data) stays put.\nexport function reactorWorkerName(namespace: string): string {\n const gen = readWorkerGen(namespace);\n return gen ? `ph-reactor:${namespace}#${gen}` : `ph-reactor:${namespace}`;\n}\n\nexport function readWorkerGen(namespace: string): string | null {\n try {\n return localStorage.getItem(GEN_KEY_PREFIX + namespace);\n } catch {\n return null;\n }\n}\n\nexport function bumpWorkerGen(namespace: string, gen: string): void {\n try {\n localStorage.setItem(GEN_KEY_PREFIX + namespace, gen);\n } catch {\n // localStorage unavailable; the reload falls back to reusing the worker.\n }\n}\n","import {\n DocumentModelRegistry,\n DocumentModelResolver,\n ReactorEventTypes,\n type IDocumentModelLoader,\n type ModelLoadedEvent,\n type ReactorFeatureFlags,\n type UnsupportedStoredDocuments,\n} from \"@powerhousedao/reactor\";\nimport {\n setPGliteDB,\n type WorkerReactorClientModule,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n connectReactorClient,\n createInspectorProxy,\n createPortTransport,\n createReactorEventBusProxy,\n createRelationalPgliteProxy,\n createWorkerAdminClient,\n MessageRouter,\n postReactorIdentity,\n RPC_PROTOCOL_VERSION,\n SyncManagerProxy,\n type ReactorIdentity,\n} from \"@powerhousedao/reactor-browser/rpc\";\nimport type {\n DocumentModelModule,\n SignaturePolicy,\n UpgradeManifest,\n} from \"@powerhousedao/shared/document-model\";\nimport type { IRenown, User } from \"@renown/sdk\";\nimport { setWorkerConnectionStatus } from \"./connection-state.js\";\nimport { reactorWorkerName } from \"./reactor-worker-name.js\";\nimport { getGitSha, getVersion } from \"./utils/build-info.js\";\nimport type { RenownTrustEndpoints } from \"./utils/renown-trust.js\";\n\nconst PING_INTERVAL_MS = 2000;\nconst PING_DEADLINE_MS = 3000;\nconst MAX_MISSED_PINGS = 2;\n\nexport type WorkerReactorClientArgs = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\n /** Absolute-URL shared-deps import map (from the production vendor); the\n * worker rewrites package sources to these URLs and blob-imports them. */\n sharedImports?: Record<string, string>;\n studioMode?: boolean;\n /** Loads the workflow package's document models. Independent of studioMode. */\n workflowsEnabled?: boolean;\n /** Chain the worker's bearer tokens are scoped to; matches the main thread's Renown instance. */\n renownChainId?: number;\n /** Enforcement flags for the worker's reactor; it has no runtime config to read them from. */\n featureFlags: Partial<ReactorFeatureFlags>;\n /** What the worker's client creates new documents as. */\n createSignaturePolicy?: SignaturePolicy;\n /** Whether the worker boots over stored documents this build does not run. */\n unsupportedStoredDocuments?: UnsupportedStoredDocuments;\n /** Where the worker's trust policy verifies signers under authEnforcement. */\n renownEndpoints?: RenownTrustEndpoints;\n documentModelModules: DocumentModelModule[];\n upgradeManifests: UpgradeManifest<readonly number[]>[];\n documentModelLoader: IDocumentModelLoader;\n renown: IRenown;\n onReload: (reason: string, workerGen?: string) => void;\n};\n\nexport type WorkerReactorClient = {\n reactorClientModule: WorkerReactorClientModule;\n syncManagerProxy: SyncManagerProxy;\n dispose: () => void;\n};\n\n/** Sorted so the same set always produces the same fingerprint. */\nfunction enabledFlagList(flags: Partial<ReactorFeatureFlags>): string {\n return Object.entries(flags)\n .filter(([, enabled]) => enabled)\n .map(([name]) => name)\n .sort()\n .join(\",\");\n}\n\nfunction toReactorIdentity(user: User | undefined): ReactorIdentity | null {\n if (!user) {\n return null;\n }\n return {\n address: user.address,\n chainId: user.chainId,\n networkId: user.networkId,\n };\n}\n\nexport function createWorkerReactorClientModule(\n args: WorkerReactorClientArgs,\n): WorkerReactorClient {\n const workerUrl = new URL(\"./reactor.worker.js\", import.meta.url);\n console.info(\n `[reactor-worker] constructing SharedWorker ${reactorWorkerName(\n args.namespace,\n )} from ${workerUrl.href}`,\n );\n const worker = new SharedWorker(workerUrl, {\n name: reactorWorkerName(args.namespace),\n type: \"module\",\n });\n worker.addEventListener(\"error\", (event) => {\n console.error(\n `[reactor-worker] SharedWorker failed to load from ${workerUrl.href}`,\n event.message || event,\n );\n });\n worker.port.onmessageerror = (event) => {\n console.error(\n \"[reactor-worker] port message could not be deserialized\",\n event,\n );\n };\n const transport = createPortTransport(worker.port);\n const router = new MessageRouter();\n router.attach(transport);\n\n const documentModelRegistry = new DocumentModelRegistry();\n documentModelRegistry.registerModules(...args.documentModelModules);\n documentModelRegistry.registerUpgradeManifests(...args.upgradeManifests);\n\n const gitSha = getGitSha();\n const clientProxy = connectReactorClient(\n router,\n {\n version: {\n appBuildId: gitSha !== \"unknown\" ? gitSha : getVersion(),\n rpcProtocolVersion: RPC_PROTOCOL_VERSION,\n models: args.documentModelModules.map((m) => ({\n id: m.documentModel.global.id,\n version: m.version ?? 1,\n })),\n featureFlags: enabledFlagList(args.featureFlags),\n },\n construct: {\n namespace: args.namespace,\n relationalNamespace: args.relationalNamespace,\n cdnUrl: args.cdnUrl,\n packageSpecs: args.packageSpecs,\n sharedImports: args.sharedImports,\n studioMode: args.studioMode,\n workflowsEnabled: args.workflowsEnabled,\n renownChainId: args.renownChainId,\n featureFlags: args.featureFlags,\n createSignaturePolicy: args.createSignaturePolicy,\n unsupportedStoredDocuments: args.unsupportedStoredDocuments,\n renownEndpoints: args.renownEndpoints,\n },\n packages: args.packageSpecs,\n },\n args.onReload,\n documentModelRegistry,\n );\n\n const busProxy = createReactorEventBusProxy(router);\n const syncManagerProxy = new SyncManagerProxy(router, busProxy);\n\n // Keep the tab registry synced with the worker's on-demand loads.\n const modelResolver = new DocumentModelResolver(\n documentModelRegistry,\n args.documentModelLoader,\n );\n busProxy.subscribe(ReactorEventTypes.MODEL_LOADED, (_type, event) => {\n const { documentType } = event as ModelLoadedEvent;\n void modelResolver.ensureModelLoaded(documentType).catch((error) => {\n console.error(\n `Failed to load model \"${documentType}\" into tab registry`,\n error,\n );\n });\n });\n\n // Seed the relational read surface the relational hooks read (SELECT + live, no raw PGlite).\n setPGliteDB({\n db: createRelationalPgliteProxy(router),\n isLoading: false,\n error: null,\n });\n\n postReactorIdentity(router, toReactorIdentity(args.renown.user));\n args.renown.on(\"user\", (user) =>\n postReactorIdentity(router, toReactorIdentity(user)),\n );\n\n const reactorClientModule: WorkerReactorClientModule = {\n kind: \"worker\",\n client: clientProxy,\n adminClient: createWorkerAdminClient(router),\n inspector: createInspectorProxy(router),\n reactorModule: {\n documentModelRegistry,\n syncModule: { syncManager: syncManagerProxy },\n eventBus: busProxy,\n },\n };\n\n let pingCounter = 0;\n let missedPings = 0;\n const pingDeadlines = new Map<string, ReturnType<typeof setTimeout>>();\n\n router.on(\"pong\", (msg) => {\n const timer = pingDeadlines.get(msg.id);\n if (timer === undefined) {\n return;\n }\n clearTimeout(timer);\n pingDeadlines.delete(msg.id);\n missedPings = 0;\n setWorkerConnectionStatus(\"connected\");\n });\n\n const pingInterval = setInterval(() => {\n const id = `ping${++pingCounter}`;\n const timer = setTimeout(() => {\n pingDeadlines.delete(id);\n missedPings += 1;\n if (missedPings >= MAX_MISSED_PINGS) {\n setWorkerConnectionStatus(\"lost\");\n }\n }, PING_DEADLINE_MS);\n pingDeadlines.set(id, timer);\n router.post({ k: \"ping\", id });\n }, PING_INTERVAL_MS);\n\n const dispose = () => {\n clearInterval(pingInterval);\n for (const timer of pingDeadlines.values()) {\n clearTimeout(timer);\n }\n pingDeadlines.clear();\n };\n\n return { reactorClientModule, syncManagerProxy, dispose };\n}\n","import { getRuntimeConfig } from \"../runtime-config.js\";\n\nexport const REACTOR_WORKER_QUERY_KEY = \"reactorWorker\";\nexport const REACTOR_WORKER_STORAGE_KEY = \"ph:reactorWorker\";\n\nexport type ReactorWorkerFlagInput = {\n configFlag: boolean;\n queryParam?: string | null;\n storedValue?: string | null;\n};\n\nexport function resolveReactorWorkerEnabled(\n input: ReactorWorkerFlagInput,\n): boolean {\n const fromQuery = parseFlag(input.queryParam);\n if (fromQuery !== undefined) {\n return fromQuery;\n }\n const fromStore = parseFlag(input.storedValue);\n if (fromStore !== undefined) {\n return fromStore;\n }\n return input.configFlag;\n}\n\n// Effective flag from config + dev override; a query-param override is persisted\n// to localStorage so it survives a refresh.\nexport function isReactorWorkerEnabled(): boolean {\n const configFlag =\n getRuntimeConfig().connect.instance?.reactorWorker ?? false;\n if (typeof window === \"undefined\") {\n return configFlag;\n }\n const queryParam = new URLSearchParams(window.location.search).get(\n REACTOR_WORKER_QUERY_KEY,\n );\n const storedValue = window.localStorage.getItem(REACTOR_WORKER_STORAGE_KEY);\n const enabled = resolveReactorWorkerEnabled({\n configFlag,\n queryParam,\n storedValue,\n });\n // Persist only an explicit override, not an unrecognized value.\n if (parseFlag(queryParam) !== undefined) {\n window.localStorage.setItem(\n REACTOR_WORKER_STORAGE_KEY,\n enabled ? \"true\" : \"false\",\n );\n }\n return enabled;\n}\n\nfunction parseFlag(value: string | null | undefined): boolean | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\") {\n return false;\n }\n // Unrecognized value (e.g. a typo): no override, fall through to store/config.\n return undefined;\n}\n","import {\n createReactorHostModuleBase,\n type IReadModel,\n} from \"@powerhousedao/reactor\";\nimport {\n createAttachmentClient,\n type AttachmentDownloadTarget,\n type AttachmentHeader,\n type AttachmentResponse,\n type IAttachmentService,\n} from \"@powerhousedao/reactor-attachments/client\";\nimport {\n createAnalyticsStore,\n type IProcessorHostModule,\n type IReactorClient,\n} from \"@powerhousedao/reactor-browser\";\nimport { getDb } from \"../pglite.db.js\";\n\n/** @deprecated Use IReactorClient from @powerhousedao/reactor-browser */\nexport type IReactorDispatch = IReactorClient;\n\nclass NullAttachmentService implements IAttachmentService {\n reserve(): Promise<never> {\n return Promise.reject(\n new Error(\"NullAttachmentService: no attachment service configured\"),\n );\n }\n stat(): Promise<AttachmentHeader> {\n return Promise.reject(\n new Error(\"NullAttachmentService: no attachment service configured\"),\n );\n }\n get(): Promise<AttachmentResponse> {\n return Promise.reject(\n new Error(\"NullAttachmentService: no attachment service configured\"),\n );\n }\n getDownloadTarget(): Promise<AttachmentDownloadTarget> {\n return Promise.reject(\n new Error(\"NullAttachmentService: no attachment service configured\"),\n );\n }\n}\n\nexport async function createProcessorHostModule(\n reactorClient: IReactorClient,\n readModels: ReadonlyArray<Pick<IReadModel, \"name\">>,\n attachmentService?: IAttachmentService,\n): Promise<IProcessorHostModule | undefined> {\n try {\n const { pgLite, relationalDb } = await getDb();\n const { store: analyticsStore } = await createAnalyticsStore({\n pgLite,\n });\n return {\n ...createReactorHostModuleBase({\n client: reactorClient,\n readModels,\n relationalDb,\n analyticsStore,\n processorApp: \"connect\",\n }),\n attachments: createAttachmentClient(\n attachmentService ?? new NullAttachmentService(),\n ),\n };\n } catch (error) {\n console.error(`Failed to initialize processor host module:`);\n console.error(error);\n }\n}\n","import {\n buildPHGlobalConfig,\n connectConfig,\n phGlobalConfig,\n} from \"@powerhousedao/connect/config\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport {\n addDefaultDrivesForNewReactor,\n createBrowserReactor,\n getDefaultDrives,\n} from \"@powerhousedao/connect/utils\";\nimport {\n createRemoteAttachmentService,\n createXhrUploadTransport,\n} from \"@powerhousedao/reactor-attachments/client\";\nimport {\n addPHEventHandlers,\n addRemoteDrive,\n DocumentCache,\n DocumentChangeType,\n DRIVE_DOCUMENT_TYPES,\n extractDriveSlugFromPath,\n extractNodeSlugFromPath,\n getDrives,\n login,\n refreshReactorDataClient,\n RegistryClient,\n setAttachmentService,\n setDefaultPHGlobalConfig,\n setDocumentCache,\n setDrives,\n setFeatures,\n setPackageDiscoveryService,\n setPHToast,\n setReactorClient,\n setReactorClientModule,\n setRenown,\n setSelectedDrive,\n setSelectedNode,\n setVetraPackageManager,\n type BrowserReactorClientModule,\n type IDocumentModelLoader,\n type IPackageManager,\n type PHToastFn,\n type ReactorFeatureFlags,\n type WorkerReactorClientModule,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserKeyStorage,\n RenownBuilder,\n RenownCryptoBuilder,\n} from \"@renown/sdk\";\nimport {\n logger,\n type DocumentModelLib,\n type UpgradeManifest,\n} from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.js\";\nimport { NoRegistryDiscoveryService } from \"../no-registry-discovery.js\";\nimport { PackageDiscoveryService } from \"../package-discovery.js\";\nimport { BrowserPackageManager } from \"../package-manager.js\";\nimport { createWorkerReactorClientModule } from \"../reactor-worker-client.js\";\nimport { bumpWorkerGen } from \"../reactor-worker-name.js\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\nimport { getSharedDeps } from \"../shared-deps.js\";\nimport { isReactorWorkerEnabled } from \"../utils/reactor-worker-flag.js\";\nimport {\n REACTOR_INSTANCE_NAMESPACE,\n RELATIONAL_PGLITE_NAME,\n} from \"../utils/storage-namespace.js\";\nimport { createProcessorHostModule } from \"./processor-host-module.js\";\n\n/**\n * Subscribe to ph-clint's `/__packages` SSE channel; each `packages-changed`\n * event sends the full live list, which we diff to add/remove packages.\n * Best-effort: no-ops when the endpoint is absent (e.g. vite dev).\n */\nfunction subscribeToPackagesChannel(packageManager: IPackageManager): void {\n if (typeof window === \"undefined\" || typeof EventSource === \"undefined\") {\n return;\n }\n let source: EventSource;\n try {\n source = new EventSource(\"/__packages\");\n } catch (err) {\n console.debug(\"[Connect] /__packages subscribe failed:\", err);\n return;\n }\n let firstEvent = true;\n source.addEventListener(\"packages-changed\", (event) => {\n try {\n const payload = JSON.parse((event as MessageEvent<string>).data) as {\n packages?: unknown;\n };\n if (!Array.isArray(payload.packages)) return;\n const next = payload.packages.filter(\n (p): p is string => typeof p === \"string\",\n );\n // Split a spec into (bareName, version). For scoped specs the leading\n // `@` is the scope, so the version `@` only counts when past index 0.\n const parseBare = (\n spec: string,\n ): { bareName: string; version?: string } => {\n const at = spec.startsWith(\"@\")\n ? spec.lastIndexOf(\"@\")\n : spec.indexOf(\"@\");\n if (at > 0) {\n return { bareName: spec.slice(0, at), version: spec.slice(at + 1) };\n }\n return { bareName: spec };\n };\n\n // Diff against registry packages only; bundled/local packages aren't in\n // the server list and removing them would break the drive editors.\n const currentByName = new Map(\n packageManager\n .getRegistryPackages()\n .map(({ name, version }) => [name, version]),\n );\n const nextByName = new Map<string, string | undefined>();\n for (const spec of next) {\n const { bareName, version } = parseBare(spec);\n nextByName.set(bareName, version);\n }\n\n const isFirst = firstEvent;\n firstEvent = false;\n\n for (const name of currentByName.keys()) {\n if (!nextByName.has(name)) {\n packageManager.removePackage(name);\n if (!isFirst) {\n toast(`Removed package ${name}`, { type: \"connect-deleted\" });\n }\n }\n }\n for (const spec of next) {\n const { bareName, version } = parseBare(spec);\n const currentVersion = currentByName.get(bareName);\n const isKnown = currentByName.has(bareName);\n if (\n isKnown &&\n (!version || !currentVersion || version === currentVersion)\n ) {\n continue;\n }\n const isUpdate = isKnown;\n Promise.resolve(packageManager.addPackage(spec)).then(\n (result) => {\n if (result.type === \"error\") {\n console.error(\n `[Connect] /__packages addPackage(${spec}) failed:`,\n result.error,\n );\n return;\n }\n if (isFirst) return;\n const name = result.package.manifest.name;\n toast(\n isUpdate\n ? `Updated package ${name}`\n : `Installed package ${name}`,\n { type: \"connect-success\" },\n );\n },\n (err: unknown) => {\n console.error(\n `[Connect] /__packages addPackage(${spec}) threw:`,\n err,\n );\n },\n );\n }\n } catch (err) {\n console.error(\"[Connect] /__packages event parse failed:\", err);\n }\n });\n source.addEventListener(\"error\", () => {\n // EventSource auto-reconnects.\n });\n}\n\nexport async function clearReactorStorage() {\n const module = window.ph?.reactorClientModule;\n if (module?.kind === \"worker\") {\n // The worker holds the PGlite handles open, so it must close + clear them.\n await module.adminClient.clearStorage();\n return;\n }\n if (module?.kind === \"browser\") {\n await module.reactorModule?.pg?.close();\n }\n\n // Dropping tables in PGlite with relaxedDurability can lose pending IDB\n // writes on reload; delete the whole DB so startup re-migrates from scratch.\n const dbs = await indexedDB.databases();\n const targets = dbs\n .map((d) => d.name)\n .filter(\n (n): n is string =>\n !!n && !n.startsWith(\"ph-pglite-backup::\") && /pglite|reactor/i.test(n),\n );\n\n await Promise.all(\n targets.map(\n (name) =>\n new Promise<void>((resolve) => {\n const req = indexedDB.deleteDatabase(name);\n req.onsuccess = req.onerror = req.onblocked = () => resolve();\n }),\n ),\n );\n}\n\nexport async function createReactor(localPackage?: DocumentModelLib) {\n if (!window.ph) {\n window.ph = {};\n }\n if (window.ph.loading) return;\n\n window.ph.loading = true;\n\n addPHEventHandlers();\n\n setPHToast(toast as PHToastFn);\n\n const features = await initFeatureFlags();\n\n logger.info(\n \"Features: @features\",\n JSON.stringify(Object.fromEntries(features), null, 2),\n );\n\n // Credentials and the bearer token must be scoped to the same chain, and the\n // worker mints its own tokens, so this value is passed to it too (see below).\n const renownChainId = getRuntimeConfig().connect.renown?.chainId;\n\n const keyPairStorage = await BrowserKeyStorage.create();\n const cryptoBuilder = new RenownCryptoBuilder().withKeyPairStorage(\n keyPairStorage,\n );\n if (renownChainId !== undefined) {\n cryptoBuilder.withChainId(renownChainId);\n }\n const renownCrypto = await cryptoBuilder.build();\n\n // Renown namespace is a boot-time constant, so read it from runtime config\n // rather than the PHGlobalConfig machinery; baseUrl stays in phGlobalConfig.\n const renown = await new RenownBuilder(\"connect\", {\n basename:\n getRuntimeConfig().connect.renown?.namespace ??\n phGlobalConfig.routerBasename,\n baseUrl: phGlobalConfig.renownUrl,\n switchboardUrl: phGlobalConfig.switchboardUrl,\n chainId: renownChainId,\n })\n .withCrypto(renownCrypto)\n .build();\n\n // Sync getter is safe: loadComponent() warmed the cache before createReactor,\n // and it throws loudly if a future caller violates that boot ordering.\n const runtimeConfig = getRuntimeConfig();\n\n const packageManager = new BrowserPackageManager(\n phGlobalConfig.routerBasename ?? \"\",\n runtimeConfig.packageRegistryUrl ?? null,\n );\n setVetraPackageManager(packageManager);\n await packageManager.init(\n localPackage,\n runtimeConfig.localPackage?.version,\n phGlobalConfig.studioMode,\n connectConfig.workflowsEnabled,\n );\n // Register provider:\"local\" packages the vite plugin bundled in. The virtual\n // module only exists under phBundledPackagesPlugin (ph-cli), so a resolution\n // failure under plain vite dev is expected; the indirection + @vite-ignore\n // also stops Vite's dep scanner from pre-bundling the specifier.\n try {\n const bundledPackagesModule = \"ph-bundled-packages-virtual\";\n const { default: registerBundledPackages } = (await import(\n /* @vite-ignore */ bundledPackagesModule\n )) as { default: (pm: IPackageManager) => void };\n registerBundledPackages(packageManager);\n } catch {\n // no bundled packages in this build\n }\n const remotePackages = runtimeConfig.packages\n .filter((p) => p.provider !== \"local\")\n .map((p) => (p.version ? `${p.packageName}@${p.version}` : p.packageName));\n const packagesResult = await packageManager.addPackages(remotePackages);\n packagesResult.map((r) => {\n if (r.type === \"error\") console.error(r.error);\n });\n\n // Opt-in (connect.packages.liveReload): pick up live publishes without a\n // page reload via the static-mode `/__packages` SSE channel.\n if (runtimeConfig.connect?.packages?.liveReload) {\n subscribeToPackagesChannel(packageManager);\n }\n\n const documentModelModules = packageManager.packages\n .flatMap((pkg) => pkg.documentModels)\n .filter(\n (module, index, modules) =>\n // dedupe by documentType and version\n modules.findIndex(\n (m) =>\n m.documentModel.global.id === module.documentModel.global.id &&\n m.version === module.version,\n ) === index,\n );\n\n const upgradeManifests = packageManager.packages\n .flatMap((pkg) => pkg.upgradeManifests)\n .filter(\n (manifest, index, manifests) =>\n // dedupe by documentType\n manifest !== undefined &&\n manifests.findIndex(\n (m) => m && m.documentType === manifest.documentType,\n ) === index,\n ) as UpgradeManifest<readonly number[]>[];\n\n // auto-installs packages for unknown document types\n const discoveryService =\n packageManager.cdnUrl !== null\n ? new PackageDiscoveryService(\n packageManager,\n new RegistryClient(packageManager.cdnUrl),\n {\n mode: \"immediate\",\n storageKey: phGlobalConfig.routerBasename ?? \"\",\n },\n )\n : new NoRegistryDiscoveryService(packageManager);\n\n setPackageDiscoveryService(discoveryService);\n\n // Config alone, no per-tab override: these must match the fleet Connect syncs\n // with. The worker gets them in its construct message.\n const reactorFeatureFlags: Partial<ReactorFeatureFlags> =\n runtimeConfig.connect?.reactor?.featureFlags ?? {};\n const enabledReactorFlags = Object.entries(reactorFeatureFlags)\n .filter(([, enabled]) => enabled)\n .map(([name]) => name);\n if (enabledReactorFlags.length > 0) {\n logger.info(`Reactor feature flags: ${enabledReactorFlags.join(\", \")}`);\n }\n const createSignaturePolicy =\n runtimeConfig.connect?.reactor?.createSignaturePolicy;\n const unsupportedStoredDocuments =\n runtimeConfig.connect?.reactor?.unsupportedStoredDocuments;\n // Both hosts verify signers against the endpoints the tab's Renown uses.\n const renownEndpoints = {\n renownUrl: phGlobalConfig.renownUrl,\n switchboardUrl: phGlobalConfig.switchboardUrl,\n };\n\n // create reactor v2 with all versions and upgrade manifests\n let reactorClientModule:\n | BrowserReactorClientModule\n | WorkerReactorClientModule;\n if (isReactorWorkerEnabled()) {\n const packageSpecs = packageManager\n .getRegistryPackages()\n .map((p) => (p.version ? `${p.name}@${p.version}` : p.name));\n // Silent tab loader (no install prompt; the worker already loaded the model).\n const registryClient = new RegistryClient(packageManager.cdnUrl ?? \"\");\n const documentModelLoader: IDocumentModelLoader = {\n async load(documentType) {\n const names = packageManager.cdnUrl\n ? await registryClient.getPackagesByDocumentType(documentType)\n : [];\n for (const name of names) {\n const result = await packageManager.addPackage(name);\n if (result.type === \"error\") {\n throw new Error(\n `Failed to install package \"${name}\" for document model: ${documentType}`,\n { cause: result.error },\n );\n }\n }\n const module = packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n if (!module) {\n throw new Error(\n names.length > 0\n ? `Installed [${names.join(\", \")}] but document model not available: ${documentType}`\n : `No package found for document model: ${documentType} (cdnUrl: ${packageManager.cdnUrl ?? \"none\"})`,\n );\n }\n return module;\n },\n };\n // The production vendor's shared-deps table (null in dev / vendor-off\n // builds): the worker rewrites shared imports in package sources to\n // these absolute URLs and blob-imports the result.\n const sharedImports = (await getSharedDeps())?.imports;\n const workerClient = createWorkerReactorClientModule({\n namespace: REACTOR_INSTANCE_NAMESPACE,\n relationalNamespace: RELATIONAL_PGLITE_NAME,\n cdnUrl: packageManager.cdnUrl ?? \"\",\n packageSpecs,\n sharedImports,\n studioMode: phGlobalConfig.studioMode,\n workflowsEnabled: connectConfig.workflowsEnabled,\n renownChainId,\n featureFlags: reactorFeatureFlags,\n createSignaturePolicy,\n unsupportedStoredDocuments,\n renownEndpoints,\n documentModelModules,\n upgradeManifests,\n documentModelLoader,\n renown,\n onReload: (reason, workerGen) => {\n logger.warn(\"Reactor worker requested reload: @reason\", reason);\n if (workerGen) {\n bumpWorkerGen(REACTOR_INSTANCE_NAMESPACE, workerGen);\n }\n window.location.reload();\n },\n });\n reactorClientModule = workerClient.reactorClientModule;\n // Block boot until the sync manager seeds remotes from the worker, so\n // list()/connection state are warm before consumers first read them.\n try {\n await workerClient.syncManagerProxy.startup();\n } catch (error) {\n window.ph.loading = false;\n logger.error(\"Reactor worker failed to start: @error\", error);\n throw error;\n }\n } else {\n reactorClientModule = await createBrowserReactor(\n documentModelModules,\n upgradeManifests,\n renown,\n reactorFeatureFlags,\n discoveryService,\n createSignaturePolicy,\n renownEndpoints,\n unsupportedStoredDocuments,\n );\n }\n\n const drives = await getDrives(reactorClientModule.client);\n\n const didFromUrl = getDidFromUrl();\n await login(didFromUrl, renown);\n\n const documentCache = new DocumentCache(reactorClientModule.client);\n\n const basePath = phGlobalConfig.basePath ?? \"/\";\n const routerBasename = phGlobalConfig.routerBasename ?? \"/\";\n const mergedGlobalConfig = buildPHGlobalConfig(\n basePath,\n routerBasename,\n runtimeConfig.connect ?? {},\n );\n setDefaultPHGlobalConfig(mergedGlobalConfig);\n\n // Slug extraction needs window.ph.basePath, published by\n // setDefaultPHGlobalConfig above.\n const path = window.location.pathname;\n const driveSlug = extractDriveSlugFromPath(path);\n const nodeSlug = extractNodeSlugFromPath(path);\n setReactorClientModule(reactorClientModule);\n setReactorClient(reactorClientModule.client);\n\n const _defaultDrivesUrl = phGlobalConfig.defaultDrivesUrl;\n if (_defaultDrivesUrl) {\n let switchboardOrigin: string | undefined;\n try {\n switchboardOrigin = new URL(_defaultDrivesUrl).origin;\n } catch {\n // malformed URL — skip attachment service construction\n }\n if (switchboardOrigin) {\n const attachmentJwtHandler = async (_url: string) => {\n if (!renown.user) return undefined;\n // aud omitted: server rejects aud-bearing tokens. Re-enable once both sides support it.\n return renown.getBearerToken({ expiresIn: 10 });\n };\n const attachmentService = createRemoteAttachmentService({\n remoteUrl: switchboardOrigin,\n jwtHandler: attachmentJwtHandler,\n // XMLHttpRequest is the only browser API that reports upload byte\n // progress; everything else about the request is unchanged.\n uploadTransport: createXhrUploadTransport(),\n });\n setAttachmentService(attachmentService);\n }\n }\n\n setDocumentCache(documentCache);\n setRenown(renown);\n setDrives(drives);\n setFeatures(features);\n\n // Add default/remote drives in the background so the app renders immediately;\n // setSelectedDrive defers selection until the URL-matched drive syncs in.\n const defaultDrivesConfig = getDefaultDrives(runtimeConfig);\n if (defaultDrivesConfig.length > 0) {\n void addDefaultDrivesForNewReactor(defaultDrivesConfig).catch((error) =>\n console.error(\"Failed to add default drives:\", error),\n );\n }\n\n const remoteUrl = getDriveUrl();\n if (remoteUrl) {\n void addRemoteDrive(remoteUrl, undefined).catch((error) =>\n console.error(`Failed to add remote drive from ${remoteUrl}:`, error),\n );\n }\n\n setSelectedDrive(driveSlug);\n setSelectedNode(nodeSlug);\n\n // Refresh the drive list on any drive-type change so async-added\n // default/remote drives surface on first load without a manual reload.\n const reactorClient = reactorClientModule.client;\n for (const driveType of DRIVE_DOCUMENT_TYPES) {\n reactorClient.subscribe({ type: driveType }, (event) => {\n logger.verbose(\"ReactorClient subscription event: @event\", event);\n refreshReactorDataClient(reactorClientModule.client).catch((e) =>\n logger.error(\"@error\", e),\n );\n });\n }\n\n // Redirect when a currently-viewed document or drive is deleted remotely\n reactorClient.subscribe({}, (event) => {\n if (event.type !== DocumentChangeType.Deleted) return;\n const deletedId = event.context?.childId;\n if (!deletedId) return;\n\n const selectedDriveId = window.ph?.selectedDriveId;\n const selectedNodeId = window.ph?.selectedNodeId;\n\n if (selectedDriveId && deletedId === selectedDriveId) {\n setSelectedDrive(undefined);\n toast(\"The drive you were viewing has been deleted\");\n return;\n }\n\n if (selectedNodeId && deletedId === selectedNodeId) {\n setSelectedNode(undefined);\n toast(\"The document you were editing has been deleted\");\n }\n });\n\n await refreshReactorDataClient(reactorClientModule.client);\n\n const packagesWithProcessorFactories = packageManager.packages.filter(\n (pkg) => pkg.processorFactory !== undefined,\n );\n\n // processorManager lives in the worker on the cutover path and is not yet\n // bridged, so surface the gap loudly rather than dropping factories silently.\n const reactorModule =\n reactorClientModule.kind === \"browser\"\n ? reactorClientModule.reactorModule\n : undefined;\n if (packagesWithProcessorFactories.length > 0 && !reactorModule) {\n for (const pkg of packagesWithProcessorFactories) {\n logger.warn(\n \"Skipping processor factory @name: processors are not supported on the worker reactor path yet\",\n pkg.manifest.name,\n );\n }\n } else if (packagesWithProcessorFactories.length > 0 && reactorModule) {\n const readModels = reactorModule.readModelCoordinator.readModels;\n const processorHostModule = await createProcessorHostModule(\n reactorClientModule.client,\n readModels,\n window.ph?.attachmentService,\n );\n if (processorHostModule !== undefined) {\n await Promise.all(\n packagesWithProcessorFactories.map(async (pkg) => {\n const { manifest, processorFactory } = pkg;\n const name = manifest.name;\n const id = manifest.name;\n const version = packageManager.getPackageVersion(name);\n const label = version ? `${name}@${version}` : name;\n logger.info(\"Loading processor factory: @label\", label);\n try {\n const factory = await processorFactory?.(processorHostModule);\n if (!factory) return;\n await reactorModule.processorManager.registerFactory(id, factory);\n } catch (error) {\n logger.error(`Error registering processor: @label`, label);\n logger.error(\"@error\", error);\n }\n }),\n );\n }\n }\n\n window.ph.loading = false;\n}\n\nfunction getDidFromUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const didComponent = searchParams.get(\"user\");\n const did = didComponent ? decodeURIComponent(didComponent) : undefined;\n return did;\n}\n\nfunction getDriveUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const driveUrl = searchParams.get(\"driveUrl\");\n const url = driveUrl ? decodeURIComponent(driveUrl) : undefined;\n return url;\n}\n"],"names":["ReactorBuilder","ChannelScheme","ReactorClientBuilder"],"mappings":"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","debug_id":"e9dffb1a-3523-5af8-8cad-60683e091ce0"}
|
package/dist/reactor.worker.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
|
2
|
+
export {};
|
package/dist/reactor.worker.js
CHANGED
|
@@ -1,26 +1,45 @@
|
|
|
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]="
|
|
3
|
-
import {
|
|
4
|
-
import { a as
|
|
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
|
+
import { t as createConnectSignerConfig } from "./renown-trust-DRgHpxlZ.js";
|
|
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";
|
|
5
6
|
import { createRelationalDb } from "@powerhousedao/shared/processors";
|
|
6
7
|
import { ChannelScheme, DocumentIntegrityService, DriveCollectionId, InMemoryQueue, ReactorBuilder, ReactorClientBuilder } from "@powerhousedao/reactor";
|
|
7
8
|
import { baseDocumentModels } from "@powerhousedao/reactor-browser/base-document-models";
|
|
8
9
|
import { FORWARDED_EVENT_TYPES, ReactorHost, SYNC_STATUS_CHANGED_EVENT, WorkerPackageLoader } from "@powerhousedao/reactor-browser/rpc";
|
|
9
10
|
import * as commonDocumentModels from "@powerhousedao/powerhouse-vetra-packages/document-models";
|
|
10
|
-
import { BrowserKeyStorage, RenownCryptoBuilder, RenownCryptoSigner
|
|
11
|
+
import { BrowserKeyStorage, RenownCryptoBuilder, RenownCryptoSigner } from "@renown/sdk/crypto";
|
|
11
12
|
import { Kysely } from "kysely";
|
|
12
13
|
import { PGliteDialect } from "kysely-pglite-dialect";
|
|
13
|
-
//#region src/reactor
|
|
14
|
-
console.info("[reactor.worker] module evaluating");
|
|
15
|
-
const RENOWN_APP_NAME = "connect";
|
|
14
|
+
//#region src/reactor-worker-models.ts
|
|
16
15
|
function toDocumentModelModules(candidates) {
|
|
17
16
|
return candidates.filter((m) => typeof m === "object" && m !== null && "documentModel" in m && "reducer" in m);
|
|
18
17
|
}
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
const defaultBundledModelLoaders = {
|
|
19
|
+
vetra: () => import("@powerhousedao/vetra/document-models"),
|
|
20
|
+
workflow: () => import("@powerhousedao/workflow/document-models")
|
|
21
|
+
};
|
|
22
|
+
async function loadFlaggedDocumentModels(flags, loaders = defaultBundledModelLoaders) {
|
|
23
|
+
const models = [];
|
|
24
|
+
if (flags.studioMode) models.push(...toDocumentModelModules(Object.values(await loaders.vetra())));
|
|
25
|
+
if (flags.workflowsEnabled) models.push(...toDocumentModelModules(Object.values(await loaders.workflow())));
|
|
26
|
+
return models;
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/reactor-worker-signer.ts
|
|
30
|
+
const RENOWN_APP_NAME = "connect";
|
|
31
|
+
/** The worker's signer; its `user` is updated in place on identity changes. */
|
|
32
|
+
async function createWorkerSignerConfig(crypto, construct, identity) {
|
|
33
|
+
const signer = new RenownCryptoSigner(crypto, RENOWN_APP_NAME, identity);
|
|
34
|
+
return {
|
|
35
|
+
signer,
|
|
36
|
+
signerConfig: await createConnectSignerConfig(signer, construct.featureFlags, construct.renownEndpoints ?? {})
|
|
37
|
+
};
|
|
23
38
|
}
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region src/reactor.worker.ts
|
|
41
|
+
console.info("[reactor.worker] module evaluating");
|
|
42
|
+
const commonBundledModels = toDocumentModelModules(Object.values(commonDocumentModels));
|
|
24
43
|
let loader;
|
|
25
44
|
let registry;
|
|
26
45
|
let signer;
|
|
@@ -30,6 +49,7 @@ const owned = {};
|
|
|
30
49
|
let inspectorQueue;
|
|
31
50
|
let inspectorProcessors;
|
|
32
51
|
let inspectorIntegrity;
|
|
52
|
+
let inspectorCatchUp;
|
|
33
53
|
let currentIdentity = null;
|
|
34
54
|
const registeredKeys = /* @__PURE__ */ new Set();
|
|
35
55
|
function modelKey(module) {
|
|
@@ -101,8 +121,20 @@ const inMemoryBackup = {
|
|
|
101
121
|
discard: () => Promise.resolve(),
|
|
102
122
|
commit: () => Promise.resolve()
|
|
103
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
|
+
}
|
|
135
|
+
const workerName = self.name ?? "";
|
|
104
136
|
const host = new ReactorHost({
|
|
105
|
-
namespace:
|
|
137
|
+
namespace: workerName,
|
|
106
138
|
onAdminRestart: () => host.broadcastReload("admin restart", crypto.randomUUID()),
|
|
107
139
|
onAdminClearStorage: async () => {
|
|
108
140
|
await relational.pg?.close();
|
|
@@ -144,11 +176,19 @@ const host = new ReactorHost({
|
|
|
144
176
|
importPackage: (url) => import(
|
|
145
177
|
/* @vite-ignore */
|
|
146
178
|
url
|
|
179
|
+
),
|
|
180
|
+
sharedImports: construct.sharedImports,
|
|
181
|
+
importSource: (source) => import(
|
|
182
|
+
/* @vite-ignore */
|
|
183
|
+
URL.createObjectURL(new Blob([source], { type: "text/javascript" }))
|
|
147
184
|
)
|
|
148
185
|
});
|
|
149
186
|
const loaded = await loader.loadPackages(construct.packageSpecs);
|
|
150
|
-
const
|
|
151
|
-
|
|
187
|
+
const flaggedModels = await loadFlaggedDocumentModels({
|
|
188
|
+
studioMode: construct.studioMode,
|
|
189
|
+
workflowsEnabled: construct.workflowsEnabled
|
|
190
|
+
});
|
|
191
|
+
const models = baseDocumentModels.concat(commonBundledModels, flaggedModels, loaded);
|
|
152
192
|
phase = "opening pglite stores";
|
|
153
193
|
console.info(`[reactor.worker] boot: ${phase}`);
|
|
154
194
|
const reactor = await openReactorPglite(construct.namespace);
|
|
@@ -165,15 +205,17 @@ const host = new ReactorHost({
|
|
|
165
205
|
phase = "building crypto";
|
|
166
206
|
console.info(`[reactor.worker] boot: ${phase}`);
|
|
167
207
|
const crypto = await buildWorkerCrypto(construct.renownChainId);
|
|
168
|
-
|
|
208
|
+
phase = "building signer";
|
|
209
|
+
const built = await createWorkerSignerConfig(crypto, construct, currentIdentity ?? void 0);
|
|
210
|
+
signer = built.signer;
|
|
169
211
|
const jwtHandler = async () => currentIdentity ? crypto.getBearerToken(currentIdentity.address, { expiresIn: 10 }) : void 0;
|
|
170
212
|
phase = "building reactor module";
|
|
171
213
|
console.info(`[reactor.worker] boot: ${phase}`);
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}).withReactorBuilder(new ReactorBuilder().withDocumentModelSources(models).withChannelScheme(ChannelScheme.CONNECT).withExecutorConfig({ featureFlags: construct.featureFlags ?? {} }).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) })));
|
|
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);
|
|
176
217
|
builder.withDocumentModelLoader(loader);
|
|
218
|
+
if (construct.createSignaturePolicy) builder.withCreateSignaturePolicy(construct.createSignaturePolicy);
|
|
177
219
|
const module = await builder.buildModule();
|
|
178
220
|
registry = module.reactorModule?.documentModelRegistry;
|
|
179
221
|
syncManager = module.reactorModule?.syncModule?.syncManager;
|
|
@@ -181,6 +223,7 @@ const host = new ReactorHost({
|
|
|
181
223
|
if (rm) {
|
|
182
224
|
inspectorQueue = rm.queue instanceof InMemoryQueue ? rm.queue : void 0;
|
|
183
225
|
inspectorProcessors = rm.processorManager;
|
|
226
|
+
inspectorCatchUp = rm.catchUp;
|
|
184
227
|
inspectorIntegrity = new DocumentIntegrityService(rm.keyframeStore, rm.operationStore, rm.writeCache, rm.documentView, rm.documentModelRegistry);
|
|
185
228
|
}
|
|
186
229
|
for (const m of models) registeredKeys.add(modelKey(m));
|
|
@@ -193,7 +236,8 @@ const host = new ReactorHost({
|
|
|
193
236
|
return module.client;
|
|
194
237
|
} catch (error) {
|
|
195
238
|
console.error(`[reactor.worker] boot failed at phase "${phase}":`, error);
|
|
196
|
-
|
|
239
|
+
await releaseStores();
|
|
240
|
+
throw toStoredDocumentsRefused(error);
|
|
197
241
|
}
|
|
198
242
|
},
|
|
199
243
|
registerPackages: async (specs) => {
|
|
@@ -216,6 +260,11 @@ const host = new ReactorHost({
|
|
|
216
260
|
case "bindRemote":
|
|
217
261
|
await syncManager.bindRemote(args[0], args[1]);
|
|
218
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]);
|
|
219
268
|
case "remove":
|
|
220
269
|
await syncManager.remove(args[0]);
|
|
221
270
|
return;
|
|
@@ -287,6 +336,12 @@ const host = new ReactorHost({
|
|
|
287
336
|
await inspectorProcessors?.get(processorId)?.retry();
|
|
288
337
|
return;
|
|
289
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();
|
|
290
345
|
case "integrity.validate": {
|
|
291
346
|
if (!inspectorIntegrity) throw new Error("Integrity service not available");
|
|
292
347
|
const [documentId, branch] = args;
|
|
@@ -329,4 +384,4 @@ globalScope.onconnect = (event) => {
|
|
|
329
384
|
//#endregion
|
|
330
385
|
|
|
331
386
|
//# sourceMappingURL=reactor.worker.js.map
|
|
332
|
-
//# debugId=
|
|
387
|
+
//# debugId=951f920d-891c-50dc-a918-f37ec9402372
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactor.worker.js","sources":["../src/reactor.worker.ts"],"sourcesContent":["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 { DocumentModelModule } 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 BrowserKeyStorage,\n createSignatureVerifier,\n RenownCryptoBuilder,\n RenownCryptoSigner,\n} from \"@renown/sdk/crypto\";\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// Matches the main thread's RenownBuilder(\"connect\").\nconst RENOWN_APP_NAME = \"connect\";\n\n// Common models the tab bundles as a local package; not CDN-loadable, so the\n// worker imports them directly. Vetra is builder-only and lazy-loaded below.\nfunction toDocumentModelModules(candidates: unknown[]): 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\nconst commonBundledModels = toDocumentModelModules(\n Object.values(commonDocumentModels),\n);\n\n// Not CDN-loadable, so it can't ride the packageSpecs path; lazy-import the\n// bundled chunk only in studio mode.\nasync function loadVetraDocumentModels(): Promise<DocumentModelModule[]> {\n const vetraDocumentModels =\n await import(\"@powerhousedao/vetra/document-models\");\n return toDocumentModelModules(Object.values(vetraDocumentModels));\n}\n\ntype WorkerConstruct = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\n studioMode?: 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};\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 });\n const loaded = await loader.loadPackages(construct.packageSpecs);\n const vetraModels = construct.studioMode\n ? await loadVetraDocumentModels()\n : [];\n const models = baseDocumentModels.concat(\n commonBundledModels,\n vetraModels,\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 signer = new RenownCryptoSigner(\n crypto,\n RENOWN_APP_NAME,\n currentIdentity ?? undefined,\n );\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({ signer, verifier: createSignatureVerifier() })\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 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":"2d329409-74b5-5920-81a7-c1277a6ba8d9"}
|
|
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":";;;;;;;;;;;;;;AAIA,SAAgB,uBACd,YACuB;CACvB,OAAO,WAAW,QACf,MACC,OAAO,MAAM,YACb,MAAM,QACN,mBAAmB,KACnB,aAAa,CACjB;AACF;AAiBA,MAAa,6BAAkD;CAC7D,aAAa,OAAO;CACpB,gBAAgB,OAAO;AACzB;AAIA,eAAsB,0BACpB,OACA,UAA+B,4BACC;CAChC,MAAM,SAAgC,CAAC;CACvC,IAAI,MAAM,YACR,OAAO,KACL,GAAG,uBAAuB,OAAO,OAAO,MAAM,QAAQ,MAAM,CAAC,CAAC,CAChE;CAEF,IAAI,MAAM,kBACR,OAAO,KACL,GAAG,uBAAuB,OAAO,OAAO,MAAM,QAAQ,SAAS,CAAC,CAAC,CACnE;CAEF,OAAO;AACT;;;AC7CA,MAAa,kBAAkB;;AAU/B,eAAsB,yBACpB,QACA,WACA,UACqE;CACrE,MAAM,SAAS,IAAI,mBAAmB,QAAQ,iBAAiB,QAAQ;CAMvE,OAAO;EAAE;EAAQ,cAAA,MALU,0BACzB,QACA,UAAU,cACV,UAAU,mBAAmB,CAAC,CAChC;CAC8B;AAChC;;;ACwCA,QAAQ,KAAK,oCAAoC;AAIjD,MAAM,sBAAsB,uBAC1B,OAAO,OAAO,oBAAoB,CACpC;AAgCA,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AAKJ,MAAM,aAA8B,CAAC;AASrC,MAAM,QAAsB,CAAC;AAC7B,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI,kBAA0C;AAC9C,MAAM,iCAAiB,IAAI,IAAY;AAEvC,SAAS,SAAS,QAAqC;CACrD,OAAO,GAAG,OAAO,cAAc,OAAO,GAAG,GAAG,OAAO,WAAW;AAChE;AAGA,SAAS,aAAa,QAAgB;CACpC,OAAO;EACL,MAAM,OAAO;EACb,iBAAiB,OAAO,QAAQ,mBAAmB;CACrD;AACF;AAGA,SAAS,qBAA2B;CAClC,IAAI,CAAC,UAAU,CAAC,UACd;CAEF,MAAM,QAAQ,OAAO,OAAO,QAAQ,MAAM,CAAC,eAAe,IAAI,SAAS,CAAC,CAAC,CAAC;CAC1E,IAAI,MAAM,WAAW,GACnB;CAEF,SAAS,gBAAgB,GAAG,KAAK;CACjC,KAAK,MAAM,KAAK,OACd,eAAe,IAAI,SAAS,CAAC,CAAC;AAElC;AAGA,eAAe,kBAAkB,SAA6B;CAC5D,MAAM,aAAa,MAAM,kBAAkB,OAAO;CAClD,MAAM,UAAU,IAAI,oBAAoB,CAAC,CAAC,mBAAmB,UAAU;CACvE,IAAI,YAAY,KAAA,GACd,QAAQ,YAAY,OAAO;CAE7B,OAAO,QAAQ,MAAM;AACvB;AAGA,eAAe,kBAAkB,WAAmB;CAClD,MAAM,WAAW,YAAY,MAAM,kBAAkB,WAAW,WAAW,CAAC;CAC5E,MAAM,QAAQ,yBAAyB,QAAQ;CAC/C,IAAI,UAAU,IACZ,QAAQ,KACN,qEAAqE,MAAM,6DAC7E;CAEF,MAAM,EAAE,WAAW,MAAM,iBAAiB,KAAK;CAC/C,MAAM,KAAK,IAAI,OAAO,SAAS,aAAa,EAAE,mBAAmB,KAAK,CAAC;CACvE,MAAM,GAAG;CACT,OAAO;EAAE;EAAI;CAAS;AACxB;AAIA,eAAe,WAAW,OAAgD;CACxE,IAAI,UAAU,IACZ,OAAO,OAAO;CAEhB,OAAO,OAAO;AAChB;AAEA,eAAe,eAAe,WAA2C;CACvE,IAAI;EACF,MAAM,WAAW,YACf,MAAM,kBAAkB,WAAW,WAAW,CAChD;EACA,MAAM,QAAQ,yBAAyB,QAAQ;EAC/C,IAAI,UAAU,IACZ,QAAQ,KACN,8EAA8E,MAAM,6DACtF;EAEF,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,MAAM,QAAQ,IAAI,CAC/C,iBAAiB,KAAK,GACtB,WAAW,KAAK,CAClB,CAAC;EACD,MAAM,KAAK,IAAI,OAAO,SAAS,aAAa;GAC1C,mBAAmB;GACnB,YAAY,EAAE,KAAK;EACrB,CAAC;EACD,MAAM,GAAG;EACT,WAAW,KAAK;EAChB,WAAW,KAAK,mBACd,IAAI,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,EAAE,CAAC,CAC/C;EACA,QAAQ,KACN,mDAAmD,UAAU,aAAa,MAAM,GAClF;EACA,OAAO;CACT,SAAS,OAAO;EACd,QAAQ,MACN,yDACA,KACF;EACA,OAAO;CACT;AACF;AAEA,IAAI,iBAAuC,EAAE,QAAQ,OAAO;AAE5D,SAAS,aAAa,OAAmC;CACvD,iBAAiB;CACjB,KAAK,kBAAkB,KAAK;AAC9B;AAEA,MAAM,iBAAiC;CACrC,WAAW,YAAY,aAAa,OAAO;CAC3C,WAAW,QAAQ,YACjB,cAAc,SAAS,MAAyB;CAClD,eAAe,QAAQ,QAAQ;CAC/B,cAAc,QAAQ,QAAQ;AAChC;AAEA,eAAe,gBAA+B;CAC5C,MAAM,SAAS,CAAC,WAAW,IAAI,MAAM,SAAS;CAC9C,WAAW,KAAK,KAAA;CAChB,WAAW,KAAK,KAAA;CAChB,MAAM,YAAY,KAAA;CAClB,KAAK,MAAM,SAAS,QAClB,IAAI;EACF,MAAM,OAAO,MAAM;CACrB,SAAS,OAAO;EACd,QAAQ,MAAM,4CAA4C,KAAK;CACjE;AAEJ;AAEA,MAAM,aAAc,KAA2B,QAAQ;AAEvD,MAAM,OAAO,IAAI,YAAY;CAC3B,WAAW;CACX,sBACE,KAAK,gBAAgB,iBAAiB,OAAO,WAAW,CAAC;CAC3D,qBAAqB,YAAY;EAC/B,MAAM,WAAW,IAAI,MAAM;EAC3B,MAAM,MAAM,WAAW,MAAM;EAC7B,KAAK,MAAM,WAAW,CAAC,MAAM,YAAY,MAAM,aAAa,GAC1D,IAAI,SACF,MAAM,cAAc,OAAO;EAG/B,KAAK,gBAAgB,mBAAmB,OAAO,WAAW,CAAC;CAC7D;CACA,gBAAgB,YAAY;EAC1B,aAAa;GACX,QAAQ;GACR,aAAa,eAAe;EAC9B,CAAC;EACD,IAAI,WAAW,IAAI,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,YAAY,KAAA,CAAS;EACpE,IAAI,MAAM,WAAW,MAAM,MAAM,UAAU,MAAM,CAAC,CAAC,YAAY,KAAA,CAAS;EACxE,IAAI;GACF,KAAK,MAAM,WAAW,CAAC,MAAM,YAAY,MAAM,aAAa,GAC1D,IAAI,SACF,MAAM,WACJ,UACC,UACC,aAAa;IACX,QAAQ;IACR,aAAa,eAAe;IAC5B;GACF,CAAC,GACH,cACF;GAGJ,KAAK,gBAAgB,sBAAsB,OAAO,WAAW,CAAC;EAChE,SAAS,OAAO;GACd,QAAQ,MAAM,sCAAsC,KAAK;GACzD,aAAa;IACX,QAAQ;IACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GAC9D,CAAC;GACD,KAAK,gBAAgB,oBAAoB,OAAO,WAAW,CAAC;EAC9D;CACF;CACA,OAAO,OAAO,QAAQ;EACpB,IAAI,QAAQ;EACZ,IAAI;GACF,MAAM,YAAY;GAClB,QAAQ;GACR,QAAQ,KAAK,0BAA0B,OAAO;GAC9C,SAAS,IAAI,oBAAoB;IAC/B,QAAQ,UAAU;IAClB,gBAAgB,QACd;;KAA0B;;IAC5B,eAAe,UAAU;IACzB,eAAe,WACb;;KACqB,IAAI,gBACrB,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC,CAChD;;GAEN,CAAC;GACD,MAAM,SAAS,MAAM,OAAO,aAAa,UAAU,YAAY;GAC/D,MAAM,gBAAgB,MAAM,0BAA0B;IACpD,YAAY,UAAU;IACtB,kBAAkB,UAAU;GAC9B,CAAC;GACD,MAAM,SAAS,mBAAmB,OAChC,qBACA,eACA,MACF;GACA,QAAQ;GACR,QAAQ,KAAK,0BAA0B,OAAO;GAI9C,MAAM,UAAU,MAAM,kBAAkB,UAAU,SAAS;GAC3D,MAAM,kBAAkB,MAAM,eAC5B,UAAU,mBACZ;GACA,MAAM,KAAK,QAAQ;GACnB,MAAM,YAAY;GAClB,MAAM,aAAa,WAAW,UAAU;GACxC,MAAM,gBAAgB,WAAW,UAAU;GAG3C,MAAM,cAAc,CAAC,QAAQ,UAAU,eAAe,CAAC,CAAC,MACrD,MAA6B,MAAM,QAAQ,MAAA,EAC9C;GACA,IAAI,gBAAgB,KAAA,GAClB,aAAa;IAAE,QAAQ;IAAU;GAAY,CAAC;GAEhD,QAAQ;GACR,QAAQ,KAAK,0BAA0B,OAAO;GAC9C,MAAM,SAAS,MAAM,kBAAkB,UAAU,aAAa;GAC9D,QAAQ;GACR,MAAM,QAAQ,MAAM,yBAClB,QACA,WACA,mBAAmB,KAAA,CACrB;GACA,SAAS,MAAM;GACf,MAAM,aAAyB,YAC7B,kBACI,OAAO,eAAe,gBAAgB,SAAS,EAAE,WAAW,GAAG,CAAC,IAChE,KAAA;GACN,QAAQ;GACR,QAAQ,KAAK,0BAA0B,OAAO;GAC9C,MAAM,iBAAiB,IAAI,eAAe,CAAC,CACxC,yBAAyB,MAAM,CAAC,CAChC,kBAAkB,cAAc,OAAO,CAAC,CACxC,mBAAmB,EAAE,cAAc,UAAU,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAClE,eAAe,UAAU,CAAC,CAC1B,WAAW,IAAI,OAAiB,EAAE,SAAS,IAAI,cAAc,EAAE,EAAE,CAAC,CAAC;GACtE,IAAI,UAAU,4BACZ,eAAe,+BACb,UAAU,0BACZ;GAEF,MAAM,UAAU,IAAI,qBAAqB,CAAC,CACvC,WAAW,MAAM,YAAY,CAAC,CAC9B,mBAAmB,cAAc;GACpC,QAAQ,wBAAwB,MAAM;GACtC,IAAI,UAAU,uBACZ,QAAQ,0BAA0B,UAAU,qBAAqB;GAEnE,MAAM,SAAS,MAAM,QAAQ,YAAY;GACzC,WAAW,OAAO,eAAe;GACjC,cAAc,OAAO,eAAe,YAAY;GAChD,MAAM,KAAK,OAAO;GAClB,IAAI,IAAI;IACN,iBACE,GAAG,iBAAiB,gBAAgB,GAAG,QAAQ,KAAA;IACjD,sBAAsB,GAAG;IACzB,mBAAmB,GAAG;IACtB,qBAAqB,IAAI,yBACvB,GAAG,eACH,GAAG,gBACH,GAAG,YACH,GAAG,cACH,GAAG,qBACL;GACF;GACA,KAAK,MAAM,KAAK,QACd,eAAe,IAAI,SAAS,CAAC,CAAC;GAEhC,KAAK,MAAM,QAAQ,uBACjB,OAAO,SAAS,UAAU,OAAO,eAAe,UAC9C,KAAK,kBAAkB,eAAe,KAAK,CAC7C;GAEF,aAAa,oBAAoB,YAAY,WAC3C,KAAK,kBAAkB,2BAA2B;IAChD;IACA;GACF,CAAC,CACH;GACA,QAAQ,KAAK,iCAAiC;GAC9C,OAAO,OAAO;EAChB,SAAS,OAAO;GACd,QAAQ,MAAM,0CAA0C,MAAM,KAAK,KAAK;GAExE,MAAM,cAAc;GACpB,MAAM,yBAAyB,KAAK;EACtC;CACF;CACA,kBAAkB,OAAO,UAAU;EACjC,IAAI,CAAC,QACH;EAEF,MAAM,OAAO,aAAa,KAAK;EAC/B,mBAAmB;CACrB;CACA,aAAa,SAAS;EACpB,kBAAkB;EAClB,IAAI,QACF,OAAO,OAAO,QAAQ,KAAA;CAE1B;CACA,UAAU,OAAO,QAAQ,SAAS;EAChC,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,2BAA2B;EAE7C,QAAQ,QAAR;GACE,KAAK,QACH,OAAO,YAAY,KAAK,CAAC,CAAC,IAAI,YAAY;GAC5C,KAAK,OAAO;IACV,MAAM,CAAC,MAAM,iBAAiB,eAAe,QAAQ,WACnD;IAcF,OAAO,aAAa,MAPC,YAAY,IAC/B,MACA,kBAAkB,QAAQ,eAAe,GACzC,eACA,QACA,OACF,CAC0B;GAC5B;GACA,KAAK;IACH,MAAM,YAAY,WAAW,KAAK,IAAc,KAAK,EAAY;IACjE;GACF,KAAK;IACH,MAAM,YAAY,gBAChB,KAAK,IACL,KAAK,EACP;IACA;GACF,KAAK,sBACH,OAAO,YAAY,UAAU,CAAC,CAAC,MAAM;GACvC,KAAK,aACH,OAAO,YAAY,UACjB,KAAK,EACP;GACF,KAAK;IACH,MAAM,YAAY,OAAO,KAAK,EAAY;IAC1C;GACF,KAAK;IACH,YAAY,YAAY,KAAK,EAAY;IACzC;GACF,SACE,MAAM,IAAI,MAAM,oBAAoB,QAAQ;EAChD;CACF;CACA,QAAQ,OAAO,QAAQ,SAAS;EAC9B,IAAI,CAAC,WAAW,IACd,MAAM,IAAI,MAAM,gCAAgC;EAElD,QAAQ,QAAR;GACE,KAAK,SAAS;IACZ,MAAM,CAAC,KAAK,UAAU;IAEtB,QAAO,MADc,WAAW,GAAG,MAAM,KAAK,MAAM,EAAA,CACtC;GAChB;GACA,SACE,MAAM,IAAI,MAAM,kBAAkB,QAAQ;EAC9C;CACF;CACA,aAAa,OAAO,KAAK,QAAQ,cAAc;EAC7C,IAAI,CAAC,WAAW,IACd,MAAM,IAAI,MAAM,gCAAgC;EAElD,MAAM,OAAO,MAAM,WAAW,GAAG,KAAK,MAAM,KAAK,SAAS,YACxD,UAAU,OAAO,CACnB;EACA,aAAa;GACX,KAAU,YAAY;EACxB;CACF;CACA,eAAe,OAAO,QAAQ,SAAS;EACrC,QAAQ,QAAR;GACE,KAAK,kBAAkB;IACrB,IAAI,CAAC,gBACH,OAAO;KACL,UAAU;KACV,aAAa,CAAC;KACd,eAAe,CAAC;KAChB,cAAc;KACd,gBAAgB;IAClB;IAEF,MAAM,cAAc,eAAe,eAAe;IAClD,MAAM,gBAAgB,CAAC;IACvB,KAAK,MAAM,UAAU,eAAe,mBAAmB,CAAC,CAAC,OAAO,GAC9D,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,MAAM,eAAe,OAAO,KAAK;KACvC,IAAI,KACF,cAAc,KAAK,GAAG;IAE1B;IAEF,OAAO;KACL,UAAU,eAAe;KACzB;KACA;KACA,cAAc,YAAY;KAC1B,gBAAgB,cAAc;IAChC;GACF;GACA,KAAK;IACH,gBAAgB,MAAM;IACtB;GACF,KAAK;IACH,MAAM,gBAAgB,OAAO;IAC7B;GACF,KAAK,qBACH,QAAQ,qBAAqB,OAAO,KAAK,CAAC,EAAA,CAAG,KAAK,aAAa;IAC7D,aAAa,QAAQ;IACrB,WAAW,QAAQ;IACnB,SAAS,QAAQ;IACjB,gBAAgB,QAAQ;IACxB,aAAa,QAAQ;IACrB,QAAQ,QAAQ;IAChB,WAAW,QAAQ;IACnB,oBAAoB,QAAQ;GAC9B,EAAE;GACJ,KAAK,oBAAoB;IACvB,MAAM,CAAC,eAAe;IACtB,MAAM,qBAAqB,IAAI,WAAW,CAAC,EAAE,MAAM;IACnD;GACF;GACA,KAAK;IACH,IAAI,CAAC,kBACH,MAAM,IAAI,MAAM,wBAAwB;IAE1C,OAAO,iBAAiB,OAAO;GACjC,KAAK;IACH,IAAI,CAAC,kBACH,MAAM,IAAI,MAAM,wBAAwB;IAE1C,OAAO,iBAAiB,SAAS;GACnC,KAAK,sBAAsB;IACzB,IAAI,CAAC,oBACH,MAAM,IAAI,MAAM,iCAAiC;IAEnD,MAAM,CAAC,YAAY,UAAU;IAC7B,OAAO,mBAAmB,iBAAiB,YAAY,MAAM;GAC/D;GACA,KAAK,8BAA8B;IACjC,IAAI,CAAC,oBACH,MAAM,IAAI,MAAM,iCAAiC;IAEnD,MAAM,CAAC,YAAY,UAAU;IAC7B,OAAO,mBAAmB,iBAAiB,YAAY,MAAM;GAC/D;GACA,KAAK,8BAA8B;IACjC,IAAI,CAAC,oBACH,MAAM,IAAI,MAAM,iCAAiC;IAEnD,MAAM,CAAC,YAAY,UAAU;IAC7B,OAAO,mBAAmB,iBAAiB,YAAY,MAAM;GAC/D;GACA,KAAK,YAAY;IACf,IAAI,CAAC,MAAM,WACT,MAAM,IAAI,MAAM,6BAA6B;IAE/C,MAAM,CAAC,KAAK,UAAU;IAEtB,QAAO,MADc,MAAM,UAAU,MAAM,KAAK,MAAM,EAAA,CACxC;GAChB;GACA,SACE,MAAM,IAAI,MAAM,yBAAyB,QAAQ;EACrD;CACF;AACF,CAAC;AAQD,MAAM,cAAc;AAQpB,YAAY,iBAAiB,UAAU,UAAU;CAC/C,QAAQ,MACN,mCACA,MAAM,WAAW,MAAM,SAAS,KAClC;AACF,CAAC;AACD,YAAY,iBAAiB,uBAAuB,UAAU;CAC5D,QAAQ,MAAM,wCAAwC,MAAM,MAAM;AACpE,CAAC;AAED,YAAY,aAAa,UAAU;CACjC,MAAM,OAAO,MAAM,MAAM;CACzB,IAAI,MACF,IAAI;EACF,KAAK,YAAY,IAAI;CACvB,SAAS,OAAO;EACd,QAAQ,MAAM,2CAA2C,KAAK;CAChE;AAEJ","debug_id":"951f920d-891c-50dc-a918-f37ec9402372"}
|
|
@@ -1,7 +1,7 @@
|
|
|
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]="
|
|
3
|
-
import { r as connectConfig } from "./connect.config-
|
|
4
|
-
import { t as refreshPwaManifestLink } from "./pwa-manifest-link-
|
|
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]="e66be136-4138-5452-99c8-b48f7cf62feb")}catch(e){}}();
|
|
3
|
+
import { r as connectConfig } from "./connect.config-CaXMoB42.js";
|
|
4
|
+
import { t as refreshPwaManifestLink } from "./pwa-manifest-link-DQRJpF0r.js";
|
|
5
5
|
//#region src/utils/registerServiceWorker.ts
|
|
6
6
|
const serviceWorkerScriptPath = [connectConfig.routerBasename, "service-worker.js"].join("/").replace(/\/{2,}/gm, "/");
|
|
7
7
|
let updateAvailable = false;
|
|
@@ -125,5 +125,5 @@ const serviceWorkerManager = new ServiceWorkerManager();
|
|
|
125
125
|
//#endregion
|
|
126
126
|
export { serviceWorkerManager as n, subscribeServiceWorkerUpdate as r, getServiceWorkerUpdateAvailable as t };
|
|
127
127
|
|
|
128
|
-
//# sourceMappingURL=registerServiceWorker-
|
|
129
|
-
//# debugId=
|
|
128
|
+
//# sourceMappingURL=registerServiceWorker-smkROQhm.js.map
|
|
129
|
+
//# debugId=e66be136-4138-5452-99c8-b48f7cf62feb
|