forked from chethiya/scheduler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
base.coffee
86 lines (73 loc) · 1.61 KB
/
base.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Base = require './weya/base'
class SchedulerBase extends Base
@extend()
@initialize (@id, @options, @handler, @timezone, @files, @isDone) ->
@type = @options.type
@timeOffset = (new Date()).getTimezoneOffset() * 60 * 1000 + @timezone
@opt = @options.options
@_parseOptions?()
@running = off
@last = @gap = @key = null
Time = new Date().getTime()
next = @nextTime Time
if next?
times = @files.read @id
if times?
@last = times.last
@gap = times.gap
@key = times.key
k = @_key()
if @key isnt k
@last = @lastTime Time
@gap = next - @last
@key = k
else
@last = @lastTime Time
@gap = next - @last
if not @key?
@key = @_key()
_key: ->
throw new Error 'Sheduler::_key() is not implemented'
_nextTime: ->
throw new Error 'Sheduler::_nextTime() is not implemented'
_lastTime: ->
throw new Error 'Sheduler::_lastTime() is not implemented'
nextTime: (Time) ->
res = (@_nextTime Time + @timeOffset)
if res?
return res - @timeOffset
else
return null
lastTime: (Time) ->
res = (@_lastTime Time + @timeOffset)
if res?
return res - @timeOffset
else
return null
update: (Time) ->
next = @nextTime Time
if next?
@last = @lastTime Time
@gap = next - @last
return
@listen 'check', (Time) ->
if @running is on
return
if Time - @last >= @gap
@running = on
@update Time
done = =>
o =
last: @last
gap: @gap
key: @key
@files.write @id, o
@running = off
exe = =>
if @isDone
@handler done
else
@handler()
done()
setTimeout exe, 0
module.exports = SchedulerBase