Class: SockJS::Transports::WebSocket

Inherits:
ConsumingTransport show all
Defined in:
lib/sockjs/transports/websocket.rb

Direct Known Subclasses

RawWebSocket

Instance Attribute Summary

Attributes inherited from Endpoint

#connection, #http_origin, #options, #remote_addr

Attributes included from Endpoint::ClassMethods

#method, #prefix

Instance Method Summary collapse

Methods inherited from ConsumingTransport

#closing_frame, #get_session, #messages_frame, #opening_frame, #request_closed

Methods inherited from SockJS::Transport

#exception_response, #handle_session_unavailable, #request_data, #response_beginning, #server_key

Methods inherited from SessionEndpoint

routing_prefix

Methods inherited from Endpoint

#call, #empty_string, #error_content_type, #handle, #handle_http_error, #initialize, #inspect, #response_class, #setup_response

Methods included from Endpoint::ClassMethods

#add_route, #add_routes, #endpoints, #register, #route_conditions, #routing_prefix

Constructor Details

This class inherits a constructor from SockJS::Endpoint

Instance Method Details

#build_error_response(request) ⇒ Object



91
92
93
# File 'lib/sockjs/transports/websocket.rb', line 91

def build_error_response(request)
  response = response_class.new(request)
end

#build_response(request) ⇒ Object



81
82
83
84
85
86
87
88
89
# File 'lib/sockjs/transports/websocket.rb', line 81

def build_response(request)
  SockJS.debug "Upgrading to WebSockets ..."

  web_socket = Faye::WebSocket.new(request.env)

  web_socket.extend(WSDebuggingMixin)

  return web_socket
end

#disabled?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/sockjs/transports/websocket.rb', line 59

def disabled?
  !options[:websocket]
end

#extract_message(event) ⇒ Object



139
140
141
142
# File 'lib/sockjs/transports/websocket.rb', line 139

def extract_message(event)
  SockJS.debug "Received message event: #{event.data.inspect}"
  event.data
end

#finish_response(web_socket) ⇒ Object



134
135
136
137
# File 'lib/sockjs/transports/websocket.rb', line 134

def finish_response(web_socket)
  SockJS.debug "Finishing response"
  web_socket.close
end

#format_frame(response, frame) ⇒ Object



125
126
127
# File 'lib/sockjs/transports/websocket.rb', line 125

def format_frame(response, frame)
  frame.to_s
end

#handle_request(request) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/sockjs/transports/websocket.rb', line 67

def handle_request(request)
  if not @options[:websocket]
    raise HttpError.new(404, "WebSockets Are Disabled")
  elsif request.env["HTTP_UPGRADE"].to_s.downcase != "websocket"
    SockJS.debug("Wrong headers! HTTP_UPGRADE = #{request.env["HTTP_UPGRADE"].to_s}")
    raise HttpError.new(400, 'Can "Upgrade" only to "WebSocket".')
  elsif not ["Upgrade", "keep-alive, Upgrade"].include?(request.env["HTTP_CONNECTION"])
    SockJS.debug("Wrong headers! HTTP_CONNECTION = #{request.env["HTTP_CONNECTION"].to_s}")
    raise HttpError.new(400, '"Connection" must be "Upgrade".')
  end

  super
end

#heartbeat_frame(web_socket) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/sockjs/transports/websocket.rb', line 144

def heartbeat_frame(web_socket)
  @pong = true if @pong.nil?

  #no replay from last connection - susspend session
  if !@pong
    @session.suspend if @session
  end
  @pong = false
  web_socket.ping("ping") do
    SockJS.debug "pong"
    @pong = true
    @session.activate
  end
  super
end

#process_session(session, web_socket) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/sockjs/transports/websocket.rb', line 95

def process_session(session, web_socket)
  #XXX Facade around websocket?
  @session = session
  web_socket.on :open do |event|
    begin
      SockJS.debug "Attaching consumer"
      session.attach_consumer(web_socket, self)
    rescue Object => ex
      SockJS::debug "Error opening (#{event.inspect[0..40]}) websocket: #{ex.inspect}"
    end
  end

  web_socket.on :message do |event|
    begin
      session.receive_message(extract_message(event))
    rescue Object => ex
      SockJS::debug "Error receiving message on websocket (#{event.inspect[0..40]}): #{ex.inspect}"
      web_socket.close
    end
  end

  web_socket.on :close do |event|
    begin
      session.close(1000, "Session finished")
    rescue Object => ex
      SockJS::debug "Error closing websocket (#{event.inspect[0..40]}): #{ex.inspect} \n#{ex.message} \n#{ex.backtrace.join("\n")}"
    end
  end
end

#send_data(web_socket, data) ⇒ Object



129
130
131
132
# File 'lib/sockjs/transports/websocket.rb', line 129

def send_data(web_socket, data)
  web_socket.send(data)
  return data.length
end

#session_key(ws) ⇒ Object



63
64
65
# File 'lib/sockjs/transports/websocket.rb', line 63

def session_key(ws)
  ws.object_id.to_s
end