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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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\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 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 { BasicError, type KeyValueStorage, type TokenSet, type 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, reject) => {\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 reject(new BasicError(\n 'ACCESS_TOKEN_ADOPTION_TIMEOUT',\n 'timed out waiting for the access token matching persisted refresh material',\n ))\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 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 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 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","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 { 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"]}
package/dist/index.mjs CHANGED
@@ -390,7 +390,6 @@ function browserStorage(name) {
390
390
  }
391
391
 
392
392
  // src/adapters/token-store.ts
393
- import { BasicError as BasicError3 } from "@basictech/core";
394
393
  var ACCESS_TOKEN_ADOPTION_TIMEOUT_MS = 100;
395
394
  function parseTokens(value) {
396
395
  if (!value) return null;
@@ -467,7 +466,7 @@ var BrowserTokenStore = class {
467
466
  else this.accessWaiters.delete(key);
468
467
  }
469
468
  waitForAccessToken(key, refreshToken) {
470
- return new Promise((resolve, reject) => {
469
+ return new Promise((resolve) => {
471
470
  let timer;
472
471
  const waiter = {
473
472
  refreshToken,
@@ -483,10 +482,7 @@ var BrowserTokenStore = class {
483
482
  const remaining = (this.accessWaiters.get(key) ?? []).filter((candidate) => candidate !== waiter);
484
483
  if (remaining.length) this.accessWaiters.set(key, remaining);
485
484
  else this.accessWaiters.delete(key);
486
- reject(new BasicError3(
487
- "ACCESS_TOKEN_ADOPTION_TIMEOUT",
488
- "timed out waiting for the access token matching persisted refresh material"
489
- ));
485
+ resolve(null);
490
486
  }, ACCESS_TOKEN_ADOPTION_TIMEOUT_MS);
491
487
  });
492
488
  }
@@ -494,7 +490,7 @@ var BrowserTokenStore = class {
494
490
 
495
491
  // src/adapters/upload.ts
496
492
  import {
497
- BasicError as BasicError4
493
+ BasicError as BasicError3
498
494
  } from "@basictech/core";
499
495
  function responseHeaders(xhr) {
500
496
  const headers = new Headers();
@@ -508,7 +504,7 @@ function responseHeaders(xhr) {
508
504
  var browserUploadTransport = {
509
505
  upload(request) {
510
506
  if (typeof XMLHttpRequest === "undefined") {
511
- return Promise.reject(new BasicError4("XHR_UNAVAILABLE"));
507
+ return Promise.reject(new BasicError3("XHR_UNAVAILABLE"));
512
508
  }
513
509
  return new Promise((resolve, reject) => {
514
510
  const xhr = new XMLHttpRequest();
@@ -540,9 +536,9 @@ var browserUploadTransport = {
540
536
  statusText: xhr.statusText,
541
537
  headers: responseHeaders(xhr)
542
538
  })));
543
- xhr.onerror = () => finish(() => reject(new BasicError4("NETWORK_ERROR", "the upload could not reach the server")));
539
+ xhr.onerror = () => finish(() => reject(new BasicError3("NETWORK_ERROR", "the upload could not reach the server")));
544
540
  xhr.onabort = () => finish(() => reject(request.signal?.reason ?? new DOMException("Aborted", "AbortError")));
545
- xhr.ontimeout = () => finish(() => reject(new BasicError4("NETWORK_ERROR", "the upload timed out")));
541
+ xhr.ontimeout = () => finish(() => reject(new BasicError3("NETWORK_ERROR", "the upload timed out")));
546
542
  const form = new FormData();
547
543
  form.append("path", request.path);
548
544
  if (request.name !== void 0) form.append("name", request.name);
@@ -554,6 +550,21 @@ var browserUploadTransport = {
554
550
  };
555
551
 
556
552
  // src/create-client.ts
553
+ function browserReconcileTrigger(listener) {
554
+ if (typeof window === "undefined" || typeof document === "undefined") return () => {
555
+ };
556
+ const onVisible = () => {
557
+ if (document.visibilityState === "visible") listener();
558
+ };
559
+ window.addEventListener("focus", listener);
560
+ window.addEventListener("online", listener);
561
+ document.addEventListener("visibilitychange", onVisible);
562
+ return () => {
563
+ window.removeEventListener("focus", listener);
564
+ window.removeEventListener("online", listener);
565
+ document.removeEventListener("visibilitychange", onVisible);
566
+ };
567
+ }
557
568
  function createBasicClient(config) {
558
569
  const local = browserStorage("localStorage") ?? new MemoryKeyValueStorage();
559
570
  const session = browserStorage("sessionStorage") ?? new MemoryKeyValueStorage();
@@ -569,6 +580,7 @@ function createBasicClient(config) {
569
580
  navigate: config.navigate ?? browserNavigate,
570
581
  currentUrl: config.currentUrl ?? browserCurrentUrl,
571
582
  replaceUrl: config.replaceUrl ?? browserReplaceUrl,
583
+ reconcileTrigger: config.reconcileTrigger ?? browserReconcileTrigger,
572
584
  createMessageChannel: config.createMessageChannel ?? (canBroadcast && defaultTokenStore ? createBrowserAuthChannelFactory(config.clientId, defaultTokenStore) : void 0),
573
585
  uploadTransport: config.uploadTransport ?? (typeof XMLHttpRequest === "undefined" ? void 0 : browserUploadTransport)
574
586
  });
@@ -655,7 +667,7 @@ import { useCallback, useMemo } from "react";
655
667
  // src/hooks/client.ts
656
668
  import { useContext, useEffect as useEffect2, useRef as useRef2, useState as useState2, useSyncExternalStore as useSyncExternalStore2 } from "react";
657
669
  import {
658
- BasicError as BasicError5
670
+ BasicError as BasicError4
659
671
  } from "@basictech/core";
660
672
  function useRequiredClient() {
661
673
  const client = useContext(BasicClientContext);
@@ -666,8 +678,8 @@ function useClientSnapshot(client) {
666
678
  return useSyncExternalStore2(client.subscribe, client.getSnapshot, client.getSnapshot);
667
679
  }
668
680
  function toBasicError(error, fallback = "UNKNOWN_ERROR") {
669
- if (error instanceof BasicError5) return error;
670
- return new BasicError5(fallback, error instanceof Error ? error.message : String(error));
681
+ if (error instanceof BasicError4) return error;
682
+ return new BasicError4(fallback, error instanceof Error ? error.message : String(error));
671
683
  }
672
684
  function useAsyncResult(load, initialData, enabled, settled, dependencies) {
673
685
  const loadRef = useRef2(load);
@@ -730,7 +742,7 @@ function useAccounts() {
730
742
  // src/hooks/auth.ts
731
743
  import { useCallback as useCallback2, useMemo as useMemo2 } from "react";
732
744
  import {
733
- BasicError as BasicError6
745
+ BasicError as BasicError5
734
746
  } from "@basictech/core";
735
747
  function useAuthFor(client) {
736
748
  const snapshot = useClientSnapshot(client);
@@ -742,7 +754,7 @@ function useAuthFor(client) {
742
754
  isSignedIn: snapshot.isSignedIn,
743
755
  isAnonymous: snapshot.isAnonymous,
744
756
  status: snapshot.authStatus,
745
- error: snapshot.authErrorCode ? new BasicError6(snapshot.authErrorCode) : null,
757
+ error: snapshot.authErrorCode ? new BasicError5(snapshot.authErrorCode) : null,
746
758
  user: snapshot.user,
747
759
  did: snapshot.did,
748
760
  handle: snapshot.handle,
@@ -931,6 +943,7 @@ function useOutgoingSharesFor(client) {
931
943
  const get = useCallback5((id) => client.shares.getOutgoing(id), [client]);
932
944
  const cancel = useCallback5((id) => client.shares.cancel(id), [client]);
933
945
  const revoke = useCallback5((id) => client.shares.revoke(id), [client]);
946
+ const getContactHandle = useCallback5((did) => client.shares.getContactHandle(did), [client]);
934
947
  const manageUrl = useCallback5(() => client.shares.manageUrl(), [client]);
935
948
  const { data: outgoingShares, ...state } = result;
936
949
  return {
@@ -941,6 +954,7 @@ function useOutgoingSharesFor(client) {
941
954
  get,
942
955
  cancel,
943
956
  revoke,
957
+ getContactHandle,
944
958
  manageUrl
945
959
  };
946
960
  }