From bbe225276efdeb611bbd8c2f1c771bc1332d1968 Mon Sep 17 00:00:00 2001 From: Samu Lang Date: Wed, 2 Sep 2026 15:46:14 +0100 Subject: [PATCH] Don't cache rejected promises --- src/CachingAuthorizationServerProvider.ts | 13 ++++++++++--- src/CachingClientProvider.ts | 11 +++++++++-- src/CachingIssuerProvider.ts | 13 ++++++++++--- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/CachingAuthorizationServerProvider.ts b/src/CachingAuthorizationServerProvider.ts index 18f4814..267db11 100644 --- a/src/CachingAuthorizationServerProvider.ts +++ b/src/CachingAuthorizationServerProvider.ts @@ -2,14 +2,21 @@ import type { AuthorizationServerProvider } from "./AuthorizationServerProvider. import type * as oauth from "oauth4webapi" export class CachingAuthorizationServerProvider implements AuthorizationServerProvider { - readonly #cache = new Map> // TODO: Take cache from caller + readonly #cache = new Map // TODO: Take cache from caller readonly #original: AuthorizationServerProvider constructor(original: AuthorizationServerProvider) { this.#original = original } - getAuthorizationServer(request: Request): Promise { - return this.#cache.getOrInsertComputed(request.url, _ => this.#original.getAuthorizationServer(request)) + async getAuthorizationServer(request: Request): Promise { + const cached = this.#cache.get(request.url) + if (cached !== undefined) { + return cached + } + + const fresh = await this.#original.getAuthorizationServer(request) + this.#cache.set(request.url, fresh) + return fresh } } diff --git a/src/CachingClientProvider.ts b/src/CachingClientProvider.ts index 07307c8..ddda929 100644 --- a/src/CachingClientProvider.ts +++ b/src/CachingClientProvider.ts @@ -2,7 +2,7 @@ import type { ClientProvider } from "./ClientProvider.js" import type * as oauth from "oauth4webapi" export class CachingClientProvider implements ClientProvider { - readonly #cache = new Map> // TODO: Take cache from caller + readonly #cache = new Map // TODO: Take cache from caller readonly #original: ClientProvider constructor(original: ClientProvider) { @@ -10,6 +10,13 @@ export class CachingClientProvider implements ClientProvider { } async getClient(as: oauth.AuthorizationServer, redirectUri: string, signal: AbortSignal): Promise { - return this.#cache.getOrInsertComputed(as.issuer, _ => this.#original.getClient(as, redirectUri, signal)) + const cached = this.#cache.get(as.issuer) + if (cached !== undefined) { + return cached + } + + const fresh = await this.#original.getClient(as, redirectUri, signal) + this.#cache.set(as.issuer, fresh) + return fresh } } diff --git a/src/CachingIssuerProvider.ts b/src/CachingIssuerProvider.ts index a42151a..992342f 100644 --- a/src/CachingIssuerProvider.ts +++ b/src/CachingIssuerProvider.ts @@ -1,14 +1,21 @@ import { IssuerProvider } from "./IssuerProvider.js" export class CachingIssuerProvider implements IssuerProvider { - readonly #cache = new Map> // TODO: Take cache from caller + readonly #cache = new Map // TODO: Take cache from caller readonly #original: IssuerProvider constructor(original: IssuerProvider) { this.#original = original } - getIssuer(request: Request): Promise { - return this.#cache.getOrInsertComputed(request.url, _ => this.#original.getIssuer(request)) + async getIssuer(request: Request): Promise { + const cached = this.#cache.get(request.url) + if (cached !== undefined) { + return cached + } + + const fresh = await this.#original.getIssuer(request) + this.#cache.set(request.url, fresh) + return fresh } }