files/en-us/web/api/client/postmessage/index.md
{{APIRef("Service Worker API")}}{{AvailableInWorkers("service")}}
The postMessage() method of the
{{domxref("Client")}} interface allows a service worker to send a message to a client
(a {{domxref("Window")}}, {{domxref("Worker")}}, or {{domxref("SharedWorker")}}). The
message is received in the message event on
{{domxref("ServiceWorkerContainer", "navigator.serviceWorker")}}.
postMessage(message)
postMessage(message, transfer)
postMessage(message, options)
message
: The message to send to the client. This can be any structured-cloneable type.
[!NOTE] A service worker is not in the same agent cluster as its client, and therefore cannot share memory. {{jsxref("SharedArrayBuffer")}} objects, or buffer views backed by one, cannot be posted across agent clusters. Trying to do so will generate a {{domxref("BroadcastChannel/messageerror_event", "messageerror")}} event containing a
DataCloneError{{domxref("DOMException")}} on the receiving end.
transfer {{optional_inline}}
options {{optional_inline}}
transfer {{optional_inline}}
transfer parameter.None ({{jsxref("undefined")}}).
The code below sends a message from a service worker to a client. The client is fetched using the {{domxref("Clients.get()", "get()")}} method on {{domxref("ServiceWorkerGlobalScope.clients", "clients")}}, which is a global in service worker scope.
addEventListener("fetch", (event) => {
event.waitUntil(
(async () => {
// Exit early if we don't have access to the client.
// Eg, if it's cross-origin.
if (!event.clientId) return;
// Get the client.
const client = await self.clients.get(event.clientId);
// Exit early if we don't get the client.
// Eg, if it closed.
if (!client) return;
// Send a message to the client.
client.postMessage({
msg: "Hey I just got a fetch from you!",
url: event.request.url,
});
})(),
);
});
Receiving that message:
navigator.serviceWorker.addEventListener("message", (event) => {
console.log(event.data.msg, event.data.url);
});
{{Specifications}}
{{Compat}}