This commit is contained in:
2025-01-04 00:34:03 +01:00
parent 41829408dc
commit 0ca14bbc19
18111 changed files with 1871397 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
import { ProviderError } from "./ProviderError";
export class CredentialsProviderError extends ProviderError {
constructor(message, tryNextLink = true) {
super(message, tryNextLink);
this.tryNextLink = tryNextLink;
this.name = "CredentialsProviderError";
Object.setPrototypeOf(this, CredentialsProviderError.prototype);
}
}

View File

@@ -0,0 +1,11 @@
export class ProviderError extends Error {
constructor(message, tryNextLink = true) {
super(message);
this.tryNextLink = tryNextLink;
this.name = "ProviderError";
Object.setPrototypeOf(this, ProviderError.prototype);
}
static from(error, tryNextLink = true) {
return Object.assign(new this(error.message, tryNextLink), error);
}
}

View File

@@ -0,0 +1,9 @@
import { ProviderError } from "./ProviderError";
export class TokenProviderError extends ProviderError {
constructor(message, tryNextLink = true) {
super(message, tryNextLink);
this.tryNextLink = tryNextLink;
this.name = "TokenProviderError";
Object.setPrototypeOf(this, TokenProviderError.prototype);
}
}

View File

@@ -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;
};

View File

@@ -0,0 +1 @@
export const fromStatic = (staticValue) => () => Promise.resolve(staticValue);

View File

@@ -0,0 +1,6 @@
export * from "./CredentialsProviderError";
export * from "./ProviderError";
export * from "./TokenProviderError";
export * from "./chain";
export * from "./fromStatic";
export * from "./memoize";

View File

@@ -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;
};
};