12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- "use strict";
- module.exports = addCache;
- function addCache(repo, cache) {
- var loadAs = repo.loadAs;
- if (loadAs) repo.loadAs = loadAsCached;
- var saveAs = repo.saveAs;
- if (saveAs) repo.saveAs = saveAsCached;
- var createTree = repo.createTree;
- if (createTree) repo.createTree = createTreeCached;
- function loadAsCached(type, hash, callback) {
- // Next check in disk cache...
- cache.loadAs(type, hash, onCacheLoad);
- function onCacheLoad(err, value) {
- if (err) return callback(err);
- // ...and return if it's there.
- if (value !== undefined) {
- return callback(null, value, hash);
- }
- // Otherwise load from real data source...
- loadAs.call(repo, type, hash, onLoad);
- }
- function onLoad(err, value) {
- if (value === undefined) return callback(err);
- // Store it on disk too...
- // Force the hash to prevent mismatches.
- cache.saveAs(type, value, onSave, hash);
- function onSave(err) {
- if (err) return callback(err);
- // Finally return the value to caller.
- callback(null, value, hash);
- }
- }
- }
- function saveAsCached(type, value, callback) {
- saveAs.call(repo, type, value, onSave);
- function onSave(err, hash) {
- if (err) return callback(err);
- // Store in disk, forcing hash to match.
- cache.saveAs(type, value, callback, hash);
- }
- }
- function createTreeCached(entries, callback) {
- createTree.call(repo, entries, onTree);
- function onTree(err, hash, tree) {
- if (err) return callback(err);
- cache.saveAs("tree", tree, callback, hash);
- }
- }
- }
|