angular-cn/packages/service-worker/worker/src
Adrien Vergé d63ecf4c5f fix(service-worker): Don't stay locked in EXISTING_CLIENTS_ONLY if corrupted data (#37453)
**Problem**

After #31109 and #31865, it's still possible to get locked in state
`EXISTING_CLIENTS_ONLY`, without any possibility to get out (even by
pushing new updates on the server).
More specifically, if control doc `/latest` of `ngsw:/:db:control` once
gets a bad value, then the service worker will fail early, and won't be
able to overwrite `/latest` with new, valid values (the ones from future
updates).

For example, once in this state, URL `/ngsw/state` will show:

    NGSW Debug Info:
    Driver state: EXISTING_CLIENTS_ONLY (Degraded due to failed initialization: Invariant violated (initialize): latest hash 8b75… has no known manifest
    Error: Invariant violated (initialize): latest hash 8b75… has no known manifest
        at Driver.<anonymous> (https://my.app/ngsw-worker.js:2302:27)
        at Generator.next (<anonymous>)
        at fulfilled (https://my.app/ngsw-worker.js:175:62))
    Latest manifest hash: 8b75…
    Last update check: 22s971u

... with hash `8b75…` corresponding to no installed version.

**Solution**

Currently, when such a case happens, the service worker [simply fails
with an assertion][1]. Because this failure happens early, and is not
handled, the service worker is not able to update `/latest` to new
installed app versions.

I propose to detect this corrupted case (a `latest` hash that doesn't
match any installed version) a few lines above, so that the service
worker can correctly call its [already existing cleaning code][2].

[1]: https://github.com/angular/angular/blob/3569fdf/packages/service-worker/worker/src/driver.ts#L559-L563
[2]: https://github.com/angular/angular/blob/3569fdf/packages/service-worker/worker/src/driver.ts#L505-L519

This change successfully fixes the problem described above.

Unit test written with the help of George Kalpakas. Thank you!

PR Close #37453
2020-06-08 09:31:34 -07:00
..
adapter.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
api.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
app-version.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
assets.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
data.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
database.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
db-cache.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
debug.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
driver.ts fix(service-worker): Don't stay locked in EXISTING_CLIENTS_ONLY if corrupted data (#37453) 2020-06-08 09:31:34 -07:00
error.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
idle.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
manifest.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
msg.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
service-worker.d.ts build: reformat repo to new clang@1.4.0 (#36613) 2020-04-14 12:08:36 -07:00
sha1.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00