# frozen_string_literal: true require "fiber" module Rack class Fiber def initialize(app) @app = app end def call(env) async_callback = env.delete("async.callback") EM.next_tick { run_fiber(env, async_callback) } throw :async end protected def run_fiber(env, async_callback) ::Fiber.new { begin async_callback.call(@app.call(env)) rescue ::Exception # rubocop:disable Lint/RescueException async_callback.call([500, {}, [$!.to_s]]) end }.resume end end end