Class: Ferrum::Client

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/ferrum/client.rb,
lib/ferrum/client/subscriber.rb,
lib/ferrum/client/web_socket.rb

Defined Under Namespace

Classes: Subscriber, WebSocket

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ws_url, options) ⇒ Client

Returns a new instance of Client.



68
69
70
71
72
73
74
75
76
77
# File 'lib/ferrum/client.rb', line 68

def initialize(ws_url, options)
  @command_id = 0
  @ws_url = ws_url
  @options = options
  @pendings = Concurrent::Hash.new
  @ws = WebSocket.new(ws_url, options.ws_max_receive_size, options.logger)
  @subscriber = Subscriber.new

  start
end

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



66
67
68
# File 'lib/ferrum/client.rb', line 66

def options
  @options
end

#subscriberObject (readonly)

Returns the value of attribute subscriber.



66
67
68
# File 'lib/ferrum/client.rb', line 66

def subscriber
  @subscriber
end

#ws_urlObject (readonly)

Returns the value of attribute ws_url.



66
67
68
# File 'lib/ferrum/client.rb', line 66

def ws_url
  @ws_url
end

Instance Method Details

#build_message(method, params) ⇒ Object



135
136
137
# File 'lib/ferrum/client.rb', line 135

def build_message(method, params)
  { method: method, params: params }.merge(id: next_command_id)
end

#closeObject



120
121
122
123
124
125
126
# File 'lib/ferrum/client.rb', line 120

def close
  @ws.close
  # Give a thread some time to handle a tail of messages
  @pendings.clear
  @thread.kill unless @thread.join(1)
  @subscriber.close
end

#command(method, async: false, **params) ⇒ Object



79
80
81
82
# File 'lib/ferrum/client.rb', line 79

def command(method, async: false, **params)
  message = build_message(method, params)
  send_message(message, async: async)
end

#inspectObject



128
129
130
131
132
133
# File 'lib/ferrum/client.rb', line 128

def inspect
  "#<#{self.class} " \
    "@command_id=#{@command_id.inspect} " \
    "@pendings=#{@pendings.inspect} " \
    "@ws=#{@ws.inspect}>"
end

#off(event, id) ⇒ Object



108
109
110
# File 'lib/ferrum/client.rb', line 108

def off(event, id)
  @subscriber.off(event, id)
end

#on(event, &block) ⇒ Object



104
105
106
# File 'lib/ferrum/client.rb', line 104

def on(event, &block)
  @subscriber.on(event, &block)
end

#send_message(message, async:) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ferrum/client.rb', line 84

def send_message(message, async:)
  if async
    @ws.send_message(message)
    true
  else
    pending = Concurrent::IVar.new
    @pendings[message[:id]] = pending
    @ws.send_message(message)
    data = pending.value!(timeout)
    @pendings.delete(message[:id])

    raise DeadBrowserError if data.nil? && @ws.messages.closed?
    raise TimeoutError unless data

    error, response = data.values_at("error", "result")
    raise_browser_error(error) if error
    response
  end
end

#session(session_id) ⇒ Object



116
117
118
# File 'lib/ferrum/client.rb', line 116

def session(session_id)
  SessionClient.new(self, session_id)
end

#subscribed?(event) ⇒ Boolean

Returns:

  • (Boolean)


112
113
114
# File 'lib/ferrum/client.rb', line 112

def subscribed?(event)
  @subscriber.subscribed?(event)
end