From f13e6cb55bdcc7b865071f2addf072a201436fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Tue, 12 Dec 2023 20:58:37 +0100 Subject: [PATCH] Fix use of abort controller and parallel lookup of url --- bun.lockb | Bin 320996 -> 324647 bytes package.json | 2 +- src/lib/api.ts | 1 - src/lib/cache.ts | 33 +++----------------- src/middleware.ts | 76 +++++++++++++++++++++------------------------- 5 files changed, 40 insertions(+), 72 deletions(-) diff --git a/bun.lockb b/bun.lockb index 088eaa18b4ef8246f7f9b65b8e357746e81b61ef..5ee55e896aa67d275ac7a93651e4ce35d004f1ea 100755 GIT binary patch delta 44052 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 delta 42234 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 ci_C<{=Lla~mrE`QrG(); -const pendingOps = new Set>(); export interface CacheResult { data: Result; @@ -76,14 +75,6 @@ export function cacheResponse( }; } -/** - * Wait for all cache operations to be completed. - * This is a workaround until https://github.com/upstash/upstash-redis/issues/778 is fixed. - */ -export async function waitForCache() { - await Promise.all(pendingOps); -} - /** * Create a cache key from a function name and its arguments. */ @@ -100,9 +91,7 @@ async function getCacheValue(key: string) { } if (redis) { - console.log('getCacheValue', key); - const value = await wrapOperation(redis.get(key)); - console.log('done getCacheValue', key); + const value = await redis.get(key); return value; } @@ -116,22 +105,8 @@ async function setCacheValue(key: string, value: any, ttl: number) { memoryCache.set(key, value); if (redis) { - console.log('setCacheValue', key); - await wrapOperation( - redis.set(key, value, { - ex: ttl, - }), - ); - console.log('done setCacheValue', key); + await redis.set(key, value, { + ex: ttl, + }); } } - -/** - * Wrap a cache operation, it can be later awaited with `waitForCache`. - */ -function wrapOperation(op: Promise): Promise { - pendingOps.add(op); - return op.finally(() => { - pendingOps.delete(op); - }); -} diff --git a/src/middleware.ts b/src/middleware.ts index 103f2a704..3f7c5a179 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -235,57 +235,51 @@ async function lookupSpaceByAPI( } alternatives`, ); - const found = await new Promise((resolve, reject) => { - let resolved = false; + console.time('lookupSpaceByAPI'); + try { const abort = new AbortController(); - - Promise.all( + const matches = await Promise.all( lookupAlternatives.map(async (alternative) => { - console.log(`lookup content for url "${alternative.url}"`) - const data = await getPublishedContentByUrl( - alternative.url, - apiEndpoint, - visitorAuthToken, - { - signal: abort.signal, - }, - ); + try { + const data = await getPublishedContentByUrl( + alternative.url, + apiEndpoint, + visitorAuthToken, + { + signal: abort.signal, + }, + ); - if (resolved) { - return; - } - resolved = true; - console.log('aborting'); - abort.abort(); + if ('redirect' in data) { + if (alternative.url === url.toString()) { + return data; + } - if (alternative.url === url.toString()) { - resolve(data); - } else if (!('redirect' in data)) { - resolve({ + return null; + } + + // Cancel all other requests to speed up the lookup + abort.abort(); + return { space: data.space, basePath: data.basePath, pathname: joinPath(data.pathname, alternative.extraPath), apiToken: data.apiToken, - }); + } as PublishedContentLookup; + } catch (error) { + // @ts-ignore + if (error.name === 'AbortError') { + return null; + } + + throw error; } }), - ).catch((error) => { - if (error.name === 'AbortError') { - return; - } - - if (resolved) { - return; - } - - resolved = true; - reject(error); - }); - }); - - await waitForCache(); - - return found; + ); + return matches.find((match) => match !== null) ?? null; + } finally { + console.timeEnd('lookupSpaceByAPI'); + } } function computeLookupAlternatives(url: URL) {