Wait for subscription confirmation before broadcasting

This commit is contained in:
Sebastian Serth
2023-09-13 04:17:36 +02:00
parent 44618f6ac4
commit 2c46ad2c25
2 changed files with 28 additions and 4 deletions

View File

@@ -2,5 +2,25 @@
module ApplicationCable
class Channel < ActionCable::Channel::Base
@streaming_confirmation_callback = -> {}
def ensure_confirmation_sent
# Currently, we are required to overwrite this ActionCable method.
# Once called and the subscription confirmation is sent, we call the custom callback.
# See https://github.com/rails/rails/issues/25333.
super
@streaming_confirmation_callback.call if subscription_confirmation_sent?
end
def send_after_streaming_confirmed(&block)
if connection.server.config.pubsub_adapter.to_s == 'ActionCable::SubscriptionAdapter::Async'
# We can send messages immediately if we're using the async adapter.
yield block
else
# We need to wait for the subscription to be confirmed before we can send further messages.
# Otherwise, the client might not be ready to receive them.
@streaming_confirmation_callback = block
end
end
end
end