Class: Puppeteer::WebSocketTransport
- Inherits:
-
Object
- Object
- Puppeteer::WebSocketTransport
- Defined in:
- lib/puppeteer/web_socket_transport.rb,
sig/_supplementary.rbs
Defined Under Namespace
Classes: ClosedError
Class Method Summary collapse
Instance Method Summary collapse
- #close ⇒ void
- #closed? ⇒ Boolean
- #connect ⇒ Object
- #connected? ⇒ Boolean
-
#initialize(url) ⇒ WebSocketTransport
constructor
A new instance of WebSocketTransport.
- #on_close {|arg0, arg1| ... } ⇒ void
- #on_message {|arg0| ... } ⇒ void
- #receive_loop(connection) ⇒ void
- #send_text(message) ⇒ void
Constructor Details
#initialize(url) ⇒ WebSocketTransport
Returns a new instance of WebSocketTransport.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/puppeteer/web_socket_transport.rb', line 18 def initialize(url) @url = url # Force HTTP/1.1 for WebSocket connections. # Some servers (e.g., Google Cloud Run) advertise HTTP/2 via ALPN but don't # properly support WebSocket over HTTP/2 (RFC 8441), causing stream errors. @endpoint = Async::HTTP::Endpoint.parse(url, alpn_protocols: ["http/1.1"]) @connection = nil @task = nil @closed = false @connected = false @on_message = nil @on_close = nil @connect_promise = nil @write_mutex = Mutex.new end |
Class Method Details
.create(url) ⇒ Puppeteer::WebSocketTransport
12 13 14 15 16 |
# File 'lib/puppeteer/web_socket_transport.rb', line 12 def self.create(url) transport = new(url) transport.connect.wait transport end |
Instance Method Details
#close ⇒ void
This method returns an undefined value.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/puppeteer/web_socket_transport.rb', line 70 def close return if @closed @closed = true begin @connection&.close rescue Async::Stop # Connection already closing; ignore. end @on_close&.call(nil, nil) begin @task&.stop rescue Async::Stop # Task was already stopping; ignore. end rescue IOError, Errno::ECONNRESET, Errno::EPIPE @on_close&.call(nil, nil) end |
#closed? ⇒ Boolean
101 102 103 |
# File 'lib/puppeteer/web_socket_transport.rb', line 101 def closed? @closed end |
#connect ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/puppeteer/web_socket_transport.rb', line 34 def connect return @connect_promise if @connect_promise @connect_promise = Async::Promise.new @task = Async do |task| Async::WebSocket::Client.connect(@endpoint) do |connection| @connection = connection @connected = true @connect_promise.resolve(true) unless @connect_promise.resolved? receive_loop(connection) end rescue Async::Stop # Task was stopped; ignore. rescue => err @connect_promise.reject(err) unless @connect_promise.resolved? close ensure @connected = false end @connect_promise end |
#connected? ⇒ Boolean
97 98 99 |
# File 'lib/puppeteer/web_socket_transport.rb', line 97 def connected? @connected && !@closed end |
#on_close {|arg0, arg1| ... } ⇒ void
This method returns an undefined value.
89 90 91 |
# File 'lib/puppeteer/web_socket_transport.rb', line 89 def on_close(&block) @on_close = block end |
#on_message {|arg0| ... } ⇒ void
This method returns an undefined value.
93 94 95 |
# File 'lib/puppeteer/web_socket_transport.rb', line 93 def (&block) @on_message = block end |
#receive_loop(connection) ⇒ void
This method returns an undefined value.
105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/puppeteer/web_socket_transport.rb', line 105 private def receive_loop(connection) while ( = connection.read) next if .nil? @on_message&.call(.to_str) end rescue Async::Stop # Task stopped; no-op. rescue IOError, Errno::ECONNRESET, Errno::EPIPE # Connection closed; no-op. ensure close unless @closed end |
#send_text(message) ⇒ void
This method returns an undefined value.
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/puppeteer/web_socket_transport.rb', line 58 def send_text() raise ClosedError.new("Transport is closed") if @closed @write_mutex.synchronize do @connection&.write() @connection&.flush end rescue IOError, Errno::ECONNRESET, Errno::EPIPE close raise end |