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.



167
168
169
170
171
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 167

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

Instance Method Details

#closeObject



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

def close
  return if @closed

  @queue.close
  @closed = true
end

#closed?Boolean

Returns:

  • (Boolean)


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

def closed?
  @closed
end

#dequeueObject

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



187
188
189
190
191
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 187

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.



175
176
177
178
179
180
181
182
183
184
# File 'lib/react_on_rails_pro/async_props_emitter.rb', line 175

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