@powerhousedao/connect 6.2.1-dev.1 → 6.2.1-dev.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-B8rA-tV9.js → AddDriveModal-MMHlkJBJ.js} +9 -13
- package/dist/AddDriveModal-MMHlkJBJ.js.map +1 -0
- package/dist/{ClearStorageModal-Dod0ZsIu.js → ClearStorageModal-DeThXsqI.js} +4 -4
- package/dist/{ClearStorageModal-Dod0ZsIu.js.map → ClearStorageModal-DeThXsqI.js.map} +1 -1
- package/dist/{DebugSettingsModal-BGBAShRq.js → DebugSettingsModal-Dl7kZrqC.js} +6 -6
- package/dist/{DebugSettingsModal-BGBAShRq.js.map → DebugSettingsModal-Dl7kZrqC.js.map} +1 -1
- package/dist/{InspectorModal-CIY_bxvj.js → InspectorModal-DPpBTL-B.js} +6 -6
- package/dist/{InspectorModal-CIY_bxvj.js.map → InspectorModal-DPpBTL-B.js.map} +1 -1
- package/dist/{SettingsModal-C7MU6d_R.js → SettingsModal-pnRWLbWO.js} +6 -6
- package/dist/{SettingsModal-C7MU6d_R.js.map → SettingsModal-pnRWLbWO.js.map} +1 -1
- package/dist/app-loader-B-of1Hy9.js +4 -0
- package/dist/{app-loader-BN60fT1a.js → app-loader-CfWOK2Xg.js} +18 -18
- package/dist/app-loader-CfWOK2Xg.js.map +1 -0
- package/dist/{build-info-DDQU6IEU.js → build-info-Bh4NJN95.js} +5 -5
- package/dist/{build-info-DDQU6IEU.js.map → build-info-Bh4NJN95.js.map} +1 -1
- package/dist/{components-4guCur3r.js → components-B6LbVZoO.js} +3 -3
- package/dist/{connect.config-p8UTNojR.js → connect.config-vgUeFoNp.js} +16 -6
- package/dist/connect.config-vgUeFoNp.js.map +1 -0
- package/dist/{connection-state-B7b2E8-L.js → connection-state-BzO5CH3V.js} +4 -4
- package/dist/{connection-state-B7b2E8-L.js.map → connection-state-BzO5CH3V.js.map} +1 -1
- package/dist/{load-CNt0f-Sc.js → load-lfVTQVtO.js} +8 -8
- package/dist/{load-CNt0f-Sc.js.map → load-lfVTQVtO.js.map} +1 -1
- package/dist/main.js +1 -1
- package/dist/{package-DVUXDsvO.js → package-BCwOacyO.js} +4 -4
- package/dist/package-BCwOacyO.js.map +1 -0
- package/dist/{pglite-seed-OvaK2kRv.js → pglite-seed-TCgiFe8J.js} +4 -4
- package/dist/{pglite-seed-OvaK2kRv.js.map → pglite-seed-TCgiFe8J.js.map} +1 -1
- package/dist/{reactor-DFA8k_jH.js → reactor-BCkMl-Od.js} +15 -11
- package/dist/reactor-BCkMl-Od.js.map +1 -0
- package/dist/reactor.worker.js +12 -5
- package/dist/reactor.worker.js.map +1 -1
- package/dist/{registerServiceWorker-BGIXpgGV.js → registerServiceWorker-nJIc0yEY.js} +4 -4
- package/dist/{registerServiceWorker-BGIXpgGV.js.map → registerServiceWorker-nJIc0yEY.js.map} +1 -1
- package/dist/start-connect.js +1 -1
- package/package.json +11 -11
- package/dist/AddDriveModal-B8rA-tV9.js.map +0 -1
- package/dist/app-loader-BN60fT1a.js.map +0 -1
- package/dist/app-loader-BpNJlAZT.js +0 -4
- package/dist/connect.config-p8UTNojR.js.map +0 -1
- package/dist/package-DVUXDsvO.js.map +0 -1
- package/dist/reactor-DFA8k_jH.js.map +0 -1
|
@@ -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 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 * as vetraDocumentModels from \"@powerhousedao/vetra/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// Studio models the tab bundles as local packages; not CDN-loadable, so the worker imports them directly.\nconst bundledModelCandidates: unknown[] = [\n ...Object.values(commonDocumentModels),\n ...Object.values(vetraDocumentModels),\n];\nconst bundledDocumentModels = bundledModelCandidates.filter(\n (m): m is DocumentModelModule =>\n typeof m === \"object\" &&\n m !== null &&\n \"documentModel\" in m &&\n \"reducer\" in m,\n);\n\ntype WorkerConstruct = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\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() {\n const keyStorage = await BrowserKeyStorage.create();\n return new RenownCryptoBuilder().withKeyPairStorage(keyStorage).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 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 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 models = baseDocumentModels.concat(bundledDocumentModels, loaded);\n phase = \"opening pglite stores\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const [reactor, relationalMajor] = await Promise.all([\n openReactorPglite(construct.namespace),\n openRelational(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();\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 .withDocumentModels(models)\n .withChannelScheme(ChannelScheme.CONNECT)\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 \"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":"8c1df25e-941e-518a-9c1d-ab758077d702"}
|
|
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 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};\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() {\n const keyStorage = await BrowserKeyStorage.create();\n return new RenownCryptoBuilder().withKeyPairStorage(keyStorage).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 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 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 const [reactor, relationalMajor] = await Promise.all([\n openReactorPglite(construct.namespace),\n openRelational(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();\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 .withDocumentModels(models)\n .withChannelScheme(ChannelScheme.CONNECT)\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 \"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":";;;;;;;;;;;;;AA0DA,QAAQ,KAAK,qCAAqC;AAGlD,MAAM,kBAAkB;AAIxB,SAAS,uBAAuB,YAA8C;AAC5E,QAAO,WAAW,QACf,MACC,OAAO,MAAM,YACb,MAAM,QACN,mBAAmB,KACnB,aAAa,EAChB;;AAGH,MAAM,sBAAsB,uBAC1B,OAAO,OAAO,qBAAqB,CACpC;AAID,eAAe,0BAA0D;CACvE,MAAM,sBACJ,MAAM,OAAO;AACf,QAAO,uBAAuB,OAAO,OAAO,oBAAoB,CAAC;;AAenE,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AAKJ,MAAM,aAA8B,EAAE;AAStC,MAAM,QAAsB,EAAE;AAC9B,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI,kBAA0C;AAC9C,MAAM,iCAAiB,IAAI,KAAa;AAExC,SAAS,SAAS,QAAqC;AACrD,QAAO,GAAG,OAAO,cAAc,OAAO,GAAG,GAAG,OAAO,WAAW;;AAIhE,SAAS,aAAa,QAAgB;AACpC,QAAO;EACL,MAAM,OAAO;EACb,iBAAiB,OAAO,QAAQ,oBAAoB;EACrD;;AAIH,SAAS,qBAA2B;AAClC,KAAI,CAAC,UAAU,CAAC,SACd;CAEF,MAAM,QAAQ,OAAO,OAAO,QAAQ,MAAM,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC,CAAC;AAC3E,KAAI,MAAM,WAAW,EACnB;AAEF,UAAS,gBAAgB,GAAG,MAAM;AAClC,MAAK,MAAM,KAAK,MACd,gBAAe,IAAI,SAAS,EAAE,CAAC;;AAKnC,eAAe,oBAAoB;CACjC,MAAM,aAAa,MAAM,kBAAkB,QAAQ;AACnD,QAAO,IAAI,qBAAqB,CAAC,mBAAmB,WAAW,CAAC,OAAO;;AAIzE,eAAe,kBAAkB,WAAmB;CAClD,MAAM,WAAW,YAAY,MAAM,kBAAkB,WAAW,YAAY,CAAC;CAC7E,MAAM,QAAQ,yBAAyB,SAAS;AAChD,KAAI,UAAU,GACZ,SAAQ,KACN,qEAAqE,MAAM,8DAC5E;CAEH,MAAM,EAAE,WAAW,MAAM,iBAAiB,MAAM;AAEhD,QAAO;EAAE,IADE,IAAI,OAAO,SAAS,aAAa,EAAE,mBAAmB,MAAM,CAAC;EAC3D;EAAU;;AAKzB,eAAe,WAAW,OAAgD;AACxE,KAAI,UAAU,GACZ,QAAO,OAAO;AAEhB,QAAO,OAAO;;AAGhB,eAAe,eAAe,WAA2C;AACvE,KAAI;EACF,MAAM,WAAW,YACf,MAAM,kBAAkB,WAAW,YAAY,CAChD;EACD,MAAM,QAAQ,yBAAyB,SAAS;AAChD,MAAI,UAAU,GACZ,SAAQ,KACN,8EAA8E,MAAM,8DACrF;EAEH,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,MAAM,QAAQ,IAAI,CAC/C,iBAAiB,MAAM,EACvB,WAAW,MAAM,CAClB,CAAC;EACF,MAAM,KAAK,IAAI,OAAO,SAAS,aAAa;GAC1C,mBAAmB;GACnB,YAAY,EAAE,MAAM;GACrB,CAAC;AACF,aAAW,KAAK;AAChB,aAAW,KAAK,mBACd,IAAI,OAAO,EAAE,SAAS,IAAI,cAAc,GAAG,EAAE,CAAC,CAC/C;AACD,UAAQ,KACN,mDAAmD,UAAU,aAAa,MAAM,IACjF;AACD,SAAO;UACA,OAAO;AACd,UAAQ,MACN,yDACA,MACD;AACD,SAAO;;;AAIX,IAAI,iBAAuC,EAAE,QAAQ,QAAQ;AAE7D,SAAS,aAAa,OAAmC;AACvD,kBAAiB;AACjB,MAAK,kBAAkB,MAAM;;AAG/B,MAAM,iBAAiC;CACrC,WAAW,YAAY,aAAa,QAAQ;CAC5C,WAAW,QAAQ,YACjB,cAAc,SAAS,OAA0B;CACnD,eAAe,QAAQ,SAAS;CAChC,cAAc,QAAQ,SAAS;CAChC;AAID,MAAM,OAAO,IAAI,YAAY;CAC3B,WAHkB,KAA2B,QAAQ;CAIrD,sBACE,KAAK,gBAAgB,iBAAiB,OAAO,YAAY,CAAC;CAC5D,qBAAqB,YAAY;AAC/B,QAAM,WAAW,IAAI,OAAO;AAC5B,QAAM,MAAM,WAAW,OAAO;AAC9B,OAAK,MAAM,WAAW,CAAC,MAAM,YAAY,MAAM,cAAc,CAC3D,KAAI,QACF,OAAM,cAAc,QAAQ;AAGhC,OAAK,gBAAgB,mBAAmB,OAAO,YAAY,CAAC;;CAE9D,gBAAgB,YAAY;AAC1B,eAAa;GACX,QAAQ;GACR,aAAa,eAAe;GAC7B,CAAC;AACF,MAAI,WAAW,GAAI,OAAM,WAAW,GAAG,OAAO,CAAC,YAAY,KAAA,EAAU;AACrE,MAAI,MAAM,UAAW,OAAM,MAAM,UAAU,OAAO,CAAC,YAAY,KAAA,EAAU;AACzE,MAAI;AACF,QAAK,MAAM,WAAW,CAAC,MAAM,YAAY,MAAM,cAAc,CAC3D,KAAI,QACF,OAAM,WACJ,UACC,UACC,aAAa;IACX,QAAQ;IACR,aAAa,eAAe;IAC5B;IACD,CAAC,EACJ,eACD;AAGL,QAAK,gBAAgB,sBAAsB,OAAO,YAAY,CAAC;WACxD,OAAO;AACd,WAAQ,MAAM,sCAAsC,MAAM;AAC1D,gBAAa;IACX,QAAQ;IACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9D,CAAC;AACF,QAAK,gBAAgB,oBAAoB,OAAO,YAAY,CAAC;;;CAGjE,OAAO,OAAO,QAAQ;EACpB,IAAI,QAAQ;AACZ,MAAI;GACF,MAAM,YAAY;AAClB,WAAQ;AACR,WAAQ,KAAK,0BAA0B,QAAQ;AAC/C,YAAS,IAAI,oBAAoB;IAC/B,QAAQ,UAAU;IAClB,gBAAgB,QACd;;KAA0B;;IAC7B,CAAC;GACF,MAAM,SAAS,MAAM,OAAO,aAAa,UAAU,aAAa;GAChE,MAAM,cAAc,UAAU,aAC1B,MAAM,yBAAyB,GAC/B,EAAE;GACN,MAAM,SAAS,mBAAmB,OAChC,qBACA,aACA,OACD;AACD,WAAQ;AACR,WAAQ,KAAK,0BAA0B,QAAQ;GAC/C,MAAM,CAAC,SAAS,mBAAmB,MAAM,QAAQ,IAAI,CACnD,kBAAkB,UAAU,UAAU,EACtC,eAAe,UAAU,oBAAoB,CAC9C,CAAC;GACF,MAAM,KAAK,QAAQ;AACnB,SAAM,YAAY;AAClB,SAAM,aAAa,WAAW,UAAU;AACxC,SAAM,gBAAgB,WAAW,UAAU;GAG3C,MAAM,cAAc,CAAC,QAAQ,UAAU,gBAAgB,CAAC,MACrD,MAA6B,MAAM,QAAQ,MAAA,GAC7C;AACD,OAAI,gBAAgB,KAAA,EAClB,cAAa;IAAE,QAAQ;IAAU;IAAa,CAAC;AAEjD,WAAQ;AACR,WAAQ,KAAK,0BAA0B,QAAQ;GAC/C,MAAM,SAAS,MAAM,mBAAmB;AACxC,YAAS,IAAI,mBACX,QACA,iBACA,mBAAmB,KAAA,EACpB;GACD,MAAM,aAAyB,YAC7B,kBACI,OAAO,eAAe,gBAAgB,SAAS,EAAE,WAAW,IAAI,CAAC,GACjE,KAAA;AACN,WAAQ;AACR,WAAQ,KAAK,0BAA0B,QAAQ;GAC/C,MAAM,UAAU,IAAI,sBAAsB,CACvC,WAAW;IAAE;IAAQ,UAAU,yBAAyB;IAAE,CAAC,CAC3D,mBACC,IAAI,gBAAgB,CACjB,mBAAmB,OAAO,CAC1B,kBAAkB,cAAc,QAAQ,CACxC,eAAe,WAAW,CAC1B,WACC,IAAI,OAAiB,EAAE,SAAS,IAAI,cAAc,GAAG,EAAE,CAAC,CACzD,CACJ;AACH,WAAQ,wBAAwB,OAAO;GACvC,MAAM,SAAS,MAAM,QAAQ,aAAa;AAC1C,cAAW,OAAO,eAAe;AACjC,iBAAc,OAAO,eAAe,YAAY;GAChD,MAAM,KAAK,OAAO;AAClB,OAAI,IAAI;AACN,qBACE,GAAG,iBAAiB,gBAAgB,GAAG,QAAQ,KAAA;AACjD,0BAAsB,GAAG;AACzB,yBAAqB,IAAI,yBACvB,GAAG,eACH,GAAG,gBACH,GAAG,YACH,GAAG,cACH,GAAG,sBACJ;;AAEH,QAAK,MAAM,KAAK,OACd,gBAAe,IAAI,SAAS,EAAE,CAAC;AAEjC,QAAK,MAAM,QAAQ,sBACjB,QAAO,SAAS,UAAU,OAAO,eAAe,UAC9C,KAAK,kBAAkB,eAAe,MAAM,CAC7C;AAEH,gBAAa,oBAAoB,YAAY,WAC3C,KAAK,kBAAkB,2BAA2B;IAChD;IACA;IACD,CAAC,CACH;AACD,WAAQ,KAAK,kCAAkC;AAC/C,UAAO,OAAO;WACP,OAAO;AACd,WAAQ,MAAM,0CAA0C,MAAM,KAAK,MAAM;AACzE,SAAM;;;CAGV,kBAAkB,OAAO,UAAU;AACjC,MAAI,CAAC,OACH;AAEF,QAAM,OAAO,aAAa,MAAM;AAChC,sBAAoB;;CAEtB,aAAa,SAAS;AACpB,oBAAkB;AAClB,MAAI,OACF,QAAO,OAAO,QAAQ,KAAA;;CAG1B,UAAU,OAAO,QAAQ,SAAS;AAChC,MAAI,CAAC,YACH,OAAM,IAAI,MAAM,4BAA4B;AAE9C,UAAQ,QAAR;GACE,KAAK,OACH,QAAO,YAAY,MAAM,CAAC,IAAI,aAAa;GAC7C,KAAK,OAAO;IACV,MAAM,CAAC,MAAM,iBAAiB,eAAe,QAAQ,WACnD;AAcF,WAAO,aAPQ,MAAM,YAAY,IAC/B,MACA,kBAAkB,QAAQ,gBAAgB,EAC1C,eACA,QACA,QACD,CAC0B;;GAE7B,KAAK;AACH,UAAM,YAAY,OAAO,KAAK,GAAa;AAC3C;GACF,KAAK;AACH,gBAAY,YAAY,KAAK,GAAa;AAC1C;GACF,QACE,OAAM,IAAI,MAAM,oBAAoB,SAAS;;;CAGnD,QAAQ,OAAO,QAAQ,SAAS;AAC9B,MAAI,CAAC,WAAW,GACd,OAAM,IAAI,MAAM,iCAAiC;AAEnD,UAAQ,QAAR;GACE,KAAK,SAAS;IACZ,MAAM,CAAC,KAAK,UAAU;AAEtB,YADe,MAAM,WAAW,GAAG,MAAM,KAAK,OAAO,EACvC;;GAEhB,QACE,OAAM,IAAI,MAAM,kBAAkB,SAAS;;;CAGjD,aAAa,OAAO,KAAK,QAAQ,cAAc;AAC7C,MAAI,CAAC,WAAW,GACd,OAAM,IAAI,MAAM,iCAAiC;EAEnD,MAAM,OAAO,MAAM,WAAW,GAAG,KAAK,MAAM,KAAK,SAAS,YACxD,UAAU,QAAQ,CACnB;AACD,eAAa;AACN,QAAK,aAAa;;;CAG3B,eAAe,OAAO,QAAQ,SAAS;AACrC,UAAQ,QAAR;GACE,KAAK,kBAAkB;AACrB,QAAI,CAAC,eACH,QAAO;KACL,UAAU;KACV,aAAa,EAAE;KACf,eAAe,EAAE;KACjB,cAAc;KACd,gBAAgB;KACjB;IAEH,MAAM,cAAc,eAAe,gBAAgB;IACnD,MAAM,gBAAgB,EAAE;AACxB,SAAK,MAAM,UAAU,eAAe,oBAAoB,CAAC,QAAQ,CAC/D,MAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,MAAM,eAAe,OAAO,MAAM;AACxC,SAAI,IACF,eAAc,KAAK,IAAI;;AAI7B,WAAO;KACL,UAAU,eAAe;KACzB;KACA;KACA,cAAc,YAAY;KAC1B,gBAAgB,cAAc;KAC/B;;GAEH,KAAK;AACH,oBAAgB,OAAO;AACvB;GACF,KAAK;AACH,UAAM,gBAAgB,QAAQ;AAC9B;GACF,KAAK,oBACH,SAAQ,qBAAqB,QAAQ,IAAI,EAAE,EAAE,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;IAC7B,EAAE;GACL,KAAK,oBAAoB;IACvB,MAAM,CAAC,eAAe;AACtB,UAAM,qBAAqB,IAAI,YAAY,EAAE,OAAO;AACpD;;GAEF,KAAK,sBAAsB;AACzB,QAAI,CAAC,mBACH,OAAM,IAAI,MAAM,kCAAkC;IAEpD,MAAM,CAAC,YAAY,UAAU;AAC7B,WAAO,mBAAmB,iBAAiB,YAAY,OAAO;;GAEhE,KAAK,8BAA8B;AACjC,QAAI,CAAC,mBACH,OAAM,IAAI,MAAM,kCAAkC;IAEpD,MAAM,CAAC,YAAY,UAAU;AAC7B,WAAO,mBAAmB,iBAAiB,YAAY,OAAO;;GAEhE,KAAK,8BAA8B;AACjC,QAAI,CAAC,mBACH,OAAM,IAAI,MAAM,kCAAkC;IAEpD,MAAM,CAAC,YAAY,UAAU;AAC7B,WAAO,mBAAmB,iBAAiB,YAAY,OAAO;;GAEhE,KAAK,YAAY;AACf,QAAI,CAAC,MAAM,UACT,OAAM,IAAI,MAAM,8BAA8B;IAEhD,MAAM,CAAC,KAAK,UAAU;AAEtB,YADe,MAAM,MAAM,UAAU,MAAM,KAAK,OAAO,EACzC;;GAEhB,QACE,OAAM,IAAI,MAAM,yBAAyB,SAAS;;;CAGzD,CAAC;AAQF,MAAM,cAAc;AAQpB,YAAY,iBAAiB,UAAU,UAAU;AAC/C,SAAQ,MACN,mCACA,MAAM,WAAW,MAAM,SAAS,MACjC;EACD;AACF,YAAY,iBAAiB,uBAAuB,UAAU;AAC5D,SAAQ,MAAM,wCAAwC,MAAM,OAAO;EACnE;AAEF,YAAY,aAAa,UAAU;CACjC,MAAM,OAAO,MAAM,MAAM;AACzB,KAAI,KACF,KAAI;AACF,OAAK,YAAY,KAAK;UACf,OAAO;AACd,UAAQ,MAAM,2CAA2C,MAAM","debug_id":"f75dcc63-6708-5346-bc6d-2602d8321cd8"}
|
|
@@ -1,6 +1,6 @@
|
|
|
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-
|
|
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]="9dd758a7-d4b4-55cf-8fad-8fc2791ec1b0")}catch(e){}}();
|
|
3
|
+
import { r as connectConfig } from "./connect.config-vgUeFoNp.js";
|
|
4
4
|
//#region src/utils/registerServiceWorker.ts
|
|
5
5
|
const serviceWorkerScriptPath = [connectConfig.routerBasename, "service-worker.js"].join("/").replace(/\/{2,}/gm, "/");
|
|
6
6
|
let updateAvailable = false;
|
|
@@ -123,5 +123,5 @@ const serviceWorkerManager = new ServiceWorkerManager();
|
|
|
123
123
|
//#endregion
|
|
124
124
|
export { serviceWorkerManager as n, subscribeServiceWorkerUpdate as r, getServiceWorkerUpdateAvailable as t };
|
|
125
125
|
|
|
126
|
-
//# sourceMappingURL=registerServiceWorker-
|
|
127
|
-
//# debugId=
|
|
126
|
+
//# sourceMappingURL=registerServiceWorker-nJIc0yEY.js.map
|
|
127
|
+
//# debugId=9dd758a7-d4b4-55cf-8fad-8fc2791ec1b0
|
package/dist/{registerServiceWorker-BGIXpgGV.js.map → registerServiceWorker-nJIc0yEY.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerServiceWorker-
|
|
1
|
+
{"version":3,"file":"registerServiceWorker-nJIc0yEY.js","sources":["../src/utils/registerServiceWorker.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\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: Workbox (generateSW + prompt mode)\n// parks a new worker as \"waiting\"; 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 // 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":["#log","#trackInstalling","#register","#warmRuntimeConfigCache","#updateAccepted","#reloading","#handleRegistration"],"mappings":";;;;AAIA,MAAM,0BAA0B,CAFf,cAAc,gBAEY,oBAAoB,CAC5D,KAAK,IAAI,CACT,QAAQ,YAAY,IAAI;AAM3B,IAAI,kBAAkB;AACtB,MAAM,kCAAkB,IAAI,KAAiB;AAE7C,SAAS,mBAAmB,OAAgB;AAC1C,KAAI,oBAAoB,MAAO;AAC/B,mBAAkB;AAClB,MAAK,MAAM,YAAY,gBAAiB,WAAU;;AAGpD,SAAgB,6BAA6B,IAA4B;AACvE,iBAAgB,IAAI,GAAG;AACvB,cAAa;AACX,kBAAgB,OAAO,GAAG;;;AAI9B,SAAgB,kCAA2C;AACzD,QAAO;;AAGT,IAAM,uBAAN,MAA2B;CACzB,QAAQ;CACR,QAAQ;CACR,eAAiD;CAIjD,kBAAkB;CAClB,aAAa;CAEb,YAAY,QAAQ,OAAO;AACzB,OAAK,QAAQ;;CAGf,SAAS,OAAgB;AACvB,OAAK,QAAQ;;CAGf,KAAK,GAAG,MAAiB;AACvB,MAAI,KAAK,MAAO,SAAQ,IAAI,mBAAmB,GAAG,KAAK;;CAKzD,iBAAiB,QAA8B;AAC7C,MAAI,CAAC,OAAQ;AACb,SAAO,iBAAiB,qBAAqB;AAC3C,OAAI,OAAO,UAAU,eAAe,UAAU,cAAc,YAAY;AACtE,UAAA,IAAU,oCAAoC;AAC9C,uBAAmB,KAAK;;IAE1B;;CAGJ,oBAAoB,cAAyC;AAC3D,OAAK,eAAe;AACpB,OAAK,QAAQ;AACb,QAAA,IAAU,cAAc,aAAa;AAGrC,MAAI,aAAa,WAAW,UAAU,cAAc,WAClD,oBAAmB,KAAK;AAG1B,QAAA,gBAAsB,aAAa,WAAW;AAC9C,eAAa,iBAAiB,qBAAqB;AACjD,SAAA,gBAAsB,aAAa,WAAW;IAC9C;;CAGJ,OAAA,WAAkB;AAChB,MAAI;AACF,aAAU,cAAc,iBAAiB,0BAA0B;AAIjE,UAAA,wBAA8B;AAE9B,QAAI,CAAC,MAAA,kBAAwB,MAAA,UAAiB;AAC9C,UAAA,YAAkB;AAClB,WAAO,SAAS,QAAQ;KACxB;GAEF,MAAM,WAAW,MAAM,UAAU,cAAc,iBAAiB;AAChE,OAAI,UAAU;AACZ,UAAA,mBAAyB,SAAS;AAGlC,UAAM,SAAS,QAAQ;UAClB;IACL,MAAM,eAAe,MAAM,UAAU,cAAc,SACjD,wBACD;AACD,UAAA,mBAAyB,aAAa;;GAIxC,MAAM,aAAa,kBAAkB;AACnC,KAAM,YAAY;KAChB,MAAM,MAAM,MAAM,UAAU,cAAc,iBAAiB;AAC3D,SAAI,CAAC,KAAK;AACR,oBAAc,WAAW;AACzB;;AAKF,SAAI,IAAI,cAAc,CAAC,UAAU,OAAQ;AACzC,WAAM,IAAI,QAAQ;QAChB;MACH,cAAc,wBAAwB;WAClC,OAAO;AACd,WAAQ,MAAM,uCAAuC,MAAM;;;CAI/D,sBAAsB,QAAQ,OAAO;AACnC,OAAK,QAAQ;AAEb,MAAI,EAAE,mBAAmB,YAAY;AACnC,WAAQ,KAAK,+BAA+B;AAC5C;;EAEF,MAAM,cAAc;AAClB,SAAA,UAAgB,CAAC,MAAM,QAAQ,MAAM;;AAMvC,MAAI,SAAS,eAAe,WAC1B,QAAO;MAEP,QAAO,iBAAiB,QAAQ,OAAO,EAAE,MAAM,MAAM,CAAC;;CAQ1D,0BAA0B;AACnB,QAAM,GAAG,OAAO,KAAK,IAAI,SAAS,wBAAwB,CAAC,YACxD,GACP;;CAIH,cAAc;AACZ,qBAAmB,MAAM;EACzB,MAAM,UAAU,KAAK,cAAc;AACnC,MAAI,CAAC,SAAS;AAGZ,SAAA,YAAkB;AAClB,UAAO,SAAS,QAAQ;AACxB;;AAEF,QAAA,iBAAuB;AACvB,UAAQ,YAAY,EAAE,MAAM,gBAAgB,CAAC;;CAG/C,YAAY,SAAkB;AAK5B,GAHE,KAAK,cAAc,UACnB,KAAK,cAAc,WACnB,UAAU,cAAc,aAClB,YAAY,QAAQ;;CAK9B,MAAM,gBAAgB;AACpB,MAAI,EAAE,mBAAmB,WAAY;EACrC,MAAM,gBAAgB,MAAM,UAAU,cAAc,kBAAkB;AACtE,QAAM,QAAQ,IAAI,cAAc,KAAK,MAAM,EAAE,YAAY,CAAC,CAAC;;;AAI/D,MAAa,uBAAuB,IAAI,sBAAsB","debug_id":"9dd758a7-d4b4-55cf-8fad-8fc2791ec1b0"}
|
package/dist/start-connect.js
CHANGED
|
@@ -5,7 +5,7 @@ import { createRoot } from "react-dom/client";
|
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
6
|
//#region start-connect.tsx
|
|
7
7
|
await loadRuntimeConfig();
|
|
8
|
-
const { AppLoader } = await import("./components-
|
|
8
|
+
const { AppLoader } = await import("./components-B6LbVZoO.js");
|
|
9
9
|
function updateLocalPackage(pkg) {
|
|
10
10
|
window.ph?.vetraPackageManager?.updateLocalPackage(pkg);
|
|
11
11
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/connect",
|
|
3
3
|
"productName": "Powerhouse-Connect",
|
|
4
|
-
"version": "6.2.1-dev.
|
|
4
|
+
"version": "6.2.1-dev.3",
|
|
5
5
|
"description": "Powerhouse Connect",
|
|
6
6
|
"main": "dist/index.html",
|
|
7
7
|
"type": "module",
|
|
@@ -70,16 +70,16 @@
|
|
|
70
70
|
"tailwind-merge": "3.4.0",
|
|
71
71
|
"usehooks-ts": "^3.1.1",
|
|
72
72
|
"zod": "4.3.6",
|
|
73
|
-
"@powerhousedao/
|
|
74
|
-
"@powerhousedao/
|
|
75
|
-
"@powerhousedao/
|
|
76
|
-
"@powerhousedao/reactor": "6.2.1-dev.
|
|
77
|
-
"@powerhousedao/
|
|
78
|
-
"@powerhousedao/shared": "6.2.1-dev.
|
|
79
|
-
"@
|
|
80
|
-
"@powerhousedao/
|
|
81
|
-
"@
|
|
82
|
-
"document-model": "6.2.1-dev.
|
|
73
|
+
"@powerhousedao/reactor-attachments": "6.2.1-dev.3",
|
|
74
|
+
"@powerhousedao/powerhouse-vetra-packages": "6.2.1-dev.3",
|
|
75
|
+
"@powerhousedao/reactor": "6.2.1-dev.3",
|
|
76
|
+
"@powerhousedao/reactor-browser": "6.2.1-dev.3",
|
|
77
|
+
"@powerhousedao/vetra": "6.2.1-dev.3",
|
|
78
|
+
"@powerhousedao/shared": "6.2.1-dev.3",
|
|
79
|
+
"@renown/sdk": "6.2.1-dev.3",
|
|
80
|
+
"@powerhousedao/design-system": "6.2.1-dev.3",
|
|
81
|
+
"@powerhousedao/config": "6.2.1-dev.3",
|
|
82
|
+
"document-model": "6.2.1-dev.3"
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
85
85
|
"@tailwindcss/cli": "4.2.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AddDriveModal-B8rA-tV9.js","sources":["../src/utils/create-drive-app-options.ts","../src/components/modal/modals/AddDriveModal.tsx"],"sourcesContent":["import type { AppOptions } from \"@powerhousedao/design-system/connect\";\nimport type { EditorModule } from \"document-model\";\n\n/** Hidden from the Create Drive picker for now — re-enable when ready. */\nconst HIDDEN_CREATE_DRIVE_APP_IDS = new Set([\"vetra-drive-app\"]);\n\n/** Generic explorer; always listed last when other drive apps are available. */\nconst DEFAULT_DRIVE_EXPLORER_APP_ID = \"GenericDriveExplorer\";\n\nexport function getCreateDriveAppOptions(\n appModules: EditorModule[] | undefined,\n): AppOptions[] {\n if (!appModules?.length) {\n return [];\n }\n\n return appModules\n .filter((pkg) => !HIDDEN_CREATE_DRIVE_APP_IDS.has(pkg.config.id))\n .map((pkg) => ({\n id: pkg.config.id,\n name: pkg.config.name,\n sharingType: \"LOCAL\" as const,\n availableOffline: false,\n }))\n .sort((a, b) => {\n const aIsDefaultExplorer = a.id === DEFAULT_DRIVE_EXPLORER_APP_ID;\n const bIsDefaultExplorer = b.id === DEFAULT_DRIVE_EXPLORER_APP_ID;\n if (aIsDefaultExplorer === bIsDefaultExplorer) {\n return 0;\n }\n return aIsDefaultExplorer ? 1 : -1;\n });\n}\n","import { toast } from \"@powerhousedao/connect/services\";\nimport type {\n AddRemoteDriveInput,\n AppOptions,\n} from \"@powerhousedao/design-system/connect\";\nimport { AddDriveModal as ConnectAddLocalDriveModal } from \"@powerhousedao/design-system/connect\";\nimport {\n addDrive,\n addRemoteDrive,\n closePHModal,\n extractDriveSlugFromPath,\n getDrives,\n setSelectedDrive,\n useAppModules,\n usePHModal,\n useRenown,\n useUser,\n waitForDocumentReady,\n} from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\nimport { getCreateDriveAppOptions } from \"../../../utils/create-drive-app-options.js\";\n\n// Max wait for a remote drive's initial sync before skipping navigation.\n// Safe to be generous: navigation only fires if the user is still on home.\nconst REMOTE_DRIVE_NAV_TIMEOUT_MS = 30_000;\n\nasync function requestPublicDriveFromReactor(\n url: string,\n headers?: Record<string, string>,\n): Promise<{ id: string; name: string }> {\n const response = await fetch(url, { headers: headers ?? {} });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n return (await response.json()) as { id: string; name: string };\n}\n\nexport function AddDriveModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"addDrive\";\n const user = useUser();\n const renown = useRenown();\n const appModules = useAppModules();\n const onAddLocalDrive = async (data: AppOptions) => {\n try {\n const app = appModules?.find((a) => a.config.id === data.id);\n const newDrive = await addDrive(\n {\n id: \"\",\n slug: \"\",\n global: {\n name: data.name,\n icon: null,\n },\n local: {\n availableOffline: data.availableOffline,\n sharingType: data.sharingType.toLowerCase(),\n listeners: [],\n triggers: [],\n },\n },\n app?.config.id,\n );\n\n toast(t(\"notifications.addDriveSuccess\"), {\n type: \"connect-success\",\n });\n\n if (!newDrive) {\n return;\n }\n\n setSelectedDrive(newDrive);\n } catch (e) {\n console.error(e);\n }\n };\n\n const onAddRemoteDrive = async (data: AddRemoteDriveInput) => {\n try {\n const driveId = await addRemoteDrive(data.url, data.id);\n\n toast(t(\"notifications.addDriveSuccess\"), {\n type: \"connect-success\",\n });\n\n // Navigate into the drive if its initial sync lands in time.\n // Not awaited so the modal closes immediately.\n const reactorClient = window.ph?.reactorClient;\n // Only a still unselected, un-pinned (home) view gets pulled into the\n // new drive — the user may have navigated elsewhere meanwhile.\n const stillOnHome = () =>\n !window.ph?.selectedDriveId &&\n !extractDriveSlugFromPath(window.location.pathname);\n void (async () => {\n try {\n if (!reactorClient) {\n return;\n }\n await waitForDocumentReady(reactorClient, driveId, {\n timeoutMs: REMOTE_DRIVE_NAV_TIMEOUT_MS,\n });\n const drives = await getDrives(reactorClient);\n const drive = drives.find((d) => d.header.id === driveId);\n if (drive && stillOnHome()) {\n setSelectedDrive(drive);\n }\n } catch {\n // sync still in flight — the drive shows up on home once it lands\n }\n })();\n } catch (e) {\n console.error(e);\n }\n };\n async function onAddLocalDriveSubmit(data: AppOptions) {\n await onAddLocalDrive(data);\n closePHModal();\n }\n\n async function onAddRemoteDriveSubmit(data: AddRemoteDriveInput) {\n await onAddRemoteDrive(data);\n closePHModal();\n }\n\n const ready = !!appModules?.length;\n\n return (\n <ConnectAddLocalDriveModal\n open={open && ready}\n onAddLocalDrive={(data) => {\n void onAddLocalDriveSubmit(data);\n }}\n onAddRemoteDrive={(data) => {\n void onAddRemoteDriveSubmit(data);\n }}\n requestPublicDrive={async (url: string) => {\n try {\n if (user) {\n // aud omitted: server verifies without an audience, so aud-bearing\n // tokens are rejected. Re-enable once both sides support it.\n const authToken = await renown?.getBearerToken?.({\n expiresIn: 10,\n });\n return requestPublicDriveFromReactor(url, {\n Authorization: `Bearer ${authToken}`,\n });\n }\n return requestPublicDriveFromReactor(url);\n } catch (error) {\n console.error(error);\n return requestPublicDriveFromReactor(url);\n }\n }}\n onOpenChange={(status) => {\n if (!status) return closePHModal();\n }}\n appOptions={getCreateDriveAppOptions(appModules)}\n />\n );\n}\n"],"names":["ConnectAddLocalDriveModal"],"mappings":"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","debug_id":"9fed1e6b-e42c-5e6e-8917-ff924b93d89e"}
|