sfiledl 1.0.2 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,19 +0,0 @@
1
- {
2
- "version": 3,
3
- "file": "index.cjs",
4
- "sources": [
5
- "../src/index.ts"
6
- ],
7
- "sourcesContent": [
8
- "#!/usr/bin/env node\nimport {\n\tchromium,\n\ttype Browser,\n\ttype BrowserContext,\n\ttype Page,\n\ttype Download,\n\ttype Response,\n\ttype LaunchOptions,\n\ttype BrowserContextOptions,\n} from 'playwright'\nimport { promises as fs } from 'fs'\nimport { join, basename } from 'path'\nimport { tmpdir } from 'os'\nimport { exit } from 'process'\ntype Result<T, E extends Error = Error> =\n\t| { readonly success: true; readonly value: T }\n\t| { readonly success: false; readonly error: E }\nconst isOk = <T, E extends Error>(\n\tresult: Result<T, E>,\n): result is Result<T, E> & {\n\treadonly success: true\n\treadonly value: T\n} => result.success\nconst isErr = <T, E extends Error>(\n\tresult: Result<T, E>,\n): result is Result<T, E> & {\n\treadonly success: false\n\treadonly error: E\n} => !result.success\nconst safeStringify = (value: unknown, space?: number): string => {\n\ttry {\n\t\treturn JSON.stringify(value, null, space)\n\t} catch {\n\t\treturn '[Circular or unserializable]'\n\t}\n}\nconst sanitizeFilename = (name: string, replacement = '_'): string => {\n\tconst sanitized = name\n\t\t.replace(/[<>:\"/\\\\|?*\\x00-\\x1F]/g, replacement)\n\t\t.replace(new RegExp(`${replacement}+`, 'g'), replacement)\n\t\t.trim()\n\t\t.slice(0, 255)\n\treturn sanitized || 'file.bin'\n}\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms))\nabstract class AppError extends Error {\n\treadonly timestamp: string\n\treadonly context: Record<string, unknown> | undefined\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly retryable: boolean = true,\n\t\tcontext?: Record<string, unknown>,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = this.constructor.name\n\t\tthis.timestamp = new Date().toISOString()\n\t\tthis.context = context !== undefined ? Object.freeze({ ...context }) : undefined\n\t\tError.captureStackTrace?.(this, this.constructor)\n\t}\n\ttoJSON(): Record<string, unknown> {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tmessage: this.message,\n\t\t\tcode: this.code,\n\t\t\tretryable: this.retryable,\n\t\t\ttimestamp: this.timestamp,\n\t\t\tcontext: this.context,\n\t\t\tstack: process.env['NODE_ENV'] === 'development' ? this.stack : undefined,\n\t\t}\n\t}\n}\nclass ValidationError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'VALIDATION_ERROR', false, context)\n\t}\n}\nclass NetworkError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'NETWORK_ERROR', true, context)\n\t}\n}\nclass FileError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'FILE_ERROR', false, context)\n\t}\n}\nclass BrowserError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'BROWSER_ERROR', true, context)\n\t}\n}\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR'\ninterface LogEntry {\n\treadonly timestamp: string\n\treadonly level: LogLevel\n\treadonly message: string\n\treadonly context?: Readonly<Record<string, unknown>>\n}\nclass Logger {\n\tprivate static readonly LEVELS: Readonly<Record<LogLevel, number>> = Object.freeze({\n\t\tDEBUG: 0,\n\t\tINFO: 1,\n\t\tWARN: 2,\n\t\tERROR: 3,\n\t})\n\tprivate minLevel: LogLevel\n\tprivate entries: LogEntry[] = []\n\tprivate maxEntries = 1000\n\tprivate logFile?: string\n\tconstructor(minLevel: LogLevel = 'INFO') {\n\t\tthis.minLevel = minLevel\n\t}\n\tsetLogLevel(level: LogLevel): void {\n\t\tthis.minLevel = level\n\t}\n\tuseLogFile(path: string): void {\n\t\tthis.logFile = path\n\t}\n\tprivate shouldLog(level: LogLevel): boolean {\n\t\treturn Logger.LEVELS[level] >= Logger.LEVELS[this.minLevel]\n\t}\n\tprivate format(entry: LogEntry): string {\n\t\tconst ctx = entry.context !== undefined ? ` ${safeStringify(entry.context)}` : ''\n\t\treturn `[${entry.timestamp}] ${entry.level}: ${entry.message}${ctx}`\n\t}\n\tprivate record(entry: LogEntry): void {\n\t\tthis.entries.push(entry)\n\t\tif (this.entries.length > this.maxEntries) {\n\t\t\tthis.entries.shift()\n\t\t}\n\t}\n\tprivate output(entry: LogEntry): void {\n\t\tconst formatted = this.format(entry)\n\t\tconst outputFn = entry.level === 'ERROR' ? console.error : console.log\n\t\toutputFn(formatted)\n\t\tif (this.logFile !== undefined) {\n\t\t\tvoid fs.appendFile(this.logFile, `${formatted}\\n`).catch(() => {})\n\t\t}\n\t}\n\tlog(level: LogLevel, message: string, context?: Record<string, unknown>): void {\n\t\tif (!this.shouldLog(level)) return\n\t\tconst entry: LogEntry = {\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tlevel,\n\t\t\tmessage,\n\t\t\t...(context !== undefined\n\t\t\t\t? { context: Object.freeze({ ...context }) as Readonly<Record<string, unknown>> }\n\t\t\t\t: {}),\n\t\t}\n\t\tthis.record(entry)\n\t\tthis.output(entry)\n\t}\n\tdebug(message: string, context?: Record<string, unknown>): void {\n\t\tthis.log('DEBUG', message, context)\n\t}\n\tinfo(message: string, context?: Record<string, unknown>): void {\n\t\tthis.log('INFO', message, context)\n\t}\n\twarn(message: string, context?: Record<string, unknown>): void {\n\t\tthis.log('WARN', message, context)\n\t}\n\terror(message: string, context?: Record<string, unknown>): void {\n\t\tthis.log('ERROR', message, context)\n\t}\n\tgetEntries(level?: LogLevel): readonly LogEntry[] {\n\t\tif (level === undefined) return [...this.entries]\n\t\treturn this.entries.filter((e) => e.level === level)\n\t}\n}\ninterface CliFlags {\n\treadonly help: boolean\n\treadonly debug: boolean\n\treadonly headless: boolean\n\treadonly proxy?: string\n\treadonly logFile?: string\n\treadonly json: boolean\n\treadonly batch?: string\n\treadonly concurrency: number\n\treadonly retry: number\n\treadonly timeout: number\n}\ninterface CliArgs {\n\treadonly url?: string\n\treadonly saveDir?: string\n\treadonly flags: CliFlags\n\treadonly errors: readonly string[]\n}\nclass CliFlagsBuilder implements CliFlags {\n\thelp = false\n\tdebug = false\n\theadless = true\n\tproxy?: string\n\tlogFile?: string\n\tjson = false\n\tbatch?: string\n\tconcurrency = 1\n\tretry = 3\n\ttimeout = 60000\n\tbuild(): CliFlags {\n\t\tconst flags: CliFlags = {\n\t\t\thelp: this.help,\n\t\t\tdebug: this.debug,\n\t\t\theadless: this.headless,\n\t\t\tjson: this.json,\n\t\t\tconcurrency: this.concurrency,\n\t\t\tretry: this.retry,\n\t\t\ttimeout: this.timeout,\n\t\t\t...(this.proxy !== undefined && { proxy: this.proxy }),\n\t\t\t...(this.logFile !== undefined && { logFile: this.logFile }),\n\t\t\t...(this.batch !== undefined && { batch: this.batch }),\n\t\t}\n\t\treturn Object.freeze(flags)\n\t}\n}\nclass CliParser {\n\tstatic parse(argv: readonly string[]): CliArgs {\n\t\tconst args = argv.slice(2)\n\t\tconst flags = new CliFlagsBuilder()\n\t\tconst positional: string[] = []\n\t\tconst errors: string[] = []\n\t\tfor (let i = 0; i < args.length; i++) {\n\t\t\tconst arg = args[i]\n\t\t\tif (arg === undefined || arg === null) continue\n\t\t\tif (arg === '--') {\n\t\t\t\tpositional.push(\n\t\t\t\t\t...args.slice(i + 1).filter((a): a is string => a !== undefined && a !== null),\n\t\t\t\t)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (arg.startsWith('--')) {\n\t\t\t\tconst [key, ...valueParts] = arg.slice(2).split('=')\n\t\t\t\tif (key === undefined || key === '') continue\n\t\t\t\tlet value: string\n\t\t\t\tif (valueParts.length > 0) {\n\t\t\t\t\tvalue = valueParts.join('=')\n\t\t\t\t} else if (i + 1 < args.length) {\n\t\t\t\t\tconst nextArg = args[i + 1]\n\t\t\t\t\tif (\n\t\t\t\t\t\tnextArg !== undefined &&\n\t\t\t\t\t\ttypeof nextArg === 'string' &&\n\t\t\t\t\t\t!nextArg.startsWith('-')\n\t\t\t\t\t) {\n\t\t\t\t\t\tvalue = nextArg\n\t\t\t\t\t\ti++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = 'true'\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvalue = 'true'\n\t\t\t\t}\n\t\t\t\tCliParser.setFlag(flags, key, value ?? 'true', errors)\n\t\t\t} else if (typeof arg === 'string' && arg.startsWith('-') && arg.length === 2) {\n\t\t\t\tconst key = arg[1]\n\t\t\t\tif (key === undefined || key === '') continue\n\t\t\t\tconst next = args[i + 1]\n\t\t\t\tconst value =\n\t\t\t\t\tnext !== undefined &&\n\t\t\t\t\ttypeof next === 'string' &&\n\t\t\t\t\tnext !== '-' &&\n\t\t\t\t\t!next.startsWith('-')\n\t\t\t\t\t\t? args[++i]\n\t\t\t\t\t\t: 'true'\n\t\t\t\tCliParser.setFlag(flags, key, value ?? 'true', errors)\n\t\t\t} else if (typeof arg === 'string' && arg.startsWith('-') && arg.length > 2) {\n\t\t\t\tfor (let j = 1; j < arg.length; j++) {\n\t\t\t\t\tconst char = arg[j]\n\t\t\t\t\tif (char !== undefined && char !== '') {\n\t\t\t\t\t\tCliParser.setFlag(flags, char, 'true', errors)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof arg === 'string') {\n\t\t\t\tpositional.push(arg)\n\t\t\t}\n\t\t}\n\t\tconst url = positional[0]\n\t\tconst saveDir = positional[1]\n\t\tif (flags.concurrency < 1 || flags.concurrency > 20) {\n\t\t\terrors.push('--concurrency must be 1-20')\n\t\t}\n\t\tif (flags.retry < 1 || flags.retry > 10) {\n\t\t\terrors.push('--retry must be 1-10')\n\t\t}\n\t\tif (flags.timeout < 1000) {\n\t\t\terrors.push('--timeout must be >= 1000ms')\n\t\t}\n\t\treturn {\n\t\t\turl,\n\t\t\tsaveDir,\n\t\t\tflags: flags.build(),\n\t\t\terrors: Object.freeze(errors),\n\t\t} as unknown as CliArgs\n\t}\n\tprivate static setFlag(\n\t\tflags: CliFlagsBuilder,\n\t\tkey: string,\n\t\tvalue: string,\n\t\terrors: string[],\n\t): void {\n\t\tconst normalized = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n\t\tswitch (normalized) {\n\t\t\tcase 'help':\n\t\t\tcase 'h':\n\t\t\t\tflags.help = value === 'true'\n\t\t\t\tbreak\n\t\t\tcase 'debug':\n\t\t\t\tflags.debug = value === 'true'\n\t\t\t\tbreak\n\t\t\tcase 'headless':\n\t\t\t\tflags.headless = value !== 'false'\n\t\t\t\tbreak\n\t\t\tcase 'proxy':\n\t\t\t\tflags.proxy = value\n\t\t\t\tbreak\n\t\t\tcase 'logfile':\n\t\t\tcase 'log-file':\n\t\t\t\tflags.logFile = value\n\t\t\t\tbreak\n\t\t\tcase 'json':\n\t\t\t\tflags.json = value === 'true'\n\t\t\t\tbreak\n\t\t\tcase 'batch':\n\t\t\t\tflags.batch = value\n\t\t\t\tbreak\n\t\t\tcase 'concurrency': {\n\t\t\t\tconst num = Number(value)\n\t\t\t\tif (Number.isFinite(num)) flags.concurrency = num\n\t\t\t\telse errors.push(`Invalid concurrency: ${value}`)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'retry': {\n\t\t\t\tconst num = Number(value)\n\t\t\t\tif (Number.isFinite(num)) flags.retry = num\n\t\t\t\telse errors.push(`Invalid retry: ${value}`)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'timeout': {\n\t\t\t\tconst num = Number(value)\n\t\t\t\tif (Number.isFinite(num)) flags.timeout = num\n\t\t\t\telse errors.push(`Invalid timeout: ${value}`)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\terrors.push(`Unknown flag: --${key}`)\n\t\t\t\tbreak\n\t\t}\n\t}\n}\ninterface BrowserConfig {\n\treadonly headless: boolean\n\treadonly userAgent: string\n\treadonly viewport?: {\n\t\treadonly width: number\n\t\treadonly height: number\n\t}\n\treadonly proxy?: {\n\t\treadonly server: string\n\t\treadonly username?: string\n\t\treadonly password?: string\n\t}\n\treadonly acceptDownloads: true\n}\ninterface DownloadResult {\n\treadonly filename: string\n\treadonly savePath: string\n\treadonly size: number\n\treadonly method: 'direct' | 'fallback'\n}\nclass BrowserManager implements AsyncDisposable {\n\tprivate browser: Browser | null = null\n\tprivate context: BrowserContext | null = null\n\tprivate page: Page | null = null\n\tprivate readonly logger: Logger\n\tprivate readonly config: BrowserConfig\n\tconstructor(logger: Logger, config: Partial<BrowserConfig>) {\n\t\tthis.logger = logger\n\t\tconst maybeViewport = config.viewport\n\t\tconst maybeProxy = config.proxy\n\t\tconst browserConfig: BrowserConfig = {\n\t\t\theadless: config.headless ?? true,\n\t\t\tuserAgent:\n\t\t\t\tconfig.userAgent ??\n\t\t\t\t'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',\n\t\t\tacceptDownloads: true,\n\t\t\t...(maybeViewport !== undefined && { viewport: maybeViewport }),\n\t\t\t...(maybeProxy !== undefined && { proxy: maybeProxy }),\n\t\t}\n\t\tthis.config = Object.freeze(browserConfig)\n\t}\n\tasync launch(): Promise<Result<void, BrowserError>> {\n\t\ttry {\n\t\t\tthis.logger.debug('Launching browser', { headless: this.config.headless })\n\t\t\tconst launchOptions: LaunchOptions = {\n\t\t\t\theadless: this.config.headless,\n\t\t\t\targs: [\n\t\t\t\t\t'--no-sandbox',\n\t\t\t\t\t'--disable-setuid-sandbox',\n\t\t\t\t\t'--disable-dev-shm-usage',\n\t\t\t\t\t'--disable-gpu',\n\t\t\t\t\t'--disable-blink-features=AutomationControlled',\n\t\t\t\t],\n\t\t\t}\n\t\t\tif (this.config.proxy !== undefined) {\n\t\t\t\tconst proxyOpts: LaunchOptions['proxy'] = {\n\t\t\t\t\tserver: this.config.proxy.server,\n\t\t\t\t}\n\t\t\t\tif (this.config.proxy.username !== undefined) {\n\t\t\t\t\t;(proxyOpts as any).username = this.config.proxy.username\n\t\t\t\t}\n\t\t\t\tif (this.config.proxy.password !== undefined) {\n\t\t\t\t\t;(proxyOpts as any).password = this.config.proxy.password\n\t\t\t\t}\n\t\t\t\tlaunchOptions.proxy = proxyOpts\n\t\t\t}\n\t\t\tthis.browser = await chromium.launch(launchOptions)\n\t\t\tconst contextOptions: BrowserContextOptions = {\n\t\t\t\tuserAgent: this.config.userAgent,\n\t\t\t\tacceptDownloads: this.config.acceptDownloads,\n\t\t\t\tlocale: 'en-US',\n\t\t\t\ttimezoneId: 'UTC',\n\t\t\t}\n\t\t\tif (this.config.viewport !== undefined) {\n\t\t\t\tcontextOptions.viewport = this.config.viewport\n\t\t\t}\n\t\t\tthis.context = await this.browser.newContext(contextOptions)\n\t\t\tawait this.context.addCookies([\n\t\t\t\t{\n\t\t\t\t\tname: 'safe_link_counter',\n\t\t\t\t\tvalue: '1',\n\t\t\t\t\tdomain: '.sfile.co',\n\t\t\t\t\tpath: '/',\n\t\t\t\t\texpires: Math.floor(Date.now() / 1000) + 3600,\n\t\t\t\t},\n\t\t\t])\n\t\t\tthis.page = await this.context.newPage()\n\t\t\tthis.setupListeners()\n\t\t\tthis.logger.info('Browser launched successfully')\n\t\t\treturn { success: true, value: undefined }\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\tthis.logger.error('Browser launch failed', { error: error.message })\n\t\t\tawait this.cleanup()\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: new BrowserError(`Launch failed: ${error.message}`, {\n\t\t\t\t\toriginal: error.name,\n\t\t\t\t}),\n\t\t\t}\n\t\t}\n\t}\n\tprivate setupListeners(): void {\n\t\tif (this.page === null) return\n\t\tthis.page.on('console', (msg) => {\n\t\t\tconst type = msg.type()\n\t\t\tif (type === 'error' || type === 'warning') {\n\t\t\t\tconst level: LogLevel = type === 'error' ? 'ERROR' : 'WARN'\n\t\t\t\tthis.logger.log(level, `[CONSOLE] ${msg.text()}`, { location: msg.location().url })\n\t\t\t}\n\t\t})\n\t\tthis.page.on('pageerror', (err) => {\n\t\t\tthis.logger.error('[PAGE ERROR]', { message: err.message })\n\t\t})\n\t}\n\tasync navigate(\n\t\turl: string,\n\t\toptions?: {\n\t\t\treadonly waitUntil?: 'load' | 'domcontentloaded' | 'networkidle' | 'commit'\n\t\t\treadonly timeout?: number\n\t\t},\n\t): Promise<Result<void, NetworkError>> {\n\t\tif (this.page === null) {\n\t\t\treturn { success: false, error: new NetworkError('Page not initialized') }\n\t\t}\n\t\ttry {\n\t\t\tawait this.page.goto(url, {\n\t\t\t\twaitUntil: options?.waitUntil ?? 'networkidle',\n\t\t\t\ttimeout: options?.timeout ?? 60000,\n\t\t\t})\n\t\t\treturn { success: true, value: undefined }\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: new NetworkError(`Navigation failed: ${error.message}`),\n\t\t\t}\n\t\t}\n\t}\n\tasync waitForDownloadButton(timeout = 30000): Promise<Result<void, Error>> {\n\t\tif (this.page === null) {\n\t\t\treturn { success: false, error: new Error('Page not initialized') }\n\t\t}\n\t\ttry {\n\t\t\tconst button = this.page.locator('#download')\n\t\t\tawait button.waitFor({ state: 'visible', timeout })\n\t\t\tawait this.page.waitForFunction(\n\t\t\t\t() => {\n\t\t\t\t\tconst btn = document.querySelector('#download') as HTMLAnchorElement | null\n\t\t\t\t\tif (btn === null) return false\n\t\t\t\t\tconst href = btn.getAttribute('href')\n\t\t\t\t\tconst style = window.getComputedStyle(btn)\n\t\t\t\t\treturn href !== null && href !== '#' && style.pointerEvents !== 'none'\n\t\t\t\t},\n\t\t\t\t{ timeout },\n\t\t\t)\n\t\t\treturn { success: true, value: undefined }\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\treturn { success: false, error }\n\t\t}\n\t}\n\tasync extractDownloadUrl(): Promise<Result<string, Error>> {\n\t\tif (this.page === null) {\n\t\t\treturn { success: false, error: new Error('Page not initialized') }\n\t\t}\n\t\ttry {\n\t\t\tconst href = await this.page.$eval('#download', (el: Element) => {\n\t\t\t\tconst anchor = el as HTMLAnchorElement\n\t\t\t\treturn anchor.href\n\t\t\t})\n\t\t\tif (href === null || href === '' || href === '#') {\n\t\t\t\treturn { success: false, error: new Error('Invalid download href') }\n\t\t\t}\n\t\t\treturn { success: true, value: href }\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\treturn { success: false, error }\n\t\t}\n\t}\n\tasync waitForDownload(timeout = 60000): Promise<Result<Download, Error>> {\n\t\tif (this.page === null) {\n\t\t\treturn { success: false, error: new Error('Page not initialized') }\n\t\t}\n\t\ttry {\n\t\t\tconst download = await this.page.waitForEvent('download', { timeout })\n\t\t\treturn { success: true, value: download }\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\treturn { success: false, error }\n\t\t}\n\t}\n\tasync collectResponses(waitMs = 3000): Promise<readonly Response[]> {\n\t\tif (this.page === null) return []\n\t\tconst responses: Response[] = []\n\t\tconst handler = (res: Response) => {\n\t\t\tresponses.push(res)\n\t\t}\n\t\tthis.page.on('response', handler)\n\t\tawait sleep(waitMs)\n\t\tthis.page.off('response', handler)\n\t\treturn Object.freeze(responses)\n\t}\n\tfindFileResponse(responses: readonly Response[]): Response | undefined {\n\t\treturn responses\n\t\t\t.slice()\n\t\t\t.reverse()\n\t\t\t.find((r) => {\n\t\t\t\tconst headers = r.headers()\n\t\t\t\tconst disposition = headers['content-disposition']\n\t\t\t\treturn (\n\t\t\t\t\t(disposition !== undefined && disposition.includes('attachment')) ||\n\t\t\t\t\tr.url().includes('/downloadfile/')\n\t\t\t\t)\n\t\t\t})\n\t}\n\tasync saveDebugArtifacts(errorMessage: string): Promise<Result<string, Error>> {\n\t\tif (this.page === null) {\n\t\t\treturn { success: false, error: new Error('Page not available') }\n\t\t}\n\t\ttry {\n\t\t\tconst debugDir = join(tmpdir(), `sfile_debug_${Date.now()}`)\n\t\t\tawait fs.mkdir(debugDir, { recursive: true })\n\t\t\tawait Promise.all([\n\t\t\t\tthis.page.screenshot({ path: join(debugDir, 'error.png'), fullPage: true }),\n\t\t\t\tfs.writeFile(join(debugDir, 'error.html'), await this.page.content()),\n\t\t\t\tfs.writeFile(join(debugDir, 'error.txt'), errorMessage),\n\t\t\t])\n\t\t\treturn { success: true, value: debugDir }\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: new FileError(`Failed to save artifacts: ${error.message}`),\n\t\t\t}\n\t\t}\n\t}\n\tprivate async cleanup(): Promise<void> {\n\t\tif (this.page !== null) {\n\t\t\tawait this.page.close().catch(() => {})\n\t\t\tthis.page = null\n\t\t}\n\t\tif (this.context !== null) {\n\t\t\tawait this.context.close().catch(() => {})\n\t\t\tthis.context = null\n\t\t}\n\t\tif (this.browser !== null) {\n\t\t\tawait this.browser.close().catch(() => {})\n\t\t\tthis.browser = null\n\t\t}\n\t}\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\tthis.logger.debug('Closing browser resources...')\n\t\tawait this.cleanup()\n\t\tthis.logger.info('Browser resources closed')\n\t}\n\t[Symbol.dispose](): void {\n\t\tvoid this[Symbol.asyncDispose]()\n\t}\n}\ninterface DownloaderConfig {\n\treadonly saveDir: string\n\treadonly timeout: number\n\treadonly retryAttempts: number\n}\nclass Downloader {\n\tprivate readonly logger: Logger\n\tprivate readonly config: DownloaderConfig\n\tconstructor(logger: Logger, config: DownloaderConfig) {\n\t\tthis.logger = logger\n\t\tthis.config = Object.freeze(config)\n\t}\n\tasync download(url: string): Promise<Result<DownloadResult, AppError>> {\n\t\tif (!url.includes('sfile.co')) {\n\t\t\treturn { success: false, error: new ValidationError('Invalid sfile.co URL', { url }) }\n\t\t}\n\t\ttry {\n\t\t\tawait fs.mkdir(this.config.saveDir, { recursive: true })\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: new FileError(`Failed to create save dir: ${error.message}`),\n\t\t\t}\n\t\t}\n\t\tlet lastError: AppError | undefined\n\t\tfor (let attempt = 1; attempt <= this.config.retryAttempts; attempt++) {\n\t\t\tthis.logger.info(`Download attempt ${attempt}/${this.config.retryAttempts}`, { url })\n\t\t\tconst result = await this.executeDownload(url)\n\t\t\tif (isOk(result)) {\n\t\t\t\treturn result\n\t\t\t}\n\t\t\tlastError = result.error\n\t\t\tif (!lastError.retryable || attempt === this.config.retryAttempts) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000)\n\t\t\tthis.logger.info(`Retrying in ${delay}ms...`)\n\t\t\tawait sleep(delay)\n\t\t}\n\t\tif (lastError === undefined) {\n\t\t\treturn { success: false, error: new Error('Unknown error') as AppError }\n\t\t}\n\t\treturn { success: false, error: lastError }\n\t}\n\tprivate async executeDownload(url: string): Promise<Result<DownloadResult, AppError>> {\n\t\tconst browserMgr = new BrowserManager(this.logger, {\n\t\t\theadless: true,\n\t\t\tuserAgent:\n\t\t\t\t'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',\n\t\t})\n\t\ttry {\n\t\t\tconst launchResult = await browserMgr.launch()\n\t\t\tif (isErr(launchResult)) {\n\t\t\t\treturn { success: false, error: launchResult.error }\n\t\t\t}\n\t\t\tconst navResult = await browserMgr.navigate(url)\n\t\t\tif (isErr(navResult)) {\n\t\t\t\treturn { success: false, error: navResult.error }\n\t\t\t}\n\t\t\tconst buttonResult = await browserMgr.waitForDownloadButton()\n\t\t\tif (isErr(buttonResult)) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: new NetworkError(`Button wait failed: ${buttonResult.error.message}`),\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst urlResult = await browserMgr.extractDownloadUrl()\n\t\t\tif (isErr(urlResult)) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: new NetworkError(`URL extract failed: ${urlResult.error.message}`),\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst intermediateUrl = urlResult.value\n\t\t\tconst autoUrl = intermediateUrl.includes('?')\n\t\t\t\t? `${intermediateUrl}&auto=1`\n\t\t\t\t: `${intermediateUrl}?auto=1`\n\t\t\tthis.logger.debug('Auto URL', { url: autoUrl })\n\t\t\tconst downloadPromise = browserMgr.waitForDownload(this.config.timeout)\n\t\t\tconst autoNavResult = await browserMgr.navigate(autoUrl, {\n\t\t\t\twaitUntil: 'commit',\n\t\t\t\ttimeout: this.config.timeout,\n\t\t\t})\n\t\t\tif (isErr(autoNavResult)) {\n\t\t\t\treturn { success: false, error: autoNavResult.error }\n\t\t\t}\n\t\t\tconst downloadResult = await downloadPromise\n\t\t\tif (isOk(downloadResult)) {\n\t\t\t\treturn await this.handleDirectDownload(downloadResult.value, this.config.saveDir)\n\t\t\t} else {\n\t\t\t\tthis.logger.warn('Download event failed, trying fallback')\n\t\t\t\tconst responses = await browserMgr.collectResponses(3000)\n\t\t\t\tconst fileResponse = browserMgr.findFileResponse(responses)\n\t\t\t\tif (fileResponse === undefined) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: new NetworkError('No file response found in fallback'),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn await this.handleFallbackDownload(fileResponse, this.config.saveDir)\n\t\t\t}\n\t\t} finally {\n\t\t\tawait browserMgr[Symbol.asyncDispose]()\n\t\t}\n\t}\n\tprivate async handleDirectDownload(\n\t\tdownload: Download,\n\t\tsaveDir: string,\n\t): Promise<Result<DownloadResult, AppError>> {\n\t\ttry {\n\t\t\tconst suggested = download.suggestedFilename()\n\t\t\tconst filename = sanitizeFilename(suggested !== undefined ? suggested : 'file.bin')\n\t\t\tconst savePath = join(saveDir, filename)\n\t\t\tthis.logger.info('Saving via direct download', { filename })\n\t\t\tawait download.saveAs(savePath)\n\t\t\tconst stats = await fs.stat(savePath)\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tvalue: {\n\t\t\t\t\tfilename,\n\t\t\t\t\tsavePath,\n\t\t\t\t\tsize: stats.size,\n\t\t\t\t\tmethod: 'direct',\n\t\t\t\t},\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: new FileError(`Direct download failed: ${error.message}`),\n\t\t\t}\n\t\t}\n\t}\n\tprivate async handleFallbackDownload(\n\t\tresponse: Response,\n\t\tsaveDir: string,\n\t): Promise<Result<DownloadResult, AppError>> {\n\t\ttry {\n\t\t\tconst buffer = await response.body()\n\t\t\tconst urlPath = response.url().split('?')[0] ?? 'unknown'\n\t\t\tconst base = basename(urlPath)\n\t\t\tconst filename = sanitizeFilename(base !== '' ? base : 'file.bin')\n\t\t\tconst savePath = join(saveDir, filename)\n\t\t\tawait fs.writeFile(savePath, buffer)\n\t\t\tthis.logger.info('Saved via fallback', { filename, size: buffer.length })\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tvalue: {\n\t\t\t\t\tfilename,\n\t\t\t\t\tsavePath,\n\t\t\t\t\tsize: buffer.length,\n\t\t\t\t\tmethod: 'fallback',\n\t\t\t\t},\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: new FileError(`Fallback download failed: ${error.message}`),\n\t\t\t}\n\t\t}\n\t}\n}\nclass App {\n\tprivate readonly logger: Logger\n\tconstructor() {\n\t\tthis.logger = new Logger('INFO')\n\t}\n\tasync run(): Promise<number> {\n\t\tconst args = CliParser.parse(process.argv)\n\t\tif (args.errors.length > 0) {\n\t\t\tfor (const err of args.errors) {\n\t\t\t\tthis.logger.error(`CLI error: ${err}`)\n\t\t\t}\n\t\t\tthis.showHelp()\n\t\t\treturn 2\n\t\t}\n\t\tif (args.flags.help || args.url === undefined) {\n\t\t\tthis.showHelp()\n\t\t\treturn 0\n\t\t}\n\t\tthis.logger.info('Starting Sfile Downloader', {\n\t\t\turl: args.url,\n\t\t\tsaveDir: args.saveDir ?? process.cwd(),\n\t\t\theadless: args.flags.headless,\n\t\t})\n\t\tconst downloader = new Downloader(this.logger, {\n\t\t\tsaveDir: args.saveDir ?? process.cwd(),\n\t\t\ttimeout: args.flags.timeout,\n\t\t\tretryAttempts: args.flags.retry,\n\t\t})\n\t\tconst result = await downloader.download(args.url)\n\t\tif (isOk(result)) {\n\t\t\tthis.logger.info('✅ Download complete', {\n\t\t\t\tfile: result.value.filename,\n\t\t\t\tsize: `${Math.round(result.value.size / 1024)} KB`,\n\t\t\t\tmethod: result.value.method,\n\t\t\t})\n\t\t\tconsole.log(`Saved: ${result.value.savePath}`)\n\t\t\treturn 0\n\t\t} else {\n\t\t\tthis.logger.error('❌ Download failed', {\n\t\t\t\terror: result.error.message,\n\t\t\t\tcode: result.error.code,\n\t\t\t\tretryable: result.error.retryable,\n\t\t\t})\n\t\t\treturn 1\n\t\t}\n\t}\n\tshowHelp(): void {\n\t\tconsole.log(`\n🚀 Sfile Downloader - Strict TypeScript CLI\nUsage:\n bun run src/index.ts <url> [saveDir] [options]\nArguments:\n url sfile.co URL to download (required)\n saveDir Directory to save files (default: current directory)\nOptions:\n --help, -h Show this help message\n --debug Enable debug logging\n --headless=BOOL Run browser headless (default: true)\n --proxy=URL Proxy server URL\n --log-file=PATH Write logs to file\n --json Output logs as JSON\n --batch=FILE Download URLs from file (one per line)\n --concurrency=N Parallel downloads (1-20, default: 1)\n --retry=N Max retry attempts (1-10, default: 3)\n --timeout=MS Operation timeout in ms (default: 60000)\nExamples:\n bun run src/index.ts https://sfile.co/xyz ./downloads\n bun run src/index.ts --batch=urls.txt --concurrency=3\n bun run src/index.ts https://sfile.co/abc --debug --headless=false\nExit Codes:\n 0 Success\n 1 Download/operation error\n 2 CLI/validation error\n`)\n\t}\n}\nconst main = async (): Promise<void> => {\n\tconst app = new App()\n\tconst shutdown = async (signal: NodeJS.Signals): Promise<void> => {\n\t\tconsole.error(`\\nReceived ${signal}, shutting down...`)\n\t\texit(130)\n\t}\n\tprocess.once('SIGINT', () => {\n\t\tvoid shutdown('SIGINT')\n\t})\n\tprocess.once('SIGTERM', () => {\n\t\tvoid shutdown('SIGTERM')\n\t})\n\ttry {\n\t\tconst exitCode = await app.run()\n\t\texit(exitCode)\n\t} catch (err) {\n\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\tconsole.error(`[FATAL] Unhandled error: ${error.message}`)\n\t\tif (process.env['NODE_ENV'] === 'development' && error.stack !== undefined) {\n\t\t\tconsole.error(error.stack)\n\t\t}\n\t\texit(1)\n\t}\n}\nif (require.main === module) {\n\tvoid main()\n}\nexport { App, Downloader, BrowserManager, Logger, CliParser }\nexport type {\n\tResult,\n\tAppError,\n\tValidationError,\n\tNetworkError,\n\tFileError,\n\tBrowserError,\n\tCliFlags,\n\tCliArgs,\n\tDownloadResult,\n\tBrowserConfig,\n\tDownloaderConfig,\n\tLogLevel,\n\tLogEntry,\n}\n"
9
- ],
10
- "names": [
11
- "fs",
12
- "chromium",
13
- "join",
14
- "tmpdir",
15
- "basename",
16
- "exit"
17
- ],
18
- "mappings": "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"
19
- }
package/build/index.d.ts DELETED
@@ -1,175 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Download, Response } from 'playwright'
3
-
4
- type Result<T, E extends Error = Error> =
5
- | {
6
- readonly success: true
7
- readonly value: T
8
- }
9
- | {
10
- readonly success: false
11
- readonly error: E
12
- }
13
- declare abstract class AppError extends Error {
14
- readonly code: string
15
- readonly retryable: boolean
16
- readonly timestamp: string
17
- readonly context: Record<string, unknown> | undefined
18
- constructor(
19
- message: string,
20
- code: string,
21
- retryable?: boolean,
22
- context?: Record<string, unknown>,
23
- )
24
- toJSON(): Record<string, unknown>
25
- }
26
- declare class ValidationError extends AppError {
27
- constructor(message: string, context?: Record<string, unknown>)
28
- }
29
- declare class NetworkError extends AppError {
30
- constructor(message: string, context?: Record<string, unknown>)
31
- }
32
- declare class FileError extends AppError {
33
- constructor(message: string, context?: Record<string, unknown>)
34
- }
35
- declare class BrowserError extends AppError {
36
- constructor(message: string, context?: Record<string, unknown>)
37
- }
38
- type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR'
39
- interface LogEntry {
40
- readonly timestamp: string
41
- readonly level: LogLevel
42
- readonly message: string
43
- readonly context?: Readonly<Record<string, unknown>>
44
- }
45
- declare class Logger {
46
- private static readonly LEVELS
47
- private minLevel
48
- private entries
49
- private maxEntries
50
- private logFile?
51
- constructor(minLevel?: LogLevel)
52
- setLogLevel(level: LogLevel): void
53
- useLogFile(path: string): void
54
- private shouldLog
55
- private format
56
- private record
57
- private output
58
- log(level: LogLevel, message: string, context?: Record<string, unknown>): void
59
- debug(message: string, context?: Record<string, unknown>): void
60
- info(message: string, context?: Record<string, unknown>): void
61
- warn(message: string, context?: Record<string, unknown>): void
62
- error(message: string, context?: Record<string, unknown>): void
63
- getEntries(level?: LogLevel): readonly LogEntry[]
64
- }
65
- interface CliFlags {
66
- readonly help: boolean
67
- readonly debug: boolean
68
- readonly headless: boolean
69
- readonly proxy?: string
70
- readonly logFile?: string
71
- readonly json: boolean
72
- readonly batch?: string
73
- readonly concurrency: number
74
- readonly retry: number
75
- readonly timeout: number
76
- }
77
- interface CliArgs {
78
- readonly url?: string
79
- readonly saveDir?: string
80
- readonly flags: CliFlags
81
- readonly errors: readonly string[]
82
- }
83
- declare class CliParser {
84
- static parse(argv: readonly string[]): CliArgs
85
- private static setFlag
86
- }
87
- interface BrowserConfig {
88
- readonly headless: boolean
89
- readonly userAgent: string
90
- readonly viewport?: {
91
- readonly width: number
92
- readonly height: number
93
- }
94
- readonly proxy?: {
95
- readonly server: string
96
- readonly username?: string
97
- readonly password?: string
98
- }
99
- readonly acceptDownloads: true
100
- }
101
- interface DownloadResult {
102
- readonly filename: string
103
- readonly savePath: string
104
- readonly size: number
105
- readonly method: 'direct' | 'fallback'
106
- }
107
- declare class BrowserManager implements AsyncDisposable {
108
- private browser
109
- private context
110
- private page
111
- private readonly logger
112
- private readonly config
113
- constructor(logger: Logger, config: Partial<BrowserConfig>)
114
- launch(): Promise<Result<void, BrowserError>>
115
- private setupListeners
116
- navigate(
117
- url: string,
118
- options?: {
119
- readonly waitUntil?: 'load' | 'domcontentloaded' | 'networkidle' | 'commit'
120
- readonly timeout?: number
121
- },
122
- ): Promise<Result<void, NetworkError>>
123
- waitForDownloadButton(timeout?: number): Promise<Result<void, Error>>
124
- extractDownloadUrl(): Promise<Result<string, Error>>
125
- waitForDownload(timeout?: number): Promise<Result<Download, Error>>
126
- collectResponses(waitMs?: number): Promise<readonly Response[]>
127
- findFileResponse(responses: readonly Response[]): Response | undefined
128
- saveDebugArtifacts(errorMessage: string): Promise<Result<string, Error>>
129
- private cleanup;
130
- [Symbol.asyncDispose](): Promise<void>
131
- [Symbol.dispose](): void
132
- }
133
- interface DownloaderConfig {
134
- readonly saveDir: string
135
- readonly timeout: number
136
- readonly retryAttempts: number
137
- }
138
- declare class Downloader {
139
- private readonly logger
140
- private readonly config
141
- constructor(logger: Logger, config: DownloaderConfig)
142
- download(url: string): Promise<Result<DownloadResult, AppError>>
143
- private executeDownload
144
- private handleDirectDownload
145
- private handleFallbackDownload
146
- }
147
- declare class App {
148
- private readonly logger
149
- constructor()
150
- run(): Promise<number>
151
- showHelp(): void
152
- }
153
-
154
- export {
155
- App,
156
- AppError,
157
- BrowserError,
158
- BrowserManager,
159
- CliParser,
160
- Downloader,
161
- FileError,
162
- Logger,
163
- NetworkError,
164
- ValidationError,
165
- }
166
- export type {
167
- BrowserConfig,
168
- CliArgs,
169
- CliFlags,
170
- DownloadResult,
171
- DownloaderConfig,
172
- LogEntry,
173
- LogLevel,
174
- Result,
175
- }