Re: [w3c/ServiceWorker] Handle asynchronous modules (top-level await). (#1444)

Here's how I think this works: (@littledan: correct me if I'm wrong)

When we run a service worker, we consider it as 'evaluated' and ready to receive events after synchronous execution + microtasks.

# Errors & evaluation

This error will prevent a service worker from installing:

```js
throw Error('…');
```

As will this:

```js
await undefined;

throw Error('…');
```

As will this:

```js
import './foo.js';

// If `./foo.js` is:
throw Error('…');
```

However, this error will not prevent a service worker from installing:

```js
await new Promise(r => setTimeout(r));

throw Error('…');
```

…as the error has happened after 'evaluation'.

# Adding listeners

```js
// This is fine
addEventListener('fetch', func);

// This is fine
await undefined;
addEventListener('fetch', func);

// This throws
await new Promise(r => setTimeout(r));
addEventListener('fetch', func);
```

However, the throw is asynchronous, so it wouldn't prevent install.

# Dispatching events

We consider the service worker ready to receive events once it's evaluated:

```js
addEventListener('fetch', () => {
  console.log('A');
});

await new Promise(r => setTimeout(r, 5000));
console.log('B');
```

The console may log `A` before `B`.

# Concerns

```js
import './third-party-script-v1.js';

addEventListener('install', event => …);
addEventListener('fetch', event => …);
```

The above works as the developer expects. However, later, they update to `'./third-party-script-v2.js'`. This include a top-level await that waits beyond a microtask.

Now, their service worker updates successfully, but their `install` and `fetch` listeners are absent. They'll show as an error in the console, but the developer may miss them.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/ServiceWorker/pull/1444#issuecomment-506655298

Received on Friday, 28 June 2019 08:43:56 UTC