MessageChannel API ↗ は、アプリケーションの異なる部分の間に通信チャネルを作る方法を提供します。
Workers ランタイムは、現時点では単一の Worker インスタンス内での利用に限った、MessageChannel API の最小実装を提供します。つまり、同じ Worker の異なる部分の間では MessageChannel でメッセージを送れますが、異なる Workers 間では送れません。
const { port1, port2 } = new MessageChannel();
port2.onmessage = (event) => {
console.log('Received message:', event.data);
};
port2.postMessage('Hello from port2!');structuredClone(...) API で使える値は、ポート経由で送信できます。
Workers の MessageChannel API には、次の主な制限があります。
- 現時点ではトランスファーリストはサポートされていません。そのため、
ArrayBufferやMessagePortなどのオブジェクトの所有権を、ポート間で移せません。 MessagePortはまだシリアライズできません。そのため、postMessageメソッドや JSRPC 呼び出しでMessagePortオブジェクトを送れません。'messageerror'イベントは部分的にだけサポートされています。'onmessage'ハンドラーがエラーを投げた場合は'messageerror'イベントが発生しますが、メッセージデータのシリアライズまたはデシリアライズでエラーが起きても発生しません。その場合、送信側ポートのpostMessage呼び出し時にエラーが投げられます。- 一方のポートが閉じられると、両方のポートで
'close'イベントが発生します。ただし、Worker が終了した場合や、いずれかのポートがガベージコレクションされた場合は発生しません。