{"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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"}