From 35281e5ed94fe8a15fe29a2ad1790aaf0b8a20b9 Mon Sep 17 00:00:00 2001 From: Rolf Erik Lekang Date: Fri, 14 Feb 2025 20:36:59 +0100 Subject: [PATCH] fix: Add catch all not a feed error --- src/handlers/feed.ts | 69 +++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/src/handlers/feed.ts b/src/handlers/feed.ts index 121cf43..9a177fd 100644 --- a/src/handlers/feed.ts +++ b/src/handlers/feed.ts @@ -1,4 +1,9 @@ -import { BaseError, EmptyParserOutputError } from "../errors"; +import { + BaseError, + EmptyParserOutputError, + NotAFeedError, + ParserError, +} from "../errors"; import { parserKeys, parsers } from "../parsers"; import request from "../request"; import transform from "../transform"; @@ -18,7 +23,7 @@ export async function parseFromString({ parser?: ParserKey; }): Promise { if (parser) { - return parse(parser, content); + return await parse(parser, content); } for (let i = 0; i < parserKeys.length; i++) { try { @@ -55,31 +60,41 @@ export async function parseFromQuery({ const isJsonFeed = ["application/json", "application/feed+json"].includes( contentType, ); - const parsed = await parseFromString({ - content: response.text, - parser: isJsonFeed ? "JSON_FEED_V1" : parser, - }); + const isXmlFeed = + ["application/xml", "text/xml"].includes(contentType) && + /application\/\w+\+xml/; + try { + const parsed = await parseFromString({ + content: response.text, + parser: isJsonFeed ? "JSON_FEED_V1" : parser, + }); - parsed.items = parsed.items?.filter((item) => { - if (item == null) { - return false; - } - if ( - item.date_published && - endTime && - new Date(endTime) < new Date(item.date_published) - ) { - return false; - } - if ( - item.date_published && - startTime && - new Date(startTime) > new Date(item.date_published) - ) { - return false; + parsed.items = parsed.items?.filter((item) => { + if (item == null) { + return false; + } + if ( + item.date_published && + endTime && + new Date(endTime) < new Date(item.date_published) + ) { + return false; + } + if ( + item.date_published && + startTime && + new Date(startTime) > new Date(item.date_published) + ) { + return false; + } + return true; + }); + parsed.feed_url = parsed.feed_url || url; + return parsed; + } catch (error: any) { + if (error instanceof ParserError && !isJsonFeed && !isXmlFeed) { + throw new NotAFeedError(); } - return true; - }); - parsed.feed_url = parsed.feed_url || url; - return parsed; + throw error; + } }