Add timeout to fetching posts

This commit is contained in:
Fabian Stamm 2023-04-26 19:48:27 +02:00
parent 1f4f8003f2
commit 7647399159
3 changed files with 96 additions and 5 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "rss-telegram-bot", "name": "rss-telegram-bot",
"version": "1.0.8", "version": "2.0.0",
"main": "lib/index.js", "main": "lib/index.js",
"author": "Fabian Stamm <dev@fabianstamm.de>", "author": "Fabian Stamm <dev@fabianstamm.de>",
"license": "MIT", "license": "MIT",
@ -42,4 +42,4 @@
"typeorm": "^0.3.15" "typeorm": "^0.3.15"
}, },
"packageManager": "yarn@3.5.0" "packageManager": "yarn@3.5.0"
} }

View File

@ -41,7 +41,15 @@ function calculateHash(item: RSSFeedItem) {
async function checkFeed(feed: Feed) { async function checkFeed(feed: Feed) {
Logging.info("Fetching feed: %s", feed.url); 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.info("Received Data");
Logging.debug(data); Logging.debug(data);
@ -109,9 +117,14 @@ export default async function checkFeeds() {
continue; continue;
} }
await checkFeed(feed);
feed.lastCheck = new Date(); feed.lastCheck = new Date();
await AppDataSource.manager.save(feed); 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);
})
} }
} }

78
src/import_old.ts Normal file
View File

@ -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);
}
}
})