self.onmessage = function(e) { e.waitUntil(self.clients.matchAll().then(function(clients) { clients.forEach(function(client) { var messageChannel = new MessageChannel(); messageChannel.port1.onmessage = onMessageViaMessagePort.bind(null, messageChannel.port1); client.postMessage(undefined, [messageChannel.port2]); }); })); }; function onMessageViaMessagePort(port, e) { var message = e.data; if ('value' in message) { port.postMessage({ack: 'Acking value: ' + message.value}); } else if ('done' in message) { port.postMessage({done: true}); } }