@ledsun blog

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

ruby.wasmでrequire_relativeしたときのリダイレクトレスポンスの扱い方

require_relativeでリダイレクトレスポンスをサポートしたいと思っています。 たとえば次のようなシナリオです。

  1. require_relative "a" を実行する
  2. fetch('a.rb') を実行する
  3. a.rb にGETリクエストを送る
  4. サーバーから302レスポンスでb.rbが返ってくる
  5. b.rb にGETリクエストを送る
  6. Rubyスクリプトの取得する
  7. Kernel.evalRubyスクリプトを実行する

シーケンス図で次のようになります。

sequenceDiagram
    participant Client
    participant Server

    Client->>Client: require_relative "a"
    Client->>Client: fetch('a.rb') 
    Client->>Server: GET request './a.rb'
    Server->>Client: 302 Response with './b.rb'
    Client->>Server: GET request for './b.rb'
    Server->>Client: Ruby script transfer
    Client->>Client: Kernel.eval Ruby script

4~5のリダイレクトレスポンスに追随してGETリクエストを送る動作はfetch APIがサポートしています。 特に追加で何かする必要はありません。

気にするのは'a.rb'をロードしたつもりが、実際は'b.rb'を読み込んだシチュエーションです。 このあと require_relative "b" を実行したときにRubyスクリプト b.rb を再び実行するかどうかです。

結論としては b.rb を読込済みとし、再び実行しません。 二重読込を防止したいのは、Rubyスクリプトの実体だと考えています。 同じRubyスクリプトを別の名前で require_relaitve したときに、二度実行するのは、ユーザーの意図した動作ではないと考えます。