fake-service-worker
Version:
Fake service worker implementation for testing developer edge applications
81 lines • 2.65 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EdgeCache = void 0;
const live_fetch_1 = __importDefault(require("../live_fetch"));
const lru_cache_1 = __importDefault(require("lru-cache"));
const Request_1 = require("./Request");
const MAX_ITEMS = 100000;
class EdgeCache {
cache;
constructor() {
this.cache = new lru_cache_1.default({ max: MAX_ITEMS });
}
getKey(request) {
if (typeof request === 'string')
request = new Request_1.EdgeRequest(request);
return request.url;
}
getTTL(response) {
let ttl = 100; // 100 seconds
let cacheControl = response.headers.get('cache-control');
if (cacheControl !== null) {
cacheControl = cacheControl.split(';').map(val => val.trim());
const maxAge = cacheControl.find(value => value.toLowerCase().includes('max-age'));
if (maxAge !== undefined) {
ttl = parseInt(maxAge.split('=')[1]);
}
}
return ttl;
}
/** Fetches url and caches it */
async add(request) {
let ttl = 100;
if (request instanceof Request) {
ttl = this.getTTL(request);
}
const key = this.getKey(request);
const res = await live_fetch_1.default(key);
this.cache.set(key, res, ttl * 1000);
}
async addAll(requests) {
for (let i = 0; i < requests.length; i++) {
await this.add(requests[i]);
}
}
async delete(request, options) {
const key = this.getKey(request);
if (!this.cache.has(key))
return false;
this.cache.del(key);
return true;
}
async keys(request, options) {
return this.cache.keys().map(key => new Request_1.EdgeRequest(key));
}
async match(request, options) {
const key = this.getKey(request);
return this.cache.get(key);
}
/** Basically match but returns array. -_-*/
async matchAll(request, options) {
if (request) {
const res = await this.match(request, options);
if (!res)
return [];
return [res];
}
else {
return this.cache.values();
}
}
async put(request, response) {
const ttl = this.getTTL(response);
const key = this.getKey(request);
this.cache.set(key, response, ttl * 1000);
}
}
exports.EdgeCache = EdgeCache;
//# sourceMappingURL=Cache.js.map