UNPKG

faastjs

Version:

Serverless batch computing made simple.

110 lines 13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.caches = exports.PersistentCache = void 0; const fs_extra_1 = require("fs-extra"); const os_1 = require("os"); const path_1 = require("path"); const uuid_1 = require("uuid"); /** * A simple persistent key-value store. Used to implement {@link Limits.cache} * for {@link throttle}. * @remarks * Entries can be expired, but are not actually deleted individually. The entire * cache can be deleted at once. Hence this cache is useful for storing results * that are expensive to compute but do not change too often (e.g. the * node_modules folder from an 'npm install' where 'package.json' is not * expected to change too often). * * By default faast.js will use the directory `~/.faastjs` as a local cache to * store data such as pricing retrieved from cloud APIs, and garbage collection * information. This directory can be safely deleted if no faast.js instances * are running. * @public */ class PersistentCache { /** * Construct a new persistent cache, typically used with {@link Limits} as * part of the arguments to {@link throttle}. * @param dirRelativeToHomeDir - The directory under the user's home * directory that will be used to store cached values. The directory will be * created if it doesn't exist. * @param expiration - The age (in ms) after which a cached entry is * invalid. Default: `24*3600*1000` (1 day). */ constructor( /** * The directory under the user's home directory that will be used to * store cached values. The directory will be created if it doesn't * exist. */ dirRelativeToHomeDir, /** * The age (in ms) after which a cached entry is invalid. Default: * `24*3600*1000` (1 day). */ expiration = 24 * 3600 * 1000) { this.dirRelativeToHomeDir = dirRelativeToHomeDir; this.expiration = expiration; this.dir = (0, path_1.join)((0, os_1.homedir)(), dirRelativeToHomeDir); this.initialized = this.initialize(this.dir); } async initialize(dir) { if (!(await (0, fs_extra_1.pathExists)(dir))) { await (0, fs_extra_1.mkdirp)(dir); } } /** * Retrieves the value previously set for the given key, or undefined if the * key is not found. */ async get(key) { await this.initialized; const entry = (0, path_1.join)(this.dir, key); const statEntry = await (0, fs_extra_1.stat)(entry).catch(_ => { }); if (statEntry) { if (Date.now() - statEntry.mtimeMs > this.expiration) { return undefined; } return (0, fs_extra_1.readFile)(entry).catch(_ => undefined); } return undefined; } /** * Set the cache key to the given value. * @returns a Promise that resolves when the cache entry has been persisted. */ async set(key, value) { await this.initialized; const entry = (0, path_1.join)(this.dir, key); const tmpEntry = (0, path_1.join)(this.dir, (0, uuid_1.v4)()); await (0, fs_extra_1.writeFile)(tmpEntry, value, { mode: 0o600, encoding: "binary" }); await (0, fs_extra_1.rename)(tmpEntry, entry); } /** * Retrieve all keys stored in the cache, including expired entries. */ entries() { return (0, fs_extra_1.readdir)(this.dir); } /** * Deletes all cached entries from disk. * @param leaveEmptyDir - If true, leave the cache directory in place after * deleting its contents. If false, the cache directory will be removed. * Default: `true`. */ async clear({ leaveEmptyDir = true } = {}) { await this.initialized; await (0, fs_extra_1.remove)(this.dir); if (leaveEmptyDir) { await (0, fs_extra_1.mkdirp)(this.dir); } } } exports.PersistentCache = PersistentCache; const days = 24 * 3600 * 1000; exports.caches = { awsPrices: new PersistentCache(".faastjs/aws/pricing", 1 * days), googlePrices: new PersistentCache(".faastjs/google/pricing", 1 * days), awsGc: new PersistentCache(".faastjs/aws/gc", 7 * days) }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBU2tCO0FBQ2xCLDJCQUE2QjtBQUM3QiwrQkFBNEI7QUFFNUIsK0JBQW9DO0FBSXBDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQWEsZUFBZTtJQWN4Qjs7Ozs7Ozs7T0FRRztJQUNIO0lBQ0k7Ozs7T0FJRztJQUNNLG9CQUE0QjtJQUNyQzs7O09BR0c7SUFDTSxhQUFxQixFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7UUFMckMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFRO1FBSzVCLGVBQVUsR0FBVixVQUFVLENBQTJCO1FBRTlDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBQSxZQUFPLEdBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQW5DTyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQVc7UUFDaEMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFBLHFCQUFVLEVBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUMxQixNQUFNLElBQUEsaUJBQU0sRUFBQyxHQUFHLENBQUMsQ0FBQztTQUNyQjtJQUNMLENBQUM7SUFpQ0Q7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ2pCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFBLFdBQUksRUFBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSxlQUFJLEVBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xELE9BQU8sU0FBUyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxJQUFBLG1CQUFRLEVBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBcUQ7UUFDeEUsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUEsV0FBSSxFQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFBLFNBQU0sR0FBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFBLG9CQUFTLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdEUsTUFBTSxJQUFBLGlCQUFNLEVBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDSCxPQUFPLElBQUEsa0JBQU8sRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUV2QixNQUFNLElBQUEsaUJBQU0sRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkIsSUFBSSxhQUFhLEVBQUU7WUFDZixNQUFNLElBQUEsaUJBQU0sRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUI7SUFDTCxDQUFDO0NBQ0o7QUEzRkQsMENBMkZDO0FBRUQsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFakIsUUFBQSxNQUFNLEdBQUc7SUFDbEIsU0FBUyxFQUFFLElBQUksZUFBZSxDQUFDLHNCQUFzQixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDaEUsWUFBWSxFQUFFLElBQUksZUFBZSxDQUFDLHlCQUF5QixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEUsS0FBSyxFQUFFLElBQUksZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7Q0FDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgbWtkaXJwLFxuICAgIHBhdGhFeGlzdHMsXG4gICAgcmVhZGRpcixcbiAgICByZWFkRmlsZSxcbiAgICByZW1vdmUsXG4gICAgcmVuYW1lLFxuICAgIHN0YXQsXG4gICAgd3JpdGVGaWxlXG59IGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5cbmludGVyZmFjZSBCbG9iIHt9XG5cbi8qKlxuICogQSBzaW1wbGUgcGVyc2lzdGVudCBrZXktdmFsdWUgc3RvcmUuIFVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBMaW1pdHMuY2FjaGV9XG4gKiBmb3Ige0BsaW5rIHRocm90dGxlfS5cbiAqIEByZW1hcmtzXG4gKiBFbnRyaWVzIGNhbiBiZSBleHBpcmVkLCBidXQgYXJlIG5vdCBhY3R1YWxseSBkZWxldGVkIGluZGl2aWR1YWxseS4gVGhlIGVudGlyZVxuICogY2FjaGUgY2FuIGJlIGRlbGV0ZWQgYXQgb25jZS4gSGVuY2UgdGhpcyBjYWNoZSBpcyB1c2VmdWwgZm9yIHN0b3JpbmcgcmVzdWx0c1xuICogdGhhdCBhcmUgZXhwZW5zaXZlIHRvIGNvbXB1dGUgYnV0IGRvIG5vdCBjaGFuZ2UgdG9vIG9mdGVuIChlLmcuIHRoZVxuICogbm9kZV9tb2R1bGVzIGZvbGRlciBmcm9tIGFuICducG0gaW5zdGFsbCcgd2hlcmUgJ3BhY2thZ2UuanNvbicgaXMgbm90XG4gKiBleHBlY3RlZCB0byBjaGFuZ2UgdG9vIG9mdGVuKS5cbiAqXG4gKiBCeSBkZWZhdWx0IGZhYXN0LmpzIHdpbGwgdXNlIHRoZSBkaXJlY3RvcnkgYH4vLmZhYXN0anNgIGFzIGEgbG9jYWwgY2FjaGUgdG9cbiAqIHN0b3JlIGRhdGEgc3VjaCBhcyBwcmljaW5nIHJldHJpZXZlZCBmcm9tIGNsb3VkIEFQSXMsIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb25cbiAqIGluZm9ybWF0aW9uLiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgc2FmZWx5IGRlbGV0ZWQgaWYgbm8gZmFhc3QuanMgaW5zdGFuY2VzXG4gKiBhcmUgcnVubmluZy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFBlcnNpc3RlbnRDYWNoZSB7XG4gICAgcHJpdmF0ZSBpbml0aWFsaXplZDogUHJvbWlzZTx2b2lkPjtcblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZShkaXI6IHN0cmluZykge1xuICAgICAgICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICBhd2FpdCBta2RpcnAoZGlyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkaXJlY3Rvcnkgb24gZGlzayB3aGVyZSBjYWNoZWQgdmFsdWVzIGFyZSBzdG9yZWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGlyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgcGVyc2lzdGVudCBjYWNoZSwgdHlwaWNhbGx5IHVzZWQgd2l0aCB7QGxpbmsgTGltaXRzfSBhc1xuICAgICAqIHBhcnQgb2YgdGhlIGFyZ3VtZW50cyB0byB7QGxpbmsgdGhyb3R0bGV9LlxuICAgICAqIEBwYXJhbSBkaXJSZWxhdGl2ZVRvSG9tZURpciAtIFRoZSBkaXJlY3RvcnkgdW5kZXIgdGhlIHVzZXIncyBob21lXG4gICAgICogZGlyZWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHN0b3JlIGNhY2hlZCB2YWx1ZXMuIFRoZSBkaXJlY3Rvcnkgd2lsbCBiZVxuICAgICAqIGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKiBAcGFyYW0gZXhwaXJhdGlvbiAtIFRoZSBhZ2UgKGluIG1zKSBhZnRlciB3aGljaCBhIGNhY2hlZCBlbnRyeSBpc1xuICAgICAqIGludmFsaWQuIERlZmF1bHQ6IGAyNCozNjAwKjEwMDBgICgxIGRheSkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGlyZWN0b3J5IHVuZGVyIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG9cbiAgICAgICAgICogc3RvcmUgY2FjaGVkIHZhbHVlcy4gVGhlIGRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lc24ndFxuICAgICAgICAgKiBleGlzdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGRpclJlbGF0aXZlVG9Ib21lRGlyOiBzdHJpbmcsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYWdlIChpbiBtcykgYWZ0ZXIgd2hpY2ggYSBjYWNoZWQgZW50cnkgaXMgaW52YWxpZC4gRGVmYXVsdDpcbiAgICAgICAgICogYDI0KjM2MDAqMTAwMGAgKDEgZGF5KS5cbiAgICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGV4cGlyYXRpb246IG51bWJlciA9IDI0ICogMzYwMCAqIDEwMDBcbiAgICApIHtcbiAgICAgICAgdGhpcy5kaXIgPSBqb2luKGhvbWVkaXIoKSwgZGlyUmVsYXRpdmVUb0hvbWVEaXIpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdGhpcy5pbml0aWFsaXplKHRoaXMuZGlyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIHByZXZpb3VzbHkgc2V0IGZvciB0aGUgZ2l2ZW4ga2V5LCBvciB1bmRlZmluZWQgaWYgdGhlXG4gICAgICoga2V5IGlzIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplZDtcbiAgICAgICAgY29uc3QgZW50cnkgPSBqb2luKHRoaXMuZGlyLCBrZXkpO1xuICAgICAgICBjb25zdCBzdGF0RW50cnkgPSBhd2FpdCBzdGF0KGVudHJ5KS5jYXRjaChfID0+IHt9KTtcbiAgICAgICAgaWYgKHN0YXRFbnRyeSkge1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBzdGF0RW50cnkubXRpbWVNcyA+IHRoaXMuZXhwaXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVhZEZpbGUoZW50cnkpLmNhdGNoKF8gPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2FjaGUga2V5IHRvIHRoZSBnaXZlbiB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjYWNoZSBlbnRyeSBoYXMgYmVlbiBwZXJzaXN0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogQnVmZmVyIHwgc3RyaW5nIHwgVWludDhBcnJheSB8IFJlYWRhYmxlIHwgQmxvYikge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVkO1xuICAgICAgICBjb25zdCBlbnRyeSA9IGpvaW4odGhpcy5kaXIsIGtleSk7XG4gICAgICAgIGNvbnN0IHRtcEVudHJ5ID0gam9pbih0aGlzLmRpciwgdXVpZHY0KCkpO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodG1wRW50cnksIHZhbHVlLCB7IG1vZGU6IDBvNjAwLCBlbmNvZGluZzogXCJiaW5hcnlcIiB9KTtcbiAgICAgICAgYXdhaXQgcmVuYW1lKHRtcEVudHJ5LCBlbnRyeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYWxsIGtleXMgc3RvcmVkIGluIHRoZSBjYWNoZSwgaW5jbHVkaW5nIGV4cGlyZWQgZW50cmllcy5cbiAgICAgKi9cbiAgICBlbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gcmVhZGRpcih0aGlzLmRpcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhbGwgY2FjaGVkIGVudHJpZXMgZnJvbSBkaXNrLlxuICAgICAqIEBwYXJhbSBsZWF2ZUVtcHR5RGlyIC0gSWYgdHJ1ZSwgbGVhdmUgdGhlIGNhY2hlIGRpcmVjdG9yeSBpbiBwbGFjZSBhZnRlclxuICAgICAqIGRlbGV0aW5nIGl0cyBjb250ZW50cy4gSWYgZmFsc2UsIHRoZSBjYWNoZSBkaXJlY3Rvcnkgd2lsbCBiZSByZW1vdmVkLlxuICAgICAqIERlZmF1bHQ6IGB0cnVlYC5cbiAgICAgKi9cbiAgICBhc3luYyBjbGVhcih7IGxlYXZlRW1wdHlEaXIgPSB0cnVlIH0gPSB7fSkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVkO1xuXG4gICAgICAgIGF3YWl0IHJlbW92ZSh0aGlzLmRpcik7XG5cbiAgICAgICAgaWYgKGxlYXZlRW1wdHlEaXIpIHtcbiAgICAgICAgICAgIGF3YWl0IG1rZGlycCh0aGlzLmRpcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGRheXMgPSAyNCAqIDM2MDAgKiAxMDAwO1xuXG5leHBvcnQgY29uc3QgY2FjaGVzID0ge1xuICAgIGF3c1ByaWNlczogbmV3IFBlcnNpc3RlbnRDYWNoZShcIi5mYWFzdGpzL2F3cy9wcmljaW5nXCIsIDEgKiBkYXlzKSxcbiAgICBnb29nbGVQcmljZXM6IG5ldyBQZXJzaXN0ZW50Q2FjaGUoXCIuZmFhc3Rqcy9nb29nbGUvcHJpY2luZ1wiLCAxICogZGF5cyksXG4gICAgYXdzR2M6IG5ldyBQZXJzaXN0ZW50Q2FjaGUoXCIuZmFhc3Rqcy9hd3MvZ2NcIiwgNyAqIGRheXMpXG59O1xuIl19