@ledsun blog

無味の味は佳境に入らざればすなわち知れず

dRuby in the browserのネタ集め

ruby.wasmでRuby in the browserが可能になりました。 次にブラウザとサーバーで通信したいです。 「fetch APIを使って、REST APIなサーバーと通信する」じゃ面白くないですよね。 せっかくのRubyなので、drubyを使って分散Rubyしたいです。

GitHub - ruby/drb: Distributed object system for Ruby です。 ところがdrbがデフォルトでサポートしているトランスポートプロトコルTCPUNIXソケットです。 ブラウザから直接呼べません。

HTTPがサポートされていたら、楽ちんです。 eos-india/misc/drb_http.rb at 4a3f9413461b62b221a812bfdfc42071941b40fa · abhisek/eos-india · GitHub に、それぽいコードがあります。 残念ながら、open_serverメソッドが実装されていません。

ていうかdRubyってサーバーからクライアントにPushしているような気がします。 HTTPで実装できるのでしょうか?

n月刊ラムダノート Vol.2, No.1(2020)(電子書籍のみ) – 技術書出版と販売のラムダノートdRubyとSSE(Server Sent Events)との組み合わせが乗っているようです。 そうですね、SSEを使えばサーバーからPushできます。

読んでみると、dRubyで書き換えたサーバーの情報をブラウザに伝えるためにSSEを使っています。 そうではないのです。 僕がやりたいのは、SSEの上にdRubyを乗せたいのです。

ちょっと視点を変えてみます。 Ruby in the browserには先輩がいます。 Opalです。 youchanさんによるdRuby in the browserがあります。 GitHub - youchan/opal-drb: A dRuby implementation for Opal. とりあずこれをruby.wasmに置き換えるのが、最初の一歩に良さそうです。

トランスポートプロトコルには、WebSocketを使っているようです。 GitHub - youchan/drb-websocket: A druby protocol of WebSocket はfaye-websocketを使っているようです。 もし新しく作り直すならGitHub - socketry/async-websocket: Asynchronous WebSocket client and server, supporting HTTP/1 and HTTP/2 for Ruby. を、使う方がかっこいいかもしれません。