Class: AnyCable::Rack::Socket

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/anycable/rack/socket.rb

Overview

Socket wrapper

Constant Summary

Constants included from Logging

Logging::PREFIX

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env, socket, version) ⇒ Socket

Returns a new instance of Socket.



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/anycable/rack/socket.rb', line 12

def initialize(env, socket, version)
  log(:debug, "WebSocket version #{version}")
  @env = env
  @socket = socket
  @version = version

  @_open_handlers = []
  @_message_handlers = []
  @_close_handlers = []
  @_error_handlers = []
  @_active = true
end

Instance Attribute Details

#socketObject (readonly)

Returns the value of attribute socket.



10
11
12
# File 'lib/anycable/rack/socket.rb', line 10

def socket
  @socket
end

#versionObject (readonly)

Returns the value of attribute version.



10
11
12
# File 'lib/anycable/rack/socket.rb', line 10

def version
  @version
end

Instance Method Details

#closeObject



78
79
80
81
82
83
84
85
# File 'lib/anycable/rack/socket.rb', line 78

def close
  return unless @_active

  @_close_handlers.each(&:call)
  close!

  @_active = false
end

#closed?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/anycable/rack/socket.rb', line 87

def closed?
  socket.closed?
end

#listenObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/anycable/rack/socket.rb', line 57

def listen
  keepalive
  Thread.new do
    Thread.current.report_on_exception = true
    begin
      @_open_handlers.each(&:call)
      each_frame do |data|
        @_message_handlers.each do |handler|
          handler.call(data)
        rescue => e # rubocop: disable Style/RescueStandardError
          log(:error, "Socket receive failed: #{e}")
          @_error_handlers.each { |eh| eh.call(e, data) }
          close
        end
      end
    ensure
      close
    end
  end
end

#onclose(&block) ⇒ Object



49
50
51
# File 'lib/anycable/rack/socket.rb', line 49

def onclose(&block)
  @_close_handlers << block
end

#onerror(&block) ⇒ Object



53
54
55
# File 'lib/anycable/rack/socket.rb', line 53

def onerror(&block)
  @_error_handlers << block
end

#onmessage(&block) ⇒ Object



45
46
47
# File 'lib/anycable/rack/socket.rb', line 45

def onmessage(&block)
  @_message_handlers << block
end

#onopen(&block) ⇒ Object



41
42
43
# File 'lib/anycable/rack/socket.rb', line 41

def onopen(&block)
  @_open_handlers << block
end

#requestObject



37
38
39
# File 'lib/anycable/rack/socket.rb', line 37

def request
  @request ||= ::Rack::Request.new(@env)
end

#transmit(data, type: :text) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
# File 'lib/anycable/rack/socket.rb', line 25

def transmit(data, type: :text)
  frame = WebSocket::Frame::Outgoing::Server.new(
    version: version,
    data: data,
    type: type
  )
  socket.write(frame.to_s)
rescue Exception => e # rubocop:disable Lint/RescueException
  log(:error, "Socket send failed: #{e}")
  close
end