Class: Puppeteer::Connection

Inherits:
Object
  • Object
show all
Includes:
DebugPrint, EventCallbackable
Defined in:
lib/puppeteer/connection.rb

Defined Under Namespace

Classes: MessageCallback, ProtocolError, RequestDebugPrinter, ResponseDebugPrinter

Class Method Summary collapse

Instance Method Summary collapse

Methods included from EventCallbackable

#add_event_listener, #emit_event, #observe_first, #on_event, #remove_event_listener

Methods included from DebugPrint

#debug_print, #debug_puts

Constructor Details

#initialize(url, transport, delay = 0) ⇒ Connection

Returns a new instance of Connection.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/puppeteer/connection.rb', line 39

def initialize(url, transport, delay = 0)
  @url = url
  @last_id = 0
  @callbacks = Concurrent::Hash.new
  @delay = delay

  @transport = transport
  @transport.on_message do |data|
    message = JSON.parse(data)
    sleep_before_handling_message(message)
    if should_handle_synchronously?(message)
      handle_message(message)
    else
      async_handle_message(message)
    end
  end
  @transport.on_close do |reason, code|
    handle_close
  end

  @sessions = Concurrent::Hash.new
  @closed = false
  @manually_attached = Set.new
end

Class Method Details

.from_session(session) ⇒ Object



113
114
115
# File 'lib/puppeteer/connection.rb', line 113

def self.from_session(session)
  session.connection
end

Instance Method Details

#async_send_message(method, params = {}) ⇒ Object



133
134
135
136
137
138
139
140
141
142
# File 'lib/puppeteer/connection.rb', line 133

def async_send_message(method, params = {})
  promise = resolvable_future

  generate_id do |id|
    @callbacks[id] = MessageCallback.new(method: method, promise: promise)
    raw_send(id: id, message: { method: method, params: params })
  end

  promise
end

#auto_attached?(target_id) ⇒ Boolean

Returns:

  • (Boolean)


321
322
323
# File 'lib/puppeteer/connection.rb', line 321

def auto_attached?(target_id)
  !@manually_attached.include?(target_id)
end

#closed?Boolean

used only in Browser#connected?

Returns:

  • (Boolean)


65
66
67
# File 'lib/puppeteer/connection.rb', line 65

def closed?
  @closed
end

#create_session(target_info, auto_attach_emulated: false) ⇒ CDPSession

Parameters:

  • targetInfo (Protocol.Target.TargetInfo)

Returns:



327
328
329
330
331
332
333
334
335
# File 'lib/puppeteer/connection.rb', line 327

def create_session(target_info, auto_attach_emulated: false)
  unless auto_attach_emulated
    @manually_attached << target_info.target_id
  end
  result = send_message('Target.attachToTarget', targetId: target_info.target_id, flatten: true)
  session_id = result['sessionId']
  @manually_attached.delete(target_info.target_id)
  @sessions[session_id]
end

#disposeObject



316
317
318
319
# File 'lib/puppeteer/connection.rb', line 316

def dispose
  handle_close
  @transport.close
end

#generate_id(&block) ⇒ Object

package private. not intended to use externally.

“‘usage connection.generate_id do |generated_id|

# play with generated_id

end ““



152
153
154
# File 'lib/puppeteer/connection.rb', line 152

def generate_id(&block)
  block.call(@last_id += 1)
end

#on_close(&block) ⇒ Object



308
309
310
# File 'lib/puppeteer/connection.rb', line 308

def on_close(&block)
  @on_close = block
end

#on_message(&block) ⇒ Object



312
313
314
# File 'lib/puppeteer/connection.rb', line 312

def on_message(&block)
  @on_message = block
end

#raw_send(id:, message:) ⇒ Object

package private. not intended to use externally.



157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/puppeteer/connection.rb', line 157

def raw_send(id:, message:)
  # In original puppeteer (JS) implementation,
  # id is generated here using #generate_id and the id argument is not passed to #raw_send.
  #
  # However with concurrent-ruby, '#handle_message' is sometimes called
  # just soon after @transport.send_text and **before returning the id.**
  #
  # So we have to know the message id in advance before send_text.
  #
  payload = JSON.fast_generate(message.compact.merge(id: id))
  @transport.send_text(payload)
  request_debug_printer.handle_payload(payload)
end

#send_message(method, params = {}) ⇒ Object

Parameters:

  • method (string)
  • params (!Object=) (defaults to: {})


129
130
131
# File 'lib/puppeteer/connection.rb', line 129

def send_message(method, params = {})
  await async_send_message(method, params)
end

#session(session_id) ⇒ ?CDPSession

Parameters:

  • sessionId (string)

Returns:



119
120
121
# File 'lib/puppeteer/connection.rb', line 119

def session(session_id)
  @sessions[session_id]
end

#urlObject



123
124
125
# File 'lib/puppeteer/connection.rb', line 123

def url
  @url
end