Wait for subscription confirmation before broadcasting
This commit is contained in:
@ -2,5 +2,25 @@
|
|||||||
|
|
||||||
module ApplicationCable
|
module ApplicationCable
|
||||||
class Channel < ActionCable::Channel::Base
|
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
|
||||||
end
|
end
|
||||||
|
@ -6,11 +6,15 @@ class SynchronizedEditorChannel < ApplicationCable::Channel
|
|||||||
|
|
||||||
# We generate a session_id for the user and send it to the client
|
# We generate a session_id for the user and send it to the client
|
||||||
@session_id = SecureRandom.uuid
|
@session_id = SecureRandom.uuid
|
||||||
connection.transmit identifier: @identifier, message: {action: :session_id, session_id: @session_id}
|
|
||||||
|
|
||||||
message = create_message('connection_change', 'connected')
|
# We need to wait for the subscription to be confirmed before we can send further messages
|
||||||
Event::SynchronizedEditor.create_for_connection_change(message, current_user, programming_group)
|
send_after_streaming_confirmed do
|
||||||
ActionCable.server.broadcast(specific_channel, message)
|
connection.transmit identifier: @identifier, message: {action: :session_id, session_id: @session_id}
|
||||||
|
|
||||||
|
message = create_message('connection_change', 'connected')
|
||||||
|
Event::SynchronizedEditor.create_for_connection_change(message, current_user, programming_group)
|
||||||
|
ActionCable.server.broadcast(specific_channel, message)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def unsubscribed
|
def unsubscribed
|
||||||
|
Reference in New Issue
Block a user