require 'fileutils'

module StackProf
  class Middleware
    def initialize(app, options = {})
      @app       = app
      @options   = options
      @num_reqs  = options[:save_every] || nil

      Middleware.mode     = options[:mode] || :cpu
      Middleware.interval = options[:interval] || 1000
      Middleware.enabled  = options[:enabled]
      Middleware.path     = options[:path] || 'tmp'
      at_exit{ Middleware.save? } if options[:save_at_exit]
    end

    def call(env)
      StackProf.start(mode: Middleware.mode, interval: Middleware.interval) if Middleware.enabled?
      @app.call(env)
    ensure
      if Middleware.enabled?
        StackProf.stop
        if @num_reqs && (@num_reqs-=1) == 0
          @num_reqs = @options[:save_every]
          Middleware.save
        end
      end
    end

    class << self
      attr_accessor :enabled, :mode, :interval, :path
      alias enabled? enabled

      def save
        if results = StackProf.results
          FileUtils.mkdir_p(Middleware.path)
          filename = "stackprof-#{results[:mode]}-#{Process.pid}-#{Time.now.to_i}.dump"
          File.open(File.join(Middleware.path, filename), 'wb') do |f| 
            f.write Marshal.dump(results)
          end
        end
      end

    end
  end
end

require 'fileutils'

module StackProf
  class Middleware
    def initialize(app, options = {})
      @app       = app
      @options   = options
      @num_reqs  = options[:save_every] || nil

      Middleware.mode     = options[:mode] || :cpu
      Middleware.interval = options[:interval] || 1000
      Middleware.enabled  = options[:enabled]
      Middleware.path     = options[:path] || 'tmp'
      at_exit{ Middleware.save? } if options[:save_at_exit]
    end

    def call(env)
      StackProf.start(mode: Middleware.mode, interval: Middleware.interval) if Middleware.enabled?
      @app.call(env)
    ensure
      if Middleware.enabled?
        StackProf.stop
        if @num_reqs && (@num_reqs-=1) == 0
          @num_reqs = @options[:save_every]
          Middleware.save
        end
      end
    end

    class << self
      attr_accessor :enabled, :mode, :interval, :path
      alias enabled? enabled

      def save(filename = nil)
        if results = StackProf.results
          FileUtils.mkdir_p(Middleware.path)
          filename ||= "stackprof-#{results[:mode]}-#{Process.pid}-#{Time.now.to_i}.dump"
          File.open(File.join(Middleware.path, filename), 'wb') do |f|
            f.write Marshal.dump(results)
          end
          filename
        end
      end

    end
  end
end

Allow for passing a specific filename to Middleware.save
Allow for passing a specific filename to Middleware.save

Also return the filename instead of the return value of .open()
This allows for overwritting the same file when calling .save
manually as well as keeping track of the exact file written (using
the return value)
