diff options
| author | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-07-02 11:55:17 -0700 |
|---|---|---|
| committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-07-02 11:55:17 -0700 |
| commit | 6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 (patch) | |
| tree | ed97e39ec77c5231ffd2c394493e68d00ddac5a4 /Homework/cs5260/consumer/Loop.ts | |
| download | misc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.tar.gz misc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.zip | |
Diffstat (limited to 'Homework/cs5260/consumer/Loop.ts')
| -rw-r--r-- | Homework/cs5260/consumer/Loop.ts | 47 |
1 files changed, 47 insertions, 0 deletions
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})...`); +}; |
