Search code examples
electronchromiumservice-workerconnection-timeout

Is there a way to create connection timeout to activate a service-worker?


I'm using Electron, which is based on Chromium, to create an offline desktop application.

The application uses a remote site, and we are using a service worker to offline parts of the site. Everything is working great, except for a certain situation that I call the "airplane wifi situation".

Using Charles, I have restricted download bandwidth to 100bytes/s. The connection is sent through webview.loadURL which eventually calls LoadURLWithParams in Chromium. The problem is that it does not fail and then activate the service worker, like no connection at all would. Once the request is sent, it waits forever for the response.

My question is, how do I timeout the request after a certain amount of time and load everything from the service worker as if the user was truly offline?


Solution

  • An alternative to writing this yourself is to use the sw-toolbox library, which provides routing and runtime caching strategies for service workers, along with some built in options for helping with these sorts of advanced use cases. In particular, you'd want to use the networkTimeoutSeconds parameter to configure the amount of time to wait for a response from the network before you fall back to a previously cached response.

    You can use it like the following:

    toolbox.router.get(
      new RegExp('my-api\\.com'),
      toolbox.networkFirst, {
        networkTimeoutSeconds: 10
      }
    );
    

    That would configure a route that matched GET requests with URLs containing my-api.com, and applied a network-first strategy that will automatically fall back to the previously cached response after 10 seconds.