From d8a09c64e44d3529272b647562f3bb4f7f9120c0 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Wed, 30 Sep 2020 16:50:03 +0100 Subject: [PATCH] (graphcache) - Fix offlineExchange timing after rehydration (#1019) * Add experimental buffer fix for edge cases in Svelte/Preact * Add changeset --- .changeset/ninety-plants-peel.md | 5 +++++ exchanges/graphcache/src/cacheExchange.ts | 14 ++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .changeset/ninety-plants-peel.md diff --git a/.changeset/ninety-plants-peel.md b/.changeset/ninety-plants-peel.md new file mode 100644 index 0000000000..37b434b044 --- /dev/null +++ b/.changeset/ninety-plants-peel.md @@ -0,0 +1,5 @@ +--- +'@urql/exchange-graphcache': patch +--- + +Fix a case where the `offlineExchange` would not start processing operations after hydrating persisted data when no operations arrived in time by the time the persisted data was restored. This would be more evident in Preact and Svelte due to their internal short timings. diff --git a/exchanges/graphcache/src/cacheExchange.ts b/exchanges/graphcache/src/cacheExchange.ts index 9c3bc99518..598ea059dc 100644 --- a/exchanges/graphcache/src/cacheExchange.ts +++ b/exchanges/graphcache/src/cacheExchange.ts @@ -11,13 +11,14 @@ import { import { filter, + combine, + scan, map, merge, pipe, share, fromPromise, fromArray, - buffer, take, mergeMap, concat, @@ -249,10 +250,15 @@ export const cacheExchange = (opts?: CacheExchangeOpts): Exchange => ({ // If no hydration takes place we replace this stream with an empty one const bufferedOps$ = hydration ? pipe( - sharedOps$, - buffer(fromPromise(hydration)), + combine( + pipe( + sharedOps$, + scan((acc: Operation[], x) => (acc.push(x), acc), []) + ), + fromPromise(hydration) + ), take(1), - mergeMap(fromArray) + mergeMap(zip => fromArray(zip[0])) ) : (empty as Source);