class Playwright::WebSocketTransport

ref: github.com/microsoft/playwright-python/blob/master/playwright/_impl/_transport.py

Public Class Methods

new(ws_endpoint:) click to toggle source

@param ws_endpoint [String] EndpointURL of WebSocket

# File lib/playwright/web_socket_transport.rb, line 9
def initialize(ws_endpoint:)
  @ws_endpoint = ws_endpoint
  @debug = ENV['DEBUG'].to_s == 'true' || ENV['DEBUG'].to_s == '1'
end

Public Instance Methods

async_run() click to toggle source

Start `playwright-cli run-driver`

@note This method blocks until playwright-cli exited. Consider using Thread or Future.

# File lib/playwright/web_socket_transport.rb, line 58
def async_run
  ws = WebSocketClient.new(
    url: @ws_endpoint,
    max_payload_size: 256 * 1024 * 1024, # 256MB
  )
  promise = Concurrent::Promises.resolvable_future
  ws.on_open do
    promise.fulfill(ws)
  end
  ws.on_error do |error_message|
    promise.reject(WebSocketClient::TransportError.new(error_message))
  end

  # Some messages can be sent just after start, before setting @ws.on_message
  # So set this handler before ws.start.
  ws.on_message do |data|
    handle_on_message(data)
  end

  ws.start
  @ws = promise.value!
  @ws.on_error do |error|
    puts "[WebSocketTransport] error: #{error}"
    @on_driver_crashed&.call
  end
rescue Errno::ECONNREFUSED => err
  raise WebSocketClient::TransportError.new(err)
end
on_driver_crashed(&block) click to toggle source
# File lib/playwright/web_socket_transport.rb, line 18
def on_driver_crashed(&block)
  @on_driver_crashed = block
end
on_message_received(&block) click to toggle source
# File lib/playwright/web_socket_transport.rb, line 14
def on_message_received(&block)
  @on_message = block
end
send_message(message) click to toggle source

@param message [Hash]

# File lib/playwright/web_socket_transport.rb, line 25
def send_message(message)
  debug_send_message(message) if @debug
  msg = JSON.dump(message)

  @ws.send_text(msg)
rescue Errno::EPIPE, IOError
  raise AlreadyDisconnectedError.new('send_message failed')
end
stop() click to toggle source

Terminate playwright-cli driver.

# File lib/playwright/web_socket_transport.rb, line 35
def stop
  return unless @ws

  future = Concurrent::Promises.resolvable_future

  @ws.on_close do
    future.fulfill(nil)
  end

  begin
    @ws.close
  rescue EOFError => err
    # ignore EOLError. The connection is already closed.
    future.fulfill(err)
  end

  # Wait for closed actually.
  future.value!
end

Private Instance Methods

debug_recv_message(message) click to toggle source
# File lib/playwright/web_socket_transport.rb, line 100
def debug_recv_message(message)
  puts "\x1b[33mRECV>\x1b[0m#{message}"
end
debug_send_message(message) click to toggle source
# File lib/playwright/web_socket_transport.rb, line 96
def debug_send_message(message)
  puts "\x1b[33mSEND>\x1b[0m#{message}"
end
handle_on_message(data) click to toggle source
# File lib/playwright/web_socket_transport.rb, line 89
def handle_on_message(data)
  obj = JSON.parse(data)

  debug_recv_message(obj) if @debug
  @on_message&.call(obj)
end