@ledsun blog

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

WebSocket

RubyKaigi 2025で登壇します

rubykaigi.org dRubyがブラウザで動いたら面白いかな?と思って取り組んでいました。 偶然youchanさんと同じテーマでしたので、一緒の枠で発表します。 実装方針は事前に相談していません。 二人で全く違う作戦を立てています。 特に僕は、途中からdRubyその…

wandsをブラウザで実行する環境を作る

自作のwands gemをブラウザで動かす環境を作ります。 wandsはまだブラウザで動きません。 どんな修正が必要か知るためにひとまず動かしてみます。 wasm_drb/examples at main · youchan/wasm_drb · GitHub を参考にして環境をつくります。 bundle init bundl…

DRbWebSocket::DRbMessageを作って捨てた

dRubyをWebSocketに載せるために、dRubyの1つの情報をWebSocketの1つのテキストフレームとして送信する方針で実装してみました。 でも、よく考えたら非効率っぽいのでやめました。 WebSocketのフレームのヘッダーは6バイト dRubyはシンプルなLength-Prefixed…

WebSocketライブラリー: Wandsの誕生

Wandsと言う名前のgemを作りました。WebSocket通信用のライブラリーです。Web and Socketを略してWandsです。 魔法の杖のワンドとも掛けてあります。*1 Rubyにはfaye-websocket-rubyやasync-websocketなどのライブラリーがあります。 これらのライブラリーは…

自作WebSocktライブラリーのテストがGitHub Actionsでだけ失敗する

失敗しているGitHub Actionsです。 https://github.com/ledsun/wands/actions/runs/12547524257/job/34985157639#step:4:48 次のようなエラーが起きています。 /opt/hostedtoolcache/Ruby/3.4.1/x64/lib/ruby/3.4.0/uri/generic.rb:601:in 'URI::Generic#che…

DRb Websocket protocolの準備をする

RubyでWebSocketライブラリ - @ledsun blogで、RubyのWebSocketクラスができました。 これをdRubyに組み込みたいのです。 が、足りないAPIがあります。 例えば https://github.com/ruby/drb/blob/69c2ef531f08a0874908a4306c014b325070e1fe/lib/drb/drb.rb#L…

RubyでWebSocketライブラリ

RubyでWebSocketクライアントを書く その3 - @ledsun blog までの諸諸の調査をまとめます。 このライブラリの目的はdRubyのTCPトランスポートを置き換えるために、TCPSocket、TCPServerのインターフェースに近い形で、WebSocketを扱う事です。 require 'sock…

RubyでWebSocketクライアントを書く その3

RubyでWebSocketクライアントを書く その2 - @ledsun blog でWebSocketコネクションが確立できました。 今回はWebSocketを使ってサーバーとメッセージを送受信します。 #!/usr/bin/env ruby # frozen_string_literal: true require "erb" require "socket" r…

RubyでWebSocketクライアントを書く その2

RubyでWebSocketクライアントを書く - @ledsun blog で、ソケットからレスポンス文字列を読み出すところまで実装しました。 今回はレスポンス文字列に含まれているaccept digestを検証します。 module WANDS class HTTPResponse attr_reader :header def par…

RubyでWebSocketクライアントを書く

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その6 - @ledsun blog でWebSocketサーバーが作れました。 今度はWebSocketクライアントを作成します。 #!/usr/bin/env ruby # frozen_string_literal: true require "erb" require "asy…

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その6

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その5 - @ledsun blog で機能するようになりました。 リファクタリングします。 TCPServerっぽいインターフェースにします。 まずはWebSocketクラス。 確立されたWebSocketコネクション…

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その5

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その4 - @ledsun blog で、HTTPリクエスト文字列、HTTPレスポンス文字列の処理をWEBrickで行うことにしました。 今回はWebSocketのFrameの読み書きをprotocol-websocketを使って行います…

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その4

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その3 - @ledsun blog ではWEBrickを使ってHTTPレスポンス文字列を作成しました。 今度は protocol-websocket を使ってHTTPレスポンス文字列を作成します。 require 'socket' require 'w…

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その3

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その2 - @ledsun blog でリクエスト文字列の解析をWEBrickに置き換えました。 今度はレスポンス文字列の作成にWEBrick::HTTPResponseを使います。 require 'socket' require 'webrick' r…

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その2

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その1 - @ledsun blog ではaccept_nonceの計算にprotocol-websocketを利用しました。 今度はヘッダの解析に使います。 Async::WebSocket gemの素振り その8 - @ledsun blogでは、HTTPリ…

RubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れる その1

Async::WebSocket gemの素振り その8 - @ledsun blogにてRubyでつくるWebSocketサーバーにprotocol-websocket gemを取り入れると良さそうなことがわかりました。 やってみましょう。 require 'socket' require 'protocol/websocket/headers' server = TCPSer…

Async::WebSocket gemの素振り その8

Async::WebSocket gemの素振り その7 - @ledsun blog で残された最後のAsync::WebSocket依存::Async::WebSocket::Connection.callを取り除きます。 require "protocol/http/body/readable" require 'protocol/websocket/framer' require 'protocol/websocket…

Async::WebSocket gemの素振り その7

Async::WebSocket gemの素振り その6 - @ledsun blogでAsync::HTTP::Body::Hijack.wrapを使うようになりました。 今回はAsync::HTTP::Body::Hijack.wrapを展開します。 require "protocol/http/body/readable" require "protocol/http/body/writable" requir…

Async::WebSocket gemの素振り その6

Async::WebSocket gemの素振り その5 - @ledsun blog で::Async::WebSocket::Response.forが気になりました。 ::Async::WebSocket::Response.forのソースコードです。 def self.for(request, headers = nil, **options, &body) if request.version =~ /http\…

Async::WebSocket gemの素振り その5

Async::WebSocket gemの素振り その4 - @ledsun blog でブロック呼び出しの入れ子が増えてしまったので、再度展開します。 理解しやすくするため、エラー処理も消します。 require 'async/websocket/response' require 'async/websocket/connection' require…

Async::WebSocket gemの素振り その4

Async::WebSocket gemの素振り その3 - @ledsun blog にて、ブロック呼び出しが入れ子になっていたのを解消しました。 次にAsync::WebSocket::Adapters::HTTP.openを展開します。 require 'async/websocket/response' require 'async/websocket/connection' …

Async::WebSocket gemの素振り その3

Async::WebSocket gemの素振り その2 - @ledsun blog でAsync::WebSocketのプリミティブな使い方をしてみたものの、ブロックの動きがイマイチ上手く追えません。 もっとシンプルになるようにWebSocketサーバーを改造します。 require 'async/websocket/adapt…

Async::WebSocket gemの素振り その2

Async::WebSocket gemの使い方がどうにもイメージできません。 Async::WebSocket gemの素振り - @ledsun blog より、もう少しプリミティブな使い方をしてみます。 準備 bundle init bundle add falcon async-websocket サーバー require 'async/websocket/ad…

Ruby in the browserでWebSocketリクエスト送信

RubyでWebSocketサーバー - @ledsun blogで作ったWebSocketサーバーにRuby in the browserからリクエストを送信してみましょう。 <html> <head> <title>WebSocket Client</title> <script src="https://cdn.jsdelivr.net/npm/@ruby/3.3-wasm-wasi@2.6.2-2024-11-03-a/dist/browser.script.iife.js"></script> </head> <body> <script type="text/ruby"> requ…</body></html>

RubyでWebSocketサーバー

RubyでEchoサーバー - @ledsun blog の経験を踏まえまして、改めて RubyでシンプルなWebSocketサーバーをゼロからつくってみたに取りくみます。 TCPサーバーの部分の理解が進みます。 HTTPで使ったTCPコネクションをそのままつかって、送受信データをWebSock…

Async::WebSocket gemの素振り

ruby.wasmからのWebSocket - @ledsun blog では、faye-websocket-rubyを使いました。 このWebSocketサーバーを GitHub - socketry/async-websocket: Asynchronous WebSocket client and server, supporting HTTP/1 and HTTP/2 for Ruby. に変えてみましょう…

ruby.wasmからのWebSocket

WebSocketを使いたい理由 ruby.wasmでdRubyをやりたいです。 dRubyではサーバーとクライアントで双方からリクエストをおくります。 HTTPはクライアントからサーバーへの一方向のリクエストを想定しているので不十分です。 Server Sent Eventsを使う手もあり…