[WebsocketRails] Subskrypcja kanału

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?

1 Like