Monday, May 20, 2024
149
rated 0 times [  153] [ 4]  / answers: 1 / hits: 23312  / 9 Years ago, mon, april 20, 2015, 12:00:00

Service Worker seems to automatically stop at some point. This behaviour unintentionally closes the WebSocket connection established on activate.



When and Why does it stop? How can I programmatically disable this unexpected action to keep Service Worker stay running?


More From » service-worker

 Answers
5

What you're seeing is the expected behavior, and it's not likely to change.



Service workers intentionally have very short lifespans. They are born in response to a specific event (install, activate, message, fetch, push, etc.), perform their task, and then die shortly thereafter. The lifespan is normally long enough that multiple events might be handled (i.e. an install might be followed by an activate followed by a fetch) before the worker dies, but it will die eventually. This is why it's very important not to rely on any global state in your scripts, and to bootstrap any state information you need via IndexedDB or the Cache Storage API when your service worker starts up.



Service workers are effectively background processes that get installed whenever you visit certain web pages. If those background processes were allowed to run indefinitely, there's an increased risk of negative impact on battery and performance of your device/computer. To mitigate this risk, your browser will only run those processes when it knows it's necessary, i.e. in response to an event.



A use case for WebSockets is having your client listen for some data from the server. For that use case, the service worker-friendly alternative to using WebSockets is to use the Push Messaging API and have your service worker respond to push events. Note that in the current Chrome implementation, you must show a user-visible notification when handling a push event. The silent push use case is not supported right now.



If instead of listening to data from the server, you were using WebSockets as a way of sending data from your client to your server, there's unfortunately no great service worker-friendly way of doing that. At some point in the future, there may be a way of registering your service worker to be woken up via a periodic/time-based event at which point your could use fetch() to send data to the server, but that's currently not supported in any browsers.



P.S.: Chrome (normally) won't kill a service worker while you have its DevTools interface open, but this is only to ease debugging and is not behavior you should rely on for a real application.


[#67003] Friday, April 17, 2015, 9 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
americar

Total Points: 631
Total Questions: 107
Total Answers: 103

Location: Luxembourg
Member since Tue, Jan 25, 2022
2 Years ago
;