Add jQuery-compatible Rails example
[upr.git] / lib / upr / monitor.rb
blob2b4732c122ad83a61a5f149e3f12761d20bb9850
1 # -*- encoding: binary -*-
2 module Upr
4   # Keeps track of the status of all currently processing uploads
5   # This uses any {Moneta}[http://github.com/wycats/moneta]
6   # store to monitor upload progress.
7   #
8   # Usage (in config.ru with Moneta::Memory store):
9   #   require 'upr'
10   #   require 'moneta/memory'
11   #   use Upr, :backend => Upr::Monitor.new(Moneta::Memory.new)
12   #   run YourApplication.new
13   class Monitor < Struct.new(:moneta)
14     # nuke anything not read/updated in 60 seconds
15     OPT = { :expires_in => 60 }
17     def initialize(moneta_store = nil)
18       super
19       if moneta_store.nil?
20         require 'moneta/memory' # moneta does not autoload :<
21         self.moneta = Moneta::Memory.new
22       end
23     end
25     def start(upid, length)
26       moneta.store(upid, Status.new(0, length), OPT)
27     end
29     def read(upid)
30       moneta[upid]
31     end
33     def incr(upid, nr)
34       status = moneta[upid] or return
35       status.seen += nr if status.seen >= 0
36       moneta.store(upid, status, OPT)
37     end
39     def finish(upid)
40       status = moneta[upid] or return
41       status.length ||= status.seen
42       status.seen = status.length
43       moneta.store(upid, status, OPT)
44     end
46     def error!(upid)
47       status = moneta[upid] or return
48       status.seen = -1
49       moneta.store(upid, status, OPT)
50     end
52   end
53 end