@tanstack/db
Version:
A reactive client store for building super fast apps on sync
1 lines • 39 kB
Source Map (JSON)
{"version":3,"file":"client.cjs","sources":["../../src/client.ts"],"sourcesContent":["import { createCollection } from './collection/index.js'\nimport {\n collectionOptionsBrand,\n collectionOptionsFactory,\n hasCollectionOptionsBrand,\n} from './collection-options.js'\nimport { TransactionScope } from './transactions.js'\nimport { getBuilderFromConfig } from './query/live/collection-registry.js'\nimport { createLiveQueryCollection } from './query/live-query-collection.js'\nimport { createLiveQueryObserver } from './live-query-observer.js'\nimport {\n getLiveQueryHash,\n prepareLiveQueryValue,\n} from './live-query-options.js'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type { Collection } from './collection/index.js'\nimport type { CollectionOptionsIdentity } from './collection-options.js'\nimport type {\n CollectionConfig,\n InferSchemaInput,\n InferSchemaOutput,\n NonSingleResult,\n SingleResult,\n TransactionConfig,\n UtilsRecord,\n} from './types.js'\nimport type {\n DeferredLiveQueryCollections,\n LiveQueryOptions,\n} from './live-query-options.js'\n\nconst collectionConfigFactory: unique symbol = Symbol.for(\n `@tanstack/db.collectionConfig.factory`,\n) as never\n\ntype AnyCollectionConfig = CollectionConfig<any, any, any, any>\n\nexport type CollectionOptions<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = CollectionOptionsIdentity<T, TKey, TSchema, TUtils, DbClient>\n\ntype AnyCollectionOptions = CollectionOptions<any, any, any, any>\ntype AnyCollection = Collection<any, any, any, any, any>\n\ntype DescriptorFromConfig<TConfig extends AnyCollectionConfig> =\n TConfig extends {\n getKey: (item: infer T) => infer TKey\n }\n ? CollectionOptions<\n Extract<T, object>,\n Extract<TKey, string | number>,\n TConfig extends {\n schema: infer TSchema extends StandardSchemaV1\n }\n ? TSchema\n : never,\n TConfig extends {\n utils: infer TUtils extends UtilsRecord\n }\n ? TUtils\n : UtilsRecord\n > &\n (TConfig extends SingleResult ? SingleResult : NonSingleResult)\n : never\n\ntype CollectionConfigWithFactory<TConfig extends AnyCollectionConfig> =\n TConfig & {\n readonly [collectionConfigFactory]: (client: DbClient) => TConfig\n }\n\n/**\n * Adds a fresh-config materializer to an adapter options object.\n *\n * Adapter option creators should use this so a module-scoped descriptor can be\n * materialized safely by more than one DbClient.\n */\nexport function withCollectionConfigFactory<\n TConfig extends AnyCollectionConfig,\n>(\n config: TConfig,\n factory: (client: DbClient) => TConfig,\n): CollectionConfigWithFactory<TConfig> {\n Object.defineProperty(config, collectionConfigFactory, {\n value: factory,\n enumerable: false,\n })\n return config as CollectionConfigWithFactory<TConfig>\n}\n\nexport type CollectionMaterializeOptions<T extends object> = {\n initialData?: Array<T>\n}\n\nexport type DehydratedCollectionRow<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n key: TKey\n value: T\n metadata?: unknown\n}\n\nexport type DehydratedCollectionChunk<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n collectionId: string\n rows: Array<DehydratedCollectionRow<T, TKey>>\n syncMeta?: unknown\n}\n\nexport type DehydratedLiveQuery = {\n queryHash: string\n dehydratedAt: number\n snapshot?: DehydratedLiveQueryResult\n promise?: Promise<DehydratedLiveQueryResult>\n}\n\nexport type DehydratedLiveQueryResult<\n T extends object = object,\n TKey extends string | number = string | number,\n> = {\n rows: Array<DehydratedCollectionRow<T, TKey>>\n}\n\nexport type DehydratedDbState = {\n collections: Array<DehydratedCollectionChunk>\n liveQueries?: Array<DehydratedLiveQuery>\n}\n\nexport type DbClientLiveQueryState = `pending` | `success` | `error`\n\nexport type DbClientLiveQuery = {\n readonly queryHash: string\n readonly dehydratedAt: number\n readonly status: DbClientLiveQueryState\n readonly promise: Promise<void>\n readonly snapshot?: DehydratedLiveQueryResult\n readonly error?: unknown\n}\n\nexport type DbClientEvent =\n | {\n type: `liveQueryAdded` | `liveQueryUpdated`\n query: DbClientLiveQuery\n }\n | {\n type: `liveQueryStreamError`\n error: unknown\n }\n\nexport type DehydrateDbClientOptions = {\n shouldDehydrateCollection?: (collection: Collection) => boolean\n shouldDehydrateLiveQuery?: (query: DbClientLiveQuery) => boolean\n}\n\ntype CollectionRecord = {\n collection: AnyCollection\n shouldDehydrate: boolean\n}\n\ntype LiveQueryRecord = {\n queryHash: string\n dehydratedAt: number\n status: DbClientLiveQueryState\n promise: Promise<void>\n resultPromise: Promise<DehydratedLiveQueryResult>\n succeed: (snapshot: DehydratedLiveQueryResult) => void\n fail: (error: unknown) => void\n snapshot?: DehydratedLiveQueryResult\n error?: unknown\n}\n\nexport type DbClientOptions = Record<string, unknown>\n\nexport function collectionOptions<\n T extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord,\n>(\n options: CollectionConfig<InferSchemaOutput<T>, TKey, T, TUtils> & {\n schema: T\n } & NonSingleResult,\n): CollectionOptions<InferSchemaOutput<T>, TKey, T, TUtils> & NonSingleResult\nexport function collectionOptions<\n T extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord,\n>(\n options: CollectionConfig<InferSchemaOutput<T>, TKey, T, TUtils> & {\n schema: T\n } & SingleResult,\n): CollectionOptions<InferSchemaOutput<T>, TKey, T, TUtils> & SingleResult\nexport function collectionOptions<\n T extends object,\n TKey extends string | number = string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: CollectionConfig<T, TKey, never, TUtils> & {\n schema?: never\n } & NonSingleResult,\n): CollectionOptions<T, TKey, never, TUtils> & NonSingleResult\nexport function collectionOptions<\n T extends object,\n TKey extends string | number = string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: CollectionConfig<T, TKey, never, TUtils> & {\n schema?: never\n } & SingleResult,\n): CollectionOptions<T, TKey, never, TUtils> & SingleResult\nexport function collectionOptions<TConfig extends AnyCollectionConfig>(\n id: string,\n factory: (client: DbClient) => TConfig,\n): DescriptorFromConfig<TConfig>\nexport function collectionOptions(\n optionsOrId: AnyCollectionConfig | string,\n explicitFactory?: (client: DbClient) => unknown,\n): any {\n const config = typeof optionsOrId === `string` ? undefined : optionsOrId\n const id = typeof optionsOrId === `string` ? optionsOrId : optionsOrId.id\n\n if (!id) {\n throw new Error(\n `collectionOptions requires a non-empty explicit id so the descriptor is stable across DbClient instances and SSR boundaries.`,\n )\n }\n\n if (typeof optionsOrId === `string` && !explicitFactory) {\n throw new Error(\n `collectionOptions(\"${id}\") requires a factory as its second argument.`,\n )\n }\n\n const reusableFactory:\n | ((client: DbClient) => AnyCollectionConfig)\n | undefined = config\n ? (config as CollectionConfigWithFactory<AnyCollectionConfig>)[\n collectionConfigFactory\n ]\n : (explicitFactory as\n | ((client: DbClient) => AnyCollectionConfig)\n | undefined)\n\n let owner: DbClient | undefined\n const materialize = (client: DbClient): AnyCollectionConfig => {\n let materialized: AnyCollectionConfig\n\n if (reusableFactory) {\n materialized = reusableFactory(client)\n } else {\n if (owner && owner !== client) {\n throw new Error(\n `Collection descriptor \"${id}\" was created from a concrete config that cannot be safely reused across DbClient instances. ` +\n `Use collectionOptions(\"${id}\", (client) => adapterCollectionOptions(...)) or an adapter options creator that supports DbClient materialization.`,\n )\n }\n owner = client\n materialized = config!\n }\n\n if (materialized.id !== undefined && materialized.id !== id) {\n throw new Error(\n `Collection descriptor \"${id}\" materialized a config with id \"${materialized.id}\". Descriptor and collection ids must match.`,\n )\n }\n\n return materialized.id === id ? materialized : { ...materialized, id }\n }\n\n const descriptor = {\n id,\n ...((config as { singleResult?: boolean } | undefined)?.singleResult ===\n true\n ? { singleResult: true as const }\n : {}),\n } as Record<PropertyKey, unknown>\n\n Object.defineProperties(descriptor, {\n [collectionOptionsBrand]: {\n value: true,\n enumerable: false,\n },\n [collectionOptionsFactory]: {\n value: materialize,\n enumerable: false,\n },\n })\n\n return Object.freeze(descriptor) as CollectionOptions<\n any,\n string | number,\n any,\n UtilsRecord\n >\n}\n\nexport function isCollectionOptions(\n value: unknown,\n): value is CollectionOptions<any, string | number, any, UtilsRecord> {\n return hasCollectionOptionsBrand(value)\n}\n\nexport class DbClient {\n private collectionsByOptions = new WeakMap<object, AnyCollection>()\n private collectionsById = new Map<string, CollectionRecord>()\n private pendingHydration = new Map<string, Array<DehydratedCollectionChunk>>()\n private liveQueries = new Map<string, LiveQueryRecord>()\n private preloadedLiveQueries = new Map<\n string,\n {\n collection: AnyCollection\n observer: { dispose: () => void }\n }\n >()\n private liveQueryResources = new Map<object, () => Promise<void>>()\n private listeners = new Set<(event: DbClientEvent) => void>()\n private ssrStreamingEnabled = false\n private ssrServerCleanupEnabled = false\n private lastLiveQueryTimestamp = 0\n private readonly transactionScope = new TransactionScope()\n\n constructor(private readonly options: DbClientOptions = {}) {}\n\n getDependency<T>(key: string): T | undefined {\n return this.options[key] as T | undefined\n }\n\n requireDependency<T>(key: string): T {\n const dependency = this.getDependency<T>(key)\n if (dependency === undefined) {\n throw new Error(\n `DbClient is missing the required \"${key}\" dependency. Pass it explicitly when constructing the client: new DbClient({ ${key} }).`,\n )\n }\n return dependency\n }\n\n get activeTransaction() {\n return this.transactionScope.getActiveTransaction()\n }\n\n createTransaction<T extends object = Record<string, unknown>>(\n config: TransactionConfig<T>,\n ) {\n return this.transactionScope.createTransaction(config)\n }\n\n preloadLiveQuery(options: LiveQueryOptions): Promise<void> {\n const deferredCollections: DeferredLiveQueryCollections = new Set()\n try {\n const prepared = prepareLiveQueryValue(options, this, deferredCollections)\n const queryHash = getLiveQueryHash(prepared, options.queryKey)\n const existing = this.liveQueries.get(queryHash)\n if (existing && existing.status !== `error`) return existing.promise\n\n const failedPreload = this.preloadedLiveQueries.get(queryHash)\n if (failedPreload) {\n failedPreload.observer.dispose()\n void failedPreload.collection.cleanup().catch(() => {})\n this.preloadedLiveQueries.delete(queryHash)\n }\n\n const collection = createLiveQueryCollection({\n ...(prepared as LiveQueryOptions),\n startSync: true,\n }) as AnyCollection\n const observer = createLiveQueryObserver(collection, {\n client: this,\n queryHash,\n mode: `wholesale`,\n })\n this.preloadedLiveQueries.set(queryHash, { collection, observer })\n\n return this._registerLiveQuery(\n queryHash,\n collection.preload().then(() => observer.dehydrate()),\n )\n } finally {\n for (const source of deferredCollections) source._resumeSyncStart()\n deferredCollections.clear()\n }\n }\n\n collection<\n T extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord,\n >(\n options: CollectionOptions<InferSchemaOutput<T>, TKey, T, TUtils> &\n NonSingleResult,\n materializeOptions?: CollectionMaterializeOptions<InferSchemaInput<T>>,\n ): Collection<InferSchemaOutput<T>, TKey, TUtils, T, InferSchemaInput<T>> &\n NonSingleResult\n collection<\n T extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord,\n >(\n options: CollectionOptions<InferSchemaOutput<T>, TKey, T, TUtils> &\n SingleResult,\n materializeOptions?: CollectionMaterializeOptions<InferSchemaInput<T>>,\n ): Collection<InferSchemaOutput<T>, TKey, TUtils, T, InferSchemaInput<T>> &\n SingleResult\n collection<\n T extends object,\n TKey extends string | number = string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n >(\n options: CollectionOptions<T, TKey, never, TUtils> & NonSingleResult,\n materializeOptions?: CollectionMaterializeOptions<T>,\n ): Collection<T, TKey, TUtils, never, T> & NonSingleResult\n collection<\n T extends object,\n TKey extends string | number = string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n >(\n options: CollectionOptions<T, TKey, never, TUtils> & SingleResult,\n materializeOptions?: CollectionMaterializeOptions<T>,\n ): Collection<T, TKey, TUtils, never, T> & SingleResult\n collection(\n options: AnyCollectionOptions,\n materializeOptions?: CollectionMaterializeOptions<any>,\n ): AnyCollection {\n return this.materializeCollection(options, materializeOptions, false)\n }\n\n /** @internal */\n _materializeCollectionForRender<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n >(\n options: CollectionOptions<T, TKey, TSchema, TUtils>,\n ): Collection<\n T,\n TKey,\n TUtils,\n TSchema,\n [TSchema] extends [never] ? T : InferSchemaInput<TSchema>\n > {\n return this.materializeCollection(options, undefined, true)\n }\n\n private materializeCollection(\n options: AnyCollectionOptions,\n materializeOptions: CollectionMaterializeOptions<any> | undefined,\n deferSyncStart: boolean,\n ): AnyCollection {\n const existing = this.collectionsByOptions.get(options)\n if (existing) {\n if (!deferSyncStart) {\n this.collectionsById.get(existing.id)!.shouldDehydrate = true\n }\n if (deferSyncStart) {\n existing._deferSyncStart()\n }\n return existing\n }\n\n if (this.collectionsById.has(options.id)) {\n throw new Error(\n `Cannot materialize collection \"${options.id}\" because this DbClient already has a different collection with that id. SSR hydration requires collection ids to be unique per DbClient.`,\n )\n }\n\n const config = options[collectionOptionsFactory](this)\n const shouldStartSync = config.startSync === true\n const collection = createCollection({\n ...config,\n startSync: false,\n } as any)\n collection._setTransactionScope(this.transactionScope)\n if (deferSyncStart) {\n collection._deferSyncStart()\n }\n\n this.collectionsByOptions.set(options, collection)\n this.collectionsById.set(collection.id, {\n collection,\n shouldDehydrate: !deferSyncStart,\n })\n\n if (materializeOptions?.initialData?.length) {\n this.applyRows(\n collection,\n {\n collectionId: collection.id,\n rows: materializeOptions.initialData.map((value) => ({ value })),\n },\n `initialData`,\n )\n }\n\n const pendingChunks = this.pendingHydration.get(collection.id)\n if (pendingChunks) {\n for (const chunk of pendingChunks) {\n this.applyRows(collection, chunk, `hydration`)\n }\n this.pendingHydration.delete(collection.id)\n }\n\n if (shouldStartSync) {\n collection.startSyncImmediate()\n }\n\n return collection\n }\n\n dehydrate(options: DehydrateDbClientOptions = {}): DehydratedDbState {\n const collections: Array<DehydratedCollectionChunk> = []\n\n for (const {\n collection,\n shouldDehydrate,\n } of this.collectionsById.values()) {\n const collectionDecision = options.shouldDehydrateCollection?.(collection)\n if (\n getBuilderFromConfig(collection.config) ||\n collectionDecision === false ||\n (!shouldDehydrate && collectionDecision !== true)\n ) {\n continue\n }\n\n const rows = Array.from(collection._state.syncedData.entries()).map(\n ([key, value]) => {\n const metadata = collection._state.syncedMetadata.get(key)\n return {\n key,\n value,\n ...(metadata === undefined ? {} : { metadata }),\n }\n },\n )\n\n collections.push({\n collectionId: collection.id,\n rows,\n syncMeta: collection.config.sync.exportSyncMeta?.(),\n })\n }\n\n const liveQueries = Array.from(this.liveQueries.values()).flatMap(\n (query): Array<DehydratedLiveQuery> => {\n const shouldDehydrate =\n options.shouldDehydrateLiveQuery?.(query) ??\n query.status === `success`\n if (!shouldDehydrate || query.status === `error`) {\n return []\n }\n\n return [\n {\n queryHash: query.queryHash,\n dehydratedAt: query.dehydratedAt,\n ...(query.snapshot\n ? { snapshot: query.snapshot }\n : { promise: query.resultPromise }),\n },\n ]\n },\n )\n\n return {\n collections,\n ...(liveQueries.length > 0 ? { liveQueries } : {}),\n }\n }\n\n hydrate(state: DehydratedDbState): void {\n for (const chunk of state.collections) {\n const record = this.collectionsById.get(chunk.collectionId)\n if (record) {\n this.applyRows(record.collection, chunk, `hydration`)\n continue\n }\n\n const pendingChunks = this.pendingHydration.get(chunk.collectionId) ?? []\n pendingChunks.push(chunk)\n this.pendingHydration.set(chunk.collectionId, pendingChunks)\n }\n\n for (const dehydratedQuery of state.liveQueries ?? []) {\n this.hydrateLiveQuery(dehydratedQuery)\n }\n }\n\n applyCollectionChunk(chunk: DehydratedCollectionChunk): void {\n this.hydrate({ collections: [chunk] })\n }\n\n subscribe(listener: (event: DbClientEvent) => void): () => void {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n /** @internal */\n _setSsrStreamingEnabled(enabled: boolean): void {\n this.ssrStreamingEnabled = enabled\n }\n\n /** @internal */\n _isSsrStreamingEnabled(): boolean {\n return this.ssrStreamingEnabled\n }\n\n /** @internal */\n _setSsrServerCleanupEnabled(enabled: boolean): void {\n this.ssrServerCleanupEnabled = enabled\n }\n\n /** @internal */\n _isSsrServerCleanupEnabled(): boolean {\n return this.ssrServerCleanupEnabled\n }\n\n /** @internal */\n _getLiveQuery(queryHash: string): DbClientLiveQuery | undefined {\n return this.liveQueries.get(queryHash)\n }\n\n /** @internal */\n _consumeLiveQueryResult(queryHash: string, dehydratedAt: number): void {\n const record = this.liveQueries.get(queryHash)\n if (record?.dehydratedAt === dehydratedAt) {\n this.liveQueries.delete(queryHash)\n }\n }\n\n /** @internal */\n _registerLiveQuery(\n queryHash: string,\n promise: Promise<DehydratedLiveQueryResult>,\n ): Promise<void> {\n const existing = this.liveQueries.get(queryHash)\n if (existing && existing.status !== `error`) {\n void Promise.resolve(promise).catch(() => {})\n return existing.promise\n }\n\n const record = this.createLiveQueryRecord(\n queryHash,\n this.nextLiveQueryTimestamp(),\n )\n\n this.liveQueries.set(queryHash, record)\n this.emit({ type: `liveQueryAdded`, query: record })\n Promise.resolve(promise).then(record.succeed, record.fail)\n return record.promise\n }\n\n /** @internal */\n _registerLiveQueryResource(\n owner: object,\n cleanup: () => Promise<void>,\n ): () => void {\n this.liveQueryResources.set(owner, cleanup)\n return () => {\n if (this.liveQueryResources.get(owner) === cleanup) {\n this.liveQueryResources.delete(owner)\n }\n }\n }\n\n /** @internal */\n _failPendingLiveQueries(error: unknown): void {\n for (const record of this.liveQueries.values()) {\n if (record.status === `pending`) record.fail(error)\n }\n this.emit({ type: `liveQueryStreamError`, error })\n }\n\n async cleanup(): Promise<void> {\n try {\n const materializedCollections = Array.from(\n this.collectionsById.values(),\n ({ collection }) => collection,\n )\n const preloadedQueries = Array.from(this.preloadedLiveQueries.values())\n const liveQueryCollections = new Set([\n ...preloadedQueries.map(({ collection }) => collection),\n ...materializedCollections.filter((collection) =>\n getBuilderFromConfig(collection.config),\n ),\n ])\n\n for (const { observer } of preloadedQueries) observer.dispose()\n\n const cleanupResults = [\n ...(await Promise.allSettled(\n Array.from(this.liveQueryResources.values(), (cleanup) => cleanup()),\n )),\n ...(await Promise.allSettled(\n Array.from(liveQueryCollections, (collection) =>\n collection.cleanup(),\n ),\n )),\n ...(await Promise.allSettled(\n materializedCollections\n .filter((collection) => !liveQueryCollections.has(collection))\n .map((collection) => collection.cleanup()),\n )),\n ]\n const failure = cleanupResults.find(\n (result): result is PromiseRejectedResult =>\n result.status === `rejected`,\n )\n if (failure) throw failure.reason\n } finally {\n this.transactionScope.clear()\n this.collectionsByOptions = new WeakMap()\n this.collectionsById.clear()\n this.pendingHydration.clear()\n this.liveQueries.clear()\n this.preloadedLiveQueries.clear()\n this.liveQueryResources.clear()\n this.listeners.clear()\n this.ssrStreamingEnabled = false\n this.ssrServerCleanupEnabled = false\n this.lastLiveQueryTimestamp = 0\n }\n }\n\n private hydrateLiveQuery(dehydratedQuery: DehydratedLiveQuery): void {\n const existing = this.liveQueries.get(dehydratedQuery.queryHash)\n if (existing && existing.dehydratedAt >= dehydratedQuery.dehydratedAt) {\n return\n }\n\n const record = this.createLiveQueryRecord(\n dehydratedQuery.queryHash,\n dehydratedQuery.dehydratedAt,\n )\n this.liveQueries.set(record.queryHash, record)\n if (existing?.status === `pending`) {\n void record.resultPromise.then(existing.succeed, existing.fail)\n }\n this.emit({ type: `liveQueryAdded`, query: record })\n\n if (dehydratedQuery.snapshot) {\n record.succeed(dehydratedQuery.snapshot)\n } else if (dehydratedQuery.promise) {\n Promise.resolve(dehydratedQuery.promise).then(record.succeed, record.fail)\n } else {\n record.fail(\n new Error(\n `Dehydrated live query \"${dehydratedQuery.queryHash}\" has neither a snapshot nor a promise.`,\n ),\n )\n }\n }\n\n private nextLiveQueryTimestamp(): number {\n this.lastLiveQueryTimestamp = Math.max(\n Date.now(),\n this.lastLiveQueryTimestamp + 1,\n )\n return this.lastLiveQueryTimestamp\n }\n\n private createLiveQueryRecord(\n queryHash: string,\n dehydratedAt: number,\n ): LiveQueryRecord {\n this.lastLiveQueryTimestamp = Math.max(\n this.lastLiveQueryTimestamp,\n dehydratedAt,\n )\n\n let resolveResult!: (snapshot: DehydratedLiveQueryResult) => void\n let rejectResult!: (error: unknown) => void\n let settled = false\n const resultPromise = new Promise<DehydratedLiveQueryResult>(\n (resolve, reject) => {\n resolveResult = resolve\n rejectResult = reject\n },\n )\n const promise = resultPromise.then(() => undefined)\n resultPromise.catch(() => {})\n promise.catch(() => {})\n\n const record: LiveQueryRecord = {\n queryHash,\n dehydratedAt,\n status: `pending`,\n promise,\n resultPromise,\n succeed: (snapshot) => {\n if (settled) return\n settled = true\n record.status = `success`\n record.snapshot = snapshot\n resolveResult(snapshot)\n if (this.liveQueries.get(queryHash) === record) {\n this.emit({ type: `liveQueryUpdated`, query: record })\n }\n },\n fail: (error) => {\n if (settled) return\n settled = true\n record.status = `error`\n record.error = error\n rejectResult(error)\n if (this.liveQueries.get(queryHash) === record) {\n this.emit({ type: `liveQueryUpdated`, query: record })\n }\n },\n }\n\n return record\n }\n\n private emit(event: DbClientEvent): void {\n for (const listener of this.listeners) {\n listener(event)\n }\n }\n\n private applyRows(\n collection: Collection<any, string | number, any, any, any>,\n chunk: Omit<DehydratedCollectionChunk, `rows`> & {\n rows: Array<\n Omit<DehydratedCollectionRow, `key`> & {\n key?: string | number\n }\n >\n },\n seedKind?: `initialData` | `hydration`,\n ): void {\n const rows = chunk.rows.flatMap((row) => {\n const value = collection.validateData(row.value, `insert`)\n const key = collection.config.getKey(value)\n const isAdapterAuthoritative =\n seedKind === `hydration` &&\n collection._state.syncedData.has(key) &&\n !collection._state.hydrationSeedKeys.has(key)\n\n return isAdapterAuthoritative ? [] : [{ ...row, key, value }]\n })\n const rowMetadataWrites = new Map<\n string | number,\n { type: `set`; value: unknown } | { type: `delete` }\n >()\n\n for (const row of rows) {\n if (row.metadata !== undefined) {\n rowMetadataWrites.set(row.key, { type: `set`, value: row.metadata })\n }\n }\n\n if (seedKind) {\n for (const row of rows) {\n collection._state.hydrationSeedKeys.add(row.key)\n if (seedKind === `hydration`) {\n collection._state.hydratedKeys.add(row.key)\n }\n }\n }\n\n if (rows.length > 0) {\n collection._state.pendingSyncedTransactions.push({\n committed: true,\n layoutChanged: false,\n operations: rows.map((row) => ({\n type: collection._state.syncedData.has(row.key)\n ? (`update` as const)\n : (`insert` as const),\n key: row.key,\n value: row.value,\n })),\n deletedKeys: new Set(),\n rowMetadataWrites,\n collectionMetadataWrites: new Map(),\n immediate: true,\n preserveHydrationSeedKeys: seedKind !== undefined,\n })\n collection._state.commitPendingTransactions()\n }\n\n if (chunk.syncMeta !== undefined) {\n const currentMeta = collection.config.sync.exportSyncMeta?.()\n const mergedMeta =\n currentMeta === undefined\n ? chunk.syncMeta\n : (collection.config.sync.mergeSyncMeta?.(\n currentMeta,\n chunk.syncMeta,\n ) ?? chunk.syncMeta)\n collection.config.sync.importSyncMeta?.(mergedMeta)\n }\n }\n}\n"],"names":["collectionOptionsBrand","collectionOptionsFactory","hasCollectionOptionsBrand","TransactionScope","prepareLiveQueryValue","getLiveQueryHash","createLiveQueryCollection","createLiveQueryObserver","createCollection","getBuilderFromConfig"],"mappings":"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"}