@powerhousedao/connect 6.2.0-dev.38 → 6.2.0-dev.39

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 (75) hide show
  1. package/dist/{AddDriveModal-BoKLJyUY.js → AddDriveModal-D-nbV40j.js} +4 -4
  2. package/dist/{AddDriveModal-BoKLJyUY.js.map → AddDriveModal-D-nbV40j.js.map} +1 -1
  3. package/dist/{ClearStorageModal-kAd_wAOs.js → ClearStorageModal-Y34xFYii.js} +4 -4
  4. package/dist/{ClearStorageModal-kAd_wAOs.js.map → ClearStorageModal-Y34xFYii.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-COZ8ehrF.js → DebugSettingsModal-CwLH5KC9.js} +6 -6
  10. package/dist/{DebugSettingsModal-COZ8ehrF.js.map → DebugSettingsModal-CwLH5KC9.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-B3VdLwSH.js → DriveAuthRequiredModal-B5-ZfKsb.js} +3 -3
  20. package/dist/{DriveAuthRequiredModal-B3VdLwSH.js.map → DriveAuthRequiredModal-B5-ZfKsb.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-so7krTny.js → InspectorModal-C1MvTLQV.js} +84 -35
  24. package/dist/InspectorModal-C1MvTLQV.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-CZ4zSICk.js → SettingsModal-C0gXNY6D.js} +9 -9
  28. package/dist/SettingsModal-C0gXNY6D.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-BVgVR-WX.js +4 -0
  32. package/dist/{app-loader-BcXcehGe.js → app-loader-BeaPtqWb.js} +193 -258
  33. package/dist/app-loader-BeaPtqWb.js.map +1 -0
  34. package/dist/{build-info-BCK6n_XY.js → build-info-BNG5pRW5.js} +8 -5
  35. package/dist/{build-info-BCK6n_XY.js.map → build-info-BNG5pRW5.js.map} +1 -1
  36. package/dist/components-DGNTgcZV.js +5 -0
  37. package/dist/{connect.config-Bt4pvvWV.js → connect.config-BG681xG9.js} +3 -3
  38. package/dist/{connect.config-Bt4pvvWV.js.map → connect.config-BG681xG9.js.map} +1 -1
  39. package/dist/connection-state-Cig644T0.js +126 -0
  40. package/dist/connection-state-Cig644T0.js.map +1 -0
  41. package/dist/{load-BRBI6pnT.js → load-C-XbtAd4.js} +11 -11
  42. package/dist/{load-BRBI6pnT.js.map → load-C-XbtAd4.js.map} +1 -1
  43. package/dist/main.js +1 -1
  44. package/dist/{package-B-TZdzz9.js → package-DUieCgZv.js} +5 -4
  45. package/dist/package-DUieCgZv.js.map +1 -0
  46. package/dist/{pglite-runtime-Ch2YeUAA.js → pglite-major-B39aOEiE.js} +8 -51
  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-BWk7yOwr.js → pglite-seed-9rjhdCs5.js} +4 -4
  51. package/dist/{pglite-seed-BWk7yOwr.js.map → pglite-seed-9rjhdCs5.js.map} +1 -1
  52. package/dist/{reactor-BkaNhcsJ.js → reactor-DCmBjI53.js} +229 -17
  53. package/dist/reactor-DCmBjI53.js.map +1 -0
  54. package/dist/reactor.worker.d.ts +1 -0
  55. package/dist/reactor.worker.js +316 -0
  56. package/dist/reactor.worker.js.map +1 -0
  57. package/dist/{registerServiceWorker-D9l1kja7.js → registerServiceWorker-2tRbkdJj.js} +4 -4
  58. package/dist/{registerServiceWorker-D9l1kja7.js.map → registerServiceWorker-2tRbkdJj.js.map} +1 -1
  59. package/dist/{reload-connect-toast-CwvSc6F-.js → reload-connect-toast-qibmlgQm.js} +3 -3
  60. package/dist/{reload-connect-toast-CwvSc6F-.js.map → reload-connect-toast-qibmlgQm.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/DriveSettingsModal-CsNFEJ9E.js.map +0 -1
  68. package/dist/InspectorModal-so7krTny.js.map +0 -1
  69. package/dist/SettingsModal-CZ4zSICk.js.map +0 -1
  70. package/dist/app-loader-BcXcehGe.js.map +0 -1
  71. package/dist/app-loader-gIHublFd.js +0 -4
  72. package/dist/components-Chon07yw.js +0 -5
  73. package/dist/package-B-TZdzz9.js.map +0 -1
  74. package/dist/pglite-runtime-Ch2YeUAA.js.map +0 -1
  75. package/dist/reactor-BkaNhcsJ.js.map +0 -1
@@ -1,15 +1,19 @@
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]="1e2f2c08-8613-589f-91a0-13fd61e63228")}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]="925acf3a-3dd4-5950-bdb3-d8cc62bad598")}catch(e){}}();
3
3
  import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
4
- import { n as buildPHGlobalConfig, o as phGlobalConfig } from "./connect.config-Bt4pvvWV.js";
5
- import { a as loadPGliteModule, g as RELATIONAL_PGLITE_NAME, h as REACTOR_PGLITE_NAME, n as detectRelationalPgMajor, s as resolvePgMajorForRuntime, t as detectReactorPgMajor } from "./pglite-runtime-Ch2YeUAA.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-BNG5pRW5.js";
6
+ import { n as buildPHGlobalConfig, o as phGlobalConfig } from "./connect.config-BG681xG9.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-Cig644T0.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";
@@ -35,11 +39,16 @@ async function createBrowserReactor(documentModelModules, upgradeManifests, reno
35
39
  const { PGlite } = await loadPGliteModule(major);
36
40
  const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`, { relaxedDurability: true });
37
41
  const logger = new ConsoleLogger(["reactor-client"]);
38
- 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) })));
42
+ 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) })));
39
43
  if (documentModelLoader) builder.withDocumentModelLoader(documentModelLoader);
44
+ const module = await builder.buildModule();
40
45
  return {
41
- ...await builder.buildModule(),
42
- pg
46
+ ...module,
47
+ kind: "browser",
48
+ reactorModule: module.reactorModule ? {
49
+ ...module.reactorModule,
50
+ pg
51
+ } : void 0
43
52
  };
44
53
  }
45
54
  function getDefaultDrives(runtimeConfig) {
@@ -771,6 +780,166 @@ var BrowserPackageManager = class {
771
780
  }
772
781
  };
773
782
  //#endregion
783
+ //#region src/reactor-worker-name.ts
784
+ const GEN_KEY_PREFIX = "ph-reactor-gen:";
785
+ function reactorWorkerName(namespace) {
786
+ const gen = readWorkerGen(namespace);
787
+ return gen ? `ph-reactor:${namespace}#${gen}` : `ph-reactor:${namespace}`;
788
+ }
789
+ function readWorkerGen(namespace) {
790
+ try {
791
+ return localStorage.getItem(GEN_KEY_PREFIX + namespace);
792
+ } catch {
793
+ return null;
794
+ }
795
+ }
796
+ function bumpWorkerGen(namespace, gen) {
797
+ try {
798
+ localStorage.setItem(GEN_KEY_PREFIX + namespace, gen);
799
+ } catch {}
800
+ }
801
+ //#endregion
802
+ //#region src/reactor-worker-client.ts
803
+ const PING_INTERVAL_MS = 2e3;
804
+ const PING_DEADLINE_MS = 3e3;
805
+ const MAX_MISSED_PINGS = 2;
806
+ function toReactorIdentity(user) {
807
+ if (!user) return null;
808
+ return {
809
+ address: user.address,
810
+ chainId: user.chainId,
811
+ networkId: user.networkId
812
+ };
813
+ }
814
+ function createWorkerReactorClientModule(args) {
815
+ const workerUrl = new URL("./reactor.worker.js", import.meta.url);
816
+ console.info(`[reactor-worker] constructing SharedWorker ${reactorWorkerName(args.namespace)} from ${workerUrl.href}`);
817
+ const worker = new SharedWorker(workerUrl, {
818
+ name: reactorWorkerName(args.namespace),
819
+ type: "module"
820
+ });
821
+ worker.addEventListener("error", (event) => {
822
+ console.error(`[reactor-worker] SharedWorker failed to load from ${workerUrl.href}`, event.message || event);
823
+ });
824
+ worker.port.onmessageerror = (event) => {
825
+ console.error("[reactor-worker] port message could not be deserialized", event);
826
+ };
827
+ const transport = createPortTransport(worker.port);
828
+ const router = new MessageRouter();
829
+ router.attach(transport);
830
+ const documentModelRegistry = new DocumentModelRegistry();
831
+ documentModelRegistry.registerModules(...args.documentModelModules);
832
+ documentModelRegistry.registerUpgradeManifests(...args.upgradeManifests);
833
+ const gitSha = getGitSha();
834
+ const clientProxy = connectReactorClient(router, {
835
+ version: {
836
+ appBuildId: gitSha !== "unknown" ? gitSha : getVersion(),
837
+ rpcProtocolVersion: RPC_PROTOCOL_VERSION,
838
+ models: args.documentModelModules.map((m) => ({
839
+ id: m.documentModel.global.id,
840
+ version: m.version ?? 1
841
+ }))
842
+ },
843
+ construct: {
844
+ namespace: args.namespace,
845
+ relationalNamespace: args.relationalNamespace,
846
+ cdnUrl: args.cdnUrl,
847
+ packageSpecs: args.packageSpecs
848
+ },
849
+ packages: args.packageSpecs
850
+ }, args.onReload, documentModelRegistry);
851
+ const busProxy = createReactorEventBusProxy(router);
852
+ const syncManagerProxy = new SyncManagerProxy(router, busProxy);
853
+ const modelResolver = new DocumentModelResolver(documentModelRegistry, args.documentModelLoader);
854
+ busProxy.subscribe(ReactorEventTypes.MODEL_LOADED, (_type, event) => {
855
+ const { documentType } = event;
856
+ modelResolver.ensureModelLoaded(documentType).catch((error) => {
857
+ console.error(`Failed to load model "${documentType}" into tab registry`, error);
858
+ });
859
+ });
860
+ setPGliteDB({
861
+ db: createRelationalPgliteProxy(router),
862
+ isLoading: false,
863
+ error: null
864
+ });
865
+ postReactorIdentity(router, toReactorIdentity(args.renown.user));
866
+ args.renown.on("user", (user) => postReactorIdentity(router, toReactorIdentity(user)));
867
+ const reactorClientModule = {
868
+ kind: "worker",
869
+ client: clientProxy,
870
+ adminClient: createWorkerAdminClient(router),
871
+ inspector: createInspectorProxy(router),
872
+ reactorModule: {
873
+ documentModelRegistry,
874
+ syncModule: { syncManager: syncManagerProxy },
875
+ eventBus: busProxy
876
+ }
877
+ };
878
+ let pingCounter = 0;
879
+ let missedPings = 0;
880
+ const pingDeadlines = /* @__PURE__ */ new Map();
881
+ router.on("pong", (msg) => {
882
+ const timer = pingDeadlines.get(msg.id);
883
+ if (timer === void 0) return;
884
+ clearTimeout(timer);
885
+ pingDeadlines.delete(msg.id);
886
+ missedPings = 0;
887
+ setWorkerConnectionStatus("connected");
888
+ });
889
+ const pingInterval = setInterval(() => {
890
+ const id = `ping${++pingCounter}`;
891
+ const timer = setTimeout(() => {
892
+ pingDeadlines.delete(id);
893
+ missedPings += 1;
894
+ if (missedPings >= MAX_MISSED_PINGS) setWorkerConnectionStatus("lost");
895
+ }, PING_DEADLINE_MS);
896
+ pingDeadlines.set(id, timer);
897
+ router.post({
898
+ k: "ping",
899
+ id
900
+ });
901
+ }, PING_INTERVAL_MS);
902
+ const dispose = () => {
903
+ clearInterval(pingInterval);
904
+ for (const timer of pingDeadlines.values()) clearTimeout(timer);
905
+ pingDeadlines.clear();
906
+ };
907
+ return {
908
+ reactorClientModule,
909
+ syncManagerProxy,
910
+ dispose
911
+ };
912
+ }
913
+ //#endregion
914
+ //#region src/utils/reactor-worker-flag.ts
915
+ const REACTOR_WORKER_QUERY_KEY = "reactorWorker";
916
+ const REACTOR_WORKER_STORAGE_KEY = "ph:reactorWorker";
917
+ function resolveReactorWorkerEnabled(input) {
918
+ const fromQuery = parseFlag(input.queryParam);
919
+ if (fromQuery !== void 0) return fromQuery;
920
+ const fromStore = parseFlag(input.storedValue);
921
+ if (fromStore !== void 0) return fromStore;
922
+ return input.configFlag;
923
+ }
924
+ function isReactorWorkerEnabled() {
925
+ const configFlag = getRuntimeConfig().connect.instance?.reactorWorker ?? false;
926
+ if (typeof window === "undefined") return configFlag;
927
+ const queryParam = new URLSearchParams(window.location.search).get(REACTOR_WORKER_QUERY_KEY);
928
+ const enabled = resolveReactorWorkerEnabled({
929
+ configFlag,
930
+ queryParam,
931
+ storedValue: window.localStorage.getItem(REACTOR_WORKER_STORAGE_KEY)
932
+ });
933
+ if (parseFlag(queryParam) !== void 0) window.localStorage.setItem(REACTOR_WORKER_STORAGE_KEY, enabled ? "true" : "false");
934
+ return enabled;
935
+ }
936
+ function parseFlag(value) {
937
+ if (value === null || value === void 0) return;
938
+ const normalized = value.trim().toLowerCase();
939
+ if (normalized === "true" || normalized === "1") return true;
940
+ if (normalized === "false" || normalized === "0") return false;
941
+ }
942
+ //#endregion
774
943
  //#region src/pglite.db.ts
775
944
  async function createPGliteWorkerForMajor(major) {
776
945
  const meta = { dbName: RELATIONAL_PGLITE_NAME };
@@ -906,7 +1075,12 @@ function subscribeToPackagesChannel(packageManager) {
906
1075
  source.addEventListener("error", () => {});
907
1076
  }
908
1077
  async function clearReactorStorage() {
909
- await window.ph?.reactorClientModule?.pg?.close();
1078
+ const module = window.ph?.reactorClientModule;
1079
+ if (module?.kind === "worker") {
1080
+ await module.adminClient.clearStorage();
1081
+ return;
1082
+ }
1083
+ if (module?.kind === "browser") await module.reactorModule?.pg?.close();
910
1084
  const targets = (await indexedDB.databases()).map((d) => d.name).filter((n) => !!n && !n.startsWith("ph-pglite-backup::") && /pglite|reactor/i.test(n));
911
1085
  await Promise.all(targets.map((name) => new Promise((resolve) => {
912
1086
  const req = indexedDB.deleteDatabase(name);
@@ -947,7 +1121,43 @@ async function createReactor(localPackage) {
947
1121
  storageKey: phGlobalConfig.routerBasename ?? ""
948
1122
  }) : new NoRegistryDiscoveryService(packageManager);
949
1123
  setPackageDiscoveryService(discoveryService);
950
- const reactorClientModule = await createBrowserReactor(documentModelModules, upgradeManifests, renown, discoveryService);
1124
+ let reactorClientModule;
1125
+ if (isReactorWorkerEnabled()) {
1126
+ const packageSpecs = packageManager.getRegistryPackages().map((p) => p.version ? `${p.name}@${p.version}` : p.name);
1127
+ const registryClient = new RegistryClient(packageManager.cdnUrl ?? "");
1128
+ const workerClient = createWorkerReactorClientModule({
1129
+ namespace: REACTOR_INSTANCE_NAMESPACE,
1130
+ relationalNamespace: RELATIONAL_PGLITE_NAME,
1131
+ cdnUrl: packageManager.cdnUrl ?? "",
1132
+ packageSpecs,
1133
+ documentModelModules,
1134
+ upgradeManifests,
1135
+ documentModelLoader: { async load(documentType) {
1136
+ const names = packageManager.cdnUrl ? await registryClient.getPackagesByDocumentType(documentType) : [];
1137
+ for (const name of names) {
1138
+ const result = await packageManager.addPackage(name);
1139
+ if (result.type === "error") throw new Error(`Failed to install package "${name}" for document model: ${documentType}`, { cause: result.error });
1140
+ }
1141
+ const module = packageManager.packages.flatMap((p) => p.documentModels).find((m) => m.documentModel.global.id === documentType);
1142
+ 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"})`);
1143
+ return module;
1144
+ } },
1145
+ renown,
1146
+ onReload: (reason, workerGen) => {
1147
+ logger.warn("Reactor worker requested reload: @reason", reason);
1148
+ if (workerGen) bumpWorkerGen(REACTOR_INSTANCE_NAMESPACE, workerGen);
1149
+ window.location.reload();
1150
+ }
1151
+ });
1152
+ reactorClientModule = workerClient.reactorClientModule;
1153
+ try {
1154
+ await workerClient.syncManagerProxy.startup();
1155
+ } catch (error) {
1156
+ window.ph.loading = false;
1157
+ logger.error("Reactor worker failed to start: @error", error);
1158
+ throw error;
1159
+ }
1160
+ } else reactorClientModule = await createBrowserReactor(documentModelModules, upgradeManifests, renown, discoveryService);
951
1161
  const drives = await getDrives(reactorClientModule.client);
952
1162
  await login(getDidFromUrl(), renown);
953
1163
  const documentCache = new DocumentCache(reactorClientModule.client);
@@ -1007,8 +1217,10 @@ async function createReactor(localPackage) {
1007
1217
  });
1008
1218
  await refreshReactorDataClient(reactorClientModule.client);
1009
1219
  const packagesWithProcessorFactories = packageManager.packages.filter((pkg) => pkg.processorFactory !== void 0);
1010
- if (packagesWithProcessorFactories.length > 0) {
1011
- const readModels = reactorClientModule.reactorModule?.readModelCoordinator?.readModels ?? [];
1220
+ const reactorModule = reactorClientModule.kind === "browser" ? reactorClientModule.reactorModule : void 0;
1221
+ 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);
1222
+ else if (packagesWithProcessorFactories.length > 0 && reactorModule) {
1223
+ const readModels = reactorModule.readModelCoordinator.readModels;
1012
1224
  const processorHostModule = await createProcessorHostModule(reactorClientModule.client, readModels, window.ph?.attachmentService);
1013
1225
  if (processorHostModule !== void 0) await Promise.all(packagesWithProcessorFactories.map(async (pkg) => {
1014
1226
  const { manifest, processorFactory } = pkg;
@@ -1020,7 +1232,7 @@ async function createReactor(localPackage) {
1020
1232
  try {
1021
1233
  const factory = await processorFactory?.(processorHostModule);
1022
1234
  if (!factory) return;
1023
- await reactorClientModule.reactorModule?.processorManager.registerFactory(id, factory);
1235
+ await reactorModule.processorManager.registerFactory(id, factory);
1024
1236
  } catch (error) {
1025
1237
  logger.error(`Error registering processor: @label`, label);
1026
1238
  logger.error("@error", error);
@@ -1040,5 +1252,5 @@ function getDriveUrl() {
1040
1252
  //#endregion
1041
1253
  export { createReactor as n, clearReactorStorage as t };
1042
1254
 
1043
- //# sourceMappingURL=reactor-BkaNhcsJ.js.map
1044
- //# debugId=1e2f2c08-8613-589f-91a0-13fd61e63228
1255
+ //# sourceMappingURL=reactor-DCmBjI53.js.map
1256
+ //# debugId=925acf3a-3dd4-5950-bdb3-d8cc62bad598
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactor-DCmBjI53.js","sources":["../src/utils/reactor.ts","../src/feature-flags.ts","../src/no-registry-discovery.ts","../src/package-discovery.ts","../src/package-manager.ts","../src/reactor-worker-name.ts","../src/reactor-worker-client.ts","../src/utils/reactor-worker-flag.ts","../src/pglite.db.ts","../src/store/processor-host-module.ts","../src/store/reactor.ts"],"sourcesContent":["import {\n addRemoteDrive,\n ChannelScheme,\n isDriveAuthError,\n ReactorBuilder,\n ReactorClientBuilder,\n setDriveMetadata,\n waitForDocumentReady,\n type BrowserReactorClientModule,\n type Database,\n type IDocumentModelLoader,\n type JwtHandler,\n type SignerConfig,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHConnectDefaultDrive } from \"@powerhousedao/shared/clis\";\nimport type { RuntimePowerhouseConfig } from \"@powerhousedao/shared/connect\";\nimport type {\n DocumentModelModule,\n UpgradeManifest,\n} from \"@powerhousedao/shared/document-model\";\nimport { createSignatureVerifier, type IRenown } from \"@renown/sdk\";\nimport { ConsoleLogger } from \"document-model\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport {\n detectReactorPgMajor,\n loadPGliteModule,\n resolvePgMajorForRuntime,\n} from \"./pglite-runtime.js\";\nimport { REACTOR_PGLITE_NAME } from \"./storage-namespace.js\";\n\n/**\n * Creates a Reactor that plugs into legacy storage but syncs through the new\n * Reactor GQL API.\n */\nexport async function createBrowserReactor(\n documentModelModules: DocumentModelModule[],\n upgradeManifests: UpgradeManifest<readonly number[]>[],\n renown: IRenown,\n documentModelLoader?: IDocumentModelLoader,\n): Promise<BrowserReactorClientModule> {\n const signerConfig: SignerConfig = {\n signer: renown.signer,\n verifier: createSignatureVerifier(),\n };\n\n const jwtHandler: JwtHandler = async (_url: string) => {\n if (!renown.user) {\n return undefined;\n }\n // aud omitted: server verifies without an audience, so aud-bearing tokens\n // are rejected. Re-enable once both sides support audience restriction.\n return renown.getBearerToken({ expiresIn: 10 });\n };\n\n const detected = await detectReactorPgMajor();\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor] Running against legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the banner or the Inspector → Debug tab.`,\n );\n }\n const { PGlite } = await loadPGliteModule(major);\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`, {\n relaxedDurability: true,\n });\n const logger = new ConsoleLogger([\"reactor-client\"]);\n const builder = new ReactorClientBuilder()\n .withLogger(logger)\n .withSigner(signerConfig)\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModels(documentModelModules)\n .withUpgradeManifests(upgradeManifests)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({\n dialect: new PGliteDialect(pg),\n }),\n ),\n );\n\n if (documentModelLoader) {\n builder.withDocumentModelLoader(documentModelLoader);\n }\n\n const module = await builder.buildModule();\n return {\n ...module,\n kind: \"browser\",\n reactorModule: module.reactorModule\n ? { ...module.reactorModule, pg }\n : undefined,\n };\n}\n\nexport function getDefaultDrives(\n runtimeConfig: RuntimePowerhouseConfig,\n): PHConnectDefaultDrive[] {\n return runtimeConfig.connect.drives?.defaultDrives ?? [];\n}\n\n/**\n * Add default drives for the new reactor via sync manager.\n *\n * Drives register concurrently so a slow or unreachable drive can't delay the\n * others — in particular the one the URL slug resolves to. Retries with linear\n * backoff to handle the common race where Connect's dev server is ready before\n * the switchboard has finished binding its port.\n *\n * @param drives - Array of drive objects with url, optional name and icon\n */\nexport async function addDefaultDrivesForNewReactor(\n drives: PHConnectDefaultDrive[],\n): Promise<void> {\n const MAX_ATTEMPTS = 3;\n const BACKOFF_MS = 2000;\n\n await Promise.all(\n drives.map(async (drive) => {\n let driveId: string | undefined;\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n driveId = await addRemoteDrive(drive.url);\n break;\n } catch (error) {\n if (isDriveAuthError(error)) {\n // addRemoteDrive already surfaces the login modal; auth failures\n // don't self-heal, so don't burn the remaining retries.\n break;\n }\n if (attempt === MAX_ATTEMPTS) {\n console.error(\n `Failed to add default drive ${drive.url} after ${MAX_ATTEMPTS} attempts:`,\n error,\n );\n } else {\n const delay = BACKOFF_MS * attempt;\n console.warn(\n `Default drive ${drive.url} not reachable (attempt ${attempt}/${MAX_ATTEMPTS}), retrying in ${delay}ms...`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n if (driveId && (drive.name || drive.icon)) {\n try {\n // setDriveMetadata dispatches against the local drive document, which\n // only exists once initial backfill delivers it — wait for it first\n // so the name/icon override isn't lost to a sync race.\n const reactorClient = window.ph?.reactorClient;\n if (reactorClient) {\n await waitForDocumentReady(reactorClient, driveId, {\n timeoutMs: 15_000,\n });\n }\n await setDriveMetadata(driveId, {\n name: drive.name,\n icon: drive.icon,\n });\n } catch (error) {\n console.warn(\n `Default drive ${drive.url} was added but metadata update failed:`,\n error,\n );\n }\n }\n }),\n );\n}\n","import {\n OpenFeature,\n type ErrorCode,\n type JsonValue,\n type Provider,\n type ResolutionDetails,\n} from \"@openfeature/web-sdk\";\nimport { logger, setLogLevel, type ILogger } from \"document-model\";\n\n/**\n * QueryParamProvider reads feature flags from URL query parameters.\n *\n * Usage:\n * const params = new URLSearchParams(window.location.search);\n * const provider = new QueryParamProvider(params);\n * await OpenFeature.setProviderAndWait(provider);\n *\n * Query parameter format:\n * ?FEATURE_DUAL_ACTION_CREATE_ENABLED=true&FEATURE_FOO=false\n */\nexport class QueryParamProvider implements Provider {\n public readonly runsOn = \"client\" as const;\n\n readonly metadata = {\n name: \"QueryParamProvider\",\n } as const;\n\n private flags: Map<string, string>;\n\n constructor(searchParams: URLSearchParams) {\n this.flags = new Map();\n\n // Extract all query parameters that look like feature flags\n for (const [key, value] of searchParams.entries()) {\n this.flags.set(key, value);\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n ): ResolutionDetails<boolean> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n // Parse boolean from string\n const boolValue = value.toLowerCase() === \"true\" || value === \"1\";\n\n return {\n value: boolValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n ): ResolutionDetails<string> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n return {\n value,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n ): ResolutionDetails<number> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n const numValue = Number(value);\n\n if (isNaN(numValue)) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse \"${value}\" as a number`,\n };\n }\n\n return {\n value: numValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n ): ResolutionDetails<T> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n try {\n const objValue = JSON.parse(value) as T;\n return {\n value: objValue,\n reason: \"STATIC\",\n variant: value,\n };\n } catch (error) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\n/**\n * Initialize OpenFeature with the QueryParamProvider.\n * Reads feature flags from query parameters.\n */\nexport async function initFeatureFlags(\n searchParams?: URLSearchParams,\n): Promise<Map<string, boolean>> {\n const params =\n searchParams ??\n (typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search)\n : new URLSearchParams());\n const provider = new QueryParamProvider(params);\n await OpenFeature.setProviderAndWait(provider);\n\n const features = new Map<string, boolean>();\n\n // Handle LOG_LEVEL query param override\n const logLevelParam = params.get(\"LOG_LEVEL\");\n if (logLevelParam) {\n const validLogLevels = [\"verbose\", \"debug\", \"info\", \"warn\", \"error\"];\n if (validLogLevels.includes(logLevelParam.toLowerCase())) {\n setLogLevel(logLevelParam.toLowerCase() as ILogger[\"level\"]);\n logger.info(\n \"Log level set to @level via query param\",\n logLevelParam.toLowerCase(),\n );\n } else {\n logger.warn(\n \"Invalid LOG_LEVEL query param: @param. Valid values: @validLevels\",\n logLevelParam,\n validLogLevels.join(\", \"),\n );\n }\n }\n\n return features;\n}\n","import {\n type IDocumentModelLoader,\n type IPackageDiscoveryService,\n type DiscoveryEvent,\n type DiscoveryEventListener,\n type FailedInstallation,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { BrowserPackageManager } from \"./package-manager.js\";\n\n/**\n * Discovery service used when no package registry is configured. Every load\n * for an unknown document type is recorded as a failure with reason\n * \"no-registry\" so the UI can surface the issue; the modal install flow is a\n * no-op because there is no registry to query.\n */\nexport class NoRegistryDiscoveryService\n implements IDocumentModelLoader, IPackageDiscoveryService\n{\n #packageManager: BrowserPackageManager;\n #failed = new Map<string, FailedInstallation>();\n #failedMemo: FailedInstallation[] = [];\n #failedSubscribers = new Set<() => void>();\n #eventSubscribers = new Set<DiscoveryEventListener>();\n\n constructor(packageManager: BrowserPackageManager) {\n this.#packageManager = packageManager;\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const existing = this.#findModuleInLoadedPackages(documentType);\n if (existing) {\n this.#clearFailed(documentType);\n return Promise.resolve(existing);\n }\n\n this.#recordFailure(documentType);\n return Promise.reject(\n new Error(\n `No package registry configured; cannot resolve \"${documentType}\"`,\n ),\n );\n }\n\n promptInstallation(): void {\n // no registry to query — nothing to prompt\n }\n\n approveInstallation(): Promise<void> {\n return Promise.resolve();\n }\n\n dismissInstallation(): void {\n // nothing to dismiss\n }\n\n getPendingInstallations(): PendingInstallation[] {\n return [];\n }\n\n subscribePending(): () => void {\n return () => {};\n }\n\n getFailedInstallations(): FailedInstallation[] {\n return this.#failedMemo;\n }\n\n subscribeFailed(listener: () => void): () => void {\n this.#failedSubscribers.add(listener);\n return () => {\n this.#failedSubscribers.delete(listener);\n };\n }\n\n subscribeEvents(listener: DiscoveryEventListener): () => void {\n this.#eventSubscribers.add(listener);\n return () => {\n this.#eventSubscribers.delete(listener);\n };\n }\n\n retryInstallation(documentType: string): Promise<void> {\n // Retry is a no-op without a registry, but re-emitting the failure lets\n // a UI that cleared the row know the underlying condition still holds.\n this.#recordFailure(documentType);\n return Promise.resolve();\n }\n\n #findModuleInLoadedPackages(\n documentType: string,\n ): DocumentModelModule<any> | undefined {\n return this.#packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n }\n\n #recordFailure(documentType: string): void {\n this.#failed.set(documentType, {\n documentType,\n reason: \"no-registry\",\n packageNames: [],\n error: null,\n });\n this.#emitEvent({\n type: \"load-failed\",\n documentType,\n reason: \"no-registry\",\n });\n this.#notifyFailedChanged();\n }\n\n #clearFailed(documentType: string): void {\n if (this.#failed.delete(documentType)) {\n this.#notifyFailedChanged();\n }\n }\n\n #notifyFailedChanged(): void {\n this.#failedMemo = Array.from(this.#failed.values());\n for (const listener of this.#failedSubscribers) {\n listener();\n }\n }\n\n #emitEvent(event: DiscoveryEvent): void {\n for (const listener of this.#eventSubscribers) {\n listener(event);\n }\n }\n}\n","import {\n BrowserLocalStorage,\n type IDocumentModelLoader,\n type IPackageDiscoveryService,\n type DiscoveryEvent,\n type DiscoveryEventListener,\n type FailedInstallation,\n type FailedInstallationReason,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport type { RegistryClient } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { BrowserPackageManager } from \"./package-manager.js\";\n\nexport type DiscoveryMode = \"immediate\" | \"manual\";\n\ntype DeferredEntry = {\n packageNames: string[];\n resolve: (module: DocumentModelModule<any>) => void;\n reject: (reason: unknown) => void;\n promise: Promise<DocumentModelModule<any>>;\n};\n\nexport class PackageDiscoveryService\n implements IDocumentModelLoader, IPackageDiscoveryService\n{\n #packageManager: BrowserPackageManager;\n #registryClient: RegistryClient;\n #mode: DiscoveryMode;\n\n #deferred = new Map<string, DeferredEntry>();\n #pending = new Map<string, PendingInstallation>();\n #pendingMemo: PendingInstallation[] = [];\n #pendingSubscribers = new Set<() => void>();\n #failed = new Map<string, FailedInstallation>();\n #failedMemo: FailedInstallation[] = [];\n #failedSubscribers = new Set<() => void>();\n #eventSubscribers = new Set<DiscoveryEventListener>();\n #dismissedStorage: BrowserLocalStorage<boolean>;\n #discoveredTypes = new Map<string, string[]>();\n\n constructor(\n packageManager: BrowserPackageManager,\n registryClient: RegistryClient,\n options: { mode: DiscoveryMode; storageKey: string },\n ) {\n this.#packageManager = packageManager;\n this.#registryClient = registryClient;\n this.#mode = options.mode;\n this.#dismissedStorage = new BrowserLocalStorage<boolean>(\n options.storageKey + \":PH_DISMISSED_TYPES\",\n );\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const existing = this.#findModuleInLoadedPackages(documentType);\n if (existing) {\n this.#clearFailed(documentType);\n return Promise.resolve(existing);\n }\n\n if (this.#dismissedStorage.has(documentType)) {\n this.#recordFailure(documentType, \"dismissed\", [], null);\n return Promise.reject(\n new Error(`Document type \"${documentType}\" was dismissed`),\n );\n }\n\n const tracked = this.#deferred.get(documentType);\n if (tracked) {\n return tracked.promise;\n }\n\n return this.#discover(documentType);\n }\n\n promptInstallation(documentType: string): void {\n const packageNames = this.#discoveredTypes.get(documentType);\n if (!packageNames) return;\n if (this.#pending.has(documentType)) return;\n\n this.#discoveredTypes.delete(documentType);\n this.#addToPending(documentType, packageNames);\n }\n\n async approveInstallation(packageName: string): Promise<void> {\n const affectedTypes = this.#findTypesByPackage(packageName);\n if (affectedTypes.length === 0) return;\n\n const result = await this.#packageManager.addPackage(packageName);\n if (result.type === \"error\") {\n this.#emitEvent({\n type: \"installation-failed\",\n packageName,\n error: result.error,\n });\n for (const documentType of affectedTypes) {\n const entry = this.#deferred.get(documentType);\n if (entry) {\n entry.reject(result.error);\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n }\n this.#recordFailure(\n documentType,\n \"install-failed\",\n [packageName],\n result.error,\n );\n }\n this.#notifyPendingChanged();\n return;\n }\n\n this.#emitEvent({\n type: \"installation-approved\",\n packageName,\n documentTypes: affectedTypes,\n });\n\n for (const documentType of affectedTypes) {\n const entry = this.#deferred.get(documentType);\n if (!entry) continue;\n\n const module = this.#findModuleInLoadedPackages(documentType);\n if (module) {\n entry.resolve(module);\n this.#clearFailed(documentType);\n } else {\n const error = new Error(\n `Package \"${packageName}\" installed but module for \"${documentType}\" not found`,\n );\n entry.reject(error);\n this.#recordFailure(\n documentType,\n \"install-failed\",\n [packageName],\n error,\n );\n }\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n }\n this.#notifyPendingChanged();\n }\n\n dismissInstallation(packageName: string): void {\n const affectedTypes = this.#findTypesByPackage(packageName);\n if (affectedTypes.length === 0) return;\n\n for (const documentType of affectedTypes) {\n this.#dismissedStorage.set(documentType, true);\n const entry = this.#deferred.get(documentType);\n if (entry) {\n entry.reject(\n new Error(`Document type \"${documentType}\" was dismissed`),\n );\n }\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n this.#discoveredTypes.delete(documentType);\n this.#recordFailure(documentType, \"dismissed\", [packageName], null);\n }\n\n this.#emitEvent({\n type: \"installation-dismissed\",\n packageName,\n documentTypes: affectedTypes,\n });\n this.#notifyPendingChanged();\n }\n\n getPendingInstallations(): PendingInstallation[] {\n return this.#pendingMemo;\n }\n\n subscribePending(listener: () => void): () => void {\n this.#pendingSubscribers.add(listener);\n return () => {\n this.#pendingSubscribers.delete(listener);\n };\n }\n\n getFailedInstallations(): FailedInstallation[] {\n return this.#failedMemo;\n }\n\n subscribeFailed(listener: () => void): () => void {\n this.#failedSubscribers.add(listener);\n return () => {\n this.#failedSubscribers.delete(listener);\n };\n }\n\n subscribeEvents(listener: DiscoveryEventListener): () => void {\n this.#eventSubscribers.add(listener);\n return () => {\n this.#eventSubscribers.delete(listener);\n };\n }\n\n async retryInstallation(documentType: string): Promise<void> {\n this.#dismissedStorage.delete(documentType);\n this.#clearFailed(documentType);\n try {\n await this.#discover(documentType);\n } catch {\n // failure has been recorded via #recordFailure; swallow so the\n // caller (UI button) doesn't have to handle the rejection\n }\n }\n\n async #discover(documentType: string): Promise<DocumentModelModule<any>> {\n let packageNames: string[];\n try {\n packageNames =\n await this.#registryClient.getPackagesByDocumentType(documentType);\n } catch (error) {\n const normalized =\n error instanceof Error ? error : new Error(String(error));\n this.#emitEvent({\n type: \"registry-query-failed\",\n documentType,\n error: normalized,\n });\n this.#recordFailure(documentType, \"registry-error\", [], normalized);\n return Promise.reject(normalized);\n }\n\n if (packageNames.length === 0) {\n this.#recordFailure(documentType, \"not-in-registry\", [], null);\n return Promise.reject(\n new Error(`No packages found for document type \"${documentType}\"`),\n );\n }\n\n const entry = this.#createDeferredEntry(documentType, packageNames);\n\n this.#emitEvent({\n type: \"type-discovered\",\n documentType,\n packageNames,\n });\n\n if (this.#mode === \"immediate\") {\n this.#addToPending(documentType, packageNames);\n } else {\n this.#discoveredTypes.set(documentType, packageNames);\n }\n\n return entry.promise;\n }\n\n #createDeferredEntry(\n documentType: string,\n packageNames: string[],\n ): DeferredEntry {\n let resolve!: (module: DocumentModelModule<any>) => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<DocumentModelModule<any>>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const entry: DeferredEntry = { packageNames, resolve, reject, promise };\n this.#deferred.set(documentType, entry);\n return entry;\n }\n\n #addToPending(documentType: string, packageNames: string[]): void {\n const installation: PendingInstallation = { documentType, packageNames };\n this.#pending.set(documentType, installation);\n this.#emitEvent({\n type: \"installation-prompted\",\n documentType,\n packageNames,\n });\n this.#notifyPendingChanged();\n }\n\n #findModuleInLoadedPackages(\n documentType: string,\n ): DocumentModelModule<any> | undefined {\n return this.#packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n }\n\n #findTypesByPackage(packageName: string): string[] {\n const types: string[] = [];\n for (const [documentType, entry] of this.#deferred) {\n if (entry.packageNames.includes(packageName)) {\n types.push(documentType);\n }\n }\n return types;\n }\n\n #notifyPendingChanged(): void {\n this.#pendingMemo = Array.from(this.#pending.values());\n for (const listener of this.#pendingSubscribers) {\n listener();\n }\n }\n\n #notifyFailedChanged(): void {\n this.#failedMemo = Array.from(this.#failed.values());\n for (const listener of this.#failedSubscribers) {\n listener();\n }\n }\n\n #recordFailure(\n documentType: string,\n reason: FailedInstallationReason,\n packageNames: string[],\n error: Error | null,\n ): void {\n this.#failed.set(documentType, {\n documentType,\n reason,\n packageNames,\n error,\n });\n this.#emitEvent({ type: \"load-failed\", documentType, reason });\n this.#notifyFailedChanged();\n }\n\n #clearFailed(documentType: string): void {\n if (this.#failed.delete(documentType)) {\n this.#notifyFailedChanged();\n }\n }\n\n #emitEvent(event: DiscoveryEvent): void {\n for (const listener of this.#eventSubscribers) {\n listener(event);\n }\n }\n}\n","import * as common from \"@powerhousedao/powerhouse-vetra-packages\";\nimport commonPkg from \"@powerhousedao/powerhouse-vetra-packages/package.json\" with { type: \"json\" };\nimport type {\n IPackagesListener,\n PackageManagerInstallResult,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserLocalStorage,\n type IPackageListerUnsubscribe,\n type IPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n type DocumentModelLib,\n type DocumentModelModule,\n} from \"@powerhousedao/shared/document-model\";\nimport * as vetra from \"@powerhousedao/vetra\";\nimport vetraPkg from \"@powerhousedao/vetra/package.json\" with { type: \"json\" };\n\ntype PackageMeta = {\n name: string;\n importUrl: string | null;\n stylesheetUrl: string | null;\n version?: string;\n /**\n * Full spec the user asked for (e.g. `@scope/pkg@2.0.0-beta.2`). Kept so a\n * reload re-installs exactly the tag/version originally picked rather than\n * sliding to `latest`. Absent for legacy entries and local packages.\n */\n spec?: string;\n};\n\n/**\n * Strip any `@tag` / `@version` suffix from a package spec, returning the bare\n * package name. Mirrors `parsePackageSpec` on the UI side.\n */\nfunction parseBareName(spec: string): string {\n const trimmed = spec.trim();\n const at = trimmed.startsWith(\"@\")\n ? trimmed.lastIndexOf(\"@\")\n : trimmed.indexOf(\"@\");\n return at > 0 ? trimmed.slice(0, at) : trimmed;\n}\n\ntype PackageWithMeta = PackageMeta & {\n loadedPackage: DocumentModelLib<any>;\n spec?: string;\n};\n\nasync function fetchPackageJsonVersion(\n baseUrl: string,\n): Promise<string | undefined> {\n try {\n const res = await fetch(baseUrl);\n if (!res.ok) return undefined;\n const pkg = (await res.json()) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst LOCAL_PACKAGE_NAME = \"Local\" as const;\n\nexport class BrowserPackageManager implements IPackageManager {\n registryUrl: string | null;\n #storage: BrowserLocalStorage<PackageMeta>;\n #packages: Map<string, DocumentModelLib<any>> = new Map();\n #subscribers = new Set<IPackagesListener>();\n #packagesMemo: DocumentModelLib<any>[] = [];\n #stylesheets: Map<string, HTMLStyleElement> = new Map();\n #localPackage: DocumentModelLib<any> | undefined;\n\n #cdnUrl: string | null;\n #localPackageVersion: string | undefined;\n #localPackageNames: Set<string> = new Set([LOCAL_PACKAGE_NAME]);\n\n constructor(namespace: string, registryUrl: string | null) {\n this.#storage = new BrowserLocalStorage<PackageMeta>(\n namespace + \":PH_PACKAGES\",\n );\n this.registryUrl = registryUrl;\n this.#cdnUrl = registryUrl !== null ? this.#toCdnUrl(registryUrl) : null;\n }\n\n #toCdnUrl(baseUrl: string): string {\n if (baseUrl.includes(\"/-/cdn\")) return baseUrl;\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${base}/-/cdn`;\n }\n\n async init(\n localPackage?: DocumentModelLib<any>,\n localPackageVersion?: string,\n ) {\n this.addLocalPackage(common.manifest.name, common, commonPkg.version);\n this.addLocalPackage(vetra.manifest.name, vetra, vetraPkg.version);\n if (localPackage) {\n this.updateLocalPackage(localPackage, localPackageVersion);\n }\n for (const packageName of this.#storage.keys()) {\n // Re-hydrate with the originally-requested spec so a tag/version pick\n // sticks across reloads. Fall back to the bare key for legacy entries\n // (pre-spec) and for entries that never had a tag.\n const existingMeta = this.#storage.get(packageName);\n const specForReload = existingMeta?.spec ?? packageName;\n console.debug(\n `[Connect][PackageManager] Rehydrating \"${packageName}\" via spec \"${specForReload}\"`,\n );\n const result = await this.addPackage(specForReload);\n // Previously-installed package that no longer resolves (version\n // withdrawn from npm, registry moved, etc.) would otherwise\n // 404-toast on every boot forever. Drop it from persistent storage\n // so the failure is one-shot instead of sticky.\n if (result.type === \"error\") {\n this.#storage.delete(packageName);\n }\n }\n }\n\n addLocalPackage(\n name: string,\n loadedPackage: DocumentModelLib<any>,\n version?: string,\n ) {\n this.#localPackageNames.add(name);\n this.#registerPackage({\n name,\n importUrl: null,\n stylesheetUrl: null,\n loadedPackage,\n version,\n });\n }\n\n updateLocalPackage(pkg: DocumentModelLib<any>, version?: string) {\n console.debug(\"Updating local package:\", pkg);\n this.#localPackage = pkg;\n this.#registerPackage({\n name: LOCAL_PACKAGE_NAME,\n stylesheetUrl: null,\n importUrl: null,\n loadedPackage: pkg,\n });\n if (version) {\n this.#localPackageVersion = version;\n this.#notifyPackagesChanged();\n return;\n }\n fetchPackageJsonVersion(\"/package.json\")\n .then((fetchedVersion) => {\n this.#localPackageVersion = fetchedVersion;\n if (fetchedVersion) this.#notifyPackagesChanged();\n })\n .catch(() => {});\n }\n\n get packages() {\n return this.#packagesMemo;\n }\n\n get cdnUrl(): string | null {\n return this.#cdnUrl;\n }\n\n getPackageSource(packageName: string) {\n // check vs packages registered as local (Common, Vetra, bundled packages...)\n if (this.#localPackageNames.has(packageName)) {\n return \"common\";\n }\n // check if the package has the same name as the local project\n if (packageName === this.#localPackage?.manifest.name) return \"project\";\n const packageMeta = this.#storage.get(packageName);\n // if meta does not exist the package is not installed\n if (!packageMeta) return null;\n // if imported from node_modules then the package is installed locally\n if (packageMeta.importUrl === `/node_modules/${packageName}`)\n return \"local-install\";\n // all other import urls point to a registry\n return \"registry-install\";\n }\n\n /**\n * Return the registry-installed packages keyed by their storage name (which\n * is the registry spec, e.g. \"@powerhousedao/clint-common\"), with the\n * installed version when known. Excludes bundled (common) packages, the\n * local project package, and packages resolved out of `/node_modules/`.\n */\n getRegistryPackages(): { name: string; version: string | undefined }[] {\n const out: { name: string; version: string | undefined }[] = [];\n for (const [name, meta] of this.#storage) {\n if (this.#localPackageNames.has(name)) continue;\n if (name === LOCAL_PACKAGE_NAME) continue;\n if (meta.importUrl === `/node_modules/${name}`) continue;\n out.push({ name, version: meta.version });\n }\n return out;\n }\n\n getPackageVersion(packageName: string): string | undefined {\n if (packageName === this.#localPackage?.manifest.name) {\n return this.#localPackageVersion;\n }\n return this.#storage.get(packageName)?.version;\n }\n\n async addPackage(packageSpec: string): Promise<PackageManagerInstallResult> {\n // `packageSpec` may include a `@tag` / `@version` suffix (e.g. user picked\n // a specific version in the package manager UI, or re-hydrated on reload\n // from the persisted spec). We always register/look up by the bare name so\n // status tracking, version lookups, and uninstall all go through a single\n // canonical key. The spec itself is kept on the meta so reloads re-fetch\n // the same tag.\n const bareName = parseBareName(packageSpec);\n const hasTagOrVersion = bareName !== packageSpec;\n console.debug(\n `[Connect][PackageManager] addPackage spec=\"${packageSpec}\" bareName=\"${bareName}\"`,\n );\n\n const existingPackage = this.#packages.get(bareName);\n if (existingPackage) {\n const requestedVersion = hasTagOrVersion\n ? packageSpec.slice(bareName.length + 1)\n : undefined;\n const currentVersion = this.#storage.get(bareName)?.version;\n const isLocal = this.#localPackageNames.has(bareName);\n const sameVersion =\n !requestedVersion ||\n !currentVersion ||\n requestedVersion === currentVersion;\n if (isLocal || sameVersion) {\n console.debug(\n `[Connect][PackageManager] \"${bareName}\" already loaded; skipping re-fetch`,\n );\n return {\n type: \"success\",\n package: existingPackage,\n };\n }\n console.debug(\n `[Connect][PackageManager] \"${bareName}\" version bump ${currentVersion} → ${requestedVersion}; refetching`,\n );\n }\n try {\n const packageWithMeta = await this.#loadPackage(packageSpec);\n // `#loadPackage*` set `name` to whatever spec it built the URL from.\n // Canonicalize to the bare name for the map/storage keys, and stash the\n // original spec separately so reloads re-use it.\n packageWithMeta.name = bareName;\n if (hasTagOrVersion) {\n packageWithMeta.spec = packageSpec;\n }\n // Swap stylesheets only once the new package is in hand. If `#loadPackage`\n // throws above, the old stylesheet stays mounted and the UI keeps\n // rendering the previous version instead of unstyled markup.\n if (existingPackage) {\n this.#unmountStylesheet(bareName);\n }\n this.#registerPackage(packageWithMeta);\n\n return {\n type: \"success\",\n package: packageWithMeta.loadedPackage,\n };\n } catch (error) {\n const normalized =\n error instanceof Error ? error : new Error(String(error));\n console.error(\n `[Connect][PackageManager] Failed to install package \"${packageSpec}\": ${normalized.message}`,\n normalized,\n );\n return {\n type: \"error\",\n error: normalized,\n };\n }\n }\n\n async addPackages(packageNames: string[]) {\n const results: PackageManagerInstallResult[] = [];\n for (const packageName of packageNames) {\n const result = await this.addPackage(packageName);\n results.push(result);\n }\n return results;\n }\n\n removePackage(name: string) {\n this.#packages.delete(name);\n this.#storage.delete(name);\n this.#unmountStylesheet(name);\n this.#notifyPackagesChanged();\n }\n\n subscribe(handler: IPackagesListener): IPackageListerUnsubscribe {\n this.#subscribers.add(handler);\n return () => {\n this.#subscribers.delete(handler);\n };\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const documentModelModule = Array.from(\n this.#packages.values().flatMap((p) => p.documentModels),\n ).find((m) => m.documentModel.global.id === documentType);\n\n if (documentModelModule) return Promise.resolve(documentModelModule);\n return Promise.reject(new Error(\"Model not available\"));\n }\n\n async #loadPackageFromNodeModules(name: string): Promise<PackageWithMeta> {\n const importUrl = `/node_modules/${name}/browser/index.js`;\n const stylesheetUrl = `/node_modules/${name}/style.css`;\n\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n packageWithMeta.version = await fetchPackageJsonVersion(\n `/node_modules/${name}/package.json`,\n );\n\n return packageWithMeta;\n }\n\n async #loadPackageFromRegistry(name: string): Promise<PackageWithMeta> {\n const importUrl = `${this.#cdnUrl}/${name}/browser/index.js`;\n const stylesheetUrl = `${this.#cdnUrl}/${name}/style.css`;\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n packageWithMeta.version = await fetchPackageJsonVersion(\n `${this.#cdnUrl}/${name}/package.json`,\n );\n\n return packageWithMeta;\n }\n\n async #importPackage(packageMeta: PackageMeta): Promise<PackageWithMeta> {\n const { name, importUrl, stylesheetUrl } = packageMeta;\n if (!importUrl) {\n throw new Error(`Import url not defined for package \"${name}\".`);\n }\n\n const loadedPackage = (await import(\n /* @vite-ignore */ importUrl\n )) as DocumentModelLib<any>;\n\n return {\n name,\n loadedPackage,\n importUrl,\n stylesheetUrl,\n };\n }\n\n async #loadPackage(packageName: string): Promise<PackageWithMeta> {\n if (this.#localPackageNames.has(packageName)) {\n throw new Error(\n `Package \"${packageName}\" is a local package and cannot be loaded dynamically.`,\n );\n }\n\n // only attemp to load from node_modules in dev mode\n if (!import.meta.env.PROD) {\n try {\n const packageWithMeta =\n await this.#loadPackageFromNodeModules(packageName);\n return packageWithMeta;\n } catch (error) {\n console.warn(\n `Failed to load package \"${packageName}\" from node_modules:`,\n error,\n );\n }\n }\n\n if (!this.registryUrl) {\n throw new Error(\"Registry url not defined.\");\n }\n\n return await this.#loadPackageFromRegistry(packageName);\n }\n\n #registerPackage(packageWithMeta: PackageWithMeta) {\n const { name, loadedPackage, importUrl, stylesheetUrl, version, spec } =\n packageWithMeta;\n\n if (stylesheetUrl !== null) {\n this.#mountStylesheet(name, stylesheetUrl);\n }\n this.#packages.set(name, loadedPackage);\n this.#storage.set(name, {\n name,\n importUrl,\n stylesheetUrl,\n version,\n ...(spec ? { spec } : {}),\n });\n console.debug(\n `[Connect][PackageManager] Registered \"${name}\" (version=${version ?? \"?\"}, spec=${spec ?? \"—\"})`,\n );\n\n this.#notifyPackagesChanged();\n }\n\n #mountStylesheet(name: string, href: string) {\n const existing = this.#stylesheets.get(name);\n if (existing) return existing;\n\n const style = document.createElement(\"style\");\n style.textContent = `@import url(\"${href}\") layer(external-packages);`;\n document.head.appendChild(style);\n\n this.#stylesheets.set(name, style);\n }\n\n #unmountStylesheet(name: string): void {\n const style = this.#stylesheets.get(name);\n if (!style) return;\n\n style.remove();\n this.#stylesheets.delete(name);\n }\n\n #notifyPackagesChanged() {\n this.#packagesMemo = Array.from(this.#packages.values());\n const packages = this.packages;\n this.#subscribers.forEach((handler) => {\n handler({ packages });\n });\n }\n}\n","const GEN_KEY_PREFIX = \"ph-reactor-gen:\";\n\n// A persisted generation token, bumped on restart, is folded into the\n// SharedWorker name so a restart spawns a fresh worker instance while the\n// IndexedDB namespace (and its data) stays put.\nexport function reactorWorkerName(namespace: string): string {\n const gen = readWorkerGen(namespace);\n return gen ? `ph-reactor:${namespace}#${gen}` : `ph-reactor:${namespace}`;\n}\n\nexport function readWorkerGen(namespace: string): string | null {\n try {\n return localStorage.getItem(GEN_KEY_PREFIX + namespace);\n } catch {\n return null;\n }\n}\n\nexport function bumpWorkerGen(namespace: string, gen: string): void {\n try {\n localStorage.setItem(GEN_KEY_PREFIX + namespace, gen);\n } catch {\n // localStorage unavailable; the reload falls back to reusing the worker.\n }\n}\n","import {\n DocumentModelRegistry,\n DocumentModelResolver,\n ReactorEventTypes,\n type IDocumentModelLoader,\n type ModelLoadedEvent,\n} from \"@powerhousedao/reactor\";\nimport {\n setPGliteDB,\n type WorkerReactorClientModule,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n connectReactorClient,\n createInspectorProxy,\n createPortTransport,\n createReactorEventBusProxy,\n createRelationalPgliteProxy,\n createWorkerAdminClient,\n MessageRouter,\n postReactorIdentity,\n RPC_PROTOCOL_VERSION,\n SyncManagerProxy,\n type ReactorIdentity,\n} from \"@powerhousedao/reactor-browser/rpc\";\nimport type {\n DocumentModelModule,\n UpgradeManifest,\n} from \"@powerhousedao/shared/document-model\";\nimport type { IRenown, User } from \"@renown/sdk\";\nimport { setWorkerConnectionStatus } from \"./connection-state.js\";\nimport { reactorWorkerName } from \"./reactor-worker-name.js\";\nimport { getGitSha, getVersion } from \"./utils/build-info.js\";\n\nconst PING_INTERVAL_MS = 2000;\nconst PING_DEADLINE_MS = 3000;\nconst MAX_MISSED_PINGS = 2;\n\nexport type WorkerReactorClientArgs = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\n documentModelModules: DocumentModelModule[];\n upgradeManifests: UpgradeManifest<readonly number[]>[];\n documentModelLoader: IDocumentModelLoader;\n renown: IRenown;\n onReload: (reason: string, workerGen?: string) => void;\n};\n\nexport type WorkerReactorClient = {\n reactorClientModule: WorkerReactorClientModule;\n syncManagerProxy: SyncManagerProxy;\n dispose: () => void;\n};\n\nfunction toReactorIdentity(user: User | undefined): ReactorIdentity | null {\n if (!user) {\n return null;\n }\n return {\n address: user.address,\n chainId: user.chainId,\n networkId: user.networkId,\n };\n}\n\nexport function createWorkerReactorClientModule(\n args: WorkerReactorClientArgs,\n): WorkerReactorClient {\n const workerUrl = new URL(\"./reactor.worker.js\", import.meta.url);\n console.info(\n `[reactor-worker] constructing SharedWorker ${reactorWorkerName(\n args.namespace,\n )} from ${workerUrl.href}`,\n );\n const worker = new SharedWorker(workerUrl, {\n name: reactorWorkerName(args.namespace),\n type: \"module\",\n });\n worker.addEventListener(\"error\", (event) => {\n console.error(\n `[reactor-worker] SharedWorker failed to load from ${workerUrl.href}`,\n event.message || event,\n );\n });\n worker.port.onmessageerror = (event) => {\n console.error(\n \"[reactor-worker] port message could not be deserialized\",\n event,\n );\n };\n const transport = createPortTransport(worker.port);\n const router = new MessageRouter();\n router.attach(transport);\n\n const documentModelRegistry = new DocumentModelRegistry();\n documentModelRegistry.registerModules(...args.documentModelModules);\n documentModelRegistry.registerUpgradeManifests(...args.upgradeManifests);\n\n const gitSha = getGitSha();\n const clientProxy = connectReactorClient(\n router,\n {\n version: {\n appBuildId: gitSha !== \"unknown\" ? gitSha : getVersion(),\n rpcProtocolVersion: RPC_PROTOCOL_VERSION,\n models: args.documentModelModules.map((m) => ({\n id: m.documentModel.global.id,\n version: m.version ?? 1,\n })),\n },\n construct: {\n namespace: args.namespace,\n relationalNamespace: args.relationalNamespace,\n cdnUrl: args.cdnUrl,\n packageSpecs: args.packageSpecs,\n },\n packages: args.packageSpecs,\n },\n args.onReload,\n documentModelRegistry,\n );\n\n const busProxy = createReactorEventBusProxy(router);\n const syncManagerProxy = new SyncManagerProxy(router, busProxy);\n\n // Keep the tab registry synced with the worker's on-demand loads.\n const modelResolver = new DocumentModelResolver(\n documentModelRegistry,\n args.documentModelLoader,\n );\n busProxy.subscribe(ReactorEventTypes.MODEL_LOADED, (_type, event) => {\n const { documentType } = event as ModelLoadedEvent;\n void modelResolver.ensureModelLoaded(documentType).catch((error) => {\n console.error(\n `Failed to load model \"${documentType}\" into tab registry`,\n error,\n );\n });\n });\n\n // Seed the relational read surface the relational hooks read (SELECT + live, no raw PGlite).\n setPGliteDB({\n db: createRelationalPgliteProxy(router),\n isLoading: false,\n error: null,\n });\n\n postReactorIdentity(router, toReactorIdentity(args.renown.user));\n args.renown.on(\"user\", (user) =>\n postReactorIdentity(router, toReactorIdentity(user)),\n );\n\n const reactorClientModule: WorkerReactorClientModule = {\n kind: \"worker\",\n client: clientProxy,\n adminClient: createWorkerAdminClient(router),\n inspector: createInspectorProxy(router),\n reactorModule: {\n documentModelRegistry,\n syncModule: { syncManager: syncManagerProxy },\n eventBus: busProxy,\n },\n };\n\n let pingCounter = 0;\n let missedPings = 0;\n const pingDeadlines = new Map<string, ReturnType<typeof setTimeout>>();\n\n router.on(\"pong\", (msg) => {\n const timer = pingDeadlines.get(msg.id);\n if (timer === undefined) {\n return;\n }\n clearTimeout(timer);\n pingDeadlines.delete(msg.id);\n missedPings = 0;\n setWorkerConnectionStatus(\"connected\");\n });\n\n const pingInterval = setInterval(() => {\n const id = `ping${++pingCounter}`;\n const timer = setTimeout(() => {\n pingDeadlines.delete(id);\n missedPings += 1;\n if (missedPings >= MAX_MISSED_PINGS) {\n setWorkerConnectionStatus(\"lost\");\n }\n }, PING_DEADLINE_MS);\n pingDeadlines.set(id, timer);\n router.post({ k: \"ping\", id });\n }, PING_INTERVAL_MS);\n\n const dispose = () => {\n clearInterval(pingInterval);\n for (const timer of pingDeadlines.values()) {\n clearTimeout(timer);\n }\n pingDeadlines.clear();\n };\n\n return { reactorClientModule, syncManagerProxy, dispose };\n}\n","import { getRuntimeConfig } from \"../runtime-config.js\";\n\nexport const REACTOR_WORKER_QUERY_KEY = \"reactorWorker\";\nexport const REACTOR_WORKER_STORAGE_KEY = \"ph:reactorWorker\";\n\nexport type ReactorWorkerFlagInput = {\n configFlag: boolean;\n queryParam?: string | null;\n storedValue?: string | null;\n};\n\nexport function resolveReactorWorkerEnabled(\n input: ReactorWorkerFlagInput,\n): boolean {\n const fromQuery = parseFlag(input.queryParam);\n if (fromQuery !== undefined) {\n return fromQuery;\n }\n const fromStore = parseFlag(input.storedValue);\n if (fromStore !== undefined) {\n return fromStore;\n }\n return input.configFlag;\n}\n\n// Effective flag from config + dev override; a query-param override is persisted\n// to localStorage so it survives a refresh.\nexport function isReactorWorkerEnabled(): boolean {\n const configFlag =\n getRuntimeConfig().connect.instance?.reactorWorker ?? false;\n if (typeof window === \"undefined\") {\n return configFlag;\n }\n const queryParam = new URLSearchParams(window.location.search).get(\n REACTOR_WORKER_QUERY_KEY,\n );\n const storedValue = window.localStorage.getItem(REACTOR_WORKER_STORAGE_KEY);\n const enabled = resolveReactorWorkerEnabled({\n configFlag,\n queryParam,\n storedValue,\n });\n // Persist only an explicit override, not an unrecognized value.\n if (parseFlag(queryParam) !== undefined) {\n window.localStorage.setItem(\n REACTOR_WORKER_STORAGE_KEY,\n enabled ? \"true\" : \"false\",\n );\n }\n return enabled;\n}\n\nfunction parseFlag(value: string | null | undefined): boolean | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\") {\n return false;\n }\n // Unrecognized value (e.g. a typo): no override, fall through to store/config.\n return undefined;\n}\n","import type { PGliteWorker } from \"@electric-sql/pglite/worker\";\nimport { createRelationalDb } from \"@powerhousedao/shared/processors\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport {\n detectRelationalPgMajor,\n resolvePgMajorForRuntime,\n type SupportedPgMajor,\n} from \"./utils/pglite-runtime.js\";\nimport { RELATIONAL_PGLITE_NAME } from \"./utils/storage-namespace.js\";\n\nasync function createPGliteWorkerForMajor(\n major: SupportedPgMajor,\n): Promise<PGliteWorker> {\n // The worker reads the data-dir name from meta so the namespace is owned on\n // the main thread alongside the other origin-scoped stores.\n const meta = { dbName: RELATIONAL_PGLITE_NAME };\n if (major === 16) {\n const [legacyWorker, legacyLive] = await Promise.all([\n import(\"pglite-legacy-02/worker\"),\n import(\"pglite-legacy-02/live\"),\n ]);\n const worker = new Worker(\n new URL(\"./pglite.worker.legacy.js\", import.meta.url),\n { type: \"module\" },\n );\n return legacyWorker.PGliteWorker.create(worker, {\n meta,\n extensions: { live: legacyLive.live },\n }) as unknown as PGliteWorker;\n }\n const [{ PGliteWorker }, { live }] = await Promise.all([\n import(\"@electric-sql/pglite/worker\"),\n import(\"@electric-sql/pglite/live\"),\n ]);\n const worker = new Worker(new URL(\"./pglite.worker.js\", import.meta.url), {\n type: \"module\",\n });\n return PGliteWorker.create(worker, { meta, extensions: { live } });\n}\n\nexport async function getDb() {\n const detected = await detectRelationalPgMajor();\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor] Relational worker is opening legacy Postgres ${major} data dir. Migrate to PG17 from the banner or the Inspector → Debug tab.`,\n );\n }\n\n const pgLite = await createPGliteWorkerForMajor(major);\n\n const kysely = new Kysely({\n dialect: new PGliteDialect(pgLite),\n });\n\n const relationalDb = createRelationalDb(kysely);\n\n return { pgLite, relationalDb };\n}\n","import {\n createAttachmentClient,\n type AttachmentHeader,\n type AttachmentResponse,\n type IAttachmentService,\n} from \"@powerhousedao/reactor-attachments/client\";\nimport {\n createAnalyticsStore,\n type IReactorClient,\n type IReactorProcessorHostModule,\n} from \"@powerhousedao/reactor-browser\";\nimport { getDb } from \"../pglite.db.js\";\n\n/** @deprecated Use IReactorClient from @powerhousedao/reactor-browser */\nexport type IReactorDispatch = IReactorClient;\n\nclass NullAttachmentService implements IAttachmentService {\n reserve(): Promise<never> {\n return Promise.reject(\n new Error(\"NullAttachmentService: no attachment service configured\"),\n );\n }\n stat(): Promise<AttachmentHeader> {\n return Promise.reject(\n new Error(\"NullAttachmentService: no attachment service configured\"),\n );\n }\n get(): Promise<AttachmentResponse> {\n return Promise.reject(\n new Error(\"NullAttachmentService: no attachment service configured\"),\n );\n }\n}\n\ninterface INamedReadModel {\n readonly name: string;\n}\n\nexport async function createProcessorHostModule(\n reactorClient: IReactorClient,\n readModels: INamedReadModel[],\n attachmentService?: IAttachmentService,\n): Promise<IReactorProcessorHostModule | undefined> {\n try {\n const { pgLite, relationalDb } = await getDb();\n const { store: analyticsStore } = await createAnalyticsStore({\n pgLite,\n });\n const processorApp = \"connect\" as const;\n return {\n relationalDb,\n analyticsStore,\n processorApp,\n client: reactorClient,\n attachments: createAttachmentClient(\n attachmentService ?? new NullAttachmentService(),\n ),\n dispatch: {\n async execute(docId, branch, actions, signal) {\n const jobInfo = await reactorClient.executeAsync(\n docId,\n branch,\n actions,\n signal,\n );\n return { id: jobInfo.id, status: jobInfo.status };\n },\n },\n getReadModel<T>(name: string): T {\n const model = readModels.find((m) => m.name === name);\n if (!model) {\n throw new Error(`Read model \"${name}\" not found`);\n }\n return model as unknown as T;\n },\n };\n } catch (error) {\n console.error(`Failed to initialize processor host module:`);\n console.error(error);\n }\n}\n","import {\n buildPHGlobalConfig,\n phGlobalConfig,\n} from \"@powerhousedao/connect/config\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport {\n addDefaultDrivesForNewReactor,\n createBrowserReactor,\n getDefaultDrives,\n} from \"@powerhousedao/connect/utils\";\nimport { createRemoteAttachmentService } from \"@powerhousedao/reactor-attachments/client\";\nimport {\n addPHEventHandlers,\n addRemoteDrive,\n DocumentCache,\n DocumentChangeType,\n DRIVE_DOCUMENT_TYPES,\n extractDriveSlugFromPath,\n extractNodeSlugFromPath,\n getDrives,\n login,\n refreshReactorDataClient,\n RegistryClient,\n setAttachmentService,\n setDefaultPHGlobalConfig,\n setDocumentCache,\n setDrives,\n setFeatures,\n setPackageDiscoveryService,\n setPHToast,\n setReactorClient,\n setReactorClientModule,\n setRenown,\n setSelectedDrive,\n setSelectedNode,\n setVetraPackageManager,\n type BrowserReactorClientModule,\n type IDocumentModelLoader,\n type IPackageManager,\n type PHToastFn,\n type WorkerReactorClientModule,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserKeyStorage,\n RenownBuilder,\n RenownCryptoBuilder,\n} from \"@renown/sdk\";\nimport {\n logger,\n type DocumentModelLib,\n type UpgradeManifest,\n} from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.js\";\nimport { NoRegistryDiscoveryService } from \"../no-registry-discovery.js\";\nimport { PackageDiscoveryService } from \"../package-discovery.js\";\nimport { BrowserPackageManager } from \"../package-manager.js\";\nimport { createWorkerReactorClientModule } from \"../reactor-worker-client.js\";\nimport { bumpWorkerGen } from \"../reactor-worker-name.js\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\nimport { isReactorWorkerEnabled } from \"../utils/reactor-worker-flag.js\";\nimport {\n REACTOR_INSTANCE_NAMESPACE,\n RELATIONAL_PGLITE_NAME,\n} from \"../utils/storage-namespace.js\";\nimport { createProcessorHostModule } from \"./processor-host-module.js\";\n\n/**\n * Subscribe to ph-clint's `/__packages` SSE channel; each `packages-changed`\n * event sends the full live list, which we diff to add/remove packages.\n * Best-effort: no-ops when the endpoint is absent (e.g. vite dev).\n */\nfunction subscribeToPackagesChannel(packageManager: IPackageManager): void {\n if (typeof window === \"undefined\" || typeof EventSource === \"undefined\") {\n return;\n }\n let source: EventSource;\n try {\n source = new EventSource(\"/__packages\");\n } catch (err) {\n console.debug(\"[Connect] /__packages subscribe failed:\", err);\n return;\n }\n let firstEvent = true;\n source.addEventListener(\"packages-changed\", (event) => {\n try {\n const payload = JSON.parse((event as MessageEvent<string>).data) as {\n packages?: unknown;\n };\n if (!Array.isArray(payload.packages)) return;\n const next = payload.packages.filter(\n (p): p is string => typeof p === \"string\",\n );\n // Split a spec into (bareName, version). For scoped specs the leading\n // `@` is the scope, so the version `@` only counts when past index 0.\n const parseBare = (\n spec: string,\n ): { bareName: string; version?: string } => {\n const at = spec.startsWith(\"@\")\n ? spec.lastIndexOf(\"@\")\n : spec.indexOf(\"@\");\n if (at > 0) {\n return { bareName: spec.slice(0, at), version: spec.slice(at + 1) };\n }\n return { bareName: spec };\n };\n\n // Diff against registry packages only; bundled/local packages aren't in\n // the server list and removing them would break the drive editors.\n const currentByName = new Map(\n packageManager\n .getRegistryPackages()\n .map(({ name, version }) => [name, version]),\n );\n const nextByName = new Map<string, string | undefined>();\n for (const spec of next) {\n const { bareName, version } = parseBare(spec);\n nextByName.set(bareName, version);\n }\n\n const isFirst = firstEvent;\n firstEvent = false;\n\n for (const name of currentByName.keys()) {\n if (!nextByName.has(name)) {\n packageManager.removePackage(name);\n if (!isFirst) {\n toast(`Removed package ${name}`, { type: \"connect-deleted\" });\n }\n }\n }\n for (const spec of next) {\n const { bareName, version } = parseBare(spec);\n const currentVersion = currentByName.get(bareName);\n const isKnown = currentByName.has(bareName);\n if (\n isKnown &&\n (!version || !currentVersion || version === currentVersion)\n ) {\n continue;\n }\n const isUpdate = isKnown;\n Promise.resolve(packageManager.addPackage(spec)).then(\n (result) => {\n if (result.type === \"error\") {\n console.error(\n `[Connect] /__packages addPackage(${spec}) failed:`,\n result.error,\n );\n return;\n }\n if (isFirst) return;\n const name = result.package.manifest.name;\n toast(\n isUpdate\n ? `Updated package ${name}`\n : `Installed package ${name}`,\n { type: \"connect-success\" },\n );\n },\n (err: unknown) => {\n console.error(\n `[Connect] /__packages addPackage(${spec}) threw:`,\n err,\n );\n },\n );\n }\n } catch (err) {\n console.error(\"[Connect] /__packages event parse failed:\", err);\n }\n });\n source.addEventListener(\"error\", () => {\n // EventSource auto-reconnects.\n });\n}\n\nexport async function clearReactorStorage() {\n const module = window.ph?.reactorClientModule;\n if (module?.kind === \"worker\") {\n // The worker holds the PGlite handles open, so it must close + clear them.\n await module.adminClient.clearStorage();\n return;\n }\n if (module?.kind === \"browser\") {\n await module.reactorModule?.pg?.close();\n }\n\n // Dropping tables in PGlite with relaxedDurability can lose pending IDB\n // writes on reload; delete the whole DB so startup re-migrates from scratch.\n const dbs = await indexedDB.databases();\n const targets = dbs\n .map((d) => d.name)\n .filter(\n (n): n is string =>\n !!n && !n.startsWith(\"ph-pglite-backup::\") && /pglite|reactor/i.test(n),\n );\n\n await Promise.all(\n targets.map(\n (name) =>\n new Promise<void>((resolve) => {\n const req = indexedDB.deleteDatabase(name);\n req.onsuccess = req.onerror = req.onblocked = () => resolve();\n }),\n ),\n );\n}\n\nexport async function createReactor(localPackage?: DocumentModelLib) {\n if (!window.ph) {\n window.ph = {};\n }\n if (window.ph.loading) return;\n\n window.ph.loading = true;\n\n addPHEventHandlers();\n\n setPHToast(toast as PHToastFn);\n\n const features = await initFeatureFlags();\n\n logger.info(\n \"Features: @features\",\n JSON.stringify(Object.fromEntries(features), null, 2),\n );\n\n const keyPairStorage = await BrowserKeyStorage.create();\n const renownCrypto = await new RenownCryptoBuilder()\n .withKeyPairStorage(keyPairStorage)\n .build();\n\n // Renown namespace is a boot-time constant, so read it from runtime config\n // rather than the PHGlobalConfig machinery; baseUrl stays in phGlobalConfig.\n const renown = await new RenownBuilder(\"connect\", {\n basename:\n getRuntimeConfig().connect.renown?.namespace ??\n phGlobalConfig.routerBasename,\n baseUrl: phGlobalConfig.renownUrl,\n })\n .withCrypto(renownCrypto)\n .build();\n\n // Sync getter is safe: loadComponent() warmed the cache before createReactor,\n // and it throws loudly if a future caller violates that boot ordering.\n const runtimeConfig = getRuntimeConfig();\n\n const packageManager = new BrowserPackageManager(\n phGlobalConfig.routerBasename ?? \"\",\n runtimeConfig.packageRegistryUrl ?? null,\n );\n setVetraPackageManager(packageManager);\n await packageManager.init(localPackage, runtimeConfig.localPackage?.version);\n // Register provider:\"local\" packages the vite plugin bundled in. The virtual\n // module only exists under phBundledPackagesPlugin (ph-cli), so a resolution\n // failure under plain vite dev is expected; the indirection + @vite-ignore\n // also stops Vite's dep scanner from pre-bundling the specifier.\n try {\n const bundledPackagesModule = \"ph-bundled-packages-virtual\";\n const { default: registerBundledPackages } = (await import(\n /* @vite-ignore */ bundledPackagesModule\n )) as { default: (pm: IPackageManager) => void };\n registerBundledPackages(packageManager);\n } catch {\n // no bundled packages in this build\n }\n const remotePackages = runtimeConfig.packages\n .filter((p) => p.provider !== \"local\")\n .map((p) => (p.version ? `${p.packageName}@${p.version}` : p.packageName));\n const packagesResult = await packageManager.addPackages(remotePackages);\n packagesResult.map((r) => {\n if (r.type === \"error\") console.error(r.error);\n });\n\n // Opt-in (connect.packages.liveReload): pick up live publishes without a\n // page reload via the static-mode `/__packages` SSE channel.\n if (runtimeConfig.connect?.packages?.liveReload) {\n subscribeToPackagesChannel(packageManager);\n }\n\n const documentModelModules = packageManager.packages\n .flatMap((pkg) => pkg.documentModels)\n .filter(\n (module, index, modules) =>\n // dedupe by documentType and version\n modules.findIndex(\n (m) =>\n m.documentModel.global.id === module.documentModel.global.id &&\n m.version === module.version,\n ) === index,\n );\n\n const upgradeManifests = packageManager.packages\n .flatMap((pkg) => pkg.upgradeManifests)\n .filter(\n (manifest, index, manifests) =>\n // dedupe by documentType\n manifest !== undefined &&\n manifests.findIndex(\n (m) => m && m.documentType === manifest.documentType,\n ) === index,\n ) as UpgradeManifest<readonly number[]>[];\n\n // auto-installs packages for unknown document types\n const discoveryService =\n packageManager.cdnUrl !== null\n ? new PackageDiscoveryService(\n packageManager,\n new RegistryClient(packageManager.cdnUrl),\n {\n mode: \"immediate\",\n storageKey: phGlobalConfig.routerBasename ?? \"\",\n },\n )\n : new NoRegistryDiscoveryService(packageManager);\n\n setPackageDiscoveryService(discoveryService);\n\n // create reactor v2 with all versions and upgrade manifests\n let reactorClientModule:\n | BrowserReactorClientModule\n | WorkerReactorClientModule;\n if (isReactorWorkerEnabled()) {\n const packageSpecs = packageManager\n .getRegistryPackages()\n .map((p) => (p.version ? `${p.name}@${p.version}` : p.name));\n // Silent tab loader (no install prompt; the worker already loaded the model).\n const registryClient = new RegistryClient(packageManager.cdnUrl ?? \"\");\n const documentModelLoader: IDocumentModelLoader = {\n async load(documentType) {\n const names = packageManager.cdnUrl\n ? await registryClient.getPackagesByDocumentType(documentType)\n : [];\n for (const name of names) {\n const result = await packageManager.addPackage(name);\n if (result.type === \"error\") {\n throw new Error(\n `Failed to install package \"${name}\" for document model: ${documentType}`,\n { cause: result.error },\n );\n }\n }\n const module = packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n if (!module) {\n throw new Error(\n names.length > 0\n ? `Installed [${names.join(\", \")}] but document model not available: ${documentType}`\n : `No package found for document model: ${documentType} (cdnUrl: ${packageManager.cdnUrl ?? \"none\"})`,\n );\n }\n return module;\n },\n };\n const workerClient = createWorkerReactorClientModule({\n namespace: REACTOR_INSTANCE_NAMESPACE,\n relationalNamespace: RELATIONAL_PGLITE_NAME,\n cdnUrl: packageManager.cdnUrl ?? \"\",\n packageSpecs,\n documentModelModules,\n upgradeManifests,\n documentModelLoader,\n renown,\n onReload: (reason, workerGen) => {\n logger.warn(\"Reactor worker requested reload: @reason\", reason);\n if (workerGen) {\n bumpWorkerGen(REACTOR_INSTANCE_NAMESPACE, workerGen);\n }\n window.location.reload();\n },\n });\n reactorClientModule = workerClient.reactorClientModule;\n // Block boot until the sync manager seeds remotes from the worker, so\n // list()/connection state are warm before consumers first read them.\n try {\n await workerClient.syncManagerProxy.startup();\n } catch (error) {\n window.ph.loading = false;\n logger.error(\"Reactor worker failed to start: @error\", error);\n throw error;\n }\n } else {\n reactorClientModule = await createBrowserReactor(\n documentModelModules,\n upgradeManifests,\n renown,\n discoveryService,\n );\n }\n\n const drives = await getDrives(reactorClientModule.client);\n\n const didFromUrl = getDidFromUrl();\n await login(didFromUrl, renown);\n\n const documentCache = new DocumentCache(reactorClientModule.client);\n\n const basePath = phGlobalConfig.basePath ?? \"/\";\n const routerBasename = phGlobalConfig.routerBasename ?? \"/\";\n const mergedGlobalConfig = buildPHGlobalConfig(\n basePath,\n routerBasename,\n runtimeConfig.connect ?? {},\n );\n setDefaultPHGlobalConfig(mergedGlobalConfig);\n\n // Slug extraction needs window.ph.basePath, published by\n // setDefaultPHGlobalConfig above.\n const path = window.location.pathname;\n const driveSlug = extractDriveSlugFromPath(path);\n const nodeSlug = extractNodeSlugFromPath(path);\n setReactorClientModule(reactorClientModule);\n setReactorClient(reactorClientModule.client);\n\n const _defaultDrivesUrl = phGlobalConfig.defaultDrivesUrl;\n if (_defaultDrivesUrl) {\n let switchboardOrigin: string | undefined;\n try {\n switchboardOrigin = new URL(_defaultDrivesUrl).origin;\n } catch {\n // malformed URL — skip attachment service construction\n }\n if (switchboardOrigin) {\n const attachmentJwtHandler = async (_url: string) => {\n if (!renown.user) return undefined;\n // aud omitted: server rejects aud-bearing tokens. Re-enable once both sides support it.\n return renown.getBearerToken({ expiresIn: 10 });\n };\n const attachmentService = createRemoteAttachmentService({\n remoteUrl: switchboardOrigin,\n jwtHandler: attachmentJwtHandler,\n });\n setAttachmentService(attachmentService);\n }\n }\n\n setDocumentCache(documentCache);\n setRenown(renown);\n setDrives(drives);\n setFeatures(features);\n\n // Add default/remote drives in the background so the app renders immediately;\n // setSelectedDrive defers selection until the URL-matched drive syncs in.\n const defaultDrivesConfig = getDefaultDrives(runtimeConfig);\n if (defaultDrivesConfig.length > 0) {\n void addDefaultDrivesForNewReactor(defaultDrivesConfig).catch((error) =>\n console.error(\"Failed to add default drives:\", error),\n );\n }\n\n const remoteUrl = getDriveUrl();\n if (remoteUrl) {\n void addRemoteDrive(remoteUrl, undefined).catch((error) =>\n console.error(`Failed to add remote drive from ${remoteUrl}:`, error),\n );\n }\n\n setSelectedDrive(driveSlug);\n setSelectedNode(nodeSlug);\n\n // Refresh the drive list on any drive-type change so async-added\n // default/remote drives surface on first load without a manual reload.\n const reactorClient = reactorClientModule.client;\n for (const driveType of DRIVE_DOCUMENT_TYPES) {\n reactorClient.subscribe({ type: driveType }, (event) => {\n logger.verbose(\"ReactorClient subscription event: @event\", event);\n refreshReactorDataClient(reactorClientModule.client).catch((e) =>\n logger.error(\"@error\", e),\n );\n });\n }\n\n // Redirect when a currently-viewed document or drive is deleted remotely\n reactorClient.subscribe({}, (event) => {\n if (event.type !== DocumentChangeType.Deleted) return;\n const deletedId = event.context?.childId;\n if (!deletedId) return;\n\n const selectedDriveId = window.ph?.selectedDriveId;\n const selectedNodeId = window.ph?.selectedNodeId;\n\n if (selectedDriveId && deletedId === selectedDriveId) {\n setSelectedDrive(undefined);\n toast(\"The drive you were viewing has been deleted\");\n return;\n }\n\n if (selectedNodeId && deletedId === selectedNodeId) {\n setSelectedNode(undefined);\n toast(\"The document you were editing has been deleted\");\n }\n });\n\n await refreshReactorDataClient(reactorClientModule.client);\n\n const packagesWithProcessorFactories = packageManager.packages.filter(\n (pkg) => pkg.processorFactory !== undefined,\n );\n\n // processorManager lives in the worker on the cutover path and is not yet\n // bridged, so surface the gap loudly rather than dropping factories silently.\n const reactorModule =\n reactorClientModule.kind === \"browser\"\n ? reactorClientModule.reactorModule\n : undefined;\n if (packagesWithProcessorFactories.length > 0 && !reactorModule) {\n for (const pkg of packagesWithProcessorFactories) {\n logger.warn(\n \"Skipping processor factory @name: processors are not supported on the worker reactor path yet\",\n pkg.manifest.name,\n );\n }\n } else if (packagesWithProcessorFactories.length > 0 && reactorModule) {\n const readModels = reactorModule.readModelCoordinator.readModels;\n const processorHostModule = await createProcessorHostModule(\n reactorClientModule.client,\n readModels,\n window.ph?.attachmentService,\n );\n if (processorHostModule !== undefined) {\n await Promise.all(\n packagesWithProcessorFactories.map(async (pkg) => {\n const { manifest, processorFactory } = pkg;\n const name = manifest.name;\n const id = manifest.name;\n const version = packageManager.getPackageVersion(name);\n const label = version ? `${name}@${version}` : name;\n logger.info(\"Loading processor factory: @label\", label);\n try {\n const factory = await processorFactory?.(processorHostModule);\n if (!factory) return;\n await reactorModule.processorManager.registerFactory(id, factory);\n } catch (error) {\n logger.error(`Error registering processor: @label`, label);\n logger.error(\"@error\", error);\n }\n }),\n );\n }\n }\n\n window.ph.loading = false;\n}\n\nfunction getDidFromUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const didComponent = searchParams.get(\"user\");\n const did = didComponent ? decodeURIComponent(didComponent) : undefined;\n return did;\n}\n\nfunction getDriveUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const driveUrl = searchParams.get(\"driveUrl\");\n const url = driveUrl ? decodeURIComponent(driveUrl) : undefined;\n return url;\n}\n"],"names":["ReactorClientBuilder","ReactorBuilder","ChannelScheme","#packageManager","#findModuleInLoadedPackages","#clearFailed","#recordFailure","#failedMemo","#failedSubscribers","#eventSubscribers","#failed","#emitEvent","#notifyFailedChanged","#packageManager","#registryClient","#mode","#dismissedStorage","#findModuleInLoadedPackages","#clearFailed","#recordFailure","#deferred","#discover","#discoveredTypes","#pending","#addToPending","#findTypesByPackage","#emitEvent","#notifyPendingChanged","#pendingMemo","#pendingSubscribers","#failedMemo","#failedSubscribers","#eventSubscribers","#createDeferredEntry","#failed","#notifyFailedChanged","#storage","#cdnUrl","#toCdnUrl","#localPackageNames","#registerPackage","#localPackage","#localPackageVersion","#notifyPackagesChanged","#packagesMemo","#packages","#loadPackage","#unmountStylesheet","#subscribers","#loadPackageFromNodeModules","#importPackage","#loadPackageFromRegistry","#mountStylesheet","#stylesheets"],"mappings":"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","debug_id":"925acf3a-3dd4-5950-bdb3-d8cc62bad598"}
@@ -0,0 +1 @@
1
+ export { };