Backend half

This commit is contained in:
2025-07-11 19:56:28 +02:00
parent fa868e7c1d
commit 8600fa7c1d
19426 changed files with 3750448 additions and 8108 deletions
@@ -0,0 +1,8 @@
import { ProviderError } from "./ProviderError";
export class CredentialsProviderError extends ProviderError {
constructor(message, options = true) {
super(message, options);
this.name = "CredentialsProviderError";
Object.setPrototypeOf(this, CredentialsProviderError.prototype);
}
}
@@ -0,0 +1,22 @@
export class ProviderError extends Error {
constructor(message, options = true) {
let logger;
let tryNextLink = true;
if (typeof options === "boolean") {
logger = undefined;
tryNextLink = options;
}
else if (options != null && typeof options === "object") {
logger = options.logger;
tryNextLink = options.tryNextLink ?? true;
}
super(message);
this.name = "ProviderError";
this.tryNextLink = tryNextLink;
Object.setPrototypeOf(this, ProviderError.prototype);
logger?.debug?.(`@smithy/property-provider ${tryNextLink ? "->" : "(!)"} ${message}`);
}
static from(error, options = true) {
return Object.assign(new this(error.message, options), error);
}
}
@@ -0,0 +1,8 @@
import { ProviderError } from "./ProviderError";
export class TokenProviderError extends ProviderError {
constructor(message, options = true) {
super(message, options);
this.name = "TokenProviderError";
Object.setPrototypeOf(this, TokenProviderError.prototype);
}
}
@@ -0,0 +1,21 @@
import { ProviderError } from "./ProviderError";
export const chain = (...providers) => async () => {
if (providers.length === 0) {
throw new ProviderError("No providers in chain");
}
let lastProviderError;
for (const provider of providers) {
try {
const credentials = await provider();
return credentials;
}
catch (err) {
lastProviderError = err;
if (err?.tryNextLink) {
continue;
}
throw err;
}
}
throw lastProviderError;
};
@@ -0,0 +1 @@
export const fromStatic = (staticValue) => () => Promise.resolve(staticValue);
@@ -0,0 +1,6 @@
export * from "./CredentialsProviderError";
export * from "./ProviderError";
export * from "./TokenProviderError";
export * from "./chain";
export * from "./fromStatic";
export * from "./memoize";
@@ -0,0 +1,45 @@
export const memoize = (provider, isExpired, requiresRefresh) => {
let resolved;
let pending;
let hasResult;
let isConstant = false;
const coalesceProvider = async () => {
if (!pending) {
pending = provider();
}
try {
resolved = await pending;
hasResult = true;
isConstant = false;
}
finally {
pending = undefined;
}
return resolved;
};
if (isExpired === undefined) {
return async (options) => {
if (!hasResult || options?.forceRefresh) {
resolved = await coalesceProvider();
}
return resolved;
};
}
return async (options) => {
if (!hasResult || options?.forceRefresh) {
resolved = await coalesceProvider();
}
if (isConstant) {
return resolved;
}
if (requiresRefresh && !requiresRefresh(resolved)) {
isConstant = true;
return resolved;
}
if (isExpired(resolved)) {
await coalesceProvider();
return resolved;
}
return resolved;
};
};