Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 39535
1
###
2
Watch a file for changes
3
4
Watch for changes to the given file. Returns obj, which
5
is an event emitter with events:
6
7
- 'change', ctime - when file changes or is created
8
- 'delete' - when file is deleted
9
10
and a method .close().
11
12
The ctime might be undefined, in case it can't be determined.
13
14
If debounce is given, only fires after the file
15
definitely has not had its ctime changed
16
for at least debounce ms. Does NOT fire when
17
the file first has ctime changed.
18
###
19
20
fs = require('fs')
21
{EventEmitter} = require('events')
22
23
class exports.Watcher extends EventEmitter
24
constructor: (@path, @interval, @debounce) ->
25
fs.watchFile(@path, {interval: @interval, persistent:false}, @_listen)
26
27
close: () =>
28
@removeAllListeners()
29
fs.unwatchFile(@path, @listener)
30
31
_listen: (curr, prev) =>
32
if curr.dev == 0
33
@emit('delete')
34
else
35
if @debounce
36
@_emit_when_stable(true)
37
else
38
fs.stat @path, (err, stats) =>
39
if err
40
@emit('change')
41
else
42
@emit('change', stats.ctime)
43
44
_emit_when_stable: (first) =>
45
###
46
@_emit_when_stable gets called
47
periodically until the last ctime of the file
48
is at least @debounce ms in the past, or there
49
is an error.
50
###
51
if first and @_waiting_for_stable
52
return
53
@_waiting_for_stable = true
54
fs.stat @path, (err, stats) =>
55
if err
56
# maybe file deleted; give up.
57
delete @_waiting_for_stable
58
return
59
elapsed = new Date() - stats.ctime
60
if elapsed < @debounce
61
# File keeps changing - try again soon
62
setTimeout((=>@_emit_when_stable(false)), Math.max(500, @debounce - elapsed + 100))
63
else
64
delete @_waiting_for_stable
65
@emit('change', stats.ctime)
66
67
68