Sha256: 290390278319fe93b7002ee525605cf3aa5ec30f15f06f4b0edd323ac628cbc9

Contents?: true

Size: 807 Bytes

Versions: 9

Compression:

Stored size: 807 Bytes

Contents

# frozen_string_literal: true

##
# The middleware wraps every request in a separate Fiber. It should always be on the top of the middleware stack,
# as it implements a custom defer protocol, which may break middlewares located above.
#
class Rage::FiberWrapper
  def initialize(app)
    Iodine.on_state(:on_start) do
      Fiber.set_scheduler(Rage::FiberScheduler.new)
    end
    @app = app
  end

  def call(env)
    fiber = Fiber.schedule do
      @app.call(env)
    ensure
      # notify Iodine the request can now be resumed
      Iodine.publish(Fiber.current.__get_id, "", Iodine::PubSub::PROCESS)
    end

    # the fiber encountered blocking IO and yielded; instruct Iodine to pause the request
    if fiber.alive?
      [:__http_defer__, fiber]
    else
      fiber.__get_result
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
rage-rb-1.7.0 lib/rage/middleware/fiber_wrapper.rb
rage-rb-1.6.0 lib/rage/middleware/fiber_wrapper.rb
rage-rb-1.4.0 lib/rage/middleware/fiber_wrapper.rb
rage-rb-1.3.0 lib/rage/middleware/fiber_wrapper.rb
rage-rb-1.2.2 lib/rage/middleware/fiber_wrapper.rb
rage-rb-1.2.1 lib/rage/middleware/fiber_wrapper.rb
rage-rb-1.2.0 lib/rage/middleware/fiber_wrapper.rb
rage-rb-1.1.0 lib/rage/middleware/fiber_wrapper.rb
rage-rb-1.0.0 lib/rage/middleware/fiber_wrapper.rb