From 6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 Mon Sep 17 00:00:00 2001 From: Elizabeth Alexander Hunt Date: Thu, 2 Jul 2026 11:55:17 -0700 Subject: Init --- Homework/cs5260/consumer/Loop.ts | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Homework/cs5260/consumer/Loop.ts (limited to 'Homework/cs5260/consumer/Loop.ts') diff --git a/Homework/cs5260/consumer/Loop.ts b/Homework/cs5260/consumer/Loop.ts new file mode 100644 index 0000000..e8e88d2 --- /dev/null +++ b/Homework/cs5260/consumer/Loop.ts @@ -0,0 +1,47 @@ +import { TracingLogger } from "./log"; +import { WidgetRequestProcessor } from "./processor"; +import { WidgetRequestRetriever } from "./retrievers"; +import { WidgetRequestT } from "./schema"; + +const sleepFor = (ms: number) => new Promise((res) => setTimeout(res, ms)); + +export const MainLoop = async ( + retrievers: WidgetRequestRetriever[], + processors: WidgetRequestProcessor[], + maxPollAttempts: number, + pollIntervalMs: number, + logger: TracingLogger, +) => { + let pollAttemptsWithNoResults = 0; + while (pollAttemptsWithNoResults < maxPollAttempts) { + logger.info(`polling...`); + + let requests: WidgetRequestT[] = []; + for (const retriever of retrievers) { + const retrievalRequests = await retriever.refreshRequests(); + requests = requests.concat(retrievalRequests); + } + logger.info(`received Requests=(${requests.length}) requests...`); + + for (const request of requests) { + for (const processor of processors) { + await processor.processRequest(request); + } + } + logger.info( + `finished processing Requests=(${requests.length}) requests...`, + ); + + if (requests.length === 0) { + pollAttemptsWithNoResults++; + logger.info( + `sleeping for Interval=(${pollIntervalMs})ms: (${pollAttemptsWithNoResults} / ${maxPollAttempts})`, + ); + await sleepFor(pollIntervalMs); + } else { + pollAttemptsWithNoResults = 0; + } + } + + logger.info(`no requests after Attempts=(${maxPollAttempts})...`); +}; -- cgit v1.3