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