@powerhousedao/connect 6.2.3-dev.31 → 6.2.3-dev.33

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.
Files changed (47) hide show
  1. package/dist/{ClearStorageModal-a7dk64ub.js → ClearStorageModal-CyQfpQgd.js} +4 -4
  2. package/dist/{ClearStorageModal-a7dk64ub.js.map → ClearStorageModal-CyQfpQgd.js.map} +1 -1
  3. package/dist/{DebugSettingsModal-D_S1LnBH.js → DebugSettingsModal-ftX1TEN_.js} +6 -6
  4. package/dist/{DebugSettingsModal-D_S1LnBH.js.map → DebugSettingsModal-ftX1TEN_.js.map} +1 -1
  5. package/dist/{InspectorModal-sOCQEpKA.js → InspectorModal-CGdyIReA.js} +56 -18
  6. package/dist/InspectorModal-CGdyIReA.js.map +1 -0
  7. package/dist/{OpenFileDocumentsModal-tCrGCLLF.js → OpenFileDocumentsModal-BtbrRLj_.js} +4 -4
  8. package/dist/{OpenFileDocumentsModal-tCrGCLLF.js.map → OpenFileDocumentsModal-BtbrRLj_.js.map} +1 -1
  9. package/dist/{SettingsModal-BnQVmt3Z.js → SettingsModal-CCK6biQm.js} +6 -6
  10. package/dist/{SettingsModal-BnQVmt3Z.js.map → SettingsModal-CCK6biQm.js.map} +1 -1
  11. package/dist/app-loader-HZ41uC1O.js +4 -0
  12. package/dist/{app-loader-D5-KfjU4.js → app-loader-eIErMqM8.js} +53 -17
  13. package/dist/app-loader-eIErMqM8.js.map +1 -0
  14. package/dist/{build-info-B31oFKR6.js → build-info-CNHv6iwN.js} +5 -5
  15. package/dist/{build-info-B31oFKR6.js.map → build-info-CNHv6iwN.js.map} +1 -1
  16. package/dist/{components-e-CRRtTY.js → components-DoZMPd0b.js} +3 -3
  17. package/dist/{connect.config-Dgs13R1s.js → connect.config-CaXMoB42.js} +20 -9
  18. package/dist/connect.config-CaXMoB42.js.map +1 -0
  19. package/dist/{connection-state-Cy8xRCm_.js → connection-state-Eqc2izmt.js} +5 -5
  20. package/dist/{connection-state-Cy8xRCm_.js.map → connection-state-Eqc2izmt.js.map} +1 -1
  21. package/dist/{cookie-banner-CSF930bl.js → cookie-banner-BxXvPdIY.js} +4 -4
  22. package/dist/{cookie-banner-CSF930bl.js.map → cookie-banner-BxXvPdIY.js.map} +1 -1
  23. package/dist/{load-B7_AbI5f.js → load-DV4AXFcM.js} +8 -8
  24. package/dist/{load-B7_AbI5f.js.map → load-DV4AXFcM.js.map} +1 -1
  25. package/dist/main.js +1 -1
  26. package/dist/{pglite-major-BbmMK26m.js → pglite-major-p4_YefAE.js} +23 -5
  27. package/dist/pglite-major-p4_YefAE.js.map +1 -0
  28. package/dist/{pglite-migrate-core-o88cWesm.js → pglite-migrate-core-BcXcImng.js} +4 -4
  29. package/dist/{pglite-migrate-core-o88cWesm.js.map → pglite-migrate-core-BcXcImng.js.map} +1 -1
  30. package/dist/{pglite-seed-D6fqQApT.js → pglite-seed-Cl2d-iyl.js} +4 -4
  31. package/dist/{pglite-seed-D6fqQApT.js.map → pglite-seed-Cl2d-iyl.js.map} +1 -1
  32. package/dist/{preferences-store-Bekp7tv-.js → preferences-store-DZUIAkHE.js} +4 -4
  33. package/dist/{preferences-store-Bekp7tv-.js.map → preferences-store-DZUIAkHE.js.map} +1 -1
  34. package/dist/{reactor-BmQPQNmi.js → reactor--yIPUbFV.js} +21 -11
  35. package/dist/reactor--yIPUbFV.js.map +1 -0
  36. package/dist/reactor.worker.js +33 -6
  37. package/dist/reactor.worker.js.map +1 -1
  38. package/dist/{registerServiceWorker-Cy1G2rCq.js → registerServiceWorker-smkROQhm.js} +4 -4
  39. package/dist/{registerServiceWorker-Cy1G2rCq.js.map → registerServiceWorker-smkROQhm.js.map} +1 -1
  40. package/dist/start-connect.js +1 -1
  41. package/package.json +13 -13
  42. package/dist/InspectorModal-sOCQEpKA.js.map +0 -1
  43. package/dist/app-loader-D5-KfjU4.js.map +0 -1
  44. package/dist/app-loader-DmJ10OyR.js +0 -4
  45. package/dist/connect.config-Dgs13R1s.js.map +0 -1
  46. package/dist/pglite-major-BbmMK26m.js.map +0 -1
  47. package/dist/reactor-BmQPQNmi.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"connection-state-Cy8xRCm_.js","sources":["../src/utils/reactor-namespace.ts","../src/utils/storage-namespace.ts","../src/utils/pglite-runtime.ts","../src/connection-state.ts"],"sourcesContent":["import { getStorageNamespace } from \"@powerhousedao/shared/connect\";\nimport { hashNamespace } from \"@powerhousedao/shared/processors\";\n\nexport type ReactorNamespaceInput = {\n basePath: string;\n explicit?: string;\n endpoint?: string;\n};\n\nexport function resolveReactorNamespace(input: ReactorNamespaceInput): string {\n const explicit = input.explicit?.trim();\n if (explicit) {\n return explicit;\n }\n const base = getStorageNamespace(input.basePath);\n const endpoint = input.endpoint?.trim();\n if (endpoint) {\n return `${base}--${hashNamespace(endpoint, 8)}`;\n }\n return base;\n}\n","import { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\nimport { ROOT_STORAGE_NAMESPACE } from \"@powerhousedao/shared/connect\";\nimport { PH_CONNECT_BASE_PATH } from \"../connect.config.js\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\nimport { resolveReactorNamespace } from \"./reactor-namespace.js\";\n\nexport const REACTOR_INSTANCE_NAMESPACE = resolveReactorNamespace({\n basePath: PH_CONNECT_BASE_PATH,\n explicit: getRuntimeConfig().connect.instance?.namespace ?? undefined,\n});\n\nexport const REACTOR_PGLITE_NAME = REACTOR_INSTANCE_NAMESPACE;\n\nexport const RELATIONAL_PGLITE_NAME =\n REACTOR_INSTANCE_NAMESPACE === ROOT_STORAGE_NAMESPACE\n ? DEFAULT_RELATIONAL_PROCESSOR_DB_NAME\n : `${REACTOR_INSTANCE_NAMESPACE}-${DEFAULT_RELATIONAL_PROCESSOR_DB_NAME}`;\n\n// Here, not pglite-idb.ts, so those IDB helpers stay free of runtime-config\n// and remain importable by the reactor SharedWorker.\nexport const REACTOR_IDB_NAME = `/pglite/${REACTOR_PGLITE_NAME}`;\nexport const RELATIONAL_IDB_NAME = `/pglite/${RELATIONAL_PGLITE_NAME}`;\nexport const PRIMARY_IDB_NAMES = [\n REACTOR_IDB_NAME,\n RELATIONAL_IDB_NAME,\n] as const;\n","import { readPgVersionFile } from \"./pglite-idb.js\";\nimport {\n coerceMajor,\n isMigratableMajor,\n type DetectedMajor,\n} from \"./pglite-major.js\";\nimport { REACTOR_IDB_NAME, RELATIONAL_IDB_NAME } from \"./storage-namespace.js\";\n\nexport {\n CURRENT_PG_MAJOR,\n SUPPORTED_PG_MAJORS,\n coerceMajor,\n resolvePgMajorForRuntime,\n loadPGliteModule,\n loadPgDump,\n type SupportedPgMajor,\n type DetectedMajor,\n} from \"./pglite-major.js\";\n\nlet cachedReactorMajor: DetectedMajor | undefined;\nlet inflight: Promise<DetectedMajor> | undefined;\nconst majorListeners = new Set<() => void>();\n\nlet cachedMigrationMajor: DetectedMajor | undefined;\nlet migrationInflight: Promise<DetectedMajor> | undefined;\nconst migrationListeners = new Set<() => void>();\n\nfunction notifyMajorChanged() {\n for (const l of majorListeners) l();\n}\n\nfunction notifyMigrationChanged() {\n for (const l of migrationListeners) l();\n}\n\nexport function subscribeReactorPgMajor(cb: () => void): () => void {\n majorListeners.add(cb);\n return () => {\n majorListeners.delete(cb);\n };\n}\n\nexport async function detectReactorPgMajor(): Promise<DetectedMajor> {\n if (cachedReactorMajor !== undefined) return cachedReactorMajor;\n if (inflight) return inflight;\n\n inflight = (async () => {\n const major = coerceMajor(await readPgVersionFile(REACTOR_IDB_NAME));\n cachedReactorMajor = major;\n notifyMajorChanged();\n return major;\n })();\n try {\n return await inflight;\n } finally {\n inflight = undefined;\n }\n}\n\nexport function getCachedReactorPgMajor(): DetectedMajor | undefined {\n return cachedReactorMajor;\n}\n\nexport function invalidateReactorPgMajorCache(): void {\n cachedReactorMajor = undefined;\n cachedMigrationMajor = undefined;\n notifyMajorChanged();\n notifyMigrationChanged();\n}\n\nexport async function detectRelationalPgMajor(): Promise<DetectedMajor> {\n return coerceMajor(await readPgVersionFile(RELATIONAL_IDB_NAME));\n}\n\nexport function subscribeMigrationMajor(cb: () => void): () => void {\n migrationListeners.add(cb);\n return () => {\n migrationListeners.delete(cb);\n };\n}\n\nexport function getCachedMigrationMajor(): DetectedMajor | undefined {\n return cachedMigrationMajor;\n}\n\n/**\n * Legacy major the migration banner should prompt for: the first primary store\n * (reactor or relational) on a supported, non-current major. Spans both stores\n * to match migrateAllIfNeeded.\n */\nexport async function detectMigrationMajor(): Promise<DetectedMajor> {\n if (cachedMigrationMajor !== undefined) return cachedMigrationMajor;\n if (migrationInflight) return migrationInflight;\n\n migrationInflight = (async () => {\n const majors = await Promise.all([\n readPgVersionFile(REACTOR_IDB_NAME),\n readPgVersionFile(RELATIONAL_IDB_NAME),\n ]);\n const legacy = majors.find(isMigratableMajor) ?? null;\n cachedMigrationMajor = legacy;\n notifyMigrationChanged();\n return legacy;\n })();\n try {\n return await migrationInflight;\n } finally {\n migrationInflight = undefined;\n }\n}\n","export type WorkerConnectionStatus = \"connected\" | \"lost\";\n\nlet status: WorkerConnectionStatus = \"connected\";\nconst listeners = new Set<() => void>();\n\nexport function getWorkerConnectionStatus(): WorkerConnectionStatus {\n return status;\n}\n\nexport function setWorkerConnectionStatus(next: WorkerConnectionStatus): void {\n if (status === next) {\n return;\n }\n status = next;\n for (const listener of [...listeners]) {\n listener();\n }\n}\n\nexport function subscribeWorkerConnection(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n"],"names":[],"mappings":";;;;;;;;AASA,SAAgB,wBAAwB,OAAsC;CAC5E,MAAM,WAAW,MAAM,UAAU,KAAK;CACtC,IAAI,UACF,OAAO;CAET,MAAM,OAAO,oBAAoB,MAAM,QAAQ;CAC/C,MAAM,WAAW,MAAM,UAAU,KAAK;CACtC,IAAI,UACF,OAAO,GAAG,KAAK,IAAI,cAAc,UAAU,CAAC;CAE9C,OAAO;AACT;;;ACdA,MAAa,6BAA6B,wBAAwB;CAChE,UAAU;CACV,UAAU,iBAAiB,CAAC,CAAC,QAAQ,UAAU,aAAa,KAAA;AAC9D,CAAC;AAED,MAAa,sBAAsB;AAEnC,MAAa,yBACX,+BAA+B,yBAC3B,uCACA,GAAG,2BAA2B,GAAG;AAIvC,MAAa,mBAAmB,WAAW;AAC3C,MAAa,sBAAsB,WAAW;AAC9C,MAAa,oBAAoB,CAC/B,kBACA,mBACF;;;ACNA,IAAI;AACJ,IAAI;AACJ,MAAM,iCAAiB,IAAI,IAAgB;AAE3C,IAAI;AACJ,IAAI;AACJ,MAAM,qCAAqB,IAAI,IAAgB;AAE/C,SAAS,qBAAqB;CAC5B,KAAK,MAAM,KAAK,gBAAgB,EAAE;AACpC;AAEA,SAAS,yBAAyB;CAChC,KAAK,MAAM,KAAK,oBAAoB,EAAE;AACxC;AAEA,SAAgB,wBAAwB,IAA4B;CAClE,eAAe,IAAI,EAAE;CACrB,aAAa;EACX,eAAe,OAAO,EAAE;CAC1B;AACF;AAEA,eAAsB,uBAA+C;CACnE,IAAI,uBAAuB,KAAA,GAAW,OAAO;CAC7C,IAAI,UAAU,OAAO;CAErB,YAAY,YAAY;EACtB,MAAM,QAAQ,YAAY,MAAM,kBAAkB,gBAAgB,CAAC;EACnE,qBAAqB;EACrB,mBAAmB;EACnB,OAAO;CACT,EAAA,CAAG;CACH,IAAI;EACF,OAAO,MAAM;CACf,UAAU;EACR,WAAW,KAAA;CACb;AACF;AAEA,SAAgB,0BAAqD;CACnE,OAAO;AACT;AAEA,SAAgB,gCAAsC;CACpD,qBAAqB,KAAA;CACrB,uBAAuB,KAAA;CACvB,mBAAmB;CACnB,uBAAuB;AACzB;AAEA,eAAsB,0BAAkD;CACtE,OAAO,YAAY,MAAM,kBAAkB,mBAAmB,CAAC;AACjE;AAEA,SAAgB,wBAAwB,IAA4B;CAClE,mBAAmB,IAAI,EAAE;CACzB,aAAa;EACX,mBAAmB,OAAO,EAAE;CAC9B;AACF;AAEA,SAAgB,0BAAqD;CACnE,OAAO;AACT;;;;;;AAOA,eAAsB,uBAA+C;CACnE,IAAI,yBAAyB,KAAA,GAAW,OAAO;CAC/C,IAAI,mBAAmB,OAAO;CAE9B,qBAAqB,YAAY;EAK/B,MAAM,UAAS,MAJM,QAAQ,IAAI,CAC/B,kBAAkB,gBAAgB,GAClC,kBAAkB,mBAAmB,CACvC,CAAC,EAAA,CACqB,KAAK,iBAAiB,KAAK;EACjD,uBAAuB;EACvB,uBAAuB;EACvB,OAAO;CACT,EAAA,CAAG;CACH,IAAI;EACF,OAAO,MAAM;CACf,UAAU;EACR,oBAAoB,KAAA;CACtB;AACF;;;AC3GA,IAAI,SAAiC;AACrC,MAAM,4BAAY,IAAI,IAAgB;AAEtC,SAAgB,4BAAoD;CAClE,OAAO;AACT;AAEA,SAAgB,0BAA0B,MAAoC;CAC5E,IAAI,WAAW,MACb;CAEF,SAAS;CACT,KAAK,MAAM,YAAY,CAAC,GAAG,SAAS,GAClC,SAAS;AAEb;AAEA,SAAgB,0BAA0B,UAAkC;CAC1E,UAAU,IAAI,QAAQ;CACtB,aAAa;EACX,UAAU,OAAO,QAAQ;CAC3B;AACF","debug_id":"5319a816-401a-5056-9473-b930b6b22dd9"}
1
+ {"version":3,"file":"connection-state-Eqc2izmt.js","sources":["../src/utils/reactor-namespace.ts","../src/utils/storage-namespace.ts","../src/utils/pglite-runtime.ts","../src/connection-state.ts"],"sourcesContent":["import { getStorageNamespace } from \"@powerhousedao/shared/connect\";\nimport { hashNamespace } from \"@powerhousedao/shared/processors\";\n\nexport type ReactorNamespaceInput = {\n basePath: string;\n explicit?: string;\n endpoint?: string;\n};\n\nexport function resolveReactorNamespace(input: ReactorNamespaceInput): string {\n const explicit = input.explicit?.trim();\n if (explicit) {\n return explicit;\n }\n const base = getStorageNamespace(input.basePath);\n const endpoint = input.endpoint?.trim();\n if (endpoint) {\n return `${base}--${hashNamespace(endpoint, 8)}`;\n }\n return base;\n}\n","import { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\nimport { ROOT_STORAGE_NAMESPACE } from \"@powerhousedao/shared/connect\";\nimport { PH_CONNECT_BASE_PATH } from \"../connect.config.js\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\nimport { resolveReactorNamespace } from \"./reactor-namespace.js\";\n\nexport const REACTOR_INSTANCE_NAMESPACE = resolveReactorNamespace({\n basePath: PH_CONNECT_BASE_PATH,\n explicit: getRuntimeConfig().connect.instance?.namespace ?? undefined,\n});\n\nexport const REACTOR_PGLITE_NAME = REACTOR_INSTANCE_NAMESPACE;\n\nexport const RELATIONAL_PGLITE_NAME =\n REACTOR_INSTANCE_NAMESPACE === ROOT_STORAGE_NAMESPACE\n ? DEFAULT_RELATIONAL_PROCESSOR_DB_NAME\n : `${REACTOR_INSTANCE_NAMESPACE}-${DEFAULT_RELATIONAL_PROCESSOR_DB_NAME}`;\n\n// Here, not pglite-idb.ts, so those IDB helpers stay free of runtime-config\n// and remain importable by the reactor SharedWorker.\nexport const REACTOR_IDB_NAME = `/pglite/${REACTOR_PGLITE_NAME}`;\nexport const RELATIONAL_IDB_NAME = `/pglite/${RELATIONAL_PGLITE_NAME}`;\nexport const PRIMARY_IDB_NAMES = [\n REACTOR_IDB_NAME,\n RELATIONAL_IDB_NAME,\n] as const;\n","import { readPgVersionFile } from \"./pglite-idb.js\";\nimport {\n coerceMajor,\n isMigratableMajor,\n type DetectedMajor,\n} from \"./pglite-major.js\";\nimport { REACTOR_IDB_NAME, RELATIONAL_IDB_NAME } from \"./storage-namespace.js\";\n\nexport {\n CURRENT_PG_MAJOR,\n SUPPORTED_PG_MAJORS,\n coerceMajor,\n resolvePgMajorForRuntime,\n loadPGliteModule,\n loadPgDump,\n type SupportedPgMajor,\n type DetectedMajor,\n} from \"./pglite-major.js\";\n\nlet cachedReactorMajor: DetectedMajor | undefined;\nlet inflight: Promise<DetectedMajor> | undefined;\nconst majorListeners = new Set<() => void>();\n\nlet cachedMigrationMajor: DetectedMajor | undefined;\nlet migrationInflight: Promise<DetectedMajor> | undefined;\nconst migrationListeners = new Set<() => void>();\n\nfunction notifyMajorChanged() {\n for (const l of majorListeners) l();\n}\n\nfunction notifyMigrationChanged() {\n for (const l of migrationListeners) l();\n}\n\nexport function subscribeReactorPgMajor(cb: () => void): () => void {\n majorListeners.add(cb);\n return () => {\n majorListeners.delete(cb);\n };\n}\n\nexport async function detectReactorPgMajor(): Promise<DetectedMajor> {\n if (cachedReactorMajor !== undefined) return cachedReactorMajor;\n if (inflight) return inflight;\n\n inflight = (async () => {\n const major = coerceMajor(await readPgVersionFile(REACTOR_IDB_NAME));\n cachedReactorMajor = major;\n notifyMajorChanged();\n return major;\n })();\n try {\n return await inflight;\n } finally {\n inflight = undefined;\n }\n}\n\nexport function getCachedReactorPgMajor(): DetectedMajor | undefined {\n return cachedReactorMajor;\n}\n\nexport function invalidateReactorPgMajorCache(): void {\n cachedReactorMajor = undefined;\n cachedMigrationMajor = undefined;\n notifyMajorChanged();\n notifyMigrationChanged();\n}\n\nexport async function detectRelationalPgMajor(): Promise<DetectedMajor> {\n return coerceMajor(await readPgVersionFile(RELATIONAL_IDB_NAME));\n}\n\nexport function subscribeMigrationMajor(cb: () => void): () => void {\n migrationListeners.add(cb);\n return () => {\n migrationListeners.delete(cb);\n };\n}\n\nexport function getCachedMigrationMajor(): DetectedMajor | undefined {\n return cachedMigrationMajor;\n}\n\n/**\n * Legacy major the migration banner should prompt for: the first primary store\n * (reactor or relational) on a supported, non-current major. Spans both stores\n * to match migrateAllIfNeeded.\n */\nexport async function detectMigrationMajor(): Promise<DetectedMajor> {\n if (cachedMigrationMajor !== undefined) return cachedMigrationMajor;\n if (migrationInflight) return migrationInflight;\n\n migrationInflight = (async () => {\n const majors = await Promise.all([\n readPgVersionFile(REACTOR_IDB_NAME),\n readPgVersionFile(RELATIONAL_IDB_NAME),\n ]);\n const legacy = majors.find(isMigratableMajor) ?? null;\n cachedMigrationMajor = legacy;\n notifyMigrationChanged();\n return legacy;\n })();\n try {\n return await migrationInflight;\n } finally {\n migrationInflight = undefined;\n }\n}\n","export type WorkerConnectionStatus = \"connected\" | \"lost\";\n\nlet status: WorkerConnectionStatus = \"connected\";\nconst listeners = new Set<() => void>();\n\nexport function getWorkerConnectionStatus(): WorkerConnectionStatus {\n return status;\n}\n\nexport function setWorkerConnectionStatus(next: WorkerConnectionStatus): void {\n if (status === next) {\n return;\n }\n status = next;\n for (const listener of [...listeners]) {\n listener();\n }\n}\n\nexport function subscribeWorkerConnection(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n"],"names":[],"mappings":";;;;;;;;AASA,SAAgB,wBAAwB,OAAsC;CAC5E,MAAM,WAAW,MAAM,UAAU,KAAK;CACtC,IAAI,UACF,OAAO;CAET,MAAM,OAAO,oBAAoB,MAAM,QAAQ;CAC/C,MAAM,WAAW,MAAM,UAAU,KAAK;CACtC,IAAI,UACF,OAAO,GAAG,KAAK,IAAI,cAAc,UAAU,CAAC;CAE9C,OAAO;AACT;;;ACdA,MAAa,6BAA6B,wBAAwB;CAChE,UAAU;CACV,UAAU,iBAAiB,CAAC,CAAC,QAAQ,UAAU,aAAa,KAAA;AAC9D,CAAC;AAED,MAAa,sBAAsB;AAEnC,MAAa,yBACX,+BAA+B,yBAC3B,uCACA,GAAG,2BAA2B,GAAG;AAIvC,MAAa,mBAAmB,WAAW;AAC3C,MAAa,sBAAsB,WAAW;AAC9C,MAAa,oBAAoB,CAC/B,kBACA,mBACF;;;ACNA,IAAI;AACJ,IAAI;AACJ,MAAM,iCAAiB,IAAI,IAAgB;AAE3C,IAAI;AACJ,IAAI;AACJ,MAAM,qCAAqB,IAAI,IAAgB;AAE/C,SAAS,qBAAqB;CAC5B,KAAK,MAAM,KAAK,gBAAgB,EAAE;AACpC;AAEA,SAAS,yBAAyB;CAChC,KAAK,MAAM,KAAK,oBAAoB,EAAE;AACxC;AAEA,SAAgB,wBAAwB,IAA4B;CAClE,eAAe,IAAI,EAAE;CACrB,aAAa;EACX,eAAe,OAAO,EAAE;CAC1B;AACF;AAEA,eAAsB,uBAA+C;CACnE,IAAI,uBAAuB,KAAA,GAAW,OAAO;CAC7C,IAAI,UAAU,OAAO;CAErB,YAAY,YAAY;EACtB,MAAM,QAAQ,YAAY,MAAM,kBAAkB,gBAAgB,CAAC;EACnE,qBAAqB;EACrB,mBAAmB;EACnB,OAAO;CACT,EAAA,CAAG;CACH,IAAI;EACF,OAAO,MAAM;CACf,UAAU;EACR,WAAW,KAAA;CACb;AACF;AAEA,SAAgB,0BAAqD;CACnE,OAAO;AACT;AAEA,SAAgB,gCAAsC;CACpD,qBAAqB,KAAA;CACrB,uBAAuB,KAAA;CACvB,mBAAmB;CACnB,uBAAuB;AACzB;AAEA,eAAsB,0BAAkD;CACtE,OAAO,YAAY,MAAM,kBAAkB,mBAAmB,CAAC;AACjE;AAEA,SAAgB,wBAAwB,IAA4B;CAClE,mBAAmB,IAAI,EAAE;CACzB,aAAa;EACX,mBAAmB,OAAO,EAAE;CAC9B;AACF;AAEA,SAAgB,0BAAqD;CACnE,OAAO;AACT;;;;;;AAOA,eAAsB,uBAA+C;CACnE,IAAI,yBAAyB,KAAA,GAAW,OAAO;CAC/C,IAAI,mBAAmB,OAAO;CAE9B,qBAAqB,YAAY;EAK/B,MAAM,UAAS,MAJM,QAAQ,IAAI,CAC/B,kBAAkB,gBAAgB,GAClC,kBAAkB,mBAAmB,CACvC,CAAC,EAAA,CACqB,KAAK,iBAAiB,KAAK;EACjD,uBAAuB;EACvB,uBAAuB;EACvB,OAAO;CACT,EAAA,CAAG;CACH,IAAI;EACF,OAAO,MAAM;CACf,UAAU;EACR,oBAAoB,KAAA;CACtB;AACF;;;AC3GA,IAAI,SAAiC;AACrC,MAAM,4BAAY,IAAI,IAAgB;AAEtC,SAAgB,4BAAoD;CAClE,OAAO;AACT;AAEA,SAAgB,0BAA0B,MAAoC;CAC5E,IAAI,WAAW,MACb;CAEF,SAAS;CACT,KAAK,MAAM,YAAY,CAAC,GAAG,SAAS,GAClC,SAAS;AAEb;AAEA,SAAgB,0BAA0B,UAAkC;CAC1E,UAAU,IAAI,QAAQ;CACtB,aAAa;EACX,UAAU,OAAO,QAAQ;CAC3B;AACF","debug_id":"b00fd9bd-6ddd-571e-9f85-f37bdef2f520"}
@@ -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]="29031903-706f-5dce-ae77-4919cf0860d4")}catch(e){}}();
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]="34f550d6-36a8-59f2-9684-10eb8b12195d")}catch(e){}}();
3
3
  import { t as i18n } from "./i18n-CTgT1HG-.js";
4
- import { n as useAcceptedCookies, r as useCookieBanner } from "./preferences-store-Bekp7tv-.js";
4
+ import { n as useAcceptedCookies, r as useCookieBanner } from "./preferences-store-DZUIAkHE.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { Trans, useTranslation } from "react-i18next";
7
7
  import { CookieBanner as CookieBanner$1 } from "@powerhousedao/design-system/connect";
@@ -66,5 +66,5 @@ const CookieBanner = () => {
66
66
  //#endregion
67
67
  export { CookieBanner };
68
68
 
69
- //# sourceMappingURL=cookie-banner-CSF930bl.js.map
70
- //# debugId=29031903-706f-5dce-ae77-4919cf0860d4
69
+ //# sourceMappingURL=cookie-banner-BxXvPdIY.js.map
70
+ //# debugId=34f550d6-36a8-59f2-9684-10eb8b12195d
@@ -1 +1 @@
1
- {"version":3,"file":"cookie-banner-CSF930bl.js","sources":["../src/components/cookie-banner.tsx"],"sourcesContent":["import {\n useAcceptedCookies,\n useCookieBanner,\n} from \"../hooks/preferences-store.js\";\nimport type { CookieInput } from \"@powerhousedao/design-system/connect\";\nimport { CookieBanner as PHCookieBanner } from \"@powerhousedao/design-system/connect\";\nimport { showPHModal } from \"@powerhousedao/reactor-browser\";\nimport { Trans, useTranslation } from \"react-i18next\";\nimport { i18n } from \"@powerhousedao/connect/i18n\";\n\nconst isCookieAccepted = (cookies: CookieInput[], id: string) => {\n return cookies.some((cookie) => cookie.id === id && cookie.value);\n};\n\nexport const CookieBanner = () => {\n const { t } = useTranslation(undefined, {\n useSuspense: true,\n i18n,\n });\n const [showBanner, setShowBanner] = useCookieBanner();\n const [, setAcceptedCookies] = useAcceptedCookies();\n\n const cookiesInput: CookieInput[] = [\n {\n id: \"analytics-cookie\",\n label: t(\"cookieBanner.cookies.analytics\"),\n value: true,\n },\n ];\n\n const handleAccept = (cookies: CookieInput[]) => {\n setShowBanner(false);\n\n if (isCookieAccepted(cookies, \"analytics-cookie\")) {\n setAcceptedCookies((acceptedCookies) => ({\n ...acceptedCookies,\n analytics: true,\n }));\n }\n };\n\n const handleReject = () => {\n setShowBanner(false);\n setAcceptedCookies(() => ({\n analytics: false,\n functional: false,\n marketing: false,\n }));\n };\n\n if (!showBanner) {\n return null;\n }\n\n return (\n <div className=\"absolute inset-0 z-10000 backdrop-blur-sm\">\n <div className=\"absolute inset-0 bg-primary opacity-15\" />\n <div className=\"absolute inset-x-0 bottom-0 flex justify-center bg-background px-10 pt-10 pb-16 shadow-lg\">\n <PHCookieBanner\n className=\"max-w-[1024px]\"\n cookies={cookiesInput}\n onSubmit={handleAccept}\n onReject={handleReject}\n submitLabel={t(\"cookieBanner.accept\")}\n rejectLabel={t(\"cookieBanner.reject\")}\n >\n <p className=\"font-semibold text-muted-foreground\">\n <Trans\n key={\"cookieBanner.message\"}\n i18nKey=\"cookieBanner.message\"\n components={{\n a: (\n <a\n onClick={() => showPHModal({ type: \"cookiesPolicy\" })}\n key={\"cookieBanner.message-link\"}\n className=\"cursor-pointer text-foreground hover:underline\"\n />\n ),\n }}\n />\n </p>\n </PHCookieBanner>\n </div>\n </div>\n );\n};\n"],"names":["PHCookieBanner"],"mappings":";;;;;;;;;AAUA,MAAM,oBAAoB,SAAwB,OAAe;CAC/D,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,MAAM,OAAO,KAAK;AAClE;AAEA,MAAa,qBAAqB;CAChC,MAAM,EAAE,MAAM,eAAe,KAAA,GAAW;EACtC,aAAa;EACb;CACF,CAAC;CACD,MAAM,CAAC,YAAY,iBAAiB,gBAAgB;CACpD,MAAM,GAAG,sBAAsB,mBAAmB;CAElD,MAAM,eAA8B,CAClC;EACE,IAAI;EACJ,OAAO,EAAE,gCAAgC;EACzC,OAAO;CACT,CACF;CAEA,MAAM,gBAAgB,YAA2B;EAC/C,cAAc,KAAK;EAEnB,IAAI,iBAAiB,SAAS,kBAAkB,GAC9C,oBAAoB,qBAAqB;GACvC,GAAG;GACH,WAAW;EACb,EAAE;CAEN;CAEA,MAAM,qBAAqB;EACzB,cAAc,KAAK;EACnB,0BAA0B;GACxB,WAAW;GACX,YAAY;GACZ,WAAW;EACb,EAAE;CACJ;CAEA,IAAI,CAAC,YACH,OAAO;CAGT,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,OAAD,EAAK,WAAU,yCAA0C,CAAA,GACzD,oBAAC,OAAD;GAAK,WAAU;GACb,UAAA,oBAACA,gBAAD;IACE,WAAU;IACV,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa,EAAE,qBAAqB;IACpC,aAAa,EAAE,qBAAqB;IAEpC,UAAA,oBAAC,KAAD;KAAG,WAAU;KACX,UAAA,oBAAC,OAAD;MAEE,SAAQ;MACR,YAAY,EACV,GACE,oBAAC,KAAD;OACE,eAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;OAEpD,WAAU;MACX,GAFM,2BAEN,EAEL;KACD,GAXM,sBAWN;IACA,CAAA;GACW,CAAA;EACb,CAAA,CACF;;AAET","debug_id":"29031903-706f-5dce-ae77-4919cf0860d4"}
1
+ {"version":3,"file":"cookie-banner-BxXvPdIY.js","sources":["../src/components/cookie-banner.tsx"],"sourcesContent":["import {\n useAcceptedCookies,\n useCookieBanner,\n} from \"../hooks/preferences-store.js\";\nimport type { CookieInput } from \"@powerhousedao/design-system/connect\";\nimport { CookieBanner as PHCookieBanner } from \"@powerhousedao/design-system/connect\";\nimport { showPHModal } from \"@powerhousedao/reactor-browser\";\nimport { Trans, useTranslation } from \"react-i18next\";\nimport { i18n } from \"@powerhousedao/connect/i18n\";\n\nconst isCookieAccepted = (cookies: CookieInput[], id: string) => {\n return cookies.some((cookie) => cookie.id === id && cookie.value);\n};\n\nexport const CookieBanner = () => {\n const { t } = useTranslation(undefined, {\n useSuspense: true,\n i18n,\n });\n const [showBanner, setShowBanner] = useCookieBanner();\n const [, setAcceptedCookies] = useAcceptedCookies();\n\n const cookiesInput: CookieInput[] = [\n {\n id: \"analytics-cookie\",\n label: t(\"cookieBanner.cookies.analytics\"),\n value: true,\n },\n ];\n\n const handleAccept = (cookies: CookieInput[]) => {\n setShowBanner(false);\n\n if (isCookieAccepted(cookies, \"analytics-cookie\")) {\n setAcceptedCookies((acceptedCookies) => ({\n ...acceptedCookies,\n analytics: true,\n }));\n }\n };\n\n const handleReject = () => {\n setShowBanner(false);\n setAcceptedCookies(() => ({\n analytics: false,\n functional: false,\n marketing: false,\n }));\n };\n\n if (!showBanner) {\n return null;\n }\n\n return (\n <div className=\"absolute inset-0 z-10000 backdrop-blur-sm\">\n <div className=\"absolute inset-0 bg-primary opacity-15\" />\n <div className=\"absolute inset-x-0 bottom-0 flex justify-center bg-background px-10 pt-10 pb-16 shadow-lg\">\n <PHCookieBanner\n className=\"max-w-[1024px]\"\n cookies={cookiesInput}\n onSubmit={handleAccept}\n onReject={handleReject}\n submitLabel={t(\"cookieBanner.accept\")}\n rejectLabel={t(\"cookieBanner.reject\")}\n >\n <p className=\"font-semibold text-muted-foreground\">\n <Trans\n key={\"cookieBanner.message\"}\n i18nKey=\"cookieBanner.message\"\n components={{\n a: (\n <a\n onClick={() => showPHModal({ type: \"cookiesPolicy\" })}\n key={\"cookieBanner.message-link\"}\n className=\"cursor-pointer text-foreground hover:underline\"\n />\n ),\n }}\n />\n </p>\n </PHCookieBanner>\n </div>\n </div>\n );\n};\n"],"names":["PHCookieBanner"],"mappings":";;;;;;;;;AAUA,MAAM,oBAAoB,SAAwB,OAAe;CAC/D,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,MAAM,OAAO,KAAK;AAClE;AAEA,MAAa,qBAAqB;CAChC,MAAM,EAAE,MAAM,eAAe,KAAA,GAAW;EACtC,aAAa;EACb;CACF,CAAC;CACD,MAAM,CAAC,YAAY,iBAAiB,gBAAgB;CACpD,MAAM,GAAG,sBAAsB,mBAAmB;CAElD,MAAM,eAA8B,CAClC;EACE,IAAI;EACJ,OAAO,EAAE,gCAAgC;EACzC,OAAO;CACT,CACF;CAEA,MAAM,gBAAgB,YAA2B;EAC/C,cAAc,KAAK;EAEnB,IAAI,iBAAiB,SAAS,kBAAkB,GAC9C,oBAAoB,qBAAqB;GACvC,GAAG;GACH,WAAW;EACb,EAAE;CAEN;CAEA,MAAM,qBAAqB;EACzB,cAAc,KAAK;EACnB,0BAA0B;GACxB,WAAW;GACX,YAAY;GACZ,WAAW;EACb,EAAE;CACJ;CAEA,IAAI,CAAC,YACH,OAAO;CAGT,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,OAAD,EAAK,WAAU,yCAA0C,CAAA,GACzD,oBAAC,OAAD;GAAK,WAAU;GACb,UAAA,oBAACA,gBAAD;IACE,WAAU;IACV,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa,EAAE,qBAAqB;IACpC,aAAa,EAAE,qBAAqB;IAEpC,UAAA,oBAAC,KAAD;KAAG,WAAU;KACX,UAAA,oBAAC,OAAD;MAEE,SAAQ;MACR,YAAY,EACV,GACE,oBAAC,KAAD;OACE,eAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;OAEpD,WAAU;MACX,GAFM,2BAEN,EAEL;KACD,GAXM,sBAWN;IACA,CAAA;GACW,CAAA;EACb,CAAA,CACF;;AAET","debug_id":"34f550d6-36a8-59f2-9684-10eb8b12195d"}
@@ -1,13 +1,13 @@
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]="6e64f3e7-33be-5089-8982-38580b40e232")}catch(e){}}();
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]="4889212b-d5de-5871-95aa-6f3b7506b335")}catch(e){}}();
3
3
  import { r as loadRuntimeConfig, t as applyConnectBranding } from "./runtime-config-DtJIUgYw.js";
4
4
  import "./i18n-CTgT1HG-.js";
5
- import { r as connectConfig } from "./connect.config-Dgs13R1s.js";
5
+ import { r as connectConfig } from "./connect.config-CaXMoB42.js";
6
6
  import { n as setUser } from "./sentry-jfDyrxdX.js";
7
- import { t as getBuildHash } from "./build-info-B31oFKR6.js";
8
- import { a as detectReactorPgMajor, i as detectMigrationMajor } from "./connection-state-Cy8xRCm_.js";
9
- import { n as seedPendingPgVersion } from "./pglite-seed-D6fqQApT.js";
10
- import { n as createReactor } from "./reactor-BmQPQNmi.js";
7
+ import { t as getBuildHash } from "./build-info-CNHv6iwN.js";
8
+ import { a as detectReactorPgMajor, i as detectMigrationMajor } from "./connection-state-Eqc2izmt.js";
9
+ import { n as seedPendingPgVersion } from "./pglite-seed-Cl2d-iyl.js";
10
+ import { n as createReactor } from "./reactor--yIPUbFV.js";
11
11
  import { useEffect } from "react";
12
12
  import { initTheme, useUser } from "@powerhousedao/reactor-browser";
13
13
  import { logger } from "document-model";
@@ -129,5 +129,5 @@ async function loadComponent(localPackage) {
129
129
  //#endregion
130
130
  export { loadComponent };
131
131
 
132
- //# sourceMappingURL=load-B7_AbI5f.js.map
133
- //# debugId=6e64f3e7-33be-5089-8982-38580b40e232
132
+ //# sourceMappingURL=load-DV4AXFcM.js.map
133
+ //# debugId=4889212b-d5de-5871-95aa-6f3b7506b335
@@ -1 +1 @@
1
- {"version":3,"file":"load-B7_AbI5f.js","sources":["../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { getBuildHashStatus } from \"@powerhousedao/connect/hooks\";\nimport { logger } from \"document-model\";\nimport { useEffect } from \"react\";\n\n// Session-scoped guard: records the deployed hash this tab already reloaded\n// for, so a broken or rolling deploy (server hash keeps changing under us)\n// cannot turn the tab into a reload loop. Cleared implicitly with the tab.\nconst RELOADED_FOR_KEY = \"ph-reloaded-for-build-hash\";\n\n/**\n * Drop the service worker's stale caches (precache + the NetworkFirst shell\n * cache) before reloading onto a new deploy, so the post-reload navigation\n * is answered from the network / fresh build instead of leftovers of the\n * build we are leaving. Best-effort: if the Caches API is unavailable or a\n * delete fails, the reload still picks up the new shell (the navigation\n * route is NetworkFirst).\n */\nasync function clearStaleCaches(): Promise<void> {\n try {\n if (!(\"caches\" in window)) return;\n const keys = await window.caches.keys();\n await Promise.all(\n keys\n .filter((key) => key.includes(\"precache\") || key.includes(\"ph-shell\"))\n .map((key) => window.caches.delete(key)),\n );\n } catch (error) {\n logger.warn(\n \"Failed to clear stale caches before update reload @error\",\n error,\n );\n }\n}\n\n/**\n * Detects that the server is serving a different build than the one this\n * page was loaded from (a new deploy) and reloads onto it — once per session\n * per deployed hash. Checked on mount and whenever the tab returns to the\n * foreground, so a deploy that lands while the tab sits open is picked up on\n * the next focus without a manual reload. The in-tab \"new version available\"\n * service-worker prompt (ServiceWorkerUpdatePrompt) remains the opt-in path\n * for workers that are waiting but not yet controlling.\n */\nexport const useCheckLatestVersion = () => {\n useEffect(() => {\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n return;\n }\n\n const checkBuildHash = async () => {\n const status = await getBuildHashStatus();\n if (!status || status.isCurrent) return;\n\n const reloadedFor = window.sessionStorage.getItem(RELOADED_FOR_KEY);\n if (reloadedFor === status.deployedHash) return;\n window.sessionStorage.setItem(RELOADED_FOR_KEY, status.deployedHash);\n\n logger.info(\n \"New deploy detected — reloading from build @currentHash to @deployedHash\",\n status.currentHash,\n status.deployedHash,\n );\n await clearStaleCaches();\n window.location.reload();\n };\n\n void checkBuildHash();\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") void checkBuildHash();\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n };\n }, []);\n};\n","import { getBuildHash } from \"../utils/build-info.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nexport interface BuildHashStatus {\n /** Hash baked into the running build. */\n currentHash: string;\n /** Hash the server is currently serving. */\n deployedHash: string;\n /** true when the running build matches what the server serves. */\n isCurrent: boolean;\n}\n\n/**\n * Same-origin build-identity probe. The build bakes a hash of the inputs that\n * determine the deployed content into the bundle (define\n * `PH_CONNECT_BUILD_HASH`, see builder-tools' connectBuildHashPlugin) and\n * emits `build-hash.json` next to the app (served no-cache). Comparing the\n * two tells us whether the server is serving a different build than the one\n * this page was loaded from — the reliable \"a new deploy went out\" signal.\n * Unlike the old GitHub-raw version check it works on localhost (it compares\n * against what the origin actually serves, not a remote branch head) and\n * needs no network beyond the app's own origin.\n *\n * Returns null when there is nothing to compare: dev/studio builds (no hash\n * baked), a server predating `build-hash.json`, an offline fetch, or a\n * malformed body.\n */\nexport const getBuildHashStatus = async (): Promise<BuildHashStatus | null> => {\n const currentHash = getBuildHash();\n if (!currentHash || currentHash === \"unknown\") return null;\n try {\n const result = await fetch(`${import.meta.env.BASE_URL}build-hash.json`, {\n cache: \"no-cache\",\n });\n if (!result.ok) return null;\n const data = (await result.json()) as { hash?: unknown };\n if (typeof data.hash !== \"string\" || !data.hash) return null;\n return {\n currentHash,\n deployedHash: data.hash,\n isCurrent: data.hash === currentHash,\n };\n } catch {\n return null;\n }\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\nimport { setUser as setSentryUser } from \"../services/sentry.js\";\n\nexport function useSetSentryUser() {\n const user = useUser();\n useEffect(() => {\n let sentryUser: SentryUser | null = null;\n if (user) {\n // saves the user info except the credential\n const { credential: _credential, ...rest } = user;\n sentryUser = { id: rest.did, username: rest.ens?.name, ...rest };\n }\n setSentryUser(sentryUser);\n }, [user]);\n}\n","import { useCheckLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport \"@powerhousedao/connect/i18n\";\nimport { createReactor, useSetSentryUser } from \"@powerhousedao/connect/store\";\nimport {\n detectMigrationMajor,\n detectReactorPgMajor,\n seedPendingPgVersion,\n} from \"@powerhousedao/connect/utils\";\nimport { initTheme } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { type ReactNode } from \"react\";\nimport { applyConnectBranding, loadRuntimeConfig } from \"../runtime-config.js\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await seedPendingPgVersion();\n await Promise.all([detectReactorPgMajor(), detectMigrationMajor()]);\n const runtimeConfig = await loadRuntimeConfig();\n applyConnectBranding(runtimeConfig);\n await createReactor(localPackage);\n return {\n default: ({ children }: { children?: ReactNode }) => {\n initTheme();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useSetSentryUser();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAQA,MAAM,mBAAmB;;;;;;;;;AAUzB,eAAe,mBAAkC;CAC/C,IAAI;EACF,IAAI,EAAE,YAAY,SAAS;EAC3B,MAAM,OAAO,MAAM,OAAO,OAAO,KAAK;EACtC,MAAM,QAAQ,IACZ,KACG,QAAQ,QAAQ,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,UAAU,CAAC,CAAC,CACrE,KAAK,QAAQ,OAAO,OAAO,OAAO,GAAG,CAAC,CAC3C;CACF,SAAS,OAAO;EACd,OAAO,KACL,4DACA,KACF;CACF;AACF;;;;;;;;;;AAWA,MAAa,8BAA8B;CACzC,gBAAgB;EACd,IACE,YAAY,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,iBAEf;EAGF,MAAM,iBAAiB,YAAY;GACjC,MAAM,SAAS,MAAM,mBAAmB;GACxC,IAAI,CAAC,UAAU,OAAO,WAAW;GAGjC,IADoB,OAAO,eAAe,QAAQ,gBACpC,MAAM,OAAO,cAAc;GACzC,OAAO,eAAe,QAAQ,kBAAkB,OAAO,YAAY;GAEnE,OAAO,KACL,4EACA,OAAO,aACP,OAAO,YACT;GACA,MAAM,iBAAiB;GACvB,OAAO,SAAS,OAAO;EACzB;EAEA,eAAoB;EACpB,MAAM,2BAA2B;GAC/B,IAAI,SAAS,oBAAoB,WAAW,eAAoB;EAClE;EACA,SAAS,iBAAiB,oBAAoB,kBAAkB;EAChE,aAAa;GACX,SAAS,oBAAoB,oBAAoB,kBAAkB;EACrE;CACF,GAAG,CAAC,CAAC;AACP;AC9EqB,OAAO,UAAU,WAAW,SAAS,KAAK;;;;;;;;;;;;;;;;AA0B/D,MAAa,qBAAqB,YAA6C;CAC7E,MAAM,cAAc,aAAa;CACjC,IAAI,CAAC,eAAe,gBAAgB,WAAW,OAAO;CACtD,IAAI;EACF,MAAM,SAAS,MAAM,MAAM,GAAG,YAAY,IAAI,SAAS,kBAAkB,EACvE,OAAO,WACT,CAAC;EACD,IAAI,CAAC,OAAO,IAAI,OAAO;EACvB,MAAM,OAAQ,MAAM,OAAO,KAAK;EAChC,IAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,MAAM,OAAO;EACxD,OAAO;GACL;GACA,cAAc,KAAK;GACnB,WAAW,KAAK,SAAS;EAC3B;CACF,QAAQ;EACN,OAAO;CACT;AACF;;;ACzCA,SAAgB,mBAAmB;CACjC,MAAM,OAAO,QAAQ;CACrB,gBAAgB;EACd,IAAI,aAAgC;EACpC,IAAI,MAAM;GAER,MAAM,EAAE,YAAY,aAAa,GAAG,SAAS;GAC7C,aAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;GAAK;EACjE;EACA,QAAc,UAAU;CAC1B,GAAG,CAAC,IAAI,CAAC;AACX;;;ACHA,eAAsB,cAAc,cAAiC;CACnE,MAAM,qBAAqB;CAC3B,MAAM,QAAQ,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,CAAC;CAClE,MAAM,gBAAgB,MAAM,kBAAkB;CAC9C,qBAAqB,aAAa;CAClC,MAAM,cAAc,YAAY;CAChC,OAAO,EACL,UAAU,EAAE,eAAyC;EACnD,UAAU;EAEV,iBAAiB;EAEjB,sBAAsB;EACtB,OAAO;CACT,EACF;AACF","debug_id":"6e64f3e7-33be-5089-8982-38580b40e232"}
1
+ {"version":3,"file":"load-DV4AXFcM.js","sources":["../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { getBuildHashStatus } from \"@powerhousedao/connect/hooks\";\nimport { logger } from \"document-model\";\nimport { useEffect } from \"react\";\n\n// Session-scoped guard: records the deployed hash this tab already reloaded\n// for, so a broken or rolling deploy (server hash keeps changing under us)\n// cannot turn the tab into a reload loop. Cleared implicitly with the tab.\nconst RELOADED_FOR_KEY = \"ph-reloaded-for-build-hash\";\n\n/**\n * Drop the service worker's stale caches (precache + the NetworkFirst shell\n * cache) before reloading onto a new deploy, so the post-reload navigation\n * is answered from the network / fresh build instead of leftovers of the\n * build we are leaving. Best-effort: if the Caches API is unavailable or a\n * delete fails, the reload still picks up the new shell (the navigation\n * route is NetworkFirst).\n */\nasync function clearStaleCaches(): Promise<void> {\n try {\n if (!(\"caches\" in window)) return;\n const keys = await window.caches.keys();\n await Promise.all(\n keys\n .filter((key) => key.includes(\"precache\") || key.includes(\"ph-shell\"))\n .map((key) => window.caches.delete(key)),\n );\n } catch (error) {\n logger.warn(\n \"Failed to clear stale caches before update reload @error\",\n error,\n );\n }\n}\n\n/**\n * Detects that the server is serving a different build than the one this\n * page was loaded from (a new deploy) and reloads onto it — once per session\n * per deployed hash. Checked on mount and whenever the tab returns to the\n * foreground, so a deploy that lands while the tab sits open is picked up on\n * the next focus without a manual reload. The in-tab \"new version available\"\n * service-worker prompt (ServiceWorkerUpdatePrompt) remains the opt-in path\n * for workers that are waiting but not yet controlling.\n */\nexport const useCheckLatestVersion = () => {\n useEffect(() => {\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n return;\n }\n\n const checkBuildHash = async () => {\n const status = await getBuildHashStatus();\n if (!status || status.isCurrent) return;\n\n const reloadedFor = window.sessionStorage.getItem(RELOADED_FOR_KEY);\n if (reloadedFor === status.deployedHash) return;\n window.sessionStorage.setItem(RELOADED_FOR_KEY, status.deployedHash);\n\n logger.info(\n \"New deploy detected — reloading from build @currentHash to @deployedHash\",\n status.currentHash,\n status.deployedHash,\n );\n await clearStaleCaches();\n window.location.reload();\n };\n\n void checkBuildHash();\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") void checkBuildHash();\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n };\n }, []);\n};\n","import { getBuildHash } from \"../utils/build-info.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nexport interface BuildHashStatus {\n /** Hash baked into the running build. */\n currentHash: string;\n /** Hash the server is currently serving. */\n deployedHash: string;\n /** true when the running build matches what the server serves. */\n isCurrent: boolean;\n}\n\n/**\n * Same-origin build-identity probe. The build bakes a hash of the inputs that\n * determine the deployed content into the bundle (define\n * `PH_CONNECT_BUILD_HASH`, see builder-tools' connectBuildHashPlugin) and\n * emits `build-hash.json` next to the app (served no-cache). Comparing the\n * two tells us whether the server is serving a different build than the one\n * this page was loaded from — the reliable \"a new deploy went out\" signal.\n * Unlike the old GitHub-raw version check it works on localhost (it compares\n * against what the origin actually serves, not a remote branch head) and\n * needs no network beyond the app's own origin.\n *\n * Returns null when there is nothing to compare: dev/studio builds (no hash\n * baked), a server predating `build-hash.json`, an offline fetch, or a\n * malformed body.\n */\nexport const getBuildHashStatus = async (): Promise<BuildHashStatus | null> => {\n const currentHash = getBuildHash();\n if (!currentHash || currentHash === \"unknown\") return null;\n try {\n const result = await fetch(`${import.meta.env.BASE_URL}build-hash.json`, {\n cache: \"no-cache\",\n });\n if (!result.ok) return null;\n const data = (await result.json()) as { hash?: unknown };\n if (typeof data.hash !== \"string\" || !data.hash) return null;\n return {\n currentHash,\n deployedHash: data.hash,\n isCurrent: data.hash === currentHash,\n };\n } catch {\n return null;\n }\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\nimport { setUser as setSentryUser } from \"../services/sentry.js\";\n\nexport function useSetSentryUser() {\n const user = useUser();\n useEffect(() => {\n let sentryUser: SentryUser | null = null;\n if (user) {\n // saves the user info except the credential\n const { credential: _credential, ...rest } = user;\n sentryUser = { id: rest.did, username: rest.ens?.name, ...rest };\n }\n setSentryUser(sentryUser);\n }, [user]);\n}\n","import { useCheckLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport \"@powerhousedao/connect/i18n\";\nimport { createReactor, useSetSentryUser } from \"@powerhousedao/connect/store\";\nimport {\n detectMigrationMajor,\n detectReactorPgMajor,\n seedPendingPgVersion,\n} from \"@powerhousedao/connect/utils\";\nimport { initTheme } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { type ReactNode } from \"react\";\nimport { applyConnectBranding, loadRuntimeConfig } from \"../runtime-config.js\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await seedPendingPgVersion();\n await Promise.all([detectReactorPgMajor(), detectMigrationMajor()]);\n const runtimeConfig = await loadRuntimeConfig();\n applyConnectBranding(runtimeConfig);\n await createReactor(localPackage);\n return {\n default: ({ children }: { children?: ReactNode }) => {\n initTheme();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useSetSentryUser();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAQA,MAAM,mBAAmB;;;;;;;;;AAUzB,eAAe,mBAAkC;CAC/C,IAAI;EACF,IAAI,EAAE,YAAY,SAAS;EAC3B,MAAM,OAAO,MAAM,OAAO,OAAO,KAAK;EACtC,MAAM,QAAQ,IACZ,KACG,QAAQ,QAAQ,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,UAAU,CAAC,CAAC,CACrE,KAAK,QAAQ,OAAO,OAAO,OAAO,GAAG,CAAC,CAC3C;CACF,SAAS,OAAO;EACd,OAAO,KACL,4DACA,KACF;CACF;AACF;;;;;;;;;;AAWA,MAAa,8BAA8B;CACzC,gBAAgB;EACd,IACE,YAAY,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,iBAEf;EAGF,MAAM,iBAAiB,YAAY;GACjC,MAAM,SAAS,MAAM,mBAAmB;GACxC,IAAI,CAAC,UAAU,OAAO,WAAW;GAGjC,IADoB,OAAO,eAAe,QAAQ,gBACpC,MAAM,OAAO,cAAc;GACzC,OAAO,eAAe,QAAQ,kBAAkB,OAAO,YAAY;GAEnE,OAAO,KACL,4EACA,OAAO,aACP,OAAO,YACT;GACA,MAAM,iBAAiB;GACvB,OAAO,SAAS,OAAO;EACzB;EAEA,eAAoB;EACpB,MAAM,2BAA2B;GAC/B,IAAI,SAAS,oBAAoB,WAAW,eAAoB;EAClE;EACA,SAAS,iBAAiB,oBAAoB,kBAAkB;EAChE,aAAa;GACX,SAAS,oBAAoB,oBAAoB,kBAAkB;EACrE;CACF,GAAG,CAAC,CAAC;AACP;AC9EqB,OAAO,UAAU,WAAW,SAAS,KAAK;;;;;;;;;;;;;;;;AA0B/D,MAAa,qBAAqB,YAA6C;CAC7E,MAAM,cAAc,aAAa;CACjC,IAAI,CAAC,eAAe,gBAAgB,WAAW,OAAO;CACtD,IAAI;EACF,MAAM,SAAS,MAAM,MAAM,GAAG,YAAY,IAAI,SAAS,kBAAkB,EACvE,OAAO,WACT,CAAC;EACD,IAAI,CAAC,OAAO,IAAI,OAAO;EACvB,MAAM,OAAQ,MAAM,OAAO,KAAK;EAChC,IAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,MAAM,OAAO;EACxD,OAAO;GACL;GACA,cAAc,KAAK;GACnB,WAAW,KAAK,SAAS;EAC3B;CACF,QAAQ;EACN,OAAO;CACT;AACF;;;ACzCA,SAAgB,mBAAmB;CACjC,MAAM,OAAO,QAAQ;CACrB,gBAAgB;EACd,IAAI,aAAgC;EACpC,IAAI,MAAM;GAER,MAAM,EAAE,YAAY,aAAa,GAAG,SAAS;GAC7C,aAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;GAAK;EACjE;EACA,QAAc,UAAU;CAC1B,GAAG,CAAC,IAAI,CAAC;AACX;;;ACHA,eAAsB,cAAc,cAAiC;CACnE,MAAM,qBAAqB;CAC3B,MAAM,QAAQ,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,CAAC;CAClE,MAAM,gBAAgB,MAAM,kBAAkB;CAC9C,qBAAqB,aAAa;CAClC,MAAM,cAAc,YAAY;CAChC,OAAO,EACL,UAAU,EAAE,eAAyC;EACnD,UAAU;EAEV,iBAAiB;EAEjB,sBAAsB;EACtB,OAAO;CACT,EACF;AACF","debug_id":"4889212b-d5de-5871-95aa-6f3b7506b335"}
package/dist/main.js CHANGED
@@ -5,7 +5,7 @@ import { jsx } from "react/jsx-runtime";
5
5
  //#region main.tsx
6
6
  const root = await bootConnect();
7
7
  if (root) {
8
- const { AppLoader } = await import("./app-loader-DmJ10OyR.js");
8
+ const { AppLoader } = await import("./app-loader-HZ41uC1O.js");
9
9
  root.render(/* @__PURE__ */ jsx(AppLoader, {}));
10
10
  }
11
11
  //#endregion
@@ -1,6 +1,24 @@
1
- //#region src/utils/pglite-idb.ts
2
1
 
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]="ae106f6d-a19b-578a-a8b6-6a2e690d0eea")}catch(e){}}();
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]="bf83be21-3f86-55bd-ae14-c4aa466d5a81")}catch(e){}}();
3
+ import { UnsupportedStoredProtocolError } from "@powerhousedao/reactor";
4
+ //#region src/utils/stored-documents-refused.ts
5
+ const STORED_DOCUMENTS_REFUSED = "StoredDocumentsRefusedError";
6
+ var StoredDocumentsRefusedError = class extends Error {
7
+ constructor(cause) {
8
+ const named = cause.versions.map(({ protocol, version }) => `${protocol} ${version}`).join(", ");
9
+ super(`This browser holds ${cause.documents} document(s) that require ${named}, which this version of Connect does not run. Open them with a Connect build that runs ${named}, or set connect.reactor.unsupportedStoredDocuments to "read-only" in powerhouse.config.json to open them read-only.`, { cause });
10
+ this.name = STORED_DOCUMENTS_REFUSED;
11
+ }
12
+ };
13
+ /** Rewrites the reactor's refusal for the boot screen. */
14
+ function toStoredDocumentsRefused(error) {
15
+ return UnsupportedStoredProtocolError.isError(error) ? new StoredDocumentsRefusedError(error) : error;
16
+ }
17
+ function isStoredDocumentsRefused(error) {
18
+ return error instanceof Error && error.name === "StoredDocumentsRefusedError";
19
+ }
20
+ //#endregion
21
+ //#region src/utils/pglite-idb.ts
4
22
  const IDB_STORE_NAME = "FILE_DATA";
5
23
  function idbError(req, context) {
6
24
  const cause = req.error ?? /* @__PURE__ */ new Error("unknown IDB error");
@@ -92,7 +110,7 @@ async function loadPgDump(major) {
92
110
  throw new Error(`Unsupported PGlite major: ${String(major)}`);
93
111
  }
94
112
  //#endregion
95
- export { resolvePgMajorForRuntime as a, idbError as c, loadPgDump as i, openIdb as l, isMigratableMajor as n, IDB_STORE_NAME as o, loadPGliteModule as r, createFileDataStore as s, coerceMajor as t, readPgVersionFile as u };
113
+ export { resolvePgMajorForRuntime as a, idbError as c, isStoredDocumentsRefused as d, toStoredDocumentsRefused as f, loadPgDump as i, openIdb as l, isMigratableMajor as n, IDB_STORE_NAME as o, loadPGliteModule as r, createFileDataStore as s, coerceMajor as t, readPgVersionFile as u };
96
114
 
97
- //# sourceMappingURL=pglite-major-BbmMK26m.js.map
98
- //# debugId=ae106f6d-a19b-578a-a8b6-6a2e690d0eea
115
+ //# sourceMappingURL=pglite-major-p4_YefAE.js.map
116
+ //# debugId=bf83be21-3f86-55bd-ae14-c4aa466d5a81
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pglite-major-p4_YefAE.js","sources":["../src/utils/stored-documents-refused.ts","../src/utils/pglite-idb.ts","../src/utils/pglite-major.ts"],"sourcesContent":["import { UnsupportedStoredProtocolError } from \"@powerhousedao/reactor\";\n\nexport const STORED_DOCUMENTS_REFUSED = \"StoredDocumentsRefusedError\";\n\n// Only name and message cross the worker boundary, so the message says it all.\nexport class StoredDocumentsRefusedError extends Error {\n constructor(cause: UnsupportedStoredProtocolError) {\n const named = cause.versions\n .map(({ protocol, version }) => `${protocol} ${version}`)\n .join(\", \");\n super(\n `This browser holds ${cause.documents} document(s) that require ${named}, which this version of Connect does not run. ` +\n `Open them with a Connect build that runs ${named}, or set connect.reactor.unsupportedStoredDocuments to \"read-only\" in powerhouse.config.json to open them read-only.`,\n { cause },\n );\n this.name = STORED_DOCUMENTS_REFUSED;\n }\n}\n\n/** Rewrites the reactor's refusal for the boot screen. */\nexport function toStoredDocumentsRefused(error: unknown): unknown {\n return UnsupportedStoredProtocolError.isError(error)\n ? new StoredDocumentsRefusedError(error)\n : error;\n}\n\nexport function isStoredDocumentsRefused(error: unknown): error is Error {\n return error instanceof Error && error.name === STORED_DOCUMENTS_REFUSED;\n}\n","export const IDB_STORE_NAME = \"FILE_DATA\";\nexport const IDB_DB_VERSION = 21;\n\ntype FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\nexport function idbError(\n req: IDBRequest | IDBTransaction,\n context: string,\n): Error {\n const cause = req.error ?? new Error(\"unknown IDB error\");\n return new Error(`${context}: ${cause.message}`, { cause });\n}\n\nexport function indexedDbExists(name: string): Promise<boolean> {\n if (typeof indexedDB.databases === \"function\") {\n return indexedDB\n .databases()\n .then((dbs) => dbs.some((d) => d.name === name))\n .catch(() => true);\n }\n return Promise.resolve(true);\n}\n\nexport function openIdb(\n name: string,\n version: number,\n upgrade?: (db: IDBDatabase) => void,\n): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(name, version);\n req.onerror = () => reject(idbError(req, `IDB open failed for ${name}`));\n req.onblocked = () => reject(new Error(`IDB open blocked for ${name}`));\n req.onupgradeneeded = () => upgrade?.(req.result);\n req.onsuccess = () => resolve(req.result);\n });\n}\n\nexport function createFileDataStore(db: IDBDatabase): void {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) {\n const store = db.createObjectStore(IDB_STORE_NAME);\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n }\n}\n\nexport async function readPgVersionFile(\n idbName: string,\n): Promise<number | null> {\n if (!(await indexedDbExists(idbName))) return null;\n let db: IDBDatabase;\n try {\n db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n } catch {\n return null;\n }\n try {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) return null;\n const tx = db.transaction(IDB_STORE_NAME, \"readonly\");\n const store = tx.objectStore(IDB_STORE_NAME);\n const value = await new Promise<FileDataValue | null>((resolve, reject) => {\n const req = store.openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(null);\n const key = typeof cursor.key === \"string\" ? cursor.key : \"\";\n if (key.endsWith(\"/PG_VERSION\")) {\n resolve(cursor.value as FileDataValue);\n } else {\n cursor.continue();\n }\n };\n });\n if (!value) return null;\n const bytes =\n value.contents instanceof Uint8Array\n ? value.contents\n : new Uint8Array(value.contents);\n const text = new TextDecoder().decode(bytes).trim();\n const major = parseInt(text, 10);\n return Number.isFinite(major) ? major : null;\n } finally {\n db.close();\n }\n}\n","import type * as CurrentPGliteModuleNs from \"@electric-sql/pglite\";\n\nexport const CURRENT_PG_MAJOR = 17;\nexport const SUPPORTED_PG_MAJORS = [16, 17] as const;\nexport type SupportedPgMajor = (typeof SUPPORTED_PG_MAJORS)[number];\nexport type DetectedMajor = SupportedPgMajor | null;\n\ntype CurrentPGliteModule = typeof CurrentPGliteModuleNs;\n\nexport function coerceMajor(value: number | null): DetectedMajor {\n if (value === null) return null;\n return (SUPPORTED_PG_MAJORS as readonly number[]).includes(value)\n ? (value as SupportedPgMajor)\n : null;\n}\n\nexport function isMigratableMajor(\n value: number | null,\n): value is SupportedPgMajor {\n const major = coerceMajor(value);\n return major !== null && major !== CURRENT_PG_MAJOR;\n}\n\n/**\n * Pick the PGlite major to use for *new* reactor clients: fall back to the\n * current version when there is no existing data dir.\n */\nexport function resolvePgMajorForRuntime(\n detected: DetectedMajor,\n): SupportedPgMajor {\n return detected ?? CURRENT_PG_MAJOR;\n}\n\n/**\n * Loads the PGlite module that matches an on-disk data dir major version.\n *\n * The 0.2.x and 0.3.x modules expose the same runtime interface (PGlite class,\n * `idb://` data-dir support, waitReady, exec/query/transaction, close). The\n * return type is pinned to the current package's module so callers can use it\n * against `kysely-pglite-dialect` which peer-depends on both majors.\n */\nexport async function loadPGliteModule(\n major: SupportedPgMajor,\n): Promise<CurrentPGliteModule> {\n if (major === 16) {\n return (await import(\"pglite-legacy-02\")) as unknown as CurrentPGliteModule;\n }\n if (major === 17) return import(\"@electric-sql/pglite\");\n throw new Error(`Unsupported PGlite major: ${String(major)}`);\n}\n\ntype PgDumpFn = (options: {\n pg: unknown;\n}) => Promise<{ text(): Promise<string> }>;\n\n/**\n * Loads the pg_dump tool for the given PGlite major. pg_dump's VFS layout is\n * version-specific, so using the wrong major against a live PGlite instance\n * fails with Emscripten ENOENT (errno 44).\n */\nexport async function loadPgDump(major: SupportedPgMajor): Promise<PgDumpFn> {\n if (major === 16) {\n const mod = (await import(\"pglite-tools-legacy-02/pg_dump\")) as {\n pgDump: PgDumpFn;\n };\n return mod.pgDump;\n }\n if (major === 17) {\n const mod = (await import(\"@electric-sql/pglite-tools/pg_dump\")) as {\n pgDump: PgDumpFn;\n };\n return mod.pgDump;\n }\n throw new Error(`Unsupported PGlite major: ${String(major)}`);\n}\n"],"names":[],"mappings":"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","debug_id":"bf83be21-3f86-55bd-ae14-c4aa466d5a81"}
@@ -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]="542cf4dc-7da9-516e-b1a0-2fcc0a0c16af")}catch(e){}}();
3
- import { c as idbError, l as openIdb, n as isMigratableMajor, o as IDB_STORE_NAME, s as createFileDataStore, u as readPgVersionFile } from "./pglite-major-BbmMK26m.js";
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]="b8f54f63-862e-5017-822c-cf08ac6f7ca2")}catch(e){}}();
3
+ import { c as idbError, l as openIdb, n as isMigratableMajor, o as IDB_STORE_NAME, s as createFileDataStore, u as readPgVersionFile } from "./pglite-major-p4_YefAE.js";
4
4
  import { PGlite } from "@electric-sql/pglite";
5
5
  //#region src/utils/pglite-migrate-core.ts
6
6
  const LEGACY_DUMPERS = { 16: async () => {
@@ -141,5 +141,5 @@ async function migrateIdb(idbName, publishPhase, backup) {
141
141
  //#endregion
142
142
  export { writeFileData as a, readFileData as i, cloneFileData as n, migrateIdb as r, clearFileData as t };
143
143
 
144
- //# sourceMappingURL=pglite-migrate-core-o88cWesm.js.map
145
- //# debugId=542cf4dc-7da9-516e-b1a0-2fcc0a0c16af
144
+ //# sourceMappingURL=pglite-migrate-core-BcXcImng.js.map
145
+ //# debugId=b8f54f63-862e-5017-822c-cf08ac6f7ca2
@@ -1 +1 @@
1
- {"version":3,"file":"pglite-migrate-core-o88cWesm.js","sources":["../src/utils/pglite-migrate-core.ts"],"sourcesContent":["import { PGlite } from \"@electric-sql/pglite\";\nimport {\n createFileDataStore,\n IDB_DB_VERSION,\n IDB_STORE_NAME,\n idbError,\n openIdb,\n readPgVersionFile,\n} from \"./pglite-idb.js\";\nimport { CURRENT_PG_MAJOR, isMigratableMajor } from \"./pglite-major.js\";\n\nexport type MigrationPhase = \"clone\" | \"dump\" | \"restore\";\n\nexport type FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\nexport type FileDataEntry = { key: IDBValidKey; value: FileDataValue };\n\n// Snapshots a data dir before migration and restores/discards it after. The\n// flag-off path persists to an IDB backup (with retention); the worker keeps\n// the snapshot in memory for same-run rollback only.\nexport interface BackupStrategy {\n snapshot(idbName: string): Promise<unknown>;\n rollback(handle: unknown, idbName: string, cause: unknown): Promise<void>;\n discard(handle: unknown): Promise<void>;\n commit(handle: unknown): Promise<void>;\n}\n\ntype LegacyDumper = (idbName: string) => Promise<string>;\n\nconst LEGACY_DUMPERS: Partial<Record<number, () => Promise<LegacyDumper>>> = {\n 16: async () => {\n const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([\n import(\"pglite-legacy-02\"),\n import(\"pglite-tools-legacy-02/pg_dump\"),\n ]);\n return async (idbName: string) => {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new LegacyPGlite(`idb://${stripped}`);\n try {\n await pg.waitReady;\n const file = await pgDump({ pg });\n return await file.text();\n } finally {\n await pg.close();\n }\n };\n },\n};\n\nexport async function clearFileData(idbName: string): Promise<void> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA clear failed for ${idbName}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA clear aborted for ${idbName}`));\n tx.objectStore(IDB_STORE_NAME).clear();\n });\n } finally {\n db.close();\n }\n}\n\nexport async function readFileData(idbName: string): Promise<FileDataEntry[]> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n return await new Promise<FileDataEntry[]>((resolve, reject) => {\n const out: FileDataEntry[] = [];\n const req = db\n .transaction(IDB_STORE_NAME, \"readonly\")\n .objectStore(IDB_STORE_NAME)\n .openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA read cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(out);\n out.push({ key: cursor.key, value: cursor.value as FileDataValue });\n cursor.continue();\n };\n });\n } finally {\n db.close();\n }\n}\n\nexport async function writeFileData(\n idbName: string,\n entries: FileDataEntry[],\n): Promise<void> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA write failed for ${idbName}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA write aborted for ${idbName}`));\n const store = tx.objectStore(IDB_STORE_NAME);\n store.clear();\n for (const { key, value } of entries) {\n store.put(value, key);\n }\n });\n } finally {\n db.close();\n }\n}\n\nexport async function cloneFileData(\n sourceName: string,\n destName: string,\n): Promise<void> {\n await writeFileData(destName, await readFileData(sourceName));\n}\n\nfunction logRestoreFailure(idbName: string, sql: string, err: unknown): void {\n const errObj = err as {\n message?: string;\n position?: string | number;\n severity?: string;\n code?: string;\n detail?: string;\n where?: string;\n };\n const position =\n typeof errObj.position === \"string\"\n ? parseInt(errObj.position, 10)\n : typeof errObj.position === \"number\"\n ? errObj.position\n : NaN;\n\n console.error(`[pglite-migration] Restore failed for ${idbName}`, {\n message: errObj.message,\n code: errObj.code,\n severity: errObj.severity,\n detail: errObj.detail,\n where: errObj.where,\n position: errObj.position,\n sqlLength: sql.length,\n });\n\n if (Number.isFinite(position) && position > 0) {\n const zeroBased = position - 1;\n const start = Math.max(0, zeroBased - 200);\n const end = Math.min(sql.length, zeroBased + 200);\n console.error(\n `[pglite-migration] SQL context around position ${position}:\\n${sql.slice(start, zeroBased)}»${sql.slice(zeroBased, zeroBased + 1)}«${sql.slice(zeroBased + 1, end)}`,\n );\n } else {\n console.error(\n `[pglite-migration] No position info. First 2000 chars of dump:\\n${sql.slice(0, 2000)}`,\n );\n }\n}\n\nasync function restoreDumpIntoIdb(idbName: string, sql: string): Promise<void> {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new PGlite(`idb://${stripped}`, { relaxedDurability: false });\n try {\n await pg.waitReady;\n // PG16 pg_dump emits doubled backslashes (escape-string form) without the\n // matching SET; PG17 defaults standard_conforming_strings on, breaking JSONB.\n try {\n await pg.exec(\"SET standard_conforming_strings = off;\");\n } catch (gucErr) {\n console.warn(\n \"[pglite-migration] Could not force standard_conforming_strings=off\",\n gucErr,\n );\n }\n try {\n await pg.exec(sql);\n } catch (execErr) {\n logRestoreFailure(idbName, sql, execErr);\n throw execErr;\n }\n } finally {\n await pg.close();\n }\n}\n\nexport async function migrateIdb(\n idbName: string,\n publishPhase: (phase: MigrationPhase) => void,\n backup: BackupStrategy,\n): Promise<void> {\n const major = await readPgVersionFile(idbName);\n if (major === null || major === CURRENT_PG_MAJOR) return;\n\n if (!isMigratableMajor(major)) {\n console.warn(\n `[pglite-migration] Skipping ${idbName}: unsupported PG_VERSION=${major}; no migration path.`,\n );\n return;\n }\n\n const loader = LEGACY_DUMPERS[major];\n if (!loader) {\n throw new Error(\n `No legacy dumper for supported PG_VERSION=${major} (${idbName}); ` +\n `SUPPORTED_PG_MAJORS and LEGACY_DUMPERS are out of sync.`,\n );\n }\n\n publishPhase(\"clone\");\n const handle = await backup.snapshot(idbName);\n\n let sql: string;\n try {\n publishPhase(\"dump\");\n const dump = await loader();\n sql = await dump(idbName);\n } catch (err) {\n await backup.discard(handle);\n throw err;\n }\n\n try {\n await clearFileData(idbName);\n publishPhase(\"restore\");\n await restoreDumpIntoIdb(idbName, sql);\n } catch (err) {\n await backup.rollback(handle, idbName, err);\n throw err;\n }\n await backup.commit(handle);\n}\n"],"names":[],"mappings":"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","debug_id":"542cf4dc-7da9-516e-b1a0-2fcc0a0c16af"}
1
+ {"version":3,"file":"pglite-migrate-core-BcXcImng.js","sources":["../src/utils/pglite-migrate-core.ts"],"sourcesContent":["import { PGlite } from \"@electric-sql/pglite\";\nimport {\n createFileDataStore,\n IDB_DB_VERSION,\n IDB_STORE_NAME,\n idbError,\n openIdb,\n readPgVersionFile,\n} from \"./pglite-idb.js\";\nimport { CURRENT_PG_MAJOR, isMigratableMajor } from \"./pglite-major.js\";\n\nexport type MigrationPhase = \"clone\" | \"dump\" | \"restore\";\n\nexport type FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\nexport type FileDataEntry = { key: IDBValidKey; value: FileDataValue };\n\n// Snapshots a data dir before migration and restores/discards it after. The\n// flag-off path persists to an IDB backup (with retention); the worker keeps\n// the snapshot in memory for same-run rollback only.\nexport interface BackupStrategy {\n snapshot(idbName: string): Promise<unknown>;\n rollback(handle: unknown, idbName: string, cause: unknown): Promise<void>;\n discard(handle: unknown): Promise<void>;\n commit(handle: unknown): Promise<void>;\n}\n\ntype LegacyDumper = (idbName: string) => Promise<string>;\n\nconst LEGACY_DUMPERS: Partial<Record<number, () => Promise<LegacyDumper>>> = {\n 16: async () => {\n const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([\n import(\"pglite-legacy-02\"),\n import(\"pglite-tools-legacy-02/pg_dump\"),\n ]);\n return async (idbName: string) => {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new LegacyPGlite(`idb://${stripped}`);\n try {\n await pg.waitReady;\n const file = await pgDump({ pg });\n return await file.text();\n } finally {\n await pg.close();\n }\n };\n },\n};\n\nexport async function clearFileData(idbName: string): Promise<void> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA clear failed for ${idbName}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA clear aborted for ${idbName}`));\n tx.objectStore(IDB_STORE_NAME).clear();\n });\n } finally {\n db.close();\n }\n}\n\nexport async function readFileData(idbName: string): Promise<FileDataEntry[]> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n return await new Promise<FileDataEntry[]>((resolve, reject) => {\n const out: FileDataEntry[] = [];\n const req = db\n .transaction(IDB_STORE_NAME, \"readonly\")\n .objectStore(IDB_STORE_NAME)\n .openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA read cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(out);\n out.push({ key: cursor.key, value: cursor.value as FileDataValue });\n cursor.continue();\n };\n });\n } finally {\n db.close();\n }\n}\n\nexport async function writeFileData(\n idbName: string,\n entries: FileDataEntry[],\n): Promise<void> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA write failed for ${idbName}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA write aborted for ${idbName}`));\n const store = tx.objectStore(IDB_STORE_NAME);\n store.clear();\n for (const { key, value } of entries) {\n store.put(value, key);\n }\n });\n } finally {\n db.close();\n }\n}\n\nexport async function cloneFileData(\n sourceName: string,\n destName: string,\n): Promise<void> {\n await writeFileData(destName, await readFileData(sourceName));\n}\n\nfunction logRestoreFailure(idbName: string, sql: string, err: unknown): void {\n const errObj = err as {\n message?: string;\n position?: string | number;\n severity?: string;\n code?: string;\n detail?: string;\n where?: string;\n };\n const position =\n typeof errObj.position === \"string\"\n ? parseInt(errObj.position, 10)\n : typeof errObj.position === \"number\"\n ? errObj.position\n : NaN;\n\n console.error(`[pglite-migration] Restore failed for ${idbName}`, {\n message: errObj.message,\n code: errObj.code,\n severity: errObj.severity,\n detail: errObj.detail,\n where: errObj.where,\n position: errObj.position,\n sqlLength: sql.length,\n });\n\n if (Number.isFinite(position) && position > 0) {\n const zeroBased = position - 1;\n const start = Math.max(0, zeroBased - 200);\n const end = Math.min(sql.length, zeroBased + 200);\n console.error(\n `[pglite-migration] SQL context around position ${position}:\\n${sql.slice(start, zeroBased)}»${sql.slice(zeroBased, zeroBased + 1)}«${sql.slice(zeroBased + 1, end)}`,\n );\n } else {\n console.error(\n `[pglite-migration] No position info. First 2000 chars of dump:\\n${sql.slice(0, 2000)}`,\n );\n }\n}\n\nasync function restoreDumpIntoIdb(idbName: string, sql: string): Promise<void> {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new PGlite(`idb://${stripped}`, { relaxedDurability: false });\n try {\n await pg.waitReady;\n // PG16 pg_dump emits doubled backslashes (escape-string form) without the\n // matching SET; PG17 defaults standard_conforming_strings on, breaking JSONB.\n try {\n await pg.exec(\"SET standard_conforming_strings = off;\");\n } catch (gucErr) {\n console.warn(\n \"[pglite-migration] Could not force standard_conforming_strings=off\",\n gucErr,\n );\n }\n try {\n await pg.exec(sql);\n } catch (execErr) {\n logRestoreFailure(idbName, sql, execErr);\n throw execErr;\n }\n } finally {\n await pg.close();\n }\n}\n\nexport async function migrateIdb(\n idbName: string,\n publishPhase: (phase: MigrationPhase) => void,\n backup: BackupStrategy,\n): Promise<void> {\n const major = await readPgVersionFile(idbName);\n if (major === null || major === CURRENT_PG_MAJOR) return;\n\n if (!isMigratableMajor(major)) {\n console.warn(\n `[pglite-migration] Skipping ${idbName}: unsupported PG_VERSION=${major}; no migration path.`,\n );\n return;\n }\n\n const loader = LEGACY_DUMPERS[major];\n if (!loader) {\n throw new Error(\n `No legacy dumper for supported PG_VERSION=${major} (${idbName}); ` +\n `SUPPORTED_PG_MAJORS and LEGACY_DUMPERS are out of sync.`,\n );\n }\n\n publishPhase(\"clone\");\n const handle = await backup.snapshot(idbName);\n\n let sql: string;\n try {\n publishPhase(\"dump\");\n const dump = await loader();\n sql = await dump(idbName);\n } catch (err) {\n await backup.discard(handle);\n throw err;\n }\n\n try {\n await clearFileData(idbName);\n publishPhase(\"restore\");\n await restoreDumpIntoIdb(idbName, sql);\n } catch (err) {\n await backup.rollback(handle, idbName, err);\n throw err;\n }\n await backup.commit(handle);\n}\n"],"names":[],"mappings":"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","debug_id":"b8f54f63-862e-5017-822c-cf08ac6f7ca2"}
@@ -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]="7438f092-f372-5bbb-a690-342b5de78ec8")}catch(e){}}();
3
- import { l as invalidateReactorPgMajorCache, m as REACTOR_PGLITE_NAME } from "./connection-state-Cy8xRCm_.js";
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]="d59c69fe-5f4d-5aa8-accd-b4fbae2bd47a")}catch(e){}}();
3
+ import { l as invalidateReactorPgMajorCache, m as REACTOR_PGLITE_NAME } from "./connection-state-Eqc2izmt.js";
4
4
  //#region src/utils/pglite-seed.ts
5
5
  const PENDING_PG_SEED_KEY = "ph:pending-pg-seed";
6
6
  /**
@@ -45,5 +45,5 @@ async function seedPendingPgVersion() {
45
45
  //#endregion
46
46
  export { seedPendingPgVersion as n, PENDING_PG_SEED_KEY as t };
47
47
 
48
- //# sourceMappingURL=pglite-seed-D6fqQApT.js.map
49
- //# debugId=7438f092-f372-5bbb-a690-342b5de78ec8
48
+ //# sourceMappingURL=pglite-seed-Cl2d-iyl.js.map
49
+ //# debugId=d59c69fe-5f4d-5aa8-accd-b4fbae2bd47a
@@ -1 +1 @@
1
- {"version":3,"file":"pglite-seed-D6fqQApT.js","sources":["../src/utils/pglite-seed.ts"],"sourcesContent":["import { invalidateReactorPgMajorCache } from \"./pglite-runtime.js\";\nimport { REACTOR_PGLITE_NAME } from \"./storage-namespace.js\";\n\nexport const PENDING_PG_SEED_KEY = \"ph:pending-pg-seed\";\n\n/**\n * If the Debug Inspector requested a forced PG version reset, this runs\n * before the reactor is created on the subsequent page load: opens a fresh\n * PGlite of the requested major against the reactor data dir, lets `initdb`\n * populate `PG_VERSION`, then closes. The next step of app boot then\n * detects this fresh data dir and picks the matching runtime.\n */\nexport async function seedPendingPgVersion(): Promise<void> {\n const raw = localStorage.getItem(PENDING_PG_SEED_KEY);\n if (!raw) return;\n\n const major = parseInt(raw, 10);\n console.info(`[pglite-seed] Seeding fresh PG${major} data dir...`);\n\n try {\n if (major === 16) {\n const { PGlite } = await import(\"pglite-legacy-02\");\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`);\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else if (major === 17) {\n const { PGlite } = await import(\"@electric-sql/pglite\");\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`);\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else {\n console.warn(`[pglite-seed] Unsupported version ${raw}, skipping`);\n return;\n }\n console.info(`[pglite-seed] Seeded PG${major} data dir.`);\n } finally {\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n invalidateReactorPgMajorCache();\n }\n}\n"],"names":[],"mappings":";;;;AAGA,MAAa,sBAAsB;;;;;;;;AASnC,eAAsB,uBAAsC;CAC1D,MAAM,MAAM,aAAa,QAAQ,mBAAmB;CACpD,IAAI,CAAC,KAAK;CAEV,MAAM,QAAQ,SAAS,KAAK,EAAE;CAC9B,QAAQ,KAAK,iCAAiC,MAAM,aAAa;CAEjE,IAAI;EACF,IAAI,UAAU,IAAI;GAChB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,qBAAqB;GACpD,IAAI;IACF,MAAM,GAAG;GACX,UAAU;IACR,MAAM,GAAG,MAAM;GACjB;EACF,OAAO,IAAI,UAAU,IAAI;GACvB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,qBAAqB;GACpD,IAAI;IACF,MAAM,GAAG;GACX,UAAU;IACR,MAAM,GAAG,MAAM;GACjB;EACF,OAAO;GACL,QAAQ,KAAK,qCAAqC,IAAI,WAAW;GACjE;EACF;EACA,QAAQ,KAAK,0BAA0B,MAAM,WAAW;CAC1D,UAAU;EACR,aAAa,WAAW,mBAAmB;EAC3C,8BAA8B;CAChC;AACF","debug_id":"7438f092-f372-5bbb-a690-342b5de78ec8"}
1
+ {"version":3,"file":"pglite-seed-Cl2d-iyl.js","sources":["../src/utils/pglite-seed.ts"],"sourcesContent":["import { invalidateReactorPgMajorCache } from \"./pglite-runtime.js\";\nimport { REACTOR_PGLITE_NAME } from \"./storage-namespace.js\";\n\nexport const PENDING_PG_SEED_KEY = \"ph:pending-pg-seed\";\n\n/**\n * If the Debug Inspector requested a forced PG version reset, this runs\n * before the reactor is created on the subsequent page load: opens a fresh\n * PGlite of the requested major against the reactor data dir, lets `initdb`\n * populate `PG_VERSION`, then closes. The next step of app boot then\n * detects this fresh data dir and picks the matching runtime.\n */\nexport async function seedPendingPgVersion(): Promise<void> {\n const raw = localStorage.getItem(PENDING_PG_SEED_KEY);\n if (!raw) return;\n\n const major = parseInt(raw, 10);\n console.info(`[pglite-seed] Seeding fresh PG${major} data dir...`);\n\n try {\n if (major === 16) {\n const { PGlite } = await import(\"pglite-legacy-02\");\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`);\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else if (major === 17) {\n const { PGlite } = await import(\"@electric-sql/pglite\");\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`);\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else {\n console.warn(`[pglite-seed] Unsupported version ${raw}, skipping`);\n return;\n }\n console.info(`[pglite-seed] Seeded PG${major} data dir.`);\n } finally {\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n invalidateReactorPgMajorCache();\n }\n}\n"],"names":[],"mappings":";;;;AAGA,MAAa,sBAAsB;;;;;;;;AASnC,eAAsB,uBAAsC;CAC1D,MAAM,MAAM,aAAa,QAAQ,mBAAmB;CACpD,IAAI,CAAC,KAAK;CAEV,MAAM,QAAQ,SAAS,KAAK,EAAE;CAC9B,QAAQ,KAAK,iCAAiC,MAAM,aAAa;CAEjE,IAAI;EACF,IAAI,UAAU,IAAI;GAChB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,qBAAqB;GACpD,IAAI;IACF,MAAM,GAAG;GACX,UAAU;IACR,MAAM,GAAG,MAAM;GACjB;EACF,OAAO,IAAI,UAAU,IAAI;GACvB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,qBAAqB;GACpD,IAAI;IACF,MAAM,GAAG;GACX,UAAU;IACR,MAAM,GAAG,MAAM;GACjB;EACF,OAAO;GACL,QAAQ,KAAK,qCAAqC,IAAI,WAAW;GACjE;EACF;EACA,QAAQ,KAAK,0BAA0B,MAAM,WAAW;CAC1D,UAAU;EACR,aAAa,WAAW,mBAAmB;EAC3C,8BAA8B;CAChC;AACF","debug_id":"d59c69fe-5f4d-5aa8-accd-b4fbae2bd47a"}
@@ -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]="4a41eac7-4ff9-5270-806f-6cea2b13255f")}catch(e){}}();
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]="ee33d4d1-ef09-5b2c-8c8a-cf207add5ce2")}catch(e){}}();
3
3
  import { t as getIsEmbedded } from "./useIsEmbedded-BWJ0qb7w.js";
4
- import { r as connectConfig } from "./connect.config-Dgs13R1s.js";
4
+ import { r as connectConfig } from "./connect.config-CaXMoB42.js";
5
5
  import { useSyncExternalStore } from "react";
6
6
  //#region src/hooks/preferences-store.ts
7
7
  const namespace = connectConfig.routerBasename;
@@ -81,5 +81,5 @@ const useCookieBanner = () => {
81
81
  //#endregion
82
82
  export { useAcceptedCookies as n, useCookieBanner as r, setBannerShown as t };
83
83
 
84
- //# sourceMappingURL=preferences-store-Bekp7tv-.js.map
85
- //# debugId=4a41eac7-4ff9-5270-806f-6cea2b13255f
84
+ //# sourceMappingURL=preferences-store-DZUIAkHE.js.map
85
+ //# debugId=ee33d4d1-ef09-5b2c-8c8a-cf207add5ce2
@@ -1 +1 @@
1
- {"version":3,"file":"preferences-store-Bekp7tv-.js","sources":["../src/hooks/preferences-store.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\n\nimport { getIsEmbedded } from \"./useIsEmbedded.js\";\n\nconst namespace = connectConfig.routerBasename;\n\n/**\n * Block-proof home for Connect's consent and banner state.\n *\n * The file name deliberately avoids words that appear in ad-blocker\n * filter lists (cookie, banner, consent, analytics, ...). Modules in the\n * app's critical import chain import from here, never from files whose\n * URLs match those filters. If an ad blocker blocks the lazy-loaded\n * cookie-banner chunk instead, the app simply never shows the banner —\n * which leaves the flags at their rejected defaults (analytics off) —\n * and everything else keeps working.\n */\n\n// ---------------------------------------------------------------------------\n// Accepted cookies (analytics / marketing / functional)\n// ---------------------------------------------------------------------------\n\nexport const ACCEPTED_COOKIES_KEY_STORAGE = `${namespace}:acceptedCookies`;\n\nexport interface AcceptedCookies {\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n}\n\nconst REJECTED_COOKIES: AcceptedCookies = {\n analytics: false,\n marketing: false,\n functional: false,\n};\n\nconst cookieListeners = new Set<() => void>();\n\nlet acceptedCookies: AcceptedCookies = getInitialAcceptedCookies();\n\nfunction getInitialAcceptedCookies(): AcceptedCookies {\n try {\n const value = localStorage.getItem(ACCEPTED_COOKIES_KEY_STORAGE);\n return value ? (JSON.parse(value) as AcceptedCookies) : REJECTED_COOKIES;\n } catch {\n return REJECTED_COOKIES;\n }\n}\n\nfunction subscribeAcceptedCookies(fn: () => void) {\n cookieListeners.add(fn);\n return () => {\n cookieListeners.delete(fn);\n };\n}\n\nfunction getAcceptedCookies(): AcceptedCookies {\n return acceptedCookies;\n}\n\nexport function setAcceptedCookies(\n setter: (prev: AcceptedCookies) => AcceptedCookies,\n) {\n acceptedCookies = setter(acceptedCookies);\n localStorage.setItem(\n ACCEPTED_COOKIES_KEY_STORAGE,\n JSON.stringify(acceptedCookies),\n );\n cookieListeners.forEach((fn) => fn());\n}\n\nexport const useAcceptedCookies = () => {\n const cookies = useSyncExternalStore(\n subscribeAcceptedCookies,\n getAcceptedCookies,\n getAcceptedCookies,\n );\n return [cookies, setAcceptedCookies] as const;\n};\n\n// ---------------------------------------------------------------------------\n// Cookie banner visibility\n// ---------------------------------------------------------------------------\n\nexport const COOKIE_BANNER_KEY_STORAGE = `${namespace}:display-cookie-banner`;\n\nconst bannerListeners = new Set<() => void>();\n\nlet bannerShown = getInitialBannerShown();\n\nfunction getInitialBannerShown(): boolean {\n if (getIsEmbedded()) return false;\n try {\n const value = localStorage.getItem(COOKIE_BANNER_KEY_STORAGE);\n return value !== \"false\";\n } catch (error) {\n console.error(error);\n return true;\n }\n}\n\nfunction subscribeBannerShown(fn: () => void) {\n bannerListeners.add(fn);\n return () => {\n bannerListeners.delete(fn);\n };\n}\n\nfunction getBannerShown(): boolean {\n return bannerShown;\n}\n\nexport function setBannerShown(state: boolean) {\n bannerShown = state;\n localStorage.setItem(COOKIE_BANNER_KEY_STORAGE, JSON.stringify(state));\n bannerListeners.forEach((fn) => fn());\n}\n\nexport const useCookieBanner = () => {\n const shown = useSyncExternalStore(\n subscribeBannerShown,\n getBannerShown,\n getBannerShown,\n );\n return [shown, setBannerShown] as const;\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,YAAY,cAAc;;;;;;;;;;;;AAkBhC,MAAa,+BAA+B,GAAG,UAAU;AAQzD,MAAM,mBAAoC;CACxC,WAAW;CACX,WAAW;CACX,YAAY;AACd;AAEA,MAAM,kCAAkB,IAAI,IAAgB;AAE5C,IAAI,kBAAmC,0BAA0B;AAEjE,SAAS,4BAA6C;CACpD,IAAI;EACF,MAAM,QAAQ,aAAa,QAAQ,4BAA4B;EAC/D,OAAO,QAAS,KAAK,MAAM,KAAK,IAAwB;CAC1D,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,yBAAyB,IAAgB;CAChD,gBAAgB,IAAI,EAAE;CACtB,aAAa;EACX,gBAAgB,OAAO,EAAE;CAC3B;AACF;AAEA,SAAS,qBAAsC;CAC7C,OAAO;AACT;AAEA,SAAgB,mBACd,QACA;CACA,kBAAkB,OAAO,eAAe;CACxC,aAAa,QACX,8BACA,KAAK,UAAU,eAAe,CAChC;CACA,gBAAgB,SAAS,OAAO,GAAG,CAAC;AACtC;AAEA,MAAa,2BAA2B;CAMtC,OAAO,CALS,qBACd,0BACA,oBACA,kBAEY,GAAG,kBAAkB;AACrC;AAMA,MAAa,4BAA4B,GAAG,UAAU;AAEtD,MAAM,kCAAkB,IAAI,IAAgB;AAE5C,IAAI,cAAc,sBAAsB;AAExC,SAAS,wBAAiC;CACxC,IAAI,cAAc,GAAG,OAAO;CAC5B,IAAI;EAEF,OADc,aAAa,QAAQ,yBACxB,MAAM;CACnB,SAAS,OAAO;EACd,QAAQ,MAAM,KAAK;EACnB,OAAO;CACT;AACF;AAEA,SAAS,qBAAqB,IAAgB;CAC5C,gBAAgB,IAAI,EAAE;CACtB,aAAa;EACX,gBAAgB,OAAO,EAAE;CAC3B;AACF;AAEA,SAAS,iBAA0B;CACjC,OAAO;AACT;AAEA,SAAgB,eAAe,OAAgB;CAC7C,cAAc;CACd,aAAa,QAAQ,2BAA2B,KAAK,UAAU,KAAK,CAAC;CACrE,gBAAgB,SAAS,OAAO,GAAG,CAAC;AACtC;AAEA,MAAa,wBAAwB;CAMnC,OAAO,CALO,qBACZ,sBACA,gBACA,cAEU,GAAG,cAAc;AAC/B","debug_id":"4a41eac7-4ff9-5270-806f-6cea2b13255f"}
1
+ {"version":3,"file":"preferences-store-DZUIAkHE.js","sources":["../src/hooks/preferences-store.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\n\nimport { getIsEmbedded } from \"./useIsEmbedded.js\";\n\nconst namespace = connectConfig.routerBasename;\n\n/**\n * Block-proof home for Connect's consent and banner state.\n *\n * The file name deliberately avoids words that appear in ad-blocker\n * filter lists (cookie, banner, consent, analytics, ...). Modules in the\n * app's critical import chain import from here, never from files whose\n * URLs match those filters. If an ad blocker blocks the lazy-loaded\n * cookie-banner chunk instead, the app simply never shows the banner —\n * which leaves the flags at their rejected defaults (analytics off) —\n * and everything else keeps working.\n */\n\n// ---------------------------------------------------------------------------\n// Accepted cookies (analytics / marketing / functional)\n// ---------------------------------------------------------------------------\n\nexport const ACCEPTED_COOKIES_KEY_STORAGE = `${namespace}:acceptedCookies`;\n\nexport interface AcceptedCookies {\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n}\n\nconst REJECTED_COOKIES: AcceptedCookies = {\n analytics: false,\n marketing: false,\n functional: false,\n};\n\nconst cookieListeners = new Set<() => void>();\n\nlet acceptedCookies: AcceptedCookies = getInitialAcceptedCookies();\n\nfunction getInitialAcceptedCookies(): AcceptedCookies {\n try {\n const value = localStorage.getItem(ACCEPTED_COOKIES_KEY_STORAGE);\n return value ? (JSON.parse(value) as AcceptedCookies) : REJECTED_COOKIES;\n } catch {\n return REJECTED_COOKIES;\n }\n}\n\nfunction subscribeAcceptedCookies(fn: () => void) {\n cookieListeners.add(fn);\n return () => {\n cookieListeners.delete(fn);\n };\n}\n\nfunction getAcceptedCookies(): AcceptedCookies {\n return acceptedCookies;\n}\n\nexport function setAcceptedCookies(\n setter: (prev: AcceptedCookies) => AcceptedCookies,\n) {\n acceptedCookies = setter(acceptedCookies);\n localStorage.setItem(\n ACCEPTED_COOKIES_KEY_STORAGE,\n JSON.stringify(acceptedCookies),\n );\n cookieListeners.forEach((fn) => fn());\n}\n\nexport const useAcceptedCookies = () => {\n const cookies = useSyncExternalStore(\n subscribeAcceptedCookies,\n getAcceptedCookies,\n getAcceptedCookies,\n );\n return [cookies, setAcceptedCookies] as const;\n};\n\n// ---------------------------------------------------------------------------\n// Cookie banner visibility\n// ---------------------------------------------------------------------------\n\nexport const COOKIE_BANNER_KEY_STORAGE = `${namespace}:display-cookie-banner`;\n\nconst bannerListeners = new Set<() => void>();\n\nlet bannerShown = getInitialBannerShown();\n\nfunction getInitialBannerShown(): boolean {\n if (getIsEmbedded()) return false;\n try {\n const value = localStorage.getItem(COOKIE_BANNER_KEY_STORAGE);\n return value !== \"false\";\n } catch (error) {\n console.error(error);\n return true;\n }\n}\n\nfunction subscribeBannerShown(fn: () => void) {\n bannerListeners.add(fn);\n return () => {\n bannerListeners.delete(fn);\n };\n}\n\nfunction getBannerShown(): boolean {\n return bannerShown;\n}\n\nexport function setBannerShown(state: boolean) {\n bannerShown = state;\n localStorage.setItem(COOKIE_BANNER_KEY_STORAGE, JSON.stringify(state));\n bannerListeners.forEach((fn) => fn());\n}\n\nexport const useCookieBanner = () => {\n const shown = useSyncExternalStore(\n subscribeBannerShown,\n getBannerShown,\n getBannerShown,\n );\n return [shown, setBannerShown] as const;\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,YAAY,cAAc;;;;;;;;;;;;AAkBhC,MAAa,+BAA+B,GAAG,UAAU;AAQzD,MAAM,mBAAoC;CACxC,WAAW;CACX,WAAW;CACX,YAAY;AACd;AAEA,MAAM,kCAAkB,IAAI,IAAgB;AAE5C,IAAI,kBAAmC,0BAA0B;AAEjE,SAAS,4BAA6C;CACpD,IAAI;EACF,MAAM,QAAQ,aAAa,QAAQ,4BAA4B;EAC/D,OAAO,QAAS,KAAK,MAAM,KAAK,IAAwB;CAC1D,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,yBAAyB,IAAgB;CAChD,gBAAgB,IAAI,EAAE;CACtB,aAAa;EACX,gBAAgB,OAAO,EAAE;CAC3B;AACF;AAEA,SAAS,qBAAsC;CAC7C,OAAO;AACT;AAEA,SAAgB,mBACd,QACA;CACA,kBAAkB,OAAO,eAAe;CACxC,aAAa,QACX,8BACA,KAAK,UAAU,eAAe,CAChC;CACA,gBAAgB,SAAS,OAAO,GAAG,CAAC;AACtC;AAEA,MAAa,2BAA2B;CAMtC,OAAO,CALS,qBACd,0BACA,oBACA,kBAEY,GAAG,kBAAkB;AACrC;AAMA,MAAa,4BAA4B,GAAG,UAAU;AAEtD,MAAM,kCAAkB,IAAI,IAAgB;AAE5C,IAAI,cAAc,sBAAsB;AAExC,SAAS,wBAAiC;CACxC,IAAI,cAAc,GAAG,OAAO;CAC5B,IAAI;EAEF,OADc,aAAa,QAAQ,yBACxB,MAAM;CACnB,SAAS,OAAO;EACd,QAAQ,MAAM,KAAK;EACnB,OAAO;CACT;AACF;AAEA,SAAS,qBAAqB,IAAgB;CAC5C,gBAAgB,IAAI,EAAE;CACtB,aAAa;EACX,gBAAgB,OAAO,EAAE;CAC3B;AACF;AAEA,SAAS,iBAA0B;CACjC,OAAO;AACT;AAEA,SAAgB,eAAe,OAAgB;CAC7C,cAAc;CACd,aAAa,QAAQ,2BAA2B,KAAK,UAAU,KAAK,CAAC;CACrE,gBAAgB,SAAS,OAAO,GAAG,CAAC;AACtC;AAEA,MAAa,wBAAwB;CAMnC,OAAO,CALO,qBACZ,sBACA,gBACA,cAEU,GAAG,cAAc;AAC/B","debug_id":"ee33d4d1-ef09-5b2c-8c8a-cf207add5ce2"}
@@ -1,13 +1,13 @@
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]="09a0862d-f5b1-5deb-bbd8-b1524cb1b375")}catch(e){}}();
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]="022038d0-e4f5-5d38-af03-f3a04e7f9e24")}catch(e){}}();
3
3
  import { n as getRuntimeConfig } from "./runtime-config-DtJIUgYw.js";
4
4
  import { t as createConnectSignerConfig } from "./renown-trust-DRgHpxlZ.js";
5
- import { a as resolvePgMajorForRuntime, r as loadPGliteModule } from "./pglite-major-BbmMK26m.js";
6
- import { n as buildPHGlobalConfig, o as phGlobalConfig, r as connectConfig } from "./connect.config-Dgs13R1s.js";
5
+ import { a as resolvePgMajorForRuntime, f as toStoredDocumentsRefused, r as loadPGliteModule } from "./pglite-major-p4_YefAE.js";
6
+ import { n as buildPHGlobalConfig, o as phGlobalConfig, r as connectConfig } from "./connect.config-CaXMoB42.js";
7
7
  import { r as toast } from "./toast-C6WW-_O-.js";
8
8
  import { r as getSharedDeps, t as BrowserPackageManager } from "./package-manager-BbzIV9aN.js";
9
- import { i as getVersion, n as getGitSha } from "./build-info-B31oFKR6.js";
10
- import { a as detectReactorPgMajor, h as RELATIONAL_PGLITE_NAME, m as REACTOR_PGLITE_NAME, n as setWorkerConnectionStatus, o as detectRelationalPgMajor, p as REACTOR_INSTANCE_NAMESPACE } from "./connection-state-Cy8xRCm_.js";
9
+ import { i as getVersion, n as getGitSha } from "./build-info-CNHv6iwN.js";
10
+ import { a as detectReactorPgMajor, h as RELATIONAL_PGLITE_NAME, m as REACTOR_PGLITE_NAME, n as setWorkerConnectionStatus, o as detectRelationalPgMajor, p as REACTOR_INSTANCE_NAMESPACE } from "./connection-state-Eqc2izmt.js";
11
11
  import { createRelationalDb } from "@powerhousedao/shared/processors";
12
12
  import { DocumentModelRegistry, DocumentModelResolver, ReactorEventTypes, createReactorHostModuleBase } from "@powerhousedao/reactor";
13
13
  import { MessageRouter, RPC_PROTOCOL_VERSION, SyncManagerProxy, connectReactorClient, createInspectorProxy, createPortTransport, createReactorEventBusProxy, createRelationalPgliteProxy, createWorkerAdminClient, postReactorIdentity } from "@powerhousedao/reactor-browser/rpc";
@@ -72,7 +72,7 @@ async function getDb() {
72
72
  * Creates a Reactor that plugs into legacy storage but syncs through the new
73
73
  * Reactor GQL API.
74
74
  */
75
- async function createBrowserReactor(documentModelModules, upgradeManifests, renown, featureFlags, documentModelLoader, createSignaturePolicy, renownEndpoints = {}) {
75
+ async function createBrowserReactor(documentModelModules, upgradeManifests, renown, featureFlags, documentModelLoader, createSignaturePolicy, renownEndpoints = {}, unsupportedStoredDocuments) {
76
76
  const signerConfig = await createConnectSignerConfig(renown.signer, featureFlags, renownEndpoints);
77
77
  const jwtHandler = async (_url) => {
78
78
  if (!renown.user) return;
@@ -80,10 +80,17 @@ async function createBrowserReactor(documentModelModules, upgradeManifests, reno
80
80
  };
81
81
  const pg = await getReactorPGlite();
82
82
  const logger = new ConsoleLogger(["reactor-client"]);
83
- const builder = new ReactorClientBuilder$1().withLogger(logger).withSigner(signerConfig).withReactorBuilder(new ReactorBuilder$1().withDocumentModelSources(documentModelModules).withUpgradeManifests(upgradeManifests).withChannelScheme(ChannelScheme$1.CONNECT).withExecutorConfig({ featureFlags }).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) })));
83
+ const reactorBuilder = new ReactorBuilder$1().withDocumentModelSources(documentModelModules).withUpgradeManifests(upgradeManifests).withChannelScheme(ChannelScheme$1.CONNECT).withExecutorConfig({ featureFlags }).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) }));
84
+ const builder = new ReactorClientBuilder$1().withLogger(logger).withSigner(signerConfig).withReactorBuilder(reactorBuilder);
84
85
  if (documentModelLoader) builder.withDocumentModelLoader(documentModelLoader);
85
86
  if (createSignaturePolicy) builder.withCreateSignaturePolicy(createSignaturePolicy);
86
- const module = await builder.buildModule();
87
+ if (unsupportedStoredDocuments) reactorBuilder.withUnsupportedStoredDocuments(unsupportedStoredDocuments);
88
+ let module;
89
+ try {
90
+ module = await builder.buildModule();
91
+ } catch (error) {
92
+ throw toStoredDocumentsRefused(error);
93
+ }
87
94
  return {
88
95
  ...module,
89
96
  kind: "browser",
@@ -676,6 +683,7 @@ function createWorkerReactorClientModule(args) {
676
683
  renownChainId: args.renownChainId,
677
684
  featureFlags: args.featureFlags,
678
685
  createSignaturePolicy: args.createSignaturePolicy,
686
+ unsupportedStoredDocuments: args.unsupportedStoredDocuments,
679
687
  renownEndpoints: args.renownEndpoints
680
688
  },
681
689
  packages: args.packageSpecs
@@ -931,6 +939,7 @@ async function createReactor(localPackage) {
931
939
  const enabledReactorFlags = Object.entries(reactorFeatureFlags).filter(([, enabled]) => enabled).map(([name]) => name);
932
940
  if (enabledReactorFlags.length > 0) logger.info(`Reactor feature flags: ${enabledReactorFlags.join(", ")}`);
933
941
  const createSignaturePolicy = runtimeConfig.connect?.reactor?.createSignaturePolicy;
942
+ const unsupportedStoredDocuments = runtimeConfig.connect?.reactor?.unsupportedStoredDocuments;
934
943
  const renownEndpoints = {
935
944
  renownUrl: phGlobalConfig.renownUrl,
936
945
  switchboardUrl: phGlobalConfig.switchboardUrl
@@ -961,6 +970,7 @@ async function createReactor(localPackage) {
961
970
  renownChainId,
962
971
  featureFlags: reactorFeatureFlags,
963
972
  createSignaturePolicy,
973
+ unsupportedStoredDocuments,
964
974
  renownEndpoints,
965
975
  documentModelModules,
966
976
  upgradeManifests,
@@ -980,7 +990,7 @@ async function createReactor(localPackage) {
980
990
  logger.error("Reactor worker failed to start: @error", error);
981
991
  throw error;
982
992
  }
983
- } else reactorClientModule = await createBrowserReactor(documentModelModules, upgradeManifests, renown, reactorFeatureFlags, discoveryService, createSignaturePolicy, renownEndpoints);
993
+ } else reactorClientModule = await createBrowserReactor(documentModelModules, upgradeManifests, renown, reactorFeatureFlags, discoveryService, createSignaturePolicy, renownEndpoints, unsupportedStoredDocuments);
984
994
  const drives = await getDrives(reactorClientModule.client);
985
995
  const didFromUrl = getDidFromUrl();
986
996
  await login(didFromUrl, renown);
@@ -1081,5 +1091,5 @@ function getDriveUrl() {
1081
1091
  //#endregion
1082
1092
  export { createReactor as n, clearReactorStorage as t };
1083
1093
 
1084
- //# sourceMappingURL=reactor-BmQPQNmi.js.map
1085
- //# debugId=09a0862d-f5b1-5deb-bbd8-b1524cb1b375
1094
+ //# sourceMappingURL=reactor--yIPUbFV.js.map
1095
+ //# debugId=022038d0-e4f5-5d38-af03-f3a04e7f9e24