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.



230
231
232
233
234
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 230

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

Instance Method Details

#closeObject



256
257
258
259
260
261
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 256

def close
  return if @closed

  @queue.close
  @closed = true
end

#closed?Boolean

Returns:

  • (Boolean)


263
264
265
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 263

def closed?
  @closed
end

#dequeueObject

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



250
251
252
253
254
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 250

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.



238
239
240
241
242
243
244
245
246
247
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 238

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