Class: Playwright::WebSocketTransport

Inherits:
Object
  • Object
show all
Defined in:
lib/playwright/web_socket_transport.rb

Overview

Defined Under Namespace

Classes: AlreadyDisconnectedError

Instance Method Summary collapse

Constructor Details

#initialize(ws_endpoint:, headers: {}) ⇒ WebSocketTransport

Returns a new instance of WebSocketTransport.

Parameters:

  • ws_endpoint (String)

    EndpointURL of WebSocket



9
10
11
12
13
# File 'lib/playwright/web_socket_transport.rb', line 9

def initialize(ws_endpoint:, headers: {})
  @ws_endpoint = ws_endpoint
  @headers = headers
  @debug = ENV['DEBUG'].to_s == 'true' || ENV['DEBUG'].to_s == '1'
end

Instance Method Details

#async_runObject

Note:

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

Start playwright-cli run-driver



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/playwright/web_socket_transport.rb', line 63

def async_run
  ws = WebSocketClient.new(
    url: @ws_endpoint,
    max_payload_size: 256 * 1024 * 1024, # 256MB
    headers: @headers,
  )
  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_close do |reason, code|
    puts "[WebSocketTransport] closed with code: #{code}, reason: #{reason}"
    @on_driver_closed&.call(reason, code)
  end
  @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_closed(&block) ⇒ Object



19
20
21
# File 'lib/playwright/web_socket_transport.rb', line 19

def on_driver_closed(&block)
  @on_driver_closed = block
end

#on_driver_crashed(&block) ⇒ Object



23
24
25
# File 'lib/playwright/web_socket_transport.rb', line 23

def on_driver_crashed(&block)
  @on_driver_crashed = block
end

#on_message_received(&block) ⇒ Object



15
16
17
# File 'lib/playwright/web_socket_transport.rb', line 15

def on_message_received(&block)
  @on_message = block
end

#send_message(message) ⇒ Object

Parameters:

  • message (Hash)


30
31
32
33
34
35
36
37
# File 'lib/playwright/web_socket_transport.rb', line 30

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

#stopObject

Terminate playwright-cli driver.



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

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!(2)
end