From b5067aa0a910393e6aa50b1f4e4514c09a986ba7 Mon Sep 17 00:00:00 2001 From: WebStreamr <210764791+webstreamr@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:00:34 +0000 Subject: [PATCH] refactor: make BlockedReason an enum --- src/types.ts | 6 +++++- src/utils/Fetcher.ts | 8 ++++---- src/utils/StreamResolver.test.ts | 7 ++++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/types.ts b/src/types.ts index 0279805..40cc5f2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -22,7 +22,11 @@ export enum CountryCode { mx = 'mx', } -export type BlockedReason = 'cloudflare_challenge' | 'flaresolverr_failed' | 'unknown'; +export enum BlockedReason { + cloudflare_challenge = 'cloudflare_challenge', + flaresolverr_failed = 'flaresolverr_failed', + unknown = 'unknown', +} export interface Meta { bytes?: number; diff --git a/src/utils/Fetcher.ts b/src/utils/Fetcher.ts index befd23c..1b095c3 100644 --- a/src/utils/Fetcher.ts +++ b/src/utils/Fetcher.ts @@ -3,7 +3,7 @@ import TTLCache from '@isaacs/ttlcache'; import winston from 'winston'; import { Mutex } from 'async-mutex'; import { Cookie, CookieJar } from 'tough-cookie'; -import { Context, TIMEOUT } from '../types'; +import { BlockedReason, Context, TIMEOUT } from '../types'; import { BlockedError, HttpError, NotFoundError, QueueIsFullError } from '../error'; import { clearTimeout } from 'node:timers'; import { envGet } from './env'; @@ -114,7 +114,7 @@ export class Fetcher { const noFlareSolverr = init?.noFlareSolverr ?? false; const flareSolverrEndpoint = envGet('FLARESOLVERR_ENDPOINT'); if (noFlareSolverr || !flareSolverrEndpoint) { - throw new BlockedError('cloudflare_challenge', httpCacheItem.policy.responseHeaders()); + throw new BlockedError(BlockedReason.cloudflare_challenge, httpCacheItem.policy.responseHeaders()); } this.logger.info(`Query FlareSolverr for ${url.href}`, ctx); @@ -123,7 +123,7 @@ export class Fetcher { const challengeResult = await (await this.queuedFetch(ctx, new URL(flareSolverrEndpoint), { method: 'POST', body: JSON.stringify(body), headers: { 'Content-Type': 'application/json' }, queueLimit: 1 })).json() as FlareSolverrResult; if (challengeResult.status !== 'ok') { this.logger.warn(`FlareSolverr issue: ${JSON.stringify(challengeResult)}`, ctx); - throw new BlockedError('flaresolverr_failed', {}); + throw new BlockedError(BlockedReason.flaresolverr_failed, {}); } challengeResult.solution.cookies.forEach((cookie) => { @@ -156,7 +156,7 @@ export class Fetcher { } if (httpCacheItem.status === 403) { - throw new BlockedError('unknown', httpCacheItem.policy.responseHeaders()); + throw new BlockedError(BlockedReason.unknown, httpCacheItem.policy.responseHeaders()); } throw new HttpError(httpCacheItem.status, httpCacheItem.statusText, responseHeaders); diff --git a/src/utils/StreamResolver.test.ts b/src/utils/StreamResolver.test.ts index 4b2580d..060b45e 100644 --- a/src/utils/StreamResolver.test.ts +++ b/src/utils/StreamResolver.test.ts @@ -4,9 +4,10 @@ import { ExtractorRegistry } from '../extractor'; import { StreamResolver } from './StreamResolver'; import { Handler, MeineCloud, MostraGuarda } from '../handler'; import { Fetcher } from './Fetcher'; -import { Context, CountryCode, TIMEOUT, UrlResult } from '../types'; +import { BlockedReason, Context, CountryCode, TIMEOUT, UrlResult } from '../types'; import { BlockedError, HttpError, NotFoundError, QueueIsFullError } from '../error'; import { ImdbId } from './id'; + jest.mock('../utils/Fetcher'); const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }); @@ -69,7 +70,7 @@ describe('resolve', () => { { url: new URL('https://example.com'), isExternal: true, - error: new BlockedError('cloudflare_challenge', {}), + error: new BlockedError(BlockedReason.cloudflare_challenge, {}), label: 'hoster.com', sourceId: '', meta: { @@ -79,7 +80,7 @@ describe('resolve', () => { { url: new URL('https://example.com'), isExternal: true, - error: new BlockedError('unknown', {}), + error: new BlockedError(BlockedReason.unknown, {}), label: 'hoster.com', sourceId: '', meta: {