UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

1 lines 3.41 kB
{"version":3,"file":"subset-dedupe.cjs","sources":["../../../src/query/subset-dedupe.ts"],"sourcesContent":["import { getLoadSubsetDemandKey } from './ir-stable-identity.js'\nimport type { LoadSubsetFn, LoadSubsetOptions } from '../types.js'\n\n/**\n * Deduplicates exact canonical demands without inferring broader coverage.\n * Requests follow the immutable LoadSubsetOptions contract; no copies are made.\n */\nexport class DeduplicatedLoadSubset {\n private readonly completed = new Set<string | undefined>()\n private readonly inflight = new Map<string | undefined, Promise<void>>()\n private generation = 0\n\n constructor(\n private readonly options: {\n loadSubset: LoadSubsetFn\n onDeduplicate?: (options: LoadSubsetOptions) => void\n },\n ) {}\n\n loadSubset = (options: LoadSubsetOptions): true | Promise<void> => {\n const key = getLoadSubsetDemandKey(options)\n if (this.completed.has(key)) {\n this.options.onDeduplicate?.(options)\n return true\n }\n\n // Requests with independent cancellation own independent transports.\n // Unabortable requests can share without an ownership protocol.\n const existing = options.signal ? undefined : this.inflight.get(key)\n if (existing) {\n // Observer failures must not reject a detached promise after success.\n void existing\n .then(() => this.options.onDeduplicate?.(options))\n .catch(() => {})\n return existing\n }\n\n const generation = this.generation\n const result = this.options.loadSubset(options)\n\n if (result === true) {\n if (generation === this.generation && !options.signal?.aborted) {\n this.completed.add(key)\n }\n return true\n }\n\n const promise = result\n .then((value) => {\n if (generation === this.generation && !options.signal?.aborted) {\n this.completed.add(key)\n }\n return value\n })\n .finally(() => {\n if (this.inflight.get(key) === promise) this.inflight.delete(key)\n })\n if (!options.signal && generation === this.generation) {\n this.inflight.set(key, promise)\n }\n return promise\n }\n\n reset(): void {\n this.completed.clear()\n this.inflight.clear()\n this.generation++\n }\n}\n"],"names":["options","getLoadSubsetDemandKey"],"mappings":";;;AAOO,MAAM,uBAAuB;AAAA,EAKlC,YACmB,SAIjB;AAJiB,SAAA,UAAA;AALnB,SAAiB,gCAAgB,IAAA;AACjC,SAAiB,+BAAe,IAAA;AAChC,SAAQ,aAAa;AASrB,SAAA,aAAa,CAACA,aAAqD;AACjE,YAAM,MAAMC,iBAAAA,uBAAuBD,QAAO;AAC1C,UAAI,KAAK,UAAU,IAAI,GAAG,GAAG;AAC3B,aAAK,QAAQ,gBAAgBA,QAAO;AACpC,eAAO;AAAA,MACT;AAIA,YAAM,WAAWA,SAAQ,SAAS,SAAY,KAAK,SAAS,IAAI,GAAG;AACnE,UAAI,UAAU;AAEZ,aAAK,SACF,KAAK,MAAM,KAAK,QAAQ,gBAAgBA,QAAO,CAAC,EAChD,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,KAAK;AACxB,YAAM,SAAS,KAAK,QAAQ,WAAWA,QAAO;AAE9C,UAAI,WAAW,MAAM;AACnB,YAAI,eAAe,KAAK,cAAc,CAACA,SAAQ,QAAQ,SAAS;AAC9D,eAAK,UAAU,IAAI,GAAG;AAAA,QACxB;AACA,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,OACb,KAAK,CAAC,UAAU;AACf,YAAI,eAAe,KAAK,cAAc,CAACA,SAAQ,QAAQ,SAAS;AAC9D,eAAK,UAAU,IAAI,GAAG;AAAA,QACxB;AACA,eAAO;AAAA,MACT,CAAC,EACA,QAAQ,MAAM;AACb,YAAI,KAAK,SAAS,IAAI,GAAG,MAAM,QAAS,MAAK,SAAS,OAAO,GAAG;AAAA,MAClE,CAAC;AACH,UAAI,CAACA,SAAQ,UAAU,eAAe,KAAK,YAAY;AACrD,aAAK,SAAS,IAAI,KAAK,OAAO;AAAA,MAChC;AACA,aAAO;AAAA,IACT;AAAA,EA5CG;AAAA,EA8CH,QAAc;AACZ,SAAK,UAAU,MAAA;AACf,SAAK,SAAS,MAAA;AACd,SAAK;AAAA,EACP;AACF;;"}