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



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

def initialize(url, transport, delay = 0)
  @url = url
  @last_id = 0
  @callbacks = {}
  @delay = delay

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

  @sessions = {}
  @closed = false
end

Class Method Details

.from_session(session) ⇒ Object



69
70
71
# File 'lib/puppeteer/connection.rb', line 69

def self.from_session(session)
  session.connection
end

Instance Method Details

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



89
90
91
92
93
94
# File 'lib/puppeteer/connection.rb', line 89

def async_send_message(method, params = {})
  id = raw_send(message: { method: method, params: params })
  promise = resolvable_future
  @callbacks[id] = MessageCallback.new(method: method, promise: promise)
  promise
end

#create_session(target_info) ⇒ CDPSession



251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/puppeteer/connection.rb', line 251

def create_session(target_info)
  result = send_message('Target.attachToTarget', targetId: target_info.target_id, flatten: true)
  session_id = result['sessionId']

  # Target.attachedToTarget is often notified after the result of Target.attachToTarget.
  # D, [2020-04-04T23:04:30.736311 #91875] DEBUG -- : RECV << {"id"=>2, "result"=>{"sessionId"=>"DA002F8A95B04710502CB40D8430B95A"}}
  # D, [2020-04-04T23:04:30.736649 #91875] DEBUG -- : RECV << {"method"=>"Target.attachedToTarget", "params"=>{"sessionId"=>"DA002F8A95B04710502CB40D8430B95A", "targetInfo"=>{"targetId"=>"EBAB949A7DE63F12CB94268AD3A9976B", "type"=>"page", "title"=>"about:blank", "url"=>"about:blank", "attached"=>true, "browserContextId"=>"46D23767E9B79DD9E589101121F6DADD"}, "waitingForDebugger"=>false}}
  # So we have to wait for "Target.attachedToTarget" a bit.
  20.times do
    if @sessions[session_id]
      return @sessions[session_id]
    end
    sleep 0.1
  end
end

#disposeObject



244
245
246
247
# File 'lib/puppeteer/connection.rb', line 244

def dispose
  handle_close
  @transport.close
end

#on_close(&block) ⇒ Object



236
237
238
# File 'lib/puppeteer/connection.rb', line 236

def on_close(&block)
  @on_close = block
end

#on_message(&block) ⇒ Object



240
241
242
# File 'lib/puppeteer/connection.rb', line 240

def on_message(&block)
  @on_message = block
end

#raw_send(message:) ⇒ Object



100
101
102
103
104
105
106
# File 'lib/puppeteer/connection.rb', line 100

def raw_send(message:)
  id = generate_id
  payload = JSON.fast_generate(message.compact.merge(id: id))
  @transport.send_text(payload)
  request_debug_printer.handle_payload(payload)
  id
end

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



85
86
87
# File 'lib/puppeteer/connection.rb', line 85

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

#session(session_id) ⇒ ?CDPSession



75
76
77
# File 'lib/puppeteer/connection.rb', line 75

def session(session_id)
  @sessions[session_id]
end

#urlObject



79
80
81
# File 'lib/puppeteer/connection.rb', line 79

def url
  @url
end