@tanstack/db
Version:
A reactive client store for building super fast apps on sync
1 lines • 60.4 kB
Source Map (JSON)
{"version":3,"file":"client.cjs","sources":["../../src/client.ts"],"sourcesContent":["import { createCollection } from './collection/index.js'\nimport {\n collectionOptionsBrand,\n collectionOptionsClaim,\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 { LiveQueryObserverClient } from './live-query-observer-client.js'\nimport { createDeferred } from './deferred.js'\nimport {\n getLiveQueryHash,\n getLiveQueryRowOptions,\n getPreparedLiveQuerySources,\n prepareLiveQueryValue,\n resumeDeferredLiveQueryCollections,\n} from './live-query-options.js'\nimport { codedMessage, devBuild } from './error-message.js'\nimport { truncatesSourceKey } from './collection/state.js'\nimport type { LiveQueryObserverClientHost } from './live-query-observer-client.js'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type { Collection } from './collection/index.js'\nimport type { CollectionOptionsIdentity } from './collection-options.js'\nimport type { Deferred } from './deferred.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 LiveQueryRowOptions,\n} from './live-query-options.js'\nimport type {\n CollectionStateManager,\n PendingMetadataWrite,\n StagedSyncTransaction,\n} from './collection/state.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\nfunction sameSourcesAtEachPosition(\n left: ReadonlyArray<AnyCollection>,\n right: ReadonlyArray<AnyCollection>,\n): boolean {\n return (\n left.length === right.length &&\n left.every((source, index) => source === right[index])\n )\n}\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 claim?: () => void | (() => void),\n): CollectionConfigWithFactory<TConfig> {\n Object.defineProperty(config, collectionConfigFactory, {\n value: factory,\n enumerable: false,\n })\n if (claim) {\n Object.defineProperty(config, collectionOptionsClaim, {\n value: claim,\n enumerable: true,\n })\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 /** Earlier ordinary markup may precede a shared Suspense result. */\n initialSnapshot?: DehydratedLiveQueryResult\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 /** An initial SSR view may precede query readiness. Omitted means ready. */\n status?: `loading` | `error`\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 /** Initial hydration view retained while a local preload completes. */\n readonly initialSnapshot?: DehydratedLiveQueryResult\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 hydrated: boolean\n}\n\ntype LiveQueryRecord = {\n rowOptions?: LiveQueryRowOptions\n queryHash: string\n sources?: ReadonlyArray<AnyCollection>\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 initialSnapshot?: DehydratedLiveQueryResult\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 devBuild() && process.env.NODE_ENV !== `production`\n ? `collectionOptions requires a non-empty explicit id so the descriptor is stable across DbClient instances and SSR boundaries.`\n : codedMessage(88),\n )\n }\n\n if (typeof optionsOrId === `string` && !explicitFactory) {\n throw new Error(\n devBuild() && process.env.NODE_ENV !== `production`\n ? `collectionOptions(\"${id}\") requires a factory as its second argument.`\n : codedMessage(89, { id }),\n )\n }\n\n const reusableFactory:\n ((client: DbClient) => AnyCollectionConfig) | undefined = config\n ? (config as CollectionConfigWithFactory<AnyCollectionConfig>)[\n collectionConfigFactory\n ]\n : (explicitFactory as\n ((client: DbClient) => AnyCollectionConfig) | 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 devBuild() && process.env.NODE_ENV !== `production`\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 : codedMessage(90, { id }),\n )\n }\n owner = client\n materialized = config!\n }\n\n if (materialized.id !== undefined && materialized.id !== id) {\n throw new Error(\n devBuild() && process.env.NODE_ENV !== `production`\n ? `Collection descriptor \"${id}\" materialized a config with id \"${materialized.id}\". Descriptor and collection ids must match.`\n : codedMessage(91, { id, materializedId: materialized.id }),\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\n/**\n * A late hydration seed cannot supersede committed adapter work. Row data\n * and row metadata are separate objects, so each has its own lookup. A\n * wrapping sync's committed transactions that it has not handed to this\n * Collection yet count as committed adapter work.\n */\nfunction createAdapterAuthorityLookups<TKey extends string | number>(\n state: CollectionStateManager<any, TKey, any, any>,\n): {\n rows: (key: TKey) => boolean\n metadata: (key: TKey) => boolean\n} {\n const rowKeys = new Set<TKey>()\n const metadataKeys = new Set<TKey>()\n // The latest source truncate, with the held seeds a schema reset kept.\n let truncate: StagedSyncTransaction<TKey> | undefined =\n state.hasAppliedAdapterTruncate\n ? {\n truncate: true,\n operations: [],\n rowMetadataWrites: new Map(),\n preserveHydrationSeedKeys: state.adapterTruncateKeptKeys,\n sourceTruncate: true,\n }\n : undefined\n for (const transaction of [\n ...state.pendingSyncedTransactions.filter((pending) => pending.committed),\n ...state.getStagedSyncTransactions(),\n ]) {\n if (\n transaction.truncate &&\n (!transaction.preserveHydrationSeedKeys || transaction.sourceTruncate)\n )\n truncate = transaction\n for (const operation of transaction.operations)\n if (!transaction.preserveHydrationSeedKeys?.has(operation.key as TKey))\n rowKeys.add(operation.key as TKey)\n for (const key of transaction.rowMetadataWrites.keys())\n if (!transaction.preserveHydrationSeedKeys?.has(key))\n metadataKeys.add(key)\n }\n return {\n rows: (key) =>\n (truncate !== undefined && truncatesSourceKey(truncate, key)) ||\n rowKeys.has(key) ||\n state.appliedAdapterKeys?.get(key) === true ||\n (state.syncedData.has(key) && !state.hydrationSeedKeys.has(key)),\n // A key whose row an applied adapter write deleted is in the map too.\n metadata: (key) =>\n (truncate !== undefined && truncatesSourceKey(truncate, key)) ||\n metadataKeys.has(key) ||\n state.appliedAdapterKeys?.has(key) === true,\n }\n}\n\nexport class DbClient {\n private collectionsById = new Map<string, CollectionRecord>()\n private pendingHydration = new Map<string, Array<DehydratedCollectionChunk>>()\n private liveQueries = new Map<string, LiveQueryRecord>()\n // A committed reader cannot consume a later boundary's server snapshot.\n // Retain transported records for server getters until this client cleans up.\n private hydratedLiveQueries = new Map<string, LiveQueryRecord>()\n private ssrQueryWaiters = new Map<\n string,\n Deferred<void> | { cause: unknown }\n >()\n private ssrStreamFailure: { cause: unknown } | undefined\n private preloadedLiveQueries = new Map<\n string,\n {\n collection: AnyCollection\n observer: { dispose: () => void }\n sources: ReadonlyArray<AnyCollection>\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 devBuild() && process.env.NODE_ENV !== `production`\n ? `DbClient is missing the required \"${key}\" dependency. Pass it explicitly when constructing the client: new DbClient({ ${key} }).`\n : codedMessage(92, { 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 let started:\n | {\n result: Promise<void>\n registration?: { queryHash: string; record: LiveQueryRecord }\n }\n | undefined\n let primaryFailure: { error: unknown } | undefined\n try {\n started = this.startLiveQueryPreload(options, deferredCollections)\n } catch (error) {\n primaryFailure = { error }\n }\n\n let resumeFailure: { error: unknown } | undefined\n try {\n resumeDeferredLiveQueryCollections(deferredCollections, true)\n } catch (error) {\n resumeFailure = { error }\n }\n if (primaryFailure) throw primaryFailure.error\n if (resumeFailure) {\n const registration = started?.registration\n if (\n registration &&\n this.liveQueries.get(registration.queryHash) === registration.record\n ) {\n registration.record.fail(resumeFailure.error)\n this.discardPreloadedLiveQuery(registration.queryHash)\n }\n void started?.result.catch(() => {})\n throw resumeFailure.error\n }\n return started!.result\n }\n\n private discardPreloadedLiveQuery(queryHash: string): void {\n const preloaded = this.preloadedLiveQueries.get(queryHash)\n if (!preloaded) return\n preloaded.observer.dispose()\n void preloaded.collection.cleanup({ dependents: true }).catch(() => {})\n this.preloadedLiveQueries.delete(queryHash)\n }\n\n private startLiveQueryPreload(\n options: LiveQueryOptions,\n deferredCollections: DeferredLiveQueryCollections,\n ): {\n result: Promise<void>\n registration?: { queryHash: string; record: LiveQueryRecord }\n } {\n const prepared = prepareLiveQueryValue(options, this, deferredCollections)\n const queryHash = getLiveQueryHash(prepared, options.queryKey)\n const sources = getPreparedLiveQuerySources(prepared)\n const existing = this.liveQueries.get(queryHash)\n const rowOptions = getLiveQueryRowOptions(prepared)\n this._assertLiveQuerySources(queryHash, sources, rowOptions)\n if (\n existing &&\n (existing.status === `pending` ||\n (existing.status === `success` &&\n existing.snapshot?.status === undefined))\n ) {\n return { result: existing.promise }\n }\n\n this.discardPreloadedLiveQuery(queryHash)\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, {\n collection,\n observer,\n sources,\n })\n\n const result = this._registerLiveQuery(\n queryHash,\n collection.preload().then(() => observer.dehydrate()),\n sources,\n rowOptions,\n )\n return {\n result,\n registration: { queryHash, record: this.liveQueries.get(queryHash)! },\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.collectionsById.get(options.id)\n if (existing) {\n return this.reuseMaterializedCollection(existing, deferSyncStart)\n }\n\n const config = options[collectionOptionsFactory](this)\n const materializedDuringFactory = this.collectionsById.get(options.id)\n if (materializedDuringFactory) {\n return this.reuseMaterializedCollection(\n materializedDuringFactory,\n deferSyncStart,\n )\n }\n\n const shouldStartSync = config.startSync === true\n const collection = createCollection({\n ...config,\n startSync: false,\n } as any)\n collection._setTransactionScope(this.transactionScope)\n collection._state.enableHydrationAuthorityTracking()\n if (deferSyncStart) {\n collection._deferSyncStart()\n }\n\n this.collectionsById.set(collection.id, {\n collection,\n shouldDehydrate: !deferSyncStart,\n hydrated: this.pendingHydration.has(collection.id),\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 private reuseMaterializedCollection(\n record: CollectionRecord,\n deferSyncStart: boolean,\n ): AnyCollection {\n if (deferSyncStart) {\n record.collection._deferSyncStart()\n } else {\n record.shouldDehydrate = true\n }\n return record.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 decision = options.shouldDehydrateLiveQuery?.(query)\n const shouldDehydrate =\n decision ??\n (query.status === `success` || query.snapshot !== undefined)\n if (!shouldDehydrate || query.status === `error`) {\n return []\n }\n\n return [\n {\n queryHash: query.queryHash,\n dehydratedAt: query.dehydratedAt,\n ...(query.initialSnapshot &&\n query.initialSnapshot !== query.snapshot\n ? { initialSnapshot: query.initialSnapshot }\n : {}),\n ...(query.snapshot ? { snapshot: query.snapshot } : {}),\n ...(query.status === `pending` &&\n (!query.snapshot || this.ssrStreamingEnabled || decision === true)\n ? { promise: query.resultPromise }\n : {}),\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 record.hydrated = true\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 Supply transport behavior without coupling ordinary observers to SSR. */\n _bindLiveQueryObserver<T extends object, TKey extends string | number>(\n collection: Collection<T, TKey, any> | null,\n queryHash: string | undefined,\n suspendUntilReady: boolean,\n host: LiveQueryObserverClientHost<T, TKey>,\n ): LiveQueryObserverClient<T, TKey> {\n return new LiveQueryObserverClient(\n this,\n collection,\n queryHash,\n suspendUntilReady,\n host,\n )\n }\n\n /** @internal Normalized source transport carries rows, not readiness. */\n _hasSsrCollectionSnapshot(collection: AnyCollection): boolean {\n const sources = getBuilderFromConfig(\n collection.config,\n )?.getSourceCollections()\n if (sources)\n return sources.every((source) => this._hasSsrCollectionSnapshot(source))\n const record = this.collectionsById.get(collection.id)\n return (\n record?.collection === collection &&\n (record.shouldDehydrate || record.hydrated)\n )\n }\n\n /** @internal */\n _setSsrStreamingEnabled(enabled: boolean): void {\n if (enabled && !this.ssrStreamingEnabled) {\n this.ssrStreamFailure = undefined\n this.ssrQueryWaiters.clear()\n } else if (!enabled && this.ssrStreamingEnabled && !this.ssrStreamFailure)\n this.failSsrQueryWaiters(\n new Error(\n devBuild() && process.env.NODE_ENV !== `production`\n ? `The DB stream ended before the server-rendered query snapshot arrived.`\n : codedMessage(253),\n ),\n )\n this.ssrStreamingEnabled = enabled\n }\n\n /** @internal Wait for transport without claiming or starting a local source. */\n _waitForSsrLiveQuery(\n queryHash: string,\n forHydration = false,\n ): Promise<void> | undefined {\n let waiter = this.ssrQueryWaiters.get(queryHash)\n if (waiter && `cause` in waiter) throw waiter.cause\n if (!forHydration || this.hydratedLiveQueries.has(queryHash)) return\n if (this.ssrStreamFailure) {\n this.ssrQueryWaiters.set(queryHash, this.ssrStreamFailure)\n throw this.ssrStreamFailure.cause\n }\n if (!this.ssrStreamingEnabled) return\n if (!waiter) {\n waiter = createDeferred<void>()\n waiter.promise.catch(() => {})\n this.ssrQueryWaiters.set(queryHash, waiter)\n }\n return waiter.promise\n }\n\n private failSsrQueryWaiters(cause: unknown): void {\n // The wrapper distinguishes a terminal undefined cause from an open stream.\n this.ssrStreamFailure ??= { cause }\n for (const [queryHash, waiter] of this.ssrQueryWaiters) {\n this.ssrQueryWaiters.set(queryHash, this.ssrStreamFailure)\n if (`promise` in waiter) waiter.reject(this.ssrStreamFailure.cause)\n }\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(\n queryHash: string,\n forServerSnapshot = false,\n ): DbClientLiveQuery | undefined {\n return (\n (forServerSnapshot && this.hydratedLiveQueries.get(queryHash)) ||\n this.liveQueries.get(queryHash)\n )\n }\n\n /** @internal Reject incompatible local sources or row behavior for a reusable stream. */\n _assertLiveQuerySources(\n queryHash: string,\n sources: ReadonlyArray<AnyCollection>,\n rowOptions?: LiveQueryRowOptions,\n ): void {\n const record = this.liveQueries.get(queryHash)\n // A failed or consumed stream has no result to reuse and claims no sources.\n if (!record || record.status === `error`) return\n const priorSources =\n record.sources ?? this.preloadedLiveQueries.get(queryHash)?.sources\n if (\n (priorSources && !sameSourcesAtEachPosition(priorSources, sources)) ||\n (rowOptions &&\n record.rowOptions &&\n rowOptions.some(\n (option, index) => option !== record.rowOptions![index],\n ))\n ) {\n throw new Error(\n devBuild() && process.env.NODE_ENV !== `production`\n ? `DbClient cannot reuse live query \"${queryHash}\" with different source Collections or getKey/schema options. Use the same Collection objects and options, or a distinct query key.`\n : codedMessage(234, { queryHash }),\n )\n }\n record.rowOptions ??= rowOptions\n // Hydration has a portable hash but no server-side Collection objects.\n // The first local consumer claims them for later same-hash requests.\n if (!record.sources) record.sources = [...sources]\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 Capture the first server view without starting acquisition. */\n _captureServerQuery(\n queryHash: string,\n snapshot: DehydratedLiveQueryResult,\n sources?: ReadonlyArray<AnyCollection>,\n rowOptions?: LiveQueryRowOptions,\n ): void {\n const existing = this.liveQueries.get(queryHash)\n if (existing) {\n if (sources) this._assertLiveQuerySources(queryHash, sources, rowOptions)\n if (\n existing.snapshot &&\n (snapshot.status === undefined || existing.initialSnapshot)\n )\n return\n if (snapshot.status !== undefined) existing.initialSnapshot ??= snapshot\n existing.snapshot ??= snapshot\n // A queued promise cannot carry an ordinary reader's later initial view.\n // Advance transport without replacing that promise or its source claim.\n existing.dehydratedAt = this.nextLiveQueryTimestamp()\n this.emit({ type: `liveQueryUpdated`, query: existing })\n return\n }\n const record = this.createLiveQueryRecord(\n queryHash,\n this.nextLiveQueryTimestamp(),\n )\n record.rowOptions = rowOptions\n record.sources = sources\n if (snapshot.status !== undefined) record.initialSnapshot = snapshot\n this.liveQueries.set(queryHash, record)\n this.emit({ type: `liveQueryAdded`, query: record })\n record.succeed(snapshot)\n }\n\n /** @internal */\n _registerLiveQuery(\n queryHash: string,\n promise: Promise<DehydratedLiveQueryResult>,\n sources?: ReadonlyArray<AnyCollection>,\n rowOptions?: LiveQueryRowOptions,\n ): Promise<void> {\n // Observe even a rejected incoming promise when a source conflict discards it.\n void Promise.resolve(promise).catch(() => {})\n if (sources) this._assertLiveQuerySources(queryHash, sources, rowOptions)\n const existing = this.liveQueries.get(queryHash)\n if (\n existing &&\n (existing.status === `pending` ||\n (existing.status === `success` &&\n existing.snapshot?.status === undefined))\n ) {\n return existing.promise\n }\n\n const record = this.createLiveQueryRecord(\n queryHash,\n this.nextLiveQueryTimestamp(),\n )\n record.rowOptions = rowOptions\n record.sources = sources\n record.initialSnapshot = existing?.initialSnapshot\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 this.failSsrQueryWaiters(error)\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({ dependents: true }),\n ),\n )),\n ...(await Promise.allSettled(\n materializedCollections\n .filter((collection) => !liveQueryCollections.has(collection))\n .map((collection) => collection.cleanup({ dependents: true })),\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._setSsrStreamingEnabled(false)\n this.transactionScope.clear()\n this.collectionsById.clear()\n this.pendingHydration.clear()\n this.liveQueries.clear()\n this.hydratedLiveQueries.clear()\n this.preloadedLiveQueries.clear()\n this.liveQueryResources.clear()\n this.listeners.clear()\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 // Browser preload time cannot order server transport versions. Apply the\n // active-record guard only when that active record came from transport.\n if (\n existing &&\n existing === this.hydratedLiveQueries.get(dehydratedQuery.queryHash) &&\n existing.dehydratedAt >= dehydratedQuery.dehydratedAt\n ) {\n return\n }\n\n const record = this.createLiveQueryRecord(\n dehydratedQuery.queryHash,\n dehydratedQuery.dehydratedAt,\n )\n if (existing?.status === `error`) {\n this.discardPreloadedLiveQuery(dehydratedQuery.queryHash)\n } else {\n record.sources = existing?.sources\n record.rowOptions = existing?.rowOptions\n }\n this.liveQueries.set(record.queryHash, record)\n if (existing?.status === `pending`) {\n void record.resultPromise.then(existing.succeed, existing.fail)\n }\n record.initialSnapshot =\n dehydratedQuery.initialSnapshot ?? dehydratedQuery.snapshot\n this.hydratedLiveQueries.set(record.queryHash, record)\n const waiter = this.ssrQueryWaiters.get(record.queryHash)\n if (waiter && `promise` in waiter) waiter.resolve()\n this.ssrQueryWaiters.delete(record.queryHash)\n if (dehydratedQuery.promise) record.snapshot = dehydratedQuery.snapshot\n this.emit({ type: `liveQueryAdded`, query: record })\n\n if (dehydratedQuery.snapshot && !dehydratedQuery.promise) {\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 devBuild() && process.env.NODE_ENV !== `production`\n ? `Dehydrated live query \"${dehydratedQuery.queryHash}\" has neither a snapshot nor a promise.`\n : codedMessage(93, { queryHash: dehydratedQuery.queryHash }),\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 // A hydration seed supplies only the row data and row metadata that no\n // committed adapter write has written; each object is judged alone.\n const hydrating = seedKind === `hydration`\n const authority = createAdapterAuthorityLookups(collection._state)\n const seeds = chunk.rows.map((row) => {\n const value = collection.validateData(row.value, `insert`)\n return { ...row, key: collection.config.getKey(value), value }\n })\n const rows = seeds.filter((row) => !hydrating || !authority.rows(row.key))\n const rowMetadataWrites = new Map<string | number, PendingMetadataWrite>()\n\n for (const row of seeds) {\n if (hydrating && authority.metadata(row.key)) continue\n // The latest seed wins whole, so one without metadata clears it.\n if (row.metadata !== undefined)\n rowMetadataWrites.set(row.key, { type: `set`, value: row.metadata })\n else if (hydrating) rowMetadataWrites.set(row.key, { type: `delete` })\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 || rowMetadataWrites.size > 0) {\n const applied = createDeferred<void>()\n // Nothing awaits a seed's receipt; cleanup may still reject it.\n void applied.promise.catch(() => undefined)\n collection._state.acceptSyncTransaction({\n committed: true,\n applicationStarted: false,\n layoutChanged: false,\n // A seed replaces any earlier seed of its row whole.\n operations: rows.map((row) => ({\n type: `insert` as const,\n key: row.key,\n value: row.value,\n })),\n rowMetadataWrites,\n // An accepted transaction's metadata writes are never rebuilt.\n explicitRowMetadataWrites: new Map(),\n collectionMetadataWrites: new Map(),\n applied,\n // A seed chunk keeps its keys' seed status.\n preserveHydrationSeedKeys: seedKind\n ? new Set([\n ...rows.map((row) => row.key),\n ...rowMetadataWrites.keys(),\n ])\n : undefined,\n })\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":["index","collectionOptionsClaim","devBuild","codedMessage","collectionOptionsBrand","collectionOptionsFactory","hasCollectionOptionsBrand","state","truncatesSourceKey","collectionsById","pendingHydration","hydratedLiveQueries","ssrQueryWaiters","preloadedLiveQueries","liveQueryResources","ssrStreamingEnabled","ssrServerCleanupEnabled","lastLiveQueryTimestamp","transactionScope","TransactionScope","startLiveQueryPreload","resumeDeferredLiveQueryCollections","discardPreloadedLiveQuery","prepareLiveQueryValue","getLiveQueryHash","getPreparedLiveQuerySources","getLiveQueryRowOptions","createLiveQueryCollection","createLiveQueryObserver","materializeCollection","reuseMaterializedCollection","createCollection","applyRows","getBuilderFromConfig","hydrateLiveQuery","LiveQueryObserverClient","ssrStreamFailure","failSsrQueryWaiters","createDeferred","nextLiveQueryTimestamp","createLiveQueryRecord"],"mappings":"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"}