Sha256: 20f966e2565cb54c927e6c894b52c03d6ab5771dfcbc095d88aba9fa8ee6b321

Contents?: true

Size: 696 Bytes

Versions: 1

Compression:

Stored size: 696 Bytes

Contents

# frozen_string_literal: true

##
# The middleware wraps every request in a Fiber and implements the custom defer protocol with Iodine.
# Scheduling fibers in a middleware allows the framework to be compatibe with custom Rack middlewares.
#
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
      Iodine.publish(Fiber.current.__get_id, "", Iodine::PubSub::PROCESS) if Fiber.current.__yielded?
    end

    if fiber.alive?
      [:__http_defer__, fiber]
    else
      fiber.__get_result
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rage-rb-0.5.2 lib/rage/fiber_wrapper.rb