@basictech/react 0.11.0-beta.2 → 0.11.0
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 +93 -13
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ runtime validation live in `@basictech/schema`.
|
|
|
13
13
|
| `@basictech/core` | Framework-neutral client, data model, sync, files, shares, and public types |
|
|
14
14
|
| `@basictech/schema/define` | Dependency-light schema definition and TypeScript inference |
|
|
15
15
|
|
|
16
|
-
This
|
|
16
|
+
This SDK requires React 18 or newer (`useSyncExternalStore`) and declares Node.js 24 or newer in
|
|
17
17
|
its package metadata.
|
|
18
18
|
|
|
19
19
|
## Install
|
|
@@ -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
|
+
## Auth update guide
|
|
30
|
+
|
|
31
|
+
Upgrade the packages you use together from npm's default `latest` channel:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install @basictech/react@latest @basictech/schema@latest
|
|
35
|
+
# If you import core directly, update that dependency too:
|
|
36
|
+
npm install @basictech/core@latest
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Keep the public packages on matching 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
|
|
@@ -163,7 +237,7 @@ client.
|
|
|
163
237
|
| `fetch` | `typeof globalThis.fetch` | `globalThis.fetch` | Inject a fetch implementation, test transport, or instrumented wrapper. |
|
|
164
238
|
| `WebSocketImpl` | `new (url: string \| URL) => WebSocket` | `globalThis.WebSocket` | Inject WebSocket support in a non-browser runtime or tests. |
|
|
165
239
|
| `kv` | `KeyValueStorage` | `localStorage`, then memory | Replace profile registry, cached identity/repo state, and other durable key/value state. |
|
|
166
|
-
| `tokenStore` | `TokenStore` | `BrowserTokenStore` over the default local store | Supply a secure credential facility. See [Token storage](#token-storage
|
|
240
|
+
| `tokenStore` | `TokenStore` | `BrowserTokenStore` over the default local store | Supply a secure credential facility. See [Token storage](#token-storage). |
|
|
167
241
|
| `sessionStorage` | `KeyValueStorage` | `sessionStorage`, then memory | Replace per-tab active-profile selection and one-time PKCE state storage. |
|
|
168
242
|
| `replicaStore` | `ReplicaStoreFactory` | Dexie/IndexedDB, then memory | Provide another durable replica store or an explicit memory store for tests. |
|
|
169
243
|
| `navigate` | `(url: string) => void \| Promise<void>` | `location.assign(url)` | Integrate OAuth navigation with a browser shell or test harness. |
|
|
@@ -206,12 +280,12 @@ The package also exports the adapters for explicit composition: `BrowserKeyValue
|
|
|
206
280
|
`browserCurrentUrl`, and `browserReplaceUrl`. Most applications only need `createBasic`, which
|
|
207
281
|
installs them.
|
|
208
282
|
|
|
209
|
-
### Token storage
|
|
283
|
+
### Token storage
|
|
210
284
|
|
|
211
285
|
The default `BrowserTokenStore` stores each profile's refresh token in `localStorage` and keeps its
|
|
212
|
-
access token only in memory. This
|
|
286
|
+
access token only in memory. This retains the documented **CS-CLIENT-002 beta conformance exception**:
|
|
213
287
|
`localStorage` is not a secure credential facility. Inject `tokenStore` when the host provides a
|
|
214
|
-
secure store.
|
|
288
|
+
secure store. Publication on `latest` does not change this storage policy or add revocation cleanup.
|
|
215
289
|
|
|
216
290
|
## Provider
|
|
217
291
|
|
|
@@ -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' \| '
|
|
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:
|
|
326
|
-
- `active:
|
|
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 |
|
|
@@ -1098,13 +1179,12 @@ for the lower-level model.
|
|
|
1098
1179
|
|
|
1099
1180
|
## Next.js, migration, and status
|
|
1100
1181
|
|
|
1101
|
-
- `@basictech/nextjs`
|
|
1102
|
-
Its
|
|
1103
|
-
Client Components should import `@basictech/react` directly.
|
|
1182
|
+
- `@basictech/nextjs/client` provides this React API behind a Next.js Client Component boundary.
|
|
1183
|
+
Its root exports types only. It does not provide middleware or server authentication.
|
|
1104
1184
|
- Migrating from 0.10 requires deliberate call-site changes; there is no compatibility layer. Read
|
|
1105
1185
|
[Migrating to Basic SDK 0.11](https://github.com/basicdb/basic-server/blob/dev/docs/MIGRATING_TO_0.11.md).
|
|
1106
|
-
- 0.11
|
|
1107
|
-
rather than assuming it matches the repository workspace.
|
|
1186
|
+
- The coordinated non-prerelease 0.11 SDK uses npm's `latest` channel. Check the installed
|
|
1187
|
+
version rather than assuming it matches the repository workspace or an older `beta` tag.
|
|
1108
1188
|
|
|
1109
1189
|
## License
|
|
1110
1190
|
|
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:
|
|
11
|
-
active:
|
|
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:
|
|
11
|
-
active:
|
|
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.
|
|
781
|
+
accounts: snapshot.accounts,
|
|
782
782
|
active: snapshot.activeProfile,
|
|
783
783
|
switchAccount,
|
|
784
784
|
addAccount,
|
|
785
785
|
removeAccount
|
|
786
|
-
}), [snapshot.
|
|
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.
|
|
731
|
+
accounts: snapshot.accounts,
|
|
732
732
|
active: snapshot.activeProfile,
|
|
733
733
|
switchAccount,
|
|
734
734
|
addAccount,
|
|
735
735
|
removeAccount
|
|
736
|
-
}), [snapshot.
|
|
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,
|
package/dist/index.mjs.map
CHANGED
|
@@ -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
|
|
3
|
+
"version": "0.11.0",
|
|
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
|
|
41
|
+
"@basictech/core": "0.11.0",
|
|
42
42
|
"dexie": "^4.2.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|