Class: Vizcore::Server::WebSocketHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/vizcore/server/websocket_handler.rb

Overview

Stateless WebSocket endpoint manager for frame broadcast transport.

Constant Summary collapse

PROTOCOL_VERSION =
"vizcore.frame.v1"
MAX_BUFFERED_FRAME_BYTES =
1_000_000
DROPPABLE_MESSAGE_TYPES =
Set["audio_frame"].freeze

Class Method Summary collapse

Class Method Details

.broadcast(type:, payload:) ⇒ Boolean

Broadcast one typed payload to all active websocket clients.

Parameters:

  • type (String)
  • payload (Hash)

Returns:

  • (Boolean)

    false when websocket backend is unavailable



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/vizcore/server/websocket_handler.rb', line 40

def broadcast(type:, payload:)
  return false unless faye_websocket_class

  message = JSON.generate(protocol: PROTOCOL_VERSION, type: type, payload: payload)

  each_socket do |socket|
    send_message(socket, message, type: type)
  end

  true
end

.call(env) ⇒ Array

Rack endpoint for WebSocket upgrade handling.

Parameters:

  • env (Hash)

Returns:

  • (Array)


21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/vizcore/server/websocket_handler.rb', line 21

def call(env)
  websocket_klass = faye_websocket_class
  return dependency_error_response unless websocket_klass
  return [426, text_headers, ["WebSocket upgrade required"]] unless websocket_klass.websocket?(env)

  socket = websocket_klass.new(env, nil, ping: 15)

  socket.on(:open) { register(socket) }
  socket.on(:close) { unregister(socket) }
  socket.on(:message) { |event| handle_message(socket, event.data) }

  socket.rack_response
end

.clear_message_handlervoid

This method returns an undefined value.

Clear inbound message handler.



92
93
94
# File 'lib/vizcore/server/websocket_handler.rb', line 92

def clear_message_handler
  mutex.synchronize { @message_handler = nil }
end

.connection_countInteger

Returns:

  • (Integer)


67
68
69
# File 'lib/vizcore/server/websocket_handler.rb', line 67

def connection_count
  mutex.synchronize { sockets.size }
end

.dropped_frame_countInteger

Returns:

  • (Integer)


77
78
79
# File 'lib/vizcore/server/websocket_handler.rb', line 77

def dropped_frame_count
  mutex.synchronize { @dropped_frame_count || 0 }
end

.last_errorStandardError?

Returns:

  • (StandardError, nil)


72
73
74
# File 'lib/vizcore/server/websocket_handler.rb', line 72

def last_error
  mutex.synchronize { @last_error }
end

.on_message {|message| ... } ⇒ void

This method returns an undefined value.

Register one inbound message handler for client -> server control messages.

Yield Parameters:

  • message (Hash)


85
86
87
# File 'lib/vizcore/server/websocket_handler.rb', line 85

def on_message(&block)
  mutex.synchronize { @message_handler = block }
end

.send_to(socket, type:, payload:) ⇒ Boolean

Send one typed payload to a single websocket client.

Parameters:

  • socket (#send)
  • type (String)
  • payload (Hash)

Returns:

  • (Boolean)

    false when websocket backend is unavailable



58
59
60
61
62
63
64
# File 'lib/vizcore/server/websocket_handler.rb', line 58

def send_to(socket, type:, payload:)
  return false unless faye_websocket_class

  message = JSON.generate(protocol: PROTOCOL_VERSION, type: type, payload: payload)
  send_message(socket, message, type: type)
  true
end