Tworzę aplikację opartą o WebsocketRails.
Natknąłem się na problem z subskrypcją kanału. Zależy mi na tym by użytkownik nie mógł uruchomić sobie dwóch przeglądatek i tym samym dwukrotnie wejść na kanał z tego samemgo konta. Nie chcę żeby mógł prowadzić sam ze sobą dialog lub rozgrywkę.
Zdarzenie websocket_rails.subsribe obsługiwane jest przez InternalController#subscribe_to_channel. Gdybym tylko chciał wykonać jakieś czynności przed faktycznym subskrybowaniem kanału to bez problemu mogę w config/events.rb dopisać własną obsługę zdarzenia websocket_rails.subsribe i wykona się ona przed tą systemową a nawet wyśle do klienta zdarzenie.
Jednak w jaki sposób w tej mojej “obsłudze” spowodować wstrzymanie obsługi systemowej?
Może nieco kodu jaśniej pokaże o co chodzi:
# config/events.rb
WebsocketRails::EventMap.describe do
(...)
namespace :websocket_rails do
subscribe :subscribe, 'room#subscribe_to_channel'
end
(...)
end
# app/controllers/room_controller.rb
class RoomController < WebsocketRails::BaseController
(...)
def subscribe_to_channel
@channel = event.data[:channel]
return unless @channel =~ /room-/
# Sprawdzam czy user jest na tym kanale
if _user_inside?
trigger_failure( { :reason => "You are in room" } )
# Tutaj czegoś brakuje
else
connection_store[:"#{@channel}"] = { id: current_user.id, name: current_user.name }
WebsocketRails[@channel].subscribe connection
trigger_success
end
end
(...)
end
A może źle podchodzę do problemu?