You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.6 KiB
69 lines
1.6 KiB
2 years ago
|
'use strict';
|
||
|
|
||
|
const { Schema } = require('warehouse');
|
||
|
const Promise = require('bluebird');
|
||
|
|
||
|
module.exports = ctx => {
|
||
|
const Cache = new Schema({
|
||
|
_id: {type: String, required: true},
|
||
|
hash: {type: String, default: ''},
|
||
|
modified: {type: Number, default: Date.now() } // UnixTime
|
||
|
});
|
||
|
|
||
|
Cache.static('compareFile', function(id, hashFn, statFn) {
|
||
|
const cache = this.findById(id);
|
||
|
|
||
|
// If cache does not exist, then it must be a new file. We have to get both
|
||
|
// file hash and stats.
|
||
|
if (!cache) {
|
||
|
return Promise.all([hashFn(id), statFn(id)]).spread((hash, stats) => this.insert({
|
||
|
_id: id,
|
||
|
hash,
|
||
|
modified: stats.mtime.getTime()
|
||
|
})).thenReturn({
|
||
|
type: 'create'
|
||
|
});
|
||
|
}
|
||
|
|
||
|
let mtime;
|
||
|
|
||
|
// Get file stats
|
||
|
return statFn(id).then(stats => {
|
||
|
mtime = stats.mtime.getTime();
|
||
|
|
||
|
// Skip the file if the modified time is unchanged
|
||
|
if (cache.modified === mtime) {
|
||
|
return {
|
||
|
type: 'skip'
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// Get file hash
|
||
|
return hashFn(id);
|
||
|
}).then(result => {
|
||
|
// If the result is an object, skip the following steps because it's an
|
||
|
// unchanged file
|
||
|
if (typeof result === 'object') return result;
|
||
|
|
||
|
const hash = result;
|
||
|
|
||
|
// Skip the file if the hash is unchanged
|
||
|
if (cache.hash === hash) {
|
||
|
return {
|
||
|
type: 'skip'
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// Update cache info
|
||
|
cache.hash = hash;
|
||
|
cache.modified = mtime;
|
||
|
|
||
|
return cache.save().thenReturn({
|
||
|
type: 'update'
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
return Cache;
|
||
|
};
|