From 7647399159091643e525f9758e40ee1d5a4f3fef Mon Sep 17 00:00:00 2001 From: Fabian Stamm Date: Wed, 26 Apr 2023 19:48:27 +0200 Subject: [PATCH] Add timeout to fetching posts --- package.json | 4 +-- src/feed_fetcher.ts | 19 +++++++++-- src/import_old.ts | 78 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 src/import_old.ts diff --git a/package.json b/package.json index aeceb01..f2b70a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rss-telegram-bot", - "version": "1.0.8", + "version": "2.0.0", "main": "lib/index.js", "author": "Fabian Stamm ", "license": "MIT", @@ -42,4 +42,4 @@ "typeorm": "^0.3.15" }, "packageManager": "yarn@3.5.0" -} +} \ No newline at end of file diff --git a/src/feed_fetcher.ts b/src/feed_fetcher.ts index 0a7233b..8bbd369 100644 --- a/src/feed_fetcher.ts +++ b/src/feed_fetcher.ts @@ -41,7 +41,15 @@ function calculateHash(item: RSSFeedItem) { async function checkFeed(feed: Feed) { Logging.info("Fetching feed: %s", feed.url); - let data = await fetch(feed.url).then(res => res.text()); + let timeoutSignal = new AbortController(); + let to = setTimeout(() => { + Logging.warn("Feed %s fetch timed out", feed.url); + timeoutSignal.abort(); + }, 10000); + let data = await fetch(feed.url, { + signal: timeoutSignal.signal + }).then(res => res.text()); + clearTimeout(to); Logging.info("Received Data"); Logging.debug(data); @@ -109,9 +117,14 @@ export default async function checkFeeds() { continue; } - await checkFeed(feed); - feed.lastCheck = new Date(); await AppDataSource.manager.save(feed); + + Promise.resolve(async () => { + await checkFeed(feed); + }).catch(err => { + Logging.warn("Error while checking feed: %s", feed.url); + Logging.error(err); + }) } } diff --git a/src/import_old.ts b/src/import_old.ts new file mode 100644 index 0000000..ad18509 --- /dev/null +++ b/src/import_old.ts @@ -0,0 +1,78 @@ +import { readFileSync } from "fs"; +import { AppDataSource, appDataSourceReady } from "./data_source.js"; +import { Feed } from "./models/Feed.js"; +import { Post } from "./models/Post.js"; +import { User } from "./models/User.js"; + + + +interface IOld { + feeds: { + url: string; + oldEntries: string[]; + subscriber: number[]; + }[]; +} + + +appDataSourceReady.then(async () => { + let old = JSON.parse(readFileSync("./old.json", "utf-8")) as IOld; + + for (let feed of old.feeds) { + let f = await AppDataSource.manager.findOne(Feed, { + where: { + url: feed.url + } + }) + + if (!f) { + f = AppDataSource.manager.create(Feed, { + url: feed.url, + lastCheck: new Date(0), + oldEntries: [], + subscriber: [], + }) + + await AppDataSource.manager.save(f); + } + + for (let oldEntry of feed.oldEntries) { + let existing = await AppDataSource.manager.findOne(Post, { + where: { + feed: f, + hash: oldEntry + } + }) + if (!existing) { + + let post = AppDataSource.manager.create(Post, { + feed: f, + hash: oldEntry + }) + + await AppDataSource.manager.save(post); + } + } + + for (let subscriber of feed.subscriber) { + let user = await AppDataSource.manager.findOne(User, { + where: { + chatid: subscriber + }, + relations: { + feeds: true + } + }); + + if (!user) { + user = AppDataSource.manager.create(User, { + chatid: subscriber, + feeds: [f], + }) + } else { + user.feeds.push(f) + } + await AppDataSource.manager.save(user); + } + } +}) \ No newline at end of file