[{"data":1,"prerenderedAt":1217},["ShallowReactive",2],{"navigation_docs_en":3,"-en-core-concepts-deduplication":342,"-en-core-concepts-deduplication-surround":1212},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","/en/getting-started","en/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"What is Qora?","/en/getting-started/what-is-qora","en/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/en/getting-started/installation","en/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick Start","/en/getting-started/quick-start","en/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparison","/en/getting-started/comparison","en/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Coming from TanStack Query","/en/getting-started/coming-from-tanstack-query","en/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrating from Other Libraries","/en/getting-started/migrating-from-other-libraries","en/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"AI Assistants","/en/getting-started/ai-assistants","en/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Core Concepts","i-lucide-book-open","/en/core-concepts","en/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Queries","/en/core-concepts/queries","en/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Query Keys","/en/core-concepts/query-keys","en/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"Query States","/en/core-concepts/query-states","en/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Caching","/en/core-concepts/caching","en/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/en/core-concepts/stale-while-revalidate","en/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Deduplication","/en/core-concepts/deduplication","en/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations & Invalidation","/en/core-concepts/mutations","en/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Offline & Network","/en/core-concepts/offline","en/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Flutter Integration","i-lucide-smartphone","/en/flutter-integration","en/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Setup","/en/flutter-integration/setup","en/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/en/flutter-integration/qora-scope","en/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/en/flutter-integration/qora-builder","en/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/en/flutter-integration/qora-mutation-builder","en/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/en/flutter-integration/infinite-query-builder","en/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/en/flutter-integration/hooks","en/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Network Status Widgets","/en/flutter-integration/network-status","en/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Best Practices","/en/flutter-integration/best-practices","en/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Recipes","i-lucide-chef-hat","/en/recipes","en/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/en/recipes/mutations","en/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Optimistic Updates","/en/recipes/optimistic-updates","en/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistence","/en/recipes/persistence","en/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Network Aware","/en/recipes/network-aware","en/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Infinite Queries","/en/recipes/infinite-queries","en/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Dependent Queries","/en/recipes/dependent-queries","en/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Cancellation","/en/recipes/cancel-token","en/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"SSR Hydration","/en/recipes/ssr-hydration","en/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Error Handling","/en/recipes/error-handling","en/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Testing","/en/recipes/testing","en/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Route-Level Prefetching","/en/recipes/prefetch","en/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"API Reference","i-lucide-file-code","/en/api-reference","en/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/en/api-reference/qora-client","en/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/en/api-reference/qora-key","en/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/en/api-reference/qora-state","en/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/en/api-reference/qora-options","en/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/en/api-reference/qora-client-config","en/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"Mutation API","/en/api-reference/qora-mutation","en/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/en/api-reference/persist-qora-client","en/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Infinite Query","/en/api-reference/infinite-query","en/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"DevTools","i-lucide-bug","/en/devtools","en/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Overview","/en/devtools/overview","en/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"In-App Overlay","/en/devtools/overlay","en/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Data Serialization","/en/devtools/data-display","en/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Third Party","i-lucide-puzzle","/en/third-party","en/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"With Provider","/en/third-party/with-provider","en/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"With BLoC","/en/third-party/with-bloc","en/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"With Riverpod","/en/third-party/with-riverpod","en/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"With RxDart","/en/third-party/with-rxdart","en/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"With Dio","/en/third-party/with-dio","en/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"With GraphQL","/en/third-party/with-graphql","en/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Examples","/en/examples","en/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Case Study: User List & Detail","/en/examples/basic-query","en/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Case Study: Optimistic Mutations & Rollback","/en/examples/mutations-optimistic","en/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Case Study: Infinite Scroll Feed","/en/examples/infinite-scroll","en/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Case Study: Offline-First Todo App","/en/examples/offline-first","en/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Case Study: Network Awareness","/en/examples/network-awareness","en/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Case Study: Hooks Integration","/en/examples/hooks-integration","en/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Case Study: Complete Todo App","/en/examples/complete-todo-app","en/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Help","i-lucide-life-buoy","/en/help","en/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/en/help/faq","en/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Troubleshooting","/en/help/troubleshooting","en/09.help/2.troubleshooting",{"id":343,"title":77,"body":344,"description":1205,"extension":1206,"links":1207,"meta":1208,"navigation":1209,"path":78,"seo":1210,"stem":79,"__hash__":1211},"docs_en/en/02.core-concepts/6.deduplication.md",{"type":345,"value":346,"toc":1196},"minimark",[347,352,356,367,370,373,377,384,408,414,416,420,697,703,836,838,842,848,973,1016,1018,1022,1029,1035,1037,1041,1044,1158,1160,1164,1192],[348,349,351],"h2",{"id":350},"the-problem","The Problem",[353,354,355],"p",{},"Multiple widgets or services can independently request the same data at the same moment: on page load, during a fast navigation, or when a feature flag is evaluated. Without deduplication, each call fires its own network request:",[357,358,364],"pre",{"className":359,"code":361,"language":362,"meta":363},[360],"language-text","Without deduplication:\n  Widget A → GET /users/1  ←─┐\n  Widget B → GET /users/1  ←─┤  3 identical network calls\n  Widget C → GET /users/1  ←─┘\n","text","",[365,366,361],"code",{"__ignoreMap":363},[353,368,369],{},"This wastes bandwidth, adds server load, and risks race conditions where responses arrive out of order.",[371,372],"hr",{},[348,374,376],{"id":375},"how-qora-deduplicates","How Qora Deduplicates",[353,378,379,380,383],{},"Qora tracks every in-flight request in a ",[365,381,382],{},"_pendingRequests"," map keyed by the normalised query key. When a second call arrives while the first is still pending:",[385,386,387,395,398,401],"ol",{},[388,389,390,391,394],"li",{},"The in-flight ",[365,392,393],{},"Future"," is reused. No new network call is issued.",[388,396,397],{},"All callers await the same result.",[388,399,400],{},"The cache is updated once when the single response arrives.",[388,402,403,404,407],{},"All active ",[365,405,406],{},"watchQuery"," streams receive the state update.",[357,409,412],{"className":410,"code":411,"language":362,"meta":363},[360],"With Qora:\n  Widget A ─────────────────┐\n  Widget B → fetchQuery → dedup → GET /users/1  (1 request)\n  Widget C ─────────────────┘\n           all three resolve with the same result\n",[365,413,411],{"__ignoreMap":363},[371,415],{},[348,417,419],{"id":418},"example","Example",[357,421,426],{"className":422,"code":423,"filename":424,"language":425,"meta":363,"style":363},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// All three calls fire simultaneously: only one HTTP request is made\nfinal f1 = client.fetchQuery\u003CUser>(key: ['users', 1], fetcher: () => api.getUser(1));\nfinal f2 = client.fetchQuery\u003CUser>(key: ['users', 1], fetcher: () => api.getUser(1));\nfinal f3 = client.fetchQuery\u003CUser>(key: ['users', 1], fetcher: () => api.getUser(1));\n\n// f1, f2, f3 are the same Future: one network call, three waiters\nfinal results = await Future.wait([f1, f2, f3]);\n// results = [alice, alice, alice]\n","main.dart","dart",[365,427,428,437,525,583,641,648,654,691],{"__ignoreMap":363},[429,430,433],"span",{"class":431,"line":432},"line",1,[429,434,436],{"class":435},"sHwdD","// All three calls fire simultaneously: only one HTTP request is made\n",[429,438,440,444,448,452,455,458,462,465,469,472,475,478,482,485,489,492,494,497,499,502,505,508,510,513,516,519,522],{"class":431,"line":439},2,[429,441,443],{"class":442},"spNyl","final",[429,445,447],{"class":446},"sTEyZ"," f1 ",[429,449,451],{"class":450},"sMK4o","=",[429,453,454],{"class":446}," client",[429,456,457],{"class":450},".",[429,459,461],{"class":460},"s2Zo4","fetchQuery",[429,463,464],{"class":446},"\u003C",[429,466,468],{"class":467},"sBMFI","User",[429,470,471],{"class":446},">(key",[429,473,474],{"class":450},":",[429,476,477],{"class":446}," [",[429,479,481],{"class":480},"sfazB","'users'",[429,483,484],{"class":450},",",[429,486,488],{"class":487},"sbssI"," 1",[429,490,491],{"class":446},"]",[429,493,484],{"class":450},[429,495,496],{"class":446}," fetcher",[429,498,474],{"class":450},[429,500,501],{"class":446}," () ",[429,503,504],{"class":450},"=>",[429,506,507],{"class":446}," api",[429,509,457],{"class":450},[429,511,512],{"class":460},"getUser",[429,514,515],{"class":446},"(",[429,517,518],{"class":487},"1",[429,520,521],{"class":446},"))",[429,523,524],{"class":450},";\n",[429,526,528,530,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581],{"class":431,"line":527},3,[429,529,443],{"class":442},[429,531,532],{"class":446}," f2 ",[429,534,451],{"class":450},[429,536,454],{"class":446},[429,538,457],{"class":450},[429,540,461],{"class":460},[429,542,464],{"class":446},[429,544,468],{"class":467},[429,546,471],{"class":446},[429,548,474],{"class":450},[429,550,477],{"class":446},[429,552,481],{"class":480},[429,554,484],{"class":450},[429,556,488],{"class":487},[429,558,491],{"class":446},[429,560,484],{"class":450},[429,562,496],{"class":446},[429,564,474],{"class":450},[429,566,501],{"class":446},[429,568,504],{"class":450},[429,570,507],{"class":446},[429,572,457],{"class":450},[429,574,512],{"class":460},[429,576,515],{"class":446},[429,578,518],{"class":487},[429,580,521],{"class":446},[429,582,524],{"class":450},[429,584,586,588,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639],{"class":431,"line":585},4,[429,587,443],{"class":442},[429,589,590],{"class":446}," f3 ",[429,592,451],{"class":450},[429,594,454],{"class":446},[429,596,457],{"class":450},[429,598,461],{"class":460},[429,600,464],{"class":446},[429,602,468],{"class":467},[429,604,471],{"class":446},[429,606,474],{"class":450},[429,608,477],{"class":446},[429,610,481],{"class":480},[429,612,484],{"class":450},[429,614,488],{"class":487},[429,616,491],{"class":446},[429,618,484],{"class":450},[429,620,496],{"class":446},[429,622,474],{"class":450},[429,624,501],{"class":446},[429,626,504],{"class":450},[429,628,507],{"class":446},[429,630,457],{"class":450},[429,632,512],{"class":460},[429,634,515],{"class":446},[429,636,518],{"class":487},[429,638,521],{"class":446},[429,640,524],{"class":450},[429,642,644],{"class":431,"line":643},5,[429,645,647],{"emptyLinePlaceholder":646},true,"\n",[429,649,651],{"class":431,"line":650},6,[429,652,653],{"class":435},"// f1, f2, f3 are the same Future: one network call, three waiters\n",[429,655,657,659,662,664,668,671,673,676,679,681,684,686,689],{"class":431,"line":656},7,[429,658,443],{"class":442},[429,660,661],{"class":446}," results ",[429,663,451],{"class":450},[429,665,667],{"class":666},"s7zQu"," await",[429,669,670],{"class":467}," Future",[429,672,457],{"class":450},[429,674,675],{"class":460},"wait",[429,677,678],{"class":446},"([f1",[429,680,484],{"class":450},[429,682,683],{"class":446}," f2",[429,685,484],{"class":450},[429,687,688],{"class":446}," f3])",[429,690,524],{"class":450},[429,692,694],{"class":431,"line":693},8,[429,695,696],{"class":435},"// results = [alice, alice, alice]\n",[353,698,699,700,702],{},"The same applies to ",[365,701,406],{}," subscribers:",[357,704,706],{"className":422,"code":705,"filename":424,"language":425,"meta":363,"style":363},"// Mounted simultaneously on the same page\nfinal stream1 = client.watchQuery\u003CUser>(key: ['users', 1], fetcher: () => api.getUser(1));\nfinal stream2 = client.watchQuery\u003CUser>(key: ['users', 1], fetcher: () => api.getUser(1));\n\n// One fetch fires; both streams emit the same Loading → Success sequence\n",[365,707,708,713,770,827,831],{"__ignoreMap":363},[429,709,710],{"class":431,"line":432},[429,711,712],{"class":435},"// Mounted simultaneously on the same page\n",[429,714,715,717,720,722,724,726,728,730,732,734,736,738,740,742,744,746,748,750,752,754,756,758,760,762,764,766,768],{"class":431,"line":439},[429,716,443],{"class":442},[429,718,719],{"class":446}," stream1 ",[429,721,451],{"class":450},[429,723,454],{"class":446},[429,725,457],{"class":450},[429,727,406],{"class":460},[429,729,464],{"class":446},[429,731,468],{"class":467},[429,733,471],{"class":446},[429,735,474],{"class":450},[429,737,477],{"class":446},[429,739,481],{"class":480},[429,741,484],{"class":450},[429,743,488],{"class":487},[429,745,491],{"class":446},[429,747,484],{"class":450},[429,749,496],{"class":446},[429,751,474],{"class":450},[429,753,501],{"class":446},[429,755,504],{"class":450},[429,757,507],{"class":446},[429,759,457],{"class":450},[429,761,512],{"class":460},[429,763,515],{"class":446},[429,765,518],{"class":487},[429,767,521],{"class":446},[429,769,524],{"class":450},[429,771,772,774,777,779,781,783,785,787,789,791,793,795,797,799,801,803,805,807,809,811,813,815,817,819,821,823,825],{"class":431,"line":527},[429,773,443],{"class":442},[429,775,776],{"class":446}," stream2 ",[429,778,451],{"class":450},[429,780,454],{"class":446},[429,782,457],{"class":450},[429,784,406],{"class":460},[429,786,464],{"class":446},[429,788,468],{"class":467},[429,790,471],{"class":446},[429,792,474],{"class":450},[429,794,477],{"class":446},[429,796,481],{"class":480},[429,798,484],{"class":450},[429,800,488],{"class":487},[429,802,491],{"class":446},[429,804,484],{"class":450},[429,806,496],{"class":446},[429,808,474],{"class":450},[429,810,501],{"class":446},[429,812,504],{"class":450},[429,814,507],{"class":446},[429,816,457],{"class":450},[429,818,512],{"class":460},[429,820,515],{"class":446},[429,822,518],{"class":487},[429,824,521],{"class":446},[429,826,524],{"class":450},[429,828,829],{"class":431,"line":585},[429,830,647],{"emptyLinePlaceholder":646},[429,832,833],{"class":431,"line":643},[429,834,835],{"class":435},"// One fetch fires; both streams emit the same Loading → Success sequence\n",[371,837],{},[348,839,841],{"id":840},"deduplication-scope","Deduplication Scope",[353,843,844,845,847],{},"Deduplication applies within a single ",[365,846,202],{}," instance. A single shared client per application (or DI scope) provides full deduplication coverage across all widgets and services.",[357,849,851],{"className":422,"code":850,"filename":424,"language":425,"meta":363,"style":363},"// Good: One shared client: full deduplication\nfinal client = QoraClient();\n\nclass UserRepository {\n  UserRepository(this._client);   // injected\n  final QoraClient _client;\n}\n\nclass PostRepository {\n  PostRepository(this._client);   // same instance\n  final QoraClient _client;\n}\n",[365,852,853,858,875,879,890,909,921,926,930,940,957,968],{"__ignoreMap":363},[429,854,855],{"class":431,"line":432},[429,856,857],{"class":435},"// Good: One shared client: full deduplication\n",[429,859,860,862,865,867,870,873],{"class":431,"line":439},[429,861,443],{"class":442},[429,863,864],{"class":446}," client ",[429,866,451],{"class":450},[429,868,869],{"class":467}," QoraClient",[429,871,872],{"class":446},"()",[429,874,524],{"class":450},[429,876,877],{"class":431,"line":527},[429,878,647],{"emptyLinePlaceholder":646},[429,880,881,884,887],{"class":431,"line":585},[429,882,883],{"class":450},"class",[429,885,886],{"class":467}," UserRepository",[429,888,889],{"class":446}," {\n",[429,891,892,895,898,900,903,906],{"class":431,"line":643},[429,893,894],{"class":467},"  UserRepository",[429,896,897],{"class":446},"(this",[429,899,457],{"class":450},[429,901,902],{"class":446},"_client)",[429,904,905],{"class":450},";",[429,907,908],{"class":435},"   // injected\n",[429,910,911,914,916,919],{"class":431,"line":650},[429,912,913],{"class":442},"  final",[429,915,869],{"class":467},[429,917,918],{"class":446}," _client",[429,920,524],{"class":450},[429,922,923],{"class":431,"line":656},[429,924,925],{"class":446},"}\n",[429,927,928],{"class":431,"line":693},[429,929,647],{"emptyLinePlaceholder":646},[429,931,933,935,938],{"class":431,"line":932},9,[429,934,883],{"class":450},[429,936,937],{"class":467}," PostRepository",[429,939,889],{"class":446},[429,941,943,946,948,950,952,954],{"class":431,"line":942},10,[429,944,945],{"class":467},"  PostRepository",[429,947,897],{"class":446},[429,949,457],{"class":450},[429,951,902],{"class":446},[429,953,905],{"class":450},[429,955,956],{"class":435},"   // same instance\n",[429,958,960,962,964,966],{"class":431,"line":959},11,[429,961,913],{"class":442},[429,963,869],{"class":467},[429,965,918],{"class":446},[429,967,524],{"class":450},[429,969,971],{"class":431,"line":970},12,[429,972,925],{"class":446},[357,974,976],{"className":422,"code":975,"filename":424,"language":425,"meta":363,"style":363},"// Bad: Two separate clients: no deduplication between them\nfinal clientA = QoraClient();\nfinal clientB = QoraClient(); // different cache, different pending map\n",[365,977,978,983,998],{"__ignoreMap":363},[429,979,980],{"class":431,"line":432},[429,981,982],{"class":435},"// Bad: Two separate clients: no deduplication between them\n",[429,984,985,987,990,992,994,996],{"class":431,"line":439},[429,986,443],{"class":442},[429,988,989],{"class":446}," clientA ",[429,991,451],{"class":450},[429,993,869],{"class":467},[429,995,872],{"class":446},[429,997,524],{"class":450},[429,999,1000,1002,1005,1007,1009,1011,1013],{"class":431,"line":527},[429,1001,443],{"class":442},[429,1003,1004],{"class":446}," clientB ",[429,1006,451],{"class":450},[429,1008,869],{"class":467},[429,1010,872],{"class":446},[429,1012,905],{"class":450},[429,1014,1015],{"class":435}," // different cache, different pending map\n",[371,1017],{},[348,1019,1021],{"id":1020},"interaction-with-retries","Interaction with Retries",[353,1023,1024,1025,1028],{},"Deduplication and retry compose correctly. If the in-flight request fails, all waiters receive the same ",[365,1026,1027],{},"Failure"," state after all retry attempts are exhausted:",[357,1030,1033],{"className":1031,"code":1032,"language":362,"meta":363},[360],"fetchQuery called by A, B, C (deduplicated to 1 request)\n  ↓ attempt 1 → fails\n  ↓ wait 1 s\n  ↓ attempt 2 → fails\n  ↓ wait 2 s\n  ↓ attempt 3 → fails\n  ↓ Failure stored in cache\n  A, B, C all receive Failure\n",[365,1034,1032],{"__ignoreMap":363},[371,1036],{},[348,1038,1040],{"id":1039},"when-deduplication-does-not-apply","When Deduplication Does Not Apply",[353,1042,1043],{},"Deduplication merges only requests that are in-flight at the same time. Sequential calls are independent and resolved through the cache:",[357,1045,1047],{"className":422,"code":1046,"filename":424,"language":425,"meta":363,"style":363},"// Sequential: two network calls (each hits SWR or cache independently)\nfinal u1 = await client.fetchQuery\u003CUser>(key: ['users', 1], fetcher: api.getUser);\nfinal u2 = await client.fetchQuery\u003CUser>(key: ['users', 1], fetcher: api.getUser);\n//                                                 ↑ served from cache (staleTime check)\n",[365,1048,1049,1054,1104,1153],{"__ignoreMap":363},[429,1050,1051],{"class":431,"line":432},[429,1052,1053],{"class":435},"// Sequential: two network calls (each hits SWR or cache independently)\n",[429,1055,1056,1058,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1102],{"class":431,"line":439},[429,1057,443],{"class":442},[429,1059,1060],{"class":446}," u1 ",[429,1062,451],{"class":450},[429,1064,667],{"class":666},[429,1066,454],{"class":446},[429,1068,457],{"class":450},[429,1070,461],{"class":460},[429,1072,464],{"class":446},[429,1074,468],{"class":467},[429,1076,471],{"class":446},[429,1078,474],{"class":450},[429,1080,477],{"class":446},[429,1082,481],{"class":480},[429,1084,484],{"class":450},[429,1086,488],{"class":487},[429,1088,491],{"class":446},[429,1090,484],{"class":450},[429,1092,496],{"class":446},[429,1094,474],{"class":450},[429,1096,507],{"class":446},[429,1098,457],{"class":450},[429,1100,1101],{"class":446},"getUser)",[429,1103,524],{"class":450},[429,1105,1106,1108,1111,1113,1115,1117,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151],{"class":431,"line":527},[429,1107,443],{"class":442},[429,1109,1110],{"class":446}," u2 ",[429,1112,451],{"class":450},[429,1114,667],{"class":666},[429,1116,454],{"class":446},[429,1118,457],{"class":450},[429,1120,461],{"class":460},[429,1122,464],{"class":446},[429,1124,468],{"class":467},[429,1126,471],{"class":446},[429,1128,474],{"class":450},[429,1130,477],{"class":446},[429,1132,481],{"class":480},[429,1134,484],{"class":450},[429,1136,488],{"class":487},[429,1138,491],{"class":446},[429,1140,484],{"class":450},[429,1142,496],{"class":446},[429,1144,474],{"class":450},[429,1146,507],{"class":446},[429,1148,457],{"class":450},[429,1150,1101],{"class":446},[429,1152,524],{"class":450},[429,1154,1155],{"class":431,"line":585},[429,1156,1157],{"class":435},"//                                                 ↑ served from cache (staleTime check)\n",[371,1159],{},[348,1161,1163],{"id":1162},"next-steps","Next Steps",[1165,1166,1167,1174,1180,1186],"ul",{},[388,1168,1169,1173],{},[1170,1171,67],"a",{"href":1172},"./caching",": How the cache stores and ages entries",[388,1175,1176,1179],{},[1170,1177,72],{"href":1178},"./stale-while-revalidate",": Background revalidation",[388,1181,1182,1185],{},[1170,1183,82],{"href":1184},"./mutations",": Writes and how they update the cache",[388,1187,1188,1191],{},[1170,1189,1190],{"href":203},"QoraClient API",": Full client reference",[1193,1194,1195],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":363,"searchDepth":439,"depth":439,"links":1197},[1198,1199,1200,1201,1202,1203,1204],{"id":350,"depth":439,"text":351},{"id":375,"depth":439,"text":376},{"id":418,"depth":439,"text":419},{"id":840,"depth":439,"text":841},{"id":1020,"depth":439,"text":1021},{"id":1039,"depth":439,"text":1040},{"id":1162,"depth":439,"text":1163},"Qora merges concurrent requests for the same key into a single network call, regardless of the number of callers.","md",null,{},{"icon":80},{"title":77,"description":1205},"_5isM9NDlcderzgN4CnPcmWUHcC4Okcpr8uOl_mfF6c",[1213,1215],{"title":72,"path":73,"stem":74,"description":1214,"icon":75,"children":-1},"Qora SWR returns cached data immediately and revalidates in the background to keep UIs responsive and data current.",{"title":82,"path":83,"stem":84,"description":1216,"icon":85,"children":-1},"How writes run, in which order their callbacks fire, and the three ways to bring the cache back in line with the server afterwards.",1794040398972]