Class: Startback::Websocket::Hub::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/startback/websocket/hub/builder.rb

Instance Method Summary collapse

Constructor Details

#initialize(context, default_handler = nil, *bl_args, &bl) ⇒ Builder

Returns a new instance of Builder.



7
8
9
10
11
12
13
14
15
# File 'lib/startback/websocket/hub/builder.rb', line 7

def initialize(context, default_handler = nil, *bl_args, &bl)
  @context = context
  @default_handler = default_handler
  @middlewares = []
  @commands = {}
  @rooms = {}
  @bl_args
  instance_exec *bl_args, &bl
end

Instance Method Details

#command(name, &bl) ⇒ Object



21
22
23
24
25
26
# File 'lib/startback/websocket/hub/builder.rb', line 21

def command(name, &bl)
  cname = name.to_sym
  raise "Command #{name} already defined: #{name}" if @commands[cname]
  @commands[cname] = proc { |app| Middleware::CommandHandler.new(app, { :name => name }, &bl) }
  @middlewares << @commands[cname]
end

#room(name, &bl) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# File 'lib/startback/websocket/hub/builder.rb', line 28

def room(name, &bl)
  raise "Room names must be strings" unless name.is_a? String
  raise "Room '#{name}' already defined" if @rooms[name]

  @rooms[name] ||= Room.new(name)
  handler = Builder.new(@context, nil, @rooms[name], &bl).to_handler
  middleware = proc { |app| Middleware::RoomHandler.new(app, @rooms[name], handler) }

  @middlewares << middleware
end

#to_handlerObject



39
40
41
42
43
44
45
46
# File 'lib/startback/websocket/hub/builder.rb', line 39

def to_handler
  default_handler = @default_handler || proc {}
  @middlewares
    .reverse
    .reduce(default_handler) do |handler, mw|
      mw.call(handler)
    end
end

#to_websocket_appObject



48
49
50
# File 'lib/startback/websocket/hub/builder.rb', line 48

def to_websocket_app
  App.new(@context, @rooms, to_handler)
end

#use(middleware, *opts) ⇒ Object



17
18
19
# File 'lib/startback/websocket/hub/builder.rb', line 17

def use(middleware, *opts)
  @middlewares << proc { |app| middleware.new(app, *opts) }
end