diff --git a/src/events/list-events.ts b/src/events/list-events.ts index 3d5b589..9438019 100644 --- a/src/events/list-events.ts +++ b/src/events/list-events.ts @@ -1,11 +1,61 @@ import { Env } from "../../worker-configuration"; -export async function handleEvents(request: Request, env: Env) { - const prefix = 'event/app-stake-a'; +const PREFIX = "event/app-stake-a" - const listResult = await env.EVENTS.list({ prefix }); +const HEADERS = { 'Content-Type': 'application/json' } +const BATCH_SIZE = 5 +const LIMIT = 200 + +export async function handleListEvents(request: Request, env: Env) { + const url = new URL(request.url) + + const fullParam = url.searchParams.get('full') + const page = url.searchParams.get('page') || '0' + const returnFullResult = fullParam === 'true' + + const listResult = await env.EVENTS.list({ prefix: PREFIX }); + + if (returnFullResult) { + const fullResult = await getFullResult(listResult, page, env) + + return new Response(JSON.stringify(fullResult, null, 2), { + headers: HEADERS, + }); + } return new Response(JSON.stringify(listResult.keys, null, 2), { - headers: { 'Content-Type': 'application/json' }, + headers: HEADERS }); } + +async function getFullResult(listResult: KVNamespaceListResult, page: string, env: Env) { + const keys = listResult.keys.map(key => key.name); + const fullResults: Record[] = []; + + + async function processBatch(batch: string[]) { + const results = await Promise.all( + batch.map(async (key) => { + const value = await env.EVENTS.get(key); + return { key, value: JSON.parse(value!) }; + }) + ); + + fullResults.push(...results); + }; + + const pageIndex = parseInt(page) || 0 + const startIndex = pageIndex * LIMIT + const endIndex = startIndex + LIMIT - 1 + + for (let i = startIndex; i < keys.length; i += BATCH_SIZE) { + if (i > endIndex) { + break + } + + const batch = keys.slice(i, i + BATCH_SIZE); + await processBatch(batch); + } + + return fullResults +} \ No newline at end of file diff --git a/src/router.ts b/src/router.ts index c098e7e..ab2bab0 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,6 +1,7 @@ import { RouteHandler, Router } from 'itty-router'; import { handleDiscover } from './discover/handle-discover'; import { handleEvents } from './events/handle-events'; +import { handleListEvents } from './events/list-events'; import { handleExpore } from './explore/handle-explore'; import { handleMetadata } from './metadata/handle-metadata'; import { handleAssets } from './onboarding/discover/handle-assets'; @@ -24,6 +25,7 @@ export enum ROUTES { VERSION = '/v1/version', EVENTS = '/v1/events', + EVENTS_LIST = '/v1/list-events', } const router = Router(); @@ -44,6 +46,7 @@ router.get(ROUTES.PROXY, handleProxy as unknown as RouteHandler) router.get(ROUTES.VERSION, handleVersion as unknown as RouteHandler) router.get(ROUTES.EVENTS, handleEvents as unknown as RouteHandler) +// router.get(ROUTES.EVENTS_LIST, handleListEvents as unknown as RouteHandler) router.all('*', () => new Response('Not Found.', { status: 404 }))