From 420def07b00bb5ea08d5994a2bf36e286a9de9d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tadeusz=20So=C5=9Bnierz?= Date: Fri, 22 Apr 2022 12:27:14 +0200 Subject: [PATCH] Fetch feeds sequentially, warn if it took too long --- src/feeds/FeedReader.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/feeds/FeedReader.ts b/src/feeds/FeedReader.ts index c22ebdf6..a9ad64f3 100644 --- a/src/feeds/FeedReader.ts +++ b/src/feeds/FeedReader.ts @@ -89,7 +89,9 @@ export class FeedReader { let seenEntriesChanged = false; - await Promise.all(this.observedFeedUrls.map(async (url) => { + const fetchingStarted = (new Date()).getTime(); + + for (const url of this.observedFeedUrls) { try { const res = await axios.get(url.toString()); const feed = await (new Parser()).parseString(res.data); @@ -135,10 +137,22 @@ export class FeedReader { log.error(error.message); this.queue.push({ eventName: 'feed.error', sender: 'FeedReader', data: error }); } - })); + } if (seenEntriesChanged) await this.saveSeenEntries(); + + const elapsed = (new Date()).getTime() - fetchingStarted; + + let sleepFor: number; + if (elapsed > this.config.pollIntervalSeconds * 1000) { + log.warn(`It tooks us longer to update the feeds than the configured pool interval (${elapsed / 1000}s)`); + sleepFor = 0; + } else { + sleepFor = this.config.pollIntervalSeconds * 1000 - elapsed; + log.debug(`Feed fetching took ${elapsed / 1000}s, sleeping for ${sleepFor / 1000}s`); + } + setTimeout(() => { void this.pollFeeds(); - }, this.config.pollIntervalSeconds * 1000); + }, sleepFor); } }