diff --git a/packages/service-worker/worker/src/data.ts b/packages/service-worker/worker/src/data.ts index 4d9fdd7242..8ba1f6b372 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 54b313509f..2c990cc3a2 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;