-
Notifications
You must be signed in to change notification settings - Fork 154
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Issue #654 working on adding feature fs.watchFile() #748
base: master
Are you sure you want to change the base?
Changes from 1 commit
58a3a30
0d29206
8a8e421
1c7c001
3fd3fb0
3f746b0
babe89c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -207,47 +207,56 @@ function FileSystem(options, callback) { | |
}; | ||
|
||
//Object that uses filenames as keys | ||
const statWatchers = new Map(); | ||
const statWatchers = new Map(); | ||
|
||
this.watchFile = function(filename, options, listener) { | ||
let prevStat, currStat; | ||
this.watchFile = function (filename, options, listener) { | ||
let prevStat, currStat; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should probably call |
||
|
||
if (Path.isNull(filename)) { | ||
throw new Error('Path must be a string without null bytes.'); | ||
} | ||
// Checks to see if there were options passed in and if not, the callback function will be set here | ||
if (typeof options === 'function') { | ||
listener = options; | ||
listener = options; | ||
options = {}; | ||
} | ||
// default 5007ms interval, persistent is not used this project | ||
const interval = options.interval || 5007; | ||
listener = listener || nop; | ||
|
||
// Stores initial prev value to compare | ||
fs.stat(filename, function(err, stats) { | ||
prevStat = stats; | ||
|
||
// Stores interval return values | ||
statWatchers.set(filename, value); | ||
|
||
var value = setInterval(function() { | ||
fs.stat(filename, function(err, stats) { | ||
if(err) { | ||
console.log(err); | ||
} | ||
// Store the current stat | ||
|
||
let intervalValue = statWatchers.get(filename); | ||
|
||
// Checks to see if there's a pre-existing watcher on the file | ||
if (intervalValue === undefined) { | ||
andrewkoung marked this conversation as resolved.
Show resolved
Hide resolved
|
||
// Stores initial prev value to compare | ||
fs.stat(filename, function (err, stats) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There's some kind of timing bug here. You do a Also, this raises the question about the |
||
var value = setInterval(function () { | ||
prevStat = currStat; | ||
|
||
//Conditional check for first run to set initial state for prevStat | ||
if(prevStat === undefined) { | ||
andrewkoung marked this conversation as resolved.
Show resolved
Hide resolved
|
||
prevStat = stats; | ||
} | ||
|
||
currStat = stats; | ||
if(Object.toJSON(prevStat) !== Object.toJSON(currStat)) { | ||
|
||
if (err) { | ||
clearInterval(value); | ||
console.warn('[Filer Error] fs.watchFile encountered an error: ' + err); | ||
andrewkoung marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
if (JSON.stringify(prevStat) !== JSON.stringify(currStat)) { | ||
listener(prevStat, currStat); | ||
} | ||
// Set a new prevStat based on previous | ||
prevStat = currStat; | ||
}); | ||
}, | ||
interval | ||
); | ||
}); | ||
}, | ||
interval | ||
); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Indents here seem wrong, these 3 lines shouldn't all line up. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I thought so too, but I checked the spacings and it looked right, also the linting will fail if I change it. |
||
|
||
// Stores interval return values | ||
statWatchers.set(filename, value); | ||
}); | ||
} | ||
}; | ||
|
||
// Deal with various approaches to node ID creation | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,24 +8,27 @@ describe('fs.watchFile', function() { | |
afterEach(util.cleanup); | ||
|
||
it('should be a function', function() { | ||
var fs = util.fs(); | ||
const fs = util.fs(); | ||
expect(typeof fs.watchFile).to.equal('function'); | ||
}); | ||
|
||
/* | ||
it('should get a change event when writing a file', function(done) { | ||
it('should throw an error if a file path is not defined', function() { | ||
const fs = util.fs(); | ||
|
||
const fn = () => fs.watchFile(undefined); | ||
expect(fn).to.throw(); | ||
}); | ||
|
||
fs.watchFile('/myfile.txt', function(event, filename) { | ||
expect(event).to.equal('change'); | ||
expect(filename).to.equal('/myfile.txt'); | ||
watcher.close(); | ||
done(); | ||
}); | ||
it('prev and curr should be populated', function() { | ||
const fs = util.fs(); | ||
|
||
fs.writeFile('/myfile.txt', 'data', function(error) { | ||
fs.writeFile('/myfile', 'data', function(error) { | ||
if(error) throw error; | ||
}); | ||
|
||
fs.watchFile('/myfile', function(prev, curr) { | ||
expect(prev).to.exist; | ||
expect(curr).to.exist; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's do more than just check if the objects exist. We'd expect them to exist, and also to match what a Some other tests that I can think of:
There are more we could do, but at the very least, we need proof that this is working as expected. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've worked on creating some tests for half the points mentioned, but I'm going to have to figure out the logic to test the ones I haven't covered. |
||
}); | ||
}); | ||
*/ | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry to flip back and forth on this, but I'm not clear what benefit we're gaining from
Map
here over{}
for potential loss in compatibility. Can we switch back to{}
instead?