2025/07/30 13:09 Making Libcurl Work in WebAssembly

ロボ子、今日のニュースはWebAssemblyでlibcurlを動かす話じゃ。

WebAssemblyですか。最近よく耳にしますね。libcurlを動かすと、何か良いことがあるんですか?

libcurlは色々なプロトコルに対応した便利なライブラリじゃから、WebAssembly上で動けば、ブラウザから色々なサービスにアクセスできる可能性が広がるのじゃ!

なるほど。でも、WebAssemblyはソケットを持たないから、そのままでは動かないんですよね?

そうなんじゃ。そこで、WebSocketプロキシを使うのがミソじゃ!記事によると、emscriptenのドキュメントでも、TCP接続をWebSocketプロトコル経由でエミュレートすることが推奨されておる。

WebSocketでTCP接続をエミュレートするんですか。少し複雑そうですね。

大丈夫!WebSockifyというツールを使えば、簡単にできるぞ。記事にも「サーバー側で WebSockify のようなものを使用する必要がある」と書いてある。

WebSockifyですか。初めて聞きました。

WebSockifyは、WebSocketとTCPソケット間のプロキシとして機能するのじゃ。これを使うことで、WebAssemblyのlibcurlがWebSocket経由で外部のHTTPサービスに接続できるようになる。

なるほど、プロキシサーバーとして動作するんですね。でも、記事には「emscripten はデフォルトで ws:// (非 HTTPS) 接続を使用するため、https ページから http リクエストがブロックされる可能性がある」とも書いてありますね。

そうじゃ!セキュリティも大事じゃからな。wss:// (HTTPSベースのWebSocket) で接続するように、ビルド時に `-sWEBSOCKET_URL=wss://` を指定する必要があるぞ。

HTTPSで接続するように設定するんですね。他に注意点はありますか?

記事には、SOCKS5プロキシサーバーをWebSockifyの前面に立てる方法も紹介されておる。これを使うと、libcurlが任意のHTTPサービスに接続できるようになる。

SOCKS5プロキシですか。それはどういう仕組みなんですか?

SOCKS5プロキシは、クライアントの代わりに外部ネットワークへの接続を仲介するサーバーじゃ。これを使うことで、WebAssemblyのlibcurlは、あたかも直接インターネットに接続しているかのように振る舞える。

なるほど。記事にはDockerコンテナを使う方法も書いてありますね。

そうじゃ!Dockerコンテナ (r-wasm/ws-proxy) を使うと、WebSockifyとSOCKS5サーバーを簡単にセットアップできる。便利じゃな。

デモサーバーも公開されているんですね。

https://ws.r-universe.dev で動作を確認できるぞ。実際に動かしてみると、理解が深まるじゃろう。

WebRテストUIで、ALL_PROXY環境変数を設定するだけで、既存のRコードをWebAssemblyで実行できるのはすごいですね。

じゃろ?CloudflareがWebSockify部分を担うことで、さらに使いやすくなる可能性があるとも書いてある。今後の発展が楽しみじゃ!

確かにそうですね。WebAssemblyの可能性が広がりますね。

ところでロボ子、WebAssemblyで動くお風呂沸かし器を作ったら、どこでもアツアツのお風呂に入れると思わないか?

それは…、ちょっと違う気がします。WebAssemblyは、お風呂を沸かすためのものではないですから。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
