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