Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

MessageChannel

最終更新 Markdown で表示Agent セットアップ

背景

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 には、次の主な制限があります。

  • 現時点ではトランスファーリストはサポートされていません。そのため、ArrayBufferMessagePort などのオブジェクトの所有権を、ポート間で移せません。
  • MessagePort はまだシリアライズできません。そのため、postMessage メソッドや JSRPC 呼び出しで MessagePort オブジェクトを送れません。
  • 'messageerror' イベントは部分的にだけサポートされています。'onmessage' ハンドラーがエラーを投げた場合は 'messageerror' イベントが発生しますが、メッセージデータのシリアライズまたはデシリアライズでエラーが起きても発生しません。その場合、送信側ポートの postMessage 呼び出し時にエラーが投げられます。
  • 一方のポートが閉じられると、両方のポートで 'close' イベントが発生します。ただし、Worker が終了した場合や、いずれかのポートがガベージコレクションされた場合は発生しません。

役に立ちましたか?