Class: LiteCable::Server::ClientSocket::Base

Inherits:
Object
  • Object
show all
Includes:
Logging, Subscriptions
Defined in:
lib/lite_cable/server/client_socket/base.rb

Overview

Wrapper over web socket

Constant Summary

Constants included from Logging

Logging::PREFIX

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Subscriptions

#subscribe, #unsubscribe, #unsubscribe_from_all

Methods included from Logging

logger

Constructor Details

#initialize(env, socket, version) ⇒ Base

Returns a new instance of Base.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/lite_cable/server/client_socket/base.rb', line 13

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

  @open_handlers    = []
  @message_handlers = []
  @close_handlers   = []
  @error_handlers   = []

  @close_on_error = true
end

Instance Attribute Details

#activeObject (readonly)

Returns the value of attribute active.



11
12
13
# File 'lib/lite_cable/server/client_socket/base.rb', line 11

def active
  @active
end

#versionObject (readonly)

Returns the value of attribute version.



11
12
13
# File 'lib/lite_cable/server/client_socket/base.rb', line 11

def version
  @version
end

Instance Method Details

#closeObject

rubocop: enable Metrics/MethodLength



89
90
91
92
93
94
95
96
# File 'lib/lite_cable/server/client_socket/base.rb', line 89

def close
  return unless @active

  @close_handlers.each(&:call)
  close!

  @active = false
end

#closed?Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/lite_cable/server/client_socket/base.rb', line 98

def closed?
  @socket.closed?
end

#listenObject

rubocop: disable Metrics/MethodLength



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/lite_cable/server/client_socket/base.rb', line 65

def listen
  keepalive
  Thread.new do
    Thread.current.abort_on_exception = true
    begin
      @open_handlers.each(&:call)
      each_frame do |data|
        @message_handlers.each do |h|
          begin
            h.call(data)
          rescue => e # rubocop: disable Style/RescueStandardError
            log(:error, "Socket receive failed: #{e}")
            @error_handlers.each { |eh| eh.call(e, data) }
            close if close_on_error
          end
        end
      end
    ensure
      close
    end
  end
end

#onclose(&block) ⇒ Object



56
57
58
# File 'lib/lite_cable/server/client_socket/base.rb', line 56

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

#onerror(&block) ⇒ Object



60
61
62
# File 'lib/lite_cable/server/client_socket/base.rb', line 60

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

#onmessage(&block) ⇒ Object



52
53
54
# File 'lib/lite_cable/server/client_socket/base.rb', line 52

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

#onopen(&block) ⇒ Object



48
49
50
# File 'lib/lite_cable/server/client_socket/base.rb', line 48

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

#prevent_close_on_errorObject



28
29
30
# File 'lib/lite_cable/server/client_socket/base.rb', line 28

def prevent_close_on_error
  @close_on_error = false
end

#requestObject



44
45
46
# File 'lib/lite_cable/server/client_socket/base.rb', line 44

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

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



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/lite_cable/server/client_socket/base.rb', line 32

def transmit(data, type: :text)
  frame = WebSocket::Frame::Outgoing::Server.new(
    version: version,
    data: data,
    type: type
  )
  socket.write frame.to_s
rescue IOError, Errno::EPIPE, Errno::ETIMEDOUT => e
  log(:error, "Socket send failed: #{e}")
  close
end