import { ErrorCodes, TransportableError } from "../../lib/error";import { Meta } from ".";import { Engine, FeatureFlag } from "./engines"; export class EngineError extends Error { constructor(message?: string, options?: ErrorOptions) { super(message, options); }} export class NoEnginesLeftError extends TransportableError { public fallbackList: Engine[]; constructor(fallbackList: Engine[]) { super( "SCRAPE_ALL_ENGINES_FAILED", "All scraping engines failed! -- Double check the URL to make sure it's not broken. If the issue persists, contact us at help@firecrawl.com.", ); this.fallbackList = fallbackList; } serialize() { return { ...super.serialize(), fallbackList: this.fallbackList, }; } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new NoEnginesLeftError(data.fallbackList); x.stack = data.stack; return x; }} export class AddFeatureError extends Error { public featureFlags: FeatureFlag[]; public pdfPrefetch: Meta["pdfPrefetch"]; constructor(featureFlags: FeatureFlag[], pdfPrefetch?: Meta["pdfPrefetch"]) { super("New feature flags have been discovered: " + featureFlags.join(", ")); this.featureFlags = featureFlags; this.pdfPrefetch = pdfPrefetch; }} export class RemoveFeatureError extends Error { public featureFlags: FeatureFlag[]; constructor(featureFlags: FeatureFlag[]) { super( "Incorrect feature flags have been discovered: " + featureFlags.join(", "), ); this.featureFlags = featureFlags; }} export class SSLError extends TransportableError { constructor(public skipTlsVerification: boolean) { super( "SCRAPE_SSL_ERROR", "An SSL error occurred while scraping the URL. " + (skipTlsVerification ? "Since you have `skipTlsVerification` enabled, this means that the TLS configuration of the target site is completely broken. Try scraping the plain HTTP version of the page." : "If you're not inputting any sensitive data, try scraping with `skipTlsVerification: true`."), ); } serialize() { return { ...super.serialize(), skipTlsVerification: this.skipTlsVerification, }; } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new SSLError(data.skipTlsVerification); x.stack = data.stack; return x; }} export class SiteError extends TransportableError { constructor(public errorCode: string) { super( "SCRAPE_SITE_ERROR", "Specified URL is failing to load in the browser. Error code: " + errorCode, ); } serialize() { return { ...super.serialize(), errorCode: this.errorCode, }; } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new SiteError(data.errorCode); x.stack = data.stack; return x; }} export class ActionError extends TransportableError { constructor(public errorCode: string) { super( "SCRAPE_ACTION_ERROR", "Action(s) failed to complete. Error code: " + errorCode, ); } serialize() { return { ...super.serialize(), errorCode: this.errorCode, }; } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new ActionError(data.errorCode); x.stack = data.stack; return x; }} export class UnsupportedFileError extends TransportableError { constructor(public reason: string) { super( "SCRAPE_UNSUPPORTED_FILE_ERROR", "Scrape resulted in unsupported file: " + reason, ); } serialize() { return { ...super.serialize(), reason: this.reason, }; } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new UnsupportedFileError(data.reason); x.stack = data.stack; return x; }} export class PDFAntibotError extends TransportableError { constructor() { super("SCRAPE_PDF_ANTIBOT_ERROR", "PDF scrape was prevented by anti-bot"); } serialize() { return super.serialize(); } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new PDFAntibotError(); x.stack = data.stack; return x; }} export class PDFInsufficientTimeError extends TransportableError { constructor( public pageCount: number, public minTimeout: number, ) { super( "SCRAPE_PDF_INSUFFICIENT_TIME_ERROR", `Insufficient time to process PDF of ${pageCount} pages. Please increase the timeout parameter in your scrape request to at least ${minTimeout}ms.`, ); } serialize() { return { ...super.serialize(), pageCount: this.pageCount, minTimeout: this.minTimeout, }; } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new PDFInsufficientTimeError(data.pageCount, data.minTimeout); x.stack = data.stack; return x; }} export class DNSResolutionError extends TransportableError { constructor(public hostname: string) { super( "SCRAPE_DNS_RESOLUTION_ERROR", `DNS resolution failed for hostname: ${hostname}. Please check if the domain is valid and accessible.`, ); } serialize() { return { ...super.serialize(), hostname: this.hostname, }; } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new DNSResolutionError(data.hostname); x.stack = data.stack; return x; }} export class IndexMissError extends Error { constructor() { super("Index doesn't have the page we're looking for"); }} export class ZDRViolationError extends TransportableError { constructor(public feature: string) { super( "SCRAPE_ZDR_VIOLATION_ERROR", `${feature} is not supported when using zeroDataRetention. Please contact support@firecrawl.com to unblock this feature.`, ); } serialize() { return { ...super.serialize(), feature: this.feature, }; } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new ZDRViolationError(data.feature); x.stack = data.stack; return x; }} export class PDFPrefetchFailed extends TransportableError { constructor() { super( "SCRAPE_PDF_PREFETCH_FAILED", "Failed to prefetch PDF that is protected by anti-bot. Please contact help@firecrawl.com", ); } serialize() { return super.serialize(); } static deserialize( _: ErrorCodes, data: ReturnType<typeof this.prototype.serialize>, ) { const x = new PDFPrefetchFailed(); x.stack = data.stack; return x; }} export class FEPageLoadFailed extends Error { constructor() { super( "The page failed to load with the specified timeout. Please increase the timeout parameter in your request.", ); }} export class EngineSnipedError extends Error { name = "EngineSnipedError"; constructor() { super("Engine got sniped"); }} export class EngineUnsuccessfulError extends Error { name = "EngineUnsuccessfulError"; constructor(engine: Engine) { super(`Engine ${engine} was unsuccessful`); }} export class WaterfallNextEngineSignal extends Error { name = "WaterfallNextEngineSignal"; constructor() { super("Waterfall next engine"); }}
import { ErrorCodes, TransportableError } from "../../lib/error";
import { Meta } from ".";
import { Engine, FeatureFlag } from "./engines";
export class EngineError extends Error {
constructor(message?: string, options?: ErrorOptions) {
super(message, options);
}
}
export class NoEnginesLeftError extends TransportableError {
public fallbackList: Engine[];
constructor(fallbackList: Engine[]) {
super(
"SCRAPE_ALL_ENGINES_FAILED",
"All scraping engines failed! -- Double check the URL to make sure it's not broken. If the issue persists, contact us at help@firecrawl.com.",
);
this.fallbackList = fallbackList;
}
serialize() {
return {
...super.serialize(),
fallbackList: this.fallbackList,
};
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new NoEnginesLeftError(data.fallbackList);
x.stack = data.stack;
return x;
}
}
export class AddFeatureError extends Error {
public featureFlags: FeatureFlag[];
public pdfPrefetch: Meta["pdfPrefetch"];
constructor(featureFlags: FeatureFlag[], pdfPrefetch?: Meta["pdfPrefetch"]) {
super("New feature flags have been discovered: " + featureFlags.join(", "));
this.featureFlags = featureFlags;
this.pdfPrefetch = pdfPrefetch;
}
}
export class RemoveFeatureError extends Error {
public featureFlags: FeatureFlag[];
constructor(featureFlags: FeatureFlag[]) {
super(
"Incorrect feature flags have been discovered: " +
featureFlags.join(", "),
);
this.featureFlags = featureFlags;
}
}
export class SSLError extends TransportableError {
constructor(public skipTlsVerification: boolean) {
super(
"SCRAPE_SSL_ERROR",
"An SSL error occurred while scraping the URL. " +
(skipTlsVerification
? "Since you have `skipTlsVerification` enabled, this means that the TLS configuration of the target site is completely broken. Try scraping the plain HTTP version of the page."
: "If you're not inputting any sensitive data, try scraping with `skipTlsVerification: true`."),
);
}
serialize() {
return {
...super.serialize(),
skipTlsVerification: this.skipTlsVerification,
};
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new SSLError(data.skipTlsVerification);
x.stack = data.stack;
return x;
}
}
export class SiteError extends TransportableError {
constructor(public errorCode: string) {
super(
"SCRAPE_SITE_ERROR",
"Specified URL is failing to load in the browser. Error code: " +
errorCode,
);
}
serialize() {
return {
...super.serialize(),
errorCode: this.errorCode,
};
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new SiteError(data.errorCode);
x.stack = data.stack;
return x;
}
}
export class ActionError extends TransportableError {
constructor(public errorCode: string) {
super(
"SCRAPE_ACTION_ERROR",
"Action(s) failed to complete. Error code: " + errorCode,
);
}
serialize() {
return {
...super.serialize(),
errorCode: this.errorCode,
};
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new ActionError(data.errorCode);
x.stack = data.stack;
return x;
}
}
export class UnsupportedFileError extends TransportableError {
constructor(public reason: string) {
super(
"SCRAPE_UNSUPPORTED_FILE_ERROR",
"Scrape resulted in unsupported file: " + reason,
);
}
serialize() {
return {
...super.serialize(),
reason: this.reason,
};
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new UnsupportedFileError(data.reason);
x.stack = data.stack;
return x;
}
}
export class PDFAntibotError extends TransportableError {
constructor() {
super("SCRAPE_PDF_ANTIBOT_ERROR", "PDF scrape was prevented by anti-bot");
}
serialize() {
return super.serialize();
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new PDFAntibotError();
x.stack = data.stack;
return x;
}
}
export class PDFInsufficientTimeError extends TransportableError {
constructor(
public pageCount: number,
public minTimeout: number,
) {
super(
"SCRAPE_PDF_INSUFFICIENT_TIME_ERROR",
`Insufficient time to process PDF of ${pageCount} pages. Please increase the timeout parameter in your scrape request to at least ${minTimeout}ms.`,
);
}
serialize() {
return {
...super.serialize(),
pageCount: this.pageCount,
minTimeout: this.minTimeout,
};
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new PDFInsufficientTimeError(data.pageCount, data.minTimeout);
x.stack = data.stack;
return x;
}
}
export class DNSResolutionError extends TransportableError {
constructor(public hostname: string) {
super(
"SCRAPE_DNS_RESOLUTION_ERROR",
`DNS resolution failed for hostname: ${hostname}. Please check if the domain is valid and accessible.`,
);
}
serialize() {
return {
...super.serialize(),
hostname: this.hostname,
};
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new DNSResolutionError(data.hostname);
x.stack = data.stack;
return x;
}
}
export class IndexMissError extends Error {
constructor() {
super("Index doesn't have the page we're looking for");
}
}
export class ZDRViolationError extends TransportableError {
constructor(public feature: string) {
super(
"SCRAPE_ZDR_VIOLATION_ERROR",
`${feature} is not supported when using zeroDataRetention. Please contact support@firecrawl.com to unblock this feature.`,
);
}
serialize() {
return {
...super.serialize(),
feature: this.feature,
};
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new ZDRViolationError(data.feature);
x.stack = data.stack;
return x;
}
}
export class PDFPrefetchFailed extends TransportableError {
constructor() {
super(
"SCRAPE_PDF_PREFETCH_FAILED",
"Failed to prefetch PDF that is protected by anti-bot. Please contact help@firecrawl.com",
);
}
serialize() {
return super.serialize();
}
static deserialize(
_: ErrorCodes,
data: ReturnType<typeof this.prototype.serialize>,
) {
const x = new PDFPrefetchFailed();
x.stack = data.stack;
return x;
}
}
export class FEPageLoadFailed extends Error {
constructor() {
super(
"The page failed to load with the specified timeout. Please increase the timeout parameter in your request.",
);
}
}
export class EngineSnipedError extends Error {
name = "EngineSnipedError";
constructor() {
super("Engine got sniped");
}
}
export class EngineUnsuccessfulError extends Error {
name = "EngineUnsuccessfulError";
constructor(engine: Engine) {
super(`Engine ${engine} was unsuccessful`);
}
}
export class WaterfallNextEngineSignal extends Error {
name = "WaterfallNextEngineSignal";
constructor() {
super("Waterfall next engine");
}
}