homura Docs App | Posts About Login
Ctrl+K

Auto-Await

Phase 17.5 で導入された Auto-Await は、Cloudflare binding 由来の async chain をビルド時に検出し、Workers runtime で必要な待機処理を自動で入れる仕組みです。アプリケーションコードは Ruby らしい同期形で書きます。

Before / After

Before(runtime 境界をアプリが意識していた頃):

post '/users' do
  # runtime 境界に合わせた特別な書き方が必要だった
end

After(Auto-Await):

post '/users' do
  database = Sequel.connect(adapter: :d1, d1: d1)
  result = database[:users].insert(name: 'foo')
  send_email.send(
    to: '...', subject: '...', text: '...'
  )
  'ok'
end

多くのケースで、ファイル先頭の magic comment やユーザー定義のメソッド名リストは不要になりました。推論不能なケース(metaprogramming、Hash 動的アクセスなど)は、明示的な wrapper/helper に切り出して型が見える形にするのが推奨です。

AsyncRegistry

gem 側で「これは async source」を宣言します:

CloudflareWorkers::AsyncRegistry.register_async_source do
  async_class 'Cloudflare::D1Database'
  async_class 'Cloudflare::KVNamespace'
  async_class 'Cloudflare::Email'

  async_accessor :env, :DB, 'Cloudflare::D1Database'
  async_accessor :env, :SEND_EMAIL, 'Cloudflare::Email'

  taint_return 'Sequel', :connect, 'Sequel::D1::Database'
  async_method 'Sequel::Dataset', :all
end

各 gem(homura-runtimesinatra-homurasequel-d1sinatra-inertia)が自身の async source を登録します。プロジェクト固有の登録は lib/homura_async_sources.rb に集約できます。

診断モード

build 時にどの call を async 境界として扱ったかを確認できます:

CLOUDFLARE_WORKERS_AUTO_AWAIT_DEBUG=1 bundle exec homura build

制限とフォールバック

ケース挙動
静的に型が決まる receiver自動処理
同名 sync メソッド(String#sub 等)誤検知なし(origin class で区別)
metaprogramming(env.send(binding_name)推論不能 → helper に切り出す
Hash 動的アクセス(ctx[:mail].send(...)推論不能 → 型が見える local 変数に出す

どうしても runtime 境界を直接扱う必要がある場合の低レベル escape hatch は残っていますが、通常のアプリ docs では使いません。