From 398254f5f5fc6ac6ae90b00fbc64d3ae755aaac6 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 24 Apr 2020 17:57:41 +0100 Subject: [PATCH] Prevent flushed results from clearing non-optimistic results Previously we called clearLayer when clearing an optimistic mutation result batch, which may erase existing mutation result data. This shouldn't be possible but we can account for duplicate mutation results this way and also stop exposing clearLayer. --- exchanges/graphcache/src/cacheExchange.ts | 5 ++--- exchanges/graphcache/src/store/data.test.ts | 4 ++-- exchanges/graphcache/src/store/data.ts | 2 +- exchanges/graphcache/src/store/index.ts | 2 +- exchanges/graphcache/src/store/store.test.ts | 3 ++- exchanges/graphcache/src/test-utils/examples-1.test.ts | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/exchanges/graphcache/src/cacheExchange.ts b/exchanges/graphcache/src/cacheExchange.ts index f439670129..e8eeeef0bc 100644 --- a/exchanges/graphcache/src/cacheExchange.ts +++ b/exchanges/graphcache/src/cacheExchange.ts @@ -26,10 +26,9 @@ import { } from 'wonka'; import { query, write, writeOptimistic } from './operations'; -import { hydrateData, clearLayer } from './store/data'; import { makeDict, isDictEmpty } from './helpers/dict'; import { filterVariables, getMainOperation } from './ast'; -import { Store, noopDataState, reserveLayer } from './store'; +import { Store, noopDataState, hydrateData, reserveLayer } from './store'; import { UpdatesConfig, @@ -404,7 +403,7 @@ export const cacheExchange = (opts?: CacheExchangeOpts): Exchange => ({ } for (let i = 0; i < mutationResultBuffer.length; i++) { - clearLayer(store.data, mutationResultBuffer[i].operation.key); + reserveLayer(store.data, mutationResultBuffer[i].operation.key); } for (const dep in blockedDependencies) { diff --git a/exchanges/graphcache/src/store/data.test.ts b/exchanges/graphcache/src/store/data.test.ts index 68b26b0fe4..c2272c133b 100644 --- a/exchanges/graphcache/src/store/data.test.ts +++ b/exchanges/graphcache/src/store/data.test.ts @@ -87,10 +87,10 @@ describe('garbage collection', () => { expect(InMemoryData.readRecord('Todo:1', 'id')).toBe('1'); - InMemoryData.clearLayer(data, 1); + InMemoryData.reserveLayer(data, 1); InMemoryData.gc(); - expect(InMemoryData.readRecord('Todo:1', 'id')).toBe(undefined); + expect(InMemoryData.readRecord('Todo:1', 'id')).toBe(undefined); expect(InMemoryData.getCurrentDependencies()).toEqual({ 'Query.todo': true, 'Todo:1': true, diff --git a/exchanges/graphcache/src/store/data.ts b/exchanges/graphcache/src/store/data.ts index 49b2501d77..878a65202d 100644 --- a/exchanges/graphcache/src/store/data.ts +++ b/exchanges/graphcache/src/store/data.ts @@ -490,7 +490,7 @@ const createLayer = (data: InMemoryData, layerKey: number) => { }; /** Clears all links and records of an optimistic layer */ -export const clearLayer = (data: InMemoryData, layerKey: number) => { +const clearLayer = (data: InMemoryData, layerKey: number) => { if (data.refLock[layerKey]) { delete data.refLock[layerKey]; delete data.records.optimistic[layerKey]; diff --git a/exchanges/graphcache/src/store/index.ts b/exchanges/graphcache/src/store/index.ts index f7b4b6f557..b88a0625b6 100644 --- a/exchanges/graphcache/src/store/index.ts +++ b/exchanges/graphcache/src/store/index.ts @@ -3,8 +3,8 @@ export { clearDataState, noopDataState, reserveLayer, - clearLayer, getCurrentDependencies, + hydrateData, } from './data'; export * from './keys'; diff --git a/exchanges/graphcache/src/store/store.test.ts b/exchanges/graphcache/src/store/store.test.ts index 01a697d5ae..1e57817800 100644 --- a/exchanges/graphcache/src/store/store.test.ts +++ b/exchanges/graphcache/src/store/store.test.ts @@ -469,7 +469,8 @@ describe('Store with OptimisticMutationConfig', () => { ], }); - InMemoryData.clearLayer(store.data, 1); + InMemoryData.noopDataState(store.data, 1); + ({ data } = query(store, { query: Todos })); expect(data).toEqual({ __typename: 'Query', diff --git a/exchanges/graphcache/src/test-utils/examples-1.test.ts b/exchanges/graphcache/src/test-utils/examples-1.test.ts index 4344cd7099..eb3498f220 100644 --- a/exchanges/graphcache/src/test-utils/examples-1.test.ts +++ b/exchanges/graphcache/src/test-utils/examples-1.test.ts @@ -433,7 +433,7 @@ it('correctly resolves optimistic updates on Relay schemas', () => { write(store, { query: getRoot }, queryData); writeOptimistic(store, { query: updateItem, variables: { id: '2' } }, 1); - InMemoryData.clearLayer(store.data, 1); + InMemoryData.noopDataState(store.data, 1); const queryRes = query(store, { query: getRoot }); expect(queryRes.partial).toBe(false);