@powerhousedao/connect 6.2.1 → 6.2.2-dev.1

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 (77) hide show
  1. package/dist/{AddDriveModal-vA-eqqPS.js → AddDriveModal-MMHlkJBJ.js} +10 -14
  2. package/dist/AddDriveModal-MMHlkJBJ.js.map +1 -0
  3. package/dist/{ClearStorageModal-Dm00WyUu.js → ClearStorageModal-BigtCV_M.js} +4 -4
  4. package/dist/{ClearStorageModal-Dm00WyUu.js.map → ClearStorageModal-BigtCV_M.js.map} +1 -1
  5. package/dist/{CookiesPolicyModal-1nOh6oN3.js → CookiesPolicyModal-CkcUKPLb.js} +3 -3
  6. package/dist/{CookiesPolicyModal-1nOh6oN3.js.map → CookiesPolicyModal-CkcUKPLb.js.map} +1 -1
  7. package/dist/{CreateDocumentModal-nQbLVDq3.js → CreateDocumentModal-CvsTh0HM.js} +3 -3
  8. package/dist/{CreateDocumentModal-nQbLVDq3.js.map → CreateDocumentModal-CvsTh0HM.js.map} +1 -1
  9. package/dist/{DebugSettingsModal-CWZkbU7v.js → DebugSettingsModal-Bti38_qt.js} +6 -6
  10. package/dist/{DebugSettingsModal-CWZkbU7v.js.map → DebugSettingsModal-Bti38_qt.js.map} +1 -1
  11. package/dist/{DeleteDriveModal-6P0T1QgD.js → DeleteDriveModal-DSTK8FYk.js} +4 -4
  12. package/dist/{DeleteDriveModal-6P0T1QgD.js.map → DeleteDriveModal-DSTK8FYk.js.map} +1 -1
  13. package/dist/{DeleteItemModal-BmV1aQyZ.js → DeleteItemModal-B2nJmjsP.js} +4 -4
  14. package/dist/{DeleteItemModal-BmV1aQyZ.js.map → DeleteItemModal-B2nJmjsP.js.map} +1 -1
  15. package/dist/{DisclaimerModal-CVTFfN0_.js → DisclaimerModal-D5FO34u9.js} +3 -3
  16. package/dist/{DisclaimerModal-CVTFfN0_.js.map → DisclaimerModal-D5FO34u9.js.map} +1 -1
  17. package/dist/{DownloadDocumentWithErrorsModal-CXeFUtaz.js → DownloadDocumentWithErrorsModal-tEr3bbtN.js} +3 -3
  18. package/dist/{DownloadDocumentWithErrorsModal-CXeFUtaz.js.map → DownloadDocumentWithErrorsModal-tEr3bbtN.js.map} +1 -1
  19. package/dist/{DriveAuthRequiredModal-DDlfeXD_.js → DriveAuthRequiredModal-BA2vS3oF.js} +3 -3
  20. package/dist/{DriveAuthRequiredModal-DDlfeXD_.js.map → DriveAuthRequiredModal-BA2vS3oF.js.map} +1 -1
  21. package/dist/{DriveSettingsModal-CsNFEJ9E.js → DriveSettingsModal-kR3hQnh4.js} +4 -4
  22. package/dist/DriveSettingsModal-kR3hQnh4.js.map +1 -0
  23. package/dist/{InspectorModal-wChBJ6R5.js → InspectorModal-B2Zbsa4l.js} +84 -35
  24. package/dist/InspectorModal-B2Zbsa4l.js.map +1 -0
  25. package/dist/{MissingPackageModal-Bn036mWQ.js → MissingPackageModal-BQcCQbOn.js} +4 -4
  26. package/dist/{MissingPackageModal-Bn036mWQ.js.map → MissingPackageModal-BQcCQbOn.js.map} +1 -1
  27. package/dist/{SettingsModal-1i3Dr5eT.js → SettingsModal-BnHg4yeC.js} +9 -9
  28. package/dist/SettingsModal-BnHg4yeC.js.map +1 -0
  29. package/dist/{UpgradeDriveModal-C7lV4rAX.js → UpgradeDriveModal-BZGSE9_r.js} +3 -3
  30. package/dist/{UpgradeDriveModal-C7lV4rAX.js.map → UpgradeDriveModal-BZGSE9_r.js.map} +1 -1
  31. package/dist/app-loader-B_HyriND.js +4 -0
  32. package/dist/{app-loader-C5IWlQ7x.js → app-loader-CuYQDicM.js} +199 -264
  33. package/dist/app-loader-CuYQDicM.js.map +1 -0
  34. package/dist/{build-info-zGvEjLMy.js → build-info-D0TYDOtW.js} +8 -5
  35. package/dist/{build-info-zGvEjLMy.js.map → build-info-D0TYDOtW.js.map} +1 -1
  36. package/dist/components-xBFneZuJ.js +5 -0
  37. package/dist/{connect.config-BDYNejx3.js → connect.config-vgUeFoNp.js} +16 -6
  38. package/dist/connect.config-vgUeFoNp.js.map +1 -0
  39. package/dist/connection-state-DO_2lAEJ.js +126 -0
  40. package/dist/connection-state-DO_2lAEJ.js.map +1 -0
  41. package/dist/{load-Bt4B0U-v.js → load-DajsG0zi.js} +11 -11
  42. package/dist/{load-Bt4B0U-v.js.map → load-DajsG0zi.js.map} +1 -1
  43. package/dist/main.js +1 -1
  44. package/dist/{package-CNJ1Q-58.js → package-CX2sgCBs.js} +5 -4
  45. package/dist/package-CX2sgCBs.js.map +1 -0
  46. package/dist/{pglite-runtime-CHa5UyCw.js → pglite-major-B39aOEiE.js} +8 -47
  47. package/dist/pglite-major-B39aOEiE.js.map +1 -0
  48. package/dist/pglite-migrate-core-Boxqqx-c.js +143 -0
  49. package/dist/pglite-migrate-core-Boxqqx-c.js.map +1 -0
  50. package/dist/{pglite-seed-CvnZdEbx.js → pglite-seed-z3B1JA38.js} +4 -4
  51. package/dist/{pglite-seed-CvnZdEbx.js.map → pglite-seed-z3B1JA38.js.map} +1 -1
  52. package/dist/{reactor-DWY9_ifj.js → reactor-Bo6Lut7c.js} +271 -37
  53. package/dist/reactor-Bo6Lut7c.js.map +1 -0
  54. package/dist/reactor.worker.d.ts +1 -0
  55. package/dist/reactor.worker.js +323 -0
  56. package/dist/reactor.worker.js.map +1 -0
  57. package/dist/{registerServiceWorker-Dc4QY0Sd.js → registerServiceWorker-nJIc0yEY.js} +4 -4
  58. package/dist/{registerServiceWorker-Dc4QY0Sd.js.map → registerServiceWorker-nJIc0yEY.js.map} +1 -1
  59. package/dist/{reload-connect-toast-DIFQ9FCX.js → reload-connect-toast-D1Iqw9E_.js} +3 -3
  60. package/dist/{reload-connect-toast-DIFQ9FCX.js.map → reload-connect-toast-D1Iqw9E_.js.map} +1 -1
  61. package/dist/start-connect.js +1 -1
  62. package/dist/{toast-BEy42aYx.js → toast-4t-VimvD.js} +3 -3
  63. package/dist/{toast-BEy42aYx.js.map → toast-4t-VimvD.js.map} +1 -1
  64. package/dist/{useRegistryPackages-B-gFECmd.js → useRegistryPackages-BaYtekjQ.js} +3 -3
  65. package/dist/{useRegistryPackages-B-gFECmd.js.map → useRegistryPackages-BaYtekjQ.js.map} +1 -1
  66. package/package.json +11 -10
  67. package/dist/AddDriveModal-vA-eqqPS.js.map +0 -1
  68. package/dist/DriveSettingsModal-CsNFEJ9E.js.map +0 -1
  69. package/dist/InspectorModal-wChBJ6R5.js.map +0 -1
  70. package/dist/SettingsModal-1i3Dr5eT.js.map +0 -1
  71. package/dist/app-loader-C5IWlQ7x.js.map +0 -1
  72. package/dist/app-loader-DYpRh5ax.js +0 -4
  73. package/dist/components-CiPNtuf_.js +0 -5
  74. package/dist/connect.config-BDYNejx3.js.map +0 -1
  75. package/dist/package-CNJ1Q-58.js.map +0 -1
  76. package/dist/pglite-runtime-CHa5UyCw.js.map +0 -1
  77. package/dist/reactor-DWY9_ifj.js.map +0 -1
@@ -1,46 +1,67 @@
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]="e4ac466f-3b1a-588d-9c21-2041c2992b7e")}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]="a1393f51-b593-56ea-8200-57f565bcd3ca")}catch(e){}}();
3
3
  import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
4
- import { n as buildPHGlobalConfig, o as phGlobalConfig } from "./connect.config-BDYNejx3.js";
5
- import { i as loadPGliteModule, m as REACTOR_PGLITE_NAME, o as resolvePgMajorForRuntime, t as detectReactorPgMajor } from "./pglite-runtime-CHa5UyCw.js";
6
- import { n as toast } from "./toast-BEy42aYx.js";
4
+ import { a as resolvePgMajorForRuntime, r as loadPGliteModule } from "./pglite-major-B39aOEiE.js";
5
+ import { r as getVersion, t as getGitSha } from "./build-info-D0TYDOtW.js";
6
+ import { n as buildPHGlobalConfig, o as phGlobalConfig } from "./connect.config-vgUeFoNp.js";
7
+ 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-DO_2lAEJ.js";
8
+ import { n as toast } from "./toast-4t-VimvD.js";
7
9
  import { createRelationalDb } from "@powerhousedao/shared/processors";
8
- import { BrowserLocalStorage, ChannelScheme, DRIVE_DOCUMENT_TYPES, DocumentCache, DocumentChangeType, ReactorBuilder, ReactorClientBuilder, RegistryClient, addPHEventHandlers, addRemoteDrive, createAnalyticsStore, extractDriveSlugFromPath, extractNodeSlugFromPath, getDrives, isDriveAuthError, login, refreshReactorDataClient, setAttachmentService, setDefaultPHGlobalConfig, setDocumentCache, setDriveMetadata, setDrives, setFeatures, setPHToast, setPackageDiscoveryService, setReactorClient, setReactorClientModule, setRenown, setSelectedDrive, setSelectedNode, setVetraPackageManager, waitForDocumentReady } from "@powerhousedao/reactor-browser";
9
- import { ConsoleLogger, logger, setLogLevel as setLogLevel$1 } from "document-model";
10
- import { BrowserKeyStorage, RenownBuilder, RenownCryptoBuilder, createSignatureVerifier } from "@renown/sdk";
10
+ import { DocumentModelRegistry, DocumentModelResolver, ReactorEventTypes } from "@powerhousedao/reactor";
11
+ import { MessageRouter, RPC_PROTOCOL_VERSION, SyncManagerProxy, connectReactorClient, createInspectorProxy, createPortTransport, createReactorEventBusProxy, createRelationalPgliteProxy, createWorkerAdminClient, postReactorIdentity } from "@powerhousedao/reactor-browser/rpc";
11
12
  import { Kysely } from "kysely";
12
13
  import { PGliteDialect } from "kysely-pglite-dialect";
14
+ import { BrowserLocalStorage, ChannelScheme as ChannelScheme$1, DRIVE_DOCUMENT_TYPES, DocumentCache, DocumentChangeType, ReactorBuilder as ReactorBuilder$1, ReactorClientBuilder as ReactorClientBuilder$1, RegistryClient, addPHEventHandlers, addRemoteDrive, createAnalyticsStore, extractDriveSlugFromPath, extractNodeSlugFromPath, getDrives, isDriveAuthError, login, refreshReactorDataClient, setAttachmentService, setDefaultPHGlobalConfig, setDocumentCache, setDriveMetadata, setDrives, setFeatures, setPGliteDB, setPHToast, setPackageDiscoveryService, setReactorClient, setReactorClientModule, setRenown, setSelectedDrive, setSelectedNode, setVetraPackageManager, waitForDocumentReady } from "@powerhousedao/reactor-browser";
15
+ import { ConsoleLogger, logger, setLogLevel as setLogLevel$1 } from "document-model";
16
+ import { BrowserKeyStorage, RenownBuilder, RenownCryptoBuilder, createSignatureVerifier } from "@renown/sdk";
13
17
  import { createAttachmentClient, createRemoteAttachmentService } from "@powerhousedao/reactor-attachments/client";
14
18
  import { OpenFeature } from "@openfeature/web-sdk";
15
19
  import * as common from "@powerhousedao/powerhouse-vetra-packages";
16
20
  import commonPkg from "@powerhousedao/powerhouse-vetra-packages/package.json" with { type: "json" };
17
- import * as vetra from "@powerhousedao/vetra";
18
21
  import vetraPkg from "@powerhousedao/vetra/package.json" with { type: "json" };
19
22
  //#region src/pglite.db.ts
20
- async function createMainThreadPGlite(major) {
23
+ async function createMainThreadPGlite(major, dbName) {
21
24
  const { PGlite } = await loadPGliteModule(major);
22
25
  const { live } = major === 16 ? await import("pglite-legacy-02/live") : await import("@electric-sql/pglite/live");
23
- return new PGlite(`idb://${REACTOR_PGLITE_NAME}`, {
26
+ return new PGlite(`idb://${dbName}`, {
24
27
  relaxedDurability: true,
25
28
  extensions: { live }
26
29
  });
27
30
  }
28
- let sharedPGlite;
29
- function getSharedPGlite() {
30
- if (sharedPGlite) return sharedPGlite;
31
- const pending = (async () => {
32
- const major = resolvePgMajorForRuntime(await detectReactorPgMajor());
33
- if (major !== 17) console.warn(`[reactor] Opening legacy Postgres ${major} data dir. Migrate to PG17 from the banner or the Inspector → Debug tab.`);
34
- return createMainThreadPGlite(major);
35
- })();
36
- sharedPGlite = pending;
37
- pending.catch(() => {
38
- if (sharedPGlite === pending) sharedPGlite = void 0;
39
- });
31
+ let bootChain = Promise.resolve();
32
+ function chainedCreate(create) {
33
+ const pending = bootChain.then(create, create);
34
+ bootChain = pending.catch(() => void 0);
40
35
  return pending;
41
36
  }
37
+ function pgliteSingleton(opts) {
38
+ let cached;
39
+ return function getPGlite() {
40
+ if (cached) return cached;
41
+ const pending = chainedCreate(async () => {
42
+ const major = resolvePgMajorForRuntime(await opts.detectMajor());
43
+ if (major !== 17) console.warn(`[${opts.label}] Opening legacy Postgres ${major} data dir. Migrate to PG17 from the banner or the Inspector → Debug tab.`);
44
+ return createMainThreadPGlite(major, opts.dbName);
45
+ });
46
+ cached = pending;
47
+ pending.catch(() => {
48
+ if (cached === pending) cached = void 0;
49
+ });
50
+ return pending;
51
+ };
52
+ }
53
+ const getReactorPGlite = pgliteSingleton({
54
+ dbName: REACTOR_PGLITE_NAME,
55
+ detectMajor: detectReactorPgMajor,
56
+ label: "reactor"
57
+ });
58
+ const getRelationalPGlite = pgliteSingleton({
59
+ dbName: RELATIONAL_PGLITE_NAME,
60
+ detectMajor: detectRelationalPgMajor,
61
+ label: "relational"
62
+ });
42
63
  async function getDb() {
43
- const pgLite = await getSharedPGlite();
64
+ const pgLite = await getRelationalPGlite();
44
65
  return {
45
66
  pgLite,
46
67
  relationalDb: createRelationalDb(new Kysely({ dialect: new PGliteDialect(pgLite) }))
@@ -61,13 +82,18 @@ async function createBrowserReactor(documentModelModules, upgradeManifests, reno
61
82
  if (!renown.user) return;
62
83
  return renown.getBearerToken({ expiresIn: 10 });
63
84
  };
64
- const pg = await getSharedPGlite();
85
+ const pg = await getReactorPGlite();
65
86
  const logger = new ConsoleLogger(["reactor-client"]);
66
- const builder = new ReactorClientBuilder().withLogger(logger).withSigner(signerConfig).withReactorBuilder(new ReactorBuilder().withDocumentModels(documentModelModules).withUpgradeManifests(upgradeManifests).withChannelScheme(ChannelScheme.CONNECT).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) })));
87
+ const builder = new ReactorClientBuilder$1().withLogger(logger).withSigner(signerConfig).withReactorBuilder(new ReactorBuilder$1().withDocumentModels(documentModelModules).withUpgradeManifests(upgradeManifests).withChannelScheme(ChannelScheme$1.CONNECT).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) })));
67
88
  if (documentModelLoader) builder.withDocumentModelLoader(documentModelLoader);
89
+ const module = await builder.buildModule();
68
90
  return {
69
- ...await builder.buildModule(),
70
- pg
91
+ ...module,
92
+ kind: "browser",
93
+ reactorModule: module.reactorModule ? {
94
+ ...module.reactorModule,
95
+ pg
96
+ } : void 0
71
97
  };
72
98
  }
73
99
  function getDefaultDrives(runtimeConfig) {
@@ -584,9 +610,12 @@ var BrowserPackageManager = class {
584
610
  if (baseUrl.includes("/-/cdn")) return baseUrl;
585
611
  return `${baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl}/-/cdn`;
586
612
  }
587
- async init(localPackage, localPackageVersion) {
613
+ async init(localPackage, localPackageVersion, studioMode) {
588
614
  this.addLocalPackage(common.manifest.name, common, commonPkg.version);
589
- this.addLocalPackage(vetra.manifest.name, vetra, vetraPkg.version);
615
+ if (studioMode) {
616
+ const vetra = await import("@powerhousedao/vetra");
617
+ this.addLocalPackage(vetra.manifest.name, vetra, vetraPkg.version);
618
+ }
590
619
  if (localPackage) this.updateLocalPackage(localPackage, localPackageVersion);
591
620
  for (const packageName of this.#storage.keys()) {
592
621
  const specForReload = this.#storage.get(packageName)?.spec ?? packageName;
@@ -803,6 +832,167 @@ var BrowserPackageManager = class {
803
832
  }
804
833
  };
805
834
  //#endregion
835
+ //#region src/reactor-worker-name.ts
836
+ const GEN_KEY_PREFIX = "ph-reactor-gen:";
837
+ function reactorWorkerName(namespace) {
838
+ const gen = readWorkerGen(namespace);
839
+ return gen ? `ph-reactor:${namespace}#${gen}` : `ph-reactor:${namespace}`;
840
+ }
841
+ function readWorkerGen(namespace) {
842
+ try {
843
+ return localStorage.getItem(GEN_KEY_PREFIX + namespace);
844
+ } catch {
845
+ return null;
846
+ }
847
+ }
848
+ function bumpWorkerGen(namespace, gen) {
849
+ try {
850
+ localStorage.setItem(GEN_KEY_PREFIX + namespace, gen);
851
+ } catch {}
852
+ }
853
+ //#endregion
854
+ //#region src/reactor-worker-client.ts
855
+ const PING_INTERVAL_MS = 2e3;
856
+ const PING_DEADLINE_MS = 3e3;
857
+ const MAX_MISSED_PINGS = 2;
858
+ function toReactorIdentity(user) {
859
+ if (!user) return null;
860
+ return {
861
+ address: user.address,
862
+ chainId: user.chainId,
863
+ networkId: user.networkId
864
+ };
865
+ }
866
+ function createWorkerReactorClientModule(args) {
867
+ const workerUrl = new URL("./reactor.worker.js", import.meta.url);
868
+ console.info(`[reactor-worker] constructing SharedWorker ${reactorWorkerName(args.namespace)} from ${workerUrl.href}`);
869
+ const worker = new SharedWorker(workerUrl, {
870
+ name: reactorWorkerName(args.namespace),
871
+ type: "module"
872
+ });
873
+ worker.addEventListener("error", (event) => {
874
+ console.error(`[reactor-worker] SharedWorker failed to load from ${workerUrl.href}`, event.message || event);
875
+ });
876
+ worker.port.onmessageerror = (event) => {
877
+ console.error("[reactor-worker] port message could not be deserialized", event);
878
+ };
879
+ const transport = createPortTransport(worker.port);
880
+ const router = new MessageRouter();
881
+ router.attach(transport);
882
+ const documentModelRegistry = new DocumentModelRegistry();
883
+ documentModelRegistry.registerModules(...args.documentModelModules);
884
+ documentModelRegistry.registerUpgradeManifests(...args.upgradeManifests);
885
+ const gitSha = getGitSha();
886
+ const clientProxy = connectReactorClient(router, {
887
+ version: {
888
+ appBuildId: gitSha !== "unknown" ? gitSha : getVersion(),
889
+ rpcProtocolVersion: RPC_PROTOCOL_VERSION,
890
+ models: args.documentModelModules.map((m) => ({
891
+ id: m.documentModel.global.id,
892
+ version: m.version ?? 1
893
+ }))
894
+ },
895
+ construct: {
896
+ namespace: args.namespace,
897
+ relationalNamespace: args.relationalNamespace,
898
+ cdnUrl: args.cdnUrl,
899
+ packageSpecs: args.packageSpecs,
900
+ studioMode: args.studioMode
901
+ },
902
+ packages: args.packageSpecs
903
+ }, args.onReload, documentModelRegistry);
904
+ const busProxy = createReactorEventBusProxy(router);
905
+ const syncManagerProxy = new SyncManagerProxy(router, busProxy);
906
+ const modelResolver = new DocumentModelResolver(documentModelRegistry, args.documentModelLoader);
907
+ busProxy.subscribe(ReactorEventTypes.MODEL_LOADED, (_type, event) => {
908
+ const { documentType } = event;
909
+ modelResolver.ensureModelLoaded(documentType).catch((error) => {
910
+ console.error(`Failed to load model "${documentType}" into tab registry`, error);
911
+ });
912
+ });
913
+ setPGliteDB({
914
+ db: createRelationalPgliteProxy(router),
915
+ isLoading: false,
916
+ error: null
917
+ });
918
+ postReactorIdentity(router, toReactorIdentity(args.renown.user));
919
+ args.renown.on("user", (user) => postReactorIdentity(router, toReactorIdentity(user)));
920
+ const reactorClientModule = {
921
+ kind: "worker",
922
+ client: clientProxy,
923
+ adminClient: createWorkerAdminClient(router),
924
+ inspector: createInspectorProxy(router),
925
+ reactorModule: {
926
+ documentModelRegistry,
927
+ syncModule: { syncManager: syncManagerProxy },
928
+ eventBus: busProxy
929
+ }
930
+ };
931
+ let pingCounter = 0;
932
+ let missedPings = 0;
933
+ const pingDeadlines = /* @__PURE__ */ new Map();
934
+ router.on("pong", (msg) => {
935
+ const timer = pingDeadlines.get(msg.id);
936
+ if (timer === void 0) return;
937
+ clearTimeout(timer);
938
+ pingDeadlines.delete(msg.id);
939
+ missedPings = 0;
940
+ setWorkerConnectionStatus("connected");
941
+ });
942
+ const pingInterval = setInterval(() => {
943
+ const id = `ping${++pingCounter}`;
944
+ const timer = setTimeout(() => {
945
+ pingDeadlines.delete(id);
946
+ missedPings += 1;
947
+ if (missedPings >= MAX_MISSED_PINGS) setWorkerConnectionStatus("lost");
948
+ }, PING_DEADLINE_MS);
949
+ pingDeadlines.set(id, timer);
950
+ router.post({
951
+ k: "ping",
952
+ id
953
+ });
954
+ }, PING_INTERVAL_MS);
955
+ const dispose = () => {
956
+ clearInterval(pingInterval);
957
+ for (const timer of pingDeadlines.values()) clearTimeout(timer);
958
+ pingDeadlines.clear();
959
+ };
960
+ return {
961
+ reactorClientModule,
962
+ syncManagerProxy,
963
+ dispose
964
+ };
965
+ }
966
+ //#endregion
967
+ //#region src/utils/reactor-worker-flag.ts
968
+ const REACTOR_WORKER_QUERY_KEY = "reactorWorker";
969
+ const REACTOR_WORKER_STORAGE_KEY = "ph:reactorWorker";
970
+ function resolveReactorWorkerEnabled(input) {
971
+ const fromQuery = parseFlag(input.queryParam);
972
+ if (fromQuery !== void 0) return fromQuery;
973
+ const fromStore = parseFlag(input.storedValue);
974
+ if (fromStore !== void 0) return fromStore;
975
+ return input.configFlag;
976
+ }
977
+ function isReactorWorkerEnabled() {
978
+ const configFlag = getRuntimeConfig().connect.instance?.reactorWorker ?? false;
979
+ if (typeof window === "undefined") return configFlag;
980
+ const queryParam = new URLSearchParams(window.location.search).get(REACTOR_WORKER_QUERY_KEY);
981
+ const enabled = resolveReactorWorkerEnabled({
982
+ configFlag,
983
+ queryParam,
984
+ storedValue: window.localStorage.getItem(REACTOR_WORKER_STORAGE_KEY)
985
+ });
986
+ if (parseFlag(queryParam) !== void 0) window.localStorage.setItem(REACTOR_WORKER_STORAGE_KEY, enabled ? "true" : "false");
987
+ return enabled;
988
+ }
989
+ function parseFlag(value) {
990
+ if (value === null || value === void 0) return;
991
+ const normalized = value.trim().toLowerCase();
992
+ if (normalized === "true" || normalized === "1") return true;
993
+ if (normalized === "false" || normalized === "0") return false;
994
+ }
995
+ //#endregion
806
996
  //#region src/store/processor-host-module.ts
807
997
  var NullAttachmentService = class {
808
998
  reserve() {
@@ -910,7 +1100,12 @@ function subscribeToPackagesChannel(packageManager) {
910
1100
  source.addEventListener("error", () => {});
911
1101
  }
912
1102
  async function clearReactorStorage() {
913
- await window.ph?.reactorClientModule?.pg?.close();
1103
+ const module = window.ph?.reactorClientModule;
1104
+ if (module?.kind === "worker") {
1105
+ await module.adminClient.clearStorage();
1106
+ return;
1107
+ }
1108
+ if (module?.kind === "browser") await module.reactorModule?.pg?.close();
914
1109
  const targets = (await indexedDB.databases()).map((d) => d.name).filter((n) => !!n && !n.startsWith("ph-pglite-backup::") && /pglite|reactor/i.test(n));
915
1110
  await Promise.all(targets.map((name) => new Promise((resolve) => {
916
1111
  const req = indexedDB.deleteDatabase(name);
@@ -934,7 +1129,7 @@ async function createReactor(localPackage) {
934
1129
  const runtimeConfig = getRuntimeConfig();
935
1130
  const packageManager = new BrowserPackageManager(phGlobalConfig.routerBasename ?? "", runtimeConfig.packageRegistryUrl ?? null);
936
1131
  setVetraPackageManager(packageManager);
937
- await packageManager.init(localPackage, runtimeConfig.localPackage?.version);
1132
+ await packageManager.init(localPackage, runtimeConfig.localPackage?.version, phGlobalConfig.studioMode);
938
1133
  try {
939
1134
  const { default: registerBundledPackages } = await import("ph-bundled-packages-virtual");
940
1135
  registerBundledPackages(packageManager);
@@ -951,7 +1146,44 @@ async function createReactor(localPackage) {
951
1146
  storageKey: phGlobalConfig.routerBasename ?? ""
952
1147
  }) : new NoRegistryDiscoveryService(packageManager);
953
1148
  setPackageDiscoveryService(discoveryService);
954
- const reactorClientModule = await createBrowserReactor(documentModelModules, upgradeManifests, renown, discoveryService);
1149
+ let reactorClientModule;
1150
+ if (isReactorWorkerEnabled()) {
1151
+ const packageSpecs = packageManager.getRegistryPackages().map((p) => p.version ? `${p.name}@${p.version}` : p.name);
1152
+ const registryClient = new RegistryClient(packageManager.cdnUrl ?? "");
1153
+ const workerClient = createWorkerReactorClientModule({
1154
+ namespace: REACTOR_INSTANCE_NAMESPACE,
1155
+ relationalNamespace: RELATIONAL_PGLITE_NAME,
1156
+ cdnUrl: packageManager.cdnUrl ?? "",
1157
+ packageSpecs,
1158
+ studioMode: phGlobalConfig.studioMode,
1159
+ documentModelModules,
1160
+ upgradeManifests,
1161
+ documentModelLoader: { async load(documentType) {
1162
+ const names = packageManager.cdnUrl ? await registryClient.getPackagesByDocumentType(documentType) : [];
1163
+ for (const name of names) {
1164
+ const result = await packageManager.addPackage(name);
1165
+ if (result.type === "error") throw new Error(`Failed to install package "${name}" for document model: ${documentType}`, { cause: result.error });
1166
+ }
1167
+ const module = packageManager.packages.flatMap((p) => p.documentModels).find((m) => m.documentModel.global.id === documentType);
1168
+ if (!module) throw new Error(names.length > 0 ? `Installed [${names.join(", ")}] but document model not available: ${documentType}` : `No package found for document model: ${documentType} (cdnUrl: ${packageManager.cdnUrl ?? "none"})`);
1169
+ return module;
1170
+ } },
1171
+ renown,
1172
+ onReload: (reason, workerGen) => {
1173
+ logger.warn("Reactor worker requested reload: @reason", reason);
1174
+ if (workerGen) bumpWorkerGen(REACTOR_INSTANCE_NAMESPACE, workerGen);
1175
+ window.location.reload();
1176
+ }
1177
+ });
1178
+ reactorClientModule = workerClient.reactorClientModule;
1179
+ try {
1180
+ await workerClient.syncManagerProxy.startup();
1181
+ } catch (error) {
1182
+ window.ph.loading = false;
1183
+ logger.error("Reactor worker failed to start: @error", error);
1184
+ throw error;
1185
+ }
1186
+ } else reactorClientModule = await createBrowserReactor(documentModelModules, upgradeManifests, renown, discoveryService);
955
1187
  const drives = await getDrives(reactorClientModule.client);
956
1188
  await login(getDidFromUrl(), renown);
957
1189
  const documentCache = new DocumentCache(reactorClientModule.client);
@@ -1011,8 +1243,10 @@ async function createReactor(localPackage) {
1011
1243
  });
1012
1244
  await refreshReactorDataClient(reactorClientModule.client);
1013
1245
  const packagesWithProcessorFactories = packageManager.packages.filter((pkg) => pkg.processorFactory !== void 0);
1014
- if (packagesWithProcessorFactories.length > 0) {
1015
- const readModels = reactorClientModule.reactorModule?.readModelCoordinator?.readModels ?? [];
1246
+ const reactorModule = reactorClientModule.kind === "browser" ? reactorClientModule.reactorModule : void 0;
1247
+ if (packagesWithProcessorFactories.length > 0 && !reactorModule) for (const pkg of packagesWithProcessorFactories) logger.warn("Skipping processor factory @name: processors are not supported on the worker reactor path yet", pkg.manifest.name);
1248
+ else if (packagesWithProcessorFactories.length > 0 && reactorModule) {
1249
+ const readModels = reactorModule.readModelCoordinator.readModels;
1016
1250
  const processorHostModule = await createProcessorHostModule(reactorClientModule.client, readModels, window.ph?.attachmentService);
1017
1251
  if (processorHostModule !== void 0) await Promise.all(packagesWithProcessorFactories.map(async (pkg) => {
1018
1252
  const { manifest, processorFactory } = pkg;
@@ -1024,7 +1258,7 @@ async function createReactor(localPackage) {
1024
1258
  try {
1025
1259
  const factory = await processorFactory?.(processorHostModule);
1026
1260
  if (!factory) return;
1027
- await reactorClientModule.reactorModule?.processorManager.registerFactory(id, factory);
1261
+ await reactorModule.processorManager.registerFactory(id, factory);
1028
1262
  } catch (error) {
1029
1263
  logger.error(`Error registering processor: @label`, label);
1030
1264
  logger.error("@error", error);
@@ -1044,5 +1278,5 @@ function getDriveUrl() {
1044
1278
  //#endregion
1045
1279
  export { createReactor as n, clearReactorStorage as t };
1046
1280
 
1047
- //# sourceMappingURL=reactor-DWY9_ifj.js.map
1048
- //# debugId=e4ac466f-3b1a-588d-9c21-2041c2992b7e
1281
+ //# sourceMappingURL=reactor-Bo6Lut7c.js.map
1282
+ //# debugId=a1393f51-b593-56ea-8200-57f565bcd3ca