Class: Faye::WebSocket

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Publisher
Defined in:
lib/faye/util/web_socket.rb,
lib/faye/util/web_socket/draft75_parser.rb,
lib/faye/util/web_socket/draft76_parser.rb,
lib/faye/util/web_socket/protocol8_parser.rb

Defined Under Namespace

Classes: Draft75Parser, Draft76Parser, Event, Protocol8Parser, Stream

Constant Summary collapse

CONNECTING =
0
OPEN =
1
CLOSING =
2
CLOSED =
3

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Publisher

#add_subscriber, #count_subscribers, #publish_event, #remove_subscriber, #remove_subscribers

Constructor Details

#initialize(request) ⇒ WebSocket

Returns a new instance of WebSocket.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/faye/util/web_socket.rb', line 31

def initialize(request)
  @request  = request
  @callback = @request.env['async.callback']
  @stream   = Stream.new
  @callback.call [200, RackAdapter::TYPE_JSON, @stream]
  
  @url = determine_url
  @ready_state = CONNECTING
  @buffered_amount = 0
  
  @parser = WebSocket.parser(@request).new(self)
  @stream.write(@parser.handshake_response)
  
  @ready_state = OPEN
  
  event = Event.new
  event.init_event('open', false, false)
  dispatch_event(event)
  
  @request.env[Thin::Request::WEBSOCKET_RECEIVE_CALLBACK] = @parser.method(:parse)
end

Instance Attribute Details

#oncloseObject

Returns the value of attribute onclose.



16
17
18
# File 'lib/faye/util/web_socket.rb', line 16

def onclose
  @onclose
end

#onerrorObject

Returns the value of attribute onerror.



16
17
18
# File 'lib/faye/util/web_socket.rb', line 16

def onerror
  @onerror
end

#onmessageObject

Returns the value of attribute onmessage.



16
17
18
# File 'lib/faye/util/web_socket.rb', line 16

def onmessage
  @onmessage
end

#onopenObject

Returns the value of attribute onopen.



16
17
18
# File 'lib/faye/util/web_socket.rb', line 16

def onopen
  @onopen
end

#ready_stateObject (readonly)

Returns the value of attribute ready_state.



15
16
17
# File 'lib/faye/util/web_socket.rb', line 15

def ready_state
  @ready_state
end

#requestObject (readonly)

Returns the value of attribute request.



15
16
17
# File 'lib/faye/util/web_socket.rb', line 15

def request
  @request
end

#urlObject (readonly)

Returns the value of attribute url.



15
16
17
# File 'lib/faye/util/web_socket.rb', line 15

def url
  @url
end

Class Method Details

.parser(request) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/faye/util/web_socket.rb', line 21

def self.parser(request)
  if request.env['HTTP_SEC_WEBSOCKET_VERSION']
    Protocol8Parser
  elsif request.env['HTTP_SEC_WEBSOCKET_KEY1']
    Draft76Parser
  else
    Draft75Parser
  end
end

Instance Method Details

#add_event_listener(type, listener, use_capture) ⇒ Object



68
69
70
# File 'lib/faye/util/web_socket.rb', line 68

def add_event_listener(type, listener, use_capture)
  add_subscriber(type, listener)
end

#close(*args) ⇒ Object



65
66
# File 'lib/faye/util/web_socket.rb', line 65

def close(*args)
end

#dispatch_event(event) ⇒ Object



76
77
78
79
80
81
82
83
# File 'lib/faye/util/web_socket.rb', line 76

def dispatch_event(event)
  event.target = event.current_target = self
  event.event_phase = Event::AT_TARGET
  
  publish_event(event.type, event)
  callback = __send__("on#{ event.type }")
  callback.call(event) if callback
end

#receive(data) ⇒ Object



53
54
55
56
57
58
# File 'lib/faye/util/web_socket.rb', line 53

def receive(data)
  event = Event.new
  event.init_event('message', false, false)
  event.data = Faye.encode(data)
  dispatch_event(event)
end

#remove_event_listener(type, listener, use_capture) ⇒ Object



72
73
74
# File 'lib/faye/util/web_socket.rb', line 72

def remove_event_listener(type, listener, use_capture)
  remove_subscriber(type, listener)
end

#send(data, type = nil, error_type = nil) ⇒ Object



60
61
62
63
# File 'lib/faye/util/web_socket.rb', line 60

def send(data, type = nil, error_type = nil)
  frame = @parser.frame(Faye.encode(data), type, error_type)
  @stream.write(frame) if frame
end