aws-cdk
Version:
CDK Toolkit, the command line tool for CDK apps
101 lines • 10.6 kB
JavaScript
;
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==