Skip to content

Instantly share code, notes, and snippets.

@pwFoo
Forked from Jonarod/Service_Workers_Messaging.md
Created October 22, 2023 12:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pwFoo/371d5e57fdd75329171578921ce26319 to your computer and use it in GitHub Desktop.
Save pwFoo/371d5e57fdd75329171578921ce26319 to your computer and use it in GitHub Desktop.
Describes how to send messages between a page's main thread and a service worker thread

Page to ServiceWorker

// in page.html
navigator.serviceWorker.controller.postMessage({'hello':'world'});
// in sw.js
self.addEventListener('message', event => { 
  console.log(event.data); // outputs {'hello':'world'}
});

ServiceWorker broadcast to all connected Pages

// in sw.js

this.clients.matchAll().then(clients => {
  clients.forEach(client => {
    client.postMessage('Broadcast to all clients !');
  )}
});
// in page.html

window.addEventListener('message', event => { console.log(event) }, false);

Private communication

// in page.html

const messageChannel = new MessageChannel();

// Listen for messages from service worker
messageChannel.port1.onmessage = (event) => {
  console.log('main thread received a new message', event.data);
}

// Send message to service worker
navigator.serviceWorker.controller.postMessage({message: 'something'}, [messageChannel.port2]);
// in sw.js

// Listen for messages from service worker
this.addEventListener('message', event => {
  console.log('worker received a new message:', event.data)
  
  // Reply to message
  event.ports[0].postMessage('private msg back');
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment