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