@valo/cache
Version:
Cache implementation using IndexedDB
187 lines • 7.96 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.CacheService = void 0;
var tslib_1 = require("tslib");
var CacheService = /** @class */ (function () {
function CacheService(dbName, dbVersion, verbose) {
if (dbVersion === void 0) { dbVersion = 1; }
if (verbose === void 0) { verbose = false; }
this.dbName = dbName;
this.dbVersion = dbVersion;
this.verbose = verbose;
this.storeName = "CacheStore";
this.db = null;
this.db = null;
}
/**
* Initialize the database
*/
CacheService.prototype.init = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this;
return tslib_1.__generator(this, function (_a) {
if (this.db) {
return [2 /*return*/, true];
}
return [2 /*return*/, new Promise(function (resolve, reject) {
var request = indexedDB.open(_this.dbName, _this.dbVersion);
request.onerror = reject.bind(null, false);
request.onsuccess = function () {
_this.db = request.result;
resolve(true);
};
request.onupgradeneeded = function (event) {
var db = request.result;
if (db.objectStoreNames.contains(_this.storeName)) {
_this.log("Clearing out version " + event.oldVersion + " cache");
db.deleteObjectStore(_this.storeName);
}
_this.log("Creating version " + event.newVersion + " cache");
db.createObjectStore(_this.storeName);
};
})];
});
});
};
/**
* Retrieve data from the cache
* @param cacheKey
*/
CacheService.prototype.get = function (cacheKey) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this;
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) {
if (!_this.db) {
reject("Database doesn't exist.");
return;
}
var store = _this.db.transaction([_this.storeName]).objectStore(_this.storeName);
var request = store.get(cacheKey);
request.onerror = reject.bind(null, "Error getting cached data " + cacheKey);
request.onsuccess = function (event) {
if (request.result) {
var result = request.result;
var storeObj = JSON.parse(result);
if (new Date(storeObj.expiration) <= new Date()) {
_this.delete(cacheKey);
resolve(undefined);
}
resolve(storeObj.value);
}
else {
reject("Nothing found for " + cacheKey);
}
};
})];
});
});
};
/**
* Add data to the cache
* @param cacheKey
* @param data
* @param expire
*/
CacheService.prototype.put = function (cacheKey, data, expire) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this;
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) {
if (!_this.db) {
reject("Database doesn't exist.");
return;
}
var store = _this.db.transaction([_this.storeName], 'readwrite').objectStore(_this.storeName);
var request = store.put(_this.createPersistable(data, expire), cacheKey);
request.onerror = function (err) {
_this.log("Failed to store data cache: " + err);
resolve(false);
};
request.onsuccess = function (err) {
_this.log("Successfully stored " + cacheKey + " cache data");
resolve(true);
};
})];
});
});
};
/**
* Delete the key from the cache
* @param cacheKey
*/
CacheService.prototype.delete = function (cacheKey) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this;
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) {
if (!_this.db) {
reject("Database doesn't exist.");
return;
}
var store = _this.db.transaction([_this.storeName], 'readwrite').objectStore(_this.storeName);
var request = store.delete(cacheKey);
request.onerror = function (err) {
_this.log("Failed to delete cache: " + err);
reject("Failed to delete cache: " + err);
};
request.onsuccess = function (err) {
_this.log("Successfully stored " + cacheKey + " cache data");
resolve();
};
})];
});
});
};
/**
* Flush the whole cache store
*/
CacheService.prototype.flush = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this;
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) {
if (!_this.db) {
reject("Database doesn't exist.");
return;
}
var store = _this.db.transaction([_this.storeName], 'readwrite').objectStore(_this.storeName);
var request = store.clear();
request.onerror = function (err) {
_this.log("Failed to clear cache: " + err);
reject("Failed to clear cache: " + err);
};
request.onsuccess = function (err) {
_this.log("Successfully cleared cache store");
resolve();
};
})];
});
});
};
/**
* Creates a presistable object for the store
* @param data
* @param expire
*/
CacheService.prototype.createPersistable = function (data, expire) {
if (typeof expire === "undefined") {
// Create expiration date - 1 hour
expire = new Date();
expire.setTime(expire.getTime() + 1 * 3600000);
}
return JSON.stringify({ value: data, expiration: expire });
};
/**
* Logging
* @param message
*/
CacheService.prototype.log = function (message) {
if (this.verbose) {
console.log(message);
}
};
return CacheService;
}());
exports.CacheService = CacheService;
//# sourceMappingURL=CacheService.js.map
;