Class: Puppeteer::Bidi::ReactorRunner

Inherits:
Object
  • Object
show all
Defined in:
lib/puppeteer/bidi/reactor_runner.rb,
sig/puppeteer/bidi/reactor_runner.rbs

Overview

Runs a dedicated Async reactor in a background thread and proxies calls into it.

Defined Under Namespace

Classes: Finalizer, Proxy

Instance Method Summary collapse

Constructor Details

#initializeReactorRunner

Returns a new instance of ReactorRunner.



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 91

def initialize
  @queue = Thread::Queue.new
  @ready = Queue.new
  @closed = false
  @thread = Thread.new do
    begin
      Sync do |task|
        @ready << true
        while (job = @queue.pop)
          task.async do
            job.call
          end
        end
      end
    rescue ClosedQueueError
      # Queue closed; exit the reactor loop.
    ensure
      @closed = true
    end
  end

  ObjectSpace.define_finalizer(self, Finalizer.new(@queue, @thread))
  @ready.pop
end

Instance Method Details

#closevoid

This method returns an undefined value.



137
138
139
140
141
142
143
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 137

def close
  return if closed?

  @closed = true
  @queue.close
  @thread.join unless runner_thread?
end

#closed?Boolean

Returns:

  • (Boolean)


146
147
148
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 146

def closed?
  @closed
end

#proxyable?(value) ⇒ Boolean

Parameters:

  • value (Object)

Returns:

  • (Boolean)


185
186
187
188
189
190
191
192
193
194
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 185

def proxyable?(value)
  return false if value.is_a?(Module) || value.is_a?(Class)

  name = value.class.name
  return false unless name&.start_with?("Puppeteer::Bidi")
  return false if name.start_with?("Puppeteer::Bidi::Core")
  return false if value.is_a?(ReactorRunner) || value.is_a?(Proxy)

  true
end

#runner_thread?Boolean

Returns:

  • (Boolean)


181
182
183
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 181

def runner_thread?
  Thread.current == @thread
end

#sync { ... } ⇒ Object

Yields:

Yield Returns:

  • (Object)

Returns:

  • (Object)


118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 118

def sync(&block)
  return block.call if runner_thread?
  raise Error, "ReactorRunner is closed" if closed?

  promise = Async::Promise.new
  job = lambda do
    Async::Promise.fulfill(promise, &block)
  end

  begin
    @queue << job
  rescue ClosedQueueError
    raise Error, "ReactorRunner is closed"
  end

  promise.wait
end

#unwrap(value) ⇒ Object

Parameters:

  • value (Object)

Returns:

  • (Object)


166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 166

def unwrap(value)
  case value
  when Proxy
    value.__getobj__
  when Array
    value.map { |item| unwrap(item) }
  when Hash
    value.transform_values { |item| unwrap(item) }
  else
    value
  end
end

#wrap(value) ⇒ Object

Parameters:

  • value (Object)

Returns:

  • (Object)


152
153
154
155
156
157
158
159
160
161
162
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 152

def wrap(value)
  return value if value.nil? || value.is_a?(Proxy)

  if value.is_a?(Array)
    return value.map { |item| wrap(item) }
  end

  return Proxy.new(self, value) if proxyable?(value)

  value
end