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})...`); };