@lsync/client 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/index.d.mts +42 -52
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +846 -478
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -5
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["collectionScope","normalizeSegment","collectionScope"],"sources":["../src/batch.ts","../src/client-rpc.ts","../src/client-subscriptions.ts","../src/client.ts","../src/read-query.ts","../src/subsets.ts","../src/collection.ts","../src/collection-path.ts","../src/collection-api.ts","../src/collection-type.ts","../src/definition-builder.ts","../src/collection-name.ts","../src/immutable.ts","../src/collection-type-builder-state.ts","../src/collection-type-builder.ts"],"sourcesContent":["import type {\n ChangeMessageOrDeleteKeyMessage,\n PendingMutation,\n TransactionWithMutations,\n} from \"@tanstack/db\";\nimport type { Batch, Update } from \"./types\";\n\nexport function createBatch<T extends object>(\n collection: string,\n clientId: string,\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): Batch {\n return {\n updates: transaction.mutations.map((mutation) => toUpdate(collection, clientId, mutation)),\n };\n}\n\nfunction toUpdate<T extends object>(\n collection: string,\n clientId: string,\n mutation: PendingMutation<T>,\n): Update {\n const base = {\n id: mutation.mutationId,\n collection,\n key: mutation.key as string | number,\n type: mutation.type,\n clientId,\n createdAt: mutation.createdAt.getTime(),\n };\n\n if (mutation.type === \"delete\") {\n return {\n ...base,\n type: \"delete\",\n previousValue: mutation.original,\n };\n }\n\n if (mutation.type === \"update\") {\n return {\n ...base,\n type: \"update\",\n value: mutation.modified,\n previousValue: mutation.original,\n };\n }\n\n return {\n ...base,\n type: \"insert\",\n value: mutation.modified,\n };\n}\n\nexport function toChangeMessage<T extends object, TKey extends string | number>(\n update: Update,\n existing?: boolean,\n): ChangeMessageOrDeleteKeyMessage<T, TKey> {\n if (update.type === \"delete\") {\n return {\n type: \"delete\",\n key: update.key as TKey,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>;\n }\n\n const type =\n update.type === \"update\" && existing === false\n ? \"insert\"\n : update.type === \"insert\" && existing === true\n ? \"update\"\n : update.type;\n\n return {\n type,\n key: update.key as TKey,\n value: update.value as T,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>;\n}\n","import type { ClientRpcRequest, RpcId } from \"@lsync/transport\";\nimport type { ApiCall, Batch, ReadQuery, SyncChangesQuery } from \"./types\";\n\nexport interface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n}\n\nexport function takePending(\n pending: Map<string, PendingRequest>,\n id: RpcId,\n): PendingRequest | undefined {\n if (id === null || id === undefined) {\n return undefined;\n }\n\n const key = String(id);\n const request = pending.get(key);\n pending.delete(key);\n return request;\n}\n\nexport function requestForOperation(\n id: string,\n op: { type: string; path: string; input: unknown },\n): ClientRpcRequest {\n if (op.type === \"mutation\" && op.path === \"push\") {\n return {\n id,\n method: \"mutation\",\n params: {\n path: \"push\",\n input: {\n json: op.input as Batch,\n },\n },\n };\n }\n\n if (op.type === \"query\" && op.path === \"read\") {\n return {\n id,\n method: \"query\",\n params: {\n path: \"read\",\n input: {\n json: op.input as ReadQuery,\n },\n },\n };\n }\n\n if (op.type === \"query\" && op.path === \"changes\") {\n return {\n id,\n method: \"query\",\n params: {\n path: \"changes\",\n input: {\n json: op.input as SyncChangesQuery,\n },\n },\n };\n }\n\n if (op.type === \"mutation\" && op.path === \"api\") {\n return {\n id,\n method: \"mutation\",\n params: {\n path: \"api\",\n input: {\n json: op.input as ApiCall,\n },\n },\n };\n }\n\n throw new Error(`Unsupported operation: ${op.type}.${op.path}`);\n}\n\nexport function collectionScope(collection: string): string {\n const segments = collection\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n return `/${segments.map(normalizeSegment).join(\"/\")}/`;\n}\n\nfunction normalizeSegment(segment: string): string {\n return encodeURIComponent(decodeURIComponent(segment));\n}\n","import { collectionScope } from \"./client-rpc\";\nimport type { Broadcast, ClientSubscription, SubscriptionControlResult } from \"./types\";\n\ntype SubscriptionListener = (broadcast: Broadcast) => void;\n\ninterface SubscriptionEntry {\n collection: string;\n listeners: Set<SubscriptionListener>;\n ready: Promise<void>;\n}\n\nexport interface SubscriptionControls {\n currentSocket(): WebSocket | undefined;\n open(): Promise<WebSocket>;\n send(\n ws: WebSocket,\n path: \"subscribe\" | \"unsubscribe\",\n collection: string,\n ): Promise<SubscriptionControlResult>;\n}\n\nexport class ClientSubscriptions {\n private readonly subscriptions = new Map<string, SubscriptionEntry>();\n\n constructor(private readonly controls: SubscriptionControls) {}\n\n subscribe(collection: string, listener: SubscriptionListener): ClientSubscription {\n const key = collectionScope(collection);\n let entry = this.subscriptions.get(key);\n const shouldSubscribe = !entry;\n\n if (!entry) {\n entry = {\n collection: key,\n listeners: new Set(),\n ready: Promise.resolve(),\n };\n this.subscriptions.set(key, entry);\n }\n\n entry.listeners.add(listener);\n if (shouldSubscribe) {\n entry.ready = this.start(entry);\n }\n\n return {\n ready: entry.ready,\n unsubscribe: () => this.unsubscribe(key, listener),\n };\n }\n\n async replay(ws: WebSocket): Promise<void> {\n await Promise.all(\n [...this.subscriptions.values()].map((entry) => this.subscribeOnSocket(ws, entry)),\n );\n }\n\n dispatch(broadcast: Broadcast): void {\n const updatesByCollection = new Map<string, Broadcast[\"updates\"]>();\n const invalidationsByCollection = new Map<string, NonNullable<Broadcast[\"invalidations\"]>>();\n\n for (const update of broadcast.updates) {\n const collection = collectionScope(update.collection);\n const updates = updatesByCollection.get(collection) ?? [];\n updates.push(update);\n updatesByCollection.set(collection, updates);\n }\n\n for (const invalidation of broadcast.invalidations ?? []) {\n const collection = collectionScope(invalidation.collection);\n const invalidations = invalidationsByCollection.get(collection) ?? [];\n invalidations.push(invalidation);\n invalidationsByCollection.set(collection, invalidations);\n }\n\n for (const entry of this.subscriptions.values()) {\n const updates = updatesByCollection.get(collectionScope(entry.collection));\n const invalidations = invalidationsByCollection.get(collectionScope(entry.collection));\n if ((!updates || updates.length === 0) && (!invalidations || invalidations.length === 0)) {\n continue;\n }\n\n const scopedBroadcast: Broadcast = {\n ...broadcast,\n ...(invalidations ? { invalidations } : {}),\n updates: updates ?? [],\n };\n for (const listener of entry.listeners) {\n listener(scopedBroadcast);\n }\n }\n }\n\n private start(entry: SubscriptionEntry): Promise<void> {\n const socket = this.controls.currentSocket();\n return socket?.readyState === WebSocket.OPEN\n ? this.subscribeOnSocket(socket, entry)\n : this.controls.open().then(() => undefined);\n }\n\n private async subscribeOnSocket(ws: WebSocket, entry: SubscriptionEntry): Promise<void> {\n if (this.subscriptions.get(collectionScope(entry.collection)) !== entry) {\n return;\n }\n\n const result = await this.controls.send(ws, \"subscribe\", entry.collection);\n entry.collection = result.collection;\n }\n\n private unsubscribe(key: string, listener: SubscriptionListener): void {\n const entry = this.subscriptions.get(key);\n if (!entry) {\n return;\n }\n\n entry.listeners.delete(listener);\n if (entry.listeners.size > 0) {\n return;\n }\n\n this.subscriptions.delete(key);\n const socket = this.controls.currentSocket();\n if (socket?.readyState === WebSocket.OPEN) {\n void this.controls.send(socket, \"unsubscribe\", entry.collection);\n }\n }\n}\n","import { createTRPCProxyClient, type TRPCLink } from \"@trpc/client\";\nimport { parseServerMessage, sendClientRpcRequest, type ClientRpcRequest } from \"@lsync/transport\";\nimport { observable } from \"@trpc/server/observable\";\nimport { ClientSubscriptions } from \"./client-subscriptions\";\nimport { requestForOperation, takePending, type PendingRequest } from \"./client-rpc\";\nimport type {\n ApiCall,\n ApiCallArgs,\n ApiContract,\n ApiOutput,\n ApiPath,\n Batch,\n Client,\n ClientOptions,\n PushResult,\n ReadQuery,\n ReadResult,\n SubscriptionControlResult,\n SyncChangesQuery,\n SyncChangesResult,\n} from \"./types\";\n\ntype Router = any;\n\ninterface SharedClientEntry {\n client: Client;\n refs: number;\n}\n\nexport interface SharedClientLease<TApi extends ApiContract = ApiContract> {\n readonly client: Client<TApi>;\n release(): void;\n}\n\nconst sharedClients = new Map<string, SharedClientEntry>();\n\nexport function createClient<TApi extends ApiContract = ApiContract>(\n options: ClientOptions,\n): Client<TApi> {\n const clientId = options.clientId ?? crypto.randomUUID();\n const pending = new Map<string, PendingRequest>();\n let nextId = 1;\n let socket: WebSocket | undefined;\n let connectPromise: Promise<WebSocket> | undefined;\n let subscriptions: ClientSubscriptions;\n\n const open = async (): Promise<WebSocket> => {\n if (socket?.readyState === WebSocket.OPEN) {\n return socket;\n }\n\n if (connectPromise) {\n return connectPromise;\n }\n\n connectPromise = new Promise((resolve, reject) => {\n const url = new URL(options.url);\n url.searchParams.set(\"clientId\", clientId);\n const ws = new WebSocket(url);\n ws.binaryType = \"arraybuffer\";\n\n ws.addEventListener(\"open\", () => {\n socket = ws;\n subscriptions\n .replay(ws)\n .then(() => {\n connectPromise = undefined;\n resolve(ws);\n })\n .catch((error) => {\n connectPromise = undefined;\n reject(error);\n });\n });\n\n ws.addEventListener(\"message\", (event) => {\n const message = parseServerMessage(event.data);\n\n if (\"method\" in message) {\n subscriptions.dispatch(message.params.input.json);\n return;\n }\n\n if (\"error\" in message) {\n const request = takePending(pending, message.id);\n\n if (!request) {\n return;\n }\n\n request.reject(new Error(message.error.message));\n return;\n }\n\n const request = takePending(pending, message.id);\n\n if (!request) {\n return;\n }\n\n request.resolve(message.result.data.json);\n });\n\n ws.addEventListener(\"close\", () => {\n socket = undefined;\n connectPromise = undefined;\n });\n\n ws.addEventListener(\"error\", () => {\n reject(new Error(\"Unable to open sync WebSocket\"));\n });\n });\n\n return connectPromise;\n };\n\n const sendRequest = <TResult>(ws: WebSocket, request: ClientRpcRequest): Promise<TResult> => {\n return new Promise((resolve, reject) => {\n const id = request.id;\n if (id === null || id === undefined) {\n reject(new Error(\"RPC request requires an id\"));\n return;\n }\n\n pending.set(String(id), {\n resolve: (value) => resolve(value as TResult),\n reject,\n });\n\n try {\n sendClientRpcRequest(ws, request);\n } catch (error) {\n pending.delete(String(id));\n reject(error);\n }\n });\n };\n\n const sendSubscriptionControl = async (\n ws: WebSocket,\n method: \"subscribe\" | \"unsubscribe\",\n collection: string,\n ): Promise<SubscriptionControlResult> => {\n const id = String(nextId++);\n return sendRequest<SubscriptionControlResult>(ws, {\n id,\n method,\n params: {\n input: {\n json: {\n collection,\n },\n },\n },\n });\n };\n\n subscriptions = new ClientSubscriptions({\n currentSocket: () => socket,\n open,\n send: sendSubscriptionControl,\n });\n\n const link: TRPCLink<Router> = () => {\n return ({ op }) =>\n observable((observer) => {\n let cancelled = false;\n\n open()\n .then((ws) => {\n if (cancelled) return;\n\n const id = String(nextId++);\n sendRequest(ws, requestForOperation(id, op))\n .then((value) => {\n observer.next({ result: { data: value } });\n observer.complete();\n })\n .catch((error) => observer.error(error as never));\n })\n .catch((error) => observer.error(error as never));\n\n return () => {\n cancelled = true;\n };\n });\n };\n\n const trpc = createTRPCProxyClient<Router>({ links: [link] }) as unknown as {\n push: {\n mutate: (batch: Batch) => Promise<PushResult>;\n };\n read: {\n query: <T = unknown>(query: ReadQuery) => Promise<ReadResult<T>>;\n };\n changes: {\n query: (query: SyncChangesQuery) => Promise<SyncChangesResult>;\n };\n api: {\n mutate: <TResult = unknown>(call: ApiCall) => Promise<TResult>;\n };\n };\n\n return {\n clientId,\n push: (batch) => trpc.push.mutate(batch),\n read: (query) => trpc.read.query(query),\n changes: (query) => trpc.changes.query(query),\n call: <TPath extends ApiPath<TApi>>(path: TPath, ...args: ApiCallArgs<TApi, TPath>) => {\n const [input] = args;\n const call = input === undefined ? { path } : { path, input };\n return trpc.api.mutate<ApiOutput<TApi, TPath>>(call);\n },\n subscribe: (collection, listener) => subscriptions.subscribe(collection, listener),\n close() {\n socket?.close();\n socket = undefined;\n },\n };\n}\n\nexport function acquireSharedClient<TApi extends ApiContract = ApiContract>(\n options: ClientOptions,\n): SharedClientLease<TApi> {\n const key = sharedClientKey(options);\n let entry = sharedClients.get(key);\n\n if (!entry) {\n entry = {\n client: createClient({\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n }),\n refs: 0,\n };\n sharedClients.set(key, entry);\n }\n\n entry.refs += 1;\n\n let released = false;\n return {\n client: entry.client as Client<TApi>,\n release() {\n if (released) {\n return;\n }\n\n released = true;\n entry.refs -= 1;\n\n if (entry.refs === 0 && sharedClients.get(key) === entry) {\n sharedClients.delete(key);\n entry.client.close();\n }\n },\n };\n}\n\nfunction sharedClientKey(options: ClientOptions): string {\n const url = new URL(options.url);\n url.searchParams.delete(\"clientId\");\n return `${url.toString()}\\0${options.clientId ?? \"\"}`;\n}\n","import type { LoadSubsetOptions } from \"@tanstack/db\";\nimport type { ReadFilter, ReadOrderBy, ReadPredicate, ReadQuery } from \"./types\";\n\nexport type ReadOptions = Omit<ReadQuery, \"collection\">;\ntype ReadComparisonPredicate = Extract<ReadPredicate, { type: \"comparison\" }>;\n\nexport function initialReadQuery(\n collection: string,\n read: false | ReadOptions | undefined,\n): ReadQuery | undefined {\n if (read === false) {\n return undefined;\n }\n\n return {\n collection,\n ...read,\n };\n}\n\nexport function subsetId(options: LoadSubsetOptions): string {\n return JSON.stringify({\n cursor: options.cursor\n ? {\n whereCurrent: toReadPredicate(options.cursor.whereCurrent),\n whereFrom: toReadPredicate(options.cursor.whereFrom),\n }\n : undefined,\n predicate: options.where ? toReadPredicate(options.where) : undefined,\n limit: options.limit,\n offset: options.offset,\n orderBy: toReadOrderByList(options.orderBy),\n });\n}\n\nexport function readQueryForSubset(\n collection: string,\n baseRead: ReadOptions | undefined,\n options: LoadSubsetOptions,\n): ReadQuery {\n const query: ReadQuery = {\n collection,\n ...baseRead,\n filters: [...(baseRead?.filters ?? [])],\n };\n\n const predicate = combinePredicates(\n baseRead?.predicate,\n options.where ? toReadPredicate(options.where) : undefined,\n );\n if (predicate) {\n query.predicate = predicate;\n }\n\n const limit = options.limit ?? baseRead?.limit;\n if (limit !== undefined) {\n query.limit = limit;\n }\n\n const offset = options.cursor ? undefined : (options.offset ?? baseRead?.offset);\n if (offset !== undefined) {\n query.offset = offset;\n }\n\n const subsetOrderBy = toReadOrderByList(options.orderBy);\n const orderBy = subsetOrderBy.length > 0 ? subsetOrderBy : baseRead?.orderBy;\n if (orderBy) {\n query.orderBy = orderBy;\n }\n\n if (options.cursor) {\n query.cursor = {\n whereCurrent: toReadPredicate(options.cursor.whereCurrent),\n whereFrom: toReadPredicate(options.cursor.whereFrom),\n ...(options.cursor.lastKey !== undefined ? { lastKey: options.cursor.lastKey } : {}),\n };\n }\n\n return query;\n}\n\nfunction combinePredicates(\n left: ReadPredicate | undefined,\n right: ReadPredicate | undefined,\n): ReadPredicate | undefined {\n if (!left) return right;\n if (!right) return left;\n return { type: \"and\", predicates: [left, right] };\n}\n\nfunction toReadPredicate(expression: unknown): ReadPredicate {\n const unwrapped = unwrapExpression(expression);\n\n if (!isFuncExpression(unwrapped)) {\n throw new Error(\"On-demand cursor predicates must be function expressions\");\n }\n\n if (unwrapped.name === \"and\" || unwrapped.name === \"or\") {\n return {\n type: unwrapped.name,\n predicates: unwrapped.args.map(toReadPredicate),\n };\n }\n\n if (unwrapped.name === \"not\") {\n return negatePredicate(toReadPredicate(unwrapped.args[0]));\n }\n\n const comparison = comparisonFromExpression(unwrapped);\n if (!comparison) {\n throw new Error(`Unsupported on-demand cursor operator: ${unwrapped.name}`);\n }\n\n return {\n type: \"comparison\",\n ...comparison,\n };\n}\n\nfunction negatePredicate(predicate: ReadPredicate): ReadPredicate {\n if (predicate.type === \"and\" || predicate.type === \"or\") {\n return {\n type: predicate.type === \"and\" ? \"or\" : \"and\",\n predicates: predicate.predicates.map(negatePredicate),\n };\n }\n\n const comparison = predicate as ReadComparisonPredicate;\n return {\n ...comparison,\n op: negateOperator(comparison.op),\n };\n}\n\nfunction negateOperator(operator: ReadComparisonPredicate[\"op\"]): ReadComparisonPredicate[\"op\"] {\n switch (operator) {\n case \"eq\":\n return \"ne\";\n case \"ne\":\n return \"eq\";\n case \"gt\":\n return \"lte\";\n case \"gte\":\n return \"lt\";\n case \"lt\":\n return \"gte\";\n case \"lte\":\n return \"gt\";\n case \"in\":\n throw new Error(\"Unsupported on-demand cursor operator: not(in)\");\n default:\n throw new Error(\"Unsupported on-demand cursor operator\");\n }\n}\n\nfunction comparisonFromExpression(\n expression: FuncExpression,\n): Omit<ReadComparisonPredicate, \"type\"> | undefined {\n const op = toReadFilterOperator(expression.name);\n const [left, right] = expression.args;\n if (!op || !isRefExpression(left) || !isValExpression(right)) {\n return undefined;\n }\n\n return {\n field: left.path.join(\".\"),\n op,\n value: right.value,\n };\n}\n\nfunction toReadOrderByList(orderBy: LoadSubsetOptions[\"orderBy\"]): Array<ReadOrderBy> {\n return (orderBy ?? []).map((sort) => {\n const expression = unwrapExpression(sort.expression);\n if (!isRefExpression(expression)) {\n throw new Error(`On-demand orderBy must be a field reference`);\n }\n\n return toReadOrderBy({\n field: expression.path,\n direction: sort.compareOptions.direction,\n });\n });\n}\n\nfunction toReadOrderBy(sort: { field: Array<string | number>; direction: \"asc\" | \"desc\" }) {\n return {\n field: sort.field.join(\".\"),\n direction: sort.direction,\n };\n}\n\nfunction toReadFilterOperator(operator: string): ReadFilter[\"op\"] | undefined {\n switch (operator) {\n case \"eq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"in\":\n return operator;\n case \"not_eq\":\n return \"ne\";\n case \"not_gt\":\n return \"lte\";\n case \"not_gte\":\n return \"lt\";\n case \"not_lt\":\n return \"gte\";\n case \"not_lte\":\n return \"gt\";\n default:\n return undefined;\n }\n}\n\ninterface Expression {\n type: \"func\" | \"ref\" | \"val\";\n name?: string;\n args?: Array<unknown>;\n path?: Array<string | number>;\n value?: unknown;\n}\n\ntype FuncExpression = Expression & { args: Array<unknown>; name: string; type: \"func\" };\ntype RefExpression = Expression & { path: Array<string | number>; type: \"ref\" };\n\nfunction unwrapExpression(value: unknown): unknown {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"expression\" in value &&\n isExpression((value as { expression: unknown }).expression)\n ) {\n return (value as { expression: unknown }).expression;\n }\n\n return value;\n}\n\nfunction isExpression(value: unknown): value is Expression {\n return typeof value === \"object\" && value !== null && \"type\" in value;\n}\n\nfunction isFuncExpression(value: unknown): value is FuncExpression {\n return (\n isExpression(value) &&\n value.type === \"func\" &&\n typeof value.name === \"string\" &&\n Array.isArray(value.args)\n );\n}\n\nfunction isRefExpression(value: unknown): value is RefExpression {\n return isExpression(value) && value.type === \"ref\" && Array.isArray(value.path);\n}\n\nfunction isValExpression(value: unknown): value is Expression {\n return isExpression(value) && value.type === \"val\";\n}\n","import { type ChangeMessageOrDeleteKeyMessage, type Collection } from \"@tanstack/db\";\nimport type { ReadFilter, ReadPredicate } from \"./types\";\n\ntype Writer<T extends object, TKey extends string | number> = (\n message: ChangeMessageOrDeleteKeyMessage<T, TKey>,\n) => void;\n\ninterface SubsetState<TKey extends string | number> {\n filters: Array<ReadFilter>;\n keys: Set<TKey>;\n loaded: boolean;\n predicate?: ReadPredicate;\n refs: number;\n}\n\nexport interface RetainResult {\n loaded: boolean;\n}\n\nexport interface TrackRowResult {\n before: boolean;\n after: boolean;\n}\n\nexport class SubsetTracker<T extends object, TKey extends string | number> {\n private readonly subsets = new Map<string, SubsetState<TKey>>();\n private readonly keyRefs = new Map<TKey, number>();\n\n constructor(private readonly getKey: (item: T) => TKey) {}\n\n replace(\n subsetId: string,\n rows: Array<T>,\n filters: Array<ReadFilter>,\n predicate?: ReadPredicate,\n ): Array<TKey> {\n const previous = this.subsets.get(subsetId);\n const refs = previous?.refs ?? 0;\n if (previous) {\n this.releaseKeys(previous.keys);\n }\n\n const keys = new Set(rows.map((row) => this.getKey(row)));\n this.addKeys(keys);\n this.subsets.set(subsetId, {\n filters,\n keys,\n loaded: true,\n ...(predicate ? { predicate } : {}),\n refs,\n });\n\n const removed: Array<TKey> = [];\n previous?.keys.forEach((key) => {\n if (!keys.has(key) && !this.keyRefs.has(key)) {\n removed.push(key);\n }\n });\n return removed;\n }\n\n retain(subsetId: string): RetainResult {\n const subset = this.subsets.get(subsetId);\n if (subset) {\n subset.refs += 1;\n return { loaded: subset.loaded };\n }\n\n this.subsets.set(subsetId, { filters: [], keys: new Set(), loaded: false, refs: 1 });\n return { loaded: false };\n }\n\n trackRow(row: T): boolean {\n const result = this.reconcileRow(row);\n return result.before || result.after;\n }\n\n reconcileRow(row: T): TrackRowResult {\n const key = this.getKey(row);\n let before = false;\n\n this.subsets.forEach((subset) => {\n const had = subset.keys.has(key);\n before ||= had;\n\n if (matchesSubset(row, subset)) {\n if (!had) {\n subset.keys.add(key);\n this.keyRefs.set(key, (this.keyRefs.get(key) ?? 0) + 1);\n }\n return;\n }\n\n if (had) {\n subset.keys.delete(key);\n this.releaseKey(key);\n }\n });\n\n return {\n before,\n after: this.keyRefs.has(key),\n };\n }\n\n deleteKey(key: TKey): boolean {\n if (!this.keyRefs.has(key)) {\n return false;\n }\n\n this.subsets.forEach((subset) => {\n subset.keys.delete(key);\n });\n this.keyRefs.delete(key);\n return true;\n }\n\n release(subsetId: string, retain = false): Array<TKey> {\n const subset = this.subsets.get(subsetId);\n if (!subset) {\n return [];\n }\n\n subset.refs -= 1;\n if (subset.refs > 0) {\n return [];\n }\n\n subset.refs = 0;\n if (retain) {\n return [];\n }\n\n return this.expire(subsetId);\n }\n\n expire(subsetId: string): Array<TKey> {\n const subset = this.subsets.get(subsetId);\n if (!subset || subset.refs > 0) {\n return [];\n }\n\n this.subsets.delete(subsetId);\n return this.releaseKeys(subset.keys);\n }\n\n clear(): Array<TKey> {\n const keys = [...this.keyRefs.keys()];\n this.subsets.clear();\n this.keyRefs.clear();\n return keys;\n }\n\n private addKeys(keys: Set<TKey>): void {\n keys.forEach((key) => {\n this.keyRefs.set(key, (this.keyRefs.get(key) ?? 0) + 1);\n });\n }\n\n private releaseKeys(keys: Set<TKey>): Array<TKey> {\n const removed: Array<TKey> = [];\n keys.forEach((key) => {\n if (this.releaseKey(key)) {\n removed.push(key);\n }\n });\n return removed;\n }\n\n private releaseKey(key: TKey): boolean {\n const refs = (this.keyRefs.get(key) ?? 0) - 1;\n if (refs <= 0) {\n this.keyRefs.delete(key);\n return true;\n }\n\n this.keyRefs.set(key, refs);\n return false;\n }\n}\n\nexport function writeRows<T extends object, TKey extends string | number>(\n collection: Collection<T, TKey>,\n rows: Array<T>,\n getKey: (item: T) => TKey,\n write: Writer<T, TKey>,\n): void {\n for (const row of rows) {\n const key = getKey(row);\n write({\n type: collection.has(key) ? \"update\" : \"insert\",\n key,\n value: row,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>);\n }\n}\n\nfunction matchesFilters(row: unknown, filters: Array<ReadFilter>): boolean {\n return filters.every((filter) => matchesFilter(row, filter));\n}\n\nfunction matchesSubset<TKey extends string | number>(\n row: unknown,\n subset: SubsetState<TKey>,\n): boolean {\n return matchesFilters(row, subset.filters) && matchesPredicate(row, subset.predicate);\n}\n\nfunction matchesPredicate(row: unknown, predicate: ReadPredicate | undefined): boolean {\n if (!predicate) {\n return true;\n }\n\n if (predicate.type === \"comparison\") {\n return matchesFilter(row, predicate);\n }\n\n if (predicate.type === \"and\") {\n return predicate.predicates.every((child) => matchesPredicate(row, child));\n }\n\n return predicate.predicates.some((child) => matchesPredicate(row, child));\n}\n\nfunction matchesFilter(row: unknown, filter: ReadFilter): boolean {\n const value = valueAtPath(row, filter.field);\n\n switch (filter.op) {\n case \"eq\":\n return value === filter.value;\n case \"ne\":\n return value !== filter.value;\n case \"gt\":\n return compareValues(value, filter.value, (left, right) => left > right);\n case \"gte\":\n return compareValues(value, filter.value, (left, right) => left >= right);\n case \"lt\":\n return compareValues(value, filter.value, (left, right) => left < right);\n case \"lte\":\n return compareValues(value, filter.value, (left, right) => left <= right);\n case \"in\":\n return Array.isArray(filter.value) && filter.value.includes(value);\n }\n\n return false;\n}\n\nfunction compareValues(\n left: unknown,\n right: unknown,\n compare: (left: number | string, right: number | string) => boolean,\n): boolean {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return compare(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n return compare(left, right);\n }\n\n return false;\n}\n\nfunction valueAtPath(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, segment) => {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[segment];\n }, row);\n}\n","import type {\n CollectionConfig,\n InferSchemaOutput,\n LoadSubsetOptions,\n TransactionWithMutations,\n} from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { createBatch, toChangeMessage } from \"./batch\";\nimport { acquireSharedClient } from \"./client\";\nimport { initialReadQuery, readQueryForSubset, subsetId } from \"./read-query\";\nimport type { CollectionOptions } from \"./types\";\nimport { SubsetTracker, writeRows } from \"./subsets\";\n\nexport function collectionOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number = string | number,\n>(\n options: CollectionOptions<InferSchemaOutput<TSchema>, TKey, TSchema> & {\n schema: TSchema;\n },\n): CollectionConfig<InferSchemaOutput<TSchema>, TKey, TSchema> & {\n schema: TSchema;\n};\n\nexport function collectionOptions<T extends object, TKey extends string | number = string | number>(\n options: CollectionOptions<T, TKey, never> & {\n schema?: never;\n },\n): CollectionConfig<T, TKey, never> & {\n schema?: never;\n};\n\nexport function collectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n>(options: CollectionOptions<T, TKey, TSchema>): CollectionConfig<T, TKey, TSchema> {\n let lease: ReturnType<typeof acquireSharedClient> | undefined;\n let client = options.client;\n let activeSubsets: SubsetTracker<T, TKey> | undefined;\n\n if (!client) {\n if (!options.url) {\n throw new Error(\"collectionOptions requires either client or url\");\n }\n\n lease = acquireSharedClient({\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n client = lease.client;\n }\n\n return {\n ...(options.id ? { id: options.id } : {}),\n ...(options.gcTime !== undefined ? { gcTime: options.gcTime } : {}),\n ...(options.schema ? { schema: options.schema } : {}),\n ...(options.startSync !== undefined ? { startSync: options.startSync } : {}),\n ...(options.syncMode ? { syncMode: options.syncMode } : {}),\n ...(options.autoIndex !== undefined ? { autoIndex: options.autoIndex } : {}),\n ...(options.defaultIndexType !== undefined\n ? { defaultIndexType: options.defaultIndexType }\n : {}),\n getKey: options.getKey,\n sync: {\n sync: ({ begin, write, commit, markReady, collection }) => {\n const subsets = new SubsetTracker<T, TKey>(options.getKey);\n activeSubsets = subsets;\n const subsetGcTime = options.gcTime ?? 300000;\n const retentionTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const deleteKeys = (keys: Array<TKey>) => {\n if (keys.length === 0) return;\n\n begin();\n for (const key of keys) {\n write({ type: \"delete\", key });\n }\n commit();\n };\n const cancelRetention = (id: string) => {\n const timer = retentionTimers.get(id);\n if (!timer) return;\n\n clearTimeout(timer);\n retentionTimers.delete(id);\n };\n const scheduleRetention = (id: string) => {\n if (!Number.isFinite(subsetGcTime)) {\n return;\n }\n\n if (subsetGcTime <= 0) {\n deleteKeys(subsets.expire(id));\n return;\n }\n\n cancelRetention(id);\n retentionTimers.set(\n id,\n setTimeout(() => {\n retentionTimers.delete(id);\n deleteKeys(subsets.expire(id));\n }, subsetGcTime),\n );\n };\n const subscription = client.subscribe(options.collection, (broadcast) => {\n if ((broadcast.invalidations ?? []).length > 0 && options.syncMode === \"on-demand\") {\n deleteKeys(subsets.clear());\n }\n\n const changes = broadcast.updates.flatMap((update) => {\n if (update.collection !== options.collection) return [];\n const ownUpdate = update.clientId === client.clientId;\n if ((options.ignoreOwnUpdates ?? false) && ownUpdate) {\n return [];\n }\n\n if (options.syncMode !== \"on-demand\") {\n return [toChangeMessage<T, TKey>(update, collection.has(update.key as TKey))];\n }\n\n const key = update.key as TKey;\n const exists = collection.has(key);\n if (update.type === \"delete\") {\n subsets.deleteKey(key);\n return exists ? [{ type: \"delete\" as const, key }] : [];\n }\n\n const current = collection.get(key) as T | undefined;\n const row =\n update.type === \"update\" && current\n ? ({ ...current, ...(update.value as Partial<T>) } as T)\n : (update.value as T);\n const tracked = subsets.reconcileRow(row);\n\n if (ownUpdate || exists || tracked.after) {\n return [toChangeMessage<T, TKey>(update, exists)];\n }\n\n return [];\n });\n\n if (changes.length === 0) {\n return;\n }\n\n begin();\n for (const change of changes) {\n write(change);\n }\n commit();\n });\n\n const readSubset = (subsetOptions: LoadSubsetOptions): true | Promise<void> => {\n const id = subsetId(subsetOptions);\n cancelRetention(id);\n const retained = subsets.retain(id);\n if (retained.loaded) {\n return true;\n }\n\n return (async () => {\n const query = readQueryForSubset(\n options.collection,\n options.read === false ? undefined : options.read,\n subsetOptions,\n );\n await subscription.ready;\n const result = await client.read<T>(query);\n const removedKeys = subsets.replace(\n id,\n result.rows,\n query.filters ?? [],\n query.predicate,\n );\n\n begin();\n writeRows(collection, result.rows, options.getKey, write);\n for (const key of removedKeys) {\n write({ type: \"delete\", key });\n }\n commit();\n })().catch((error: unknown) => {\n deleteKeys(subsets.release(id));\n throw error;\n });\n };\n\n if (options.syncMode === \"on-demand\") {\n markReady();\n return {\n loadSubset: readSubset,\n unloadSubset: (subsetOptions: LoadSubsetOptions) => {\n const id = subsetId(subsetOptions);\n const removedKeys = subsets.release(id, subsetGcTime !== 0);\n deleteKeys(removedKeys);\n if (removedKeys.length === 0) scheduleRetention(id);\n },\n cleanup: () => {\n retentionTimers.forEach((timer) => {\n clearTimeout(timer);\n });\n retentionTimers.clear();\n subsets.clear();\n if (activeSubsets === subsets) {\n activeSubsets = undefined;\n }\n subscription.unsubscribe();\n lease?.release();\n },\n };\n }\n\n const initialQuery = initialReadQuery(options.collection, options.read);\n if (!initialQuery) {\n void subscription.ready.then(() => {\n markReady();\n });\n } else {\n void subscription.ready\n .then(() => client.read<T>(initialQuery))\n .then((result) => {\n if (result.rows.length > 0) {\n begin();\n writeRows(collection, result.rows, options.getKey, write);\n commit();\n }\n markReady();\n });\n }\n\n return () => {\n if (activeSubsets === subsets) {\n activeSubsets = undefined;\n }\n subscription.unsubscribe();\n lease?.release();\n };\n },\n rowUpdateMode: \"partial\",\n },\n onInsert: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n onUpdate: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n onDelete: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n } as CollectionConfig<T, TKey, TSchema>;\n}\n\nfunction trackLocalTransaction<T extends object, TKey extends string | number>(\n subsets: SubsetTracker<T, TKey> | undefined,\n syncMode: CollectionConfig<T, TKey>[\"syncMode\"],\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): void {\n if (syncMode !== \"on-demand\" || !subsets) {\n return;\n }\n\n for (const mutation of transaction.mutations) {\n if (mutation.type === \"delete\") {\n subsets.deleteKey(mutation.key as TKey);\n continue;\n }\n\n subsets.reconcileRow(mutation.modified as T);\n }\n}\n","export type CollectionScopeParams = Record<string, string | number>;\n\nexport function collectionScope(path: string, params: CollectionScopeParams): string {\n const segments = collectionPathSegments(path).map((segment) => segmentValue(segment, params));\n return `/${segments.map(normalizeSegment).join(\"/\")}/`;\n}\n\nexport function firstNewPathParam(\n childPath: string | undefined,\n parentPath: string,\n): string | undefined {\n if (!childPath) return undefined;\n\n const parentParams = new Set(pathParams(parentPath));\n return pathParams(childPath).find((param) => !parentParams.has(param));\n}\n\nexport function collectionPathSegments(path: string): Array<string> {\n return path\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n}\n\nexport function collectionPathParamName(segment: string): string | undefined {\n return (\n segment.match(/^\\{([A-Za-z_][A-Za-z0-9_]*)\\}$/)?.[1] ??\n segment.match(/^:([A-Za-z_][A-Za-z0-9_]*)$/)?.[1]\n );\n}\n\nexport function isCollectionPathParam(segment: string): boolean {\n return collectionPathParamName(segment) !== undefined;\n}\n\nfunction segmentValue(segment: string, params: CollectionScopeParams): string {\n const param = collectionPathParamName(segment);\n if (!param) return segment;\n\n const value = params[param];\n if (value === undefined) {\n throw new Error(`Missing collection path parameter: ${param}`);\n }\n\n return String(value);\n}\n\nfunction pathParams(path: string): Array<string> {\n return collectionPathSegments(path).flatMap((segment) => {\n const param = collectionPathParamName(segment);\n return param ? [param] : [];\n });\n}\n\nfunction normalizeSegment(segment: string): string {\n return encodeURIComponent(decodeURIComponent(segment));\n}\n","import { collectionPathSegments, isCollectionPathParam } from \"./collection-path\";\n\nexport function defaultCollectionApiPath(path: string, name: string): string {\n const prefix = collectionPathSegments(path)\n .filter((segment) => !isCollectionPathParam(segment))\n .join(\".\");\n\n return prefix ? `${prefix}.${name}` : name;\n}\n","import { createCollection, type Collection, type InferSchemaOutput } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { collectionScope, firstNewPathParam, type CollectionScopeParams } from \"./collection-path\";\nimport { collectionOptions } from \"./collection\";\nimport { acquireSharedClient } from \"./client\";\nimport { defaultCollectionApiPath } from \"./collection-api\";\nimport type {\n ChildCollectionTypeOptions,\n ChildManagers,\n CollectionApiMethod,\n CollectionApiMethods,\n CollectionTypeApi,\n CollectionCache,\n CollectionCacheEntry,\n CollectionEntity,\n CollectionType,\n CollectionTypeBaseOptions,\n CollectionTypeChildren,\n CollectionTypeConnection,\n CollectionTypeId,\n CollectionTypeOptions,\n CollectionUsage,\n OptionalCollectionTypeConnection,\n} from \"./collection-type-types\";\nimport type { ApiContract, Client } from \"./types\";\n\nexport type { CollectionScopeParams };\nexport type {\n ChildCollectionTypeOptions,\n CollectionApiHandler,\n CollectionApiHandlerArgs,\n CollectionApiMethod,\n CollectionApiMethods,\n CollectionTypeApi,\n CollectionEntity,\n CollectionType,\n CollectionTypeOptions,\n CollectionUsage,\n} from \"./collection-type-types\";\n\nexport function createCollectionTypeFromOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number = string | number,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<InferSchemaOutput<TSchema>, TKey> = {},\n>(\n options: CollectionTypeOptions<InferSchemaOutput<TSchema>, TKey, TSchema, TChildren, TApi> & {\n schema: TSchema;\n },\n): CollectionType<InferSchemaOutput<TSchema>, TKey, TChildren, TApi>;\n\nexport function createCollectionTypeFromOptions<\n T extends object,\n TKey extends string | number = string | number,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n>(\n options: CollectionTypeOptions<T, TKey, never, TChildren, TApi> & {\n schema?: never;\n },\n): CollectionType<T, TKey, TChildren, TApi>;\n\nexport function createCollectionTypeFromOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n>(\n options: CollectionTypeOptions<T, TKey, TSchema, TChildren, TApi>,\n): CollectionType<T, TKey, TChildren, TApi> {\n const connection = connectionFrom(options);\n\n if (!connection) {\n throw new Error(\"CollectionTypes.builder requires either client or url\");\n }\n\n return new CollectionTypeManager<T, TKey, TSchema, TChildren, TApi>(\n options,\n connection,\n {},\n new Map(),\n ).api();\n}\n\nclass CollectionTypeManager<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren,\n TApi extends CollectionTypeApi<T, TKey> = {},\n> {\n constructor(\n private readonly options: CollectionTypeBaseOptions<T, TKey, TSchema, TChildren, TApi>,\n private readonly connection: CollectionTypeConnection,\n private readonly params: CollectionScopeParams,\n private readonly cache: CollectionCache,\n ) {}\n\n api(): CollectionType<T, TKey, TChildren, TApi> {\n const base = {\n all: (params: CollectionScopeParams = {}) => this.all(params),\n delete: (...args: Parameters<Collection<T, TKey>[\"delete\"]>) => this.all({}).delete(...args),\n insert: (...args: Parameters<Collection<T, TKey>[\"insert\"]>) => this.all({}).insert(...args),\n with: (params: CollectionScopeParams) => this.with(params),\n withId: (id: TKey, childParam?: string) => this.withId(id, childParam),\n update: (...args: Parameters<Collection<T, TKey>[\"update\"]>) => this.all({}).update(...args),\n usage: () => this.usage(),\n };\n const withApi = withApiMethods(base, this.apiMethods());\n return withChildren(withApi, this.childManagers(this.params)) as CollectionType<\n T,\n TKey,\n TChildren,\n TApi\n >;\n }\n\n private all(params: CollectionScopeParams): Collection<T, TKey> {\n const scope = collectionScope(this.options.path, { ...this.params, ...params });\n const key = `${this.options.path}\\n${scope}`;\n const existing = this.cache.get(key) as CollectionCacheEntry<T, TKey> | undefined;\n\n if (existing) {\n existing.usage.accessCount += 1;\n existing.usage.lastAccessedAt = Date.now();\n return existing.collection;\n }\n\n const id = collectionId(this.options.id, this.options.path, scope);\n const collection = createCollection(\n collectionOptions({\n ...collectionConfig(this.options),\n ...this.connection,\n id,\n collection: scope,\n } as any),\n ) as unknown as Collection<T, TKey>;\n\n const usage = {\n id,\n path: this.options.path,\n scope,\n accessCount: 1,\n createdAt: Date.now(),\n lastAccessedAt: Date.now(),\n };\n\n this.cache.set(key, { collection, usage });\n return collection;\n }\n\n private with(params: CollectionScopeParams): CollectionType<T, TKey, TChildren, TApi> {\n return new CollectionTypeManager(\n this.options,\n this.connection,\n { ...this.params, ...params },\n this.cache,\n ).api();\n }\n\n private withId(id: TKey, childParam?: string): CollectionEntity<T, TKey, TChildren> {\n const base = {\n all: () => this.all({}),\n delete: (config?: Parameters<Collection<T, TKey>[\"delete\"]>[1]) =>\n this.all({}).delete(id, config),\n get: () => this.all({}).get(id),\n update: (...args: Array<unknown>) => this.all({}).update(id, ...(args as [any, any])),\n };\n return withChildren(\n base,\n this.childManagers(this.childParams(id, childParam)),\n ) as CollectionEntity<T, TKey, TChildren>;\n }\n\n private usage(): Array<CollectionUsage> {\n return [...this.cache.values()].map((entry) => ({ ...entry.usage }));\n }\n\n private apiMethods(): CollectionApiMethods<TApi> {\n return Object.fromEntries(\n Object.entries(this.options.api ?? {}).map(([name, method]) => [\n name,\n (...args: Array<unknown>) => this.callApi(name, method, args[0]),\n ]),\n ) as CollectionApiMethods<TApi>;\n }\n\n private async callApi(\n name: string,\n method: CollectionApiMethod<unknown, unknown, T, TKey>,\n input: unknown,\n ): Promise<unknown> {\n if (method.handler) {\n const scope = collectionScope(this.options.path, this.params);\n return method.handler({\n input,\n collection: this.all({}),\n params: this.params,\n scope,\n });\n }\n\n const path = method.path ?? defaultCollectionApiPath(this.options.path, name);\n const lease = this.connection.client ? undefined : acquireSharedClient(this.connection);\n const client = (this.connection.client ?? lease?.client) as Client<ApiContract>;\n\n try {\n return await client.call(path, input);\n } finally {\n lease?.release();\n }\n }\n\n private childManagers(params: CollectionScopeParams): ChildManagers<TChildren> {\n const children = (this.options.children ?? {}) as CollectionTypeChildren;\n return Object.fromEntries(\n Object.entries(children).map(([name, child]) => [\n name,\n new CollectionTypeManager<any, any, any, any>(\n child,\n connectionFrom(child) ?? this.connection,\n params,\n this.cache,\n ).api(),\n ]),\n ) as ChildManagers<TChildren>;\n }\n\n private childParams(id: TKey, childParam?: string): CollectionScopeParams {\n const param = childParam ?? firstChildParam(this.options);\n return param ? { ...this.params, [param]: id } : this.params;\n }\n}\n\nfunction collectionConfig<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n>(options: CollectionTypeBaseOptions<T, TKey, TSchema, any, any>) {\n const { api, children, id, name, parentParam, path, ...config } = options;\n void api;\n void children;\n void id;\n void name;\n void parentParam;\n void path;\n return config;\n}\n\nfunction withChildren<TTarget extends object, TChildren extends CollectionTypeChildren>(\n target: TTarget,\n children: ChildManagers<TChildren>,\n): TTarget & ChildManagers<TChildren> {\n return Object.assign(target, children);\n}\n\nfunction withApiMethods<TTarget extends object, TApi extends CollectionTypeApi<any, any>>(\n target: TTarget,\n api: CollectionApiMethods<TApi>,\n): TTarget & CollectionApiMethods<TApi> {\n for (const name of Object.keys(api)) {\n if (name in target) {\n throw new Error(`Collection API method conflicts with existing property: ${name}`);\n }\n }\n\n return Object.assign(target, api);\n}\n\nfunction connectionFrom(\n options: OptionalCollectionTypeConnection,\n): CollectionTypeConnection | undefined {\n if (options.client) {\n return { client: options.client };\n }\n\n if (options.url) {\n return {\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n };\n }\n\n return undefined;\n}\n\nfunction collectionId(id: CollectionTypeId | undefined, path: string, scope: string): string {\n return typeof id === \"function\" ? id({ path, scope }) : (id ?? scope);\n}\n\nfunction firstChildParam(\n options: CollectionTypeBaseOptions<any, any, any, any, any>,\n): string | undefined {\n const child = Object.values(options.children ?? {})[0] as\n | ChildCollectionTypeOptions<any, any, any, any, any>\n | undefined;\n return child?.parentParam ?? firstNewPathParam(child?.path, options.path);\n}\n","import type { BaseCollectionConfig } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n ApiDefinition,\n CollectionAtPath,\n CollectionDefinition,\n CollectionDefinitions,\n CollectionPath,\n CollectionSet,\n} from \"@lsync/definitions\";\nimport { createCollectionTypeFromOptions } from \"./collection-type\";\nimport type {\n ChildCollectionTypeOptions,\n CollectionApiMethod,\n CollectionType,\n CollectionTypeApi,\n CollectionTypeConnection,\n} from \"./collection-type-types\";\nimport type { Client } from \"./types\";\n\ntype BuilderIndexMode = NonNullable<BaseCollectionConfig<any, any, any>[\"autoIndex\"]>;\ntype BuilderIndexType = BaseCollectionConfig<any, any, any>[\"defaultIndexType\"];\ntype BuilderSyncMode = \"eager\" | \"on-demand\";\n\nexport function collectionTypesFrom<TCollections extends CollectionDefinitions>(\n definitions: CollectionSet<TCollections>,\n): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(definitions.collections, {}, undefined);\n}\n\nexport class DefinitionCollectionTypesBuilder<TCollections extends CollectionDefinitions> {\n constructor(\n private readonly definitions: TCollections,\n private readonly overrides: Record<string, ClientCollectionOverride>,\n private readonly connection: CollectionTypeConnection | undefined,\n ) {}\n\n client(client: Client): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(this.definitions, this.overrides, { client });\n }\n\n url(\n url: string | URL,\n options: { clientId?: string } = {},\n ): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(this.definitions, this.overrides, {\n url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n }\n\n collection<TPath extends CollectionPath<TCollections>>(\n path: TPath,\n configure: (\n collection: ClientCollectionBuilder<CollectionAtPath<TCollections, TPath>>,\n ) => ClientCollectionBuilder<CollectionAtPath<TCollections, TPath>>,\n ): DefinitionCollectionTypesBuilder<TCollections> {\n const override = configure(new ClientCollectionBuilder({})).toOverride();\n return new DefinitionCollectionTypesBuilder(\n this.definitions,\n { ...this.overrides, [path]: override },\n this.connection,\n );\n }\n\n build(): CollectionManagers<TCollections> {\n if (!this.connection) {\n throw new Error(\"CollectionTypes.from requires either client or url\");\n }\n\n return Object.fromEntries(\n Object.entries(this.definitions).map(([name, definition]) => [\n name,\n collectionTypeFromDefinition(definition, name, this.overrides, this.connection!),\n ]),\n ) as CollectionManagers<TCollections>;\n }\n}\n\nexport class ClientCollectionBuilder<TDefinition> {\n constructor(private readonly override: ClientCollectionOverride) {}\n\n sync(syncMode: BuilderSyncMode): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({ ...this.override, syncMode });\n }\n\n index(\n autoIndex: BuilderIndexMode,\n defaultIndexType?: BuilderIndexType,\n ): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({\n ...this.override,\n autoIndex,\n ...(defaultIndexType ? { defaultIndexType } : {}),\n });\n }\n\n toOverride(): ClientCollectionOverride {\n return this.override;\n }\n}\n\nexport type CollectionManagers<TCollections extends CollectionDefinitions> = {\n [TName in keyof TCollections]: CollectionTypeForDefinition<TCollections[TName]>;\n};\n\ntype CollectionTypeForDefinition<TDefinition> =\n TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi>\n ? CollectionType<\n TRow,\n Extract<TRow[TKey], string | number>,\n ChildOptionsForDefinitions<TChildren>,\n ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>\n >\n : never;\n\ntype ChildOptionsForDefinitions<TChildren extends CollectionDefinitions> = {\n [TName in keyof TChildren]: ChildOptionForDefinition<TChildren[TName]>;\n};\n\ntype ChildOptionForDefinition<TDefinition> =\n TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi>\n ? ChildCollectionTypeOptions<\n TRow,\n Extract<TRow[TKey], string | number>,\n StandardSchemaV1,\n ChildOptionsForDefinitions<TChildren>,\n ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>\n >\n : never;\n\ntype ApiMethodsForDefinitions<\n TApi extends Record<string, ApiDefinition<any, any>>,\n TRow extends object,\n TKey extends string | number,\n> = {\n [TName in keyof TApi]: TApi[TName] extends ApiDefinition<infer TInput, infer TOutput>\n ? CollectionApiMethod<TInput, TOutput, TRow, TKey>\n : never;\n};\n\ninterface ClientCollectionOverride {\n syncMode?: BuilderSyncMode;\n autoIndex?: BuilderIndexMode;\n defaultIndexType?: BuilderIndexType;\n}\n\nfunction collectionTypeFromDefinition(\n definition: CollectionDefinition,\n dotPath: string,\n overrides: Record<string, ClientCollectionOverride>,\n connection: CollectionTypeConnection,\n): CollectionType<any, any, any, any> {\n return createCollectionTypeFromOptions({\n ...collectionOptionsFromDefinition(definition, dotPath, overrides),\n ...connection,\n } as any);\n}\n\nfunction collectionOptionsFromDefinition(\n definition: CollectionDefinition,\n dotPath: string,\n overrides: Record<string, ClientCollectionOverride>,\n): Record<string, unknown> {\n return {\n ...overrides[dotPath],\n name: definition.name,\n path: definition.path,\n schema: definition.schema,\n getKey: (item: Record<string, unknown>) => item[definition.key],\n children: Object.fromEntries(\n Object.entries(definition.children).map(([name, child]) => [\n name,\n collectionOptionsFromDefinition(child, `${dotPath}.${name}`, overrides),\n ]),\n ),\n api: Object.fromEntries(\n Object.entries(definition.api).map(([name, api]) => [\n name,\n api.path ? { path: api.path } : {},\n ]),\n ) satisfies CollectionTypeApi<any, any>,\n };\n}\n","export function rootPathForName(name: string): string {\n return `/${encodeURIComponent(name)}/`;\n}\n\nexport function childPathForName(parentPath: string, parentParam: string, name: string): string {\n return `${parentPath.replace(/\\/+$/g, \"\")}/{${parentParam}}/${encodeURIComponent(name)}/`;\n}\n\nexport function parentIdParamForName(name: string): string {\n return `${name}Id`;\n}\n","export function cloneImmutable(value: unknown): unknown {\n if (Array.isArray(value)) {\n return Object.freeze(value.map(cloneImmutable));\n }\n\n if (!isPlainObject(value)) {\n return value;\n }\n\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).map(([nestedKey, nestedValue]) => [\n nestedKey,\n cloneImmutable(nestedValue),\n ]),\n ),\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false;\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n","import { cloneImmutable } from \"./immutable\";\nimport type { CollectionApiMethod, CollectionTypeApi } from \"./collection-type-types\";\n\nexport type BuilderState = Record<string, unknown> & {\n api?: CollectionTypeApi<any, any>;\n name?: string;\n path?: string;\n};\n\nexport function freezeBuilderState(state: BuilderState): Readonly<BuilderState> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(state)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, copyBuilderStateValue(key, value)]),\n ) as BuilderState,\n );\n}\n\nfunction copyBuilderStateValue(key: string, value: unknown): unknown {\n if (key === \"api\" && isApiMap(value)) {\n return freezeApiMap(value);\n }\n\n if (key === \"url\" && value instanceof URL) {\n return value.toString();\n }\n\n return cloneImmutable(value);\n}\n\nfunction freezeApiMap(api: CollectionTypeApi<any, any>): CollectionTypeApi<any, any> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(api).map(([name, method]) => [name, freezeApiMethod(method)]),\n ),\n );\n}\n\nfunction freezeApiMethod<\n TInput,\n TOutput,\n T extends object = any,\n TKey extends string | number = any,\n>(\n method: CollectionApiMethod<TInput, TOutput, T, TKey>,\n): CollectionApiMethod<TInput, TOutput, T, TKey> {\n return Object.freeze({ ...method });\n}\n\nfunction isApiMap(value: unknown): value is CollectionTypeApi<any, any> {\n return typeof value === \"object\" && value !== null;\n}\n","import type { BaseCollectionConfig, Collection, InferSchemaOutput } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { childPathForName, parentIdParamForName, rootPathForName } from \"./collection-name\";\nimport { createCollectionTypeFromOptions } from \"./collection-type\";\nimport { freezeBuilderState, type BuilderState } from \"./collection-type-builder-state\";\nimport type {\n ChildCollectionTypeOptions,\n CollectionApiHandlerArgs,\n CollectionApiMethod,\n CollectionType as CollectionTypeInstance,\n CollectionTypeApi,\n CollectionTypeChildren,\n} from \"./collection-type-types\";\nimport type { Client } from \"./types\";\nimport { collectionTypesFrom } from \"./definition-builder\";\n\ntype BuilderApiContext<TInput, T extends object, TKey extends string | number> = Omit<\n CollectionApiHandlerArgs<TInput, T, TKey>,\n \"input\"\n>;\n\ntype BuilderApiHandler<TInput, TOutput, T extends object, TKey extends string | number> = (\n input: TInput,\n context: BuilderApiContext<TInput, T, TKey>,\n) => TOutput | Promise<TOutput>;\n\ntype BuilderSyncMode = \"eager\" | \"on-demand\";\ntype BuilderIndexMode = NonNullable<BaseCollectionConfig<any, any, any>[\"autoIndex\"]>;\ntype BuilderIndexType = BaseCollectionConfig<any, any, any>[\"defaultIndexType\"];\n\nexport function collectionTypeBuilder(): Pick<\n CollectionTypeBuilder<InferSchemaOutput<StandardSchemaV1>, \"\", StandardSchemaV1>,\n \"name\"\n> {\n return new CollectionTypeBuilder({});\n}\n\nexport const CollectionTypes = {\n builder: collectionTypeBuilder,\n from: collectionTypesFrom,\n};\n\nexport class CollectionTypeBuilder<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n> {\n private readonly state: Readonly<BuilderState>;\n\n constructor(state: BuilderState) {\n this.state = freezeBuilderState(state);\n }\n\n client(client: Client): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi> {\n return this.next({ client, url: undefined, clientId: undefined });\n }\n\n url(\n url: string | URL,\n options: { clientId?: string } = {},\n ): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi> {\n return this.next({\n client: undefined,\n url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n }\n\n name(name: string): Pick<CollectionTypeBuilder<T, TKey, TSchema, TChildren>, \"schema\"> {\n return this.next({ name, path: rootPathForName(name) }) as unknown as CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren\n >;\n }\n\n schema<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n ): Omit<\n CollectionTypeBuilder<InferSchemaOutput<TSchema>, TKey, TSchema, TChildren>,\n \"name\" | \"schema\"\n > {\n return this.next({ schema }) as unknown as CollectionTypeBuilder<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TChildren\n >;\n }\n\n sync(syncMode: BuilderSyncMode): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi> {\n return this.next({ syncMode });\n }\n\n index(\n autoIndex: BuilderIndexMode,\n defaultIndexType?: BuilderIndexType,\n ): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi> {\n return this.next({\n autoIndex,\n ...(defaultIndexType ? { defaultIndexType } : {}),\n });\n }\n\n child<TName extends string, TBuilder extends CollectionTypeBuilder<any, any, any, any, any>>(\n name: TName,\n configure: (\n builder: Pick<\n CollectionTypeBuilder<InferSchemaOutput<StandardSchemaV1>, \"\", StandardSchemaV1>,\n \"schema\"\n >,\n ) => TBuilder,\n ): CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren & Record<TName, ChildOptionsForBuilder<TBuilder>>,\n TApi\n > {\n const child = configure(this.childBuilder(name));\n const children =\n typeof this.state.children === \"object\" && this.state.children !== null\n ? this.state.children\n : {};\n return this.next({\n children: {\n ...children,\n [name]: child.state,\n },\n }) as unknown as CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren & Record<TName, ChildOptionsForBuilder<TBuilder>>,\n TApi\n >;\n }\n\n key<TKeyNext extends string | number>(\n getKey: (item: T) => TKeyNext,\n ): CollectionTypeBuilder<T, TKeyNext, TSchema, TChildren> {\n return this.next({ getKey }) as unknown as CollectionTypeBuilder<\n T,\n TKeyNext,\n TSchema,\n TChildren\n >;\n }\n\n api<TName extends string, TInput = undefined, TOutput = unknown>(\n name: TName,\n method?: CollectionApiMethod<TInput, TOutput, T, TKey>,\n ): CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren,\n TApi & Record<TName, CollectionApiMethod<TInput, TOutput, T, TKey>>\n >;\n api<TName extends string, TInput, TOutput>(\n name: TName,\n handler: BuilderApiHandler<TInput, TOutput, T, TKey>,\n ): CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren,\n TApi & Record<TName, CollectionApiMethod<TInput, TOutput, T, TKey>>\n >;\n api<TName extends string, TInput, TOutput>(\n name: TName,\n method?:\n | CollectionApiMethod<TInput, TOutput, T, TKey>\n | BuilderApiHandler<TInput, TOutput, T, TKey>,\n ) {\n const entry = typeof method === \"function\" ? localApiMethod(method) : (method ?? {});\n return this.next({\n api: {\n ...this.state.api,\n [name]: entry,\n },\n });\n }\n\n build(): CollectionTypeInstance<T, TKey, TChildren, TApi> {\n if (!this.state.name || !this.state.path) {\n throw new Error(\"CollectionTypes.builder requires a name\");\n }\n\n if (!this.state.getKey) {\n throw new Error(\"CollectionTypes.builder requires a key function\");\n }\n\n return createCollectionTypeFromOptions(this.state as any) as CollectionTypeInstance<\n T,\n TKey,\n TChildren,\n TApi\n >;\n }\n\n private next(updates: Partial<BuilderState>) {\n return new CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi>({\n ...this.state,\n ...updates,\n });\n }\n\n private childBuilder(\n name: string,\n ): Pick<\n CollectionTypeBuilder<InferSchemaOutput<StandardSchemaV1>, \"\", StandardSchemaV1>,\n \"schema\"\n > {\n if (!this.state.name || !this.state.path) {\n throw new Error(\"CollectionTypes.builder.child requires a parent name\");\n }\n\n const parentParam = parentIdParamForName(this.state.name);\n return new CollectionTypeBuilder({\n name,\n parentParam,\n path: childPathForName(this.state.path, parentParam, name),\n });\n }\n}\n\ntype ChildOptionsForBuilder<TBuilder> =\n TBuilder extends CollectionTypeBuilder<\n infer T,\n infer TKey,\n infer TSchema,\n infer TChildren,\n infer TApi\n >\n ? ChildCollectionTypeOptions<T, TKey, TSchema, TChildren, TApi>\n : never;\n\nfunction localApiMethod<TInput, TOutput, T extends object, TKey extends string | number>(\n handler: BuilderApiHandler<TInput, TOutput, T, TKey>,\n): CollectionApiMethod<TInput, TOutput, T, TKey> {\n return Object.freeze({\n handler: ({ input, collection, params, scope }: CollectionApiHandlerArgs<TInput, T, TKey>) =>\n handler(input, {\n collection: collection as Collection<T, TKey>,\n params,\n scope,\n }),\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["collectionScope","normalizeSegment","collectionScope","collectionScope"],"sources":["../src/batch.ts","../src/client-rpc.ts","../src/client-subscriptions.ts","../src/client-reconnect.ts","../src/client-shared.ts","../src/client.ts","../src/subsets.ts","../src/collection-broadcast.ts","../src/read-query.ts","../src/initial-sync.ts","../src/sync-session.ts","../src/offline-cache.ts","../src/offline-sync.ts","../src/local-transaction.ts","../src/collection.ts","../src/collection-path.ts","../src/collection-api.ts","../src/collection-type-cache.ts","../src/collection-type-config.ts","../src/collection-type.ts","../src/definition-builder.ts"],"sourcesContent":["import type {\n ChangeMessageOrDeleteKeyMessage,\n PendingMutation,\n TransactionWithMutations,\n} from \"@tanstack/db\";\nimport type { Batch, Update } from \"./types\";\n\nexport function createBatch<T extends object>(\n collection: string,\n clientId: string,\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): Batch {\n return {\n updates: transaction.mutations.map((mutation) => toUpdate(collection, clientId, mutation)),\n };\n}\n\nfunction toUpdate<T extends object>(\n collection: string,\n clientId: string,\n mutation: PendingMutation<T>,\n): Update {\n const base = {\n id: mutation.mutationId,\n collection,\n key: mutation.key as string | number,\n type: mutation.type,\n clientId,\n createdAt: mutation.createdAt.getTime(),\n };\n\n if (mutation.type === \"delete\") {\n return {\n ...base,\n type: \"delete\",\n previousValue: mutation.original,\n };\n }\n\n if (mutation.type === \"update\") {\n return {\n ...base,\n type: \"update\",\n value: mutation.modified,\n previousValue: mutation.original,\n };\n }\n\n return {\n ...base,\n type: \"insert\",\n value: mutation.modified,\n };\n}\n\nexport function toChangeMessage<T extends object, TKey extends string | number>(\n update: Update,\n existing?: boolean,\n): ChangeMessageOrDeleteKeyMessage<T, TKey> {\n if (update.type === \"delete\") {\n return {\n type: \"delete\",\n key: update.key as TKey,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>;\n }\n\n const type =\n update.type === \"update\" && existing === false\n ? \"insert\"\n : update.type === \"insert\" && existing === true\n ? \"update\"\n : update.type;\n\n return {\n type,\n key: update.key as TKey,\n value: update.value as T,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>;\n}\n","import type { RequestId } from \"@lsync/transport\";\n\nexport interface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n}\n\nexport function rejectPending(pending: Map<string, PendingRequest>, error: Error): void {\n const requests = [...pending.values()];\n pending.clear();\n for (const request of requests) {\n try {\n request.reject(error);\n } catch {\n // A user-supplied rejection callback must not prevent other RPCs from settling.\n }\n }\n}\n\nexport function takePending(\n pending: Map<string, PendingRequest>,\n id: RequestId | null,\n): PendingRequest | undefined {\n if (id === null || id === undefined) {\n return undefined;\n }\n\n const key = String(id);\n const request = pending.get(key);\n pending.delete(key);\n return request;\n}\n\nexport function collectionScope(collection: string): string {\n const segments = collection\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n return `/${segments.map(normalizeSegment).join(\"/\")}/`;\n}\n\nfunction normalizeSegment(segment: string): string {\n return encodeURIComponent(decodeURIComponent(segment));\n}\n","import { collectionScope } from \"./client-rpc\";\nimport type { Broadcast, ClientSubscription, SubscriptionControlResult } from \"./types\";\n\ntype SubscriptionListener = (broadcast: Broadcast) => void;\n\ninterface SubscriptionEntry {\n collection: string;\n disconnectListeners: Set<() => void>;\n listeners: Set<SubscriptionListener>;\n reconnectListeners: Set<() => void>;\n ready: Promise<void>;\n}\n\nexport interface SubscriptionControls {\n currentSocket(): WebSocket | undefined;\n open(): Promise<WebSocket>;\n send(\n ws: WebSocket,\n path: \"subscribe\" | \"unsubscribe\",\n collection: string,\n ): Promise<SubscriptionControlResult>;\n}\n\nexport class ClientSubscriptions {\n private readonly subscriptions = new Map<string, SubscriptionEntry>();\n\n constructor(private readonly controls: SubscriptionControls) {}\n\n subscribe(collection: string, listener: SubscriptionListener): ClientSubscription {\n const key = collectionScope(collection);\n let entry = this.subscriptions.get(key);\n const shouldSubscribe = !entry;\n\n if (!entry) {\n entry = {\n collection: key,\n disconnectListeners: new Set(),\n listeners: new Set(),\n reconnectListeners: new Set(),\n ready: Promise.resolve(),\n };\n this.subscriptions.set(key, entry);\n }\n\n entry.listeners.add(listener);\n if (shouldSubscribe) {\n entry.ready = this.start(entry);\n }\n\n return {\n ready: entry.ready,\n onDisconnect: (next) => addLifecycleListener(entry.disconnectListeners, next),\n onReconnect: (next) => addLifecycleListener(entry.reconnectListeners, next),\n unsubscribe: () => this.unsubscribe(key, listener),\n };\n }\n\n get hasSubscriptions(): boolean {\n return this.subscriptions.size > 0;\n }\n\n disconnected(): void {\n for (const entry of this.subscriptions.values()) {\n for (const listener of entry.disconnectListeners) listener();\n }\n }\n\n reconnected(): void {\n for (const entry of this.subscriptions.values()) {\n for (const listener of entry.reconnectListeners) listener();\n }\n }\n\n async replay(ws: WebSocket): Promise<void> {\n await Promise.all(\n [...this.subscriptions.values()].map((entry) => this.subscribeOnSocket(ws, entry)),\n );\n }\n\n dispatch(broadcast: Broadcast): void {\n const updatesByCollection = new Map<string, Broadcast[\"updates\"]>();\n const invalidationsByCollection = new Map<string, NonNullable<Broadcast[\"invalidations\"]>>();\n\n for (const update of broadcast.updates) {\n const collection = collectionScope(update.collection);\n const updates = updatesByCollection.get(collection) ?? [];\n updates.push(update);\n updatesByCollection.set(collection, updates);\n }\n\n for (const invalidation of broadcast.invalidations ?? []) {\n const collection = collectionScope(invalidation.collection);\n const invalidations = invalidationsByCollection.get(collection) ?? [];\n invalidations.push(invalidation);\n invalidationsByCollection.set(collection, invalidations);\n }\n\n for (const entry of this.subscriptions.values()) {\n const updates = updatesByCollection.get(collectionScope(entry.collection));\n const invalidations = invalidationsByCollection.get(collectionScope(entry.collection));\n if ((!updates || updates.length === 0) && (!invalidations || invalidations.length === 0)) {\n continue;\n }\n\n const scopedBroadcast: Broadcast = {\n ...broadcast,\n ...(invalidations ? { invalidations } : {}),\n updates: updates ?? [],\n };\n for (const listener of entry.listeners) {\n listener(scopedBroadcast);\n }\n }\n }\n\n private start(entry: SubscriptionEntry): Promise<void> {\n const socket = this.controls.currentSocket();\n return socket?.readyState === WebSocket.OPEN\n ? this.subscribeOnSocket(socket, entry)\n : this.controls.open().then(() => undefined);\n }\n\n private async subscribeOnSocket(ws: WebSocket, entry: SubscriptionEntry): Promise<void> {\n if (this.subscriptions.get(collectionScope(entry.collection)) !== entry) {\n return;\n }\n\n const result = await this.controls.send(ws, \"subscribe\", entry.collection);\n entry.collection = result.collection;\n }\n\n private unsubscribe(key: string, listener: SubscriptionListener): void {\n const entry = this.subscriptions.get(key);\n if (!entry) {\n return;\n }\n\n entry.listeners.delete(listener);\n if (entry.listeners.size > 0) {\n return;\n }\n\n this.subscriptions.delete(key);\n const socket = this.controls.currentSocket();\n if (socket?.readyState === WebSocket.OPEN) {\n void this.controls.send(socket, \"unsubscribe\", entry.collection).catch(() => undefined);\n }\n }\n}\n\nfunction addLifecycleListener(listeners: Set<() => void>, listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n","import type { ClientOptions, ReconnectOptions } from \"./types\";\n\nexport class ConnectionClosedError extends Error {\n constructor(message = \"Sync WebSocket closed before the request completed\") {\n super(message);\n this.name = \"ConnectionClosedError\";\n }\n}\n\nexport class RequestTimeoutError extends Error {\n constructor() {\n super(\"Sync RPC request timed out\");\n this.name = \"RequestTimeoutError\";\n }\n}\n\nexport interface ReconnectPolicy {\n enabled: boolean;\n initialDelayMs: number;\n maxDelayMs: number;\n multiplier: number;\n maxAttempts: number;\n}\n\nexport function reconnectPolicy(option: ClientOptions[\"reconnect\"]): ReconnectPolicy {\n const input: ReconnectOptions = typeof option === \"object\" ? option : {};\n return {\n enabled: option !== false,\n initialDelayMs: input.initialDelayMs ?? 100,\n maxDelayMs: input.maxDelayMs ?? 5000,\n multiplier: input.multiplier ?? 2,\n maxAttempts: input.maxAttempts ?? 5,\n };\n}\n\nexport function reconnectDelay(policy: ReconnectPolicy, attempt: number): number {\n return Math.min(policy.initialDelayMs * policy.multiplier ** attempt, policy.maxDelayMs);\n}\n\nexport function wait(delayMs: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, delayMs));\n}\n\nexport function retryableMutationError(error: unknown): boolean {\n if (error instanceof ConnectionClosedError || error instanceof RequestTimeoutError) return true;\n if (typeof error !== \"object\" || error === null || !(\"cause\" in error)) return false;\n return retryableMutationError(error.cause);\n}\n","import { createClient } from \"./client\";\nimport type { ApiContract, Client, ClientOptions } from \"./types\";\n\ninterface SharedClientEntry {\n client: Client;\n refs: number;\n}\n\nexport interface SharedClientLease<TApi extends ApiContract = ApiContract> {\n readonly client: Client<TApi>;\n release(): void;\n [Symbol.dispose](): void;\n}\n\nconst sharedClients = new Map<string, SharedClientEntry>();\n\nexport function acquireSharedClient<TApi extends ApiContract = ApiContract>(\n options: ClientOptions,\n): SharedClientLease<TApi> {\n const key = sharedClientKey(options);\n let entry = sharedClients.get(key);\n if (!entry) {\n entry = { client: createClient(options), refs: 0 };\n sharedClients.set(key, entry);\n }\n entry.refs += 1;\n\n let released = false;\n const release = () => {\n if (released) return;\n released = true;\n entry.refs -= 1;\n if (entry.refs === 0 && sharedClients.get(key) === entry) {\n sharedClients.delete(key);\n entry.client.close();\n }\n };\n\n return {\n client: entry.client as Client<TApi>,\n release,\n [Symbol.dispose]: release,\n };\n}\n\nfunction sharedClientKey(options: ClientOptions): string {\n const url = new URL(options.url);\n url.searchParams.delete(\"clientId\");\n const reconnect =\n typeof options.reconnect === \"object\" ? JSON.stringify(options.reconnect) : options.reconnect;\n return [\n url,\n options.clientId,\n reconnect,\n options.connectionTimeoutMs,\n options.requestTimeoutMs,\n ].join(\"\\0\");\n}\n","import {\n parseServerMessage,\n ProtocolError,\n sendClientMessage,\n type ClientMessage,\n} from \"@lsync/transport\";\nimport { ClientSubscriptions } from \"./client-subscriptions\";\nimport {\n ConnectionClosedError,\n reconnectDelay,\n reconnectPolicy,\n RequestTimeoutError,\n retryableMutationError,\n wait,\n} from \"./client-reconnect\";\nimport { rejectPending, takePending, type PendingRequest } from \"./client-rpc\";\nimport type {\n ApiCall,\n ApiCallArgs,\n ApiContract,\n ApiOutput,\n ApiPath,\n Batch,\n Client,\n ClientOptions,\n PushResult,\n ReadQuery,\n ReadResult,\n SubscriptionControlResult,\n SyncChangesQuery,\n SyncChangesResult,\n} from \"./types\";\n\nexport { acquireSharedClient } from \"./client-shared\";\n\nexport function createClient<TApi extends ApiContract = ApiContract>(\n options: ClientOptions,\n): Client<TApi> {\n const clientId = options.clientId ?? crypto.randomUUID();\n const pending = new Map<string, PendingRequest>();\n const reconnect = reconnectPolicy(options.reconnect);\n const connectionTimeoutMs = options.connectionTimeoutMs ?? 10000;\n const requestTimeoutMs = options.requestTimeoutMs ?? 30000;\n let nextId = 1;\n let socket: WebSocket | undefined;\n let connectPromise: Promise<WebSocket> | undefined;\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n let closed = false;\n let hasOpened = false;\n let subscriptions: ClientSubscriptions;\n\n const open = async (): Promise<WebSocket> => {\n if (closed) throw new ConnectionClosedError(\"Sync client is closed\");\n if (socket?.readyState === WebSocket.OPEN) return socket;\n if (connectPromise) return connectPromise;\n\n const connect = async (): Promise<WebSocket> => {\n const attempts = reconnect.enabled ? reconnect.maxAttempts : 1;\n let lastError: unknown;\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n try {\n return await connectOnce();\n } catch (error) {\n lastError = error;\n if (attempt + 1 < attempts) await wait(reconnectDelay(reconnect, attempt));\n }\n }\n throw lastError;\n };\n\n const connectOnce = (): Promise<WebSocket> =>\n new Promise((resolve, reject) => {\n const url = new URL(options.url);\n url.searchParams.set(\"clientId\", clientId);\n const ws = new WebSocket(url);\n ws.binaryType = \"arraybuffer\";\n let opened = false;\n const connectionTimer = setTimeout(() => {\n reject(new Error(`Sync WebSocket connection timed out after ${connectionTimeoutMs}ms`));\n ws.close();\n }, connectionTimeoutMs);\n\n ws.addEventListener(\"open\", () => {\n opened = true;\n clearTimeout(connectionTimer);\n socket = ws;\n subscriptions\n .replay(ws)\n .then(() => {\n if (hasOpened) subscriptions.reconnected();\n hasOpened = true;\n resolve(ws);\n })\n .catch((error) => {\n reject(error);\n ws.close();\n });\n });\n\n ws.addEventListener(\"message\", (event) => {\n const message = parseServerMessage(event.data);\n\n if (message.type === \"updates\") {\n subscriptions.dispatch(message.payload);\n return;\n }\n\n if (message.type === \"error\") {\n const request = takePending(pending, message.id);\n request?.reject(new ProtocolError(message.error));\n return;\n }\n\n const request = takePending(pending, message.id);\n request?.resolve(message.payload);\n });\n\n ws.addEventListener(\"close\", () => {\n clearTimeout(connectionTimer);\n if (socket === ws) {\n socket = undefined;\n rejectPending(pending, new ConnectionClosedError());\n subscriptions.disconnected();\n scheduleReconnect();\n }\n if (!opened) reject(new Error(\"Unable to open sync WebSocket\"));\n });\n\n ws.addEventListener(\"error\", () => {\n clearTimeout(connectionTimer);\n reject(new Error(\"Unable to open sync WebSocket\"));\n });\n });\n\n connectPromise = connect().finally(() => {\n connectPromise = undefined;\n });\n return connectPromise;\n };\n\n function scheduleReconnect(): void {\n if (\n closed ||\n connectPromise ||\n !reconnect.enabled ||\n !subscriptions.hasSubscriptions ||\n reconnectTimer\n ) {\n return;\n }\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined;\n void open().catch(() => scheduleReconnect());\n }, reconnect.initialDelayMs);\n }\n\n const sendRequest = <TResult>(ws: WebSocket, request: ClientMessage): Promise<TResult> => {\n return new Promise((resolve, reject) => {\n const id = request.id;\n const timeout = setTimeout(() => {\n takePending(pending, id)?.reject(new RequestTimeoutError());\n }, requestTimeoutMs);\n pending.set(String(id), {\n resolve: (value) => {\n clearTimeout(timeout);\n resolve(value as TResult);\n },\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n\n try {\n sendClientMessage(ws, request);\n } catch (error) {\n takePending(pending, id)?.reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n };\n\n const sendSubscriptionControl = async (\n ws: WebSocket,\n method: \"subscribe\" | \"unsubscribe\",\n collection: string,\n ): Promise<SubscriptionControlResult> =>\n sendRequest<SubscriptionControlResult>(ws, {\n version: 1,\n id: String(nextId++),\n type: method,\n input: { collection },\n });\n\n subscriptions = new ClientSubscriptions({\n currentSocket: () => socket,\n open,\n send: sendSubscriptionControl,\n });\n\n const sendPush = (batch: Batch): Promise<PushResult> =>\n open().then((ws) =>\n sendRequest<PushResult>(ws, {\n version: 1,\n id: String(nextId++),\n type: \"push\",\n input: batch,\n }),\n );\n\n return {\n clientId,\n push: async (batch) => {\n const attempts = reconnect.enabled ? reconnect.maxAttempts : 1;\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await sendPush(batch);\n } catch (error) {\n if (!retryableMutationError(error) || attempt + 1 >= attempts) throw error;\n await wait(reconnectDelay(reconnect, attempt));\n }\n }\n },\n read: async <T = unknown>(query: ReadQuery) => {\n const ws = await open();\n return sendRequest<ReadResult<T>>(ws, {\n version: 1,\n id: String(nextId++),\n type: \"read\",\n input: query,\n });\n },\n changes: async (query: SyncChangesQuery) => {\n const ws = await open();\n return sendRequest<SyncChangesResult>(ws, {\n version: 1,\n id: String(nextId++),\n type: \"changes\",\n input: query,\n });\n },\n call: async <TPath extends ApiPath<TApi>>(path: TPath, ...args: ApiCallArgs<TApi, TPath>) => {\n const [input] = args;\n const call: ApiCall = input === undefined ? { path } : { path, input };\n const ws = await open();\n return sendRequest<ApiOutput<TApi, TPath>>(ws, {\n version: 1,\n id: String(nextId++),\n type: \"api\",\n input: call,\n });\n },\n subscribe: (collection, listener) => subscriptions.subscribe(collection, listener),\n close() {\n closed = true;\n if (reconnectTimer) clearTimeout(reconnectTimer);\n rejectPending(pending, new ConnectionClosedError(\"Sync client was closed\"));\n socket?.close();\n socket = undefined;\n },\n };\n}\n","import { type ChangeMessageOrDeleteKeyMessage, type Collection } from \"@tanstack/db\";\nimport type { ReadFilter, ReadPredicate } from \"./types\";\n\ntype Writer<T extends object, TKey extends string | number> = (\n message: ChangeMessageOrDeleteKeyMessage<T, TKey>,\n) => void;\n\ninterface SubsetState<TKey extends string | number> {\n filters: Array<ReadFilter>;\n keys: Set<TKey>;\n loaded: boolean;\n predicate?: ReadPredicate;\n refs: number;\n}\n\nexport interface RetainResult {\n loaded: boolean;\n}\n\nexport interface TrackRowResult {\n before: boolean;\n after: boolean;\n}\n\nexport class SubsetTracker<T extends object, TKey extends string | number> {\n private readonly subsets = new Map<string, SubsetState<TKey>>();\n private readonly keyRefs = new Map<TKey, number>();\n\n constructor(private readonly getKey: (item: T) => TKey) {}\n\n replace(\n subsetId: string,\n rows: Array<T>,\n filters: Array<ReadFilter>,\n predicate?: ReadPredicate,\n ): Array<TKey> {\n const previous = this.subsets.get(subsetId);\n const refs = previous?.refs ?? 0;\n if (previous) {\n this.releaseKeys(previous.keys);\n }\n\n const keys = new Set(rows.map((row) => this.getKey(row)));\n this.addKeys(keys);\n this.subsets.set(subsetId, {\n filters,\n keys,\n loaded: true,\n ...(predicate ? { predicate } : {}),\n refs,\n });\n\n const removed: Array<TKey> = [];\n previous?.keys.forEach((key) => {\n if (!keys.has(key) && !this.keyRefs.has(key)) {\n removed.push(key);\n }\n });\n return removed;\n }\n\n retain(subsetId: string): RetainResult {\n const subset = this.subsets.get(subsetId);\n if (subset) {\n subset.refs += 1;\n return { loaded: subset.loaded };\n }\n\n this.subsets.set(subsetId, { filters: [], keys: new Set(), loaded: false, refs: 1 });\n return { loaded: false };\n }\n\n trackRow(row: T): boolean {\n const result = this.reconcileRow(row);\n return result.before || result.after;\n }\n\n reconcileRow(row: T): TrackRowResult {\n const key = this.getKey(row);\n let before = false;\n\n this.subsets.forEach((subset) => {\n const had = subset.keys.has(key);\n before ||= had;\n\n if (matchesSubset(row, subset)) {\n if (!had) {\n subset.keys.add(key);\n this.keyRefs.set(key, (this.keyRefs.get(key) ?? 0) + 1);\n }\n return;\n }\n\n if (had) {\n subset.keys.delete(key);\n this.releaseKey(key);\n }\n });\n\n return {\n before,\n after: this.keyRefs.has(key),\n };\n }\n\n deleteKey(key: TKey): boolean {\n if (!this.keyRefs.has(key)) {\n return false;\n }\n\n this.subsets.forEach((subset) => {\n subset.keys.delete(key);\n });\n this.keyRefs.delete(key);\n return true;\n }\n\n release(subsetId: string, retain = false): Array<TKey> {\n const subset = this.subsets.get(subsetId);\n if (!subset) {\n return [];\n }\n\n subset.refs -= 1;\n if (subset.refs > 0) {\n return [];\n }\n\n subset.refs = 0;\n if (retain) {\n return [];\n }\n\n return this.expire(subsetId);\n }\n\n expire(subsetId: string): Array<TKey> {\n const subset = this.subsets.get(subsetId);\n if (!subset || subset.refs > 0) {\n return [];\n }\n\n this.subsets.delete(subsetId);\n return this.releaseKeys(subset.keys);\n }\n\n clear(): Array<TKey> {\n const keys = [...this.keyRefs.keys()];\n this.subsets.clear();\n this.keyRefs.clear();\n return keys;\n }\n\n private addKeys(keys: Set<TKey>): void {\n keys.forEach((key) => {\n this.keyRefs.set(key, (this.keyRefs.get(key) ?? 0) + 1);\n });\n }\n\n private releaseKeys(keys: Set<TKey>): Array<TKey> {\n const removed: Array<TKey> = [];\n keys.forEach((key) => {\n if (this.releaseKey(key)) {\n removed.push(key);\n }\n });\n return removed;\n }\n\n private releaseKey(key: TKey): boolean {\n const refs = (this.keyRefs.get(key) ?? 0) - 1;\n if (refs <= 0) {\n this.keyRefs.delete(key);\n return true;\n }\n\n this.keyRefs.set(key, refs);\n return false;\n }\n}\n\nexport function writeRows<T extends object, TKey extends string | number>(\n collection: Collection<T, TKey>,\n rows: Array<T>,\n getKey: (item: T) => TKey,\n write: Writer<T, TKey>,\n): void {\n for (const row of rows) {\n const key = getKey(row);\n write({\n type: collection.has(key) ? \"update\" : \"insert\",\n key,\n value: row,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>);\n }\n}\n\nfunction matchesFilters(row: unknown, filters: Array<ReadFilter>): boolean {\n return filters.every((filter) => matchesFilter(row, filter));\n}\n\nfunction matchesSubset<TKey extends string | number>(\n row: unknown,\n subset: SubsetState<TKey>,\n): boolean {\n return matchesFilters(row, subset.filters) && matchesPredicate(row, subset.predicate);\n}\n\nfunction matchesPredicate(row: unknown, predicate: ReadPredicate | undefined): boolean {\n if (!predicate) {\n return true;\n }\n\n if (predicate.type === \"comparison\") {\n return matchesFilter(row, predicate);\n }\n\n if (predicate.type === \"and\") {\n return predicate.predicates.every((child) => matchesPredicate(row, child));\n }\n\n return predicate.predicates.some((child) => matchesPredicate(row, child));\n}\n\nfunction matchesFilter(row: unknown, filter: ReadFilter): boolean {\n const value = valueAtPath(row, filter.field);\n\n switch (filter.op) {\n case \"eq\":\n return value === filter.value;\n case \"ne\":\n return value !== filter.value;\n case \"gt\":\n return compareValues(value, filter.value, (left, right) => left > right);\n case \"gte\":\n return compareValues(value, filter.value, (left, right) => left >= right);\n case \"lt\":\n return compareValues(value, filter.value, (left, right) => left < right);\n case \"lte\":\n return compareValues(value, filter.value, (left, right) => left <= right);\n case \"in\":\n return Array.isArray(filter.value) && filter.value.includes(value);\n }\n\n return false;\n}\n\nfunction compareValues(\n left: unknown,\n right: unknown,\n compare: (left: number | string, right: number | string) => boolean,\n): boolean {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return compare(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n return compare(left, right);\n }\n\n return false;\n}\n\nfunction valueAtPath(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, segment) => {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[segment];\n }, row);\n}\n","import type { ChangeMessageOrDeleteKeyMessage, Collection } from \"@tanstack/db\";\nimport { toChangeMessage } from \"./batch\";\nimport { collectionScope } from \"./client-rpc\";\nimport { SubsetTracker } from \"./subsets\";\nimport type { Broadcast } from \"./types\";\n\ninterface ApplyBroadcastOptions<T extends object, TKey extends string | number> {\n broadcast: Broadcast;\n collectionName: string;\n clientId: string;\n ignoreOwnUpdates: boolean;\n syncMode: \"eager\" | \"on-demand\";\n collection: Collection<T, TKey>;\n subsets: SubsetTracker<T, TKey>;\n begin: () => void;\n write(message: ChangeMessageOrDeleteKeyMessage<T, TKey>): void;\n commit: () => void;\n deleteKeys(keys: Array<TKey>): void;\n}\n\nexport function applyCollectionBroadcast<T extends object, TKey extends string | number>(\n options: ApplyBroadcastOptions<T, TKey>,\n): Array<ChangeMessageOrDeleteKeyMessage<T, TKey>> {\n if ((options.broadcast.invalidations ?? []).length > 0 && options.syncMode === \"on-demand\") {\n options.deleteKeys(options.subsets.clear());\n }\n\n const changes = options.broadcast.updates.flatMap((update) => {\n if (collectionScope(update.collection) !== collectionScope(options.collectionName)) return [];\n const ownUpdate = update.clientId === options.clientId;\n if (options.ignoreOwnUpdates && ownUpdate) return [];\n if (options.syncMode !== \"on-demand\") {\n return [toChangeMessage<T, TKey>(update, options.collection.has(update.key as TKey))];\n }\n\n const key = update.key as TKey;\n const exists = options.collection.has(key);\n if (update.type === \"delete\") {\n options.subsets.deleteKey(key);\n return exists ? [{ type: \"delete\" as const, key }] : [];\n }\n\n const current = options.collection.get(key) as T | undefined;\n const row =\n update.type === \"update\" && current\n ? ({ ...current, ...(update.value as Partial<T>) } as T)\n : (update.value as T);\n const tracked = options.subsets.reconcileRow(row);\n return ownUpdate || exists || tracked.after ? [toChangeMessage<T, TKey>(update, exists)] : [];\n });\n\n if (changes.length === 0) return [];\n options.begin();\n for (const change of changes) options.write(change);\n options.commit();\n return changes;\n}\n","import type { LoadSubsetOptions } from \"@tanstack/db\";\nimport type { ReadFilter, ReadOrderBy, ReadPredicate, ReadQuery } from \"./types\";\n\nexport type ReadOptions = Omit<ReadQuery, \"collection\">;\ntype ReadComparisonPredicate = Extract<ReadPredicate, { type: \"comparison\" }>;\n\nexport function initialReadQuery(\n collection: string,\n read: false | ReadOptions | undefined,\n): ReadQuery | undefined {\n if (read === false) {\n return undefined;\n }\n\n return {\n collection,\n ...read,\n };\n}\n\nexport function subsetId(options: LoadSubsetOptions): string {\n return JSON.stringify({\n cursor: options.cursor\n ? {\n whereCurrent: toReadPredicate(options.cursor.whereCurrent),\n whereFrom: toReadPredicate(options.cursor.whereFrom),\n }\n : undefined,\n predicate: options.where ? toReadPredicate(options.where) : undefined,\n limit: options.limit,\n offset: options.offset,\n orderBy: toReadOrderByList(options.orderBy),\n });\n}\n\nexport function readQueryForSubset(\n collection: string,\n baseRead: ReadOptions | undefined,\n options: LoadSubsetOptions,\n): ReadQuery {\n const query: ReadQuery = {\n collection,\n ...baseRead,\n filters: [...(baseRead?.filters ?? [])],\n };\n\n const predicate = combinePredicates(\n baseRead?.predicate,\n options.where ? toReadPredicate(options.where) : undefined,\n );\n if (predicate) {\n query.predicate = predicate;\n }\n\n const limit = options.limit ?? baseRead?.limit;\n if (limit !== undefined) {\n query.limit = limit;\n }\n\n const offset = options.cursor ? undefined : (options.offset ?? baseRead?.offset);\n if (offset !== undefined) {\n query.offset = offset;\n }\n\n const subsetOrderBy = toReadOrderByList(options.orderBy);\n const orderBy = subsetOrderBy.length > 0 ? subsetOrderBy : baseRead?.orderBy;\n if (orderBy) {\n query.orderBy = orderBy;\n }\n\n if (options.cursor) {\n query.cursor = {\n whereCurrent: toReadPredicate(options.cursor.whereCurrent),\n whereFrom: toReadPredicate(options.cursor.whereFrom),\n ...(options.cursor.lastKey !== undefined ? { lastKey: options.cursor.lastKey } : {}),\n };\n }\n\n return query;\n}\n\nfunction combinePredicates(\n left: ReadPredicate | undefined,\n right: ReadPredicate | undefined,\n): ReadPredicate | undefined {\n if (!left) return right;\n if (!right) return left;\n return { type: \"and\", predicates: [left, right] };\n}\n\nfunction toReadPredicate(expression: unknown): ReadPredicate {\n const unwrapped = unwrapExpression(expression);\n\n if (!isFuncExpression(unwrapped)) {\n throw new Error(\"On-demand cursor predicates must be function expressions\");\n }\n\n if (unwrapped.name === \"and\" || unwrapped.name === \"or\") {\n return {\n type: unwrapped.name,\n predicates: unwrapped.args.map(toReadPredicate),\n };\n }\n\n if (unwrapped.name === \"not\") {\n return negatePredicate(toReadPredicate(unwrapped.args[0]));\n }\n\n const comparison = comparisonFromExpression(unwrapped);\n if (!comparison) {\n throw new Error(`Unsupported on-demand cursor operator: ${unwrapped.name}`);\n }\n\n return {\n type: \"comparison\",\n ...comparison,\n };\n}\n\nfunction negatePredicate(predicate: ReadPredicate): ReadPredicate {\n if (predicate.type === \"and\" || predicate.type === \"or\") {\n return {\n type: predicate.type === \"and\" ? \"or\" : \"and\",\n predicates: predicate.predicates.map(negatePredicate),\n };\n }\n\n const comparison = predicate as ReadComparisonPredicate;\n return {\n ...comparison,\n op: negateOperator(comparison.op),\n };\n}\n\nfunction negateOperator(operator: ReadComparisonPredicate[\"op\"]): ReadComparisonPredicate[\"op\"] {\n switch (operator) {\n case \"eq\":\n return \"ne\";\n case \"ne\":\n return \"eq\";\n case \"gt\":\n return \"lte\";\n case \"gte\":\n return \"lt\";\n case \"lt\":\n return \"gte\";\n case \"lte\":\n return \"gt\";\n case \"in\":\n throw new Error(\"Unsupported on-demand cursor operator: not(in)\");\n default:\n throw new Error(\"Unsupported on-demand cursor operator\");\n }\n}\n\nfunction comparisonFromExpression(\n expression: FuncExpression,\n): Omit<ReadComparisonPredicate, \"type\"> | undefined {\n const op = toReadFilterOperator(expression.name);\n const [left, right] = expression.args;\n if (!op || !isRefExpression(left) || !isValExpression(right)) {\n return undefined;\n }\n\n return {\n field: left.path.join(\".\"),\n op,\n value: right.value,\n };\n}\n\nfunction toReadOrderByList(orderBy: LoadSubsetOptions[\"orderBy\"]): Array<ReadOrderBy> {\n return (orderBy ?? []).map((sort) => {\n const expression = unwrapExpression(sort.expression);\n if (!isRefExpression(expression)) {\n throw new Error(`On-demand orderBy must be a field reference`);\n }\n\n return toReadOrderBy({\n field: expression.path,\n direction: sort.compareOptions.direction,\n });\n });\n}\n\nfunction toReadOrderBy(sort: { field: Array<string | number>; direction: \"asc\" | \"desc\" }) {\n return {\n field: sort.field.join(\".\"),\n direction: sort.direction,\n };\n}\n\nfunction toReadFilterOperator(operator: string): ReadFilter[\"op\"] | undefined {\n switch (operator) {\n case \"eq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"in\":\n return operator;\n case \"not_eq\":\n return \"ne\";\n case \"not_gt\":\n return \"lte\";\n case \"not_gte\":\n return \"lt\";\n case \"not_lt\":\n return \"gte\";\n case \"not_lte\":\n return \"gt\";\n default:\n return undefined;\n }\n}\n\ninterface Expression {\n type: \"func\" | \"ref\" | \"val\";\n name?: string;\n args?: Array<unknown>;\n path?: Array<string | number>;\n value?: unknown;\n}\n\ntype FuncExpression = Expression & { args: Array<unknown>; name: string; type: \"func\" };\ntype RefExpression = Expression & { path: Array<string | number>; type: \"ref\" };\n\nfunction unwrapExpression(value: unknown): unknown {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"expression\" in value &&\n isExpression((value as { expression: unknown }).expression)\n ) {\n return (value as { expression: unknown }).expression;\n }\n\n return value;\n}\n\nfunction isExpression(value: unknown): value is Expression {\n return typeof value === \"object\" && value !== null && \"type\" in value;\n}\n\nfunction isFuncExpression(value: unknown): value is FuncExpression {\n return (\n isExpression(value) &&\n value.type === \"func\" &&\n typeof value.name === \"string\" &&\n Array.isArray(value.args)\n );\n}\n\nfunction isRefExpression(value: unknown): value is RefExpression {\n return isExpression(value) && value.type === \"ref\" && Array.isArray(value.path);\n}\n\nfunction isValExpression(value: unknown): value is Expression {\n return isExpression(value) && value.type === \"val\";\n}\n","import type { Client, ReadQuery } from \"./types\";\n\nexport const DEFAULT_MAX_SYNC_ROWS = 10_000;\nconst MAX_READ_ROWS = 1_000;\n\nexport async function readInitialSyncRows<T>(\n client: Client,\n query: ReadQuery,\n maxSyncRows: number | false | undefined,\n): Promise<Array<T>> {\n if (query.limit !== undefined || query.cursor) {\n return (await client.read<T>(query)).rows;\n }\n\n const maximum = maxSyncRows ?? DEFAULT_MAX_SYNC_ROWS;\n if (maximum !== false && (!Number.isInteger(maximum) || maximum <= 0)) {\n throw new Error(\"maxSyncRows must be a positive integer or false\");\n }\n\n const rows: Array<T> = [];\n const baseOffset = query.offset ?? 0;\n while (maximum === false || rows.length <= maximum) {\n const remaining = maximum === false ? MAX_READ_ROWS : maximum + 1 - rows.length;\n const limit = Math.min(MAX_READ_ROWS, remaining);\n const page = await client.read<T>({\n ...query,\n limit,\n offset: baseOffset + rows.length,\n });\n rows.push(...page.rows);\n\n if (page.rows.length < limit) return rows;\n }\n\n throw new Error(\n `Collection ${query.collection} exceeds the initial sync limit of ${maximum} rows; ` +\n 'use syncMode: \"on-demand\" or maxSyncRows: false',\n );\n}\n","import type { Broadcast, Client, ClientSubscription, SequencedUpdate } from \"./types\";\n\nexport type SyncSessionState =\n | \"idle\"\n | \"subscribing\"\n | \"loading\"\n | \"synchronized\"\n | \"disconnected\"\n | \"catching-up\"\n | \"resyncing\"\n | \"stopped\";\n\nexport interface SyncSessionOptions {\n client: Client;\n collection: string;\n initialize(): Promise<void>;\n resync(): Promise<void>;\n apply(broadcast: Broadcast): void;\n hydrate?(): Promise<void>;\n hydrated?(): void;\n synchronized(): void;\n}\n\nexport class SyncSession {\n private buffered: Array<Broadcast> = [];\n private cursor = 0;\n private disconnectCleanup: (() => void) | undefined;\n private reconnectCleanup: (() => void) | undefined;\n private queue = Promise.resolve();\n private subscription?: ClientSubscription;\n private _state: SyncSessionState = \"idle\";\n\n constructor(private readonly options: SyncSessionOptions) {}\n\n get state(): SyncSessionState {\n return this._state;\n }\n\n start(): Promise<void> {\n if (this._state !== \"idle\") return this.queue;\n this._state = \"subscribing\";\n this.subscription = this.options.client.subscribe(this.options.collection, (broadcast) => {\n this.receive(broadcast);\n });\n this.disconnectCleanup = this.subscription.onDisconnect?.(() => this.disconnected());\n this.reconnectCleanup = this.subscription.onReconnect?.(() => this.reconnected());\n this.queue = this.initialize();\n return this.queue;\n }\n\n stop(): void {\n this._state = \"stopped\";\n this.buffered = [];\n this.disconnectCleanup?.();\n this.reconnectCleanup?.();\n this.subscription?.unsubscribe();\n }\n\n private async initialize(): Promise<void> {\n if (this.options.hydrate) {\n await this.options.hydrate();\n if (this.isStopped()) return;\n this.options.hydrated?.();\n }\n await this.subscription?.ready;\n if (this.isStopped()) return;\n const established = await this.options.client.changes({ collections: {} });\n this._state = \"loading\";\n await this.options.initialize();\n this.cursor = established.watermark;\n this.flush();\n this.markSynchronized();\n }\n\n private receive(broadcast: Broadcast): void {\n if (this._state !== \"synchronized\") {\n this.buffered.push(broadcast);\n return;\n }\n\n this.applyBroadcast(broadcast);\n }\n\n private disconnected(): void {\n if (this._state === \"stopped\") return;\n this._state = \"disconnected\";\n }\n\n private reconnected(): void {\n if (this._state === \"stopped\") return;\n this.queue = this.queue.catch(() => undefined).then(() => this.recover());\n }\n\n private async recover(): Promise<void> {\n this._state = \"catching-up\";\n while (!this.isStopped()) {\n const result = await this.options.client.changes({\n collections: { [this.options.collection]: this.cursor },\n limit: 1000,\n });\n\n if (result.type === \"resyncRequired\") {\n this._state = \"resyncing\";\n await this.options.resync();\n this.cursor = result.watermark;\n break;\n }\n\n if (result.updates.length > 0) {\n this.applyUpdates(result.updates, result.watermark);\n }\n const nextCursor = result.cursors?.[this.options.collection] ?? visibleCursor(result.updates);\n if (result.hasMore && nextCursor <= this.cursor) {\n throw new Error(`Sync history cursor did not advance for ${this.options.collection}`);\n }\n this.cursor = result.hasMore\n ? Math.max(this.cursor, nextCursor)\n : Math.max(this.cursor, result.watermark);\n if (!result.hasMore) break;\n }\n\n if (this.isStopped()) return;\n this.flush();\n this.markSynchronized();\n }\n\n private flush(): void {\n const broadcasts = this.buffered.sort((left, right) => left.watermark - right.watermark);\n this.buffered = [];\n for (const broadcast of broadcasts) this.applyBroadcast(broadcast);\n }\n\n private applyBroadcast(broadcast: Broadcast): void {\n if (broadcast.watermark <= this.cursor) return;\n const updates = broadcast.updates.filter((update) => update.sequence > this.cursor);\n this.options.apply({ ...broadcast, updates });\n this.cursor = Math.max(this.cursor, broadcast.watermark);\n }\n\n private applyUpdates(updates: Array<SequencedUpdate>, watermark: number): void {\n this.options.apply({ type: \"updates\", shardId: \"history\", updates, watermark });\n }\n\n private markSynchronized(): void {\n this._state = \"synchronized\";\n this.options.synchronized();\n }\n\n private isStopped(): boolean {\n return this._state === \"stopped\";\n }\n}\n\nfunction visibleCursor(updates: Array<SequencedUpdate>): number {\n return updates.reduce((cursor, update) => Math.max(cursor, update.sequence), 0);\n}\n","import type { IndexedDBOfflineOptions } from \"./types\";\n\nconst databaseVersion = 1;\nconst rowStore = \"collectionRows\";\nconst collectionIndex = \"byCollection\";\n\ninterface StoredRow<T, TKey> {\n collectionId: string;\n key: TKey;\n value: T;\n}\n\nexport interface OfflineCache<T extends object, TKey extends string | number> {\n load(): Promise<Array<T>>;\n put(rows: Array<T>): Promise<void>;\n delete(keys: Array<TKey>): Promise<void>;\n replace(rows: Array<T>): Promise<void>;\n}\n\nexport function createOfflineCache<T extends object, TKey extends string | number>(\n option: boolean | IndexedDBOfflineOptions | undefined,\n id: string | undefined,\n getKey: (row: T) => TKey,\n): OfflineCache<T, TKey> | undefined {\n if (!option) return undefined;\n if (!id) throw new Error(\"collectionOptions requires a stable id when offline is enabled\");\n if (!globalThis.indexedDB) {\n throw new Error(\"IndexedDB is unavailable; offline collections must be created in a browser\");\n }\n\n const options = option === true ? {} : option;\n const collectionId = `${id}\\0${options.cacheVersion ?? 1}`;\n return new IndexedDBOfflineCache(\n globalThis.indexedDB,\n options.databaseName ?? \"lsync\",\n collectionId,\n getKey,\n );\n}\n\nclass IndexedDBOfflineCache<T extends object, TKey extends string | number> implements OfflineCache<\n T,\n TKey\n> {\n private readonly database: Promise<IDBDatabase>;\n private queue: Promise<void> = Promise.resolve();\n\n constructor(\n factory: IDBFactory,\n databaseName: string,\n private readonly collectionId: string,\n private readonly getKey: (row: T) => TKey,\n ) {\n this.database = openDatabase(factory, databaseName);\n }\n\n async load(): Promise<Array<T>> {\n await this.queue;\n const database = await this.database;\n const request = database\n .transaction(rowStore, \"readonly\")\n .objectStore(rowStore)\n .index(collectionIndex)\n .getAll(this.collectionId);\n const records = await requestResult<Array<StoredRow<T, TKey>>>(request);\n return records.map((record) => record.value);\n }\n\n put(rows: Array<T>): Promise<void> {\n if (rows.length === 0) return this.queue;\n return this.enqueue(async () => {\n const transaction = (await this.database).transaction(rowStore, \"readwrite\");\n const store = transaction.objectStore(rowStore);\n for (const row of rows) store.put(this.record(row));\n await transactionComplete(transaction);\n });\n }\n\n delete(keys: Array<TKey>): Promise<void> {\n if (keys.length === 0) return this.queue;\n return this.enqueue(async () => {\n const transaction = (await this.database).transaction(rowStore, \"readwrite\");\n const store = transaction.objectStore(rowStore);\n for (const key of keys) store.delete([this.collectionId, key]);\n await transactionComplete(transaction);\n });\n }\n\n replace(rows: Array<T>): Promise<void> {\n return this.enqueue(async () => {\n const transaction = (await this.database).transaction(rowStore, \"readwrite\");\n const store = transaction.objectStore(rowStore);\n await deleteCollectionRows(store.index(collectionIndex), this.collectionId);\n for (const row of rows) store.put(this.record(row));\n await transactionComplete(transaction);\n });\n }\n\n private record(row: T): StoredRow<T, TKey> {\n return { collectionId: this.collectionId, key: this.getKey(row), value: row };\n }\n\n private enqueue(operation: () => Promise<void>): Promise<void> {\n const result = this.queue.then(operation);\n this.queue = result.catch(() => undefined);\n return result;\n }\n}\n\nfunction openDatabase(factory: IDBFactory, name: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = factory.open(name, databaseVersion);\n request.onupgradeneeded = () => {\n const store = request.result.createObjectStore(rowStore, {\n keyPath: [\"collectionId\", \"key\"],\n });\n store.createIndex(collectionIndex, \"collectionId\");\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n request.onblocked = () => reject(new Error(`IndexedDB database ${name} is blocked`));\n });\n}\n\nfunction deleteCollectionRows(index: IDBIndex, id: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = index.openKeyCursor(id);\n request.onsuccess = () => {\n const cursor = request.result;\n if (!cursor) {\n resolve();\n return;\n }\n index.objectStore.delete(cursor.primaryKey);\n cursor.continue();\n };\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction requestResult<T>(request: IDBRequest): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result as T);\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction transactionComplete(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n transaction.onabort = () => reject(transaction.error);\n });\n}\n","import type {\n ChangeMessageOrDeleteKeyMessage,\n Collection,\n TransactionWithMutations,\n} from \"@tanstack/db\";\nimport type { OfflineCache } from \"./offline-cache\";\n\nexport function persistChanges<T extends object, TKey extends string | number>(\n offline: OfflineCache<T, TKey> | undefined,\n changes: Array<ChangeMessageOrDeleteKeyMessage<T, TKey>>,\n collection: Collection<T, TKey>,\n getKey: (row: T) => TKey,\n): void {\n if (!offline) return;\n const rows: Array<T> = [];\n const deletedKeys: Array<TKey> = [];\n for (const change of changes) {\n if (change.type === \"delete\") {\n deletedKeys.push((change as { key: TKey }).key);\n continue;\n }\n\n const row = collection.get(getKey(change.value));\n if (row) rows.push(row);\n }\n void offline.put(rows);\n void offline.delete(deletedKeys);\n}\n\nexport function persistTransaction<T extends object, TKey extends string | number>(\n offline: OfflineCache<T, TKey> | undefined,\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): void {\n if (!offline) return;\n const rows: Array<T> = [];\n const deletedKeys: Array<TKey> = [];\n for (const mutation of transaction.mutations) {\n if (mutation.type === \"delete\") deletedKeys.push(mutation.key as TKey);\n else rows.push(mutation.modified as T);\n }\n void offline.put(rows);\n void offline.delete(deletedKeys);\n}\n","import type { CollectionConfig, TransactionWithMutations } from \"@tanstack/db\";\nimport type { SubsetTracker } from \"./subsets\";\n\nexport function trackLocalTransaction<T extends object, TKey extends string | number>(\n subsets: SubsetTracker<T, TKey> | undefined,\n syncMode: CollectionConfig<T, TKey>[\"syncMode\"],\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): void {\n if (syncMode !== \"on-demand\" || !subsets) return;\n\n for (const mutation of transaction.mutations) {\n if (mutation.type === \"delete\") {\n subsets.deleteKey(mutation.key as TKey);\n continue;\n }\n\n subsets.reconcileRow(mutation.modified as T);\n }\n}\n","import type { CollectionConfig, InferSchemaOutput, LoadSubsetOptions } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { createBatch } from \"./batch\";\nimport { acquireSharedClient } from \"./client\";\nimport { applyCollectionBroadcast } from \"./collection-broadcast\";\nimport { initialReadQuery, readQueryForSubset, subsetId } from \"./read-query\";\nimport { readInitialSyncRows } from \"./initial-sync\";\nimport { SyncSession } from \"./sync-session\";\nimport { createOfflineCache } from \"./offline-cache\";\nimport { persistChanges, persistTransaction } from \"./offline-sync\";\nimport { trackLocalTransaction } from \"./local-transaction\";\nimport type { CollectionOptions, ReadQuery } from \"./types\";\nimport { SubsetTracker, writeRows } from \"./subsets\";\n\nexport function collectionOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number = string | number,\n>(\n options: CollectionOptions<InferSchemaOutput<TSchema>, TKey, TSchema> & {\n schema: TSchema;\n },\n): CollectionConfig<InferSchemaOutput<TSchema>, TKey, TSchema> & {\n schema: TSchema;\n};\n\nexport function collectionOptions<T extends object, TKey extends string | number = string | number>(\n options: CollectionOptions<T, TKey, never> & {\n schema?: never;\n },\n): CollectionConfig<T, TKey, never> & {\n schema?: never;\n};\n\nexport function collectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n>(options: CollectionOptions<T, TKey, TSchema>): CollectionConfig<T, TKey, TSchema> {\n let lease: ReturnType<typeof acquireSharedClient> | undefined;\n let client = options.client;\n let activeSubsets: SubsetTracker<T, TKey> | undefined;\n\n if (options.offline && options.syncMode === \"on-demand\") {\n throw new Error(\"IndexedDB offline caching currently requires eager sync mode\");\n }\n if (options.offline && options.read === false) {\n throw new Error(\"IndexedDB offline caching requires an initial collection read\");\n }\n\n const offline = createOfflineCache(options.offline, options.id, options.getKey);\n\n if (!client) {\n if (!options.url) {\n throw new Error(\"collectionOptions requires either client or url\");\n }\n\n lease = acquireSharedClient({\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n client = lease.client;\n }\n\n return {\n ...(options.id ? { id: options.id } : {}),\n ...(options.gcTime !== undefined ? { gcTime: options.gcTime } : {}),\n ...(options.schema ? { schema: options.schema } : {}),\n ...(options.startSync !== undefined ? { startSync: options.startSync } : {}),\n ...(options.syncMode ? { syncMode: options.syncMode } : {}),\n ...(options.autoIndex !== undefined ? { autoIndex: options.autoIndex } : {}),\n ...(options.defaultIndexType !== undefined\n ? { defaultIndexType: options.defaultIndexType }\n : {}),\n getKey: options.getKey,\n sync: {\n sync: ({ begin, write, commit, markReady, truncate, collection }) => {\n const subsets = new SubsetTracker<T, TKey>(options.getKey);\n activeSubsets = subsets;\n const subsetGcTime = options.gcTime ?? 300000;\n const retentionTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const subsetQueries = new Map<string, ReadQuery>();\n const deleteKeys = (keys: Array<TKey>) => {\n if (keys.length === 0) return;\n\n begin();\n for (const key of keys) {\n write({ type: \"delete\", key });\n }\n commit();\n void offline?.delete(keys);\n };\n const cancelRetention = (id: string) => {\n const timer = retentionTimers.get(id);\n if (!timer) return;\n\n clearTimeout(timer);\n retentionTimers.delete(id);\n };\n const scheduleRetention = (id: string) => {\n if (!Number.isFinite(subsetGcTime)) {\n return;\n }\n\n if (subsetGcTime <= 0) {\n deleteKeys(subsets.expire(id));\n return;\n }\n\n cancelRetention(id);\n retentionTimers.set(\n id,\n setTimeout(() => {\n retentionTimers.delete(id);\n subsetQueries.delete(id);\n deleteKeys(subsets.expire(id));\n }, subsetGcTime),\n );\n };\n const initialQuery = initialReadQuery(options.collection, options.read);\n const loadEager = async (replace = false) => {\n if (!initialQuery) return;\n const rows = await readInitialSyncRows<T>(client, initialQuery, options.maxSyncRows);\n if (replace) truncate();\n if (rows.length > 0) {\n begin();\n writeRows(collection, rows, options.getKey, write);\n commit();\n }\n if (replace) await offline?.replace(rows);\n else await offline?.put(rows);\n };\n const reloadSubsets = async () => {\n for (const [id, query] of subsetQueries) {\n const result = await client.read<T>(query);\n const removedKeys = subsets.replace(\n id,\n result.rows,\n query.filters ?? [],\n query.predicate,\n );\n begin();\n writeRows(collection, result.rows, options.getKey, write);\n for (const key of removedKeys) write({ type: \"delete\", key });\n commit();\n await offline?.put(result.rows);\n await offline?.delete(removedKeys);\n }\n };\n let markedReady = false;\n const markCollectionReady = () => {\n if (!markedReady) markReady();\n markedReady = true;\n };\n const session = new SyncSession({\n client,\n collection: options.collection,\n initialize: () =>\n options.syncMode === \"on-demand\" ? Promise.resolve() : loadEager(offline !== undefined),\n resync: () => (options.syncMode === \"on-demand\" ? reloadSubsets() : loadEager(true)),\n apply: (broadcast) => {\n const changes = applyCollectionBroadcast({\n broadcast,\n collectionName: options.collection,\n clientId: client.clientId,\n ignoreOwnUpdates: options.ignoreOwnUpdates ?? false,\n syncMode: options.syncMode === \"on-demand\" ? \"on-demand\" : \"eager\",\n collection,\n subsets,\n begin,\n write,\n commit,\n deleteKeys,\n });\n persistChanges(offline, changes, collection, options.getKey);\n },\n ...(offline\n ? {\n hydrate: async () => {\n const rows = await offline.load();\n if (rows.length === 0) return;\n begin();\n writeRows(collection, rows, options.getKey, write);\n commit();\n },\n hydrated: markCollectionReady,\n }\n : {}),\n synchronized: markCollectionReady,\n });\n void session.start();\n\n const readSubset = (subsetOptions: LoadSubsetOptions): true | Promise<void> => {\n const id = subsetId(subsetOptions);\n cancelRetention(id);\n const retained = subsets.retain(id);\n if (retained.loaded) {\n return true;\n }\n\n return (async () => {\n const query = readQueryForSubset(\n options.collection,\n options.read === false ? undefined : options.read,\n subsetOptions,\n );\n await session.start();\n const result = await client.read<T>(query);\n subsetQueries.set(id, query);\n const removedKeys = subsets.replace(\n id,\n result.rows,\n query.filters ?? [],\n query.predicate,\n );\n\n begin();\n writeRows(collection, result.rows, options.getKey, write);\n for (const key of removedKeys) {\n write({ type: \"delete\", key });\n }\n commit();\n })().catch((error: unknown) => {\n deleteKeys(subsets.release(id));\n throw error;\n });\n };\n\n if (options.syncMode === \"on-demand\") {\n return {\n loadSubset: readSubset,\n unloadSubset: (subsetOptions: LoadSubsetOptions) => {\n const id = subsetId(subsetOptions);\n const removedKeys = subsets.release(id, subsetGcTime !== 0);\n deleteKeys(removedKeys);\n if (removedKeys.length === 0) scheduleRetention(id);\n else subsetQueries.delete(id);\n },\n cleanup: () => {\n retentionTimers.forEach((timer) => {\n clearTimeout(timer);\n });\n retentionTimers.clear();\n subsetQueries.clear();\n subsets.clear();\n if (activeSubsets === subsets) {\n activeSubsets = undefined;\n }\n session.stop();\n lease?.[Symbol.dispose]();\n },\n };\n }\n\n return () => {\n if (activeSubsets === subsets) {\n activeSubsets = undefined;\n }\n session.stop();\n lease?.[Symbol.dispose]();\n };\n },\n rowUpdateMode: \"partial\",\n },\n onInsert: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n const result = await client.push(\n createBatch(options.collection, client.clientId, transaction),\n );\n persistTransaction(offline, transaction);\n return result;\n },\n onUpdate: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n const result = await client.push(\n createBatch(options.collection, client.clientId, transaction),\n );\n persistTransaction(offline, transaction);\n return result;\n },\n onDelete: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n const result = await client.push(\n createBatch(options.collection, client.clientId, transaction),\n );\n persistTransaction(offline, transaction);\n return result;\n },\n } as CollectionConfig<T, TKey, TSchema>;\n}\n","export type CollectionScopeParams = Record<string, string | number>;\n\nexport function collectionScope(path: string, params: CollectionScopeParams): string {\n const segments = collectionPathSegments(path).map((segment) => segmentValue(segment, params));\n return `/${segments.map(normalizeSegment).join(\"/\")}/`;\n}\n\nexport function firstNewPathParam(\n childPath: string | undefined,\n parentPath: string,\n): string | undefined {\n if (!childPath) return undefined;\n\n const parentParams = new Set(pathParams(parentPath));\n return pathParams(childPath).find((param) => !parentParams.has(param));\n}\n\nexport function collectionPathSegments(path: string): Array<string> {\n return path\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n}\n\nexport function collectionPathParamName(segment: string): string | undefined {\n return (\n segment.match(/^\\{([A-Za-z_][A-Za-z0-9_]*)\\}$/)?.[1] ??\n segment.match(/^:([A-Za-z_][A-Za-z0-9_]*)$/)?.[1]\n );\n}\n\nexport function isCollectionPathParam(segment: string): boolean {\n return collectionPathParamName(segment) !== undefined;\n}\n\nfunction segmentValue(segment: string, params: CollectionScopeParams): string {\n const param = collectionPathParamName(segment);\n if (!param) return segment;\n\n const value = params[param];\n if (value === undefined) {\n throw new Error(`Missing collection path parameter: ${param}`);\n }\n\n return String(value);\n}\n\nfunction pathParams(path: string): Array<string> {\n return collectionPathSegments(path).flatMap((segment) => {\n const param = collectionPathParamName(segment);\n return param ? [param] : [];\n });\n}\n\nfunction normalizeSegment(segment: string): string {\n return encodeURIComponent(decodeURIComponent(segment));\n}\n","import { collectionPathSegments, isCollectionPathParam } from \"./collection-path\";\n\nexport function defaultCollectionApiPath(path: string, name: string): string {\n const prefix = collectionPathSegments(path)\n .filter((segment) => !isCollectionPathParam(segment))\n .join(\".\");\n\n return prefix ? `${prefix}.${name}` : name;\n}\n","import type { Collection } from \"@tanstack/db\";\nimport type { CollectionCacheEntry } from \"./collection-type-types\";\n\nexport const DEFAULT_MAX_CACHED_COLLECTIONS = 32;\n\nexport class CollectionCache extends Map<string, CollectionCacheEntry<any, any>> {\n readonly maxSize: number;\n\n constructor(maxSize: number | undefined) {\n super();\n this.maxSize = normalizeMaxSize(maxSize);\n }\n\n touch(key: string, entry: CollectionCacheEntry<any, any>): void {\n this.delete(key);\n this.set(key, entry);\n }\n\n evictInactive(protectedKey?: string): void {\n while (this.size > this.maxSize) {\n const candidate = [...this.entries()].find(\n ([key, entry]) =>\n key !== protectedKey &&\n entry.collection.subscriberCount === 0 &&\n entry.collection.status !== \"loading\",\n );\n if (!candidate) return;\n\n this.delete(candidate[0]);\n void cleanupCollection(candidate[1].collection).catch(() => {});\n }\n }\n\n async dispose(): Promise<void> {\n const entries = [...this.values()];\n this.clear();\n await Promise.all(entries.map(({ collection }) => cleanupCollection(collection)));\n }\n}\n\nasync function cleanupCollection(collection: Collection<any, any>): Promise<void> {\n if (collection.status === \"loading\") {\n try {\n await collection.preload();\n } catch {\n // Cleanup should still run for collections whose initial sync failed.\n }\n }\n\n if (collection.status !== \"cleaned-up\") {\n await collection.cleanup();\n }\n}\n\nfunction normalizeMaxSize(maxSize: number | undefined): number {\n if (maxSize === undefined) return DEFAULT_MAX_CACHED_COLLECTIONS;\n if (!Number.isInteger(maxSize) || maxSize < 1) {\n throw new Error(\"maxCachedCollections must be a positive integer\");\n }\n return maxSize;\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { CollectionTypeBaseOptions } from \"./collection-type-types\";\n\nexport function collectionConfig<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n>(options: CollectionTypeBaseOptions<T, TKey, TSchema, any, any>) {\n const { api, children, id, maxCachedCollections, name, parentParam, path, ...config } = options;\n void api;\n void children;\n void id;\n void maxCachedCollections;\n void name;\n void parentParam;\n void path;\n return config;\n}\n","import { createCollection, type Collection, type InferSchemaOutput } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { collectionScope, firstNewPathParam, type CollectionScopeParams } from \"./collection-path\";\nimport { collectionOptions } from \"./collection\";\nimport { acquireSharedClient } from \"./client\";\nimport { defaultCollectionApiPath } from \"./collection-api\";\nimport { CollectionCache } from \"./collection-type-cache\";\nimport { collectionConfig } from \"./collection-type-config\";\nimport type {\n ChildCollectionTypeOptions,\n ChildManagers,\n CollectionApiMethod,\n CollectionApiMethods,\n CollectionTypeApi,\n CollectionCacheEntry,\n CollectionEntity,\n CollectionType,\n CollectionTypeBaseOptions,\n CollectionTypeChildren,\n CollectionTypeConnection,\n CollectionTypeId,\n CollectionTypeOptions,\n CollectionUsage,\n OptionalCollectionTypeConnection,\n} from \"./collection-type-types\";\nimport type { ApiContract, Client } from \"./types\";\n\nexport type { CollectionScopeParams };\nexport type {\n ChildCollectionTypeOptions,\n CollectionApiHandler,\n CollectionApiHandlerArgs,\n CollectionApiMethod,\n CollectionApiMethods,\n CollectionTypeApi,\n CollectionEntity,\n CollectionType,\n CollectionTypeOptions,\n CollectionUsage,\n} from \"./collection-type-types\";\n\nexport function createCollectionTypeFromOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number = string | number,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<InferSchemaOutput<TSchema>, TKey> = {},\n>(\n options: CollectionTypeOptions<InferSchemaOutput<TSchema>, TKey, TSchema, TChildren, TApi> & {\n schema: TSchema;\n },\n): CollectionType<InferSchemaOutput<TSchema>, TKey, TChildren, TApi>;\n\nexport function createCollectionTypeFromOptions<\n T extends object,\n TKey extends string | number = string | number,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n>(\n options: CollectionTypeOptions<T, TKey, never, TChildren, TApi> & {\n schema?: never;\n },\n): CollectionType<T, TKey, TChildren, TApi>;\n\nexport function createCollectionTypeFromOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n>(\n options: CollectionTypeOptions<T, TKey, TSchema, TChildren, TApi>,\n): CollectionType<T, TKey, TChildren, TApi> {\n const connection = connectionFrom(options);\n\n if (!connection) {\n throw new Error(\"CollectionTypes.builder requires either client or url\");\n }\n\n return new CollectionTypeManager<T, TKey, TSchema, TChildren, TApi>(\n options,\n connection,\n {},\n new CollectionCache(options.maxCachedCollections),\n ).api();\n}\n\nclass CollectionTypeManager<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren,\n TApi extends CollectionTypeApi<T, TKey> = {},\n> {\n constructor(\n private readonly options: CollectionTypeBaseOptions<T, TKey, TSchema, TChildren, TApi>,\n private readonly connection: CollectionTypeConnection,\n private readonly params: CollectionScopeParams,\n private readonly cache: CollectionCache,\n ) {}\n\n api(): CollectionType<T, TKey, TChildren, TApi> {\n const base = {\n all: (params: CollectionScopeParams = {}) => this.all(params),\n delete: (...args: Parameters<Collection<T, TKey>[\"delete\"]>) => this.all({}).delete(...args),\n dispose: () => this.dispose(),\n insert: (...args: Parameters<Collection<T, TKey>[\"insert\"]>) => this.all({}).insert(...args),\n with: (params: CollectionScopeParams) => this.with(params),\n withId: (id: TKey, childParam?: string) => this.withId(id, childParam),\n update: (...args: Parameters<Collection<T, TKey>[\"update\"]>) => this.all({}).update(...args),\n usage: () => this.usage(),\n };\n const withApi = withApiMethods(base, this.apiMethods());\n return withChildren(withApi, this.childManagers(this.params)) as CollectionType<\n T,\n TKey,\n TChildren,\n TApi\n >;\n }\n\n private all(params: CollectionScopeParams): Collection<T, TKey> {\n const scope = collectionScope(this.options.path, { ...this.params, ...params });\n const key = `${this.options.path}\\n${scope}`;\n const existing = this.cache.get(key) as CollectionCacheEntry<T, TKey> | undefined;\n\n if (existing) {\n existing.usage.accessCount += 1;\n existing.usage.lastAccessedAt = Date.now();\n this.cache.touch(key, existing);\n this.cache.evictInactive(key);\n return existing.collection;\n }\n\n const id = collectionId(this.options.id, this.options.path, scope);\n const collection = createCollection(\n collectionOptions({\n ...collectionConfig(this.options),\n ...this.connection,\n id,\n collection: scope,\n } as any),\n ) as unknown as Collection<T, TKey>;\n\n const usage = {\n id,\n path: this.options.path,\n scope,\n accessCount: 1,\n createdAt: Date.now(),\n lastAccessedAt: Date.now(),\n };\n\n this.cache.set(key, { collection, usage });\n this.cache.evictInactive(key);\n return collection;\n }\n\n private with(params: CollectionScopeParams): CollectionType<T, TKey, TChildren, TApi> {\n return new CollectionTypeManager(\n this.options,\n this.connection,\n { ...this.params, ...params },\n this.cache,\n ).api();\n }\n\n private withId(id: TKey, childParam?: string): CollectionEntity<T, TKey, TChildren> {\n const base = {\n all: () => this.all({}),\n delete: (config?: Parameters<Collection<T, TKey>[\"delete\"]>[1]) =>\n this.all({}).delete(id, config),\n get: () => this.all({}).get(id),\n update: (...args: Array<unknown>) => this.all({}).update(id, ...(args as [any, any])),\n };\n return withChildren(\n base,\n this.childManagers(this.childParams(id, childParam)),\n ) as CollectionEntity<T, TKey, TChildren>;\n }\n\n private usage(): Array<CollectionUsage> {\n return [...this.cache.values()].map((entry) => ({ ...entry.usage }));\n }\n\n private async dispose(): Promise<void> {\n await this.cache.dispose();\n }\n\n private apiMethods(): CollectionApiMethods<TApi> {\n return Object.fromEntries(\n Object.entries(this.options.api ?? {}).map(([name, method]) => [\n name,\n (...args: Array<unknown>) => this.callApi(name, method, args[0]),\n ]),\n ) as CollectionApiMethods<TApi>;\n }\n\n private async callApi(\n name: string,\n method: CollectionApiMethod<unknown, unknown, T, TKey>,\n input: unknown,\n ): Promise<unknown> {\n if (method.handler) {\n const scope = collectionScope(this.options.path, this.params);\n return method.handler({\n input,\n collection: this.all({}),\n params: this.params,\n scope,\n });\n }\n\n const path = method.path ?? defaultCollectionApiPath(this.options.path, name);\n const lease = this.connection.client ? undefined : acquireSharedClient(this.connection);\n const client = (this.connection.client ?? lease?.client) as Client<ApiContract>;\n\n try {\n return await client.call(path, input);\n } finally {\n lease?.[Symbol.dispose]();\n }\n }\n\n private childManagers(params: CollectionScopeParams): ChildManagers<TChildren> {\n const children = (this.options.children ?? {}) as CollectionTypeChildren;\n return Object.fromEntries(\n Object.entries(children).map(([name, child]) => [\n name,\n new CollectionTypeManager<any, any, any, any>(\n child,\n connectionFrom(child) ?? this.connection,\n params,\n this.cache,\n ).api(),\n ]),\n ) as ChildManagers<TChildren>;\n }\n\n private childParams(id: TKey, childParam?: string): CollectionScopeParams {\n const param = childParam ?? firstChildParam(this.options);\n return param ? { ...this.params, [param]: id } : this.params;\n }\n}\n\nfunction withChildren<TTarget extends object, TChildren extends CollectionTypeChildren>(\n target: TTarget,\n children: ChildManagers<TChildren>,\n): TTarget & ChildManagers<TChildren> {\n return Object.assign(target, children);\n}\n\nfunction withApiMethods<TTarget extends object, TApi extends CollectionTypeApi<any, any>>(\n target: TTarget,\n api: CollectionApiMethods<TApi>,\n): TTarget & CollectionApiMethods<TApi> {\n for (const name of Object.keys(api)) {\n if (name in target) {\n throw new Error(`Collection API method conflicts with existing property: ${name}`);\n }\n }\n\n return Object.assign(target, api);\n}\n\nfunction connectionFrom(\n options: OptionalCollectionTypeConnection,\n): CollectionTypeConnection | undefined {\n if (options.client) {\n return { client: options.client };\n }\n\n if (options.url) {\n return {\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n };\n }\n\n return undefined;\n}\n\nfunction collectionId(id: CollectionTypeId | undefined, path: string, scope: string): string {\n return typeof id === \"function\" ? id({ path, scope }) : (id ?? scope);\n}\n\nfunction firstChildParam(\n options: CollectionTypeBaseOptions<any, any, any, any, any>,\n): string | undefined {\n const child = Object.values(options.children ?? {})[0] as\n | ChildCollectionTypeOptions<any, any, any, any, any>\n | undefined;\n return child?.parentParam ?? firstNewPathParam(child?.path, options.path);\n}\n","import type { BaseCollectionConfig } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n ApiDefinition,\n CollectionAtPath,\n CollectionDefinition,\n CollectionDefinitions,\n CollectionPath,\n CollectionSet,\n} from \"@lsync/definitions\";\nimport { createCollectionTypeFromOptions } from \"./collection-type\";\nimport type {\n ChildCollectionTypeOptions,\n CollectionApiMethod,\n CollectionType,\n CollectionTypeApi,\n CollectionTypeConnection,\n} from \"./collection-type-types\";\nimport type { Client, IndexedDBOfflineOptions } from \"./types\";\n\ntype BuilderIndexMode = NonNullable<BaseCollectionConfig<any, any, any>[\"autoIndex\"]>;\ntype BuilderIndexType = BaseCollectionConfig<any, any, any>[\"defaultIndexType\"];\ntype BuilderSyncMode = \"eager\" | \"on-demand\";\n\nexport function collectionTypesFrom<TCollections extends CollectionDefinitions>(\n definitions: CollectionSet<TCollections>,\n): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(definitions.collections, {}, undefined);\n}\n\nexport class DefinitionCollectionTypesBuilder<TCollections extends CollectionDefinitions> {\n constructor(\n private readonly definitions: TCollections,\n private readonly overrides: Record<string, ClientCollectionOverride>,\n private readonly connection: CollectionTypeConnection | undefined,\n ) {}\n\n client(client: Client): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(this.definitions, this.overrides, { client });\n }\n\n url(\n url: string | URL,\n options: { clientId?: string } = {},\n ): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(this.definitions, this.overrides, {\n url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n }\n\n collection<TPath extends CollectionPath<TCollections>>(\n path: TPath,\n configure: (\n collection: ClientCollectionBuilder<CollectionAtPath<TCollections, TPath>>,\n ) => ClientCollectionBuilder<CollectionAtPath<TCollections, TPath>>,\n ): DefinitionCollectionTypesBuilder<TCollections> {\n const override = configure(new ClientCollectionBuilder({})).toOverride();\n return new DefinitionCollectionTypesBuilder(\n this.definitions,\n { ...this.overrides, [path]: override },\n this.connection,\n );\n }\n\n build(): CollectionManagers<TCollections> {\n if (!this.connection) {\n throw new Error(\"CollectionTypes.from requires either client or url\");\n }\n\n return Object.fromEntries(\n Object.entries(this.definitions).map(([name, definition]) => [\n name,\n collectionTypeFromDefinition(definition, name, this.overrides, this.connection!),\n ]),\n ) as CollectionManagers<TCollections>;\n }\n}\n\nexport class ClientCollectionBuilder<TDefinition> {\n constructor(private readonly override: ClientCollectionOverride) {}\n\n sync(syncMode: BuilderSyncMode): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({ ...this.override, syncMode });\n }\n\n maxSyncRows(maxSyncRows: number | false): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({ ...this.override, maxSyncRows });\n }\n\n offline(options: IndexedDBOfflineOptions | true = true): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({ ...this.override, offline: options });\n }\n\n maxCachedCollections(maxCachedCollections: number): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({ ...this.override, maxCachedCollections });\n }\n\n index(\n autoIndex: BuilderIndexMode,\n defaultIndexType?: BuilderIndexType,\n ): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({\n ...this.override,\n autoIndex,\n ...(defaultIndexType ? { defaultIndexType } : {}),\n });\n }\n\n toOverride(): ClientCollectionOverride {\n return this.override;\n }\n}\n\nexport type CollectionManagers<TCollections extends CollectionDefinitions> = {\n [TName in keyof TCollections]: CollectionTypeForDefinition<TCollections[TName]>;\n};\n\ntype CollectionTypeForDefinition<TDefinition> =\n TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi>\n ? CollectionType<\n TRow,\n Extract<TRow[TKey], string | number>,\n ChildOptionsForDefinitions<TChildren>,\n ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>\n >\n : never;\n\ntype ChildOptionsForDefinitions<TChildren extends CollectionDefinitions> = {\n [TName in keyof TChildren]: ChildOptionForDefinition<TChildren[TName]>;\n};\n\ntype ChildOptionForDefinition<TDefinition> =\n TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi>\n ? ChildCollectionTypeOptions<\n TRow,\n Extract<TRow[TKey], string | number>,\n StandardSchemaV1,\n ChildOptionsForDefinitions<TChildren>,\n ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>\n >\n : never;\n\ntype ApiMethodsForDefinitions<\n TApi extends Record<string, ApiDefinition<any, any>>,\n TRow extends object,\n TKey extends string | number,\n> = {\n [TName in keyof TApi]: TApi[TName] extends ApiDefinition<infer TInput, infer TOutput>\n ? CollectionApiMethod<TInput, TOutput, TRow, TKey>\n : never;\n};\n\ninterface ClientCollectionOverride {\n syncMode?: BuilderSyncMode;\n maxSyncRows?: number | false;\n autoIndex?: BuilderIndexMode;\n defaultIndexType?: BuilderIndexType;\n offline?: true | IndexedDBOfflineOptions;\n maxCachedCollections?: number;\n}\n\nfunction collectionTypeFromDefinition(\n definition: CollectionDefinition,\n dotPath: string,\n overrides: Record<string, ClientCollectionOverride>,\n connection: CollectionTypeConnection,\n): CollectionType<any, any, any, any> {\n return createCollectionTypeFromOptions({\n ...collectionOptionsFromDefinition(definition, dotPath, overrides),\n ...connection,\n } as any);\n}\n\nfunction collectionOptionsFromDefinition(\n definition: CollectionDefinition,\n dotPath: string,\n overrides: Record<string, ClientCollectionOverride>,\n): Record<string, unknown> {\n return {\n ...overrides[dotPath],\n name: definition.name,\n path: definition.path,\n schema: definition.schema,\n getKey: (item: Record<string, unknown>) => item[definition.key],\n children: Object.fromEntries(\n Object.entries(definition.children).map(([name, child]) => [\n name,\n collectionOptionsFromDefinition(child, `${dotPath}.${name}`, overrides),\n ]),\n ),\n api: Object.fromEntries(\n Object.entries(definition.api).map(([name, api]) => [\n name,\n api.path ? { path: api.path } : {},\n ]),\n ) satisfies CollectionTypeApi<any, any>,\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lsync/client",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"homepage": "https://github.com/Myrannas/lsync#readme",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/Myrannas/lsync/issues"
|
|
@@ -29,12 +29,11 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@standard-schema/spec": "^1.0.0",
|
|
31
31
|
"@tanstack/db": "^0.6.14",
|
|
32
|
-
"@
|
|
33
|
-
"@
|
|
34
|
-
"@lsync/definitions": "0.0.1",
|
|
35
|
-
"@lsync/transport": "0.0.1"
|
|
32
|
+
"@lsync/definitions": "0.0.3",
|
|
33
|
+
"@lsync/transport": "0.0.3"
|
|
36
34
|
},
|
|
37
35
|
"devDependencies": {
|
|
36
|
+
"fake-indexeddb": "^6.2.5",
|
|
38
37
|
"typescript": "^6.0.3",
|
|
39
38
|
"vite": "npm:@voidzero-dev/vite-plus-core@0.2.2",
|
|
40
39
|
"vite-plus": "0.2.2",
|