From a8820d85449dec8232752103bb88b5588bcb41b4 Mon Sep 17 00:00:00 2001 From: Denis Omelkov Date: Thu, 21 Nov 2019 15:41:05 +0500 Subject: [PATCH] fix(service-worker): allow creating post api requests after cache failure Before creating a mutating http request, service-worker invalidates lru cache entry and writes to cache storage. Therefore, cache storage failure can prevent making post requests. Fix this by catching and logging cache error, add a test case. Fixes #33793 --- packages/service-worker/worker/src/data.ts | 10 ++++++++- .../service-worker/worker/test/happy_spec.ts | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/service-worker/worker/src/data.ts b/packages/service-worker/worker/src/data.ts index 4d9fdd724265bb..d77a38b857752f 100644 --- a/packages/service-worker/worker/src/data.ts +++ b/packages/service-worker/worker/src/data.ts @@ -275,7 +275,15 @@ export class DataGroup { return; } const table = await this.lruTable; - return table.write('lru', this._lru !.state); + try { + return table.write('lru', this._lru !.state); + } catch (err) { + // Writing lru cache table failed. This could be a result of a full storage. + // Continue serving clients as usual. + this.debugHandler.log(err, `DataGroup(${this.config.name}@${this.config.version}).syncLru`); + // TODO: Better detect/handle full storage; e.g. using + // [navigator.storage](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorStorage/storage). + } } /** diff --git a/packages/service-worker/worker/test/happy_spec.ts b/packages/service-worker/worker/test/happy_spec.ts index 54b313509f66d4..2c990cc3a26ccc 100644 --- a/packages/service-worker/worker/test/happy_spec.ts +++ b/packages/service-worker/worker/test/happy_spec.ts @@ -1330,6 +1330,27 @@ import {SwTestHarness, SwTestHarnessBuilder} from '../testing/scope'; server.assertSawRequestFor('/api-static/bar'); }); + it('keeps serving mutating api requests when failing to write to cache', + // sw can invalidate LRU cache entry and try to write to cache storage on mutating request + async() => { + // Initialize the SW. + expect(await makeRequest(scope, '/foo.txt')).toEqual('this is foo'); + await driver.initialized; + server.clearRequests(); + + // Make the caches unwritable. + spyOn(MockCache.prototype, 'put').and.throwError('Can\'t touch this'); + spyOn(driver.debugger, 'log'); + expect(await makeRequest(scope, '/api/foo', 'default', { + method: 'post' + })).toEqual('this is api foo'); + expect(driver.state).toBe(DriverReadyState.NORMAL); + // Since we are swallowing an error here, make sure it is at least properly logged + expect(driver.debugger.log) + .toHaveBeenCalledWith(new Error('Can\'t touch this'), 'DataGroup(api@42).syncLru()'); + server.assertSawRequestFor('/api/foo'); + }); + it('enters degraded mode when something goes wrong with the latest version', async() => { await driver.initialized;