Class: ReactOnRailsPro::PullRequestQueue

Inherits:
Object
  • Object
show all
Defined in:
lib/react_on_rails_pro/async_props_emitter.rb

Overview

Queue of prop names requested by React (pull mode). Wraps Async::Queue with automatic filtering of already-pushed props. dequeue returns nil after the queue is closed (render complete).

Instance Method Summary collapse

Constructor Details

#initialize(pushed_props) ⇒ PullRequestQueue

Returns a new instance of PullRequestQueue.



173
174
175
176
177
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 173

def initialize(pushed_props)
  @queue = Async::Queue.new
  @pushed_props = pushed_props
  @closed = false
end

Instance Method Details

#closeObject



199
200
201
202
203
204
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 199

def close
  return if @closed

  @queue.close
  @closed = true
end

#closed?Boolean

Returns:

  • (Boolean)


206
207
208
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 206

def closed?
  @closed
end

#dequeueObject

Blocks until a prop name is available, or returns nil if closed.



193
194
195
196
197
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 193

def dequeue
  @queue.dequeue
rescue Async::Queue::ClosedError
  nil
end

#enqueue(prop_name) ⇒ Object

Enqueue a propRequest from the Node renderer. Silently drops requests for props that have already been pushed.



181
182
183
184
185
186
187
188
189
190
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 181

def enqueue(prop_name)
  # @pushed_props is mutated by AsyncPropsEmitter#call. In fiber-concurrent
  # code this has a narrow TOCTOU window; duplicate requests are filtered on
  # the TypeScript side via AsyncPropsManager's pullRequested flag.
  return if @closed || @pushed_props.include?(prop_name)

  @queue.enqueue(prop_name)
rescue Async::Queue::ClosedError
  # Queue closed between the @closed guard and enqueue; safe to ignore.
end