コンテンツにスキップ

rigor-actioncable

ActionCableのブロードキャスト呼び出し箇所を、静的に発見したチャネルインデックスに対して検証します。<X>Channel.broadcast_to(record, data)はチャネルクラスが存在することをチェックし、ActionCable.server.broadcast("stream_name", data)はリテラルのストリーム名がいずれかのチャネルでstream_fromによって登録されていたことをチェックします。ソースのみを読み、actioncableのランタイム依存はありません。

このプラグインはrigortypeにバンドルされて提供されます。plugins:の下で有効化します:

plugins:
- rigor-actioncable
app/channels/chat_channel.rb
class ChatChannel < ApplicationCable::Channel
def subscribed
stream_from "chat_room_5"
end
end
ChatChannel.broadcast_to(room, message: "hi") # info: channel exists
ActionCable.server.broadcast("chat_room_5", body: "hi") # info: registered stream
ChartChannel.broadcast_to(room, message: "hi") # error: no channel (did you mean ChatChannel?)
ActionCable.server.broadcast("chat_room_42", body: "hi") # warning: no such stream registration
ルール重大度発火するとき
plugin.actioncable.broadcast-targetinfo<X>Channel.broadcast_to(...)が発見されたチャネルにマッチした
plugin.actioncable.broadcast-streaminfoActionCable.server.broadcast("...", ...)が登録済みのstream_fromリテラルにマッチした
plugin.actioncable.unknown-channelerrorレシーバーがChannelで終わるがインデックスにない(「もしかして」付き)
plugin.actioncable.unknown-streamwarningリテラルのストリーム名がどのstream_from登録にもマッチしなかった(「もしかして」付き)
plugin.actioncable.load-errorwarningチャネルの発見に失敗した(パース/読み取りエラー)── ファイルごとに1回

unknown-streamチェックは、発見されたいずれかのチャネルが動的ストリーム(stream_from interpolated_stringまたはstream_for record)を登録している場合は抑制されます ── リテラルのマッチが存在しないことは、そのストリームが無効である証明にはならないためです。Channel以外のレシーバーや、リテラルでないストリーム引数は、何も言わずに素通りします。

plugins:
- gem: rigor-actioncable
config:
channel_search_paths: ["app/channels"] # default
channel_base_classes: ["ApplicationCable::Channel", "ActionCable::Channel::Base"] # default
  • 直接のスーパークラスのみマッチ。間接的なチェーン(AdminChannel < BaseChannel < ApplicationCable::Channel)には、BaseChannelchannel_base_classesに列挙する必要があります。
  • アクションメソッドはインデックス化されるが、検証はされない。チャネルのアクションはクライアント側でsubscription.perform("action", data)を介して呼び出されます。RigorはJavaScriptを解析しないため、アクションインデックスは情報提供にとどまります。
  • broadcast_toのアリティ(arity)はチェックされない ── 任意のレコード+任意のデータハッシュを受け付けます。
  • 間接的なstream_from(チャネル本体に直接ではなく、ヘルパーメソッド内で登録されたもの)は対象外です。
  • 裸のbroadcast(...)(明示的なActionCable.serverレシーバーを伴わないもの)は、無関係なメソッドでの偽陽性を避けるためにスキップされます。

チャネルの発見器/インデックスと、このプラグインが行使する契約(contract)サーフェスは、プラグインのREADMEにあります。プラグインを書くには、examples/rigor-plugin-authorスキルを参照してください。

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.