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

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;
};