Class: Puppeteer::Bidi::ReactorRunner
- Inherits:
-
Object
- Object
- Puppeteer::Bidi::ReactorRunner
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
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
ensure
@closed = true
end
end
ObjectSpace.define_finalizer(self, Finalizer.new(@queue, @thread))
@ready.pop
end
|
Instance Method Details
#close ⇒ void
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
146
147
148
|
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 146
def closed?
@closed
end
|
#proxyable?(value) ⇒ 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
181
182
183
|
# File 'lib/puppeteer/bidi/reactor_runner.rb', line 181
def runner_thread?
Thread.current == @thread
end
|
#sync { ... } ⇒ 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
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
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
|