[w3c/ServiceWorker] thoughts on exposing multiple-instances to sites via the DOM (#1185)

Issue #921 is about allowing multiple instances of the same service worker to run at the same time.  It talks a lot about global state issues, etc.  I wanted to make a separate issue for a more focused part of the problem though:

How do we even model multiple instances in the DOM so that sites can understand what is happen?

Right now we have a `ServiceWorker` object that logically represents a version of the SW script.  It also happens to represent the current instances, if it exists, or will auto-spawn that instance if it doesn't exist.  So the script version and instance identity are wrapped up in a single object.  And we're using object identity between ServiceWorker objects instead of ids, so the identity is pretty strongly defined.

I've been trying to brainstorm ideas on how to add multiple instances to the DOM model here without breaking back compat.  Right now it feels like we just have a bunch of bad ideas, unfortunately.

I had an IRC conversation with @jakearchibald about it.  I'm pasting it here (with his permission):

```
10:41 AM <wanderview> btw, I have been thinking more about how to expose
DOM stuff for multi-instances in SW... and I have concluded it sucks and is no good
10:42 AM <wanderview> I'm not sure there is a way to add it in a sensible way
that doesn't break some kind of back compat with current behavior
10:42 AM <wanderview> the ServiceWorker object equality makes this extra hard
10:43 AM <JakeA> As in reg.active == reg.active?
10:43 AM <wanderview> I was more thinking of MessageEvent.source === reg.active
10:44 AM <wanderview> how do we make MessageEvent.source point to the actual
SW that messaged you without breaking those kinds of comparisons
10:44 AM <wanderview> this would be easier if we kept ServiceWorker.id
10:45 AM <JakeA> That assumes that messageEvent.source should point to an exact
instance, and not just represent "an instance of the active worker"
10:45 AM <wanderview> right... I guess I was trying to make postMessage()
from/back-to a service worker "just work" with separate instances
10:46 AM <JakeA> maybe we have to do that… not sure.
10:46 AM <JakeA> If it was opt-in we can break all sorts of rules
10:46 AM <wanderview> I'm sure this will get shot down... but we could add something
like MessageEvent.sourceAsClient and then expose the exact instance as a Client object
10:47 AM <wanderview> (in theory?)
10:50 AM <JakeA> Not a bad idea, but yeah, it comes with that caveat that may be a gotcha
10:51 AM <wanderview> My other idea was to add a ServiceWorker.instanceId... if
instanceId is null then it refers to "any instance of this SW"... that platonic ideal of the
service worker
10:51 AM <wanderview> if instanceId is set then it goes to a specific one
10:52 AM <wanderview> and there is a ServiceWorker.getInstanceList() or
ServiceWorkerRegistration.getInstanceList()
10:52 AM <JakeA> and that would be the case for postmessage?
10:52 AM <JakeA> hmm
10:52 AM <JakeA> I like that less
10:52 AM <wanderview> if the instance goes away it could fall back to the "null" instanceId
behavior
10:53 AM <wanderview> I have many bad ideas
10:53 AM <JakeA> I exclusively have bad ideas
10:53 AM <JakeA> especially with this issue
10:53 AM <JakeA> I guess we shoot for a non-opt-in solution, but I'm not confident
10:53 AM <wanderview> we could also leave everything with ServiceWorker alone... but
then expose Clients API to other globals... and we say if you want to work with multiple
instances use Clients API instead of the ServiceWorker postMessage
10:54 AM <JakeA> thanks for the thoughts on this btw
10:54 AM <wanderview> I like that last one the best, but its the heaviest lift
10:54 AM <wanderview> in terms of implementation, I think
10:54 AM <JakeA> I guess in that case you get messageEvent.clientId?
10:55 AM <wanderview> well, in theory if you get a window.clients.onmessage event its
MessageEvent.source would be the Client that sent it
10:57 AM <JakeA> Hmm, but what if the client goes away and you just want to message
an active service worker in the registration?
10:57 AM <wanderview> well then use the existing ServiceWorker object stuff... that is all
still there
10:57 AM <JakeA> fair, but will you be able to know it was an active service worker that
sent the message?
10:57 AM <wanderview> the Client path would be used if you want multiple-instances
and to coordinate between a window and specific instance
10:58 AM <wanderview> I guess I was thinking the active state would be implicit that
your messaging about things like push events, etc
10:58 AM <wanderview> I mean, the site can include relevent info about the SW in its
message
10:59 AM <wanderview> and I have an issue somewhere to expose Client.type ===
'serviceworker'
11:00 AM <JakeA> yeah, I agree we should too

```

-- 
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/issues/1185

Received on Wednesday, 9 August 2017 15:59:49 UTC