@basictech/react 0.11.0-beta.2 → 0.11.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,6 +26,80 @@ npm install @basictech/react @basictech/schema
26
26
 
27
27
  React is a peer dependency and must already be installed by your application.
28
28
 
29
+ ## Beta auth update guide
30
+
31
+ After this auth update is published to the `beta` dist-tag, upgrade the packages you use together:
32
+
33
+ ```bash
34
+ npm install @basictech/react@beta @basictech/schema@beta
35
+ # If you import core directly, update that dependency too:
36
+ npm install @basictech/core@beta
37
+ ```
38
+
39
+ Keep the public packages on matching beta versions. No browser storage reset or persisted-profile
40
+ migration is required. Check your lockfile for the resolved version; this guide does not imply
41
+ that an older installed beta contains the update.
42
+
43
+ ### Update auth checks and editing controls
44
+
45
+ - Replace `useAuth().status === 'reauth_required'` with `status === 'expired'`.
46
+ Core client snapshots likewise use `authStatus: 'expired'`; only low-level `AuthSession`
47
+ retains the legacy compatibility state.
48
+ - Use `auth.canWrite` to disable mutation controls and `auth.readOnlyReason` for explanation.
49
+ It is account eligibility, not a guarantee of connectivity or permission to a particular source.
50
+ Catch imperative mutation errors too: auth can expire after the UI renders. Newly attempted
51
+ expired mutations reject with `BasicError.code === 'AUTH_EXPIRED'`.
52
+ - Keep cached data visible when expired. Do not treat `!auth.isSignedIn` as instructions to
53
+ sign out, remove the account, or clear local storage. Expiry retains identity, cached records,
54
+ and already queued edits, but blocks new writes and pauses sync sends.
55
+ - Offer `auth.signIn()` to reauthorize the same DID/issuer. For a different identity, add or switch
56
+ accounts first. Pending data must not be replayed into another account.
57
+
58
+ ```tsx
59
+ // Uses the schema-bound basic instance from the quick start below.
60
+ function AuthNotice() {
61
+ const auth = basic.useAuth()
62
+ if (auth.status !== 'expired') return null
63
+ return (
64
+ <aside role="status">
65
+ Session expired. Cached data is read-only; your pending edits are retained.
66
+ <button onClick={() => void auth.signIn()}>Sign in again</button>
67
+ </aside>
68
+ )
69
+ }
70
+ // In your editor: <button disabled={!auth.canWrite} ...>Save</button>
71
+ ```
72
+
73
+ ### Render per-account status
74
+
75
+ `useAccounts().accounts` now returns `BasicAccount[]`, including anonymous and expired accounts.
76
+ Each account adds `auth: { status, reason, checkedAt }` to the existing profile fields:
77
+
78
+ | Account status | Meaning |
79
+ | --- | --- |
80
+ | `anon` | Local anonymous workspace; editable without credentials |
81
+ | `checking` | Authorization has not been verified for this remembered account |
82
+ | `authenticated` | Current runtime authentication succeeded |
83
+ | `recovering` | Transient failure; ordinary offline queues remain writable |
84
+ | `expired` | Interactive reauthorization required; retain data read-only |
85
+ | `signed_out` | No usable active authorization |
86
+
87
+ `checkedAt` is the local evaluation time in milliseconds since epoch, or null—not a guarantee
88
+ from the server. Inactive accounts are not all refreshed: retained identity without credentials
89
+ is expired; otherwise an unverified remembered account is checking. The active anonymous account
90
+ has `auth.status: 'anon'`, while top-level `useAuth()` reports `status: 'signed_out'` and
91
+ `isAnonymous: true`. REST exposes one remembered account, not a multi-account registry.
92
+
93
+ Ordinary network loss is not expiry, and anonymous editing still works. `goOnline()` cannot
94
+ bypass expired read-only enforcement. Reauthorization resumes retained queued work; already
95
+ accepted server requests cannot be undone by client cancellation. REST has no offline cache.
96
+
97
+ Verified session revocation and automatic account/data cleanup are deferred to a later update.
98
+ Generic `invalid_grant` is not evidence that it is safe to erase local data. Browser storage
99
+ remains unchanged: localStorage holds profiles/refresh credentials, sessionStorage holds tab
100
+ selection/PKCE, access tokens live in memory, and Dexie wraps IndexedDB for replica data.
101
+ The default browser adapter writes no auth cookies. Read-only does not encrypt cached data.
102
+
29
103
  ## Quick start
30
104
 
31
105
  Define the schema and create `basic` once at module scope. The returned client, Provider, and hooks
@@ -276,7 +350,9 @@ unknown table names and infer fields in reads, writes, and queries.
276
350
  | `isReady` | `boolean` | Auth bootstrap has left `bootstrapping` |
277
351
  | `isSignedIn` | `boolean` | Status is `authenticated` or `recovering` |
278
352
  | `isAnonymous` | `boolean` | The active sync profile is anonymous and not signed in |
279
- | `status` | `'bootstrapping' \| 'signed_out' \| 'authenticated' \| 'recovering' \| 'reauth_required'` | Current auth lifecycle |
353
+ | `status` | `'bootstrapping' \| 'signed_out' \| 'authenticated' \| 'recovering' \| 'expired'` | Current public auth lifecycle |
354
+ | `canWrite` | `boolean` | Active-account write eligibility; source permissions still apply |
355
+ | `readOnlyReason` | `string \| null` | For example `AUTH_EXPIRED` when reauthorization is needed |
280
356
  | `error` | `BasicError \| null` | Stable auth bootstrap/refresh error code when available |
281
357
  | `user` | `AuthUser \| null` | OIDC user info (`sub`, `pds_url`, and optional `email`, `name`, `picture`, `handle`) |
282
358
  | `did` | `string \| null` | Signed-in account DID |
@@ -293,6 +369,9 @@ export function AuthPanel() {
293
369
  const auth = basic.useAuth()
294
370
 
295
371
  if (!auth.isReady) return <p>Starting Basic…</p>
372
+ if (auth.status === 'expired') {
373
+ return <p>Session expired. Cached data is read-only. <button onClick={() => void auth.signIn()}>Sign in again</button></p>
374
+ }
296
375
  if (auth.isSignedIn) {
297
376
  return (
298
377
  <p>
@@ -322,8 +401,8 @@ replicas and returns to another local profile or a fresh anonymous one when enab
322
401
 
323
402
  `useAccounts()` returns `{ accounts, active, switchAccount, addAccount, removeAccount }`:
324
403
 
325
- - `accounts: BasicProfile[]` lists local profiles.
326
- - `active: BasicProfile | null` is this tab's selected profile.
404
+ - `accounts: BasicAccount[]` lists local profiles with per-account auth summaries.
405
+ - `active: BasicAccount | null` is this tab's selected profile and auth summary.
327
406
  - `switchAccount(id): Promise<void>` changes the active profile in this tab.
328
407
  - `addAccount(): Promise<BasicProfile>` creates and activates a new anonymous profile from which to
329
408
  start another sign-in.
@@ -1047,6 +1126,8 @@ Common application-facing codes include:
1047
1126
  | Code | Typical cause |
1048
1127
  | --- | --- |
1049
1128
  | `AUTHORIZATION_REQUIRED` | A signed-in token/session is required |
1129
+ | `AUTH_EXPIRED` | Session needs reauthorization; cached data and pending edits are retained |
1130
+ | `ACCOUNT_CHANGED` | The account changed while an operation was in flight; do not blindly retry into the new account |
1050
1131
  | `UNKNOWN_SOURCE` | The repo is not in the catalog or the mount has not been listed/opened |
1051
1132
  | `RECORD_NOT_FOUND`, `RECORD_EXISTS`, `RECORD_NOT_DELETED` | Record lifecycle precondition failed |
1052
1133
  | `INVALID_PATCH`, `INVALID_RECORD_ID`, `INVALID_IDEMPOTENCY_KEY` | Invalid local mutation input |
package/dist/index.d.mts CHANGED
@@ -1,14 +1,14 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, ReactElement } from 'react';
3
- import { BasicSchema, BasicConfig, BasicClient, BasicProfile, AuthStatus, BasicError, AuthUser, BasicSyncStatus, BasicRejection, BasicConflict, SourceRef, SchemaStatus, BasicDb, Repo, FileRecord, MountFileInfo, StorageInfo, FileListQuery, MountInfo, MountHandle, OutgoingShareInfo, CreateOutgoingShareInput, MountsQuery, JsonObject, BasicRecord, Query, MountViewerFiles, OwnerFiles, TableNames, Collection, InferValue, KeyValueStorage, TokenStore, AuthMessageChannel, ReplicaStoreFactory, StoragePartition, ReplicaStore, UploadTransportAdapter } from '@basictech/core';
3
+ import { BasicSchema, BasicConfig, BasicClient, BasicAccount, BasicProfile, AuthStatus, BasicError, AuthUser, BasicSyncStatus, BasicRejection, BasicConflict, SourceRef, SchemaStatus, BasicDb, Repo, FileRecord, MountFileInfo, StorageInfo, FileListQuery, MountInfo, MountHandle, OutgoingShareInfo, CreateOutgoingShareInput, MountsQuery, JsonObject, BasicRecord, Query, MountViewerFiles, OwnerFiles, TableNames, Collection, InferValue, KeyValueStorage, TokenStore, AuthMessageChannel, ReplicaStoreFactory, StoragePartition, ReplicaStore, UploadTransportAdapter } from '@basictech/core';
4
4
 
5
5
  type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>;
6
6
  /** Create a core client with the complete browser adapter set installed. */
7
7
  declare function createBasicClient<S extends BasicSchema>(config: BrowserBasicConfig<S>): BasicClient<S>;
8
8
 
9
9
  interface UseAccountsResult {
10
- accounts: BasicProfile[];
11
- active: BasicProfile | null;
10
+ accounts: BasicAccount[];
11
+ active: BasicAccount | null;
12
12
  switchAccount(id: string): Promise<void>;
13
13
  addAccount(): Promise<BasicProfile>;
14
14
  removeAccount(id: string): Promise<void>;
@@ -19,6 +19,8 @@ interface UseAuthResult {
19
19
  isReady: boolean;
20
20
  isSignedIn: boolean;
21
21
  isAnonymous: boolean;
22
+ canWrite: boolean;
23
+ readOnlyReason: string | null;
22
24
  status: AuthStatus;
23
25
  error: BasicError | null;
24
26
  user: AuthUser | null;
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, ReactElement } from 'react';
3
- import { BasicSchema, BasicConfig, BasicClient, BasicProfile, AuthStatus, BasicError, AuthUser, BasicSyncStatus, BasicRejection, BasicConflict, SourceRef, SchemaStatus, BasicDb, Repo, FileRecord, MountFileInfo, StorageInfo, FileListQuery, MountInfo, MountHandle, OutgoingShareInfo, CreateOutgoingShareInput, MountsQuery, JsonObject, BasicRecord, Query, MountViewerFiles, OwnerFiles, TableNames, Collection, InferValue, KeyValueStorage, TokenStore, AuthMessageChannel, ReplicaStoreFactory, StoragePartition, ReplicaStore, UploadTransportAdapter } from '@basictech/core';
3
+ import { BasicSchema, BasicConfig, BasicClient, BasicAccount, BasicProfile, AuthStatus, BasicError, AuthUser, BasicSyncStatus, BasicRejection, BasicConflict, SourceRef, SchemaStatus, BasicDb, Repo, FileRecord, MountFileInfo, StorageInfo, FileListQuery, MountInfo, MountHandle, OutgoingShareInfo, CreateOutgoingShareInput, MountsQuery, JsonObject, BasicRecord, Query, MountViewerFiles, OwnerFiles, TableNames, Collection, InferValue, KeyValueStorage, TokenStore, AuthMessageChannel, ReplicaStoreFactory, StoragePartition, ReplicaStore, UploadTransportAdapter } from '@basictech/core';
4
4
 
5
5
  type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>;
6
6
  /** Create a core client with the complete browser adapter set installed. */
7
7
  declare function createBasicClient<S extends BasicSchema>(config: BrowserBasicConfig<S>): BasicClient<S>;
8
8
 
9
9
  interface UseAccountsResult {
10
- accounts: BasicProfile[];
11
- active: BasicProfile | null;
10
+ accounts: BasicAccount[];
11
+ active: BasicAccount | null;
12
12
  switchAccount(id: string): Promise<void>;
13
13
  addAccount(): Promise<BasicProfile>;
14
14
  removeAccount(id: string): Promise<void>;
@@ -19,6 +19,8 @@ interface UseAuthResult {
19
19
  isReady: boolean;
20
20
  isSignedIn: boolean;
21
21
  isAnonymous: boolean;
22
+ canWrite: boolean;
23
+ readOnlyReason: string | null;
22
24
  status: AuthStatus;
23
25
  error: BasicError | null;
24
26
  user: AuthUser | null;
package/dist/index.js CHANGED
@@ -778,12 +778,12 @@ function useAccountsFor(client) {
778
778
  const addAccount = (0, import_react4.useCallback)(() => client.addAccount(), [client]);
779
779
  const removeAccount = (0, import_react4.useCallback)((id) => client.removeAccount(id), [client]);
780
780
  return (0, import_react4.useMemo)(() => ({
781
- accounts: snapshot.profiles,
781
+ accounts: snapshot.accounts,
782
782
  active: snapshot.activeProfile,
783
783
  switchAccount,
784
784
  addAccount,
785
785
  removeAccount
786
- }), [snapshot.profiles, snapshot.activeProfile, switchAccount, addAccount, removeAccount]);
786
+ }), [snapshot.accounts, snapshot.activeProfile, switchAccount, addAccount, removeAccount]);
787
787
  }
788
788
  function useAccounts() {
789
789
  return useAccountsFor(useRequiredClient());
@@ -801,6 +801,8 @@ function useAuthFor(client) {
801
801
  isReady: snapshot.isReady,
802
802
  isSignedIn: snapshot.isSignedIn,
803
803
  isAnonymous: snapshot.isAnonymous,
804
+ canWrite: snapshot.canWrite,
805
+ readOnlyReason: snapshot.readOnlyReason,
804
806
  status: snapshot.authStatus,
805
807
  error: snapshot.authErrorCode ? new import_core6.BasicError(snapshot.authErrorCode) : null,
806
808
  user: snapshot.user,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/create-client.ts","../src/adapters/broadcast-channel.ts","../src/adapters/navigation.ts","../src/adapters/persistence.ts","../src/adapters/storage.ts","../src/adapters/token-store.ts","../src/adapters/upload.ts","../src/provider.tsx","../src/context.ts","../src/hooks/accounts.ts","../src/hooks/client.ts","../src/hooks/auth.ts","../src/hooks/db.ts","../src/hooks/repos.ts","../src/hooks/status.ts","../src/hooks/basic.ts","../src/hooks/files.ts","../src/hooks/mounts.ts","../src/hooks/query.ts","../src/create-basic.tsx"],"sourcesContent":["export { createBasic } from './create-basic'\nexport type { BoundBasicProviderProps, CreatedBasic, CreateBasicConfig } from './create-basic'\nexport { createBasicClient } from './create-client'\nexport type { BrowserBasicConfig } from './create-client'\nexport { BasicProvider } from './provider'\nexport type { BasicProviderProps } from './provider'\nexport * from './hooks'\n\nexport { BrowserKeyValueStorage, browserStorage } from './adapters/storage'\nexport { BrowserTokenStore } from './adapters/token-store'\nexport {\n createBrowserAuthChannelFactory,\n createBrowserMessageChannel,\n} from './adapters/broadcast-channel'\nexport type { BrowserMessageChannel } from './adapters/broadcast-channel'\nexport { browserCurrentUrl, browserNavigate, browserReplaceUrl } from './adapters/navigation'\nexport { PersistenceStore } from './adapters/persistence'\nexport type { BrowserLockManager, PersistenceStoreOptions } from './adapters/persistence'\nexport { browserUploadTransport } from './adapters/upload'\n","import {\n MemoryKeyValueStorage,\n MemoryReplicaStoreFactory,\n createBasicClient as createCoreClient,\n type BasicClient,\n type BasicConfig,\n type BasicSchema,\n} from '@basictech/core'\nimport { createBrowserAuthChannelFactory } from './adapters/broadcast-channel'\nimport { browserCurrentUrl, browserNavigate, browserReplaceUrl } from './adapters/navigation'\nimport { PersistenceStore } from './adapters/persistence'\nimport { browserStorage } from './adapters/storage'\nimport { BrowserTokenStore } from './adapters/token-store'\nimport { browserUploadTransport } from './adapters/upload'\n\nexport type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>\n\nfunction browserReconcileTrigger(listener: () => void): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n const onVisible = () => {\n if (document.visibilityState === 'visible') listener()\n }\n window.addEventListener('focus', listener)\n window.addEventListener('online', listener)\n document.addEventListener('visibilitychange', onVisible)\n return () => {\n window.removeEventListener('focus', listener)\n window.removeEventListener('online', listener)\n document.removeEventListener('visibilitychange', onVisible)\n }\n}\n\n/** Create a core client with the complete browser adapter set installed. */\nexport function createBasicClient<S extends BasicSchema>(\n config: BrowserBasicConfig<S>,\n): BasicClient<S> {\n const local = browserStorage('localStorage') ?? new MemoryKeyValueStorage()\n const session = browserStorage('sessionStorage') ?? new MemoryKeyValueStorage()\n const defaultTokenStore = config.tokenStore ? null : new BrowserTokenStore(local)\n const canBroadcast = typeof BroadcastChannel !== 'undefined'\n const canPersistReplica = typeof indexedDB !== 'undefined'\n\n return createCoreClient({\n ...config,\n kv: config.kv ?? local,\n tokenStore: config.tokenStore ?? defaultTokenStore!,\n sessionStorage: config.sessionStorage ?? session,\n replicaStore: config.replicaStore ?? (\n canPersistReplica ? new PersistenceStore(config.clientId) : new MemoryReplicaStoreFactory()\n ),\n navigate: config.navigate ?? browserNavigate,\n currentUrl: config.currentUrl ?? browserCurrentUrl,\n replaceUrl: config.replaceUrl ?? browserReplaceUrl,\n reconcileTrigger: config.reconcileTrigger ?? browserReconcileTrigger,\n createMessageChannel: config.createMessageChannel ?? (\n canBroadcast && defaultTokenStore\n ? createBrowserAuthChannelFactory(config.clientId, defaultTokenStore)\n : undefined\n ),\n uploadTransport: config.uploadTransport ?? (\n typeof XMLHttpRequest === 'undefined' ? undefined : browserUploadTransport\n ),\n })\n}\n","import type { AuthMessageChannel } from '@basictech/core'\nimport type { BrowserTokenStore } from './token-store'\n\nexport interface BrowserMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AccessTokenMessage {\n type?: string\n expiresAt?: number\n __basicAccessToken?: string\n __basicRefreshToken?: string\n}\n\n/** Core message-channel adapter backed by the browser BroadcastChannel API. */\nexport function createBrowserMessageChannel(name: string): BrowserMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: BrowserMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Access tokens may cross tabs transiently but are never written to browser\n * storage. The receiving adapter adopts the token before core handles the\n * ordinary token-rotation notification.\n */\nexport function createBrowserAuthChannelFactory(\n clientId: string,\n tokenStore: BrowserTokenStore,\n): (name: string) => AuthMessageChannel {\n const prefix = `basic_auth:${clientId}:`\n return (name) => {\n const channel = createBrowserMessageChannel(name)\n const profileId = name.startsWith(prefix) ? name.slice(prefix.length) : ''\n const tokenKey = `u:${profileId}:basic_tokens`\n const adapter: AuthMessageChannel = {\n postMessage: (message) => {\n const outgoing = message as AccessTokenMessage\n const access = outgoing?.type === 'tokens' ? tokenStore.accessToken(tokenKey) : null\n channel.postMessage(access ? {\n ...outgoing,\n expiresAt: access.expiresAt,\n __basicAccessToken: access.value,\n __basicRefreshToken: access.refreshToken,\n } satisfies AccessTokenMessage : message)\n },\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => {\n void (async () => {\n const incoming = event.data as AccessTokenMessage\n if (incoming?.type === 'tokens' && incoming.__basicAccessToken && incoming.__basicRefreshToken) {\n await tokenStore.adoptAccessToken(\n tokenKey,\n incoming.__basicAccessToken,\n incoming.expiresAt ?? 0,\n incoming.__basicRefreshToken,\n )\n }\n adapter.onmessage?.({ data: event.data })\n })()\n }\n return adapter\n }\n}\n","import { BasicError } from '@basictech/core'\n\nexport function browserNavigate(url: string): void {\n if (typeof location === 'undefined') throw new BasicError('NAVIGATE_ADAPTER_REQUIRED')\n location.assign(url)\n}\n\nexport function browserCurrentUrl(): string {\n return typeof location === 'undefined' ? '' : location.href\n}\n\nexport function browserReplaceUrl(url: string): void {\n if (typeof history !== 'undefined') history.replaceState({}, '', url)\n}\n","import Dexie, { type Table } from 'dexie'\nimport {\n BasicError,\n partitionKey,\n type PersistedReplicaState,\n type PersistenceLeaderHooks,\n type ReplicaStore,\n type ReplicaStoreFactory,\n type StoragePartition,\n type SyncOp,\n} from '@basictech/core'\n\nexport type { PersistedReplicaState, StoragePartition } from '@basictech/core'\n\ninterface PartitionRow {\n key: string\n profileId: string\n state: PersistedReplicaState\n updatedAt: number\n}\n\nexport interface ReplicaMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AvailableLock {\n name: string\n}\n\nexport interface BrowserLockManager {\n request<T>(\n name: string,\n options: { mode?: 'exclusive'; ifAvailable?: true },\n callback: (lock: AvailableLock | null) => T | Promise<T>,\n ): Promise<T>\n}\n\nexport interface PersistenceStoreOptions {\n locks?: BrowserLockManager | null\n createChannel?: ((name: string) => ReplicaMessageChannel) | null\n}\n\ntype CoordinatorMessage =\n | { type: 'mutation'; requestId: string; operation: SyncOp }\n | { type: 'mutation-result'; requestId: string; opId?: string; code?: string; message?: string }\n | { type: 'state'; state: PersistedReplicaState }\n\nfunction browserLocks(): BrowserLockManager | null {\n if (typeof navigator === 'undefined' || !navigator.locks) return null\n return navigator.locks as unknown as BrowserLockManager\n}\n\nfunction browserChannel(name: string): ReplicaMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: ReplicaMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Per-partition single-writer coordinator. With Web Locks, followers forward\n * mutations and consume committed-state broadcasts. Browsers lacking Locks\n * use the documented degraded last-committed-writer-wins mode: every tab may\n * write, the version guard rejects stale commits, and broadcasts refresh\n * surviving views. Concurrent offline intent can be lost in that fallback.\n */\nclass PartitionCoordinator implements PersistenceLeaderHooks {\n private readonly mutationListeners = new Set<(operation: SyncOp) => Promise<string>>()\n private readonly stateListeners = new Set<(state: PersistedReplicaState) => void>()\n private readonly leadershipListeners = new Set<(isLeader: boolean) => void | Promise<void>>()\n private readonly pending = new Map<string, {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n }>()\n private readonly election: Promise<boolean>\n private leadershipReady: Promise<void> = Promise.resolve()\n private releaseLock: (() => void) | null = null\n private leader = true\n private closed = false\n\n constructor(\n name: string,\n locks: BrowserLockManager | null,\n private readonly channel: ReplicaMessageChannel | null,\n ) {\n this.channel && (this.channel.onmessage = (event) => this.receive(event.data))\n if (!locks || !channel) {\n this.election = Promise.resolve(true)\n return\n }\n this.leader = false\n this.election = new Promise<boolean>((resolve) => {\n void locks.request(`basic-replica:${name}`, { ifAvailable: true }, async (lock) => {\n this.setLeader(Boolean(lock))\n resolve(this.leader)\n if (!lock) {\n this.waitForLeadership(locks, name)\n return\n }\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n }).catch(() => {\n this.setLeader(true)\n resolve(true)\n })\n })\n }\n\n async isLeader(): Promise<boolean> {\n await this.election\n await this.leadershipReady\n return this.leader\n }\n\n subscribeLeadership(listener: (isLeader: boolean) => void | Promise<void>): () => void {\n this.leadershipListeners.add(listener)\n return () => this.leadershipListeners.delete(listener)\n }\n\n async forwardMutation(operation: SyncOp): Promise<string> {\n if (await this.isLeader()) return this.dispatchMutation(operation)\n if (this.closed) throw new BasicError('PARTITION_COORDINATOR_CLOSED')\n if (!this.channel) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n const requestId = crypto.randomUUID()\n return new Promise<string>((resolve, reject) => {\n const flight = { operation, resolve, reject, deadline: Date.now() + 10_000 }\n this.pending.set(requestId, flight)\n this.sendPending(requestId, flight)\n })\n }\n\n subscribeMutations(listener: (operation: SyncOp) => Promise<string>): () => void {\n this.mutationListeners.add(listener)\n return () => this.mutationListeners.delete(listener)\n }\n\n publishState(state: PersistedReplicaState): void {\n this.channel?.postMessage({ type: 'state', state } satisfies CoordinatorMessage)\n }\n\n subscribeState(listener: (state: PersistedReplicaState) => void): () => void {\n this.stateListeners.add(listener)\n return () => this.stateListeners.delete(listener)\n }\n\n close(): void {\n this.closed = true\n this.setLeader(false)\n this.releaseLock?.()\n this.releaseLock = null\n this.channel?.close()\n for (const flight of this.pending.values()) {\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(new BasicError('PARTITION_COORDINATOR_CLOSED'))\n }\n this.pending.clear()\n }\n\n private waitForLeadership(locks: BrowserLockManager, name: string): void {\n void locks.request(`basic-replica:${name}`, { mode: 'exclusive' }, async (lock) => {\n if (!lock || this.closed) return\n this.setLeader(true)\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n this.setLeader(false)\n }).catch(() => {\n if (!this.closed) this.setLeader(true)\n })\n }\n\n private setLeader(isLeader: boolean): void {\n if (this.leader === isLeader) return\n this.leader = isLeader\n this.leadershipReady = Promise.all(\n [...this.leadershipListeners].map((listener) => listener(isLeader)),\n ).then(() => {})\n if (isLeader) void this.leadershipReady.then(() => this.drainPending()).catch(() => {})\n }\n\n private receive(value: unknown): void {\n if (this.closed || !value || typeof value !== 'object') return\n const message = value as CoordinatorMessage\n if (message.type === 'state') {\n for (const listener of this.stateListeners) listener(structuredClone(message.state))\n } else if (message.type === 'mutation' && this.leader) {\n void this.leadershipReady.then(() => this.dispatchMutation(message.operation)).then(\n (opId) => this.channel?.postMessage({\n type: 'mutation-result', requestId: message.requestId, opId,\n } satisfies CoordinatorMessage),\n (error: unknown) => this.channel?.postMessage({\n type: 'mutation-result',\n requestId: message.requestId,\n code: error instanceof BasicError ? error.code : 'FORWARDED_MUTATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n } satisfies CoordinatorMessage),\n )\n } else if (message.type === 'mutation-result') {\n const flight = this.pending.get(message.requestId)\n if (!flight) return\n if (!message.opId && (message.code === 'STALE_STATE_VERSION' ||\n message.code === 'PARTITION_LEADER_UNAVAILABLE')) {\n this.sendPending(message.requestId, flight)\n return\n }\n this.pending.delete(message.requestId)\n if (flight.timer) clearTimeout(flight.timer)\n if (message.opId) flight.resolve(message.opId)\n else flight.reject(new BasicError(message.code ?? 'FORWARDED_MUTATION_FAILED', message.message))\n }\n }\n\n private async dispatchMutation(operation: SyncOp): Promise<string> {\n const listener = this.mutationListeners.values().next().value\n if (!listener) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n return listener(operation)\n }\n\n private drainPending(): void {\n for (const [requestId, flight] of this.pending) {\n void this.dispatchMutation(flight.operation).then(\n (opId) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.resolve(opId)\n },\n (error: unknown) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(error instanceof Error ? error : new BasicError('FORWARDED_MUTATION_FAILED'))\n },\n )\n }\n }\n\n private sendPending(\n requestId: string,\n flight: {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n },\n ): void {\n if (this.pending.get(requestId) !== flight) return\n if (flight.timer) clearTimeout(flight.timer)\n const remaining = flight.deadline - Date.now()\n if (remaining <= 0) {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_TIMEOUT'))\n return\n }\n try {\n this.channel?.postMessage({\n type: 'mutation', requestId, operation: flight.operation,\n } satisfies CoordinatorMessage)\n } catch {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_UNAVAILABLE'))\n return\n }\n flight.timer = setTimeout(() => this.sendPending(requestId, flight), Math.min(100, remaining))\n }\n}\n\nclass DexieReplicaStore implements ReplicaStore {\n constructor(\n private readonly table: Table<PartitionRow, string>,\n readonly partition: StoragePartition,\n readonly key: string,\n readonly leader: PartitionCoordinator,\n ) {}\n\n async load(): Promise<PersistedReplicaState | null> {\n return (await this.table.get(this.key))?.state ?? null\n }\n\n async save(state: PersistedReplicaState): Promise<void> {\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new BasicError('INVALID_STATE_VERSION')\n }\n await this.table.db.transaction('rw', this.table, async () => {\n const current = await this.table.get(this.key)\n if ((current?.state.version ?? 0) >= state.version) throw new BasicError('STALE_STATE_VERSION')\n await this.table.put({\n key: this.key,\n profileId: this.partition.profileId,\n state: structuredClone(state),\n updatedAt: Date.now(),\n })\n })\n this.leader.publishState(structuredClone(state))\n }\n\n async delete(): Promise<void> {\n await this.table.delete(this.key)\n }\n}\n\n/** Dexie adapter for core's six-field, version-guarded replica store. */\nexport class PersistenceStore implements ReplicaStoreFactory {\n private readonly db: Dexie\n private readonly stores = new Map<string, DexieReplicaStore>()\n private readonly locks: BrowserLockManager | null\n private readonly createChannel: ((name: string) => ReplicaMessageChannel) | null\n private opened = false\n\n constructor(appKey: string, options: PersistenceStoreOptions = {}) {\n this.db = new Dexie(`basic:${appKey}`)\n this.db.version(1).stores({ partitions: 'key' })\n this.db.version(2).stores({ partitions: 'key,profileId' }).upgrade((transaction) =>\n transaction.table('partitions').clear())\n this.locks = options.locks === undefined ? browserLocks() : options.locks\n this.createChannel = options.createChannel === undefined\n ? (typeof BroadcastChannel === 'undefined' ? null : browserChannel)\n : options.createChannel\n }\n\n private get partitions(): Table<PartitionRow, string> {\n return this.db.table<PartitionRow, string>('partitions')\n }\n\n async open(): Promise<void> {\n if (this.opened) return\n await cleanupLegacyState()\n await this.db.open()\n this.opened = true\n }\n\n forPartition(partition: StoragePartition): ReplicaStore {\n const key = partitionKey(partition)\n let store = this.stores.get(key)\n if (!store) {\n const channelName = `basic-replica:${this.db.name}:${key}`\n const channel = this.createChannel?.(channelName) ?? null\n const leader = new PartitionCoordinator(channelName, this.locks, channel)\n store = new DexieReplicaStore(this.partitions, { ...partition }, key, leader)\n this.stores.set(key, store)\n }\n return store\n }\n\n async deleteProfile(profileId: string): Promise<void> {\n await this.partitions.where('profileId').equals(profileId).delete()\n for (const [key, store] of this.stores) {\n if (store.partition.profileId !== profileId) continue\n store.leader.close()\n this.stores.delete(key)\n }\n }\n\n close(): void {\n for (const store of this.stores.values()) store.leader.close()\n this.stores.clear()\n if (this.opened) this.db.close()\n this.opened = false\n }\n}\n\n/** Best-effort cleanup of pre-repo-era IndexedDB databases. */\nexport async function cleanupLegacyState(): Promise<void> {\n try {\n const idb = (globalThis as { indexedDB?: IDBFactory }).indexedDB\n if (!idb || typeof idb.databases !== 'function') return\n for (const info of await idb.databases()) {\n if (!info.name?.startsWith('basic-sync:')) continue\n await new Promise<void>((resolve) => {\n const request = idb.deleteDatabase(info.name!)\n request.onsuccess = request.onerror = request.onblocked = () => resolve()\n })\n }\n } catch {\n // Legacy cleanup is deliberately best effort.\n }\n}\n","import type { KeyValueStorage } from '@basictech/core'\n\n/** Synchronous browser Storage adapted to core's key-value contract. */\nexport class BrowserKeyValueStorage implements KeyValueStorage {\n constructor(private readonly storage: Storage) {}\n\n get(key: string): string | null {\n return this.storage.getItem(key)\n }\n\n set(key: string, value: string): void {\n this.storage.setItem(key, value)\n }\n\n remove(key: string): void {\n this.storage.removeItem(key)\n }\n}\n\nexport function browserStorage(\n name: 'localStorage' | 'sessionStorage',\n): BrowserKeyValueStorage | null {\n try {\n const storage = globalThis[name]\n return storage ? new BrowserKeyValueStorage(storage) : null\n } catch {\n return null\n }\n}\n","import type { KeyValueStorage, TokenSet, TokenStore } from '@basictech/core'\n\nconst ACCESS_TOKEN_ADOPTION_TIMEOUT_MS = 100\n\ninterface MemoryAccessToken {\n value: string\n expiresAt: number\n refreshToken: string\n}\n\ninterface AccessWaiter {\n refreshToken: string\n resolve(access: MemoryAccessToken | null): void\n}\n\ntype PersistedTokenSet = Omit<TokenSet, 'access_token' | 'expires_at'>\n\nfunction parseTokens(value: string | null): Partial<TokenSet> | null {\n if (!value) return null\n try {\n const parsed = JSON.parse(value) as Partial<TokenSet>\n return parsed && typeof parsed === 'object' ? parsed : null\n } catch {\n return null\n }\n}\n\n/**\n * Browser token policy: refresh tokens survive reloads in the supplied\n * persistent store; access tokens exist only in this JavaScript realm.\n */\nexport class BrowserTokenStore implements TokenStore {\n private readonly accessTokens = new Map<string, MemoryAccessToken>()\n private readonly accessWaiters = new Map<string, AccessWaiter[]>()\n\n constructor(private readonly persistent: KeyValueStorage) {}\n\n async get(key: string): Promise<string | null> {\n const persisted = parseTokens(await this.persistent.get(key))\n if (!persisted?.refresh_token || typeof persisted.token_type !== 'string') return null\n const refreshToken = persisted.refresh_token\n let access = this.accessTokens.get(key)\n if (access && access.refreshToken !== refreshToken) {\n access = await this.waitForAccessToken(key, refreshToken) ?? undefined\n }\n return JSON.stringify({\n ...persisted,\n access_token: access?.refreshToken === refreshToken ? access.value : '',\n expires_at: access?.refreshToken === refreshToken ? access.expiresAt : 0,\n token_type: persisted.token_type,\n refresh_token: refreshToken,\n } satisfies TokenSet)\n }\n\n async set(key: string, value: string): Promise<void> {\n const tokens = parseTokens(value)\n if (!tokens?.refresh_token || typeof tokens.access_token !== 'string' ||\n typeof tokens.token_type !== 'string') {\n throw new TypeError('invalid token set')\n }\n this.accessTokens.set(key, {\n value: tokens.access_token,\n expiresAt: tokens.expires_at ?? 0,\n refreshToken: tokens.refresh_token,\n })\n const { access_token: _accessToken, expires_at: _expiresAt, ...persisted } = tokens\n await this.persistent.set(key, JSON.stringify(persisted satisfies Partial<PersistedTokenSet>))\n this.resolveAccessWaiters(key)\n }\n\n async remove(key: string): Promise<void> {\n this.accessTokens.delete(key)\n for (const waiter of this.accessWaiters.get(key) ?? []) waiter.resolve(null)\n this.accessWaiters.delete(key)\n await this.persistent.remove(key)\n }\n\n accessToken(key: string): MemoryAccessToken | null {\n return this.accessTokens.get(key) ?? null\n }\n\n async adoptAccessToken(\n key: string,\n value: string,\n expiresAt: number,\n refreshToken: string,\n ): Promise<void> {\n if (!value) return\n const persisted = parseTokens(await this.persistent.get(key))\n if (persisted?.refresh_token !== refreshToken) return\n this.accessTokens.set(key, { value, expiresAt, refreshToken })\n this.resolveAccessWaiters(key)\n }\n\n private resolveAccessWaiters(key: string): void {\n const access = this.accessTokens.get(key)\n if (!access) return\n const waiting = this.accessWaiters.get(key) ?? []\n const remaining = waiting.filter((waiter) => {\n if (waiter.refreshToken !== access.refreshToken) return true\n waiter.resolve(access)\n return false\n })\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n }\n\n private waitForAccessToken(key: string, refreshToken: string): Promise<MemoryAccessToken | null> {\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout>\n const waiter: AccessWaiter = {\n refreshToken,\n resolve: (access) => {\n clearTimeout(timer)\n resolve(access)\n },\n }\n const waiters = this.accessWaiters.get(key) ?? []\n waiters.push(waiter)\n this.accessWaiters.set(key, waiters)\n timer = setTimeout(() => {\n const remaining = (this.accessWaiters.get(key) ?? [])\n .filter((candidate) => candidate !== waiter)\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n resolve(null)\n }, ACCESS_TOKEN_ADOPTION_TIMEOUT_MS)\n })\n }\n}\n","import {\n BasicError,\n type UploadTransportAdapter,\n type UploadTransportRequest,\n} from '@basictech/core'\n\nfunction responseHeaders(xhr: XMLHttpRequest): Headers {\n const headers = new Headers()\n for (const line of xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/)) {\n if (!line) continue\n const separator = line.indexOf(':')\n if (separator > 0) headers.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n }\n return headers\n}\n\n/** Browser multipart transport with upload progress, adapted from the Drive UI. */\nexport const browserUploadTransport: UploadTransportAdapter = {\n upload(request: UploadTransportRequest): Promise<Response> {\n if (typeof XMLHttpRequest === 'undefined') {\n return Promise.reject(new BasicError('XHR_UNAVAILABLE'))\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n let settled = false\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n if (request.signal) request.signal.removeEventListener('abort', abort)\n callback()\n }\n const abort = () => xhr.abort()\n\n xhr.open('POST', request.url)\n if (request.accessToken) xhr.setRequestHeader('authorization', `Bearer ${request.accessToken}`)\n xhr.setRequestHeader('idempotency-key', request.idempotencyKey)\n if (request.onProgress) {\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) request.onProgress?.(event.loaded, event.total)\n }\n }\n if (request.signal) {\n if (request.signal.aborted) {\n reject(request.signal.reason ?? new DOMException('Aborted', 'AbortError'))\n return\n }\n request.signal.addEventListener('abort', abort, { once: true })\n }\n xhr.onload = () => finish(() => resolve(new Response(xhr.responseText || null, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: responseHeaders(xhr),\n })))\n xhr.onerror = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload could not reach the server')))\n xhr.onabort = () => finish(() => reject(request.signal?.reason ?? new DOMException('Aborted', 'AbortError')))\n xhr.ontimeout = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload timed out')))\n\n const form = new FormData()\n form.append('path', request.path)\n if (request.name !== undefined) form.append('name', request.name)\n if (request.mtime !== undefined) form.append('mtime', String(request.mtime))\n form.append('file', request.file, request.filename)\n xhr.send(form)\n })\n },\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\nimport { BasicClientContext } from './context'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\n\ninterface ProviderChildrenProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport type BasicProviderProps<S extends BasicSchema = BasicSchema> = ProviderChildrenProps & (\n | { client: BasicClient<S> }\n | (BrowserBasicConfig<S> & { client?: never })\n)\n\ninterface ClientLifecycle {\n references: number\n start: Promise<void> | null\n stopTimer: ReturnType<typeof setTimeout> | null\n}\n\nconst clientLifecycles = new WeakMap<BasicClient<BasicSchema>, ClientLifecycle>()\n\nfunction retainClient(client: BasicClient<BasicSchema>): {\n started: Promise<void>\n release: () => void\n} {\n let lifecycle = clientLifecycles.get(client)\n if (!lifecycle) {\n lifecycle = { references: 0, start: null, stopTimer: null }\n clientLifecycles.set(client, lifecycle)\n }\n lifecycle.references += 1\n if (lifecycle.stopTimer) {\n clearTimeout(lifecycle.stopTimer)\n lifecycle.stopTimer = null\n }\n lifecycle.start ??= Promise.resolve(client.start()).catch((error: unknown) => {\n lifecycle!.start = null\n throw error\n })\n\n let released = false\n return {\n started: lifecycle.start,\n release: () => {\n if (released) return\n released = true\n lifecycle!.references = Math.max(0, lifecycle!.references - 1)\n if (lifecycle!.references > 0 || lifecycle!.stopTimer) return\n lifecycle!.stopTimer = setTimeout(() => {\n lifecycle!.stopTimer = null\n if (lifecycle!.references > 0) return\n const started = lifecycle!.start ?? Promise.resolve()\n void started.catch(() => {}).then(() => {\n if (lifecycle!.references > 0) return\n client.stop()\n lifecycle!.start = null\n })\n }, 0)\n },\n }\n}\n\n/** Generic provider for schema-less or explicitly generic applications. */\nexport function BasicProvider<S extends BasicSchema = BasicSchema>(props: BasicProviderProps<S>) {\n const clientRef = useRef<BasicClient<S> | null>(null)\n if (!clientRef.current) {\n if ('client' in props && props.client) {\n clientRef.current = props.client\n } else {\n const { children: _children, renderWhileLoading: _renderWhileLoading, ...config } = props\n clientRef.current = createBasicClient(config as BrowserBasicConfig<S>)\n }\n }\n const client = clientRef.current\n const [startError, setStartError] = useState<unknown>(null)\n\n useEffect(() => {\n let active = true\n const retained = retainClient(client as BasicClient<BasicSchema>)\n void retained.started.catch((error: unknown) => {\n if (active) setStartError(error)\n })\n return () => {\n active = false\n retained.release()\n }\n }, [client])\n\n const snapshot = useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n if (startError) throw startError\n\n return (\n <BasicClientContext.Provider value={client as BasicClient<BasicSchema>}>\n {(snapshot.isReady || props.renderWhileLoading) && props.children}\n </BasicClientContext.Provider>\n )\n}\n","import { createContext } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\n\nexport const BasicClientContext = createContext<BasicClient<BasicSchema> | null>(null)\n","import { useCallback, useMemo } from 'react'\nimport type { BasicClient, BasicProfile, BasicSchema } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAccountsResult {\n accounts: BasicProfile[]\n active: BasicProfile | null\n switchAccount(id: string): Promise<void>\n addAccount(): Promise<BasicProfile>\n removeAccount(id: string): Promise<void>\n}\n\nexport function useAccountsFor<S extends BasicSchema>(client: BasicClient<S>): UseAccountsResult {\n const snapshot = useClientSnapshot(client)\n const switchAccount = useCallback((id: string) => client.switchAccount(id), [client])\n const addAccount = useCallback(() => client.addAccount(), [client])\n const removeAccount = useCallback((id: string) => client.removeAccount(id), [client])\n\n return useMemo(() => ({\n accounts: snapshot.profiles,\n active: snapshot.activeProfile,\n switchAccount,\n addAccount,\n removeAccount,\n }), [snapshot.profiles, snapshot.activeProfile, switchAccount, addAccount, removeAccount])\n}\n\nexport function useAccounts(): UseAccountsResult {\n return useAccountsFor(useRequiredClient())\n}\n","import { useContext, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport {\n BasicError,\n type BasicClient,\n type BasicClientSnapshot,\n type BasicSchema,\n} from '@basictech/core'\nimport { BasicClientContext } from '../context'\n\nexport interface AsyncResult<T> {\n data: T\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useRequiredClient<S extends BasicSchema = BasicSchema>(): BasicClient<S> {\n const client = useContext(BasicClientContext)\n if (!client) throw new Error('Basic hooks must be used within a <BasicProvider>')\n return client as unknown as BasicClient<S>\n}\n\nexport function useClientSnapshot<S extends BasicSchema>(\n client: BasicClient<S>,\n): BasicClientSnapshot {\n return useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n}\n\nexport function toBasicError(error: unknown, fallback = 'UNKNOWN_ERROR'): BasicError {\n if (error instanceof BasicError) return error\n return new BasicError(fallback, error instanceof Error ? error.message : String(error))\n}\n\nexport function useAsyncResult<T>(\n load: () => Promise<T>,\n initialData: T,\n enabled: boolean,\n settled: boolean,\n dependencies: readonly unknown[],\n): AsyncResult<T> {\n const loadRef = useRef(load)\n loadRef.current = load\n const [refreshVersion, setRefreshVersion] = useState(0)\n const [state, setState] = useState<Omit<AsyncResult<T>, 'refresh'>>({\n data: initialData,\n isLoading: !settled || enabled,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!enabled) {\n setState({ data: initialData, isLoading: !settled, error: null })\n return () => {\n active = false\n }\n }\n setState((current) => ({ ...current, isLoading: true, error: null }))\n void loadRef.current().then(\n (data) => {\n if (active) setState({ data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setState((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error),\n }))\n },\n )\n return () => {\n active = false\n }\n // The caller supplies semantic dependencies; load identity is held in a ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, settled, refreshVersion, ...dependencies])\n\n return {\n ...state,\n refresh: () => setRefreshVersion((version) => version + 1),\n }\n}\n","import { useCallback, useMemo } from 'react'\nimport {\n BasicError,\n type AuthStatus,\n type AuthUser,\n type BasicClient,\n type BasicSchema,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAuthResult {\n isReady: boolean\n isSignedIn: boolean\n isAnonymous: boolean\n status: AuthStatus\n error: BasicError | null\n user: AuthUser | null\n did: string | null\n handle: string | null\n signIn(input?: string): Promise<void>\n signOut(): Promise<void>\n getToken(): Promise<string>\n}\n\nexport function useAuthFor<S extends BasicSchema>(client: BasicClient<S>): UseAuthResult {\n const snapshot = useClientSnapshot(client)\n const signIn = useCallback((input?: string) => client.signIn(input), [client])\n const signOut = useCallback(() => client.signOut(), [client])\n const getToken = useCallback(() => client.getToken(), [client])\n\n return useMemo(() => ({\n isReady: snapshot.isReady,\n isSignedIn: snapshot.isSignedIn,\n isAnonymous: snapshot.isAnonymous,\n status: snapshot.authStatus,\n error: snapshot.authErrorCode ? new BasicError(snapshot.authErrorCode) : null,\n user: snapshot.user,\n did: snapshot.did,\n handle: snapshot.handle,\n signIn,\n signOut,\n getToken,\n }), [snapshot, signIn, signOut, getToken])\n}\n\nexport function useAuth(): UseAuthResult {\n return useAuthFor(useRequiredClient())\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n InferValue,\n JsonObject,\n MountViewerFiles,\n OwnerFiles,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { useRequiredClient } from './client'\n\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n}\n\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return useRequiredClient<S>().db(source)\n}\n\nexport function useCollectionFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n name: T,\n options: { source?: SourceRef } = {},\n): Collection<InferValue<S, T> & JsonObject> {\n return client.db(options.source ?? 'default').collection(name)\n}\n\nexport function useCollection<V extends JsonObject = JsonObject>(\n name: string,\n options: { source?: SourceRef } = {},\n): Collection<V> {\n return useRequiredClient().db(options.source ?? 'default').collection<V>(name)\n}\n","import { useCallback, useMemo } from 'react'\nimport type { BasicClient, BasicSchema, JsonObject, Repo } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseReposResult {\n repos: Repo[]\n defaultRepoId: string | null\n refresh(): Promise<Repo[]>\n create(input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }): Promise<Repo>\n archive(repoId: string): Promise<void>\n}\n\nexport function useReposFor<S extends BasicSchema>(client: BasicClient<S>): UseReposResult {\n const snapshot = useClientSnapshot(client)\n const refresh = useCallback(() => client.refreshRepos(), [client])\n const create = useCallback((input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }) => client.createRepo(input), [client])\n const archive = useCallback((repoId: string) => client.archiveRepo(repoId), [client])\n\n return useMemo(() => ({\n repos: snapshot.repos,\n defaultRepoId: snapshot.defaultRepoId,\n refresh,\n create,\n archive,\n }), [snapshot.repos, snapshot.defaultRepoId, refresh, create, archive])\n}\n\nexport function useRepos(): UseReposResult {\n return useReposFor(useRequiredClient())\n}\n","import { useCallback, useMemo } from 'react'\nimport type {\n BasicClient,\n BasicConflict,\n BasicRejection,\n BasicSchema,\n BasicSyncStatus,\n SchemaStatus,\n SourceRef,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseSyncStatusResult {\n status: BasicSyncStatus\n pendingCount: number\n rejected: BasicRejection[]\n conflicts: BasicConflict[]\n resolveConflict(opId: string, choice: 'keep-mine' | 'keep-theirs'): Promise<boolean>\n discardRejected(opId: string): Promise<boolean>\n}\n\nexport function useSyncStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: SourceRef,\n): UseSyncStatusResult {\n const snapshot = useClientSnapshot(client)\n const sourceKey = JSON.stringify(source)\n const resolveConflict = useCallback(\n (opId: string, choice: 'keep-mine' | 'keep-theirs') =>\n client.resolveConflict(opId, choice, source ?? 'default'),\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const discardRejected = useCallback(\n (opId: string) => client.discardRejected(opId, source ?? 'default'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n\n return useMemo(() => ({\n status: source === undefined ? snapshot.syncStatus : client.status(source),\n pendingCount: client.pending(source).length,\n rejected: client.rejected(source),\n conflicts: client.conflicts(source),\n resolveConflict,\n discardRejected,\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [client, snapshot, sourceKey, resolveConflict, discardRejected])\n}\n\nexport function useSyncStatus(source?: SourceRef): UseSyncStatusResult {\n return useSyncStatusFor(useRequiredClient(), source)\n}\n\nexport function useSchemaStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): SchemaStatus {\n useClientSnapshot(client)\n return client.schemaStatus(source)\n}\n\nexport function useSchemaStatus(source: SourceRef = 'default'): SchemaStatus {\n return useSchemaStatusFor(useRequiredClient(), source)\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Repo,\n} from '@basictech/core'\nimport { useAccountsFor, type UseAccountsResult } from './accounts'\nimport { useAuthFor, type UseAuthResult } from './auth'\nimport { useRequiredClient } from './client'\nimport { useDbFor } from './db'\nimport { useReposFor } from './repos'\nimport { useSyncStatusFor, type UseSyncStatusResult } from './status'\n\nexport interface UseBasicResult<S extends BasicSchema = BasicSchema> extends UseAuthResult {\n client: BasicClient<S>\n db: BasicDb<S>\n accounts: UseAccountsResult\n sync: UseSyncStatusResult\n repos: Repo[]\n}\n\nexport function useBasicFor<S extends BasicSchema>(client: BasicClient<S>): UseBasicResult<S> {\n const auth = useAuthFor(client)\n const accounts = useAccountsFor(client)\n const sync = useSyncStatusFor(client)\n const repos = useReposFor(client)\n return {\n ...auth,\n client,\n db: useDbFor(client),\n accounts,\n sync,\n repos: repos.repos,\n }\n}\n\nexport function useBasic<S extends BasicSchema = BasicSchema>(): UseBasicResult<S> {\n return useBasicFor(useRequiredClient<S>())\n}\n","import { useMemo, useSyncExternalStore } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n FileListQuery,\n FileRecord,\n MountFileInfo,\n SourceRef,\n StorageInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient } from './client'\n\nconst zero = () => 0\n\nexport interface UseFilesResult {\n data: Array<FileRecord | MountFileInfo>\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useFilesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, '_files'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const version = useSyncExternalStore(subscription.subscribe, subscription.getSnapshot, zero)\n return useAsyncResult(\n async () => {\n const files = client.db(source).files\n if (source !== 'default' && 'mountId' in source) {\n const page = await files.list({\n ...(query.prefix !== undefined ? { prefix: query.prefix } : {}),\n ...(query.limit !== undefined ? { limit: query.limit } : {}),\n ...(query.cursor !== undefined ? { cursor: query.cursor } : {}),\n })\n return page.data\n }\n return (await files.list(query)).data\n },\n [],\n snapshot.isReady,\n snapshot.isReady,\n [sourceKey, queryKey, version, snapshot.activeProfile?.id],\n )\n}\n\nexport function useFiles(\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n return useFilesFor(useRequiredClient(), query, options)\n}\n\nexport interface UseStorageInfoResult {\n data: StorageInfo | null\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useStorageInfoFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseStorageInfoResult {\n const snapshot = useClientSnapshot(client)\n return useAsyncResult(\n () => client.storageInfo(client.resolveRepoId()),\n null,\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeProfile?.id],\n )\n}\n\nexport function useStorageInfo(): UseStorageInfoResult {\n return useStorageInfoFor(useRequiredClient())\n}\n","import { useCallback } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n CreateOutgoingShareInput,\n MountHandle,\n MountInfo,\n MountsQuery,\n OutgoingShareInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseMountsResult<S extends BasicSchema = BasicSchema> {\n data: MountInfo[]\n mounts: MountInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n open(mountId: string): Promise<MountHandle<S>>\n manageUrl(): string\n}\n\nexport function useMountsFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: MountsQuery = {},\n): UseMountsResult<S> {\n const snapshot = useClientSnapshot(client)\n const queryKey = JSON.stringify(query)\n const result = useAsyncResult(\n () => client.shares.mounts(query),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [queryKey, snapshot.activeProfile?.id],\n )\n const open = useCallback(\n (mountId: string) => client.shares.mount(mountId),\n [client],\n )\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n const { data: mounts, ...state } = result\n return { data: mounts, mounts, ...state, open, manageUrl }\n}\n\nexport function useMounts(query: MountsQuery = {}): UseMountsResult {\n return useMountsFor(useRequiredClient(), query)\n}\n\nexport interface UseOutgoingSharesResult {\n data: OutgoingShareInfo[]\n outgoingShares: OutgoingShareInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n create(input: CreateOutgoingShareInput): Promise<OutgoingShareInfo>\n get(id: string): Promise<OutgoingShareInfo>\n cancel(id: string): Promise<OutgoingShareInfo>\n revoke(id: string): Promise<OutgoingShareInfo>\n getContactHandle(did: string): Promise<string | null>\n manageUrl(): string\n}\n\nexport function useOutgoingSharesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseOutgoingSharesResult {\n const snapshot = useClientSnapshot(client)\n const result = useAsyncResult(\n () => client.shares.listOutgoing(),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeProfile?.id],\n )\n const create = useCallback((input: CreateOutgoingShareInput) =>\n client.shares.createOutgoing(input), [client])\n const get = useCallback((id: string) => client.shares.getOutgoing(id), [client])\n const cancel = useCallback((id: string) => client.shares.cancel(id), [client])\n const revoke = useCallback((id: string) => client.shares.revoke(id), [client])\n const getContactHandle = useCallback((did: string) => client.shares.getContactHandle(did), [client])\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n const { data: outgoingShares, ...state } = result\n return {\n data: outgoingShares,\n outgoingShares,\n ...state,\n create,\n get,\n cancel,\n revoke,\n getContactHandle,\n manageUrl,\n }\n}\n\nexport function useOutgoingShares(): UseOutgoingSharesResult {\n return useOutgoingSharesFor(useRequiredClient())\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport {\n type BasicClient,\n type BasicRecord,\n type BasicSchema,\n type InferValue,\n type JsonObject,\n type Query,\n type SourceRef,\n type TableNames,\n} from '@basictech/core'\nimport { toBasicError, useClientSnapshot, useRequiredClient } from './client'\nimport type { BasicError } from '@basictech/core'\n\nconst subscribeNever = () => () => {}\nconst zero = () => 0\n\nexport interface UseQueryResult<V extends JsonObject> {\n data: BasicRecord<V>[]\n isLoading: boolean\n error: BasicError | null\n}\n\nexport function useQueryValueFor<\n S extends BasicSchema,\n V extends JsonObject,\n>(\n client: BasicClient<S>,\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, collection),\n // sourceKey captures semantic source identity rather than object identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey, collection],\n )\n const version = useSyncExternalStore(\n subscription?.subscribe ?? subscribeNever,\n subscription?.getSnapshot ?? zero,\n zero,\n )\n const [result, setResult] = useState<UseQueryResult<V>>({\n data: [],\n isLoading: true,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!snapshot.isReady) {\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n return () => {\n active = false\n }\n }\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n const collectionApi = client.db(source).collection<V>(collection)\n const list = collectionApi.list as unknown as (\n value: Query<V>,\n ) => Promise<{ data: BasicRecord<V>[] }>\n void list.call(collectionApi, query).then(\n (page) => {\n if (active) setResult({ data: page.data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setResult((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error, 'QUERY_FAILED'),\n }))\n },\n )\n return () => {\n active = false\n }\n // source and query are represented by their stable semantic keys.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, collection, sourceKey, queryKey, version, snapshot.isReady])\n\n return result\n}\n\nexport function useQueryFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n collection: T,\n query: Query<InferValue<S, T> & JsonObject> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<InferValue<S, T> & JsonObject> {\n return useQueryValueFor(client, collection, query, options)\n}\n\nexport function useQuery<V extends JsonObject = JsonObject>(\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n return useQueryValueFor(useRequiredClient(), collection, query, options)\n}\n","import type { ReactElement, ReactNode } from 'react'\nimport type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n FileListQuery,\n InferValue,\n JsonObject,\n MountViewerFiles,\n MountsQuery,\n OwnerFiles,\n Query,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\nimport { BasicProvider } from './provider'\nimport { useAccountsFor, type UseAccountsResult } from './hooks/accounts'\nimport { useAuthFor, type UseAuthResult } from './hooks/auth'\nimport { useBasicFor, type UseBasicResult } from './hooks/basic'\nimport { useCollectionFor } from './hooks/db'\nimport {\n useFilesFor,\n useStorageInfoFor,\n type UseFilesResult,\n type UseStorageInfoResult,\n} from './hooks/files'\nimport {\n useMountsFor,\n useOutgoingSharesFor,\n type UseMountsResult,\n type UseOutgoingSharesResult,\n} from './hooks/mounts'\nimport { useQueryFor, type UseQueryResult } from './hooks/query'\nimport { useReposFor, type UseReposResult } from './hooks/repos'\nimport { useSchemaStatusFor, useSyncStatusFor, type UseSyncStatusResult } from './hooks/status'\nimport type { SchemaStatus } from '@basictech/core'\n\nexport type CreateBasicConfig<S extends BasicSchema> = BrowserBasicConfig<S> & { schema: S }\n\nexport interface BoundBasicProviderProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport interface CreatedBasic<S extends BasicSchema> {\n client: BasicClient<S>\n Provider(props: BoundBasicProviderProps): ReactElement\n useBasic(): UseBasicResult<S>\n useAuth(): UseAuthResult\n useAccounts(): UseAccountsResult\n useDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n useDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n useDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n useCollection<T extends TableNames<S>>(\n name: T,\n options?: { source?: SourceRef },\n ): Collection<InferValue<S, T> & JsonObject>\n useQuery<T extends TableNames<S>>(\n collection: T,\n query?: Query<InferValue<S, T> & JsonObject>,\n options?: { source?: SourceRef },\n ): UseQueryResult<InferValue<S, T> & JsonObject>\n useSyncStatus(source?: SourceRef): UseSyncStatusResult\n useSchemaStatus(source?: SourceRef): SchemaStatus\n useRepos(): UseReposResult\n useFiles(query?: FileListQuery, options?: { source?: SourceRef }): UseFilesResult\n useStorageInfo(): UseStorageInfoResult\n useMounts(query?: MountsQuery): UseMountsResult<S>\n useOutgoingShares(): UseOutgoingSharesResult\n}\n\n/** Create one browser client and a complete hook surface bound to its schema. */\nexport function createBasic<const S extends BasicSchema>(config: CreateBasicConfig<S>): CreatedBasic<S> {\n const client = createBasicClient(config)\n\n function Provider({ children, renderWhileLoading }: BoundBasicProviderProps) {\n return (\n <BasicProvider client={client} renderWhileLoading={renderWhileLoading}>\n {children}\n </BasicProvider>\n )\n }\n\n function useBoundDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n function useBoundDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n function useBoundDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n function useBoundDb(\n source: SourceRef = 'default',\n ): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n }\n\n return {\n client,\n Provider,\n useBasic: () => useBasicFor(client),\n useAuth: () => useAuthFor(client),\n useAccounts: () => useAccountsFor(client),\n useDb: useBoundDb,\n useCollection: (name, options = {}) => useCollectionFor(client, name, options),\n useQuery: (collection, query = {}, options = {}) =>\n useQueryFor(client, collection, query, options),\n useSyncStatus: (source) => useSyncStatusFor(client, source),\n useSchemaStatus: (source = 'default') => useSchemaStatusFor(client, source),\n useRepos: () => useReposFor(client),\n useFiles: (query = {}, options = {}) => useFilesFor(client, query, options),\n useStorageInfo: () => useStorageInfoFor(client),\n useMounts: (query = {}) => useMountsFor(client, query),\n useOutgoingShares: () => useOutgoingSharesFor(client),\n }\n}\n"],"mappings":"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","names":["import_core","import_core","Dexie","import_core","createCoreClient","import_react","import_react","import_react","import_core","import_react","import_core","import_react","import_react","import_react","import_react","import_react","zero","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/create-client.ts","../src/adapters/broadcast-channel.ts","../src/adapters/navigation.ts","../src/adapters/persistence.ts","../src/adapters/storage.ts","../src/adapters/token-store.ts","../src/adapters/upload.ts","../src/provider.tsx","../src/context.ts","../src/hooks/accounts.ts","../src/hooks/client.ts","../src/hooks/auth.ts","../src/hooks/db.ts","../src/hooks/repos.ts","../src/hooks/status.ts","../src/hooks/basic.ts","../src/hooks/files.ts","../src/hooks/mounts.ts","../src/hooks/query.ts","../src/create-basic.tsx"],"sourcesContent":["export { createBasic } from './create-basic'\nexport type { BoundBasicProviderProps, CreatedBasic, CreateBasicConfig } from './create-basic'\nexport { createBasicClient } from './create-client'\nexport type { BrowserBasicConfig } from './create-client'\nexport { BasicProvider } from './provider'\nexport type { BasicProviderProps } from './provider'\nexport * from './hooks'\n\nexport { BrowserKeyValueStorage, browserStorage } from './adapters/storage'\nexport { BrowserTokenStore } from './adapters/token-store'\nexport {\n createBrowserAuthChannelFactory,\n createBrowserMessageChannel,\n} from './adapters/broadcast-channel'\nexport type { BrowserMessageChannel } from './adapters/broadcast-channel'\nexport { browserCurrentUrl, browserNavigate, browserReplaceUrl } from './adapters/navigation'\nexport { PersistenceStore } from './adapters/persistence'\nexport type { BrowserLockManager, PersistenceStoreOptions } from './adapters/persistence'\nexport { browserUploadTransport } from './adapters/upload'\n","import {\n MemoryKeyValueStorage,\n MemoryReplicaStoreFactory,\n createBasicClient as createCoreClient,\n type BasicClient,\n type BasicConfig,\n type BasicSchema,\n} from '@basictech/core'\nimport { createBrowserAuthChannelFactory } from './adapters/broadcast-channel'\nimport { browserCurrentUrl, browserNavigate, browserReplaceUrl } from './adapters/navigation'\nimport { PersistenceStore } from './adapters/persistence'\nimport { browserStorage } from './adapters/storage'\nimport { BrowserTokenStore } from './adapters/token-store'\nimport { browserUploadTransport } from './adapters/upload'\n\nexport type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>\n\nfunction browserReconcileTrigger(listener: () => void): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n const onVisible = () => {\n if (document.visibilityState === 'visible') listener()\n }\n window.addEventListener('focus', listener)\n window.addEventListener('online', listener)\n document.addEventListener('visibilitychange', onVisible)\n return () => {\n window.removeEventListener('focus', listener)\n window.removeEventListener('online', listener)\n document.removeEventListener('visibilitychange', onVisible)\n }\n}\n\n/** Create a core client with the complete browser adapter set installed. */\nexport function createBasicClient<S extends BasicSchema>(\n config: BrowserBasicConfig<S>,\n): BasicClient<S> {\n const local = browserStorage('localStorage') ?? new MemoryKeyValueStorage()\n const session = browserStorage('sessionStorage') ?? new MemoryKeyValueStorage()\n const defaultTokenStore = config.tokenStore ? null : new BrowserTokenStore(local)\n const canBroadcast = typeof BroadcastChannel !== 'undefined'\n const canPersistReplica = typeof indexedDB !== 'undefined'\n\n return createCoreClient({\n ...config,\n kv: config.kv ?? local,\n tokenStore: config.tokenStore ?? defaultTokenStore!,\n sessionStorage: config.sessionStorage ?? session,\n replicaStore: config.replicaStore ?? (\n canPersistReplica ? new PersistenceStore(config.clientId) : new MemoryReplicaStoreFactory()\n ),\n navigate: config.navigate ?? browserNavigate,\n currentUrl: config.currentUrl ?? browserCurrentUrl,\n replaceUrl: config.replaceUrl ?? browserReplaceUrl,\n reconcileTrigger: config.reconcileTrigger ?? browserReconcileTrigger,\n createMessageChannel: config.createMessageChannel ?? (\n canBroadcast && defaultTokenStore\n ? createBrowserAuthChannelFactory(config.clientId, defaultTokenStore)\n : undefined\n ),\n uploadTransport: config.uploadTransport ?? (\n typeof XMLHttpRequest === 'undefined' ? undefined : browserUploadTransport\n ),\n })\n}\n","import type { AuthMessageChannel } from '@basictech/core'\nimport type { BrowserTokenStore } from './token-store'\n\nexport interface BrowserMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AccessTokenMessage {\n type?: string\n expiresAt?: number\n __basicAccessToken?: string\n __basicRefreshToken?: string\n}\n\n/** Core message-channel adapter backed by the browser BroadcastChannel API. */\nexport function createBrowserMessageChannel(name: string): BrowserMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: BrowserMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Access tokens may cross tabs transiently but are never written to browser\n * storage. The receiving adapter adopts the token before core handles the\n * ordinary token-rotation notification.\n */\nexport function createBrowserAuthChannelFactory(\n clientId: string,\n tokenStore: BrowserTokenStore,\n): (name: string) => AuthMessageChannel {\n const prefix = `basic_auth:${clientId}:`\n return (name) => {\n const channel = createBrowserMessageChannel(name)\n const profileId = name.startsWith(prefix) ? name.slice(prefix.length) : ''\n const tokenKey = `u:${profileId}:basic_tokens`\n const adapter: AuthMessageChannel = {\n postMessage: (message) => {\n const outgoing = message as AccessTokenMessage\n const access = outgoing?.type === 'tokens' ? tokenStore.accessToken(tokenKey) : null\n channel.postMessage(access ? {\n ...outgoing,\n expiresAt: access.expiresAt,\n __basicAccessToken: access.value,\n __basicRefreshToken: access.refreshToken,\n } satisfies AccessTokenMessage : message)\n },\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => {\n void (async () => {\n const incoming = event.data as AccessTokenMessage\n if (incoming?.type === 'tokens' && incoming.__basicAccessToken && incoming.__basicRefreshToken) {\n await tokenStore.adoptAccessToken(\n tokenKey,\n incoming.__basicAccessToken,\n incoming.expiresAt ?? 0,\n incoming.__basicRefreshToken,\n )\n }\n adapter.onmessage?.({ data: event.data })\n })()\n }\n return adapter\n }\n}\n","import { BasicError } from '@basictech/core'\n\nexport function browserNavigate(url: string): void {\n if (typeof location === 'undefined') throw new BasicError('NAVIGATE_ADAPTER_REQUIRED')\n location.assign(url)\n}\n\nexport function browserCurrentUrl(): string {\n return typeof location === 'undefined' ? '' : location.href\n}\n\nexport function browserReplaceUrl(url: string): void {\n if (typeof history !== 'undefined') history.replaceState({}, '', url)\n}\n","import Dexie, { type Table } from 'dexie'\nimport {\n BasicError,\n partitionKey,\n type PersistedReplicaState,\n type PersistenceLeaderHooks,\n type ReplicaStore,\n type ReplicaStoreFactory,\n type StoragePartition,\n type SyncOp,\n} from '@basictech/core'\n\nexport type { PersistedReplicaState, StoragePartition } from '@basictech/core'\n\ninterface PartitionRow {\n key: string\n profileId: string\n state: PersistedReplicaState\n updatedAt: number\n}\n\nexport interface ReplicaMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AvailableLock {\n name: string\n}\n\nexport interface BrowserLockManager {\n request<T>(\n name: string,\n options: { mode?: 'exclusive'; ifAvailable?: true },\n callback: (lock: AvailableLock | null) => T | Promise<T>,\n ): Promise<T>\n}\n\nexport interface PersistenceStoreOptions {\n locks?: BrowserLockManager | null\n createChannel?: ((name: string) => ReplicaMessageChannel) | null\n}\n\ntype CoordinatorMessage =\n | { type: 'mutation'; requestId: string; operation: SyncOp }\n | { type: 'mutation-result'; requestId: string; opId?: string; code?: string; message?: string }\n | { type: 'state'; state: PersistedReplicaState }\n\nfunction browserLocks(): BrowserLockManager | null {\n if (typeof navigator === 'undefined' || !navigator.locks) return null\n return navigator.locks as unknown as BrowserLockManager\n}\n\nfunction browserChannel(name: string): ReplicaMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: ReplicaMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Per-partition single-writer coordinator. With Web Locks, followers forward\n * mutations and consume committed-state broadcasts. Browsers lacking Locks\n * use the documented degraded last-committed-writer-wins mode: every tab may\n * write, the version guard rejects stale commits, and broadcasts refresh\n * surviving views. Concurrent offline intent can be lost in that fallback.\n */\nclass PartitionCoordinator implements PersistenceLeaderHooks {\n private readonly mutationListeners = new Set<(operation: SyncOp) => Promise<string>>()\n private readonly stateListeners = new Set<(state: PersistedReplicaState) => void>()\n private readonly leadershipListeners = new Set<(isLeader: boolean) => void | Promise<void>>()\n private readonly pending = new Map<string, {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n }>()\n private readonly election: Promise<boolean>\n private leadershipReady: Promise<void> = Promise.resolve()\n private releaseLock: (() => void) | null = null\n private leader = true\n private closed = false\n\n constructor(\n name: string,\n locks: BrowserLockManager | null,\n private readonly channel: ReplicaMessageChannel | null,\n ) {\n this.channel && (this.channel.onmessage = (event) => this.receive(event.data))\n if (!locks || !channel) {\n this.election = Promise.resolve(true)\n return\n }\n this.leader = false\n this.election = new Promise<boolean>((resolve) => {\n void locks.request(`basic-replica:${name}`, { ifAvailable: true }, async (lock) => {\n this.setLeader(Boolean(lock))\n resolve(this.leader)\n if (!lock) {\n this.waitForLeadership(locks, name)\n return\n }\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n }).catch(() => {\n this.setLeader(true)\n resolve(true)\n })\n })\n }\n\n async isLeader(): Promise<boolean> {\n await this.election\n await this.leadershipReady\n return this.leader\n }\n\n subscribeLeadership(listener: (isLeader: boolean) => void | Promise<void>): () => void {\n this.leadershipListeners.add(listener)\n return () => this.leadershipListeners.delete(listener)\n }\n\n async forwardMutation(operation: SyncOp): Promise<string> {\n if (await this.isLeader()) return this.dispatchMutation(operation)\n if (this.closed) throw new BasicError('PARTITION_COORDINATOR_CLOSED')\n if (!this.channel) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n const requestId = crypto.randomUUID()\n return new Promise<string>((resolve, reject) => {\n const flight = { operation, resolve, reject, deadline: Date.now() + 10_000 }\n this.pending.set(requestId, flight)\n this.sendPending(requestId, flight)\n })\n }\n\n subscribeMutations(listener: (operation: SyncOp) => Promise<string>): () => void {\n this.mutationListeners.add(listener)\n return () => this.mutationListeners.delete(listener)\n }\n\n publishState(state: PersistedReplicaState): void {\n this.channel?.postMessage({ type: 'state', state } satisfies CoordinatorMessage)\n }\n\n subscribeState(listener: (state: PersistedReplicaState) => void): () => void {\n this.stateListeners.add(listener)\n return () => this.stateListeners.delete(listener)\n }\n\n close(): void {\n this.closed = true\n this.setLeader(false)\n this.releaseLock?.()\n this.releaseLock = null\n this.channel?.close()\n for (const flight of this.pending.values()) {\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(new BasicError('PARTITION_COORDINATOR_CLOSED'))\n }\n this.pending.clear()\n }\n\n private waitForLeadership(locks: BrowserLockManager, name: string): void {\n void locks.request(`basic-replica:${name}`, { mode: 'exclusive' }, async (lock) => {\n if (!lock || this.closed) return\n this.setLeader(true)\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n this.setLeader(false)\n }).catch(() => {\n if (!this.closed) this.setLeader(true)\n })\n }\n\n private setLeader(isLeader: boolean): void {\n if (this.leader === isLeader) return\n this.leader = isLeader\n this.leadershipReady = Promise.all(\n [...this.leadershipListeners].map((listener) => listener(isLeader)),\n ).then(() => {})\n if (isLeader) void this.leadershipReady.then(() => this.drainPending()).catch(() => {})\n }\n\n private receive(value: unknown): void {\n if (this.closed || !value || typeof value !== 'object') return\n const message = value as CoordinatorMessage\n if (message.type === 'state') {\n for (const listener of this.stateListeners) listener(structuredClone(message.state))\n } else if (message.type === 'mutation' && this.leader) {\n void this.leadershipReady.then(() => this.dispatchMutation(message.operation)).then(\n (opId) => this.channel?.postMessage({\n type: 'mutation-result', requestId: message.requestId, opId,\n } satisfies CoordinatorMessage),\n (error: unknown) => this.channel?.postMessage({\n type: 'mutation-result',\n requestId: message.requestId,\n code: error instanceof BasicError ? error.code : 'FORWARDED_MUTATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n } satisfies CoordinatorMessage),\n )\n } else if (message.type === 'mutation-result') {\n const flight = this.pending.get(message.requestId)\n if (!flight) return\n if (!message.opId && (message.code === 'STALE_STATE_VERSION' ||\n message.code === 'PARTITION_LEADER_UNAVAILABLE')) {\n this.sendPending(message.requestId, flight)\n return\n }\n this.pending.delete(message.requestId)\n if (flight.timer) clearTimeout(flight.timer)\n if (message.opId) flight.resolve(message.opId)\n else flight.reject(new BasicError(message.code ?? 'FORWARDED_MUTATION_FAILED', message.message))\n }\n }\n\n private async dispatchMutation(operation: SyncOp): Promise<string> {\n const listener = this.mutationListeners.values().next().value\n if (!listener) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n return listener(operation)\n }\n\n private drainPending(): void {\n for (const [requestId, flight] of this.pending) {\n void this.dispatchMutation(flight.operation).then(\n (opId) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.resolve(opId)\n },\n (error: unknown) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(error instanceof Error ? error : new BasicError('FORWARDED_MUTATION_FAILED'))\n },\n )\n }\n }\n\n private sendPending(\n requestId: string,\n flight: {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n },\n ): void {\n if (this.pending.get(requestId) !== flight) return\n if (flight.timer) clearTimeout(flight.timer)\n const remaining = flight.deadline - Date.now()\n if (remaining <= 0) {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_TIMEOUT'))\n return\n }\n try {\n this.channel?.postMessage({\n type: 'mutation', requestId, operation: flight.operation,\n } satisfies CoordinatorMessage)\n } catch {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_UNAVAILABLE'))\n return\n }\n flight.timer = setTimeout(() => this.sendPending(requestId, flight), Math.min(100, remaining))\n }\n}\n\nclass DexieReplicaStore implements ReplicaStore {\n constructor(\n private readonly table: Table<PartitionRow, string>,\n readonly partition: StoragePartition,\n readonly key: string,\n readonly leader: PartitionCoordinator,\n ) {}\n\n async load(): Promise<PersistedReplicaState | null> {\n return (await this.table.get(this.key))?.state ?? null\n }\n\n async save(state: PersistedReplicaState): Promise<void> {\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new BasicError('INVALID_STATE_VERSION')\n }\n await this.table.db.transaction('rw', this.table, async () => {\n const current = await this.table.get(this.key)\n if ((current?.state.version ?? 0) >= state.version) throw new BasicError('STALE_STATE_VERSION')\n await this.table.put({\n key: this.key,\n profileId: this.partition.profileId,\n state: structuredClone(state),\n updatedAt: Date.now(),\n })\n })\n this.leader.publishState(structuredClone(state))\n }\n\n async delete(): Promise<void> {\n await this.table.delete(this.key)\n }\n}\n\n/** Dexie adapter for core's six-field, version-guarded replica store. */\nexport class PersistenceStore implements ReplicaStoreFactory {\n private readonly db: Dexie\n private readonly stores = new Map<string, DexieReplicaStore>()\n private readonly locks: BrowserLockManager | null\n private readonly createChannel: ((name: string) => ReplicaMessageChannel) | null\n private opened = false\n\n constructor(appKey: string, options: PersistenceStoreOptions = {}) {\n this.db = new Dexie(`basic:${appKey}`)\n this.db.version(1).stores({ partitions: 'key' })\n this.db.version(2).stores({ partitions: 'key,profileId' }).upgrade((transaction) =>\n transaction.table('partitions').clear())\n this.locks = options.locks === undefined ? browserLocks() : options.locks\n this.createChannel = options.createChannel === undefined\n ? (typeof BroadcastChannel === 'undefined' ? null : browserChannel)\n : options.createChannel\n }\n\n private get partitions(): Table<PartitionRow, string> {\n return this.db.table<PartitionRow, string>('partitions')\n }\n\n async open(): Promise<void> {\n if (this.opened) return\n await cleanupLegacyState()\n await this.db.open()\n this.opened = true\n }\n\n forPartition(partition: StoragePartition): ReplicaStore {\n const key = partitionKey(partition)\n let store = this.stores.get(key)\n if (!store) {\n const channelName = `basic-replica:${this.db.name}:${key}`\n const channel = this.createChannel?.(channelName) ?? null\n const leader = new PartitionCoordinator(channelName, this.locks, channel)\n store = new DexieReplicaStore(this.partitions, { ...partition }, key, leader)\n this.stores.set(key, store)\n }\n return store\n }\n\n async deleteProfile(profileId: string): Promise<void> {\n await this.partitions.where('profileId').equals(profileId).delete()\n for (const [key, store] of this.stores) {\n if (store.partition.profileId !== profileId) continue\n store.leader.close()\n this.stores.delete(key)\n }\n }\n\n close(): void {\n for (const store of this.stores.values()) store.leader.close()\n this.stores.clear()\n if (this.opened) this.db.close()\n this.opened = false\n }\n}\n\n/** Best-effort cleanup of pre-repo-era IndexedDB databases. */\nexport async function cleanupLegacyState(): Promise<void> {\n try {\n const idb = (globalThis as { indexedDB?: IDBFactory }).indexedDB\n if (!idb || typeof idb.databases !== 'function') return\n for (const info of await idb.databases()) {\n if (!info.name?.startsWith('basic-sync:')) continue\n await new Promise<void>((resolve) => {\n const request = idb.deleteDatabase(info.name!)\n request.onsuccess = request.onerror = request.onblocked = () => resolve()\n })\n }\n } catch {\n // Legacy cleanup is deliberately best effort.\n }\n}\n","import type { KeyValueStorage } from '@basictech/core'\n\n/** Synchronous browser Storage adapted to core's key-value contract. */\nexport class BrowserKeyValueStorage implements KeyValueStorage {\n constructor(private readonly storage: Storage) {}\n\n get(key: string): string | null {\n return this.storage.getItem(key)\n }\n\n set(key: string, value: string): void {\n this.storage.setItem(key, value)\n }\n\n remove(key: string): void {\n this.storage.removeItem(key)\n }\n}\n\nexport function browserStorage(\n name: 'localStorage' | 'sessionStorage',\n): BrowserKeyValueStorage | null {\n try {\n const storage = globalThis[name]\n return storage ? new BrowserKeyValueStorage(storage) : null\n } catch {\n return null\n }\n}\n","import type { KeyValueStorage, TokenSet, TokenStore } from '@basictech/core'\n\nconst ACCESS_TOKEN_ADOPTION_TIMEOUT_MS = 100\n\ninterface MemoryAccessToken {\n value: string\n expiresAt: number\n refreshToken: string\n}\n\ninterface AccessWaiter {\n refreshToken: string\n resolve(access: MemoryAccessToken | null): void\n}\n\ntype PersistedTokenSet = Omit<TokenSet, 'access_token' | 'expires_at'>\n\nfunction parseTokens(value: string | null): Partial<TokenSet> | null {\n if (!value) return null\n try {\n const parsed = JSON.parse(value) as Partial<TokenSet>\n return parsed && typeof parsed === 'object' ? parsed : null\n } catch {\n return null\n }\n}\n\n/**\n * Browser token policy: refresh tokens survive reloads in the supplied\n * persistent store; access tokens exist only in this JavaScript realm.\n */\nexport class BrowserTokenStore implements TokenStore {\n private readonly accessTokens = new Map<string, MemoryAccessToken>()\n private readonly accessWaiters = new Map<string, AccessWaiter[]>()\n\n constructor(private readonly persistent: KeyValueStorage) {}\n\n async get(key: string): Promise<string | null> {\n const persisted = parseTokens(await this.persistent.get(key))\n if (!persisted?.refresh_token || typeof persisted.token_type !== 'string') return null\n const refreshToken = persisted.refresh_token\n let access = this.accessTokens.get(key)\n if (access && access.refreshToken !== refreshToken) {\n access = await this.waitForAccessToken(key, refreshToken) ?? undefined\n }\n return JSON.stringify({\n ...persisted,\n access_token: access?.refreshToken === refreshToken ? access.value : '',\n expires_at: access?.refreshToken === refreshToken ? access.expiresAt : 0,\n token_type: persisted.token_type,\n refresh_token: refreshToken,\n } satisfies TokenSet)\n }\n\n async set(key: string, value: string): Promise<void> {\n const tokens = parseTokens(value)\n if (!tokens?.refresh_token || typeof tokens.access_token !== 'string' ||\n typeof tokens.token_type !== 'string') {\n throw new TypeError('invalid token set')\n }\n this.accessTokens.set(key, {\n value: tokens.access_token,\n expiresAt: tokens.expires_at ?? 0,\n refreshToken: tokens.refresh_token,\n })\n const { access_token: _accessToken, expires_at: _expiresAt, ...persisted } = tokens\n await this.persistent.set(key, JSON.stringify(persisted satisfies Partial<PersistedTokenSet>))\n this.resolveAccessWaiters(key)\n }\n\n async remove(key: string): Promise<void> {\n this.accessTokens.delete(key)\n for (const waiter of this.accessWaiters.get(key) ?? []) waiter.resolve(null)\n this.accessWaiters.delete(key)\n await this.persistent.remove(key)\n }\n\n accessToken(key: string): MemoryAccessToken | null {\n return this.accessTokens.get(key) ?? null\n }\n\n async adoptAccessToken(\n key: string,\n value: string,\n expiresAt: number,\n refreshToken: string,\n ): Promise<void> {\n if (!value) return\n const persisted = parseTokens(await this.persistent.get(key))\n if (persisted?.refresh_token !== refreshToken) return\n this.accessTokens.set(key, { value, expiresAt, refreshToken })\n this.resolveAccessWaiters(key)\n }\n\n private resolveAccessWaiters(key: string): void {\n const access = this.accessTokens.get(key)\n if (!access) return\n const waiting = this.accessWaiters.get(key) ?? []\n const remaining = waiting.filter((waiter) => {\n if (waiter.refreshToken !== access.refreshToken) return true\n waiter.resolve(access)\n return false\n })\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n }\n\n private waitForAccessToken(key: string, refreshToken: string): Promise<MemoryAccessToken | null> {\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout>\n const waiter: AccessWaiter = {\n refreshToken,\n resolve: (access) => {\n clearTimeout(timer)\n resolve(access)\n },\n }\n const waiters = this.accessWaiters.get(key) ?? []\n waiters.push(waiter)\n this.accessWaiters.set(key, waiters)\n timer = setTimeout(() => {\n const remaining = (this.accessWaiters.get(key) ?? [])\n .filter((candidate) => candidate !== waiter)\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n resolve(null)\n }, ACCESS_TOKEN_ADOPTION_TIMEOUT_MS)\n })\n }\n}\n","import {\n BasicError,\n type UploadTransportAdapter,\n type UploadTransportRequest,\n} from '@basictech/core'\n\nfunction responseHeaders(xhr: XMLHttpRequest): Headers {\n const headers = new Headers()\n for (const line of xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/)) {\n if (!line) continue\n const separator = line.indexOf(':')\n if (separator > 0) headers.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n }\n return headers\n}\n\n/** Browser multipart transport with upload progress, adapted from the Drive UI. */\nexport const browserUploadTransport: UploadTransportAdapter = {\n upload(request: UploadTransportRequest): Promise<Response> {\n if (typeof XMLHttpRequest === 'undefined') {\n return Promise.reject(new BasicError('XHR_UNAVAILABLE'))\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n let settled = false\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n if (request.signal) request.signal.removeEventListener('abort', abort)\n callback()\n }\n const abort = () => xhr.abort()\n\n xhr.open('POST', request.url)\n if (request.accessToken) xhr.setRequestHeader('authorization', `Bearer ${request.accessToken}`)\n xhr.setRequestHeader('idempotency-key', request.idempotencyKey)\n if (request.onProgress) {\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) request.onProgress?.(event.loaded, event.total)\n }\n }\n if (request.signal) {\n if (request.signal.aborted) {\n reject(request.signal.reason ?? new DOMException('Aborted', 'AbortError'))\n return\n }\n request.signal.addEventListener('abort', abort, { once: true })\n }\n xhr.onload = () => finish(() => resolve(new Response(xhr.responseText || null, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: responseHeaders(xhr),\n })))\n xhr.onerror = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload could not reach the server')))\n xhr.onabort = () => finish(() => reject(request.signal?.reason ?? new DOMException('Aborted', 'AbortError')))\n xhr.ontimeout = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload timed out')))\n\n const form = new FormData()\n form.append('path', request.path)\n if (request.name !== undefined) form.append('name', request.name)\n if (request.mtime !== undefined) form.append('mtime', String(request.mtime))\n form.append('file', request.file, request.filename)\n xhr.send(form)\n })\n },\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\nimport { BasicClientContext } from './context'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\n\ninterface ProviderChildrenProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport type BasicProviderProps<S extends BasicSchema = BasicSchema> = ProviderChildrenProps & (\n | { client: BasicClient<S> }\n | (BrowserBasicConfig<S> & { client?: never })\n)\n\ninterface ClientLifecycle {\n references: number\n start: Promise<void> | null\n stopTimer: ReturnType<typeof setTimeout> | null\n}\n\nconst clientLifecycles = new WeakMap<BasicClient<BasicSchema>, ClientLifecycle>()\n\nfunction retainClient(client: BasicClient<BasicSchema>): {\n started: Promise<void>\n release: () => void\n} {\n let lifecycle = clientLifecycles.get(client)\n if (!lifecycle) {\n lifecycle = { references: 0, start: null, stopTimer: null }\n clientLifecycles.set(client, lifecycle)\n }\n lifecycle.references += 1\n if (lifecycle.stopTimer) {\n clearTimeout(lifecycle.stopTimer)\n lifecycle.stopTimer = null\n }\n lifecycle.start ??= Promise.resolve(client.start()).catch((error: unknown) => {\n lifecycle!.start = null\n throw error\n })\n\n let released = false\n return {\n started: lifecycle.start,\n release: () => {\n if (released) return\n released = true\n lifecycle!.references = Math.max(0, lifecycle!.references - 1)\n if (lifecycle!.references > 0 || lifecycle!.stopTimer) return\n lifecycle!.stopTimer = setTimeout(() => {\n lifecycle!.stopTimer = null\n if (lifecycle!.references > 0) return\n const started = lifecycle!.start ?? Promise.resolve()\n void started.catch(() => {}).then(() => {\n if (lifecycle!.references > 0) return\n client.stop()\n lifecycle!.start = null\n })\n }, 0)\n },\n }\n}\n\n/** Generic provider for schema-less or explicitly generic applications. */\nexport function BasicProvider<S extends BasicSchema = BasicSchema>(props: BasicProviderProps<S>) {\n const clientRef = useRef<BasicClient<S> | null>(null)\n if (!clientRef.current) {\n if ('client' in props && props.client) {\n clientRef.current = props.client\n } else {\n const { children: _children, renderWhileLoading: _renderWhileLoading, ...config } = props\n clientRef.current = createBasicClient(config as BrowserBasicConfig<S>)\n }\n }\n const client = clientRef.current\n const [startError, setStartError] = useState<unknown>(null)\n\n useEffect(() => {\n let active = true\n const retained = retainClient(client as BasicClient<BasicSchema>)\n void retained.started.catch((error: unknown) => {\n if (active) setStartError(error)\n })\n return () => {\n active = false\n retained.release()\n }\n }, [client])\n\n const snapshot = useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n if (startError) throw startError\n\n return (\n <BasicClientContext.Provider value={client as BasicClient<BasicSchema>}>\n {(snapshot.isReady || props.renderWhileLoading) && props.children}\n </BasicClientContext.Provider>\n )\n}\n","import { createContext } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\n\nexport const BasicClientContext = createContext<BasicClient<BasicSchema> | null>(null)\n","import { useCallback, useMemo } from 'react'\nimport type { BasicAccount, BasicClient, BasicProfile, BasicSchema } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAccountsResult {\n accounts: BasicAccount[]\n active: BasicAccount | null\n switchAccount(id: string): Promise<void>\n addAccount(): Promise<BasicProfile>\n removeAccount(id: string): Promise<void>\n}\n\nexport function useAccountsFor<S extends BasicSchema>(client: BasicClient<S>): UseAccountsResult {\n const snapshot = useClientSnapshot(client)\n const switchAccount = useCallback((id: string) => client.switchAccount(id), [client])\n const addAccount = useCallback(() => client.addAccount(), [client])\n const removeAccount = useCallback((id: string) => client.removeAccount(id), [client])\n\n return useMemo(() => ({\n accounts: snapshot.accounts,\n active: snapshot.activeProfile,\n switchAccount,\n addAccount,\n removeAccount,\n }), [snapshot.accounts, snapshot.activeProfile, switchAccount, addAccount, removeAccount])\n}\n\nexport function useAccounts(): UseAccountsResult {\n return useAccountsFor(useRequiredClient())\n}\n","import { useContext, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport {\n BasicError,\n type BasicClient,\n type BasicClientSnapshot,\n type BasicSchema,\n} from '@basictech/core'\nimport { BasicClientContext } from '../context'\n\nexport interface AsyncResult<T> {\n data: T\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useRequiredClient<S extends BasicSchema = BasicSchema>(): BasicClient<S> {\n const client = useContext(BasicClientContext)\n if (!client) throw new Error('Basic hooks must be used within a <BasicProvider>')\n return client as unknown as BasicClient<S>\n}\n\nexport function useClientSnapshot<S extends BasicSchema>(\n client: BasicClient<S>,\n): BasicClientSnapshot {\n return useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n}\n\nexport function toBasicError(error: unknown, fallback = 'UNKNOWN_ERROR'): BasicError {\n if (error instanceof BasicError) return error\n return new BasicError(fallback, error instanceof Error ? error.message : String(error))\n}\n\nexport function useAsyncResult<T>(\n load: () => Promise<T>,\n initialData: T,\n enabled: boolean,\n settled: boolean,\n dependencies: readonly unknown[],\n): AsyncResult<T> {\n const loadRef = useRef(load)\n loadRef.current = load\n const [refreshVersion, setRefreshVersion] = useState(0)\n const [state, setState] = useState<Omit<AsyncResult<T>, 'refresh'>>({\n data: initialData,\n isLoading: !settled || enabled,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!enabled) {\n setState({ data: initialData, isLoading: !settled, error: null })\n return () => {\n active = false\n }\n }\n setState((current) => ({ ...current, isLoading: true, error: null }))\n void loadRef.current().then(\n (data) => {\n if (active) setState({ data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setState((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error),\n }))\n },\n )\n return () => {\n active = false\n }\n // The caller supplies semantic dependencies; load identity is held in a ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, settled, refreshVersion, ...dependencies])\n\n return {\n ...state,\n refresh: () => setRefreshVersion((version) => version + 1),\n }\n}\n","import { useCallback, useMemo } from 'react'\nimport {\n BasicError,\n type AuthStatus,\n type AuthUser,\n type BasicClient,\n type BasicSchema,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAuthResult {\n isReady: boolean\n isSignedIn: boolean\n isAnonymous: boolean\n canWrite: boolean\n readOnlyReason: string | null\n status: AuthStatus\n error: BasicError | null\n user: AuthUser | null\n did: string | null\n handle: string | null\n signIn(input?: string): Promise<void>\n signOut(): Promise<void>\n getToken(): Promise<string>\n}\n\nexport function useAuthFor<S extends BasicSchema>(client: BasicClient<S>): UseAuthResult {\n const snapshot = useClientSnapshot(client)\n const signIn = useCallback((input?: string) => client.signIn(input), [client])\n const signOut = useCallback(() => client.signOut(), [client])\n const getToken = useCallback(() => client.getToken(), [client])\n\n return useMemo(() => ({\n isReady: snapshot.isReady,\n isSignedIn: snapshot.isSignedIn,\n isAnonymous: snapshot.isAnonymous,\n canWrite: snapshot.canWrite,\n readOnlyReason: snapshot.readOnlyReason,\n status: snapshot.authStatus,\n error: snapshot.authErrorCode ? new BasicError(snapshot.authErrorCode) : null,\n user: snapshot.user,\n did: snapshot.did,\n handle: snapshot.handle,\n signIn,\n signOut,\n getToken,\n }), [snapshot, signIn, signOut, getToken])\n}\n\nexport function useAuth(): UseAuthResult {\n return useAuthFor(useRequiredClient())\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n InferValue,\n JsonObject,\n MountViewerFiles,\n OwnerFiles,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { useRequiredClient } from './client'\n\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n}\n\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return useRequiredClient<S>().db(source)\n}\n\nexport function useCollectionFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n name: T,\n options: { source?: SourceRef } = {},\n): Collection<InferValue<S, T> & JsonObject> {\n return client.db(options.source ?? 'default').collection(name)\n}\n\nexport function useCollection<V extends JsonObject = JsonObject>(\n name: string,\n options: { source?: SourceRef } = {},\n): Collection<V> {\n return useRequiredClient().db(options.source ?? 'default').collection<V>(name)\n}\n","import { useCallback, useMemo } from 'react'\nimport type { BasicClient, BasicSchema, JsonObject, Repo } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseReposResult {\n repos: Repo[]\n defaultRepoId: string | null\n refresh(): Promise<Repo[]>\n create(input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }): Promise<Repo>\n archive(repoId: string): Promise<void>\n}\n\nexport function useReposFor<S extends BasicSchema>(client: BasicClient<S>): UseReposResult {\n const snapshot = useClientSnapshot(client)\n const refresh = useCallback(() => client.refreshRepos(), [client])\n const create = useCallback((input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }) => client.createRepo(input), [client])\n const archive = useCallback((repoId: string) => client.archiveRepo(repoId), [client])\n\n return useMemo(() => ({\n repos: snapshot.repos,\n defaultRepoId: snapshot.defaultRepoId,\n refresh,\n create,\n archive,\n }), [snapshot.repos, snapshot.defaultRepoId, refresh, create, archive])\n}\n\nexport function useRepos(): UseReposResult {\n return useReposFor(useRequiredClient())\n}\n","import { useCallback, useMemo } from 'react'\nimport type {\n BasicClient,\n BasicConflict,\n BasicRejection,\n BasicSchema,\n BasicSyncStatus,\n SchemaStatus,\n SourceRef,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseSyncStatusResult {\n status: BasicSyncStatus\n pendingCount: number\n rejected: BasicRejection[]\n conflicts: BasicConflict[]\n resolveConflict(opId: string, choice: 'keep-mine' | 'keep-theirs'): Promise<boolean>\n discardRejected(opId: string): Promise<boolean>\n}\n\nexport function useSyncStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: SourceRef,\n): UseSyncStatusResult {\n const snapshot = useClientSnapshot(client)\n const sourceKey = JSON.stringify(source)\n const resolveConflict = useCallback(\n (opId: string, choice: 'keep-mine' | 'keep-theirs') =>\n client.resolveConflict(opId, choice, source ?? 'default'),\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const discardRejected = useCallback(\n (opId: string) => client.discardRejected(opId, source ?? 'default'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n\n return useMemo(() => ({\n status: source === undefined ? snapshot.syncStatus : client.status(source),\n pendingCount: client.pending(source).length,\n rejected: client.rejected(source),\n conflicts: client.conflicts(source),\n resolveConflict,\n discardRejected,\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [client, snapshot, sourceKey, resolveConflict, discardRejected])\n}\n\nexport function useSyncStatus(source?: SourceRef): UseSyncStatusResult {\n return useSyncStatusFor(useRequiredClient(), source)\n}\n\nexport function useSchemaStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): SchemaStatus {\n useClientSnapshot(client)\n return client.schemaStatus(source)\n}\n\nexport function useSchemaStatus(source: SourceRef = 'default'): SchemaStatus {\n return useSchemaStatusFor(useRequiredClient(), source)\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Repo,\n} from '@basictech/core'\nimport { useAccountsFor, type UseAccountsResult } from './accounts'\nimport { useAuthFor, type UseAuthResult } from './auth'\nimport { useRequiredClient } from './client'\nimport { useDbFor } from './db'\nimport { useReposFor } from './repos'\nimport { useSyncStatusFor, type UseSyncStatusResult } from './status'\n\nexport interface UseBasicResult<S extends BasicSchema = BasicSchema> extends UseAuthResult {\n client: BasicClient<S>\n db: BasicDb<S>\n accounts: UseAccountsResult\n sync: UseSyncStatusResult\n repos: Repo[]\n}\n\nexport function useBasicFor<S extends BasicSchema>(client: BasicClient<S>): UseBasicResult<S> {\n const auth = useAuthFor(client)\n const accounts = useAccountsFor(client)\n const sync = useSyncStatusFor(client)\n const repos = useReposFor(client)\n return {\n ...auth,\n client,\n db: useDbFor(client),\n accounts,\n sync,\n repos: repos.repos,\n }\n}\n\nexport function useBasic<S extends BasicSchema = BasicSchema>(): UseBasicResult<S> {\n return useBasicFor(useRequiredClient<S>())\n}\n","import { useMemo, useSyncExternalStore } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n FileListQuery,\n FileRecord,\n MountFileInfo,\n SourceRef,\n StorageInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient } from './client'\n\nconst zero = () => 0\n\nexport interface UseFilesResult {\n data: Array<FileRecord | MountFileInfo>\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useFilesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, '_files'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const version = useSyncExternalStore(subscription.subscribe, subscription.getSnapshot, zero)\n return useAsyncResult(\n async () => {\n const files = client.db(source).files\n if (source !== 'default' && 'mountId' in source) {\n const page = await files.list({\n ...(query.prefix !== undefined ? { prefix: query.prefix } : {}),\n ...(query.limit !== undefined ? { limit: query.limit } : {}),\n ...(query.cursor !== undefined ? { cursor: query.cursor } : {}),\n })\n return page.data\n }\n return (await files.list(query)).data\n },\n [],\n snapshot.isReady,\n snapshot.isReady,\n [sourceKey, queryKey, version, snapshot.activeProfile?.id],\n )\n}\n\nexport function useFiles(\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n return useFilesFor(useRequiredClient(), query, options)\n}\n\nexport interface UseStorageInfoResult {\n data: StorageInfo | null\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useStorageInfoFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseStorageInfoResult {\n const snapshot = useClientSnapshot(client)\n return useAsyncResult(\n () => client.storageInfo(client.resolveRepoId()),\n null,\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeProfile?.id],\n )\n}\n\nexport function useStorageInfo(): UseStorageInfoResult {\n return useStorageInfoFor(useRequiredClient())\n}\n","import { useCallback } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n CreateOutgoingShareInput,\n MountHandle,\n MountInfo,\n MountsQuery,\n OutgoingShareInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseMountsResult<S extends BasicSchema = BasicSchema> {\n data: MountInfo[]\n mounts: MountInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n open(mountId: string): Promise<MountHandle<S>>\n manageUrl(): string\n}\n\nexport function useMountsFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: MountsQuery = {},\n): UseMountsResult<S> {\n const snapshot = useClientSnapshot(client)\n const queryKey = JSON.stringify(query)\n const result = useAsyncResult(\n () => client.shares.mounts(query),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [queryKey, snapshot.activeProfile?.id],\n )\n const open = useCallback(\n (mountId: string) => client.shares.mount(mountId),\n [client],\n )\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n const { data: mounts, ...state } = result\n return { data: mounts, mounts, ...state, open, manageUrl }\n}\n\nexport function useMounts(query: MountsQuery = {}): UseMountsResult {\n return useMountsFor(useRequiredClient(), query)\n}\n\nexport interface UseOutgoingSharesResult {\n data: OutgoingShareInfo[]\n outgoingShares: OutgoingShareInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n create(input: CreateOutgoingShareInput): Promise<OutgoingShareInfo>\n get(id: string): Promise<OutgoingShareInfo>\n cancel(id: string): Promise<OutgoingShareInfo>\n revoke(id: string): Promise<OutgoingShareInfo>\n getContactHandle(did: string): Promise<string | null>\n manageUrl(): string\n}\n\nexport function useOutgoingSharesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseOutgoingSharesResult {\n const snapshot = useClientSnapshot(client)\n const result = useAsyncResult(\n () => client.shares.listOutgoing(),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeProfile?.id],\n )\n const create = useCallback((input: CreateOutgoingShareInput) =>\n client.shares.createOutgoing(input), [client])\n const get = useCallback((id: string) => client.shares.getOutgoing(id), [client])\n const cancel = useCallback((id: string) => client.shares.cancel(id), [client])\n const revoke = useCallback((id: string) => client.shares.revoke(id), [client])\n const getContactHandle = useCallback((did: string) => client.shares.getContactHandle(did), [client])\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n const { data: outgoingShares, ...state } = result\n return {\n data: outgoingShares,\n outgoingShares,\n ...state,\n create,\n get,\n cancel,\n revoke,\n getContactHandle,\n manageUrl,\n }\n}\n\nexport function useOutgoingShares(): UseOutgoingSharesResult {\n return useOutgoingSharesFor(useRequiredClient())\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport {\n type BasicClient,\n type BasicRecord,\n type BasicSchema,\n type InferValue,\n type JsonObject,\n type Query,\n type SourceRef,\n type TableNames,\n} from '@basictech/core'\nimport { toBasicError, useClientSnapshot, useRequiredClient } from './client'\nimport type { BasicError } from '@basictech/core'\n\nconst subscribeNever = () => () => {}\nconst zero = () => 0\n\nexport interface UseQueryResult<V extends JsonObject> {\n data: BasicRecord<V>[]\n isLoading: boolean\n error: BasicError | null\n}\n\nexport function useQueryValueFor<\n S extends BasicSchema,\n V extends JsonObject,\n>(\n client: BasicClient<S>,\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, collection),\n // sourceKey captures semantic source identity rather than object identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey, collection],\n )\n const version = useSyncExternalStore(\n subscription?.subscribe ?? subscribeNever,\n subscription?.getSnapshot ?? zero,\n zero,\n )\n const [result, setResult] = useState<UseQueryResult<V>>({\n data: [],\n isLoading: true,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!snapshot.isReady) {\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n return () => {\n active = false\n }\n }\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n const collectionApi = client.db(source).collection<V>(collection)\n const list = collectionApi.list as unknown as (\n value: Query<V>,\n ) => Promise<{ data: BasicRecord<V>[] }>\n void list.call(collectionApi, query).then(\n (page) => {\n if (active) setResult({ data: page.data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setResult((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error, 'QUERY_FAILED'),\n }))\n },\n )\n return () => {\n active = false\n }\n // source and query are represented by their stable semantic keys.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, collection, sourceKey, queryKey, version, snapshot.isReady])\n\n return result\n}\n\nexport function useQueryFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n collection: T,\n query: Query<InferValue<S, T> & JsonObject> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<InferValue<S, T> & JsonObject> {\n return useQueryValueFor(client, collection, query, options)\n}\n\nexport function useQuery<V extends JsonObject = JsonObject>(\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n return useQueryValueFor(useRequiredClient(), collection, query, options)\n}\n","import type { ReactElement, ReactNode } from 'react'\nimport type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n FileListQuery,\n InferValue,\n JsonObject,\n MountViewerFiles,\n MountsQuery,\n OwnerFiles,\n Query,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\nimport { BasicProvider } from './provider'\nimport { useAccountsFor, type UseAccountsResult } from './hooks/accounts'\nimport { useAuthFor, type UseAuthResult } from './hooks/auth'\nimport { useBasicFor, type UseBasicResult } from './hooks/basic'\nimport { useCollectionFor } from './hooks/db'\nimport {\n useFilesFor,\n useStorageInfoFor,\n type UseFilesResult,\n type UseStorageInfoResult,\n} from './hooks/files'\nimport {\n useMountsFor,\n useOutgoingSharesFor,\n type UseMountsResult,\n type UseOutgoingSharesResult,\n} from './hooks/mounts'\nimport { useQueryFor, type UseQueryResult } from './hooks/query'\nimport { useReposFor, type UseReposResult } from './hooks/repos'\nimport { useSchemaStatusFor, useSyncStatusFor, type UseSyncStatusResult } from './hooks/status'\nimport type { SchemaStatus } from '@basictech/core'\n\nexport type CreateBasicConfig<S extends BasicSchema> = BrowserBasicConfig<S> & { schema: S }\n\nexport interface BoundBasicProviderProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport interface CreatedBasic<S extends BasicSchema> {\n client: BasicClient<S>\n Provider(props: BoundBasicProviderProps): ReactElement\n useBasic(): UseBasicResult<S>\n useAuth(): UseAuthResult\n useAccounts(): UseAccountsResult\n useDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n useDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n useDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n useCollection<T extends TableNames<S>>(\n name: T,\n options?: { source?: SourceRef },\n ): Collection<InferValue<S, T> & JsonObject>\n useQuery<T extends TableNames<S>>(\n collection: T,\n query?: Query<InferValue<S, T> & JsonObject>,\n options?: { source?: SourceRef },\n ): UseQueryResult<InferValue<S, T> & JsonObject>\n useSyncStatus(source?: SourceRef): UseSyncStatusResult\n useSchemaStatus(source?: SourceRef): SchemaStatus\n useRepos(): UseReposResult\n useFiles(query?: FileListQuery, options?: { source?: SourceRef }): UseFilesResult\n useStorageInfo(): UseStorageInfoResult\n useMounts(query?: MountsQuery): UseMountsResult<S>\n useOutgoingShares(): UseOutgoingSharesResult\n}\n\n/** Create one browser client and a complete hook surface bound to its schema. */\nexport function createBasic<const S extends BasicSchema>(config: CreateBasicConfig<S>): CreatedBasic<S> {\n const client = createBasicClient(config)\n\n function Provider({ children, renderWhileLoading }: BoundBasicProviderProps) {\n return (\n <BasicProvider client={client} renderWhileLoading={renderWhileLoading}>\n {children}\n </BasicProvider>\n )\n }\n\n function useBoundDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n function useBoundDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n function useBoundDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n function useBoundDb(\n source: SourceRef = 'default',\n ): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n }\n\n return {\n client,\n Provider,\n useBasic: () => useBasicFor(client),\n useAuth: () => useAuthFor(client),\n useAccounts: () => useAccountsFor(client),\n useDb: useBoundDb,\n useCollection: (name, options = {}) => useCollectionFor(client, name, options),\n useQuery: (collection, query = {}, options = {}) =>\n useQueryFor(client, collection, query, options),\n useSyncStatus: (source) => useSyncStatusFor(client, source),\n useSchemaStatus: (source = 'default') => useSchemaStatusFor(client, source),\n useRepos: () => useReposFor(client),\n useFiles: (query = {}, options = {}) => useFilesFor(client, query, options),\n useStorageInfo: () => useStorageInfoFor(client),\n useMounts: (query = {}) => useMountsFor(client, query),\n useOutgoingShares: () => useOutgoingSharesFor(client),\n }\n}\n"],"mappings":"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","names":["import_core","import_core","Dexie","import_core","createCoreClient","import_react","import_react","import_react","import_core","import_react","import_core","import_react","import_react","import_react","import_react","import_react","zero","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -728,12 +728,12 @@ function useAccountsFor(client) {
728
728
  const addAccount = useCallback(() => client.addAccount(), [client]);
729
729
  const removeAccount = useCallback((id) => client.removeAccount(id), [client]);
730
730
  return useMemo(() => ({
731
- accounts: snapshot.profiles,
731
+ accounts: snapshot.accounts,
732
732
  active: snapshot.activeProfile,
733
733
  switchAccount,
734
734
  addAccount,
735
735
  removeAccount
736
- }), [snapshot.profiles, snapshot.activeProfile, switchAccount, addAccount, removeAccount]);
736
+ }), [snapshot.accounts, snapshot.activeProfile, switchAccount, addAccount, removeAccount]);
737
737
  }
738
738
  function useAccounts() {
739
739
  return useAccountsFor(useRequiredClient());
@@ -753,6 +753,8 @@ function useAuthFor(client) {
753
753
  isReady: snapshot.isReady,
754
754
  isSignedIn: snapshot.isSignedIn,
755
755
  isAnonymous: snapshot.isAnonymous,
756
+ canWrite: snapshot.canWrite,
757
+ readOnlyReason: snapshot.readOnlyReason,
756
758
  status: snapshot.authStatus,
757
759
  error: snapshot.authErrorCode ? new BasicError5(snapshot.authErrorCode) : null,
758
760
  user: snapshot.user,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/create-client.ts","../src/adapters/broadcast-channel.ts","../src/adapters/navigation.ts","../src/adapters/persistence.ts","../src/adapters/storage.ts","../src/adapters/token-store.ts","../src/adapters/upload.ts","../src/provider.tsx","../src/context.ts","../src/hooks/accounts.ts","../src/hooks/client.ts","../src/hooks/auth.ts","../src/hooks/db.ts","../src/hooks/repos.ts","../src/hooks/status.ts","../src/hooks/basic.ts","../src/hooks/files.ts","../src/hooks/mounts.ts","../src/hooks/query.ts","../src/create-basic.tsx"],"sourcesContent":["import {\n MemoryKeyValueStorage,\n MemoryReplicaStoreFactory,\n createBasicClient as createCoreClient,\n type BasicClient,\n type BasicConfig,\n type BasicSchema,\n} from '@basictech/core'\nimport { createBrowserAuthChannelFactory } from './adapters/broadcast-channel'\nimport { browserCurrentUrl, browserNavigate, browserReplaceUrl } from './adapters/navigation'\nimport { PersistenceStore } from './adapters/persistence'\nimport { browserStorage } from './adapters/storage'\nimport { BrowserTokenStore } from './adapters/token-store'\nimport { browserUploadTransport } from './adapters/upload'\n\nexport type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>\n\nfunction browserReconcileTrigger(listener: () => void): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n const onVisible = () => {\n if (document.visibilityState === 'visible') listener()\n }\n window.addEventListener('focus', listener)\n window.addEventListener('online', listener)\n document.addEventListener('visibilitychange', onVisible)\n return () => {\n window.removeEventListener('focus', listener)\n window.removeEventListener('online', listener)\n document.removeEventListener('visibilitychange', onVisible)\n }\n}\n\n/** Create a core client with the complete browser adapter set installed. */\nexport function createBasicClient<S extends BasicSchema>(\n config: BrowserBasicConfig<S>,\n): BasicClient<S> {\n const local = browserStorage('localStorage') ?? new MemoryKeyValueStorage()\n const session = browserStorage('sessionStorage') ?? new MemoryKeyValueStorage()\n const defaultTokenStore = config.tokenStore ? null : new BrowserTokenStore(local)\n const canBroadcast = typeof BroadcastChannel !== 'undefined'\n const canPersistReplica = typeof indexedDB !== 'undefined'\n\n return createCoreClient({\n ...config,\n kv: config.kv ?? local,\n tokenStore: config.tokenStore ?? defaultTokenStore!,\n sessionStorage: config.sessionStorage ?? session,\n replicaStore: config.replicaStore ?? (\n canPersistReplica ? new PersistenceStore(config.clientId) : new MemoryReplicaStoreFactory()\n ),\n navigate: config.navigate ?? browserNavigate,\n currentUrl: config.currentUrl ?? browserCurrentUrl,\n replaceUrl: config.replaceUrl ?? browserReplaceUrl,\n reconcileTrigger: config.reconcileTrigger ?? browserReconcileTrigger,\n createMessageChannel: config.createMessageChannel ?? (\n canBroadcast && defaultTokenStore\n ? createBrowserAuthChannelFactory(config.clientId, defaultTokenStore)\n : undefined\n ),\n uploadTransport: config.uploadTransport ?? (\n typeof XMLHttpRequest === 'undefined' ? undefined : browserUploadTransport\n ),\n })\n}\n","import type { AuthMessageChannel } from '@basictech/core'\nimport type { BrowserTokenStore } from './token-store'\n\nexport interface BrowserMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AccessTokenMessage {\n type?: string\n expiresAt?: number\n __basicAccessToken?: string\n __basicRefreshToken?: string\n}\n\n/** Core message-channel adapter backed by the browser BroadcastChannel API. */\nexport function createBrowserMessageChannel(name: string): BrowserMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: BrowserMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Access tokens may cross tabs transiently but are never written to browser\n * storage. The receiving adapter adopts the token before core handles the\n * ordinary token-rotation notification.\n */\nexport function createBrowserAuthChannelFactory(\n clientId: string,\n tokenStore: BrowserTokenStore,\n): (name: string) => AuthMessageChannel {\n const prefix = `basic_auth:${clientId}:`\n return (name) => {\n const channel = createBrowserMessageChannel(name)\n const profileId = name.startsWith(prefix) ? name.slice(prefix.length) : ''\n const tokenKey = `u:${profileId}:basic_tokens`\n const adapter: AuthMessageChannel = {\n postMessage: (message) => {\n const outgoing = message as AccessTokenMessage\n const access = outgoing?.type === 'tokens' ? tokenStore.accessToken(tokenKey) : null\n channel.postMessage(access ? {\n ...outgoing,\n expiresAt: access.expiresAt,\n __basicAccessToken: access.value,\n __basicRefreshToken: access.refreshToken,\n } satisfies AccessTokenMessage : message)\n },\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => {\n void (async () => {\n const incoming = event.data as AccessTokenMessage\n if (incoming?.type === 'tokens' && incoming.__basicAccessToken && incoming.__basicRefreshToken) {\n await tokenStore.adoptAccessToken(\n tokenKey,\n incoming.__basicAccessToken,\n incoming.expiresAt ?? 0,\n incoming.__basicRefreshToken,\n )\n }\n adapter.onmessage?.({ data: event.data })\n })()\n }\n return adapter\n }\n}\n","import { BasicError } from '@basictech/core'\n\nexport function browserNavigate(url: string): void {\n if (typeof location === 'undefined') throw new BasicError('NAVIGATE_ADAPTER_REQUIRED')\n location.assign(url)\n}\n\nexport function browserCurrentUrl(): string {\n return typeof location === 'undefined' ? '' : location.href\n}\n\nexport function browserReplaceUrl(url: string): void {\n if (typeof history !== 'undefined') history.replaceState({}, '', url)\n}\n","import Dexie, { type Table } from 'dexie'\nimport {\n BasicError,\n partitionKey,\n type PersistedReplicaState,\n type PersistenceLeaderHooks,\n type ReplicaStore,\n type ReplicaStoreFactory,\n type StoragePartition,\n type SyncOp,\n} from '@basictech/core'\n\nexport type { PersistedReplicaState, StoragePartition } from '@basictech/core'\n\ninterface PartitionRow {\n key: string\n profileId: string\n state: PersistedReplicaState\n updatedAt: number\n}\n\nexport interface ReplicaMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AvailableLock {\n name: string\n}\n\nexport interface BrowserLockManager {\n request<T>(\n name: string,\n options: { mode?: 'exclusive'; ifAvailable?: true },\n callback: (lock: AvailableLock | null) => T | Promise<T>,\n ): Promise<T>\n}\n\nexport interface PersistenceStoreOptions {\n locks?: BrowserLockManager | null\n createChannel?: ((name: string) => ReplicaMessageChannel) | null\n}\n\ntype CoordinatorMessage =\n | { type: 'mutation'; requestId: string; operation: SyncOp }\n | { type: 'mutation-result'; requestId: string; opId?: string; code?: string; message?: string }\n | { type: 'state'; state: PersistedReplicaState }\n\nfunction browserLocks(): BrowserLockManager | null {\n if (typeof navigator === 'undefined' || !navigator.locks) return null\n return navigator.locks as unknown as BrowserLockManager\n}\n\nfunction browserChannel(name: string): ReplicaMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: ReplicaMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Per-partition single-writer coordinator. With Web Locks, followers forward\n * mutations and consume committed-state broadcasts. Browsers lacking Locks\n * use the documented degraded last-committed-writer-wins mode: every tab may\n * write, the version guard rejects stale commits, and broadcasts refresh\n * surviving views. Concurrent offline intent can be lost in that fallback.\n */\nclass PartitionCoordinator implements PersistenceLeaderHooks {\n private readonly mutationListeners = new Set<(operation: SyncOp) => Promise<string>>()\n private readonly stateListeners = new Set<(state: PersistedReplicaState) => void>()\n private readonly leadershipListeners = new Set<(isLeader: boolean) => void | Promise<void>>()\n private readonly pending = new Map<string, {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n }>()\n private readonly election: Promise<boolean>\n private leadershipReady: Promise<void> = Promise.resolve()\n private releaseLock: (() => void) | null = null\n private leader = true\n private closed = false\n\n constructor(\n name: string,\n locks: BrowserLockManager | null,\n private readonly channel: ReplicaMessageChannel | null,\n ) {\n this.channel && (this.channel.onmessage = (event) => this.receive(event.data))\n if (!locks || !channel) {\n this.election = Promise.resolve(true)\n return\n }\n this.leader = false\n this.election = new Promise<boolean>((resolve) => {\n void locks.request(`basic-replica:${name}`, { ifAvailable: true }, async (lock) => {\n this.setLeader(Boolean(lock))\n resolve(this.leader)\n if (!lock) {\n this.waitForLeadership(locks, name)\n return\n }\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n }).catch(() => {\n this.setLeader(true)\n resolve(true)\n })\n })\n }\n\n async isLeader(): Promise<boolean> {\n await this.election\n await this.leadershipReady\n return this.leader\n }\n\n subscribeLeadership(listener: (isLeader: boolean) => void | Promise<void>): () => void {\n this.leadershipListeners.add(listener)\n return () => this.leadershipListeners.delete(listener)\n }\n\n async forwardMutation(operation: SyncOp): Promise<string> {\n if (await this.isLeader()) return this.dispatchMutation(operation)\n if (this.closed) throw new BasicError('PARTITION_COORDINATOR_CLOSED')\n if (!this.channel) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n const requestId = crypto.randomUUID()\n return new Promise<string>((resolve, reject) => {\n const flight = { operation, resolve, reject, deadline: Date.now() + 10_000 }\n this.pending.set(requestId, flight)\n this.sendPending(requestId, flight)\n })\n }\n\n subscribeMutations(listener: (operation: SyncOp) => Promise<string>): () => void {\n this.mutationListeners.add(listener)\n return () => this.mutationListeners.delete(listener)\n }\n\n publishState(state: PersistedReplicaState): void {\n this.channel?.postMessage({ type: 'state', state } satisfies CoordinatorMessage)\n }\n\n subscribeState(listener: (state: PersistedReplicaState) => void): () => void {\n this.stateListeners.add(listener)\n return () => this.stateListeners.delete(listener)\n }\n\n close(): void {\n this.closed = true\n this.setLeader(false)\n this.releaseLock?.()\n this.releaseLock = null\n this.channel?.close()\n for (const flight of this.pending.values()) {\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(new BasicError('PARTITION_COORDINATOR_CLOSED'))\n }\n this.pending.clear()\n }\n\n private waitForLeadership(locks: BrowserLockManager, name: string): void {\n void locks.request(`basic-replica:${name}`, { mode: 'exclusive' }, async (lock) => {\n if (!lock || this.closed) return\n this.setLeader(true)\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n this.setLeader(false)\n }).catch(() => {\n if (!this.closed) this.setLeader(true)\n })\n }\n\n private setLeader(isLeader: boolean): void {\n if (this.leader === isLeader) return\n this.leader = isLeader\n this.leadershipReady = Promise.all(\n [...this.leadershipListeners].map((listener) => listener(isLeader)),\n ).then(() => {})\n if (isLeader) void this.leadershipReady.then(() => this.drainPending()).catch(() => {})\n }\n\n private receive(value: unknown): void {\n if (this.closed || !value || typeof value !== 'object') return\n const message = value as CoordinatorMessage\n if (message.type === 'state') {\n for (const listener of this.stateListeners) listener(structuredClone(message.state))\n } else if (message.type === 'mutation' && this.leader) {\n void this.leadershipReady.then(() => this.dispatchMutation(message.operation)).then(\n (opId) => this.channel?.postMessage({\n type: 'mutation-result', requestId: message.requestId, opId,\n } satisfies CoordinatorMessage),\n (error: unknown) => this.channel?.postMessage({\n type: 'mutation-result',\n requestId: message.requestId,\n code: error instanceof BasicError ? error.code : 'FORWARDED_MUTATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n } satisfies CoordinatorMessage),\n )\n } else if (message.type === 'mutation-result') {\n const flight = this.pending.get(message.requestId)\n if (!flight) return\n if (!message.opId && (message.code === 'STALE_STATE_VERSION' ||\n message.code === 'PARTITION_LEADER_UNAVAILABLE')) {\n this.sendPending(message.requestId, flight)\n return\n }\n this.pending.delete(message.requestId)\n if (flight.timer) clearTimeout(flight.timer)\n if (message.opId) flight.resolve(message.opId)\n else flight.reject(new BasicError(message.code ?? 'FORWARDED_MUTATION_FAILED', message.message))\n }\n }\n\n private async dispatchMutation(operation: SyncOp): Promise<string> {\n const listener = this.mutationListeners.values().next().value\n if (!listener) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n return listener(operation)\n }\n\n private drainPending(): void {\n for (const [requestId, flight] of this.pending) {\n void this.dispatchMutation(flight.operation).then(\n (opId) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.resolve(opId)\n },\n (error: unknown) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(error instanceof Error ? error : new BasicError('FORWARDED_MUTATION_FAILED'))\n },\n )\n }\n }\n\n private sendPending(\n requestId: string,\n flight: {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n },\n ): void {\n if (this.pending.get(requestId) !== flight) return\n if (flight.timer) clearTimeout(flight.timer)\n const remaining = flight.deadline - Date.now()\n if (remaining <= 0) {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_TIMEOUT'))\n return\n }\n try {\n this.channel?.postMessage({\n type: 'mutation', requestId, operation: flight.operation,\n } satisfies CoordinatorMessage)\n } catch {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_UNAVAILABLE'))\n return\n }\n flight.timer = setTimeout(() => this.sendPending(requestId, flight), Math.min(100, remaining))\n }\n}\n\nclass DexieReplicaStore implements ReplicaStore {\n constructor(\n private readonly table: Table<PartitionRow, string>,\n readonly partition: StoragePartition,\n readonly key: string,\n readonly leader: PartitionCoordinator,\n ) {}\n\n async load(): Promise<PersistedReplicaState | null> {\n return (await this.table.get(this.key))?.state ?? null\n }\n\n async save(state: PersistedReplicaState): Promise<void> {\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new BasicError('INVALID_STATE_VERSION')\n }\n await this.table.db.transaction('rw', this.table, async () => {\n const current = await this.table.get(this.key)\n if ((current?.state.version ?? 0) >= state.version) throw new BasicError('STALE_STATE_VERSION')\n await this.table.put({\n key: this.key,\n profileId: this.partition.profileId,\n state: structuredClone(state),\n updatedAt: Date.now(),\n })\n })\n this.leader.publishState(structuredClone(state))\n }\n\n async delete(): Promise<void> {\n await this.table.delete(this.key)\n }\n}\n\n/** Dexie adapter for core's six-field, version-guarded replica store. */\nexport class PersistenceStore implements ReplicaStoreFactory {\n private readonly db: Dexie\n private readonly stores = new Map<string, DexieReplicaStore>()\n private readonly locks: BrowserLockManager | null\n private readonly createChannel: ((name: string) => ReplicaMessageChannel) | null\n private opened = false\n\n constructor(appKey: string, options: PersistenceStoreOptions = {}) {\n this.db = new Dexie(`basic:${appKey}`)\n this.db.version(1).stores({ partitions: 'key' })\n this.db.version(2).stores({ partitions: 'key,profileId' }).upgrade((transaction) =>\n transaction.table('partitions').clear())\n this.locks = options.locks === undefined ? browserLocks() : options.locks\n this.createChannel = options.createChannel === undefined\n ? (typeof BroadcastChannel === 'undefined' ? null : browserChannel)\n : options.createChannel\n }\n\n private get partitions(): Table<PartitionRow, string> {\n return this.db.table<PartitionRow, string>('partitions')\n }\n\n async open(): Promise<void> {\n if (this.opened) return\n await cleanupLegacyState()\n await this.db.open()\n this.opened = true\n }\n\n forPartition(partition: StoragePartition): ReplicaStore {\n const key = partitionKey(partition)\n let store = this.stores.get(key)\n if (!store) {\n const channelName = `basic-replica:${this.db.name}:${key}`\n const channel = this.createChannel?.(channelName) ?? null\n const leader = new PartitionCoordinator(channelName, this.locks, channel)\n store = new DexieReplicaStore(this.partitions, { ...partition }, key, leader)\n this.stores.set(key, store)\n }\n return store\n }\n\n async deleteProfile(profileId: string): Promise<void> {\n await this.partitions.where('profileId').equals(profileId).delete()\n for (const [key, store] of this.stores) {\n if (store.partition.profileId !== profileId) continue\n store.leader.close()\n this.stores.delete(key)\n }\n }\n\n close(): void {\n for (const store of this.stores.values()) store.leader.close()\n this.stores.clear()\n if (this.opened) this.db.close()\n this.opened = false\n }\n}\n\n/** Best-effort cleanup of pre-repo-era IndexedDB databases. */\nexport async function cleanupLegacyState(): Promise<void> {\n try {\n const idb = (globalThis as { indexedDB?: IDBFactory }).indexedDB\n if (!idb || typeof idb.databases !== 'function') return\n for (const info of await idb.databases()) {\n if (!info.name?.startsWith('basic-sync:')) continue\n await new Promise<void>((resolve) => {\n const request = idb.deleteDatabase(info.name!)\n request.onsuccess = request.onerror = request.onblocked = () => resolve()\n })\n }\n } catch {\n // Legacy cleanup is deliberately best effort.\n }\n}\n","import type { KeyValueStorage } from '@basictech/core'\n\n/** Synchronous browser Storage adapted to core's key-value contract. */\nexport class BrowserKeyValueStorage implements KeyValueStorage {\n constructor(private readonly storage: Storage) {}\n\n get(key: string): string | null {\n return this.storage.getItem(key)\n }\n\n set(key: string, value: string): void {\n this.storage.setItem(key, value)\n }\n\n remove(key: string): void {\n this.storage.removeItem(key)\n }\n}\n\nexport function browserStorage(\n name: 'localStorage' | 'sessionStorage',\n): BrowserKeyValueStorage | null {\n try {\n const storage = globalThis[name]\n return storage ? new BrowserKeyValueStorage(storage) : null\n } catch {\n return null\n }\n}\n","import type { KeyValueStorage, TokenSet, TokenStore } from '@basictech/core'\n\nconst ACCESS_TOKEN_ADOPTION_TIMEOUT_MS = 100\n\ninterface MemoryAccessToken {\n value: string\n expiresAt: number\n refreshToken: string\n}\n\ninterface AccessWaiter {\n refreshToken: string\n resolve(access: MemoryAccessToken | null): void\n}\n\ntype PersistedTokenSet = Omit<TokenSet, 'access_token' | 'expires_at'>\n\nfunction parseTokens(value: string | null): Partial<TokenSet> | null {\n if (!value) return null\n try {\n const parsed = JSON.parse(value) as Partial<TokenSet>\n return parsed && typeof parsed === 'object' ? parsed : null\n } catch {\n return null\n }\n}\n\n/**\n * Browser token policy: refresh tokens survive reloads in the supplied\n * persistent store; access tokens exist only in this JavaScript realm.\n */\nexport class BrowserTokenStore implements TokenStore {\n private readonly accessTokens = new Map<string, MemoryAccessToken>()\n private readonly accessWaiters = new Map<string, AccessWaiter[]>()\n\n constructor(private readonly persistent: KeyValueStorage) {}\n\n async get(key: string): Promise<string | null> {\n const persisted = parseTokens(await this.persistent.get(key))\n if (!persisted?.refresh_token || typeof persisted.token_type !== 'string') return null\n const refreshToken = persisted.refresh_token\n let access = this.accessTokens.get(key)\n if (access && access.refreshToken !== refreshToken) {\n access = await this.waitForAccessToken(key, refreshToken) ?? undefined\n }\n return JSON.stringify({\n ...persisted,\n access_token: access?.refreshToken === refreshToken ? access.value : '',\n expires_at: access?.refreshToken === refreshToken ? access.expiresAt : 0,\n token_type: persisted.token_type,\n refresh_token: refreshToken,\n } satisfies TokenSet)\n }\n\n async set(key: string, value: string): Promise<void> {\n const tokens = parseTokens(value)\n if (!tokens?.refresh_token || typeof tokens.access_token !== 'string' ||\n typeof tokens.token_type !== 'string') {\n throw new TypeError('invalid token set')\n }\n this.accessTokens.set(key, {\n value: tokens.access_token,\n expiresAt: tokens.expires_at ?? 0,\n refreshToken: tokens.refresh_token,\n })\n const { access_token: _accessToken, expires_at: _expiresAt, ...persisted } = tokens\n await this.persistent.set(key, JSON.stringify(persisted satisfies Partial<PersistedTokenSet>))\n this.resolveAccessWaiters(key)\n }\n\n async remove(key: string): Promise<void> {\n this.accessTokens.delete(key)\n for (const waiter of this.accessWaiters.get(key) ?? []) waiter.resolve(null)\n this.accessWaiters.delete(key)\n await this.persistent.remove(key)\n }\n\n accessToken(key: string): MemoryAccessToken | null {\n return this.accessTokens.get(key) ?? null\n }\n\n async adoptAccessToken(\n key: string,\n value: string,\n expiresAt: number,\n refreshToken: string,\n ): Promise<void> {\n if (!value) return\n const persisted = parseTokens(await this.persistent.get(key))\n if (persisted?.refresh_token !== refreshToken) return\n this.accessTokens.set(key, { value, expiresAt, refreshToken })\n this.resolveAccessWaiters(key)\n }\n\n private resolveAccessWaiters(key: string): void {\n const access = this.accessTokens.get(key)\n if (!access) return\n const waiting = this.accessWaiters.get(key) ?? []\n const remaining = waiting.filter((waiter) => {\n if (waiter.refreshToken !== access.refreshToken) return true\n waiter.resolve(access)\n return false\n })\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n }\n\n private waitForAccessToken(key: string, refreshToken: string): Promise<MemoryAccessToken | null> {\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout>\n const waiter: AccessWaiter = {\n refreshToken,\n resolve: (access) => {\n clearTimeout(timer)\n resolve(access)\n },\n }\n const waiters = this.accessWaiters.get(key) ?? []\n waiters.push(waiter)\n this.accessWaiters.set(key, waiters)\n timer = setTimeout(() => {\n const remaining = (this.accessWaiters.get(key) ?? [])\n .filter((candidate) => candidate !== waiter)\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n resolve(null)\n }, ACCESS_TOKEN_ADOPTION_TIMEOUT_MS)\n })\n }\n}\n","import {\n BasicError,\n type UploadTransportAdapter,\n type UploadTransportRequest,\n} from '@basictech/core'\n\nfunction responseHeaders(xhr: XMLHttpRequest): Headers {\n const headers = new Headers()\n for (const line of xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/)) {\n if (!line) continue\n const separator = line.indexOf(':')\n if (separator > 0) headers.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n }\n return headers\n}\n\n/** Browser multipart transport with upload progress, adapted from the Drive UI. */\nexport const browserUploadTransport: UploadTransportAdapter = {\n upload(request: UploadTransportRequest): Promise<Response> {\n if (typeof XMLHttpRequest === 'undefined') {\n return Promise.reject(new BasicError('XHR_UNAVAILABLE'))\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n let settled = false\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n if (request.signal) request.signal.removeEventListener('abort', abort)\n callback()\n }\n const abort = () => xhr.abort()\n\n xhr.open('POST', request.url)\n if (request.accessToken) xhr.setRequestHeader('authorization', `Bearer ${request.accessToken}`)\n xhr.setRequestHeader('idempotency-key', request.idempotencyKey)\n if (request.onProgress) {\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) request.onProgress?.(event.loaded, event.total)\n }\n }\n if (request.signal) {\n if (request.signal.aborted) {\n reject(request.signal.reason ?? new DOMException('Aborted', 'AbortError'))\n return\n }\n request.signal.addEventListener('abort', abort, { once: true })\n }\n xhr.onload = () => finish(() => resolve(new Response(xhr.responseText || null, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: responseHeaders(xhr),\n })))\n xhr.onerror = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload could not reach the server')))\n xhr.onabort = () => finish(() => reject(request.signal?.reason ?? new DOMException('Aborted', 'AbortError')))\n xhr.ontimeout = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload timed out')))\n\n const form = new FormData()\n form.append('path', request.path)\n if (request.name !== undefined) form.append('name', request.name)\n if (request.mtime !== undefined) form.append('mtime', String(request.mtime))\n form.append('file', request.file, request.filename)\n xhr.send(form)\n })\n },\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\nimport { BasicClientContext } from './context'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\n\ninterface ProviderChildrenProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport type BasicProviderProps<S extends BasicSchema = BasicSchema> = ProviderChildrenProps & (\n | { client: BasicClient<S> }\n | (BrowserBasicConfig<S> & { client?: never })\n)\n\ninterface ClientLifecycle {\n references: number\n start: Promise<void> | null\n stopTimer: ReturnType<typeof setTimeout> | null\n}\n\nconst clientLifecycles = new WeakMap<BasicClient<BasicSchema>, ClientLifecycle>()\n\nfunction retainClient(client: BasicClient<BasicSchema>): {\n started: Promise<void>\n release: () => void\n} {\n let lifecycle = clientLifecycles.get(client)\n if (!lifecycle) {\n lifecycle = { references: 0, start: null, stopTimer: null }\n clientLifecycles.set(client, lifecycle)\n }\n lifecycle.references += 1\n if (lifecycle.stopTimer) {\n clearTimeout(lifecycle.stopTimer)\n lifecycle.stopTimer = null\n }\n lifecycle.start ??= Promise.resolve(client.start()).catch((error: unknown) => {\n lifecycle!.start = null\n throw error\n })\n\n let released = false\n return {\n started: lifecycle.start,\n release: () => {\n if (released) return\n released = true\n lifecycle!.references = Math.max(0, lifecycle!.references - 1)\n if (lifecycle!.references > 0 || lifecycle!.stopTimer) return\n lifecycle!.stopTimer = setTimeout(() => {\n lifecycle!.stopTimer = null\n if (lifecycle!.references > 0) return\n const started = lifecycle!.start ?? Promise.resolve()\n void started.catch(() => {}).then(() => {\n if (lifecycle!.references > 0) return\n client.stop()\n lifecycle!.start = null\n })\n }, 0)\n },\n }\n}\n\n/** Generic provider for schema-less or explicitly generic applications. */\nexport function BasicProvider<S extends BasicSchema = BasicSchema>(props: BasicProviderProps<S>) {\n const clientRef = useRef<BasicClient<S> | null>(null)\n if (!clientRef.current) {\n if ('client' in props && props.client) {\n clientRef.current = props.client\n } else {\n const { children: _children, renderWhileLoading: _renderWhileLoading, ...config } = props\n clientRef.current = createBasicClient(config as BrowserBasicConfig<S>)\n }\n }\n const client = clientRef.current\n const [startError, setStartError] = useState<unknown>(null)\n\n useEffect(() => {\n let active = true\n const retained = retainClient(client as BasicClient<BasicSchema>)\n void retained.started.catch((error: unknown) => {\n if (active) setStartError(error)\n })\n return () => {\n active = false\n retained.release()\n }\n }, [client])\n\n const snapshot = useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n if (startError) throw startError\n\n return (\n <BasicClientContext.Provider value={client as BasicClient<BasicSchema>}>\n {(snapshot.isReady || props.renderWhileLoading) && props.children}\n </BasicClientContext.Provider>\n )\n}\n","import { createContext } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\n\nexport const BasicClientContext = createContext<BasicClient<BasicSchema> | null>(null)\n","import { useCallback, useMemo } from 'react'\nimport type { BasicClient, BasicProfile, BasicSchema } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAccountsResult {\n accounts: BasicProfile[]\n active: BasicProfile | null\n switchAccount(id: string): Promise<void>\n addAccount(): Promise<BasicProfile>\n removeAccount(id: string): Promise<void>\n}\n\nexport function useAccountsFor<S extends BasicSchema>(client: BasicClient<S>): UseAccountsResult {\n const snapshot = useClientSnapshot(client)\n const switchAccount = useCallback((id: string) => client.switchAccount(id), [client])\n const addAccount = useCallback(() => client.addAccount(), [client])\n const removeAccount = useCallback((id: string) => client.removeAccount(id), [client])\n\n return useMemo(() => ({\n accounts: snapshot.profiles,\n active: snapshot.activeProfile,\n switchAccount,\n addAccount,\n removeAccount,\n }), [snapshot.profiles, snapshot.activeProfile, switchAccount, addAccount, removeAccount])\n}\n\nexport function useAccounts(): UseAccountsResult {\n return useAccountsFor(useRequiredClient())\n}\n","import { useContext, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport {\n BasicError,\n type BasicClient,\n type BasicClientSnapshot,\n type BasicSchema,\n} from '@basictech/core'\nimport { BasicClientContext } from '../context'\n\nexport interface AsyncResult<T> {\n data: T\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useRequiredClient<S extends BasicSchema = BasicSchema>(): BasicClient<S> {\n const client = useContext(BasicClientContext)\n if (!client) throw new Error('Basic hooks must be used within a <BasicProvider>')\n return client as unknown as BasicClient<S>\n}\n\nexport function useClientSnapshot<S extends BasicSchema>(\n client: BasicClient<S>,\n): BasicClientSnapshot {\n return useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n}\n\nexport function toBasicError(error: unknown, fallback = 'UNKNOWN_ERROR'): BasicError {\n if (error instanceof BasicError) return error\n return new BasicError(fallback, error instanceof Error ? error.message : String(error))\n}\n\nexport function useAsyncResult<T>(\n load: () => Promise<T>,\n initialData: T,\n enabled: boolean,\n settled: boolean,\n dependencies: readonly unknown[],\n): AsyncResult<T> {\n const loadRef = useRef(load)\n loadRef.current = load\n const [refreshVersion, setRefreshVersion] = useState(0)\n const [state, setState] = useState<Omit<AsyncResult<T>, 'refresh'>>({\n data: initialData,\n isLoading: !settled || enabled,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!enabled) {\n setState({ data: initialData, isLoading: !settled, error: null })\n return () => {\n active = false\n }\n }\n setState((current) => ({ ...current, isLoading: true, error: null }))\n void loadRef.current().then(\n (data) => {\n if (active) setState({ data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setState((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error),\n }))\n },\n )\n return () => {\n active = false\n }\n // The caller supplies semantic dependencies; load identity is held in a ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, settled, refreshVersion, ...dependencies])\n\n return {\n ...state,\n refresh: () => setRefreshVersion((version) => version + 1),\n }\n}\n","import { useCallback, useMemo } from 'react'\nimport {\n BasicError,\n type AuthStatus,\n type AuthUser,\n type BasicClient,\n type BasicSchema,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAuthResult {\n isReady: boolean\n isSignedIn: boolean\n isAnonymous: boolean\n status: AuthStatus\n error: BasicError | null\n user: AuthUser | null\n did: string | null\n handle: string | null\n signIn(input?: string): Promise<void>\n signOut(): Promise<void>\n getToken(): Promise<string>\n}\n\nexport function useAuthFor<S extends BasicSchema>(client: BasicClient<S>): UseAuthResult {\n const snapshot = useClientSnapshot(client)\n const signIn = useCallback((input?: string) => client.signIn(input), [client])\n const signOut = useCallback(() => client.signOut(), [client])\n const getToken = useCallback(() => client.getToken(), [client])\n\n return useMemo(() => ({\n isReady: snapshot.isReady,\n isSignedIn: snapshot.isSignedIn,\n isAnonymous: snapshot.isAnonymous,\n status: snapshot.authStatus,\n error: snapshot.authErrorCode ? new BasicError(snapshot.authErrorCode) : null,\n user: snapshot.user,\n did: snapshot.did,\n handle: snapshot.handle,\n signIn,\n signOut,\n getToken,\n }), [snapshot, signIn, signOut, getToken])\n}\n\nexport function useAuth(): UseAuthResult {\n return useAuthFor(useRequiredClient())\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n InferValue,\n JsonObject,\n MountViewerFiles,\n OwnerFiles,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { useRequiredClient } from './client'\n\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n}\n\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return useRequiredClient<S>().db(source)\n}\n\nexport function useCollectionFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n name: T,\n options: { source?: SourceRef } = {},\n): Collection<InferValue<S, T> & JsonObject> {\n return client.db(options.source ?? 'default').collection(name)\n}\n\nexport function useCollection<V extends JsonObject = JsonObject>(\n name: string,\n options: { source?: SourceRef } = {},\n): Collection<V> {\n return useRequiredClient().db(options.source ?? 'default').collection<V>(name)\n}\n","import { useCallback, useMemo } from 'react'\nimport type { BasicClient, BasicSchema, JsonObject, Repo } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseReposResult {\n repos: Repo[]\n defaultRepoId: string | null\n refresh(): Promise<Repo[]>\n create(input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }): Promise<Repo>\n archive(repoId: string): Promise<void>\n}\n\nexport function useReposFor<S extends BasicSchema>(client: BasicClient<S>): UseReposResult {\n const snapshot = useClientSnapshot(client)\n const refresh = useCallback(() => client.refreshRepos(), [client])\n const create = useCallback((input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }) => client.createRepo(input), [client])\n const archive = useCallback((repoId: string) => client.archiveRepo(repoId), [client])\n\n return useMemo(() => ({\n repos: snapshot.repos,\n defaultRepoId: snapshot.defaultRepoId,\n refresh,\n create,\n archive,\n }), [snapshot.repos, snapshot.defaultRepoId, refresh, create, archive])\n}\n\nexport function useRepos(): UseReposResult {\n return useReposFor(useRequiredClient())\n}\n","import { useCallback, useMemo } from 'react'\nimport type {\n BasicClient,\n BasicConflict,\n BasicRejection,\n BasicSchema,\n BasicSyncStatus,\n SchemaStatus,\n SourceRef,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseSyncStatusResult {\n status: BasicSyncStatus\n pendingCount: number\n rejected: BasicRejection[]\n conflicts: BasicConflict[]\n resolveConflict(opId: string, choice: 'keep-mine' | 'keep-theirs'): Promise<boolean>\n discardRejected(opId: string): Promise<boolean>\n}\n\nexport function useSyncStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: SourceRef,\n): UseSyncStatusResult {\n const snapshot = useClientSnapshot(client)\n const sourceKey = JSON.stringify(source)\n const resolveConflict = useCallback(\n (opId: string, choice: 'keep-mine' | 'keep-theirs') =>\n client.resolveConflict(opId, choice, source ?? 'default'),\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const discardRejected = useCallback(\n (opId: string) => client.discardRejected(opId, source ?? 'default'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n\n return useMemo(() => ({\n status: source === undefined ? snapshot.syncStatus : client.status(source),\n pendingCount: client.pending(source).length,\n rejected: client.rejected(source),\n conflicts: client.conflicts(source),\n resolveConflict,\n discardRejected,\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [client, snapshot, sourceKey, resolveConflict, discardRejected])\n}\n\nexport function useSyncStatus(source?: SourceRef): UseSyncStatusResult {\n return useSyncStatusFor(useRequiredClient(), source)\n}\n\nexport function useSchemaStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): SchemaStatus {\n useClientSnapshot(client)\n return client.schemaStatus(source)\n}\n\nexport function useSchemaStatus(source: SourceRef = 'default'): SchemaStatus {\n return useSchemaStatusFor(useRequiredClient(), source)\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Repo,\n} from '@basictech/core'\nimport { useAccountsFor, type UseAccountsResult } from './accounts'\nimport { useAuthFor, type UseAuthResult } from './auth'\nimport { useRequiredClient } from './client'\nimport { useDbFor } from './db'\nimport { useReposFor } from './repos'\nimport { useSyncStatusFor, type UseSyncStatusResult } from './status'\n\nexport interface UseBasicResult<S extends BasicSchema = BasicSchema> extends UseAuthResult {\n client: BasicClient<S>\n db: BasicDb<S>\n accounts: UseAccountsResult\n sync: UseSyncStatusResult\n repos: Repo[]\n}\n\nexport function useBasicFor<S extends BasicSchema>(client: BasicClient<S>): UseBasicResult<S> {\n const auth = useAuthFor(client)\n const accounts = useAccountsFor(client)\n const sync = useSyncStatusFor(client)\n const repos = useReposFor(client)\n return {\n ...auth,\n client,\n db: useDbFor(client),\n accounts,\n sync,\n repos: repos.repos,\n }\n}\n\nexport function useBasic<S extends BasicSchema = BasicSchema>(): UseBasicResult<S> {\n return useBasicFor(useRequiredClient<S>())\n}\n","import { useMemo, useSyncExternalStore } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n FileListQuery,\n FileRecord,\n MountFileInfo,\n SourceRef,\n StorageInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient } from './client'\n\nconst zero = () => 0\n\nexport interface UseFilesResult {\n data: Array<FileRecord | MountFileInfo>\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useFilesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, '_files'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const version = useSyncExternalStore(subscription.subscribe, subscription.getSnapshot, zero)\n return useAsyncResult(\n async () => {\n const files = client.db(source).files\n if (source !== 'default' && 'mountId' in source) {\n const page = await files.list({\n ...(query.prefix !== undefined ? { prefix: query.prefix } : {}),\n ...(query.limit !== undefined ? { limit: query.limit } : {}),\n ...(query.cursor !== undefined ? { cursor: query.cursor } : {}),\n })\n return page.data\n }\n return (await files.list(query)).data\n },\n [],\n snapshot.isReady,\n snapshot.isReady,\n [sourceKey, queryKey, version, snapshot.activeProfile?.id],\n )\n}\n\nexport function useFiles(\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n return useFilesFor(useRequiredClient(), query, options)\n}\n\nexport interface UseStorageInfoResult {\n data: StorageInfo | null\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useStorageInfoFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseStorageInfoResult {\n const snapshot = useClientSnapshot(client)\n return useAsyncResult(\n () => client.storageInfo(client.resolveRepoId()),\n null,\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeProfile?.id],\n )\n}\n\nexport function useStorageInfo(): UseStorageInfoResult {\n return useStorageInfoFor(useRequiredClient())\n}\n","import { useCallback } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n CreateOutgoingShareInput,\n MountHandle,\n MountInfo,\n MountsQuery,\n OutgoingShareInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseMountsResult<S extends BasicSchema = BasicSchema> {\n data: MountInfo[]\n mounts: MountInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n open(mountId: string): Promise<MountHandle<S>>\n manageUrl(): string\n}\n\nexport function useMountsFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: MountsQuery = {},\n): UseMountsResult<S> {\n const snapshot = useClientSnapshot(client)\n const queryKey = JSON.stringify(query)\n const result = useAsyncResult(\n () => client.shares.mounts(query),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [queryKey, snapshot.activeProfile?.id],\n )\n const open = useCallback(\n (mountId: string) => client.shares.mount(mountId),\n [client],\n )\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n const { data: mounts, ...state } = result\n return { data: mounts, mounts, ...state, open, manageUrl }\n}\n\nexport function useMounts(query: MountsQuery = {}): UseMountsResult {\n return useMountsFor(useRequiredClient(), query)\n}\n\nexport interface UseOutgoingSharesResult {\n data: OutgoingShareInfo[]\n outgoingShares: OutgoingShareInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n create(input: CreateOutgoingShareInput): Promise<OutgoingShareInfo>\n get(id: string): Promise<OutgoingShareInfo>\n cancel(id: string): Promise<OutgoingShareInfo>\n revoke(id: string): Promise<OutgoingShareInfo>\n getContactHandle(did: string): Promise<string | null>\n manageUrl(): string\n}\n\nexport function useOutgoingSharesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseOutgoingSharesResult {\n const snapshot = useClientSnapshot(client)\n const result = useAsyncResult(\n () => client.shares.listOutgoing(),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeProfile?.id],\n )\n const create = useCallback((input: CreateOutgoingShareInput) =>\n client.shares.createOutgoing(input), [client])\n const get = useCallback((id: string) => client.shares.getOutgoing(id), [client])\n const cancel = useCallback((id: string) => client.shares.cancel(id), [client])\n const revoke = useCallback((id: string) => client.shares.revoke(id), [client])\n const getContactHandle = useCallback((did: string) => client.shares.getContactHandle(did), [client])\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n const { data: outgoingShares, ...state } = result\n return {\n data: outgoingShares,\n outgoingShares,\n ...state,\n create,\n get,\n cancel,\n revoke,\n getContactHandle,\n manageUrl,\n }\n}\n\nexport function useOutgoingShares(): UseOutgoingSharesResult {\n return useOutgoingSharesFor(useRequiredClient())\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport {\n type BasicClient,\n type BasicRecord,\n type BasicSchema,\n type InferValue,\n type JsonObject,\n type Query,\n type SourceRef,\n type TableNames,\n} from '@basictech/core'\nimport { toBasicError, useClientSnapshot, useRequiredClient } from './client'\nimport type { BasicError } from '@basictech/core'\n\nconst subscribeNever = () => () => {}\nconst zero = () => 0\n\nexport interface UseQueryResult<V extends JsonObject> {\n data: BasicRecord<V>[]\n isLoading: boolean\n error: BasicError | null\n}\n\nexport function useQueryValueFor<\n S extends BasicSchema,\n V extends JsonObject,\n>(\n client: BasicClient<S>,\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, collection),\n // sourceKey captures semantic source identity rather than object identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey, collection],\n )\n const version = useSyncExternalStore(\n subscription?.subscribe ?? subscribeNever,\n subscription?.getSnapshot ?? zero,\n zero,\n )\n const [result, setResult] = useState<UseQueryResult<V>>({\n data: [],\n isLoading: true,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!snapshot.isReady) {\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n return () => {\n active = false\n }\n }\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n const collectionApi = client.db(source).collection<V>(collection)\n const list = collectionApi.list as unknown as (\n value: Query<V>,\n ) => Promise<{ data: BasicRecord<V>[] }>\n void list.call(collectionApi, query).then(\n (page) => {\n if (active) setResult({ data: page.data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setResult((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error, 'QUERY_FAILED'),\n }))\n },\n )\n return () => {\n active = false\n }\n // source and query are represented by their stable semantic keys.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, collection, sourceKey, queryKey, version, snapshot.isReady])\n\n return result\n}\n\nexport function useQueryFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n collection: T,\n query: Query<InferValue<S, T> & JsonObject> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<InferValue<S, T> & JsonObject> {\n return useQueryValueFor(client, collection, query, options)\n}\n\nexport function useQuery<V extends JsonObject = JsonObject>(\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n return useQueryValueFor(useRequiredClient(), collection, query, options)\n}\n","import type { ReactElement, ReactNode } from 'react'\nimport type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n FileListQuery,\n InferValue,\n JsonObject,\n MountViewerFiles,\n MountsQuery,\n OwnerFiles,\n Query,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\nimport { BasicProvider } from './provider'\nimport { useAccountsFor, type UseAccountsResult } from './hooks/accounts'\nimport { useAuthFor, type UseAuthResult } from './hooks/auth'\nimport { useBasicFor, type UseBasicResult } from './hooks/basic'\nimport { useCollectionFor } from './hooks/db'\nimport {\n useFilesFor,\n useStorageInfoFor,\n type UseFilesResult,\n type UseStorageInfoResult,\n} from './hooks/files'\nimport {\n useMountsFor,\n useOutgoingSharesFor,\n type UseMountsResult,\n type UseOutgoingSharesResult,\n} from './hooks/mounts'\nimport { useQueryFor, type UseQueryResult } from './hooks/query'\nimport { useReposFor, type UseReposResult } from './hooks/repos'\nimport { useSchemaStatusFor, useSyncStatusFor, type UseSyncStatusResult } from './hooks/status'\nimport type { SchemaStatus } from '@basictech/core'\n\nexport type CreateBasicConfig<S extends BasicSchema> = BrowserBasicConfig<S> & { schema: S }\n\nexport interface BoundBasicProviderProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport interface CreatedBasic<S extends BasicSchema> {\n client: BasicClient<S>\n Provider(props: BoundBasicProviderProps): ReactElement\n useBasic(): UseBasicResult<S>\n useAuth(): UseAuthResult\n useAccounts(): UseAccountsResult\n useDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n useDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n useDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n useCollection<T extends TableNames<S>>(\n name: T,\n options?: { source?: SourceRef },\n ): Collection<InferValue<S, T> & JsonObject>\n useQuery<T extends TableNames<S>>(\n collection: T,\n query?: Query<InferValue<S, T> & JsonObject>,\n options?: { source?: SourceRef },\n ): UseQueryResult<InferValue<S, T> & JsonObject>\n useSyncStatus(source?: SourceRef): UseSyncStatusResult\n useSchemaStatus(source?: SourceRef): SchemaStatus\n useRepos(): UseReposResult\n useFiles(query?: FileListQuery, options?: { source?: SourceRef }): UseFilesResult\n useStorageInfo(): UseStorageInfoResult\n useMounts(query?: MountsQuery): UseMountsResult<S>\n useOutgoingShares(): UseOutgoingSharesResult\n}\n\n/** Create one browser client and a complete hook surface bound to its schema. */\nexport function createBasic<const S extends BasicSchema>(config: CreateBasicConfig<S>): CreatedBasic<S> {\n const client = createBasicClient(config)\n\n function Provider({ children, renderWhileLoading }: BoundBasicProviderProps) {\n return (\n <BasicProvider client={client} renderWhileLoading={renderWhileLoading}>\n {children}\n </BasicProvider>\n )\n }\n\n function useBoundDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n function useBoundDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n function useBoundDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n function useBoundDb(\n source: SourceRef = 'default',\n ): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n }\n\n return {\n client,\n Provider,\n useBasic: () => useBasicFor(client),\n useAuth: () => useAuthFor(client),\n useAccounts: () => useAccountsFor(client),\n useDb: useBoundDb,\n useCollection: (name, options = {}) => useCollectionFor(client, name, options),\n useQuery: (collection, query = {}, options = {}) =>\n useQueryFor(client, collection, query, options),\n useSyncStatus: (source) => useSyncStatusFor(client, source),\n useSchemaStatus: (source = 'default') => useSchemaStatusFor(client, source),\n useRepos: () => useReposFor(client),\n useFiles: (query = {}, options = {}) => useFilesFor(client, query, options),\n useStorageInfo: () => useStorageInfoFor(client),\n useMounts: (query = {}) => useMountsFor(client, query),\n useOutgoingShares: () => useOutgoingSharesFor(client),\n }\n}\n"],"mappings":"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","names":["BasicError","BasicError","useEffect","useRef","useState","useSyncExternalStore","BasicError","useSyncExternalStore","BasicError","useRef","useState","useEffect","useCallback","useMemo","BasicError","useCallback","useMemo","BasicError","useCallback","useMemo","useCallback","useMemo","useCallback","useMemo","useCallback","useMemo","useMemo","useSyncExternalStore","useMemo","useSyncExternalStore","useCallback","useCallback","useEffect","useMemo","useState","useSyncExternalStore","zero","useMemo","useSyncExternalStore","useState","useEffect","jsx"]}
1
+ {"version":3,"sources":["../src/create-client.ts","../src/adapters/broadcast-channel.ts","../src/adapters/navigation.ts","../src/adapters/persistence.ts","../src/adapters/storage.ts","../src/adapters/token-store.ts","../src/adapters/upload.ts","../src/provider.tsx","../src/context.ts","../src/hooks/accounts.ts","../src/hooks/client.ts","../src/hooks/auth.ts","../src/hooks/db.ts","../src/hooks/repos.ts","../src/hooks/status.ts","../src/hooks/basic.ts","../src/hooks/files.ts","../src/hooks/mounts.ts","../src/hooks/query.ts","../src/create-basic.tsx"],"sourcesContent":["import {\n MemoryKeyValueStorage,\n MemoryReplicaStoreFactory,\n createBasicClient as createCoreClient,\n type BasicClient,\n type BasicConfig,\n type BasicSchema,\n} from '@basictech/core'\nimport { createBrowserAuthChannelFactory } from './adapters/broadcast-channel'\nimport { browserCurrentUrl, browserNavigate, browserReplaceUrl } from './adapters/navigation'\nimport { PersistenceStore } from './adapters/persistence'\nimport { browserStorage } from './adapters/storage'\nimport { BrowserTokenStore } from './adapters/token-store'\nimport { browserUploadTransport } from './adapters/upload'\n\nexport type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>\n\nfunction browserReconcileTrigger(listener: () => void): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n const onVisible = () => {\n if (document.visibilityState === 'visible') listener()\n }\n window.addEventListener('focus', listener)\n window.addEventListener('online', listener)\n document.addEventListener('visibilitychange', onVisible)\n return () => {\n window.removeEventListener('focus', listener)\n window.removeEventListener('online', listener)\n document.removeEventListener('visibilitychange', onVisible)\n }\n}\n\n/** Create a core client with the complete browser adapter set installed. */\nexport function createBasicClient<S extends BasicSchema>(\n config: BrowserBasicConfig<S>,\n): BasicClient<S> {\n const local = browserStorage('localStorage') ?? new MemoryKeyValueStorage()\n const session = browserStorage('sessionStorage') ?? new MemoryKeyValueStorage()\n const defaultTokenStore = config.tokenStore ? null : new BrowserTokenStore(local)\n const canBroadcast = typeof BroadcastChannel !== 'undefined'\n const canPersistReplica = typeof indexedDB !== 'undefined'\n\n return createCoreClient({\n ...config,\n kv: config.kv ?? local,\n tokenStore: config.tokenStore ?? defaultTokenStore!,\n sessionStorage: config.sessionStorage ?? session,\n replicaStore: config.replicaStore ?? (\n canPersistReplica ? new PersistenceStore(config.clientId) : new MemoryReplicaStoreFactory()\n ),\n navigate: config.navigate ?? browserNavigate,\n currentUrl: config.currentUrl ?? browserCurrentUrl,\n replaceUrl: config.replaceUrl ?? browserReplaceUrl,\n reconcileTrigger: config.reconcileTrigger ?? browserReconcileTrigger,\n createMessageChannel: config.createMessageChannel ?? (\n canBroadcast && defaultTokenStore\n ? createBrowserAuthChannelFactory(config.clientId, defaultTokenStore)\n : undefined\n ),\n uploadTransport: config.uploadTransport ?? (\n typeof XMLHttpRequest === 'undefined' ? undefined : browserUploadTransport\n ),\n })\n}\n","import type { AuthMessageChannel } from '@basictech/core'\nimport type { BrowserTokenStore } from './token-store'\n\nexport interface BrowserMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AccessTokenMessage {\n type?: string\n expiresAt?: number\n __basicAccessToken?: string\n __basicRefreshToken?: string\n}\n\n/** Core message-channel adapter backed by the browser BroadcastChannel API. */\nexport function createBrowserMessageChannel(name: string): BrowserMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: BrowserMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Access tokens may cross tabs transiently but are never written to browser\n * storage. The receiving adapter adopts the token before core handles the\n * ordinary token-rotation notification.\n */\nexport function createBrowserAuthChannelFactory(\n clientId: string,\n tokenStore: BrowserTokenStore,\n): (name: string) => AuthMessageChannel {\n const prefix = `basic_auth:${clientId}:`\n return (name) => {\n const channel = createBrowserMessageChannel(name)\n const profileId = name.startsWith(prefix) ? name.slice(prefix.length) : ''\n const tokenKey = `u:${profileId}:basic_tokens`\n const adapter: AuthMessageChannel = {\n postMessage: (message) => {\n const outgoing = message as AccessTokenMessage\n const access = outgoing?.type === 'tokens' ? tokenStore.accessToken(tokenKey) : null\n channel.postMessage(access ? {\n ...outgoing,\n expiresAt: access.expiresAt,\n __basicAccessToken: access.value,\n __basicRefreshToken: access.refreshToken,\n } satisfies AccessTokenMessage : message)\n },\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => {\n void (async () => {\n const incoming = event.data as AccessTokenMessage\n if (incoming?.type === 'tokens' && incoming.__basicAccessToken && incoming.__basicRefreshToken) {\n await tokenStore.adoptAccessToken(\n tokenKey,\n incoming.__basicAccessToken,\n incoming.expiresAt ?? 0,\n incoming.__basicRefreshToken,\n )\n }\n adapter.onmessage?.({ data: event.data })\n })()\n }\n return adapter\n }\n}\n","import { BasicError } from '@basictech/core'\n\nexport function browserNavigate(url: string): void {\n if (typeof location === 'undefined') throw new BasicError('NAVIGATE_ADAPTER_REQUIRED')\n location.assign(url)\n}\n\nexport function browserCurrentUrl(): string {\n return typeof location === 'undefined' ? '' : location.href\n}\n\nexport function browserReplaceUrl(url: string): void {\n if (typeof history !== 'undefined') history.replaceState({}, '', url)\n}\n","import Dexie, { type Table } from 'dexie'\nimport {\n BasicError,\n partitionKey,\n type PersistedReplicaState,\n type PersistenceLeaderHooks,\n type ReplicaStore,\n type ReplicaStoreFactory,\n type StoragePartition,\n type SyncOp,\n} from '@basictech/core'\n\nexport type { PersistedReplicaState, StoragePartition } from '@basictech/core'\n\ninterface PartitionRow {\n key: string\n profileId: string\n state: PersistedReplicaState\n updatedAt: number\n}\n\nexport interface ReplicaMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AvailableLock {\n name: string\n}\n\nexport interface BrowserLockManager {\n request<T>(\n name: string,\n options: { mode?: 'exclusive'; ifAvailable?: true },\n callback: (lock: AvailableLock | null) => T | Promise<T>,\n ): Promise<T>\n}\n\nexport interface PersistenceStoreOptions {\n locks?: BrowserLockManager | null\n createChannel?: ((name: string) => ReplicaMessageChannel) | null\n}\n\ntype CoordinatorMessage =\n | { type: 'mutation'; requestId: string; operation: SyncOp }\n | { type: 'mutation-result'; requestId: string; opId?: string; code?: string; message?: string }\n | { type: 'state'; state: PersistedReplicaState }\n\nfunction browserLocks(): BrowserLockManager | null {\n if (typeof navigator === 'undefined' || !navigator.locks) return null\n return navigator.locks as unknown as BrowserLockManager\n}\n\nfunction browserChannel(name: string): ReplicaMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: ReplicaMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Per-partition single-writer coordinator. With Web Locks, followers forward\n * mutations and consume committed-state broadcasts. Browsers lacking Locks\n * use the documented degraded last-committed-writer-wins mode: every tab may\n * write, the version guard rejects stale commits, and broadcasts refresh\n * surviving views. Concurrent offline intent can be lost in that fallback.\n */\nclass PartitionCoordinator implements PersistenceLeaderHooks {\n private readonly mutationListeners = new Set<(operation: SyncOp) => Promise<string>>()\n private readonly stateListeners = new Set<(state: PersistedReplicaState) => void>()\n private readonly leadershipListeners = new Set<(isLeader: boolean) => void | Promise<void>>()\n private readonly pending = new Map<string, {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n }>()\n private readonly election: Promise<boolean>\n private leadershipReady: Promise<void> = Promise.resolve()\n private releaseLock: (() => void) | null = null\n private leader = true\n private closed = false\n\n constructor(\n name: string,\n locks: BrowserLockManager | null,\n private readonly channel: ReplicaMessageChannel | null,\n ) {\n this.channel && (this.channel.onmessage = (event) => this.receive(event.data))\n if (!locks || !channel) {\n this.election = Promise.resolve(true)\n return\n }\n this.leader = false\n this.election = new Promise<boolean>((resolve) => {\n void locks.request(`basic-replica:${name}`, { ifAvailable: true }, async (lock) => {\n this.setLeader(Boolean(lock))\n resolve(this.leader)\n if (!lock) {\n this.waitForLeadership(locks, name)\n return\n }\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n }).catch(() => {\n this.setLeader(true)\n resolve(true)\n })\n })\n }\n\n async isLeader(): Promise<boolean> {\n await this.election\n await this.leadershipReady\n return this.leader\n }\n\n subscribeLeadership(listener: (isLeader: boolean) => void | Promise<void>): () => void {\n this.leadershipListeners.add(listener)\n return () => this.leadershipListeners.delete(listener)\n }\n\n async forwardMutation(operation: SyncOp): Promise<string> {\n if (await this.isLeader()) return this.dispatchMutation(operation)\n if (this.closed) throw new BasicError('PARTITION_COORDINATOR_CLOSED')\n if (!this.channel) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n const requestId = crypto.randomUUID()\n return new Promise<string>((resolve, reject) => {\n const flight = { operation, resolve, reject, deadline: Date.now() + 10_000 }\n this.pending.set(requestId, flight)\n this.sendPending(requestId, flight)\n })\n }\n\n subscribeMutations(listener: (operation: SyncOp) => Promise<string>): () => void {\n this.mutationListeners.add(listener)\n return () => this.mutationListeners.delete(listener)\n }\n\n publishState(state: PersistedReplicaState): void {\n this.channel?.postMessage({ type: 'state', state } satisfies CoordinatorMessage)\n }\n\n subscribeState(listener: (state: PersistedReplicaState) => void): () => void {\n this.stateListeners.add(listener)\n return () => this.stateListeners.delete(listener)\n }\n\n close(): void {\n this.closed = true\n this.setLeader(false)\n this.releaseLock?.()\n this.releaseLock = null\n this.channel?.close()\n for (const flight of this.pending.values()) {\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(new BasicError('PARTITION_COORDINATOR_CLOSED'))\n }\n this.pending.clear()\n }\n\n private waitForLeadership(locks: BrowserLockManager, name: string): void {\n void locks.request(`basic-replica:${name}`, { mode: 'exclusive' }, async (lock) => {\n if (!lock || this.closed) return\n this.setLeader(true)\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n this.setLeader(false)\n }).catch(() => {\n if (!this.closed) this.setLeader(true)\n })\n }\n\n private setLeader(isLeader: boolean): void {\n if (this.leader === isLeader) return\n this.leader = isLeader\n this.leadershipReady = Promise.all(\n [...this.leadershipListeners].map((listener) => listener(isLeader)),\n ).then(() => {})\n if (isLeader) void this.leadershipReady.then(() => this.drainPending()).catch(() => {})\n }\n\n private receive(value: unknown): void {\n if (this.closed || !value || typeof value !== 'object') return\n const message = value as CoordinatorMessage\n if (message.type === 'state') {\n for (const listener of this.stateListeners) listener(structuredClone(message.state))\n } else if (message.type === 'mutation' && this.leader) {\n void this.leadershipReady.then(() => this.dispatchMutation(message.operation)).then(\n (opId) => this.channel?.postMessage({\n type: 'mutation-result', requestId: message.requestId, opId,\n } satisfies CoordinatorMessage),\n (error: unknown) => this.channel?.postMessage({\n type: 'mutation-result',\n requestId: message.requestId,\n code: error instanceof BasicError ? error.code : 'FORWARDED_MUTATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n } satisfies CoordinatorMessage),\n )\n } else if (message.type === 'mutation-result') {\n const flight = this.pending.get(message.requestId)\n if (!flight) return\n if (!message.opId && (message.code === 'STALE_STATE_VERSION' ||\n message.code === 'PARTITION_LEADER_UNAVAILABLE')) {\n this.sendPending(message.requestId, flight)\n return\n }\n this.pending.delete(message.requestId)\n if (flight.timer) clearTimeout(flight.timer)\n if (message.opId) flight.resolve(message.opId)\n else flight.reject(new BasicError(message.code ?? 'FORWARDED_MUTATION_FAILED', message.message))\n }\n }\n\n private async dispatchMutation(operation: SyncOp): Promise<string> {\n const listener = this.mutationListeners.values().next().value\n if (!listener) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n return listener(operation)\n }\n\n private drainPending(): void {\n for (const [requestId, flight] of this.pending) {\n void this.dispatchMutation(flight.operation).then(\n (opId) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.resolve(opId)\n },\n (error: unknown) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(error instanceof Error ? error : new BasicError('FORWARDED_MUTATION_FAILED'))\n },\n )\n }\n }\n\n private sendPending(\n requestId: string,\n flight: {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n },\n ): void {\n if (this.pending.get(requestId) !== flight) return\n if (flight.timer) clearTimeout(flight.timer)\n const remaining = flight.deadline - Date.now()\n if (remaining <= 0) {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_TIMEOUT'))\n return\n }\n try {\n this.channel?.postMessage({\n type: 'mutation', requestId, operation: flight.operation,\n } satisfies CoordinatorMessage)\n } catch {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_UNAVAILABLE'))\n return\n }\n flight.timer = setTimeout(() => this.sendPending(requestId, flight), Math.min(100, remaining))\n }\n}\n\nclass DexieReplicaStore implements ReplicaStore {\n constructor(\n private readonly table: Table<PartitionRow, string>,\n readonly partition: StoragePartition,\n readonly key: string,\n readonly leader: PartitionCoordinator,\n ) {}\n\n async load(): Promise<PersistedReplicaState | null> {\n return (await this.table.get(this.key))?.state ?? null\n }\n\n async save(state: PersistedReplicaState): Promise<void> {\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new BasicError('INVALID_STATE_VERSION')\n }\n await this.table.db.transaction('rw', this.table, async () => {\n const current = await this.table.get(this.key)\n if ((current?.state.version ?? 0) >= state.version) throw new BasicError('STALE_STATE_VERSION')\n await this.table.put({\n key: this.key,\n profileId: this.partition.profileId,\n state: structuredClone(state),\n updatedAt: Date.now(),\n })\n })\n this.leader.publishState(structuredClone(state))\n }\n\n async delete(): Promise<void> {\n await this.table.delete(this.key)\n }\n}\n\n/** Dexie adapter for core's six-field, version-guarded replica store. */\nexport class PersistenceStore implements ReplicaStoreFactory {\n private readonly db: Dexie\n private readonly stores = new Map<string, DexieReplicaStore>()\n private readonly locks: BrowserLockManager | null\n private readonly createChannel: ((name: string) => ReplicaMessageChannel) | null\n private opened = false\n\n constructor(appKey: string, options: PersistenceStoreOptions = {}) {\n this.db = new Dexie(`basic:${appKey}`)\n this.db.version(1).stores({ partitions: 'key' })\n this.db.version(2).stores({ partitions: 'key,profileId' }).upgrade((transaction) =>\n transaction.table('partitions').clear())\n this.locks = options.locks === undefined ? browserLocks() : options.locks\n this.createChannel = options.createChannel === undefined\n ? (typeof BroadcastChannel === 'undefined' ? null : browserChannel)\n : options.createChannel\n }\n\n private get partitions(): Table<PartitionRow, string> {\n return this.db.table<PartitionRow, string>('partitions')\n }\n\n async open(): Promise<void> {\n if (this.opened) return\n await cleanupLegacyState()\n await this.db.open()\n this.opened = true\n }\n\n forPartition(partition: StoragePartition): ReplicaStore {\n const key = partitionKey(partition)\n let store = this.stores.get(key)\n if (!store) {\n const channelName = `basic-replica:${this.db.name}:${key}`\n const channel = this.createChannel?.(channelName) ?? null\n const leader = new PartitionCoordinator(channelName, this.locks, channel)\n store = new DexieReplicaStore(this.partitions, { ...partition }, key, leader)\n this.stores.set(key, store)\n }\n return store\n }\n\n async deleteProfile(profileId: string): Promise<void> {\n await this.partitions.where('profileId').equals(profileId).delete()\n for (const [key, store] of this.stores) {\n if (store.partition.profileId !== profileId) continue\n store.leader.close()\n this.stores.delete(key)\n }\n }\n\n close(): void {\n for (const store of this.stores.values()) store.leader.close()\n this.stores.clear()\n if (this.opened) this.db.close()\n this.opened = false\n }\n}\n\n/** Best-effort cleanup of pre-repo-era IndexedDB databases. */\nexport async function cleanupLegacyState(): Promise<void> {\n try {\n const idb = (globalThis as { indexedDB?: IDBFactory }).indexedDB\n if (!idb || typeof idb.databases !== 'function') return\n for (const info of await idb.databases()) {\n if (!info.name?.startsWith('basic-sync:')) continue\n await new Promise<void>((resolve) => {\n const request = idb.deleteDatabase(info.name!)\n request.onsuccess = request.onerror = request.onblocked = () => resolve()\n })\n }\n } catch {\n // Legacy cleanup is deliberately best effort.\n }\n}\n","import type { KeyValueStorage } from '@basictech/core'\n\n/** Synchronous browser Storage adapted to core's key-value contract. */\nexport class BrowserKeyValueStorage implements KeyValueStorage {\n constructor(private readonly storage: Storage) {}\n\n get(key: string): string | null {\n return this.storage.getItem(key)\n }\n\n set(key: string, value: string): void {\n this.storage.setItem(key, value)\n }\n\n remove(key: string): void {\n this.storage.removeItem(key)\n }\n}\n\nexport function browserStorage(\n name: 'localStorage' | 'sessionStorage',\n): BrowserKeyValueStorage | null {\n try {\n const storage = globalThis[name]\n return storage ? new BrowserKeyValueStorage(storage) : null\n } catch {\n return null\n }\n}\n","import type { KeyValueStorage, TokenSet, TokenStore } from '@basictech/core'\n\nconst ACCESS_TOKEN_ADOPTION_TIMEOUT_MS = 100\n\ninterface MemoryAccessToken {\n value: string\n expiresAt: number\n refreshToken: string\n}\n\ninterface AccessWaiter {\n refreshToken: string\n resolve(access: MemoryAccessToken | null): void\n}\n\ntype PersistedTokenSet = Omit<TokenSet, 'access_token' | 'expires_at'>\n\nfunction parseTokens(value: string | null): Partial<TokenSet> | null {\n if (!value) return null\n try {\n const parsed = JSON.parse(value) as Partial<TokenSet>\n return parsed && typeof parsed === 'object' ? parsed : null\n } catch {\n return null\n }\n}\n\n/**\n * Browser token policy: refresh tokens survive reloads in the supplied\n * persistent store; access tokens exist only in this JavaScript realm.\n */\nexport class BrowserTokenStore implements TokenStore {\n private readonly accessTokens = new Map<string, MemoryAccessToken>()\n private readonly accessWaiters = new Map<string, AccessWaiter[]>()\n\n constructor(private readonly persistent: KeyValueStorage) {}\n\n async get(key: string): Promise<string | null> {\n const persisted = parseTokens(await this.persistent.get(key))\n if (!persisted?.refresh_token || typeof persisted.token_type !== 'string') return null\n const refreshToken = persisted.refresh_token\n let access = this.accessTokens.get(key)\n if (access && access.refreshToken !== refreshToken) {\n access = await this.waitForAccessToken(key, refreshToken) ?? undefined\n }\n return JSON.stringify({\n ...persisted,\n access_token: access?.refreshToken === refreshToken ? access.value : '',\n expires_at: access?.refreshToken === refreshToken ? access.expiresAt : 0,\n token_type: persisted.token_type,\n refresh_token: refreshToken,\n } satisfies TokenSet)\n }\n\n async set(key: string, value: string): Promise<void> {\n const tokens = parseTokens(value)\n if (!tokens?.refresh_token || typeof tokens.access_token !== 'string' ||\n typeof tokens.token_type !== 'string') {\n throw new TypeError('invalid token set')\n }\n this.accessTokens.set(key, {\n value: tokens.access_token,\n expiresAt: tokens.expires_at ?? 0,\n refreshToken: tokens.refresh_token,\n })\n const { access_token: _accessToken, expires_at: _expiresAt, ...persisted } = tokens\n await this.persistent.set(key, JSON.stringify(persisted satisfies Partial<PersistedTokenSet>))\n this.resolveAccessWaiters(key)\n }\n\n async remove(key: string): Promise<void> {\n this.accessTokens.delete(key)\n for (const waiter of this.accessWaiters.get(key) ?? []) waiter.resolve(null)\n this.accessWaiters.delete(key)\n await this.persistent.remove(key)\n }\n\n accessToken(key: string): MemoryAccessToken | null {\n return this.accessTokens.get(key) ?? null\n }\n\n async adoptAccessToken(\n key: string,\n value: string,\n expiresAt: number,\n refreshToken: string,\n ): Promise<void> {\n if (!value) return\n const persisted = parseTokens(await this.persistent.get(key))\n if (persisted?.refresh_token !== refreshToken) return\n this.accessTokens.set(key, { value, expiresAt, refreshToken })\n this.resolveAccessWaiters(key)\n }\n\n private resolveAccessWaiters(key: string): void {\n const access = this.accessTokens.get(key)\n if (!access) return\n const waiting = this.accessWaiters.get(key) ?? []\n const remaining = waiting.filter((waiter) => {\n if (waiter.refreshToken !== access.refreshToken) return true\n waiter.resolve(access)\n return false\n })\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n }\n\n private waitForAccessToken(key: string, refreshToken: string): Promise<MemoryAccessToken | null> {\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout>\n const waiter: AccessWaiter = {\n refreshToken,\n resolve: (access) => {\n clearTimeout(timer)\n resolve(access)\n },\n }\n const waiters = this.accessWaiters.get(key) ?? []\n waiters.push(waiter)\n this.accessWaiters.set(key, waiters)\n timer = setTimeout(() => {\n const remaining = (this.accessWaiters.get(key) ?? [])\n .filter((candidate) => candidate !== waiter)\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n resolve(null)\n }, ACCESS_TOKEN_ADOPTION_TIMEOUT_MS)\n })\n }\n}\n","import {\n BasicError,\n type UploadTransportAdapter,\n type UploadTransportRequest,\n} from '@basictech/core'\n\nfunction responseHeaders(xhr: XMLHttpRequest): Headers {\n const headers = new Headers()\n for (const line of xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/)) {\n if (!line) continue\n const separator = line.indexOf(':')\n if (separator > 0) headers.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n }\n return headers\n}\n\n/** Browser multipart transport with upload progress, adapted from the Drive UI. */\nexport const browserUploadTransport: UploadTransportAdapter = {\n upload(request: UploadTransportRequest): Promise<Response> {\n if (typeof XMLHttpRequest === 'undefined') {\n return Promise.reject(new BasicError('XHR_UNAVAILABLE'))\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n let settled = false\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n if (request.signal) request.signal.removeEventListener('abort', abort)\n callback()\n }\n const abort = () => xhr.abort()\n\n xhr.open('POST', request.url)\n if (request.accessToken) xhr.setRequestHeader('authorization', `Bearer ${request.accessToken}`)\n xhr.setRequestHeader('idempotency-key', request.idempotencyKey)\n if (request.onProgress) {\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) request.onProgress?.(event.loaded, event.total)\n }\n }\n if (request.signal) {\n if (request.signal.aborted) {\n reject(request.signal.reason ?? new DOMException('Aborted', 'AbortError'))\n return\n }\n request.signal.addEventListener('abort', abort, { once: true })\n }\n xhr.onload = () => finish(() => resolve(new Response(xhr.responseText || null, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: responseHeaders(xhr),\n })))\n xhr.onerror = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload could not reach the server')))\n xhr.onabort = () => finish(() => reject(request.signal?.reason ?? new DOMException('Aborted', 'AbortError')))\n xhr.ontimeout = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload timed out')))\n\n const form = new FormData()\n form.append('path', request.path)\n if (request.name !== undefined) form.append('name', request.name)\n if (request.mtime !== undefined) form.append('mtime', String(request.mtime))\n form.append('file', request.file, request.filename)\n xhr.send(form)\n })\n },\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\nimport { BasicClientContext } from './context'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\n\ninterface ProviderChildrenProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport type BasicProviderProps<S extends BasicSchema = BasicSchema> = ProviderChildrenProps & (\n | { client: BasicClient<S> }\n | (BrowserBasicConfig<S> & { client?: never })\n)\n\ninterface ClientLifecycle {\n references: number\n start: Promise<void> | null\n stopTimer: ReturnType<typeof setTimeout> | null\n}\n\nconst clientLifecycles = new WeakMap<BasicClient<BasicSchema>, ClientLifecycle>()\n\nfunction retainClient(client: BasicClient<BasicSchema>): {\n started: Promise<void>\n release: () => void\n} {\n let lifecycle = clientLifecycles.get(client)\n if (!lifecycle) {\n lifecycle = { references: 0, start: null, stopTimer: null }\n clientLifecycles.set(client, lifecycle)\n }\n lifecycle.references += 1\n if (lifecycle.stopTimer) {\n clearTimeout(lifecycle.stopTimer)\n lifecycle.stopTimer = null\n }\n lifecycle.start ??= Promise.resolve(client.start()).catch((error: unknown) => {\n lifecycle!.start = null\n throw error\n })\n\n let released = false\n return {\n started: lifecycle.start,\n release: () => {\n if (released) return\n released = true\n lifecycle!.references = Math.max(0, lifecycle!.references - 1)\n if (lifecycle!.references > 0 || lifecycle!.stopTimer) return\n lifecycle!.stopTimer = setTimeout(() => {\n lifecycle!.stopTimer = null\n if (lifecycle!.references > 0) return\n const started = lifecycle!.start ?? Promise.resolve()\n void started.catch(() => {}).then(() => {\n if (lifecycle!.references > 0) return\n client.stop()\n lifecycle!.start = null\n })\n }, 0)\n },\n }\n}\n\n/** Generic provider for schema-less or explicitly generic applications. */\nexport function BasicProvider<S extends BasicSchema = BasicSchema>(props: BasicProviderProps<S>) {\n const clientRef = useRef<BasicClient<S> | null>(null)\n if (!clientRef.current) {\n if ('client' in props && props.client) {\n clientRef.current = props.client\n } else {\n const { children: _children, renderWhileLoading: _renderWhileLoading, ...config } = props\n clientRef.current = createBasicClient(config as BrowserBasicConfig<S>)\n }\n }\n const client = clientRef.current\n const [startError, setStartError] = useState<unknown>(null)\n\n useEffect(() => {\n let active = true\n const retained = retainClient(client as BasicClient<BasicSchema>)\n void retained.started.catch((error: unknown) => {\n if (active) setStartError(error)\n })\n return () => {\n active = false\n retained.release()\n }\n }, [client])\n\n const snapshot = useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n if (startError) throw startError\n\n return (\n <BasicClientContext.Provider value={client as BasicClient<BasicSchema>}>\n {(snapshot.isReady || props.renderWhileLoading) && props.children}\n </BasicClientContext.Provider>\n )\n}\n","import { createContext } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\n\nexport const BasicClientContext = createContext<BasicClient<BasicSchema> | null>(null)\n","import { useCallback, useMemo } from 'react'\nimport type { BasicAccount, BasicClient, BasicProfile, BasicSchema } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAccountsResult {\n accounts: BasicAccount[]\n active: BasicAccount | null\n switchAccount(id: string): Promise<void>\n addAccount(): Promise<BasicProfile>\n removeAccount(id: string): Promise<void>\n}\n\nexport function useAccountsFor<S extends BasicSchema>(client: BasicClient<S>): UseAccountsResult {\n const snapshot = useClientSnapshot(client)\n const switchAccount = useCallback((id: string) => client.switchAccount(id), [client])\n const addAccount = useCallback(() => client.addAccount(), [client])\n const removeAccount = useCallback((id: string) => client.removeAccount(id), [client])\n\n return useMemo(() => ({\n accounts: snapshot.accounts,\n active: snapshot.activeProfile,\n switchAccount,\n addAccount,\n removeAccount,\n }), [snapshot.accounts, snapshot.activeProfile, switchAccount, addAccount, removeAccount])\n}\n\nexport function useAccounts(): UseAccountsResult {\n return useAccountsFor(useRequiredClient())\n}\n","import { useContext, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport {\n BasicError,\n type BasicClient,\n type BasicClientSnapshot,\n type BasicSchema,\n} from '@basictech/core'\nimport { BasicClientContext } from '../context'\n\nexport interface AsyncResult<T> {\n data: T\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useRequiredClient<S extends BasicSchema = BasicSchema>(): BasicClient<S> {\n const client = useContext(BasicClientContext)\n if (!client) throw new Error('Basic hooks must be used within a <BasicProvider>')\n return client as unknown as BasicClient<S>\n}\n\nexport function useClientSnapshot<S extends BasicSchema>(\n client: BasicClient<S>,\n): BasicClientSnapshot {\n return useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n}\n\nexport function toBasicError(error: unknown, fallback = 'UNKNOWN_ERROR'): BasicError {\n if (error instanceof BasicError) return error\n return new BasicError(fallback, error instanceof Error ? error.message : String(error))\n}\n\nexport function useAsyncResult<T>(\n load: () => Promise<T>,\n initialData: T,\n enabled: boolean,\n settled: boolean,\n dependencies: readonly unknown[],\n): AsyncResult<T> {\n const loadRef = useRef(load)\n loadRef.current = load\n const [refreshVersion, setRefreshVersion] = useState(0)\n const [state, setState] = useState<Omit<AsyncResult<T>, 'refresh'>>({\n data: initialData,\n isLoading: !settled || enabled,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!enabled) {\n setState({ data: initialData, isLoading: !settled, error: null })\n return () => {\n active = false\n }\n }\n setState((current) => ({ ...current, isLoading: true, error: null }))\n void loadRef.current().then(\n (data) => {\n if (active) setState({ data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setState((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error),\n }))\n },\n )\n return () => {\n active = false\n }\n // The caller supplies semantic dependencies; load identity is held in a ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, settled, refreshVersion, ...dependencies])\n\n return {\n ...state,\n refresh: () => setRefreshVersion((version) => version + 1),\n }\n}\n","import { useCallback, useMemo } from 'react'\nimport {\n BasicError,\n type AuthStatus,\n type AuthUser,\n type BasicClient,\n type BasicSchema,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAuthResult {\n isReady: boolean\n isSignedIn: boolean\n isAnonymous: boolean\n canWrite: boolean\n readOnlyReason: string | null\n status: AuthStatus\n error: BasicError | null\n user: AuthUser | null\n did: string | null\n handle: string | null\n signIn(input?: string): Promise<void>\n signOut(): Promise<void>\n getToken(): Promise<string>\n}\n\nexport function useAuthFor<S extends BasicSchema>(client: BasicClient<S>): UseAuthResult {\n const snapshot = useClientSnapshot(client)\n const signIn = useCallback((input?: string) => client.signIn(input), [client])\n const signOut = useCallback(() => client.signOut(), [client])\n const getToken = useCallback(() => client.getToken(), [client])\n\n return useMemo(() => ({\n isReady: snapshot.isReady,\n isSignedIn: snapshot.isSignedIn,\n isAnonymous: snapshot.isAnonymous,\n canWrite: snapshot.canWrite,\n readOnlyReason: snapshot.readOnlyReason,\n status: snapshot.authStatus,\n error: snapshot.authErrorCode ? new BasicError(snapshot.authErrorCode) : null,\n user: snapshot.user,\n did: snapshot.did,\n handle: snapshot.handle,\n signIn,\n signOut,\n getToken,\n }), [snapshot, signIn, signOut, getToken])\n}\n\nexport function useAuth(): UseAuthResult {\n return useAuthFor(useRequiredClient())\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n InferValue,\n JsonObject,\n MountViewerFiles,\n OwnerFiles,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { useRequiredClient } from './client'\n\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n}\n\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return useRequiredClient<S>().db(source)\n}\n\nexport function useCollectionFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n name: T,\n options: { source?: SourceRef } = {},\n): Collection<InferValue<S, T> & JsonObject> {\n return client.db(options.source ?? 'default').collection(name)\n}\n\nexport function useCollection<V extends JsonObject = JsonObject>(\n name: string,\n options: { source?: SourceRef } = {},\n): Collection<V> {\n return useRequiredClient().db(options.source ?? 'default').collection<V>(name)\n}\n","import { useCallback, useMemo } from 'react'\nimport type { BasicClient, BasicSchema, JsonObject, Repo } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseReposResult {\n repos: Repo[]\n defaultRepoId: string | null\n refresh(): Promise<Repo[]>\n create(input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }): Promise<Repo>\n archive(repoId: string): Promise<void>\n}\n\nexport function useReposFor<S extends BasicSchema>(client: BasicClient<S>): UseReposResult {\n const snapshot = useClientSnapshot(client)\n const refresh = useCallback(() => client.refreshRepos(), [client])\n const create = useCallback((input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }) => client.createRepo(input), [client])\n const archive = useCallback((repoId: string) => client.archiveRepo(repoId), [client])\n\n return useMemo(() => ({\n repos: snapshot.repos,\n defaultRepoId: snapshot.defaultRepoId,\n refresh,\n create,\n archive,\n }), [snapshot.repos, snapshot.defaultRepoId, refresh, create, archive])\n}\n\nexport function useRepos(): UseReposResult {\n return useReposFor(useRequiredClient())\n}\n","import { useCallback, useMemo } from 'react'\nimport type {\n BasicClient,\n BasicConflict,\n BasicRejection,\n BasicSchema,\n BasicSyncStatus,\n SchemaStatus,\n SourceRef,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseSyncStatusResult {\n status: BasicSyncStatus\n pendingCount: number\n rejected: BasicRejection[]\n conflicts: BasicConflict[]\n resolveConflict(opId: string, choice: 'keep-mine' | 'keep-theirs'): Promise<boolean>\n discardRejected(opId: string): Promise<boolean>\n}\n\nexport function useSyncStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: SourceRef,\n): UseSyncStatusResult {\n const snapshot = useClientSnapshot(client)\n const sourceKey = JSON.stringify(source)\n const resolveConflict = useCallback(\n (opId: string, choice: 'keep-mine' | 'keep-theirs') =>\n client.resolveConflict(opId, choice, source ?? 'default'),\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const discardRejected = useCallback(\n (opId: string) => client.discardRejected(opId, source ?? 'default'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n\n return useMemo(() => ({\n status: source === undefined ? snapshot.syncStatus : client.status(source),\n pendingCount: client.pending(source).length,\n rejected: client.rejected(source),\n conflicts: client.conflicts(source),\n resolveConflict,\n discardRejected,\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [client, snapshot, sourceKey, resolveConflict, discardRejected])\n}\n\nexport function useSyncStatus(source?: SourceRef): UseSyncStatusResult {\n return useSyncStatusFor(useRequiredClient(), source)\n}\n\nexport function useSchemaStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): SchemaStatus {\n useClientSnapshot(client)\n return client.schemaStatus(source)\n}\n\nexport function useSchemaStatus(source: SourceRef = 'default'): SchemaStatus {\n return useSchemaStatusFor(useRequiredClient(), source)\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Repo,\n} from '@basictech/core'\nimport { useAccountsFor, type UseAccountsResult } from './accounts'\nimport { useAuthFor, type UseAuthResult } from './auth'\nimport { useRequiredClient } from './client'\nimport { useDbFor } from './db'\nimport { useReposFor } from './repos'\nimport { useSyncStatusFor, type UseSyncStatusResult } from './status'\n\nexport interface UseBasicResult<S extends BasicSchema = BasicSchema> extends UseAuthResult {\n client: BasicClient<S>\n db: BasicDb<S>\n accounts: UseAccountsResult\n sync: UseSyncStatusResult\n repos: Repo[]\n}\n\nexport function useBasicFor<S extends BasicSchema>(client: BasicClient<S>): UseBasicResult<S> {\n const auth = useAuthFor(client)\n const accounts = useAccountsFor(client)\n const sync = useSyncStatusFor(client)\n const repos = useReposFor(client)\n return {\n ...auth,\n client,\n db: useDbFor(client),\n accounts,\n sync,\n repos: repos.repos,\n }\n}\n\nexport function useBasic<S extends BasicSchema = BasicSchema>(): UseBasicResult<S> {\n return useBasicFor(useRequiredClient<S>())\n}\n","import { useMemo, useSyncExternalStore } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n FileListQuery,\n FileRecord,\n MountFileInfo,\n SourceRef,\n StorageInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient } from './client'\n\nconst zero = () => 0\n\nexport interface UseFilesResult {\n data: Array<FileRecord | MountFileInfo>\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useFilesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, '_files'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const version = useSyncExternalStore(subscription.subscribe, subscription.getSnapshot, zero)\n return useAsyncResult(\n async () => {\n const files = client.db(source).files\n if (source !== 'default' && 'mountId' in source) {\n const page = await files.list({\n ...(query.prefix !== undefined ? { prefix: query.prefix } : {}),\n ...(query.limit !== undefined ? { limit: query.limit } : {}),\n ...(query.cursor !== undefined ? { cursor: query.cursor } : {}),\n })\n return page.data\n }\n return (await files.list(query)).data\n },\n [],\n snapshot.isReady,\n snapshot.isReady,\n [sourceKey, queryKey, version, snapshot.activeProfile?.id],\n )\n}\n\nexport function useFiles(\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n return useFilesFor(useRequiredClient(), query, options)\n}\n\nexport interface UseStorageInfoResult {\n data: StorageInfo | null\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useStorageInfoFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseStorageInfoResult {\n const snapshot = useClientSnapshot(client)\n return useAsyncResult(\n () => client.storageInfo(client.resolveRepoId()),\n null,\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeProfile?.id],\n )\n}\n\nexport function useStorageInfo(): UseStorageInfoResult {\n return useStorageInfoFor(useRequiredClient())\n}\n","import { useCallback } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n CreateOutgoingShareInput,\n MountHandle,\n MountInfo,\n MountsQuery,\n OutgoingShareInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseMountsResult<S extends BasicSchema = BasicSchema> {\n data: MountInfo[]\n mounts: MountInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n open(mountId: string): Promise<MountHandle<S>>\n manageUrl(): string\n}\n\nexport function useMountsFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: MountsQuery = {},\n): UseMountsResult<S> {\n const snapshot = useClientSnapshot(client)\n const queryKey = JSON.stringify(query)\n const result = useAsyncResult(\n () => client.shares.mounts(query),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [queryKey, snapshot.activeProfile?.id],\n )\n const open = useCallback(\n (mountId: string) => client.shares.mount(mountId),\n [client],\n )\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n const { data: mounts, ...state } = result\n return { data: mounts, mounts, ...state, open, manageUrl }\n}\n\nexport function useMounts(query: MountsQuery = {}): UseMountsResult {\n return useMountsFor(useRequiredClient(), query)\n}\n\nexport interface UseOutgoingSharesResult {\n data: OutgoingShareInfo[]\n outgoingShares: OutgoingShareInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n create(input: CreateOutgoingShareInput): Promise<OutgoingShareInfo>\n get(id: string): Promise<OutgoingShareInfo>\n cancel(id: string): Promise<OutgoingShareInfo>\n revoke(id: string): Promise<OutgoingShareInfo>\n getContactHandle(did: string): Promise<string | null>\n manageUrl(): string\n}\n\nexport function useOutgoingSharesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseOutgoingSharesResult {\n const snapshot = useClientSnapshot(client)\n const result = useAsyncResult(\n () => client.shares.listOutgoing(),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeProfile?.id],\n )\n const create = useCallback((input: CreateOutgoingShareInput) =>\n client.shares.createOutgoing(input), [client])\n const get = useCallback((id: string) => client.shares.getOutgoing(id), [client])\n const cancel = useCallback((id: string) => client.shares.cancel(id), [client])\n const revoke = useCallback((id: string) => client.shares.revoke(id), [client])\n const getContactHandle = useCallback((did: string) => client.shares.getContactHandle(did), [client])\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n const { data: outgoingShares, ...state } = result\n return {\n data: outgoingShares,\n outgoingShares,\n ...state,\n create,\n get,\n cancel,\n revoke,\n getContactHandle,\n manageUrl,\n }\n}\n\nexport function useOutgoingShares(): UseOutgoingSharesResult {\n return useOutgoingSharesFor(useRequiredClient())\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport {\n type BasicClient,\n type BasicRecord,\n type BasicSchema,\n type InferValue,\n type JsonObject,\n type Query,\n type SourceRef,\n type TableNames,\n} from '@basictech/core'\nimport { toBasicError, useClientSnapshot, useRequiredClient } from './client'\nimport type { BasicError } from '@basictech/core'\n\nconst subscribeNever = () => () => {}\nconst zero = () => 0\n\nexport interface UseQueryResult<V extends JsonObject> {\n data: BasicRecord<V>[]\n isLoading: boolean\n error: BasicError | null\n}\n\nexport function useQueryValueFor<\n S extends BasicSchema,\n V extends JsonObject,\n>(\n client: BasicClient<S>,\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, collection),\n // sourceKey captures semantic source identity rather than object identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey, collection],\n )\n const version = useSyncExternalStore(\n subscription?.subscribe ?? subscribeNever,\n subscription?.getSnapshot ?? zero,\n zero,\n )\n const [result, setResult] = useState<UseQueryResult<V>>({\n data: [],\n isLoading: true,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!snapshot.isReady) {\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n return () => {\n active = false\n }\n }\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n const collectionApi = client.db(source).collection<V>(collection)\n const list = collectionApi.list as unknown as (\n value: Query<V>,\n ) => Promise<{ data: BasicRecord<V>[] }>\n void list.call(collectionApi, query).then(\n (page) => {\n if (active) setResult({ data: page.data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setResult((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error, 'QUERY_FAILED'),\n }))\n },\n )\n return () => {\n active = false\n }\n // source and query are represented by their stable semantic keys.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, collection, sourceKey, queryKey, version, snapshot.isReady])\n\n return result\n}\n\nexport function useQueryFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n collection: T,\n query: Query<InferValue<S, T> & JsonObject> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<InferValue<S, T> & JsonObject> {\n return useQueryValueFor(client, collection, query, options)\n}\n\nexport function useQuery<V extends JsonObject = JsonObject>(\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n return useQueryValueFor(useRequiredClient(), collection, query, options)\n}\n","import type { ReactElement, ReactNode } from 'react'\nimport type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n FileListQuery,\n InferValue,\n JsonObject,\n MountViewerFiles,\n MountsQuery,\n OwnerFiles,\n Query,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\nimport { BasicProvider } from './provider'\nimport { useAccountsFor, type UseAccountsResult } from './hooks/accounts'\nimport { useAuthFor, type UseAuthResult } from './hooks/auth'\nimport { useBasicFor, type UseBasicResult } from './hooks/basic'\nimport { useCollectionFor } from './hooks/db'\nimport {\n useFilesFor,\n useStorageInfoFor,\n type UseFilesResult,\n type UseStorageInfoResult,\n} from './hooks/files'\nimport {\n useMountsFor,\n useOutgoingSharesFor,\n type UseMountsResult,\n type UseOutgoingSharesResult,\n} from './hooks/mounts'\nimport { useQueryFor, type UseQueryResult } from './hooks/query'\nimport { useReposFor, type UseReposResult } from './hooks/repos'\nimport { useSchemaStatusFor, useSyncStatusFor, type UseSyncStatusResult } from './hooks/status'\nimport type { SchemaStatus } from '@basictech/core'\n\nexport type CreateBasicConfig<S extends BasicSchema> = BrowserBasicConfig<S> & { schema: S }\n\nexport interface BoundBasicProviderProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport interface CreatedBasic<S extends BasicSchema> {\n client: BasicClient<S>\n Provider(props: BoundBasicProviderProps): ReactElement\n useBasic(): UseBasicResult<S>\n useAuth(): UseAuthResult\n useAccounts(): UseAccountsResult\n useDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n useDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n useDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n useCollection<T extends TableNames<S>>(\n name: T,\n options?: { source?: SourceRef },\n ): Collection<InferValue<S, T> & JsonObject>\n useQuery<T extends TableNames<S>>(\n collection: T,\n query?: Query<InferValue<S, T> & JsonObject>,\n options?: { source?: SourceRef },\n ): UseQueryResult<InferValue<S, T> & JsonObject>\n useSyncStatus(source?: SourceRef): UseSyncStatusResult\n useSchemaStatus(source?: SourceRef): SchemaStatus\n useRepos(): UseReposResult\n useFiles(query?: FileListQuery, options?: { source?: SourceRef }): UseFilesResult\n useStorageInfo(): UseStorageInfoResult\n useMounts(query?: MountsQuery): UseMountsResult<S>\n useOutgoingShares(): UseOutgoingSharesResult\n}\n\n/** Create one browser client and a complete hook surface bound to its schema. */\nexport function createBasic<const S extends BasicSchema>(config: CreateBasicConfig<S>): CreatedBasic<S> {\n const client = createBasicClient(config)\n\n function Provider({ children, renderWhileLoading }: BoundBasicProviderProps) {\n return (\n <BasicProvider client={client} renderWhileLoading={renderWhileLoading}>\n {children}\n </BasicProvider>\n )\n }\n\n function useBoundDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n function useBoundDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n function useBoundDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n function useBoundDb(\n source: SourceRef = 'default',\n ): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n }\n\n return {\n client,\n Provider,\n useBasic: () => useBasicFor(client),\n useAuth: () => useAuthFor(client),\n useAccounts: () => useAccountsFor(client),\n useDb: useBoundDb,\n useCollection: (name, options = {}) => useCollectionFor(client, name, options),\n useQuery: (collection, query = {}, options = {}) =>\n useQueryFor(client, collection, query, options),\n useSyncStatus: (source) => useSyncStatusFor(client, source),\n useSchemaStatus: (source = 'default') => useSchemaStatusFor(client, source),\n useRepos: () => useReposFor(client),\n useFiles: (query = {}, options = {}) => useFilesFor(client, query, options),\n useStorageInfo: () => useStorageInfoFor(client),\n useMounts: (query = {}) => useMountsFor(client, query),\n useOutgoingShares: () => useOutgoingSharesFor(client),\n }\n}\n"],"mappings":"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","names":["BasicError","BasicError","useEffect","useRef","useState","useSyncExternalStore","BasicError","useSyncExternalStore","BasicError","useRef","useState","useEffect","useCallback","useMemo","BasicError","useCallback","useMemo","BasicError","useCallback","useMemo","useCallback","useMemo","useCallback","useMemo","useCallback","useMemo","useMemo","useSyncExternalStore","useMemo","useSyncExternalStore","useCallback","useCallback","useEffect","useMemo","useState","useSyncExternalStore","zero","useMemo","useSyncExternalStore","useState","useEffect","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basictech/react",
3
- "version": "0.11.0-beta.2",
3
+ "version": "0.11.0-beta.3",
4
4
  "private": false,
5
5
  "description": "React integration for the Basic repo-era SDK",
6
6
  "license": "MIT",
@@ -38,7 +38,7 @@
38
38
  "sideEffects": false,
39
39
  "author": "",
40
40
  "dependencies": {
41
- "@basictech/core": "0.11.0-beta.2",
41
+ "@basictech/core": "0.11.0-beta.3",
42
42
  "dexie": "^4.2.1"
43
43
  },
44
44
  "devDependencies": {