lambda-live-debugger
Version:
Debug Lambda functions locally like it is running in the cloud
205 lines (196 loc) • 8.22 kB
JavaScript
;
var propertyProvider = require('@smithy/property-provider');
function resolveLogins(logins) {
return Promise.all(Object.keys(logins).reduce((arr, name) => {
const tokenOrProvider = logins[name];
if (typeof tokenOrProvider === "string") {
arr.push([name, tokenOrProvider]);
}
else {
arr.push(tokenOrProvider().then((token) => [name, token]));
}
return arr;
}, [])).then((resolvedPairs) => resolvedPairs.reduce((logins, [key, value]) => {
logins[key] = value;
return logins;
}, {}));
}
function fromCognitoIdentity(parameters) {
return async (awsIdentityProperties) => {
parameters.logger?.debug("@aws-sdk/credential-provider-cognito-identity - fromCognitoIdentity");
const { GetCredentialsForIdentityCommand, CognitoIdentityClient } = await Promise.resolve().then(function () { return require('./loadCognitoIdentity-BPNvueUJ.js'); });
const fromConfigs = (property) => parameters.clientConfig?.[property] ??
parameters.parentClientConfig?.[property] ??
awsIdentityProperties?.callerClientConfig?.[property];
const { Credentials: { AccessKeyId = throwOnMissingAccessKeyId(parameters.logger), Expiration, SecretKey = throwOnMissingSecretKey(parameters.logger), SessionToken, } = throwOnMissingCredentials(parameters.logger), } = await (parameters.client ??
new CognitoIdentityClient(Object.assign({}, parameters.clientConfig ?? {}, {
region: fromConfigs("region"),
profile: fromConfigs("profile"),
userAgentAppId: fromConfigs("userAgentAppId"),
}))).send(new GetCredentialsForIdentityCommand({
CustomRoleArn: parameters.customRoleArn,
IdentityId: parameters.identityId,
Logins: parameters.logins ? await resolveLogins(parameters.logins) : undefined,
}));
return {
identityId: parameters.identityId,
accessKeyId: AccessKeyId,
secretAccessKey: SecretKey,
sessionToken: SessionToken,
expiration: Expiration,
};
};
}
function throwOnMissingAccessKeyId(logger) {
throw new propertyProvider.CredentialsProviderError("Response from Amazon Cognito contained no access key ID", { logger });
}
function throwOnMissingCredentials(logger) {
throw new propertyProvider.CredentialsProviderError("Response from Amazon Cognito contained no credentials", { logger });
}
function throwOnMissingSecretKey(logger) {
throw new propertyProvider.CredentialsProviderError("Response from Amazon Cognito contained no secret key", { logger });
}
const STORE_NAME = "IdentityIds";
class IndexedDbStorage {
dbName;
constructor(dbName = "aws:cognito-identity-ids") {
this.dbName = dbName;
}
getItem(key) {
return this.withObjectStore("readonly", (store) => {
const req = store.get(key);
return new Promise((resolve) => {
req.onerror = () => resolve(null);
req.onsuccess = () => resolve(req.result ? req.result.value : null);
});
}).catch(() => null);
}
removeItem(key) {
return this.withObjectStore("readwrite", (store) => {
const req = store.delete(key);
return new Promise((resolve, reject) => {
req.onerror = () => reject(req.error);
req.onsuccess = () => resolve();
});
});
}
setItem(id, value) {
return this.withObjectStore("readwrite", (store) => {
const req = store.put({ id, value });
return new Promise((resolve, reject) => {
req.onerror = () => reject(req.error);
req.onsuccess = () => resolve();
});
});
}
getDb() {
const openDbRequest = self.indexedDB.open(this.dbName, 1);
return new Promise((resolve, reject) => {
openDbRequest.onsuccess = () => {
resolve(openDbRequest.result);
};
openDbRequest.onerror = () => {
reject(openDbRequest.error);
};
openDbRequest.onblocked = () => {
reject(new Error("Unable to access DB"));
};
openDbRequest.onupgradeneeded = () => {
const db = openDbRequest.result;
db.onerror = () => {
reject(new Error("Failed to create object store"));
};
db.createObjectStore(STORE_NAME, { keyPath: "id" });
};
});
}
withObjectStore(mode, action) {
return this.getDb().then((db) => {
const tx = db.transaction(STORE_NAME, mode);
tx.oncomplete = () => db.close();
return new Promise((resolve, reject) => {
tx.onerror = () => reject(tx.error);
resolve(action(tx.objectStore(STORE_NAME)));
}).catch((err) => {
db.close();
throw err;
});
});
}
}
class InMemoryStorage {
store;
constructor(store = {}) {
this.store = store;
}
getItem(key) {
if (key in this.store) {
return this.store[key];
}
return null;
}
removeItem(key) {
delete this.store[key];
}
setItem(key, value) {
this.store[key] = value;
}
}
const inMemoryStorage = new InMemoryStorage();
function localStorage() {
if (typeof self === "object" && self.indexedDB) {
return new IndexedDbStorage();
}
if (typeof window === "object" && window.localStorage) {
return window.localStorage;
}
return inMemoryStorage;
}
function fromCognitoIdentityPool({ accountId, cache = localStorage(), client, clientConfig, customRoleArn, identityPoolId, logins, userIdentifier = !logins || Object.keys(logins).length === 0 ? "ANONYMOUS" : undefined, logger, parentClientConfig, }) {
logger?.debug("@aws-sdk/credential-provider-cognito-identity - fromCognitoIdentity");
const cacheKey = userIdentifier
? `aws:cognito-identity-credentials:${identityPoolId}:${userIdentifier}`
: undefined;
let provider = async (awsIdentityProperties) => {
const { GetIdCommand, CognitoIdentityClient } = await Promise.resolve().then(function () { return require('./loadCognitoIdentity-BPNvueUJ.js'); });
const fromConfigs = (property) => clientConfig?.[property] ??
parentClientConfig?.[property] ??
awsIdentityProperties?.callerClientConfig?.[property];
const _client = client ??
new CognitoIdentityClient(Object.assign({}, clientConfig ?? {}, {
region: fromConfigs("region"),
profile: fromConfigs("profile"),
userAgentAppId: fromConfigs("userAgentAppId"),
}));
let identityId = (cacheKey && (await cache.getItem(cacheKey)));
if (!identityId) {
const { IdentityId = throwOnMissingId(logger) } = await _client.send(new GetIdCommand({
AccountId: accountId,
IdentityPoolId: identityPoolId,
Logins: logins ? await resolveLogins(logins) : undefined,
}));
identityId = IdentityId;
if (cacheKey) {
Promise.resolve(cache.setItem(cacheKey, identityId)).catch(() => { });
}
}
provider = fromCognitoIdentity({
client: _client,
customRoleArn,
logins,
identityId,
});
return provider(awsIdentityProperties);
};
return (awsIdentityProperties) => provider(awsIdentityProperties).catch(async (err) => {
if (cacheKey) {
Promise.resolve(cache.removeItem(cacheKey)).catch(() => { });
}
throw err;
});
}
function throwOnMissingId(logger) {
throw new propertyProvider.CredentialsProviderError("Response from Amazon Cognito contained no identity ID", { logger });
}
exports.fromCognitoIdentity = fromCognitoIdentity;
exports.fromCognitoIdentityPool = fromCognitoIdentityPool;