@powerhousedao/connect 6.2.3-dev.24 → 6.2.3-dev.26
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-z8TsS9Ke.js → AddDriveModal-DhNfP94R.js} +4 -4
- package/dist/{AddDriveModal-z8TsS9Ke.js.map → AddDriveModal-DhNfP94R.js.map} +1 -1
- package/dist/{ClearStorageModal-CtuJM3lA.js → ClearStorageModal-_GRaYbAp.js} +4 -4
- package/dist/{ClearStorageModal-CtuJM3lA.js.map → ClearStorageModal-_GRaYbAp.js.map} +1 -1
- package/dist/{ConfirmDocumentUpgradeModal-DqbpFyOV.js → ConfirmDocumentUpgradeModal-DcOZy20m.js} +6 -5
- package/dist/{ConfirmDocumentUpgradeModal-DqbpFyOV.js.map → ConfirmDocumentUpgradeModal-DcOZy20m.js.map} +1 -1
- package/dist/{CookiesPolicyModal-D3mk3rk1.js → CookiesPolicyModal-BLw4pnhn.js} +3 -3
- package/dist/{CookiesPolicyModal-D3mk3rk1.js.map → CookiesPolicyModal-BLw4pnhn.js.map} +1 -1
- package/dist/{CreateDocumentModal-DsyHqRHf.js → CreateDocumentModal-Bmv0V-kY.js} +5 -4
- package/dist/{CreateDocumentModal-DsyHqRHf.js.map → CreateDocumentModal-Bmv0V-kY.js.map} +1 -1
- package/dist/{DebugSettingsModal-WuNVN6S3.js → DebugSettingsModal-DCRVefgf.js} +6 -6
- package/dist/{DebugSettingsModal-WuNVN6S3.js.map → DebugSettingsModal-DCRVefgf.js.map} +1 -1
- package/dist/{DeleteDriveModal-BkQ__i9M.js → DeleteDriveModal-CjGnG0ht.js} +4 -4
- package/dist/{DeleteDriveModal-BkQ__i9M.js.map → DeleteDriveModal-CjGnG0ht.js.map} +1 -1
- package/dist/{DeleteItemModal-BR_sB_e4.js → DeleteItemModal-BbY_4_xT.js} +4 -4
- package/dist/{DeleteItemModal-BR_sB_e4.js.map → DeleteItemModal-BbY_4_xT.js.map} +1 -1
- package/dist/{DisclaimerModal-l-CvpwSz.js → DisclaimerModal-DuglmEwL.js} +3 -3
- package/dist/{DisclaimerModal-l-CvpwSz.js.map → DisclaimerModal-DuglmEwL.js.map} +1 -1
- package/dist/{DocumentVersionUnsupportedModal-B59V3Gl1.js → DocumentVersionUnsupportedModal-C4fy7fZ6.js} +3 -3
- package/dist/{DocumentVersionUnsupportedModal-B59V3Gl1.js.map → DocumentVersionUnsupportedModal-C4fy7fZ6.js.map} +1 -1
- package/dist/{DownloadDocumentWithErrorsModal-DrF87oh-.js → DownloadDocumentWithErrorsModal-BsPQ5qgy.js} +5 -4
- package/dist/{DownloadDocumentWithErrorsModal-DrF87oh-.js.map → DownloadDocumentWithErrorsModal-BsPQ5qgy.js.map} +1 -1
- package/dist/{DriveAuthRequiredModal-DcDgrltc.js → DriveAuthRequiredModal-CtsB0kwH.js} +4 -4
- package/dist/{DriveAuthRequiredModal-DcDgrltc.js.map → DriveAuthRequiredModal-CtsB0kwH.js.map} +1 -1
- package/dist/{DriveSettingsModal-KZWK9EP3.js → DriveSettingsModal-d1L0eYof.js} +3 -3
- package/dist/{DriveSettingsModal-KZWK9EP3.js.map → DriveSettingsModal-d1L0eYof.js.map} +1 -1
- package/dist/{InspectorModal-BPNKmCyl.js → InspectorModal-CDL37XLR.js} +11 -9
- package/dist/{InspectorModal-BPNKmCyl.js.map → InspectorModal-CDL37XLR.js.map} +1 -1
- package/dist/{LoginModal-8Y3365cS.js → LoginModal-CI0ogC2-.js} +4 -4
- package/dist/{LoginModal-8Y3365cS.js.map → LoginModal-CI0ogC2-.js.map} +1 -1
- package/dist/{MissingPackageModal-CAEbJYp3.js → MissingPackageModal-HFUPQMML.js} +4 -4
- package/dist/{MissingPackageModal-CAEbJYp3.js.map → MissingPackageModal-HFUPQMML.js.map} +1 -1
- package/dist/{OpenFileDocumentsModal-DS41M_nY.js → OpenFileDocumentsModal-Cl0ukgmZ.js} +6 -5
- package/dist/{OpenFileDocumentsModal-DS41M_nY.js.map → OpenFileDocumentsModal-Cl0ukgmZ.js.map} +1 -1
- package/dist/{SettingsModal-CLjbxshb.js → SettingsModal-B5GFvIqu.js} +14 -13
- package/dist/{SettingsModal-CLjbxshb.js.map → SettingsModal-B5GFvIqu.js.map} +1 -1
- package/dist/{UpgradeDriveModal-DPtfpSbC.js → UpgradeDriveModal-CXX6D5Au.js} +3 -3
- package/dist/{UpgradeDriveModal-DPtfpSbC.js.map → UpgradeDriveModal-CXX6D5Au.js.map} +1 -1
- package/dist/{app-loader--k1XniB2.js → app-loader-BRm3NjUX.js} +57 -51
- package/dist/{app-loader--k1XniB2.js.map → app-loader-BRm3NjUX.js.map} +1 -1
- package/dist/app-loader-DyM1CY4K.js +4 -0
- package/dist/{app-skeleton-BZGG7nm6.js → app-skeleton--Me5zlSz.js} +6 -5
- package/dist/{app-skeleton-BZGG7nm6.js.map → app-skeleton--Me5zlSz.js.map} +1 -1
- package/dist/{app-skeleton-DO3ox92L.js → app-skeleton-CBN4tenZ.js} +3 -3
- package/dist/{boot-CloWnD0n.js → boot-DPNEOI2A.js} +6 -6
- package/dist/{boot-CloWnD0n.js.map → boot-DPNEOI2A.js.map} +1 -1
- package/dist/{buffer-Bu1eWySI.js → buffer-DNTcuap_.js} +3 -3
- package/dist/{buffer-Bu1eWySI.js.map → buffer-DNTcuap_.js.map} +1 -1
- package/dist/{build-info-BCDZwe0Q.js → build-info-CRzCyE8K.js} +5 -5
- package/dist/{build-info-BCDZwe0Q.js.map → build-info-CRzCyE8K.js.map} +1 -1
- package/dist/{components-BTsIcRV_.js → components-BPwZnhhU.js} +4 -4
- package/dist/{connect.config-D1mCRtVA.js → connect.config-Dgs13R1s.js} +6 -6
- package/dist/{connect.config-D1mCRtVA.js.map → connect.config-Dgs13R1s.js.map} +1 -1
- package/dist/{connection-state-oYbhN61I.js → connection-state-Cy8xRCm_.js} +6 -6
- package/dist/{connection-state-oYbhN61I.js.map → connection-state-Cy8xRCm_.js.map} +1 -1
- package/dist/{cookie-banner-DKzkT2wu.js → cookie-banner-CSF930bl.js} +5 -5
- package/dist/{cookie-banner-DKzkT2wu.js.map → cookie-banner-CSF930bl.js.map} +1 -1
- package/dist/{i18n-BlC8tGho.js → i18n-CTgT1HG-.js} +3 -3
- package/dist/{i18n-BlC8tGho.js.map → i18n-CTgT1HG-.js.map} +1 -1
- package/dist/{load-B_jzTipS.js → load-DVPS_VqN.js} +13 -11
- package/dist/{load-B_jzTipS.js.map → load-DVPS_VqN.js.map} +1 -1
- package/dist/main.d.ts +2 -1
- package/dist/main.js +4 -4
- package/dist/main.js.map +1 -1
- package/dist/{package-manager-DBRABkZ_.js → package-manager-BbzIV9aN.js} +15 -5
- package/dist/package-manager-BbzIV9aN.js.map +1 -0
- package/dist/{pglite-major-u7qHLpXj.js → pglite-major-BbmMK26m.js} +3 -3
- package/dist/{pglite-major-u7qHLpXj.js.map → pglite-major-BbmMK26m.js.map} +1 -1
- package/dist/{pglite-migrate-core-BOyb7luT.js → pglite-migrate-core-o88cWesm.js} +8 -6
- package/dist/{pglite-migrate-core-BOyb7luT.js.map → pglite-migrate-core-o88cWesm.js.map} +1 -1
- package/dist/{pglite-seed-Cj5X6aSi.js → pglite-seed-D6fqQApT.js} +4 -4
- package/dist/{pglite-seed-Cj5X6aSi.js.map → pglite-seed-D6fqQApT.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-CtKCuHwO.js → preferences-store-Bekp7tv-.js} +5 -5
- package/dist/{preferences-store-CtKCuHwO.js.map → preferences-store-Bekp7tv-.js.map} +1 -1
- package/dist/{pwa-manifest-link-BI410b04.js → pwa-manifest-link-DQRJpF0r.js} +3 -3
- package/dist/{pwa-manifest-link-BI410b04.js.map → pwa-manifest-link-DQRJpF0r.js.map} +1 -1
- package/dist/{reactor-Cxjyf6yo.js → reactor-9ZEESTUg.js} +24 -16
- package/dist/{reactor-Cxjyf6yo.js.map → reactor-9ZEESTUg.js.map} +1 -1
- package/dist/reactor.worker.d.ts +2 -1
- package/dist/reactor.worker.js +7 -6
- package/dist/reactor.worker.js.map +1 -1
- package/dist/{registerServiceWorker-DhB4qPLx.js → registerServiceWorker-Cy1G2rCq.js} +5 -5
- package/dist/{registerServiceWorker-DhB4qPLx.js.map → registerServiceWorker-Cy1G2rCq.js.map} +1 -1
- package/dist/{renown-trust-DVgdB10t.js → renown-trust-DRgHpxlZ.js} +3 -3
- package/dist/{renown-trust-DVgdB10t.js.map → renown-trust-DRgHpxlZ.js.map} +1 -1
- 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-BWJJNfUQ.js → sentry-jfDyrxdX.js} +3 -3
- package/dist/{sentry-BWJJNfUQ.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 +4 -4
- package/dist/start-connect.js.map +1 -1
- package/dist/style.css +933 -273
- package/dist/{toast-DtfTKZND.js → toast-C6WW-_O-.js} +3 -3
- package/dist/{toast-DtfTKZND.js.map → toast-C6WW-_O-.js.map} +1 -1
- package/dist/{use-renown-login-BQEJ2Zo3.js → use-renown-login-BzOSQETV.js} +3 -3
- package/dist/{use-renown-login-BQEJ2Zo3.js.map → use-renown-login-BzOSQETV.js.map} +1 -1
- package/dist/{useIsEmbedded-D1iaTmBn.js → useIsEmbedded-BWJ0qb7w.js} +3 -3
- package/dist/{useIsEmbedded-D1iaTmBn.js.map → useIsEmbedded-BWJ0qb7w.js.map} +1 -1
- package/dist/{useRegistryPackages-akngEtRy.js → useRegistryPackages-DuoU75ap.js} +18 -12
- package/dist/{useRegistryPackages-akngEtRy.js.map → useRegistryPackages-DuoU75ap.js.map} +1 -1
- package/package.json +18 -19
- package/style.css +3 -5
- package/dist/app-loader-Cs1PxImi.js +0 -4
- package/dist/package-manager-DBRABkZ_.js.map +0 -1
package/dist/reactor.worker.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
-
import { t as createConnectSignerConfig } from "./renown-trust-
|
|
4
|
-
import { a as resolvePgMajorForRuntime, r as loadPGliteModule, t as coerceMajor, u as readPgVersionFile } from "./pglite-major-
|
|
5
|
-
import { a as writeFileData, i as readFileData, r as migrateIdb, t as clearFileData } from "./pglite-migrate-core-
|
|
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]="6ecb154f-352b-5cf3-bbbb-af9ed5168442")}catch(e){}}();
|
|
3
|
+
import { t as createConnectSignerConfig } from "./renown-trust-DRgHpxlZ.js";
|
|
4
|
+
import { a as resolvePgMajorForRuntime, r as loadPGliteModule, t as coerceMajor, u as readPgVersionFile } from "./pglite-major-BbmMK26m.js";
|
|
5
|
+
import { a as writeFileData, i as readFileData, r as migrateIdb, t as clearFileData } from "./pglite-migrate-core-o88cWesm.js";
|
|
6
6
|
import { createRelationalDb } from "@powerhousedao/shared/processors";
|
|
7
7
|
import { ChannelScheme, DocumentIntegrityService, DriveCollectionId, InMemoryQueue, ReactorBuilder, ReactorClientBuilder } from "@powerhousedao/reactor";
|
|
8
8
|
import { baseDocumentModels } from "@powerhousedao/reactor-browser/base-document-models";
|
|
@@ -120,8 +120,9 @@ const inMemoryBackup = {
|
|
|
120
120
|
discard: () => Promise.resolve(),
|
|
121
121
|
commit: () => Promise.resolve()
|
|
122
122
|
};
|
|
123
|
+
const workerName = self.name ?? "";
|
|
123
124
|
const host = new ReactorHost({
|
|
124
|
-
namespace:
|
|
125
|
+
namespace: workerName,
|
|
125
126
|
onAdminRestart: () => host.broadcastReload("admin restart", crypto.randomUUID()),
|
|
126
127
|
onAdminClearStorage: async () => {
|
|
127
128
|
await relational.pg?.close();
|
|
@@ -356,4 +357,4 @@ globalScope.onconnect = (event) => {
|
|
|
356
357
|
//#endregion
|
|
357
358
|
|
|
358
359
|
//# sourceMappingURL=reactor.worker.js.map
|
|
359
|
-
//# debugId=
|
|
360
|
+
//# debugId=6ecb154f-352b-5cf3-bbbb-af9ed5168442
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactor.worker.js","sources":["../src/reactor-worker-models.ts","../src/reactor-worker-signer.ts","../src/reactor.worker.ts"],"sourcesContent":["import type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\n\n// A `document-models` barrel also re-exports types, schemas and helpers; keep\n// only the entries that are document-model modules.\nexport function toDocumentModelModules(\n candidates: unknown[],\n): DocumentModelModule[] {\n return candidates.filter(\n (m): m is DocumentModelModule =>\n typeof m === \"object\" &&\n m !== null &&\n \"documentModel\" in m &&\n \"reducer\" in m,\n );\n}\n\n/** Which of the bundled-but-optional packages this worker registers. */\nexport type BundledModelFlags = {\n /** Builder mode: vetra's spec document models. */\n studioMode?: boolean;\n /** Powerhouse workflows: the workflow + connection document models. */\n workflowsEnabled?: boolean;\n};\n\nexport type BundledModelLoaders = {\n vetra: () => Promise<Record<string, unknown>>;\n workflow: () => Promise<Record<string, unknown>>;\n};\n\n// Neither package is CDN-loadable, so neither can ride the `packageSpecs`\n// path; each is a chunk fetched only when its own flag is on.\nexport const defaultBundledModelLoaders: BundledModelLoaders = {\n vetra: () => import(\"@powerhousedao/vetra/document-models\"),\n workflow: () => import(\"@powerhousedao/workflow/document-models\"),\n};\n\n// The flags are independent: studio mode does not imply workflows, nor the\n// other way round.\nexport async function loadFlaggedDocumentModels(\n flags: BundledModelFlags,\n loaders: BundledModelLoaders = defaultBundledModelLoaders,\n): Promise<DocumentModelModule[]> {\n const models: DocumentModelModule[] = [];\n if (flags.studioMode) {\n models.push(\n ...toDocumentModelModules(Object.values(await loaders.vetra())),\n );\n }\n if (flags.workflowsEnabled) {\n models.push(\n ...toDocumentModelModules(Object.values(await loaders.workflow())),\n );\n }\n return models;\n}\n","import type { ReactorFeatureFlags, SignerConfig } from \"@powerhousedao/reactor\";\nimport type { ReactorIdentity } from \"@powerhousedao/reactor-browser/rpc\";\nimport { RenownCryptoSigner, type IRenownCrypto } from \"@renown/sdk/crypto\";\nimport {\n createConnectSignerConfig,\n type RenownTrustEndpoints,\n} from \"./utils/renown-trust.js\";\n\n// Matches the main thread's RenownBuilder(\"connect\").\nexport const RENOWN_APP_NAME = \"connect\";\n\n/** The construct fields the worker's signer and trust policy read. */\nexport type WorkerSignerConstruct = {\n featureFlags?: Partial<ReactorFeatureFlags>;\n // Absent (a tab on an older build) fails the boot under authEnforcement.\n renownEndpoints?: RenownTrustEndpoints;\n};\n\n/** The worker's signer; its `user` is updated in place on identity changes. */\nexport async function createWorkerSignerConfig(\n crypto: IRenownCrypto,\n construct: WorkerSignerConstruct,\n identity: ReactorIdentity | undefined,\n): Promise<{ signer: RenownCryptoSigner; signerConfig: SignerConfig }> {\n const signer = new RenownCryptoSigner(crypto, RENOWN_APP_NAME, identity);\n const signerConfig = await createConnectSignerConfig(\n signer,\n construct.featureFlags,\n construct.renownEndpoints ?? {},\n );\n return { signer, signerConfig };\n}\n","import {\n ChannelScheme,\n DocumentIntegrityService,\n DriveCollectionId,\n InMemoryQueue,\n ReactorBuilder,\n ReactorClientBuilder,\n type ChannelConfig,\n type Database,\n type ISyncManager,\n type JwtHandler,\n type ReactorFeatureFlags,\n type Remote,\n type RemoteFilter,\n type RemoteOptions,\n} from \"@powerhousedao/reactor\";\nimport { baseDocumentModels } from \"@powerhousedao/reactor-browser/base-document-models\";\nimport {\n FORWARDED_EVENT_TYPES,\n ReactorHost,\n SYNC_STATUS_CHANGED_EVENT,\n WorkerPackageLoader,\n type ReactorIdentity,\n type WorkerMigrationState,\n} from \"@powerhousedao/reactor-browser/rpc\";\nimport type {\n DocumentModelModule,\n SignaturePolicy,\n} from \"@powerhousedao/shared/document-model\";\nimport {\n createRelationalDb,\n type IProcessorManager,\n type IRelationalDb,\n} from \"@powerhousedao/shared/processors\";\nimport * as commonDocumentModels from \"@powerhousedao/powerhouse-vetra-packages/document-models\";\nimport {\n loadFlaggedDocumentModels,\n toDocumentModelModules,\n} from \"./reactor-worker-models.js\";\nimport {\n BrowserKeyStorage,\n RenownCryptoBuilder,\n type RenownCryptoSigner,\n} from \"@renown/sdk/crypto\";\nimport { createWorkerSignerConfig } from \"./reactor-worker-signer.js\";\nimport type { RenownTrustEndpoints } from \"./utils/renown-trust.js\";\nimport type * as PgLiveModuleNs from \"@electric-sql/pglite/live\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport { readPgVersionFile } from \"./utils/pglite-idb.js\";\nimport {\n coerceMajor,\n CURRENT_PG_MAJOR,\n type DetectedMajor,\n loadPGliteModule,\n resolvePgMajorForRuntime,\n type SupportedPgMajor,\n} from \"./utils/pglite-major.js\";\nimport {\n type BackupStrategy,\n type FileDataEntry,\n clearFileData,\n migrateIdb,\n readFileData,\n writeFileData,\n} from \"./utils/pglite-migrate-core.js\";\n\nconsole.info(\"[reactor.worker] module evaluating\");\n\n// Common models the tab bundles as a local package; not CDN-loadable, so the\n// worker imports them directly. Vetra and workflow are flag-gated chunks.\nconst commonBundledModels = toDocumentModelModules(\n Object.values(commonDocumentModels),\n);\n\ntype WorkerConstruct = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\n // Absolute-URL shared-deps import map from the main thread; lets package\n // sources that import shared deps load as blobs in the worker (import\n // maps don't apply here).\n sharedImports?: Record<string, string>;\n studioMode?: boolean;\n // Loads the workflow package's document models. Independent of studioMode.\n workflowsEnabled?: boolean;\n // The worker has no runtime config, so the chain its bearer tokens are scoped\n // to is passed in; leaving it unset would sign for a chain nobody issues on.\n renownChainId?: number;\n // Same reason: enforcement flags arrive from the tab. Absent means all off,\n // which is what a tab on an older build sends.\n featureFlags?: Partial<ReactorFeatureFlags>;\n // What new documents are created as; absent means the reactor's default.\n createSignaturePolicy?: SignaturePolicy;\n // Where the trust policy verifies signers under authEnforcement.\n renownEndpoints?: RenownTrustEndpoints;\n};\n\ntype ModelRegistry = {\n registerModules: (...modules: DocumentModelModule[]) => void;\n};\n\nlet loader: WorkerPackageLoader | undefined;\nlet registry: ModelRegistry | undefined;\nlet signer: RenownCryptoSigner | undefined;\nlet syncManager: ISyncManager | undefined;\ntype RelationalState = {\n pg?: PgLiveModuleNs.PGliteWithLive;\n db?: IRelationalDb;\n};\nconst relational: RelationalState = {};\ntype OwnedStorage = {\n reactorPg?: {\n close: () => Promise<void>;\n query: (sql: string, params?: unknown[]) => Promise<{ rows: unknown[] }>;\n };\n reactorIdb?: string;\n relationalIdb?: string;\n};\nconst owned: OwnedStorage = {};\nlet inspectorQueue: InMemoryQueue | undefined;\nlet inspectorProcessors: IProcessorManager | undefined;\nlet inspectorIntegrity: DocumentIntegrityService | undefined;\nlet currentIdentity: ReactorIdentity | null = null;\nconst registeredKeys = new Set<string>();\n\nfunction modelKey(module: DocumentModelModule): string {\n return `${module.documentModel.global.id}@${module.version ?? 1}`;\n}\n\n// Cloneable projection of a Remote: meta (carries channelConfig) + connection snapshot.\nfunction toWireRemote(remote: Remote) {\n return {\n meta: remote.meta,\n connectionState: remote.channel.getConnectionState(),\n };\n}\n\n// Register only the delta; the registry rejects duplicate (type, version) pairs.\nfunction registerNewModules(): void {\n if (!loader || !registry) {\n return;\n }\n const fresh = loader.models.filter((m) => !registeredKeys.has(modelKey(m)));\n if (fresh.length === 0) {\n return;\n }\n registry.registerModules(...fresh);\n for (const m of fresh) {\n registeredKeys.add(modelKey(m));\n }\n}\n\n// Rebuild renown crypto from the shared renownKeyDB keypair (origin-scoped IndexedDB).\nasync function buildWorkerCrypto(chainId: number | undefined) {\n const keyStorage = await BrowserKeyStorage.create();\n const builder = new RenownCryptoBuilder().withKeyPairStorage(keyStorage);\n if (chainId !== undefined) {\n builder.withChainId(chainId);\n }\n return builder.build();\n}\n\n// Open against the major already on disk so a legacy PG16 dir isn't read by PG17.\nasync function openReactorPglite(namespace: string) {\n const detected = coerceMajor(await readPgVersionFile(`/pglite/${namespace}`));\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Running against legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const { PGlite } = await loadPGliteModule(major);\n const pg = new PGlite(`idb://${namespace}`, { relaxedDurability: true });\n await pg.waitReady;\n return { pg, detected };\n}\n\ntype PgLiveModule = typeof PgLiveModuleNs;\n\nasync function loadPgLive(major: SupportedPgMajor): Promise<PgLiveModule> {\n if (major === 16) {\n return import(\"pglite-legacy-02/live\") as unknown as Promise<PgLiveModule>;\n }\n return import(\"@electric-sql/pglite/live\");\n}\n\nasync function openRelational(namespace: string): Promise<DetectedMajor> {\n try {\n const detected = coerceMajor(\n await readPgVersionFile(`/pglite/${namespace}`),\n );\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Relational store opening legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const [{ PGlite }, { live }] = await Promise.all([\n loadPGliteModule(major),\n loadPgLive(major),\n ]);\n const pg = new PGlite(`idb://${namespace}`, {\n relaxedDurability: true,\n extensions: { live },\n });\n await pg.waitReady;\n relational.pg = pg as unknown as PgLiveModuleNs.PGliteWithLive;\n relational.db = createRelationalDb(\n new Kysely({ dialect: new PGliteDialect(pg) }),\n );\n console.info(\n `[reactor.worker] Relational store opened: idb://${namespace} (Postgres ${major}).`,\n );\n return detected;\n } catch (error) {\n console.error(\n \"[reactor.worker] Failed to open the relational store:\",\n error,\n );\n return null;\n }\n}\n\nlet migrationState: WorkerMigrationState = { status: \"idle\" };\n\nfunction setMigration(state: WorkerMigrationState): void {\n migrationState = state;\n host.setMigrationState(state);\n}\n\nconst inMemoryBackup: BackupStrategy = {\n snapshot: (idbName) => readFileData(idbName),\n rollback: (handle, idbName) =>\n writeFileData(idbName, handle as FileDataEntry[]),\n discard: () => Promise.resolve(),\n commit: () => Promise.resolve(),\n};\n\nconst workerName = (self as { name?: string }).name ?? \"\";\n\nconst host = new ReactorHost({\n namespace: workerName,\n onAdminRestart: () =>\n host.broadcastReload(\"admin restart\", crypto.randomUUID()),\n onAdminClearStorage: async () => {\n await relational.pg?.close();\n await owned.reactorPg?.close();\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await clearFileData(idbName);\n }\n }\n host.broadcastReload(\"storage cleared\", crypto.randomUUID());\n },\n onAdminMigrate: async () => {\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n });\n if (relational.pg) await relational.pg.close().catch(() => undefined);\n if (owned.reactorPg) await owned.reactorPg.close().catch(() => undefined);\n try {\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await migrateIdb(\n idbName,\n (phase) =>\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n phase,\n }),\n inMemoryBackup,\n );\n }\n }\n host.broadcastReload(\"migration complete\", crypto.randomUUID());\n } catch (error) {\n console.error(\"[reactor.worker] Migration failed:\", error);\n setMigration({\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n });\n host.broadcastReload(\"migration failed\", crypto.randomUUID());\n }\n },\n build: async (raw) => {\n let phase = \"init\";\n try {\n const construct = raw as WorkerConstruct;\n phase = \"loading packages\";\n console.info(`[reactor.worker] boot: ${phase}`);\n loader = new WorkerPackageLoader({\n cdnUrl: construct.cdnUrl,\n importPackage: (url) =>\n import(/* @vite-ignore */ url) as Promise<Record<string, unknown>>,\n sharedImports: construct.sharedImports,\n importSource: (source) =>\n import(\n /* @vite-ignore */ URL.createObjectURL(\n new Blob([source], { type: \"text/javascript\" }),\n )\n ) as Promise<Record<string, unknown>>,\n });\n const loaded = await loader.loadPackages(construct.packageSpecs);\n const flaggedModels = await loadFlaggedDocumentModels({\n studioMode: construct.studioMode,\n workflowsEnabled: construct.workflowsEnabled,\n });\n const models = baseDocumentModels.concat(\n commonBundledModels,\n flaggedModels,\n loaded,\n );\n phase = \"opening pglite stores\";\n console.info(`[reactor.worker] boot: ${phase}`);\n\n //this has to be serial: concurrent PGlite constructors consume the same\n // cached one-shot wasm \"Response\" object\n const reactor = await openReactorPglite(construct.namespace);\n const relationalMajor = await openRelational(\n construct.relationalNamespace,\n );\n const pg = reactor.pg;\n owned.reactorPg = pg;\n owned.reactorIdb = `/pglite/${construct.namespace}`;\n owned.relationalIdb = `/pglite/${construct.relationalNamespace}`;\n // A store is migratable when coerceMajor kept it (a supported legacy\n // major) and it is not the current one; openers already read PG_VERSION.\n const legacyMajor = [reactor.detected, relationalMajor].find(\n (m): m is SupportedPgMajor => m !== null && m !== CURRENT_PG_MAJOR,\n );\n if (legacyMajor !== undefined) {\n setMigration({ status: \"needed\", legacyMajor });\n }\n phase = \"building crypto\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const crypto = await buildWorkerCrypto(construct.renownChainId);\n phase = \"building signer\";\n const built = await createWorkerSignerConfig(\n crypto,\n construct,\n currentIdentity ?? undefined,\n );\n signer = built.signer;\n const jwtHandler: JwtHandler = async () =>\n currentIdentity\n ? crypto.getBearerToken(currentIdentity.address, { expiresIn: 10 })\n : undefined;\n phase = \"building reactor module\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const builder = new ReactorClientBuilder()\n .withSigner(built.signerConfig)\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModelSources(models)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withExecutorConfig({ featureFlags: construct.featureFlags ?? {} })\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({ dialect: new PGliteDialect(pg) }),\n ),\n );\n builder.withDocumentModelLoader(loader);\n if (construct.createSignaturePolicy) {\n builder.withCreateSignaturePolicy(construct.createSignaturePolicy);\n }\n const module = await builder.buildModule();\n registry = module.reactorModule?.documentModelRegistry;\n syncManager = module.reactorModule?.syncModule?.syncManager;\n const rm = module.reactorModule;\n if (rm) {\n inspectorQueue =\n rm.queue instanceof InMemoryQueue ? rm.queue : undefined;\n inspectorProcessors = rm.processorManager;\n inspectorIntegrity = new DocumentIntegrityService(\n rm.keyframeStore,\n rm.operationStore,\n rm.writeCache,\n rm.documentView,\n rm.documentModelRegistry,\n );\n }\n for (const m of models) {\n registeredKeys.add(modelKey(m));\n }\n for (const type of FORWARDED_EVENT_TYPES) {\n module.eventBus.subscribe(type, (forwardedType, event) =>\n host.broadcastBusEvent(forwardedType, event),\n );\n }\n syncManager?.onSyncStatusChange((documentId, status) =>\n host.broadcastBusEvent(SYNC_STATUS_CHANGED_EVENT, {\n documentId,\n status,\n }),\n );\n console.info(\"[reactor.worker] boot: complete\");\n return module.client;\n } catch (error) {\n console.error(`[reactor.worker] boot failed at phase \"${phase}\":`, error);\n throw error;\n }\n },\n registerPackages: async (specs) => {\n if (!loader) {\n return;\n }\n await loader.loadPackages(specs);\n registerNewModules();\n },\n onIdentity: (user) => {\n currentIdentity = user;\n if (signer) {\n signer.user = user ?? undefined;\n }\n },\n onSyncOp: async (method, args) => {\n if (!syncManager) {\n throw new Error(\"SyncManager not available\");\n }\n switch (method) {\n case \"list\":\n return syncManager.list().map(toWireRemote);\n case \"add\": {\n const [name, collectionIdKey, channelConfig, filter, options] =\n args as [\n string,\n string,\n ChannelConfig,\n RemoteFilter | undefined,\n RemoteOptions | undefined,\n ];\n const remote = await syncManager.add(\n name,\n DriveCollectionId.fromKey(collectionIdKey),\n channelConfig,\n filter,\n options,\n );\n return toWireRemote(remote);\n }\n case \"bindRemote\":\n await syncManager.bindRemote(args[0] as string, args[1] as string);\n return undefined;\n case \"remove\":\n await syncManager.remove(args[0] as string);\n return undefined;\n case \"triggerPull\":\n syncManager.triggerPull(args[0] as string);\n return undefined;\n default:\n throw new Error(`Unknown sync op: ${method}`);\n }\n },\n onDbOp: async (method, args) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n switch (method) {\n case \"query\": {\n const [sql, params] = args as [string, unknown[]];\n const result = await relational.pg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown db op: ${method}`);\n }\n },\n onLiveQuery: async (sql, params, onResults) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n const live = await relational.pg.live.query(sql, params, (results) =>\n onResults(results),\n );\n return () => {\n void live.unsubscribe();\n };\n },\n onInspectorOp: async (method, args) => {\n switch (method) {\n case \"queue.getState\": {\n if (!inspectorQueue) {\n return {\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n };\n }\n const pendingJobs = inspectorQueue.getPendingJobs();\n const executingJobs = [];\n for (const jobIds of inspectorQueue.getExecutingJobIds().values()) {\n for (const jobId of jobIds) {\n const job = inspectorQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n return {\n isPaused: inspectorQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n };\n }\n case \"queue.pause\":\n inspectorQueue?.pause();\n return undefined;\n case \"queue.resume\":\n await inspectorQueue?.resume();\n return undefined;\n case \"processors.getAll\":\n return (inspectorProcessors?.getAll() ?? []).map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n }));\n case \"processors.retry\": {\n const [processorId] = args as [string];\n await inspectorProcessors?.get(processorId)?.retry();\n return undefined;\n }\n case \"integrity.validate\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.validateDocument(documentId, branch);\n }\n case \"integrity.rebuildKeyframes\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildKeyframes(documentId, branch);\n }\n case \"integrity.rebuildSnapshots\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildSnapshots(documentId, branch);\n }\n case \"db.query\": {\n if (!owned.reactorPg) {\n throw new Error(\"Reactor store not available\");\n }\n const [sql, params] = args as [string, unknown[]];\n const result = await owned.reactorPg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown inspector op: ${method}`);\n }\n },\n});\n\ntype WorkerGlobalErrorEvent = {\n message?: string;\n error?: unknown;\n reason?: unknown;\n};\n\nconst globalScope = self as unknown as {\n addEventListener: (\n type: \"error\" | \"unhandledrejection\",\n listener: (event: WorkerGlobalErrorEvent) => void,\n ) => void;\n onconnect: ((event: MessageEvent) => void) | null;\n};\n\nglobalScope.addEventListener(\"error\", (event) => {\n console.error(\n \"[reactor.worker] uncaught error\",\n event.message ?? event.error ?? event,\n );\n});\nglobalScope.addEventListener(\"unhandledrejection\", (event) => {\n console.error(\"[reactor.worker] unhandled rejection\", event.reason);\n});\n\nglobalScope.onconnect = (event) => {\n const port = event.ports[0];\n if (port) {\n try {\n host.connectPort(port);\n } catch (error) {\n console.error(\"[reactor.worker] failed to connect port\", error);\n }\n }\n};\n"],"names":[],"mappings":"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","debug_id":"5225d87d-89ae-585a-b1f1-582e28898f75"}
|
|
1
|
+
{"version":3,"file":"reactor.worker.js","sources":["../src/reactor-worker-models.ts","../src/reactor-worker-signer.ts","../src/reactor.worker.ts"],"sourcesContent":["import type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\n\n// A `document-models` barrel also re-exports types, schemas and helpers; keep\n// only the entries that are document-model modules.\nexport function toDocumentModelModules(\n candidates: unknown[],\n): DocumentModelModule[] {\n return candidates.filter(\n (m): m is DocumentModelModule =>\n typeof m === \"object\" &&\n m !== null &&\n \"documentModel\" in m &&\n \"reducer\" in m,\n );\n}\n\n/** Which of the bundled-but-optional packages this worker registers. */\nexport type BundledModelFlags = {\n /** Builder mode: vetra's spec document models. */\n studioMode?: boolean;\n /** Powerhouse workflows: the workflow + connection document models. */\n workflowsEnabled?: boolean;\n};\n\nexport type BundledModelLoaders = {\n vetra: () => Promise<Record<string, unknown>>;\n workflow: () => Promise<Record<string, unknown>>;\n};\n\n// Neither package is CDN-loadable, so neither can ride the `packageSpecs`\n// path; each is a chunk fetched only when its own flag is on.\nexport const defaultBundledModelLoaders: BundledModelLoaders = {\n vetra: () => import(\"@powerhousedao/vetra/document-models\"),\n workflow: () => import(\"@powerhousedao/workflow/document-models\"),\n};\n\n// The flags are independent: studio mode does not imply workflows, nor the\n// other way round.\nexport async function loadFlaggedDocumentModels(\n flags: BundledModelFlags,\n loaders: BundledModelLoaders = defaultBundledModelLoaders,\n): Promise<DocumentModelModule[]> {\n const models: DocumentModelModule[] = [];\n if (flags.studioMode) {\n models.push(\n ...toDocumentModelModules(Object.values(await loaders.vetra())),\n );\n }\n if (flags.workflowsEnabled) {\n models.push(\n ...toDocumentModelModules(Object.values(await loaders.workflow())),\n );\n }\n return models;\n}\n","import type { ReactorFeatureFlags, SignerConfig } from \"@powerhousedao/reactor\";\nimport type { ReactorIdentity } from \"@powerhousedao/reactor-browser/rpc\";\nimport { RenownCryptoSigner, type IRenownCrypto } from \"@renown/sdk/crypto\";\nimport {\n createConnectSignerConfig,\n type RenownTrustEndpoints,\n} from \"./utils/renown-trust.js\";\n\n// Matches the main thread's RenownBuilder(\"connect\").\nexport const RENOWN_APP_NAME = \"connect\";\n\n/** The construct fields the worker's signer and trust policy read. */\nexport type WorkerSignerConstruct = {\n featureFlags?: Partial<ReactorFeatureFlags>;\n // Absent (a tab on an older build) fails the boot under authEnforcement.\n renownEndpoints?: RenownTrustEndpoints;\n};\n\n/** The worker's signer; its `user` is updated in place on identity changes. */\nexport async function createWorkerSignerConfig(\n crypto: IRenownCrypto,\n construct: WorkerSignerConstruct,\n identity: ReactorIdentity | undefined,\n): Promise<{ signer: RenownCryptoSigner; signerConfig: SignerConfig }> {\n const signer = new RenownCryptoSigner(crypto, RENOWN_APP_NAME, identity);\n const signerConfig = await createConnectSignerConfig(\n signer,\n construct.featureFlags,\n construct.renownEndpoints ?? {},\n );\n return { signer, signerConfig };\n}\n","import {\n ChannelScheme,\n DocumentIntegrityService,\n DriveCollectionId,\n InMemoryQueue,\n ReactorBuilder,\n ReactorClientBuilder,\n type ChannelConfig,\n type Database,\n type ISyncManager,\n type JwtHandler,\n type ReactorFeatureFlags,\n type Remote,\n type RemoteFilter,\n type RemoteOptions,\n} from \"@powerhousedao/reactor\";\nimport { baseDocumentModels } from \"@powerhousedao/reactor-browser/base-document-models\";\nimport {\n FORWARDED_EVENT_TYPES,\n ReactorHost,\n SYNC_STATUS_CHANGED_EVENT,\n WorkerPackageLoader,\n type ReactorIdentity,\n type WorkerMigrationState,\n} from \"@powerhousedao/reactor-browser/rpc\";\nimport type {\n DocumentModelModule,\n SignaturePolicy,\n} from \"@powerhousedao/shared/document-model\";\nimport {\n createRelationalDb,\n type IProcessorManager,\n type IRelationalDb,\n} from \"@powerhousedao/shared/processors\";\nimport * as commonDocumentModels from \"@powerhousedao/powerhouse-vetra-packages/document-models\";\nimport {\n loadFlaggedDocumentModels,\n toDocumentModelModules,\n} from \"./reactor-worker-models.js\";\nimport {\n BrowserKeyStorage,\n RenownCryptoBuilder,\n type RenownCryptoSigner,\n} from \"@renown/sdk/crypto\";\nimport { createWorkerSignerConfig } from \"./reactor-worker-signer.js\";\nimport type { RenownTrustEndpoints } from \"./utils/renown-trust.js\";\nimport type * as PgLiveModuleNs from \"@electric-sql/pglite/live\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport { readPgVersionFile } from \"./utils/pglite-idb.js\";\nimport {\n coerceMajor,\n CURRENT_PG_MAJOR,\n type DetectedMajor,\n loadPGliteModule,\n resolvePgMajorForRuntime,\n type SupportedPgMajor,\n} from \"./utils/pglite-major.js\";\nimport {\n type BackupStrategy,\n type FileDataEntry,\n clearFileData,\n migrateIdb,\n readFileData,\n writeFileData,\n} from \"./utils/pglite-migrate-core.js\";\n\nconsole.info(\"[reactor.worker] module evaluating\");\n\n// Common models the tab bundles as a local package; not CDN-loadable, so the\n// worker imports them directly. Vetra and workflow are flag-gated chunks.\nconst commonBundledModels = toDocumentModelModules(\n Object.values(commonDocumentModels),\n);\n\ntype WorkerConstruct = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\n // Absolute-URL shared-deps import map from the main thread; lets package\n // sources that import shared deps load as blobs in the worker (import\n // maps don't apply here).\n sharedImports?: Record<string, string>;\n studioMode?: boolean;\n // Loads the workflow package's document models. Independent of studioMode.\n workflowsEnabled?: boolean;\n // The worker has no runtime config, so the chain its bearer tokens are scoped\n // to is passed in; leaving it unset would sign for a chain nobody issues on.\n renownChainId?: number;\n // Same reason: enforcement flags arrive from the tab. Absent means all off,\n // which is what a tab on an older build sends.\n featureFlags?: Partial<ReactorFeatureFlags>;\n // What new documents are created as; absent means the reactor's default.\n createSignaturePolicy?: SignaturePolicy;\n // Where the trust policy verifies signers under authEnforcement.\n renownEndpoints?: RenownTrustEndpoints;\n};\n\ntype ModelRegistry = {\n registerModules: (...modules: DocumentModelModule[]) => void;\n};\n\nlet loader: WorkerPackageLoader | undefined;\nlet registry: ModelRegistry | undefined;\nlet signer: RenownCryptoSigner | undefined;\nlet syncManager: ISyncManager | undefined;\ntype RelationalState = {\n pg?: PgLiveModuleNs.PGliteWithLive;\n db?: IRelationalDb;\n};\nconst relational: RelationalState = {};\ntype OwnedStorage = {\n reactorPg?: {\n close: () => Promise<void>;\n query: (sql: string, params?: unknown[]) => Promise<{ rows: unknown[] }>;\n };\n reactorIdb?: string;\n relationalIdb?: string;\n};\nconst owned: OwnedStorage = {};\nlet inspectorQueue: InMemoryQueue | undefined;\nlet inspectorProcessors: IProcessorManager | undefined;\nlet inspectorIntegrity: DocumentIntegrityService | undefined;\nlet currentIdentity: ReactorIdentity | null = null;\nconst registeredKeys = new Set<string>();\n\nfunction modelKey(module: DocumentModelModule): string {\n return `${module.documentModel.global.id}@${module.version ?? 1}`;\n}\n\n// Cloneable projection of a Remote: meta (carries channelConfig) + connection snapshot.\nfunction toWireRemote(remote: Remote) {\n return {\n meta: remote.meta,\n connectionState: remote.channel.getConnectionState(),\n };\n}\n\n// Register only the delta; the registry rejects duplicate (type, version) pairs.\nfunction registerNewModules(): void {\n if (!loader || !registry) {\n return;\n }\n const fresh = loader.models.filter((m) => !registeredKeys.has(modelKey(m)));\n if (fresh.length === 0) {\n return;\n }\n registry.registerModules(...fresh);\n for (const m of fresh) {\n registeredKeys.add(modelKey(m));\n }\n}\n\n// Rebuild renown crypto from the shared renownKeyDB keypair (origin-scoped IndexedDB).\nasync function buildWorkerCrypto(chainId: number | undefined) {\n const keyStorage = await BrowserKeyStorage.create();\n const builder = new RenownCryptoBuilder().withKeyPairStorage(keyStorage);\n if (chainId !== undefined) {\n builder.withChainId(chainId);\n }\n return builder.build();\n}\n\n// Open against the major already on disk so a legacy PG16 dir isn't read by PG17.\nasync function openReactorPglite(namespace: string) {\n const detected = coerceMajor(await readPgVersionFile(`/pglite/${namespace}`));\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Running against legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const { PGlite } = await loadPGliteModule(major);\n const pg = new PGlite(`idb://${namespace}`, { relaxedDurability: true });\n await pg.waitReady;\n return { pg, detected };\n}\n\ntype PgLiveModule = typeof PgLiveModuleNs;\n\nasync function loadPgLive(major: SupportedPgMajor): Promise<PgLiveModule> {\n if (major === 16) {\n return import(\"pglite-legacy-02/live\") as unknown as Promise<PgLiveModule>;\n }\n return import(\"@electric-sql/pglite/live\");\n}\n\nasync function openRelational(namespace: string): Promise<DetectedMajor> {\n try {\n const detected = coerceMajor(\n await readPgVersionFile(`/pglite/${namespace}`),\n );\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Relational store opening legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const [{ PGlite }, { live }] = await Promise.all([\n loadPGliteModule(major),\n loadPgLive(major),\n ]);\n const pg = new PGlite(`idb://${namespace}`, {\n relaxedDurability: true,\n extensions: { live },\n });\n await pg.waitReady;\n relational.pg = pg as unknown as PgLiveModuleNs.PGliteWithLive;\n relational.db = createRelationalDb(\n new Kysely({ dialect: new PGliteDialect(pg) }),\n );\n console.info(\n `[reactor.worker] Relational store opened: idb://${namespace} (Postgres ${major}).`,\n );\n return detected;\n } catch (error) {\n console.error(\n \"[reactor.worker] Failed to open the relational store:\",\n error,\n );\n return null;\n }\n}\n\nlet migrationState: WorkerMigrationState = { status: \"idle\" };\n\nfunction setMigration(state: WorkerMigrationState): void {\n migrationState = state;\n host.setMigrationState(state);\n}\n\nconst inMemoryBackup: BackupStrategy = {\n snapshot: (idbName) => readFileData(idbName),\n rollback: (handle, idbName) =>\n writeFileData(idbName, handle as FileDataEntry[]),\n discard: () => Promise.resolve(),\n commit: () => Promise.resolve(),\n};\n\nconst workerName = (self as { name?: string }).name ?? \"\";\n\nconst host = new ReactorHost({\n namespace: workerName,\n onAdminRestart: () =>\n host.broadcastReload(\"admin restart\", crypto.randomUUID()),\n onAdminClearStorage: async () => {\n await relational.pg?.close();\n await owned.reactorPg?.close();\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await clearFileData(idbName);\n }\n }\n host.broadcastReload(\"storage cleared\", crypto.randomUUID());\n },\n onAdminMigrate: async () => {\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n });\n if (relational.pg) await relational.pg.close().catch(() => undefined);\n if (owned.reactorPg) await owned.reactorPg.close().catch(() => undefined);\n try {\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await migrateIdb(\n idbName,\n (phase) =>\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n phase,\n }),\n inMemoryBackup,\n );\n }\n }\n host.broadcastReload(\"migration complete\", crypto.randomUUID());\n } catch (error) {\n console.error(\"[reactor.worker] Migration failed:\", error);\n setMigration({\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n });\n host.broadcastReload(\"migration failed\", crypto.randomUUID());\n }\n },\n build: async (raw) => {\n let phase = \"init\";\n try {\n const construct = raw as WorkerConstruct;\n phase = \"loading packages\";\n console.info(`[reactor.worker] boot: ${phase}`);\n loader = new WorkerPackageLoader({\n cdnUrl: construct.cdnUrl,\n importPackage: (url) =>\n import(/* @vite-ignore */ url) as Promise<Record<string, unknown>>,\n sharedImports: construct.sharedImports,\n importSource: (source) =>\n import(\n /* @vite-ignore */ URL.createObjectURL(\n new Blob([source], { type: \"text/javascript\" }),\n )\n ) as Promise<Record<string, unknown>>,\n });\n const loaded = await loader.loadPackages(construct.packageSpecs);\n const flaggedModels = await loadFlaggedDocumentModels({\n studioMode: construct.studioMode,\n workflowsEnabled: construct.workflowsEnabled,\n });\n const models = baseDocumentModels.concat(\n commonBundledModels,\n flaggedModels,\n loaded,\n );\n phase = \"opening pglite stores\";\n console.info(`[reactor.worker] boot: ${phase}`);\n\n //this has to be serial: concurrent PGlite constructors consume the same\n // cached one-shot wasm \"Response\" object\n const reactor = await openReactorPglite(construct.namespace);\n const relationalMajor = await openRelational(\n construct.relationalNamespace,\n );\n const pg = reactor.pg;\n owned.reactorPg = pg;\n owned.reactorIdb = `/pglite/${construct.namespace}`;\n owned.relationalIdb = `/pglite/${construct.relationalNamespace}`;\n // A store is migratable when coerceMajor kept it (a supported legacy\n // major) and it is not the current one; openers already read PG_VERSION.\n const legacyMajor = [reactor.detected, relationalMajor].find(\n (m): m is SupportedPgMajor => m !== null && m !== CURRENT_PG_MAJOR,\n );\n if (legacyMajor !== undefined) {\n setMigration({ status: \"needed\", legacyMajor });\n }\n phase = \"building crypto\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const crypto = await buildWorkerCrypto(construct.renownChainId);\n phase = \"building signer\";\n const built = await createWorkerSignerConfig(\n crypto,\n construct,\n currentIdentity ?? undefined,\n );\n signer = built.signer;\n const jwtHandler: JwtHandler = async () =>\n currentIdentity\n ? crypto.getBearerToken(currentIdentity.address, { expiresIn: 10 })\n : undefined;\n phase = \"building reactor module\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const builder = new ReactorClientBuilder()\n .withSigner(built.signerConfig)\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModelSources(models)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withExecutorConfig({ featureFlags: construct.featureFlags ?? {} })\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({ dialect: new PGliteDialect(pg) }),\n ),\n );\n builder.withDocumentModelLoader(loader);\n if (construct.createSignaturePolicy) {\n builder.withCreateSignaturePolicy(construct.createSignaturePolicy);\n }\n const module = await builder.buildModule();\n registry = module.reactorModule?.documentModelRegistry;\n syncManager = module.reactorModule?.syncModule?.syncManager;\n const rm = module.reactorModule;\n if (rm) {\n inspectorQueue =\n rm.queue instanceof InMemoryQueue ? rm.queue : undefined;\n inspectorProcessors = rm.processorManager;\n inspectorIntegrity = new DocumentIntegrityService(\n rm.keyframeStore,\n rm.operationStore,\n rm.writeCache,\n rm.documentView,\n rm.documentModelRegistry,\n );\n }\n for (const m of models) {\n registeredKeys.add(modelKey(m));\n }\n for (const type of FORWARDED_EVENT_TYPES) {\n module.eventBus.subscribe(type, (forwardedType, event) =>\n host.broadcastBusEvent(forwardedType, event),\n );\n }\n syncManager?.onSyncStatusChange((documentId, status) =>\n host.broadcastBusEvent(SYNC_STATUS_CHANGED_EVENT, {\n documentId,\n status,\n }),\n );\n console.info(\"[reactor.worker] boot: complete\");\n return module.client;\n } catch (error) {\n console.error(`[reactor.worker] boot failed at phase \"${phase}\":`, error);\n throw error;\n }\n },\n registerPackages: async (specs) => {\n if (!loader) {\n return;\n }\n await loader.loadPackages(specs);\n registerNewModules();\n },\n onIdentity: (user) => {\n currentIdentity = user;\n if (signer) {\n signer.user = user ?? undefined;\n }\n },\n onSyncOp: async (method, args) => {\n if (!syncManager) {\n throw new Error(\"SyncManager not available\");\n }\n switch (method) {\n case \"list\":\n return syncManager.list().map(toWireRemote);\n case \"add\": {\n const [name, collectionIdKey, channelConfig, filter, options] =\n args as [\n string,\n string,\n ChannelConfig,\n RemoteFilter | undefined,\n RemoteOptions | undefined,\n ];\n const remote = await syncManager.add(\n name,\n DriveCollectionId.fromKey(collectionIdKey),\n channelConfig,\n filter,\n options,\n );\n return toWireRemote(remote);\n }\n case \"bindRemote\":\n await syncManager.bindRemote(args[0] as string, args[1] as string);\n return undefined;\n case \"remove\":\n await syncManager.remove(args[0] as string);\n return undefined;\n case \"triggerPull\":\n syncManager.triggerPull(args[0] as string);\n return undefined;\n default:\n throw new Error(`Unknown sync op: ${method}`);\n }\n },\n onDbOp: async (method, args) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n switch (method) {\n case \"query\": {\n const [sql, params] = args as [string, unknown[]];\n const result = await relational.pg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown db op: ${method}`);\n }\n },\n onLiveQuery: async (sql, params, onResults) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n const live = await relational.pg.live.query(sql, params, (results) =>\n onResults(results),\n );\n return () => {\n void live.unsubscribe();\n };\n },\n onInspectorOp: async (method, args) => {\n switch (method) {\n case \"queue.getState\": {\n if (!inspectorQueue) {\n return {\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n };\n }\n const pendingJobs = inspectorQueue.getPendingJobs();\n const executingJobs = [];\n for (const jobIds of inspectorQueue.getExecutingJobIds().values()) {\n for (const jobId of jobIds) {\n const job = inspectorQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n return {\n isPaused: inspectorQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n };\n }\n case \"queue.pause\":\n inspectorQueue?.pause();\n return undefined;\n case \"queue.resume\":\n await inspectorQueue?.resume();\n return undefined;\n case \"processors.getAll\":\n return (inspectorProcessors?.getAll() ?? []).map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n }));\n case \"processors.retry\": {\n const [processorId] = args as [string];\n await inspectorProcessors?.get(processorId)?.retry();\n return undefined;\n }\n case \"integrity.validate\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.validateDocument(documentId, branch);\n }\n case \"integrity.rebuildKeyframes\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildKeyframes(documentId, branch);\n }\n case \"integrity.rebuildSnapshots\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildSnapshots(documentId, branch);\n }\n case \"db.query\": {\n if (!owned.reactorPg) {\n throw new Error(\"Reactor store not available\");\n }\n const [sql, params] = args as [string, unknown[]];\n const result = await owned.reactorPg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown inspector op: ${method}`);\n }\n },\n});\n\ntype WorkerGlobalErrorEvent = {\n message?: string;\n error?: unknown;\n reason?: unknown;\n};\n\nconst globalScope = self as unknown as {\n addEventListener: (\n type: \"error\" | \"unhandledrejection\",\n listener: (event: WorkerGlobalErrorEvent) => void,\n ) => void;\n onconnect: ((event: MessageEvent) => void) | null;\n};\n\nglobalScope.addEventListener(\"error\", (event) => {\n console.error(\n \"[reactor.worker] uncaught error\",\n event.message ?? event.error ?? event,\n );\n});\nglobalScope.addEventListener(\"unhandledrejection\", (event) => {\n console.error(\"[reactor.worker] unhandled rejection\", event.reason);\n});\n\nglobalScope.onconnect = (event) => {\n const port = event.ports[0];\n if (port) {\n try {\n host.connectPort(port);\n } catch (error) {\n console.error(\"[reactor.worker] failed to connect port\", error);\n }\n }\n};\n"],"names":[],"mappings":"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","debug_id":"6ecb154f-352b-5cf3-bbbb-af9ed5168442"}
|
|
@@ -1,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]="58f9837e-4483-5eab-bae8-28b22b031f79")}catch(e){}}();
|
|
3
|
+
import { r as connectConfig } from "./connect.config-Dgs13R1s.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-Cy1G2rCq.js.map
|
|
129
|
+
//# debugId=58f9837e-4483-5eab-bae8-28b22b031f79
|
package/dist/{registerServiceWorker-DhB4qPLx.js.map → registerServiceWorker-Cy1G2rCq.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerServiceWorker-
|
|
1
|
+
{"version":3,"file":"registerServiceWorker-Cy1G2rCq.js","sources":["../src/utils/registerServiceWorker.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { refreshPwaManifestLink } from \"./pwa-manifest-link.js\";\n\nconst basePath = connectConfig.routerBasename;\n\nconst serviceWorkerScriptPath = [basePath, \"service-worker.js\"]\n .join(\"/\")\n .replace(/\\/{2,}/gm, \"/\");\n\n// External store backing the refresh prompt: our hand-written service worker\n// (injectManifest, registerType: prompt) parks a new worker as \"waiting\" by not\n// calling skipWaiting on install; we flag that here so\n// service-worker-update-prompt.tsx can offer a Refresh instead of reloading\n// from under the user.\nlet updateAvailable = false;\nconst updateListeners = new Set<() => void>();\n\nfunction setUpdateAvailable(value: boolean) {\n if (updateAvailable === value) return;\n updateAvailable = value;\n for (const listener of updateListeners) listener();\n}\n\nexport function subscribeServiceWorkerUpdate(cb: () => void): () => void {\n updateListeners.add(cb);\n return () => {\n updateListeners.delete(cb);\n };\n}\n\nexport function getServiceWorkerUpdateAvailable(): boolean {\n return updateAvailable;\n}\n\nclass ServiceWorkerManager {\n ready = false;\n debug = false;\n registration: ServiceWorkerRegistration | null = null;\n // Only reload on controllerchange when the user actually accepted an update.\n // clientsClaim fires controllerchange on the very first install too, and we\n // must not reload then.\n #updateAccepted = false;\n #reloading = false;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n setDebug(debug: boolean) {\n this.debug = debug;\n }\n\n #log(...args: unknown[]) {\n if (this.debug) console.log(\"[ServiceWorker]\", ...args);\n }\n\n // Watch an installing worker; once it reaches \"installed\" while another\n // worker already controls the page, a new version is waiting → prompt.\n #trackInstalling(worker: ServiceWorker | null) {\n if (!worker) return;\n worker.addEventListener(\"statechange\", () => {\n if (worker.state === \"installed\" && navigator.serviceWorker.controller) {\n this.#log(\"New version installed and waiting\");\n setUpdateAvailable(true);\n }\n });\n }\n\n #handleRegistration(registration: ServiceWorkerRegistration) {\n this.registration = registration;\n this.ready = true;\n this.#log(\"registered\", registration);\n\n // A worker installed by a previous page load may already be waiting.\n if (registration.waiting && navigator.serviceWorker.controller) {\n setUpdateAvailable(true);\n }\n\n this.#trackInstalling(registration.installing);\n registration.addEventListener(\"updatefound\", () => {\n this.#trackInstalling(registration.installing);\n });\n }\n\n async #register() {\n try {\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n // First visit: boot fetches the runtime config before this SW controls\n // the page, so it never lands in the cache. Warm it now (clientsClaim\n // just gave us control) so a single online load is enough to go offline.\n this.#warmRuntimeConfigCache();\n // The SW only serves the dynamic manifest.webmanifest once it controls\n // the page. A package installed before that (its fragment already in\n // IndexedDB) was re-consumed against the static base manifest; now that\n // the dynamic route is live, re-attach the link so it picks up the\n // package's PWA config without a manual reload.\n refreshPwaManifestLink();\n // Reload once the worker we activated via applyUpdate() takes control.\n if (!this.#updateAccepted || this.#reloading) return;\n this.#reloading = true;\n window.location.reload();\n });\n\n const existing = await navigator.serviceWorker.getRegistration();\n if (existing) {\n this.#handleRegistration(existing);\n // Force an immediate check so a deploy that happened while the tab was\n // closed surfaces a prompt on the next load.\n await existing.update();\n } else {\n const registration = await navigator.serviceWorker.register(\n serviceWorkerScriptPath,\n );\n this.#handleRegistration(registration);\n }\n\n // Periodically poll for a new version while the tab stays open.\n const intervalId = setInterval(() => {\n void (async () => {\n const reg = await navigator.serviceWorker.getRegistration();\n if (!reg) {\n clearInterval(intervalId);\n return;\n }\n // Skip while a worker is mid-install or the browser is offline —\n // updating then would only fire a doomed network fetch (per the\n // vite-plugin-pwa periodic-update guidance).\n if (reg.installing || !navigator.onLine) return;\n await reg.update();\n })();\n }, connectConfig.appVersionCheckInterval);\n } catch (error) {\n console.error(\"ServiceWorker registration failed: \", error);\n }\n }\n\n registerServiceWorker(debug = false) {\n this.debug = debug;\n\n if (!(\"serviceWorker\" in navigator)) {\n console.warn(\"Service Worker not available\");\n return;\n }\n const start = () => {\n this.#register().catch(console.error);\n };\n // This runs from a React effect, which usually fires *after* the window\n // `load` event has already happened — so adding a load listener would never\n // fire. Register immediately when the page is already loaded; otherwise wait\n // for load to avoid contending with initial page resource fetches.\n if (document.readyState === \"complete\") {\n start();\n } else {\n window.addEventListener(\"load\", start, { once: true });\n }\n }\n\n // Fire-and-forget re-fetch so the controlling SW's NetworkFirst rule caches\n // the config (see controllerchange). The URL MUST match runtime-config.ts's\n // loader (`${import.meta.env.BASE_URL}powerhouse.config.json`) or the cache\n // keys won't line up.\n #warmRuntimeConfigCache() {\n void fetch(`${import.meta.env.BASE_URL}powerhouse.config.json`).catch(\n () => {},\n );\n }\n\n // Activate the waiting worker; the controllerchange handler then reloads.\n applyUpdate() {\n setUpdateAvailable(false);\n const waiting = this.registration?.waiting;\n if (!waiting) {\n // Nothing waiting (or already activated) — reload to pick up whatever\n // the active worker now serves.\n this.#reloading = true;\n window.location.reload();\n return;\n }\n this.#updateAccepted = true;\n waiting.postMessage({ type: \"SKIP_WAITING\" });\n }\n\n sendMessage(message: unknown) {\n const target =\n this.registration?.active ??\n this.registration?.waiting ??\n navigator.serviceWorker.controller;\n target?.postMessage(message);\n }\n\n // Drop any worker controlling this scope — used when offline support is\n // disabled (a disabled build also ships a self-destroying worker).\n async unregisterAll() {\n if (!(\"serviceWorker\" in navigator)) return;\n const registrations = await navigator.serviceWorker.getRegistrations();\n await Promise.all(registrations.map((r) => r.unregister()));\n }\n}\n\nexport const serviceWorkerManager = new ServiceWorkerManager();\n"],"names":[],"mappings":";;;;;AAKA,MAAM,0BAA0B,CAFf,cAAc,gBAEY,mBAAmB,CAAC,CAC5D,KAAK,GAAG,CAAC,CACT,QAAQ,YAAY,GAAG;AAO1B,IAAI,kBAAkB;AACtB,MAAM,kCAAkB,IAAI,IAAgB;AAE5C,SAAS,mBAAmB,OAAgB;CAC1C,IAAI,oBAAoB,OAAO;CAC/B,kBAAkB;CAClB,KAAK,MAAM,YAAY,iBAAiB,SAAS;AACnD;AAEA,SAAgB,6BAA6B,IAA4B;CACvE,gBAAgB,IAAI,EAAE;CACtB,aAAa;EACX,gBAAgB,OAAO,EAAE;CAC3B;AACF;AAEA,SAAgB,kCAA2C;CACzD,OAAO;AACT;AAEA,IAAM,uBAAN,MAA2B;CACzB,QAAQ;CACR,QAAQ;CACR,eAAiD;CAIjD,kBAAkB;CAClB,aAAa;CAEb,YAAY,QAAQ,OAAO;EACzB,KAAK,QAAQ;CACf;CAEA,SAAS,OAAgB;EACvB,KAAK,QAAQ;CACf;CAEA,KAAK,GAAG,MAAiB;EACvB,IAAI,KAAK,OAAO,QAAQ,IAAI,mBAAmB,GAAG,IAAI;CACxD;CAIA,iBAAiB,QAA8B;EAC7C,IAAI,CAAC,QAAQ;EACb,OAAO,iBAAiB,qBAAqB;GAC3C,IAAI,OAAO,UAAU,eAAe,UAAU,cAAc,YAAY;IACtE,KAAK,KAAK,mCAAmC;IAC7C,mBAAmB,IAAI;GACzB;EACF,CAAC;CACH;CAEA,oBAAoB,cAAyC;EAC3D,KAAK,eAAe;EACpB,KAAK,QAAQ;EACb,KAAK,KAAK,cAAc,YAAY;EAGpC,IAAI,aAAa,WAAW,UAAU,cAAc,YAClD,mBAAmB,IAAI;EAGzB,KAAK,iBAAiB,aAAa,UAAU;EAC7C,aAAa,iBAAiB,qBAAqB;GACjD,KAAK,iBAAiB,aAAa,UAAU;EAC/C,CAAC;CACH;CAEA,MAAM,YAAY;EAChB,IAAI;GACF,UAAU,cAAc,iBAAiB,0BAA0B;IAIjE,KAAK,wBAAwB;IAM7B,uBAAuB;IAEvB,IAAI,CAAC,KAAK,mBAAmB,KAAK,YAAY;IAC9C,KAAK,aAAa;IAClB,OAAO,SAAS,OAAO;GACzB,CAAC;GAED,MAAM,WAAW,MAAM,UAAU,cAAc,gBAAgB;GAC/D,IAAI,UAAU;IACZ,KAAK,oBAAoB,QAAQ;IAGjC,MAAM,SAAS,OAAO;GACxB,OAAO;IACL,MAAM,eAAe,MAAM,UAAU,cAAc,SACjD,uBACF;IACA,KAAK,oBAAoB,YAAY;GACvC;GAGA,MAAM,aAAa,kBAAkB;IACnC,CAAM,YAAY;KAChB,MAAM,MAAM,MAAM,UAAU,cAAc,gBAAgB;KAC1D,IAAI,CAAC,KAAK;MACR,cAAc,UAAU;MACxB;KACF;KAIA,IAAI,IAAI,cAAc,CAAC,UAAU,QAAQ;KACzC,MAAM,IAAI,OAAO;IACnB,EAAA,CAAG;GACL,GAAG,cAAc,uBAAuB;EAC1C,SAAS,OAAO;GACd,QAAQ,MAAM,uCAAuC,KAAK;EAC5D;CACF;CAEA,sBAAsB,QAAQ,OAAO;EACnC,KAAK,QAAQ;EAEb,IAAI,EAAE,mBAAmB,YAAY;GACnC,QAAQ,KAAK,8BAA8B;GAC3C;EACF;EACA,MAAM,cAAc;GAClB,KAAK,UAAU,CAAC,CAAC,MAAM,QAAQ,KAAK;EACtC;EAKA,IAAI,SAAS,eAAe,YAC1B,MAAM;OAEN,OAAO,iBAAiB,QAAQ,OAAO,EAAE,MAAM,KAAK,CAAC;CAEzD;CAMA,0BAA0B;EACxB,MAAW,GAAG,YAAY,IAAI,SAAS,uBAAuB,CAAC,CAAC,YACxD,CAAC,CACT;CACF;CAGA,cAAc;EACZ,mBAAmB,KAAK;EACxB,MAAM,UAAU,KAAK,cAAc;EACnC,IAAI,CAAC,SAAS;GAGZ,KAAK,aAAa;GAClB,OAAO,SAAS,OAAO;GACvB;EACF;EACA,KAAK,kBAAkB;EACvB,QAAQ,YAAY,EAAE,MAAM,eAAe,CAAC;CAC9C;CAEA,YAAY,SAAkB;EAK5B,CAHE,KAAK,cAAc,UACnB,KAAK,cAAc,WACnB,UAAU,cAAc,WAAA,EAClB,YAAY,OAAO;CAC7B;CAIA,MAAM,gBAAgB;EACpB,IAAI,EAAE,mBAAmB,YAAY;EACrC,MAAM,gBAAgB,MAAM,UAAU,cAAc,iBAAiB;EACrE,MAAM,QAAQ,IAAI,cAAc,KAAK,MAAM,EAAE,WAAW,CAAC,CAAC;CAC5D;AACF;AAEA,MAAa,uBAAuB,IAAI,qBAAqB","debug_id":"58f9837e-4483-5eab-bae8-28b22b031f79"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2a03e561-8352-534f-9e49-4827833e1919")}catch(e){}}();
|
|
3
3
|
import { createRenownTrustPolicy, resolveSwitchboardEndpoint } from "@renown/sdk/trust";
|
|
4
4
|
//#region src/utils/renown-trust.ts
|
|
5
5
|
const MISSING_RENOWN_ENDPOINT_MESSAGE = "connect.reactor.featureFlags.authEnforcement is on, but no Renown endpoint is configured to verify signers against: set connect.renown.url (or connect.renown.switchboardUrl). Without one every signed write would be refused.";
|
|
@@ -30,5 +30,5 @@ async function createConnectSignerConfig(signer, featureFlags, endpoints) {
|
|
|
30
30
|
//#endregion
|
|
31
31
|
export { createConnectSignerConfig as t };
|
|
32
32
|
|
|
33
|
-
//# sourceMappingURL=renown-trust-
|
|
34
|
-
//# debugId=
|
|
33
|
+
//# sourceMappingURL=renown-trust-DRgHpxlZ.js.map
|
|
34
|
+
//# debugId=2a03e561-8352-534f-9e49-4827833e1919
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renown-trust-
|
|
1
|
+
{"version":3,"file":"renown-trust-DRgHpxlZ.js","sources":["../src/utils/renown-trust.ts"],"sourcesContent":["import type {\n ReactorFeatureFlags,\n SignatureTrustPolicy,\n SignerConfig,\n} from \"@powerhousedao/reactor\";\nimport type { ISigner } from \"@powerhousedao/shared/document-model\";\nimport {\n createRenownTrustPolicy,\n resolveSwitchboardEndpoint,\n type RenownOwnSigner,\n} from \"@renown/sdk/trust\";\n\n/** Where the trust policy reads the credentials binding keys to wallets. */\nexport type RenownTrustEndpoints = {\n /** `connect.renown.url`. */\n renownUrl?: string;\n /** `connect.renown.switchboardUrl`. */\n switchboardUrl?: string;\n};\n\nexport const MISSING_RENOWN_ENDPOINT_MESSAGE =\n \"connect.reactor.featureFlags.authEnforcement is on, but no Renown endpoint \" +\n \"is configured to verify signers against: set connect.renown.url (or \" +\n \"connect.renown.switchboardUrl). Without one every signed write would be \" +\n \"refused.\";\n\n/** Under authEnforcement, admits keys a Renown credential binds to the wallet. */\nexport async function createConnectTrustPolicy(\n featureFlags: Partial<ReactorFeatureFlags> | undefined,\n endpoints: RenownTrustEndpoints,\n ownSigner: RenownOwnSigner,\n): Promise<SignatureTrustPolicy | undefined> {\n if (!featureFlags?.authEnforcement) {\n return undefined;\n }\n const renownUrl = endpoints.renownUrl || undefined;\n const switchboardUrl = endpoints.switchboardUrl || undefined;\n if (!renownUrl && !switchboardUrl) {\n throw new Error(MISSING_RENOWN_ENDPOINT_MESSAGE);\n }\n const switchboard = await resolveSwitchboardEndpoint({\n switchboardUrl,\n baseUrl: renownUrl,\n });\n return createRenownTrustPolicy({\n ...(switchboard ? { switchboard } : {}),\n ...(renownUrl ? { renownUrl } : {}),\n ownSigner,\n });\n}\n\n/** The reactor host's signer, with the trust policy when authEnforcement is on. */\nexport async function createConnectSignerConfig(\n signer: ISigner,\n featureFlags: Partial<ReactorFeatureFlags> | undefined,\n endpoints: RenownTrustEndpoints,\n): Promise<SignerConfig> {\n const trustPolicy = await createConnectTrustPolicy(\n featureFlags,\n endpoints,\n signer,\n );\n return trustPolicy ? { signer, trustPolicy } : { signer };\n}\n"],"names":[],"mappings":";;;;AAoBA,MAAa,kCACX;;AAMF,eAAsB,yBACpB,cACA,WACA,WAC2C;CAC3C,IAAI,CAAC,cAAc,iBACjB;CAEF,MAAM,YAAY,UAAU,aAAa,KAAA;CACzC,MAAM,iBAAiB,UAAU,kBAAkB,KAAA;CACnD,IAAI,CAAC,aAAa,CAAC,gBACjB,MAAM,IAAI,MAAM,+BAA+B;CAEjD,MAAM,cAAc,MAAM,2BAA2B;EACnD;EACA,SAAS;CACX,CAAC;CACD,OAAO,wBAAwB;EAC7B,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;EACrC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;EACjC;CACF,CAAC;AACH;;AAGA,eAAsB,0BACpB,QACA,cACA,WACuB;CACvB,MAAM,cAAc,MAAM,yBACxB,cACA,WACA,MACF;CACA,OAAO,cAAc;EAAE;EAAQ;CAAY,IAAI,EAAE,OAAO;AAC1D","debug_id":"2a03e561-8352-534f-9e49-4827833e1919"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7752a8d2-bc17-583b-b675-e6920533d68f")}catch(e){}}();
|
|
3
3
|
import { ConfigLoader, JsonConfigAdapter } from "@powerhousedao/shared/connect";
|
|
4
4
|
//#region src/runtime-config.ts
|
|
5
5
|
const loader = new ConfigLoader(new JsonConfigAdapter({ path: `${import.meta.env.BASE_URL}powerhouse.config.json` }));
|
|
@@ -20,5 +20,5 @@ function applyConnectBranding(config) {
|
|
|
20
20
|
//#endregion
|
|
21
21
|
export { getRuntimeConfig as n, loadRuntimeConfig as r, applyConnectBranding as t };
|
|
22
22
|
|
|
23
|
-
//# sourceMappingURL=runtime-config-
|
|
24
|
-
//# debugId=
|
|
23
|
+
//# sourceMappingURL=runtime-config-DtJIUgYw.js.map
|
|
24
|
+
//# debugId=7752a8d2-bc17-583b-b675-e6920533d68f
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-config-
|
|
1
|
+
{"version":3,"file":"runtime-config-DtJIUgYw.js","sources":["../src/runtime-config.ts"],"sourcesContent":["import {\n ConfigLoader,\n JsonConfigAdapter,\n type RuntimePowerhouseConfig,\n} from \"@powerhousedao/shared/connect\";\n\nconst loader = new ConfigLoader(\n new JsonConfigAdapter({\n path: `${import.meta.env.BASE_URL}powerhouse.config.json`,\n }),\n);\n\nexport async function loadRuntimeConfig(): Promise<RuntimePowerhouseConfig> {\n return (await loader.read()) as RuntimePowerhouseConfig;\n}\n\n/**\n * Returns the cached config synchronously.\n * Must be called after `loadRuntimeConfig()` has resolved.\n */\nexport function getRuntimeConfig(): RuntimePowerhouseConfig {\n return loader.getCached() as RuntimePowerhouseConfig;\n}\n\nexport function applyConnectBranding(config: RuntimePowerhouseConfig): void {\n const appName = config.connect.branding?.appName;\n if (appName) document.title = appName;\n}\n"],"names":[],"mappings":";;;;AAMA,MAAM,SAAS,IAAI,aACjB,IAAI,kBAAkB,EACpB,MAAM,GAAG,YAAY,IAAI,SAAS,wBACpC,CAAC,CACH;AAEA,eAAsB,oBAAsD;CAC1E,OAAQ,MAAM,OAAO,KAAK;AAC5B;;;;;AAMA,SAAgB,mBAA4C;CAC1D,OAAO,OAAO,UAAU;AAC1B;AAEA,SAAgB,qBAAqB,QAAuC;CAC1E,MAAM,UAAU,OAAO,QAAQ,UAAU;CACzC,IAAI,SAAS,SAAS,QAAQ;AAChC","debug_id":"7752a8d2-bc17-583b-b675-e6920533d68f"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/services/sentry.ts
|
|
2
2
|
|
|
3
|
-
!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
|
+
!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]="bc3320b1-f171-5f27-89ee-e9ed3b901fec")}catch(e){}}();
|
|
4
4
|
let sentry;
|
|
5
5
|
function setSentryModule(mod) {
|
|
6
6
|
sentry = mod;
|
|
@@ -11,5 +11,5 @@ function setUser(...args) {
|
|
|
11
11
|
//#endregion
|
|
12
12
|
export { setUser as n, setSentryModule as t };
|
|
13
13
|
|
|
14
|
-
//# sourceMappingURL=sentry-
|
|
15
|
-
//# debugId=
|
|
14
|
+
//# sourceMappingURL=sentry-jfDyrxdX.js.map
|
|
15
|
+
//# debugId=bc3320b1-f171-5f27-89ee-e9ed3b901fec
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry-
|
|
1
|
+
{"version":3,"file":"sentry-jfDyrxdX.js","sources":["../src/services/sentry.ts"],"sourcesContent":["// Lazy Sentry accessors: the SDK (and rrweb replay) stays off the boot path\n// until useInitSentry dynamically loads it. No-ops while Sentry is disabled.\nimport type * as SentryModule from \"@sentry/react\";\n\nlet sentry: typeof SentryModule | undefined;\n\nexport function setSentryModule(mod: typeof SentryModule | undefined): void {\n sentry = mod;\n}\n\nexport function captureException(\n ...args: Parameters<typeof SentryModule.captureException>\n): void {\n sentry?.captureException(...args);\n}\n\nexport function setUser(\n ...args: Parameters<typeof SentryModule.setUser>\n): void {\n sentry?.setUser(...args);\n}\n"],"names":[],"mappings":";;;AAIA,IAAI;AAEJ,SAAgB,gBAAgB,KAA4C;CAC1E,SAAS;AACX;AAQA,SAAgB,QACd,GAAG,MACG;CACN,QAAQ,QAAQ,GAAG,IAAI;AACzB","debug_id":"bc3320b1-f171-5f27-89ee-e9ed3b901fec"}
|
package/dist/start-connect.d.ts
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import { DocumentModelLib } from "@powerhousedao/shared/document-model";
|
|
2
|
-
|
|
3
2
|
//#region start-connect.d.ts
|
|
4
|
-
type ModuleNamespace = Record<string, any> & {
|
|
3
|
+
export type ModuleNamespace = Record<string, any> & {
|
|
5
4
|
[Symbol.toStringTag]: "Module";
|
|
6
5
|
};
|
|
7
6
|
/** `import.meta` extended with the minimal subset of Vite's HMR API used by the
|
|
8
7
|
* codegen-generated `main.tsx`. Exported so consumer projects can cast
|
|
9
8
|
* `import.meta` to it without pulling `vite/client` into their tsconfig `types`. */
|
|
10
|
-
type ImportHmr = ImportMeta & {
|
|
9
|
+
export type ImportHmr = ImportMeta & {
|
|
11
10
|
hot?: {
|
|
12
11
|
accept(deps: readonly string[], cb: (mods: Array<ModuleNamespace | undefined>) => void): void;
|
|
13
12
|
};
|
|
14
13
|
};
|
|
15
14
|
declare function updateLocalPackage(pkg: DocumentModelLib<any> | ModuleNamespace): void;
|
|
16
|
-
declare function startConnect(localPackage: DocumentModelLib<any>): {
|
|
15
|
+
export declare function startConnect(localPackage: DocumentModelLib<any>): {
|
|
17
16
|
updateLocalPackage: typeof updateLocalPackage;
|
|
18
17
|
};
|
|
19
18
|
//#endregion
|
|
20
|
-
export {
|
|
19
|
+
export {};
|
|
21
20
|
//# sourceMappingURL=start-connect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-connect.d.ts","names":[],"sources":["../start-connect.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"start-connect.d.ts","names":[],"sources":["../start-connect.tsx"],"mappings":";;YAkCY,kBAAkB;GAC3B,OAAO;;;;;YAME,YAAY;EACtB;IACE,OACE,yBACA,KAAK,MAAM,MAAM;;;iBAKd,mBAAmB,KAAK,wBAAwB;wBAIzC,aAAa,cAAc;6BAAA"}
|
package/dist/start-connect.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
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 { t as bootConnect } from "./boot-
|
|
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]="fda83e80-3003-561a-9081-524c01d1842d")}catch(e){}}();
|
|
3
|
+
import { t as bootConnect } from "./boot-DPNEOI2A.js";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
//#region start-connect.tsx
|
|
6
6
|
const root = await bootConnect();
|
|
7
|
-
const components = root ? await import("./components-
|
|
7
|
+
const components = root ? await import("./components-BPwZnhhU.js") : null;
|
|
8
8
|
function updateLocalPackage(pkg) {
|
|
9
9
|
window.ph?.vetraPackageManager?.updateLocalPackage(pkg);
|
|
10
10
|
}
|
|
@@ -16,4 +16,4 @@ function startConnect(localPackage) {
|
|
|
16
16
|
export { startConnect };
|
|
17
17
|
|
|
18
18
|
//# sourceMappingURL=start-connect.js.map
|
|
19
|
-
//# debugId=
|
|
19
|
+
//# debugId=fda83e80-3003-561a-9081-524c01d1842d
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-connect.js","sources":["../start-connect.tsx"],"sourcesContent":["import type { DocumentModelLib } from \"@powerhousedao/shared/document-model\";\nimport { bootConnect } from \"./src/boot.js\";\n\n// Paint the config-independent skeleton, then bootstrap the runtime config,\n// BEFORE the React tree imports. Any module that imports start-connect.tsx —\n// including the codegen-generated main.tsx — suspends on this top-level await,\n// so by the time the dynamic import of AppLoader resolves, the ConfigLoader\n// cache is warm and connect.config.ts can read getRuntimeConfig()\n// synchronously at module evaluation.\nconst root = await bootConnect();\n\n// `null` means startup failed and bootConnect has painted the error state; the\n// app graph must not be imported, since its modules read the config at\n// module-evaluation and would throw.\nconst components = root ? await import(\"./src/components/index.js\") : null;\n\n/* Starts your local dev server for Connect.\n *\n * Call this function with the export of your project's index.ts file in your main.tsx file like this:\n *\n * // main.tsx\n * import * as localPackage from \"./index.js\";\n * const { updateLocalPackage } = startConnect(localPackage);\n *\n * if (import.meta.hot) {\n * import.meta.hot.accept([\"./index.js\"], ([newModule]) => {\n * if (newModule) {\n * updateLocalPackage(newModule);\n * }\n * });\n * }\n */\n\n// Type for Vite HMR modules\nexport type ModuleNamespace = Record<string, any> & {\n [Symbol.toStringTag]: \"Module\";\n};\n\n/** `import.meta` extended with the minimal subset of Vite's HMR API used by the\n * codegen-generated `main.tsx`. Exported so consumer projects can cast\n * `import.meta` to it without pulling `vite/client` into their tsconfig `types`. */\nexport type ImportHmr = ImportMeta & {\n hot?: {\n accept(\n deps: readonly string[],\n cb: (mods: Array<ModuleNamespace | undefined>) => void,\n ): void;\n };\n};\n\nfunction updateLocalPackage(pkg: DocumentModelLib<any> | ModuleNamespace) {\n window.ph?.vetraPackageManager?.updateLocalPackage(pkg as DocumentModelLib);\n}\n\nexport function startConnect(localPackage: DocumentModelLib<any>) {\n // Rendered into the same root the skeleton was painted into, so the swap is\n // a reconciliation rather than a second mount point.\n if (root && components) {\n root.render(\n <components.AppLoader localPackage={localPackage as DocumentModelLib} />,\n );\n }\n\n return {\n updateLocalPackage,\n };\n}\n"],"names":[],"mappings":";;;;;AASA,MAAM,OAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"start-connect.js","sources":["../start-connect.tsx"],"sourcesContent":["import type { DocumentModelLib } from \"@powerhousedao/shared/document-model\";\nimport { bootConnect } from \"./src/boot.js\";\n\n// Paint the config-independent skeleton, then bootstrap the runtime config,\n// BEFORE the React tree imports. Any module that imports start-connect.tsx —\n// including the codegen-generated main.tsx — suspends on this top-level await,\n// so by the time the dynamic import of AppLoader resolves, the ConfigLoader\n// cache is warm and connect.config.ts can read getRuntimeConfig()\n// synchronously at module evaluation.\nconst root = await bootConnect();\n\n// `null` means startup failed and bootConnect has painted the error state; the\n// app graph must not be imported, since its modules read the config at\n// module-evaluation and would throw.\nconst components = root ? await import(\"./src/components/index.js\") : null;\n\n/* Starts your local dev server for Connect.\n *\n * Call this function with the export of your project's index.ts file in your main.tsx file like this:\n *\n * // main.tsx\n * import * as localPackage from \"./index.js\";\n * const { updateLocalPackage } = startConnect(localPackage);\n *\n * if (import.meta.hot) {\n * import.meta.hot.accept([\"./index.js\"], ([newModule]) => {\n * if (newModule) {\n * updateLocalPackage(newModule);\n * }\n * });\n * }\n */\n\n// Type for Vite HMR modules\nexport type ModuleNamespace = Record<string, any> & {\n [Symbol.toStringTag]: \"Module\";\n};\n\n/** `import.meta` extended with the minimal subset of Vite's HMR API used by the\n * codegen-generated `main.tsx`. Exported so consumer projects can cast\n * `import.meta` to it without pulling `vite/client` into their tsconfig `types`. */\nexport type ImportHmr = ImportMeta & {\n hot?: {\n accept(\n deps: readonly string[],\n cb: (mods: Array<ModuleNamespace | undefined>) => void,\n ): void;\n };\n};\n\nfunction updateLocalPackage(pkg: DocumentModelLib<any> | ModuleNamespace) {\n window.ph?.vetraPackageManager?.updateLocalPackage(pkg as DocumentModelLib);\n}\n\nexport function startConnect(localPackage: DocumentModelLib<any>) {\n // Rendered into the same root the skeleton was painted into, so the swap is\n // a reconciliation rather than a second mount point.\n if (root && components) {\n root.render(\n <components.AppLoader localPackage={localPackage as DocumentModelLib} />,\n );\n }\n\n return {\n updateLocalPackage,\n };\n}\n"],"names":[],"mappings":";;;;;AASA,MAAM,OAAO,MAAM,YAAY;AAK/B,MAAM,aAAa,OAAO,MAAM,OAAO,8BAA+B;AAoCtE,SAAS,mBAAmB,KAA8C;CACxE,OAAO,IAAI,qBAAqB,mBAAmB,GAAuB;AAC5E;AAEA,SAAgB,aAAa,cAAqC;CAGhE,IAAI,QAAQ,YACV,KAAK,OACH,oBAAC,WAAW,WAAZ,EAAoC,aAAmC,CAAA,CACzE;CAGF,OAAO,EACL,mBACF;AACF","debug_id":"fda83e80-3003-561a-9081-524c01d1842d"}
|