refactor: make BlockedReason an enum

This commit is contained in:
WebStreamr 2025-06-12 16:00:34 +00:00
parent 250d6a1323
commit b5067aa0a9
No known key found for this signature in database
3 changed files with 13 additions and 8 deletions

View file

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

View file

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

View file

@ -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: {