@powerhousedao/reactor-browser 6.0.0-dev.77 → 6.0.0-dev.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/src/index.js CHANGED
@@ -8698,6 +8698,74 @@ function useAllowedDocumentModelModules() {
8698
8698
  return documentModelModules;
8699
8699
  return documentModelModules?.filter((module) => allowedDocumentTypes.includes(module.documentModel.global.id));
8700
8700
  }
8701
+ // src/hooks/connection-state.ts
8702
+ import { useEffect, useRef, useState } from "react";
8703
+
8704
+ // src/hooks/reactor.ts
8705
+ var reactorClientModuleEventFunctions = makePHEventFunctions("reactorClientModule");
8706
+ var reactorClientEventFunctions = makePHEventFunctions("reactorClient");
8707
+ var useReactorClientModule = reactorClientModuleEventFunctions.useValue;
8708
+ var setReactorClientModule = reactorClientModuleEventFunctions.setValue;
8709
+ var addReactorClientModuleEventHandler = reactorClientModuleEventFunctions.addEventHandler;
8710
+ var useReactorClient = reactorClientEventFunctions.useValue;
8711
+ var setReactorClient = reactorClientEventFunctions.setValue;
8712
+ var addReactorClientEventHandler = reactorClientEventFunctions.addEventHandler;
8713
+ var useSync = () => useReactorClientModule()?.reactorModule?.syncModule?.syncManager;
8714
+ var useSyncList = () => {
8715
+ const sync = useSync();
8716
+ return sync?.list() ?? [];
8717
+ };
8718
+ var useModelRegistry = () => useReactorClientModule()?.reactorModule?.documentModelRegistry;
8719
+ var useDatabase = () => useReactorClientModule()?.reactorModule?.database;
8720
+ var usePGlite = () => useReactorClientModule()?.pg;
8721
+
8722
+ // src/hooks/connection-state.ts
8723
+ function useConnectionStates() {
8724
+ const syncManager = useSync();
8725
+ const [states, setStates] = useState(() => buildSnapshot(syncManager));
8726
+ const unsubscribesRef = useRef([]);
8727
+ useEffect(() => {
8728
+ if (!syncManager)
8729
+ return;
8730
+ function subscribe() {
8731
+ for (const unsub of unsubscribesRef.current) {
8732
+ unsub();
8733
+ }
8734
+ unsubscribesRef.current = [];
8735
+ const remotes = syncManager.list();
8736
+ for (const remote of remotes) {
8737
+ const unsub = remote.channel.onConnectionStateChange(() => {
8738
+ setStates(buildSnapshot(syncManager));
8739
+ });
8740
+ unsubscribesRef.current.push(unsub);
8741
+ }
8742
+ setStates(buildSnapshot(syncManager));
8743
+ }
8744
+ subscribe();
8745
+ const interval = setInterval(subscribe, 5000);
8746
+ return () => {
8747
+ clearInterval(interval);
8748
+ for (const unsub of unsubscribesRef.current) {
8749
+ unsub();
8750
+ }
8751
+ unsubscribesRef.current = [];
8752
+ };
8753
+ }, [syncManager]);
8754
+ return states;
8755
+ }
8756
+ function useConnectionState(remoteName) {
8757
+ const states = useConnectionStates();
8758
+ return states.get(remoteName);
8759
+ }
8760
+ function buildSnapshot(syncManager) {
8761
+ const map = new Map;
8762
+ if (!syncManager)
8763
+ return map;
8764
+ for (const remote of syncManager.list()) {
8765
+ map.set(remote.name, remote.channel.getConnectionState());
8766
+ }
8767
+ return map;
8768
+ }
8701
8769
  // src/utils/nodes.ts
8702
8770
  function sortNodesByName(nodes) {
8703
8771
  return nodes.toSorted((a, b) => a.name.localeCompare(b.name));
@@ -8723,7 +8791,7 @@ function useDispatch(document2) {
8723
8791
  }
8724
8792
 
8725
8793
  // src/hooks/document-cache.ts
8726
- import { use, useCallback, useSyncExternalStore as useSyncExternalStore3 } from "react";
8794
+ import { use, useCallback as useCallback2, useSyncExternalStore as useSyncExternalStore3 } from "react";
8727
8795
  var documentEventFunctions = makePHEventFunctions("documentCache");
8728
8796
  var useDocumentCache = documentEventFunctions.useValue;
8729
8797
  var setDocumentCache = documentEventFunctions.setValue;
@@ -8766,7 +8834,7 @@ function useDocuments(ids) {
8766
8834
  }
8767
8835
  function useGetDocument() {
8768
8836
  const documentCache = useDocumentCache();
8769
- return useCallback((id) => {
8837
+ return useCallback2((id) => {
8770
8838
  if (!documentCache) {
8771
8839
  return Promise.reject(new Error("Document cache not initialized"));
8772
8840
  }
@@ -8775,7 +8843,7 @@ function useGetDocument() {
8775
8843
  }
8776
8844
  function useGetDocuments() {
8777
8845
  const documentCache = useDocumentCache();
8778
- return useCallback((ids) => {
8846
+ return useCallback2((ids) => {
8779
8847
  if (!documentCache) {
8780
8848
  return Promise.reject(new Error("Document cache not initialized"));
8781
8849
  }
@@ -10152,7 +10220,7 @@ function setPHDocumentEditorConfigByKey(key, value) {
10152
10220
  setter(value);
10153
10221
  }
10154
10222
  // src/hooks/config/set-config-by-object.ts
10155
- import { useEffect, useState } from "react";
10223
+ import { useEffect as useEffect2, useState as useState2 } from "react";
10156
10224
 
10157
10225
  // src/hooks/config/utils.ts
10158
10226
  function callGlobalSetterForKey(key, value) {
@@ -10167,8 +10235,8 @@ function setDefaultPHGlobalConfig(config) {
10167
10235
  }
10168
10236
  }
10169
10237
  function useSetDefaultPHGlobalConfig(config) {
10170
- const [isInitialized, setIsInitialized] = useState(false);
10171
- useEffect(() => {
10238
+ const [isInitialized, setIsInitialized] = useState2(false);
10239
+ useEffect2(() => {
10172
10240
  if (isInitialized)
10173
10241
  return;
10174
10242
  setDefaultPHGlobalConfig(config);
@@ -10186,8 +10254,8 @@ function setPHGlobalConfig(config) {
10186
10254
  }
10187
10255
  }
10188
10256
  function useSetPHGlobalConfig(config) {
10189
- const [isInitialized, setIsInitialized] = useState(false);
10190
- useEffect(() => {
10257
+ const [isInitialized, setIsInitialized] = useState2(false);
10258
+ useEffect2(() => {
10191
10259
  if (isInitialized)
10192
10260
  return;
10193
10261
  setPHGlobalConfig(config);
@@ -10205,8 +10273,8 @@ function setPHDocumentEditorConfig(config) {
10205
10273
  }
10206
10274
  }
10207
10275
  function useSetPHDriveEditorConfig(config) {
10208
- const [isInitialized, setIsInitialized] = useState(false);
10209
- useEffect(() => {
10276
+ const [isInitialized, setIsInitialized] = useState2(false);
10277
+ useEffect2(() => {
10210
10278
  if (isInitialized)
10211
10279
  return;
10212
10280
  setPHDriveEditorConfig(config);
@@ -10214,8 +10282,8 @@ function useSetPHDriveEditorConfig(config) {
10214
10282
  }, [config, isInitialized]);
10215
10283
  }
10216
10284
  function useSetPHDocumentEditorConfig(config) {
10217
- const [isInitialized, setIsInitialized] = useState(false);
10218
- useEffect(() => {
10285
+ const [isInitialized, setIsInitialized] = useState2(false);
10286
+ useEffect2(() => {
10219
10287
  if (isInitialized)
10220
10288
  return;
10221
10289
  setPHDocumentEditorConfig(config);
@@ -10257,37 +10325,17 @@ function useDocumentOfType(documentId, documentType) {
10257
10325
  return [document2, dispatch];
10258
10326
  }
10259
10327
  // src/hooks/document-operations.ts
10260
- import { useCallback as useCallback2, useEffect as useEffect2, useRef, useState as useState2 } from "react";
10261
-
10262
- // src/hooks/reactor.ts
10263
- var reactorClientModuleEventFunctions = makePHEventFunctions("reactorClientModule");
10264
- var reactorClientEventFunctions = makePHEventFunctions("reactorClient");
10265
- var useReactorClientModule = reactorClientModuleEventFunctions.useValue;
10266
- var setReactorClientModule = reactorClientModuleEventFunctions.setValue;
10267
- var addReactorClientModuleEventHandler = reactorClientModuleEventFunctions.addEventHandler;
10268
- var useReactorClient = reactorClientEventFunctions.useValue;
10269
- var setReactorClient = reactorClientEventFunctions.setValue;
10270
- var addReactorClientEventHandler = reactorClientEventFunctions.addEventHandler;
10271
- var useSync = () => useReactorClientModule()?.reactorModule?.syncModule?.syncManager;
10272
- var useSyncList = () => {
10273
- const sync = useSync();
10274
- return sync?.list() ?? [];
10275
- };
10276
- var useModelRegistry = () => useReactorClientModule()?.reactorModule?.documentModelRegistry;
10277
- var useDatabase = () => useReactorClientModule()?.reactorModule?.database;
10278
- var usePGlite = () => useReactorClientModule()?.pg;
10279
-
10280
- // src/hooks/document-operations.ts
10328
+ import { useCallback as useCallback3, useEffect as useEffect3, useRef as useRef2, useState as useState3 } from "react";
10281
10329
  function useDocumentOperations(documentId) {
10282
10330
  const reactorClient = useReactorClient();
10283
- const hasFetchedRef = useRef(false);
10284
- const [state, setState] = useState2(() => ({
10331
+ const hasFetchedRef = useRef2(false);
10332
+ const [state, setState] = useState3(() => ({
10285
10333
  globalOperations: [],
10286
10334
  localOperations: [],
10287
10335
  isLoading: !!documentId,
10288
10336
  error: undefined
10289
10337
  }));
10290
- const fetchOperations = useCallback2(async (retryCount = 0) => {
10338
+ const fetchOperations = useCallback3(async (retryCount = 0) => {
10291
10339
  const MAX_RETRIES = 5;
10292
10340
  const RETRY_DELAY_MS = 500;
10293
10341
  if (!documentId || !reactorClient) {
@@ -10333,7 +10381,7 @@ function useDocumentOperations(documentId) {
10333
10381
  });
10334
10382
  hasFetchedRef.current = true;
10335
10383
  }, [documentId, reactorClient]);
10336
- useEffect2(() => {
10384
+ useEffect3(() => {
10337
10385
  if (documentId && reactorClient) {
10338
10386
  fetchOperations();
10339
10387
  } else if (!documentId) {
@@ -10346,7 +10394,7 @@ function useDocumentOperations(documentId) {
10346
10394
  hasFetchedRef.current = false;
10347
10395
  }
10348
10396
  }, [documentId, reactorClient, fetchOperations]);
10349
- const refetch = useCallback2(() => {
10397
+ const refetch = useCallback3(() => {
10350
10398
  fetchOperations(0);
10351
10399
  }, [fetchOperations]);
10352
10400
  return { ...state, refetch };
@@ -11040,7 +11088,7 @@ var {
11040
11088
  } = makePHEventFunctions("loading");
11041
11089
 
11042
11090
  // src/hooks/renown.ts
11043
- import { useEffect as useEffect3, useState as useState3 } from "react";
11091
+ import { useEffect as useEffect4, useState as useState4 } from "react";
11044
11092
  var renownEventFunctions = makePHEventFunctions("renown");
11045
11093
  var useRenown = renownEventFunctions.useValue;
11046
11094
  var setRenown = renownEventFunctions.setValue;
@@ -11050,8 +11098,8 @@ function useDid() {
11050
11098
  }
11051
11099
  function useUser() {
11052
11100
  const renown = useRenown();
11053
- const [user, setUser] = useState3(() => renown?.user);
11054
- useEffect3(() => {
11101
+ const [user, setUser] = useState4(() => renown?.user);
11102
+ useEffect4(() => {
11055
11103
  setUser(renown?.user);
11056
11104
  if (!renown)
11057
11105
  return;
@@ -11061,8 +11109,8 @@ function useUser() {
11061
11109
  }
11062
11110
  function useLoginStatus() {
11063
11111
  const renown = useRenown();
11064
- const [status, setStatus] = useState3(() => renown ? renown.status : "initializing");
11065
- useEffect3(() => {
11112
+ const [status, setStatus] = useState4(() => renown ? renown.status : "initializing");
11113
+ useEffect4(() => {
11066
11114
  setStatus(renown ? renown.status : "initializing");
11067
11115
  if (!renown)
11068
11116
  return;
@@ -11288,6 +11336,7 @@ async function loadExternalPackage(name, registryUrl) {
11288
11336
  class BrowserPackageManager {
11289
11337
  #storage;
11290
11338
  #packages = new Map;
11339
+ #localPackageIds = new Set;
11291
11340
  #subscribers = new Set;
11292
11341
  #packagesMemo = [];
11293
11342
  constructor(namespace) {
@@ -11308,6 +11357,9 @@ class BrowserPackageManager {
11308
11357
  get packages() {
11309
11358
  return this.#packagesMemo;
11310
11359
  }
11360
+ get localPackageIds() {
11361
+ return new Set(this.#localPackageIds);
11362
+ }
11311
11363
  async addPackage(name, registryUrl) {
11312
11364
  const module = await loadExternalPackage(name, registryUrl);
11313
11365
  this.#packages.set(name, module);
@@ -11324,6 +11376,7 @@ class BrowserPackageManager {
11324
11376
  }
11325
11377
  async addLocalPackage(name, localPackage) {
11326
11378
  this.#packages.set(name, localPackage);
11379
+ this.#localPackageIds.add(localPackage.id);
11327
11380
  this.#notifyPackagesChanged();
11328
11381
  }
11329
11382
  async removePackage(name) {
@@ -11375,7 +11428,7 @@ async function dropAllReactorStorage(pg) {
11375
11428
  await dropTablesInSchema(pg, "public");
11376
11429
  }
11377
11430
  // src/pglite/hooks/usePGlite.ts
11378
- import { useEffect as useEffect4, useState as useState4 } from "react";
11431
+ import { useEffect as useEffect5, useState as useState5 } from "react";
11379
11432
  var PGLITE_UPDATE_EVENT = "ph:pglite-update";
11380
11433
  var defaultPGliteState = {
11381
11434
  db: null,
@@ -11383,8 +11436,8 @@ var defaultPGliteState = {
11383
11436
  error: null
11384
11437
  };
11385
11438
  var usePGliteDB = () => {
11386
- const [state, setState] = useState4(() => window.powerhouse?.pglite ?? defaultPGliteState);
11387
- useEffect4(() => {
11439
+ const [state, setState] = useState5(() => window.powerhouse?.pglite ?? defaultPGliteState);
11440
+ useEffect5(() => {
11388
11441
  const handlePgliteUpdate = () => setState(window.powerhouse?.pglite ?? defaultPGliteState);
11389
11442
  window.addEventListener(PGLITE_UPDATE_EVENT, handlePgliteUpdate);
11390
11443
  return () => window.removeEventListener(PGLITE_UPDATE_EVENT, handlePgliteUpdate);
@@ -11426,6 +11479,41 @@ import {
11426
11479
  RelationalDbProcessor,
11427
11480
  SyncOperationStatus
11428
11481
  } from "@powerhousedao/reactor";
11482
+ // src/registry/client.ts
11483
+ function cdnUrlToApiUrl(cdnUrl) {
11484
+ return cdnUrl.replace(/\/-\/cdn\/?$/, "");
11485
+ }
11486
+ function mapPackageInfo(pkg) {
11487
+ return {
11488
+ name: pkg.name,
11489
+ description: pkg.manifest?.description,
11490
+ version: pkg.manifest?.version,
11491
+ category: pkg.manifest?.category,
11492
+ publisher: pkg.manifest?.publisher?.name,
11493
+ publisherUrl: pkg.manifest?.publisher?.url
11494
+ };
11495
+ }
11496
+
11497
+ class RegistryClient {
11498
+ apiUrl;
11499
+ constructor(cdnUrl) {
11500
+ this.apiUrl = cdnUrlToApiUrl(cdnUrl);
11501
+ }
11502
+ async getPackages() {
11503
+ const res = await fetch(`${this.apiUrl}/packages`);
11504
+ if (!res.ok)
11505
+ throw new Error(`Registry error: HTTP ${res.status}`);
11506
+ const data = await res.json();
11507
+ return data.map(mapPackageInfo);
11508
+ }
11509
+ async searchPackages(query) {
11510
+ const packages = await this.getPackages();
11511
+ if (!query)
11512
+ return packages;
11513
+ const lowerQuery = query.toLowerCase();
11514
+ return packages.filter((pkg) => pkg.name.toLowerCase().includes(lowerQuery) || pkg.description?.toLowerCase().includes(lowerQuery));
11515
+ }
11516
+ }
11429
11517
  // src/reactor-client-document-cache.ts
11430
11518
  import {
11431
11519
  DocumentChangeType as DocumentChangeType2
@@ -30270,7 +30358,7 @@ var useRelationalDb = () => {
30270
30358
  };
30271
30359
 
30272
30360
  // src/relational/hooks/useRelationalQuery.ts
30273
- import { useEffect as useEffect5, useRef as useRef2, useState as useState5 } from "react";
30361
+ import { useEffect as useEffect6, useRef as useRef3, useState as useState6 } from "react";
30274
30362
  var MAX_RETRIES = 5;
30275
30363
  var RETRY_DELAY = 200;
30276
30364
  var isRelationNotExistError = (error) => {
@@ -30278,11 +30366,11 @@ var isRelationNotExistError = (error) => {
30278
30366
  return errorMessage.toLowerCase().includes("relation") && errorMessage.toLowerCase().includes("does not exist");
30279
30367
  };
30280
30368
  function useRelationalQuery(ProcessorClass, driveId, queryCallback, parameters, options) {
30281
- const [result, setResult] = useState5(null);
30282
- const [queryLoading, setQueryLoading] = useState5(true);
30283
- const [error, setError] = useState5(undefined);
30284
- const retryCount = useRef2(0);
30285
- const retryTimeoutRef = useRef2(null);
30369
+ const [result, setResult] = useState6(null);
30370
+ const [queryLoading, setQueryLoading] = useState6(true);
30371
+ const [error, setError] = useState6(undefined);
30372
+ const retryCount = useRef3(0);
30373
+ const retryTimeoutRef = useRef3(null);
30286
30374
  const relationalDb = useRelationalDb();
30287
30375
  const executeLiveQuery = async (sql2, queryParameters, retryAttempt = 0) => {
30288
30376
  if (!relationalDb.db) {
@@ -30308,7 +30396,7 @@ function useRelationalQuery(ProcessorClass, driveId, queryCallback, parameters,
30308
30396
  return null;
30309
30397
  }
30310
30398
  };
30311
- useEffect5(() => {
30399
+ useEffect6(() => {
30312
30400
  setError(undefined);
30313
30401
  setQueryLoading(true);
30314
30402
  retryCount.current = 0;
@@ -30340,9 +30428,9 @@ function useRelationalQuery(ProcessorClass, driveId, queryCallback, parameters,
30340
30428
 
30341
30429
  // src/relational/utils/createProcessorQuery.ts
30342
30430
  var import_lodash = __toESM(require_lodash(), 1);
30343
- import { useCallback as useCallback3, useMemo as useMemo3, useRef as useRef3 } from "react";
30431
+ import { useCallback as useCallback4, useMemo as useMemo3, useRef as useRef4 } from "react";
30344
30432
  function useStableParams(params) {
30345
- const prevParamsRef = useRef3(null);
30433
+ const prevParamsRef = useRef4(null);
30346
30434
  return useMemo3(() => {
30347
30435
  if (!import_lodash.default(prevParamsRef.current, params)) {
30348
30436
  prevParamsRef.current = params;
@@ -30353,7 +30441,7 @@ function useStableParams(params) {
30353
30441
  function createProcessorQuery(ProcessorClass) {
30354
30442
  function useQuery(driveId, queryCallback, parameters, options) {
30355
30443
  const stableParams = useStableParams(parameters);
30356
- const memoizedCallback = useCallback3(queryCallback, [stableParams]);
30444
+ const memoizedCallback = useCallback4(queryCallback, [stableParams]);
30357
30445
  return useRelationalQuery(ProcessorClass, driveId, memoizedCallback, stableParams, options);
30358
30446
  }
30359
30447
  return useQuery;
@@ -30834,7 +30922,7 @@ class RemoteDocumentController {
30834
30922
  }
30835
30923
  }
30836
30924
  // src/renown/components/RenownLoginButton.tsx
30837
- import { useCallback as useCallback4, useEffect as useEffect6, useRef as useRef4, useState as useState6 } from "react";
30925
+ import { useCallback as useCallback5, useEffect as useEffect7, useRef as useRef5, useState as useState7 } from "react";
30838
30926
 
30839
30927
  // src/renown/components/icons.tsx
30840
30928
  import { jsxDEV } from "react/jsx-dev-runtime";
@@ -31150,20 +31238,20 @@ function RenownLoginButton({
31150
31238
  showPopover = false
31151
31239
  }) {
31152
31240
  const onLogin = onLoginProp ?? (() => openRenown());
31153
- const [isOpen, setIsOpen] = useState6(false);
31154
- const [isLoading, setIsLoading] = useState6(false);
31155
- const [isHovered, setIsHovered] = useState6(false);
31156
- const [showAbove, setShowAbove] = useState6(true);
31157
- const wrapperRef = useRef4(null);
31158
- const closeTimeoutRef = useRef4(null);
31159
- const calculatePosition = useCallback4(() => {
31241
+ const [isOpen, setIsOpen] = useState7(false);
31242
+ const [isLoading, setIsLoading] = useState7(false);
31243
+ const [isHovered, setIsHovered] = useState7(false);
31244
+ const [showAbove, setShowAbove] = useState7(true);
31245
+ const wrapperRef = useRef5(null);
31246
+ const closeTimeoutRef = useRef5(null);
31247
+ const calculatePosition = useCallback5(() => {
31160
31248
  if (!wrapperRef.current)
31161
31249
  return;
31162
31250
  const rect = wrapperRef.current.getBoundingClientRect();
31163
31251
  const spaceAbove = rect.top;
31164
31252
  setShowAbove(spaceAbove >= POPOVER_HEIGHT + POPOVER_GAP);
31165
31253
  }, []);
31166
- const handleMouseEnter = useCallback4(() => {
31254
+ const handleMouseEnter = useCallback5(() => {
31167
31255
  setIsHovered(true);
31168
31256
  if (!showPopover)
31169
31257
  return;
@@ -31174,13 +31262,13 @@ function RenownLoginButton({
31174
31262
  calculatePosition();
31175
31263
  setIsOpen(true);
31176
31264
  }, [calculatePosition, showPopover]);
31177
- const handleMouseLeave = useCallback4(() => {
31265
+ const handleMouseLeave = useCallback5(() => {
31178
31266
  closeTimeoutRef.current = setTimeout(() => {
31179
31267
  setIsOpen(false);
31180
31268
  setIsHovered(false);
31181
31269
  }, 150);
31182
31270
  }, []);
31183
- useEffect6(() => {
31271
+ useEffect7(() => {
31184
31272
  return () => {
31185
31273
  if (closeTimeoutRef.current) {
31186
31274
  clearTimeout(closeTimeoutRef.current);
@@ -31270,7 +31358,7 @@ function RenownLoginButton({
31270
31358
  }
31271
31359
 
31272
31360
  // src/renown/components/RenownUserButton.tsx
31273
- import { useCallback as useCallback5, useEffect as useEffect7, useRef as useRef5, useState as useState7 } from "react";
31361
+ import { useCallback as useCallback6, useEffect as useEffect8, useRef as useRef6, useState as useState8 } from "react";
31274
31362
  import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
31275
31363
  var POPOVER_GAP2 = 8;
31276
31364
  var POPOVER_HEIGHT2 = 150;
@@ -31398,19 +31486,19 @@ function RenownUserButton({
31398
31486
  const avatarUrl = avatarUrlProp ?? user?.ens?.avatarUrl;
31399
31487
  const userId = userIdProp ?? user?.profile?.documentId;
31400
31488
  const onDisconnect = onDisconnectProp ?? (() => void logout());
31401
- const [isOpen, setIsOpen] = useState7(false);
31402
- const [isCopied, setIsCopied] = useState7(false);
31403
- const [showAbove, setShowAbove] = useState7(true);
31404
- const wrapperRef = useRef5(null);
31405
- const closeTimeoutRef = useRef5(null);
31406
- const calculatePosition = useCallback5(() => {
31489
+ const [isOpen, setIsOpen] = useState8(false);
31490
+ const [isCopied, setIsCopied] = useState8(false);
31491
+ const [showAbove, setShowAbove] = useState8(true);
31492
+ const wrapperRef = useRef6(null);
31493
+ const closeTimeoutRef = useRef6(null);
31494
+ const calculatePosition = useCallback6(() => {
31407
31495
  if (!wrapperRef.current)
31408
31496
  return;
31409
31497
  const rect = wrapperRef.current.getBoundingClientRect();
31410
31498
  const spaceAbove = rect.top;
31411
31499
  setShowAbove(spaceAbove >= POPOVER_HEIGHT2 + POPOVER_GAP2);
31412
31500
  }, []);
31413
- const handleMouseEnter = useCallback5(() => {
31501
+ const handleMouseEnter = useCallback6(() => {
31414
31502
  if (closeTimeoutRef.current) {
31415
31503
  clearTimeout(closeTimeoutRef.current);
31416
31504
  closeTimeoutRef.current = null;
@@ -31418,19 +31506,19 @@ function RenownUserButton({
31418
31506
  calculatePosition();
31419
31507
  setIsOpen(true);
31420
31508
  }, [calculatePosition]);
31421
- const handleMouseLeave = useCallback5(() => {
31509
+ const handleMouseLeave = useCallback6(() => {
31422
31510
  closeTimeoutRef.current = setTimeout(() => {
31423
31511
  setIsOpen(false);
31424
31512
  }, 150);
31425
31513
  }, []);
31426
- useEffect7(() => {
31514
+ useEffect8(() => {
31427
31515
  return () => {
31428
31516
  if (closeTimeoutRef.current) {
31429
31517
  clearTimeout(closeTimeoutRef.current);
31430
31518
  }
31431
31519
  };
31432
31520
  }, []);
31433
- const copyToClipboard = useCallback5(async () => {
31521
+ const copyToClipboard = useCallback6(async () => {
31434
31522
  try {
31435
31523
  await navigator.clipboard.writeText(address);
31436
31524
  setIsCopied(true);
@@ -31621,15 +31709,15 @@ function RenownAuthButton({
31621
31709
  }, undefined, false, undefined, this);
31622
31710
  }
31623
31711
  // src/renown/provider.tsx
31624
- import { useEffect as useEffect8, useRef as useRef6 } from "react";
31712
+ import { useEffect as useEffect9, useRef as useRef7 } from "react";
31625
31713
  function RenownProvider({
31626
31714
  appName,
31627
31715
  basename,
31628
31716
  baseUrl,
31629
31717
  children
31630
31718
  }) {
31631
- const initRef = useRef6(false);
31632
- const initialPropsRef = useRef6({ appName, basename, baseUrl });
31719
+ const initRef = useRef7(false);
31720
+ const initialPropsRef = useRef7({ appName, basename, baseUrl });
31633
31721
  if (initRef.current) {
31634
31722
  const initial = initialPropsRef.current;
31635
31723
  if (appName !== initial.appName) {
@@ -31642,7 +31730,7 @@ function RenownProvider({
31642
31730
  console.warn("RenownProvider: 'baseUrl' changed after mount. This prop is only read once during initialization.");
31643
31731
  }
31644
31732
  }
31645
- useEffect8(() => {
31733
+ useEffect9(() => {
31646
31734
  if (initRef.current)
31647
31735
  return;
31648
31736
  initRef.current = true;
@@ -31736,6 +31824,8 @@ export {
31736
31824
  useDocumentById,
31737
31825
  useDocument,
31738
31826
  useDefaultDriveEditorModule,
31827
+ useConnectionStates,
31828
+ useConnectionState,
31739
31829
  useAllowedDocumentTypes,
31740
31830
  useAllowedDocumentModelModules,
31741
31831
  dropAllTables as truncateAllTables,
@@ -31842,6 +31932,7 @@ export {
31842
31932
  RemoteDocumentController,
31843
31933
  RemoteClient,
31844
31934
  RelationalDbProcessor,
31935
+ RegistryClient,
31845
31936
  ReactorClientDocumentCache,
31846
31937
  ReactorClientBuilder,
31847
31938
  ReactorBuilder,
@@ -4,6 +4,7 @@ export declare class BrowserPackageManager implements IPackageManager {
4
4
  constructor(namespace: string);
5
5
  init(): Promise<void>;
6
6
  get packages(): VetraPackage[];
7
+ get localPackageIds(): Set<string>;
7
8
  addPackage(name: string, registryUrl: string): Promise<void>;
8
9
  addLocalPackage(name: string, localPackage: VetraPackage): Promise<void>;
9
10
  removePackage(name: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EAEjB,YAAY,EACb,MAAM,kBAAkB,CAAC;AAmC1B,qBAAa,qBAAsB,YAAW,eAAe;;gBAM/C,SAAS,EAAE,MAAM;IAWvB,IAAI;IAWV,IAAI,QAAQ,mBAEX;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAe5C,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IAKxD,aAAa,CAAC,IAAI,EAAE,MAAM;IAShC,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,yBAAyB;CAcjE"}
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EAEjB,YAAY,EACb,MAAM,kBAAkB,CAAC;AAmC1B,qBAAa,qBAAsB,YAAW,eAAe;;gBAO/C,SAAS,EAAE,MAAM;IAWvB,IAAI;IAWV,IAAI,QAAQ,mBAEX;IAED,IAAI,eAAe,IAAI,GAAG,CAAC,MAAM,CAAC,CAEjC;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAe5C,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IAMxD,aAAa,CAAC,IAAI,EAAE,MAAM;IAShC,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,yBAAyB;CAcjE"}
@@ -1,3 +1,3 @@
1
1
  export { ChannelScheme, ConsoleLogger, DocumentChangeType, driveCollectionId, GqlRequestChannel, InMemoryQueue, IntervalPollTimer, REACTOR_SCHEMA, ReactorBuilder, ReactorClientBuilder, RelationalDbProcessor, SyncOperationStatus, } from "@powerhousedao/reactor";
2
- export type { Database, IChannel, IProcessor, IProcessorHostModule, IRelationalDb, Job, JwtHandler, OperationWithContext, ProcessorFactory, ProcessorFilter, ProcessorRecord, Remote, SignerConfig, SyncOperation, } from "@powerhousedao/reactor";
2
+ export type { ConnectionState, ConnectionStateSnapshot, Database, IChannel, IProcessor, IProcessorHostModule, IRelationalDb, Job, JwtHandler, OperationWithContext, ProcessorFactory, ProcessorFilter, ProcessorRecord, Remote, SignerConfig, SyncOperation, } from "@powerhousedao/reactor";
3
3
  //# sourceMappingURL=re-exports.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"re-exports.d.ts","sourceRoot":"","sources":["../../src/re-exports.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,GAAG,EACH,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,MAAM,EACN,YAAY,EACZ,aAAa,GACd,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"re-exports.d.ts","sourceRoot":"","sources":["../../src/re-exports.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,eAAe,EACf,uBAAuB,EACvB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,GAAG,EACH,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,MAAM,EACN,YAAY,EACZ,aAAa,GACd,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RegistryPackageInfo } from "./types.js";
2
+ export declare class RegistryClient {
3
+ readonly apiUrl: string;
4
+ constructor(cdnUrl: string);
5
+ getPackages(): Promise<RegistryPackageInfo[]>;
6
+ searchPackages(query: string): Promise<RegistryPackageInfo[]>;
7
+ }
8
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/registry/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA8BtD,qBAAa,cAAc;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM;IAIpB,WAAW,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAO7C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;CAUpE"}
@@ -0,0 +1,3 @@
1
+ export { RegistryClient } from "./client.js";
2
+ export type { RegistryPackageInfo } from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface RegistryPackageInfo {
2
+ name: string;
3
+ description?: string;
4
+ version?: string;
5
+ category?: string;
6
+ publisher?: string;
7
+ publisherUrl?: string;
8
+ }
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/registry/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -63,6 +63,7 @@ export type IPackagesListener = (data: {
63
63
  export type IPackageListerUnsubscribe = () => void;
64
64
  export interface IPackageManager {
65
65
  packages: VetraPackage[];
66
+ localPackageIds: Set<string>;
66
67
  addPackage(name: string, registryUrl: string): Promise<void>;
67
68
  addLocalPackage(name: string, localPackage: VetraPackage): Promise<void>;
68
69
  removePackage(name: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"vetra.d.ts","sourceRoot":"","sources":["../../../src/types/vetra.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vetra.d.ts","sourceRoot":"","sources":["../../../src/types/vetra.ts"],"names":[],"mappings":"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"}