UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

101 lines 10.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AccountAccessKeyCache = void 0; const path = require("path"); const fs = require("fs-extra"); const _env_1 = require("./_env"); /** * Disk cache which maps access key IDs to account IDs. * Usage: * cache.get(accessKey) => accountId | undefined * cache.put(accessKey, accountId) */ class AccountAccessKeyCache { /** * @param filePath Path to the cache file */ constructor(filePath) { this.cacheFile = filePath || path.join((0, _env_1.accountCacheDir)(), 'accounts_partitions.json'); } /** * Tries to fetch the account ID from cache. If it's not in the cache, invokes * the resolver function which should retrieve the account ID and return it. * Then, it will be stored into disk cache returned. * * Example: * * const accountId = cache.fetch(accessKey, async () => { * return await fetchAccountIdFromSomewhere(accessKey); * }); * * @param accessKeyId * @param resolver */ async fetch(accessKeyId, resolver) { // try to get account ID based on this access key ID from disk. const cached = await this.get(accessKeyId); if (cached) { (0, _env_1.debug)(`Retrieved account ID ${cached.accountId} from disk cache`); return cached; } // if it's not in the cache, resolve and put in cache. const account = await resolver(); if (account) { await this.put(accessKeyId, account); } return account; } /** Get the account ID from an access key or undefined if not in cache */ async get(accessKeyId) { const map = await this.loadMap(); return map[accessKeyId]; } /** Put a mapping between access key and account ID */ async put(accessKeyId, account) { let map = await this.loadMap(); // nuke cache if it's too big. if (Object.keys(map).length >= AccountAccessKeyCache.MAX_ENTRIES) { map = {}; } map[accessKeyId] = account; await this.saveMap(map); } async loadMap() { try { return await fs.readJson(this.cacheFile); } catch (e) { // File doesn't exist or is not readable. This is a cache, // pretend we successfully loaded an empty map. if (e.code === 'ENOENT' || e.code === 'EACCES') { return {}; } // File is not JSON, could be corrupted because of concurrent writes. // Again, an empty cache is fine. if (e instanceof SyntaxError) { return {}; } throw e; } } async saveMap(map) { try { await fs.ensureFile(this.cacheFile); await fs.writeJson(this.cacheFile, map, { spaces: 2 }); } catch (e) { // File doesn't exist or file/dir isn't writable. This is a cache, // if we can't write it then too bad. if (e.code === 'ENOENT' || e.code === 'EACCES' || e.code === 'EROFS') { return; } throw e; } } } exports.AccountAccessKeyCache = AccountAccessKeyCache; /** * Max number of entries in the cache, after which the cache will be reset. */ AccountAccessKeyCache.MAX_ENTRIES = 1000; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFjY291bnQtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUMvQixpQ0FBZ0Q7QUFHaEQ7Ozs7O0dBS0c7QUFDSCxNQUFhLHFCQUFxQjtJQVFoQzs7T0FFRztJQUNILFlBQVksUUFBaUI7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFBLHNCQUFlLEdBQUUsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksS0FBSyxDQUFDLEtBQUssQ0FBb0IsV0FBbUIsRUFBRSxRQUEwQjtRQUNuRiwrREFBK0Q7UUFDL0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBQSxZQUFLLEVBQUMsd0JBQXdCLE1BQU0sQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUM7WUFDbEUsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUVELHNEQUFzRDtRQUN0RCxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLElBQUksT0FBTyxFQUFFO1lBQ1gsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN0QztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx5RUFBeUU7SUFDbEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFtQjtRQUNsQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQyxPQUFPLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsc0RBQXNEO0lBQy9DLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBbUIsRUFBRSxPQUFnQjtRQUNwRCxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUvQiw4QkFBOEI7UUFDOUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxXQUFXLEVBQUU7WUFDaEUsR0FBRyxHQUFHLEVBQUcsQ0FBQztTQUNYO1FBRUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUMzQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPO1FBQ25CLElBQUk7WUFDRixPQUFPLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDMUM7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLDBEQUEwRDtZQUMxRCwrQ0FBK0M7WUFDL0MsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFBRSxPQUFPLEVBQUUsQ0FBQzthQUFFO1lBQzlELHFFQUFxRTtZQUNyRSxpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLFlBQVksV0FBVyxFQUFFO2dCQUFFLE9BQU8sRUFBRSxDQUFDO2FBQUU7WUFDNUMsTUFBTSxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQXVDO1FBQzNELElBQUk7WUFDRixNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixrRUFBa0U7WUFDbEUscUNBQXFDO1lBQ3JDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7Z0JBQUUsT0FBTzthQUFFO1lBQ2pGLE1BQU0sQ0FBQyxDQUFDO1NBQ1Q7SUFDSCxDQUFDOztBQXpGSCxzREEwRkM7QUF6RkM7O0dBRUc7QUFDb0IsaUNBQVcsR0FBRyxJQUFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgYWNjb3VudENhY2hlRGlyLCBkZWJ1ZyB9IGZyb20gJy4vX2Vudic7XG5pbXBvcnQgeyBBY2NvdW50IH0gZnJvbSAnLi9zZGstcHJvdmlkZXInO1xuXG4vKipcbiAqIERpc2sgY2FjaGUgd2hpY2ggbWFwcyBhY2Nlc3Mga2V5IElEcyB0byBhY2NvdW50IElEcy5cbiAqIFVzYWdlOlxuICogICBjYWNoZS5nZXQoYWNjZXNzS2V5KSA9PiBhY2NvdW50SWQgfCB1bmRlZmluZWRcbiAqICAgY2FjaGUucHV0KGFjY2Vzc0tleSwgYWNjb3VudElkKVxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudEFjY2Vzc0tleUNhY2hlIHtcbiAgLyoqXG4gICAqIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2FjaGUsIGFmdGVyIHdoaWNoIHRoZSBjYWNoZSB3aWxsIGJlIHJlc2V0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVhfRU5UUklFUyA9IDEwMDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZUZpbGU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGNhY2hlIGZpbGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGZpbGVQYXRoPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jYWNoZUZpbGUgPSBmaWxlUGF0aCB8fCBwYXRoLmpvaW4oYWNjb3VudENhY2hlRGlyKCksICdhY2NvdW50c19wYXJ0aXRpb25zLmpzb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byBmZXRjaCB0aGUgYWNjb3VudCBJRCBmcm9tIGNhY2hlLiBJZiBpdCdzIG5vdCBpbiB0aGUgY2FjaGUsIGludm9rZXNcbiAgICogdGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCByZXRyaWV2ZSB0aGUgYWNjb3VudCBJRCBhbmQgcmV0dXJuIGl0LlxuICAgKiBUaGVuLCBpdCB3aWxsIGJlIHN0b3JlZCBpbnRvIGRpc2sgY2FjaGUgcmV0dXJuZWQuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqICAgIGNvbnN0IGFjY291bnRJZCA9IGNhY2hlLmZldGNoKGFjY2Vzc0tleSwgYXN5bmMgKCkgPT4ge1xuICAgKiAgICAgIHJldHVybiBhd2FpdCBmZXRjaEFjY291bnRJZEZyb21Tb21ld2hlcmUoYWNjZXNzS2V5KTtcbiAgICogICAgfSk7XG4gICAqXG4gICAqIEBwYXJhbSBhY2Nlc3NLZXlJZFxuICAgKiBAcGFyYW0gcmVzb2x2ZXJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBmZXRjaDxBIGV4dGVuZHMgQWNjb3VudD4oYWNjZXNzS2V5SWQ6IHN0cmluZywgcmVzb2x2ZXI6ICgpID0+IFByb21pc2U8QT4pIHtcbiAgICAvLyB0cnkgdG8gZ2V0IGFjY291bnQgSUQgYmFzZWQgb24gdGhpcyBhY2Nlc3Mga2V5IElEIGZyb20gZGlzay5cbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLmdldChhY2Nlc3NLZXlJZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgZGVidWcoYFJldHJpZXZlZCBhY2NvdW50IElEICR7Y2FjaGVkLmFjY291bnRJZH0gZnJvbSBkaXNrIGNhY2hlYCk7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIC8vIGlmIGl0J3Mgbm90IGluIHRoZSBjYWNoZSwgcmVzb2x2ZSBhbmQgcHV0IGluIGNhY2hlLlxuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCByZXNvbHZlcigpO1xuICAgIGlmIChhY2NvdW50KSB7XG4gICAgICBhd2FpdCB0aGlzLnB1dChhY2Nlc3NLZXlJZCwgYWNjb3VudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY291bnQ7XG4gIH1cblxuICAvKiogR2V0IHRoZSBhY2NvdW50IElEIGZyb20gYW4gYWNjZXNzIGtleSBvciB1bmRlZmluZWQgaWYgbm90IGluIGNhY2hlICovXG4gIHB1YmxpYyBhc3luYyBnZXQoYWNjZXNzS2V5SWQ6IHN0cmluZyk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMubG9hZE1hcCgpO1xuICAgIHJldHVybiBtYXBbYWNjZXNzS2V5SWRdO1xuICB9XG5cbiAgLyoqIFB1dCBhIG1hcHBpbmcgYmV0d2VlbiBhY2Nlc3Mga2V5IGFuZCBhY2NvdW50IElEICovXG4gIHB1YmxpYyBhc3luYyBwdXQoYWNjZXNzS2V5SWQ6IHN0cmluZywgYWNjb3VudDogQWNjb3VudCkge1xuICAgIGxldCBtYXAgPSBhd2FpdCB0aGlzLmxvYWRNYXAoKTtcblxuICAgIC8vIG51a2UgY2FjaGUgaWYgaXQncyB0b28gYmlnLlxuICAgIGlmIChPYmplY3Qua2V5cyhtYXApLmxlbmd0aCA+PSBBY2NvdW50QWNjZXNzS2V5Q2FjaGUuTUFYX0VOVFJJRVMpIHtcbiAgICAgIG1hcCA9IHsgfTtcbiAgICB9XG5cbiAgICBtYXBbYWNjZXNzS2V5SWRdID0gYWNjb3VudDtcbiAgICBhd2FpdCB0aGlzLnNhdmVNYXAobWFwKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1hcCgpOiBQcm9taXNlPHsgW2FjY2Vzc0tleUlkOiBzdHJpbmddOiBBY2NvdW50IH0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRKc29uKHRoaXMuY2FjaGVGaWxlKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUuIFRoaXMgaXMgYSBjYWNoZSxcbiAgICAgIC8vIHByZXRlbmQgd2Ugc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhbiBlbXB0eSBtYXAuXG4gICAgICBpZiAoZS5jb2RlID09PSAnRU5PRU5UJyB8fCBlLmNvZGUgPT09ICdFQUNDRVMnKSB7IHJldHVybiB7fTsgfVxuICAgICAgLy8gRmlsZSBpcyBub3QgSlNPTiwgY291bGQgYmUgY29ycnVwdGVkIGJlY2F1c2Ugb2YgY29uY3VycmVudCB3cml0ZXMuXG4gICAgICAvLyBBZ2FpbiwgYW4gZW1wdHkgY2FjaGUgaXMgZmluZS5cbiAgICAgIGlmIChlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHsgcmV0dXJuIHt9OyB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZU1hcChtYXA6IHsgW2FjY2Vzc0tleUlkOiBzdHJpbmddOiBBY2NvdW50IH0pIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuZW5zdXJlRmlsZSh0aGlzLmNhY2hlRmlsZSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUpzb24odGhpcy5jYWNoZUZpbGUsIG1hcCwgeyBzcGFjZXM6IDIgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgZmlsZS9kaXIgaXNuJ3Qgd3JpdGFibGUuIFRoaXMgaXMgYSBjYWNoZSxcbiAgICAgIC8vIGlmIHdlIGNhbid0IHdyaXRlIGl0IHRoZW4gdG9vIGJhZC5cbiAgICAgIGlmIChlLmNvZGUgPT09ICdFTk9FTlQnIHx8IGUuY29kZSA9PT0gJ0VBQ0NFUycgfHwgZS5jb2RlID09PSAnRVJPRlMnKSB7IHJldHVybjsgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==