Re: [ServiceWorker] ServiceWorkerClient can't be a MessageEvent.source because it's not a WindowProxy or MessagePort (#453)

`ServiceWorkerClient` would be great. Having discussed with @jakearchibald last week, we plan to have `ServiceWorkerClient` object represent both Window client and Worker client. (That is, a `ServiceWorkerClient` object can be used for all the global environments except SW global environment.) And we also would like to avoid passing `MessagePort` objects around as discussed earlier. Having said that, how about the following usage?

```js
// both in Window global and in Worker global
navigator.serviceWorker.getRegistration().then(registration => {
  if (registration.active) {
    registration.active.onmessage = (e) => { console.log(e.data); };
    registration.active.postMessage("Howdy from client.");
  }
});

// in service worker
self.addEventListener("message", (e) => {
  var client = e.source; // e.source is the ServiceWorkerClient object that represents the message sender
  if (client.type == "window" || client.type == "shared worker")
    client.postMessage("Howdy from SW."));
});

// aligned with what authors do with clients gotten from clients.getAll()
self.addEventListener("fetch", (e) => {
  caches.match(e.request).then(response => {
    clients.getAll().then(clients => {
      clients.forEach(client => client.postMessage(response.clone()));
    });
  });
});
```

---
Reply to this email directly or view it on GitHub:
https://github.com/slightlyoff/ServiceWorker/issues/453#issuecomment-66278724

Received on Tuesday, 9 December 2014 12:59:50 UTC