sfiledl 1.0.0
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.
- package/build/index.cjs +820 -0
- package/build/index.cjs.map +1 -0
- package/build/index.d.ts +145 -0
- package/build/index.mjs +812 -0
- package/build/index.mjs.map +1 -0
- package/license +21 -0
- package/package.json +91 -0
- package/readme +172 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["#!/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"],"names":["fs","chromium","join","tmpdir","basename","exit"],"mappings":"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"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Download, Response } from 'playwright';
|
|
3
|
+
|
|
4
|
+
type Result<T, E extends Error = Error> = {
|
|
5
|
+
readonly success: true;
|
|
6
|
+
readonly value: T;
|
|
7
|
+
} | {
|
|
8
|
+
readonly success: false;
|
|
9
|
+
readonly error: E;
|
|
10
|
+
};
|
|
11
|
+
declare abstract class AppError extends Error {
|
|
12
|
+
readonly code: string;
|
|
13
|
+
readonly retryable: boolean;
|
|
14
|
+
readonly timestamp: string;
|
|
15
|
+
readonly context: Record<string, unknown> | undefined;
|
|
16
|
+
constructor(message: string, code: string, retryable?: boolean, context?: Record<string, unknown>);
|
|
17
|
+
toJSON(): Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
declare class ValidationError extends AppError {
|
|
20
|
+
constructor(message: string, context?: Record<string, unknown>);
|
|
21
|
+
}
|
|
22
|
+
declare class NetworkError extends AppError {
|
|
23
|
+
constructor(message: string, context?: Record<string, unknown>);
|
|
24
|
+
}
|
|
25
|
+
declare class FileError extends AppError {
|
|
26
|
+
constructor(message: string, context?: Record<string, unknown>);
|
|
27
|
+
}
|
|
28
|
+
declare class BrowserError extends AppError {
|
|
29
|
+
constructor(message: string, context?: Record<string, unknown>);
|
|
30
|
+
}
|
|
31
|
+
type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
|
|
32
|
+
interface LogEntry {
|
|
33
|
+
readonly timestamp: string;
|
|
34
|
+
readonly level: LogLevel;
|
|
35
|
+
readonly message: string;
|
|
36
|
+
readonly context?: Readonly<Record<string, unknown>>;
|
|
37
|
+
}
|
|
38
|
+
declare class Logger {
|
|
39
|
+
private static readonly LEVELS;
|
|
40
|
+
private minLevel;
|
|
41
|
+
private entries;
|
|
42
|
+
private maxEntries;
|
|
43
|
+
private logFile?;
|
|
44
|
+
constructor(minLevel?: LogLevel);
|
|
45
|
+
setLogLevel(level: LogLevel): void;
|
|
46
|
+
useLogFile(path: string): void;
|
|
47
|
+
private shouldLog;
|
|
48
|
+
private format;
|
|
49
|
+
private record;
|
|
50
|
+
private output;
|
|
51
|
+
log(level: LogLevel, message: string, context?: Record<string, unknown>): void;
|
|
52
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
53
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
54
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
55
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
56
|
+
getEntries(level?: LogLevel): readonly LogEntry[];
|
|
57
|
+
}
|
|
58
|
+
interface CliFlags {
|
|
59
|
+
readonly help: boolean;
|
|
60
|
+
readonly debug: boolean;
|
|
61
|
+
readonly headless: boolean;
|
|
62
|
+
readonly proxy?: string;
|
|
63
|
+
readonly logFile?: string;
|
|
64
|
+
readonly json: boolean;
|
|
65
|
+
readonly batch?: string;
|
|
66
|
+
readonly concurrency: number;
|
|
67
|
+
readonly retry: number;
|
|
68
|
+
readonly timeout: number;
|
|
69
|
+
}
|
|
70
|
+
interface CliArgs {
|
|
71
|
+
readonly url?: string;
|
|
72
|
+
readonly saveDir?: string;
|
|
73
|
+
readonly flags: CliFlags;
|
|
74
|
+
readonly errors: readonly string[];
|
|
75
|
+
}
|
|
76
|
+
declare class CliParser {
|
|
77
|
+
static parse(argv: readonly string[]): CliArgs;
|
|
78
|
+
private static setFlag;
|
|
79
|
+
}
|
|
80
|
+
interface BrowserConfig {
|
|
81
|
+
readonly headless: boolean;
|
|
82
|
+
readonly userAgent: string;
|
|
83
|
+
readonly viewport?: {
|
|
84
|
+
readonly width: number;
|
|
85
|
+
readonly height: number;
|
|
86
|
+
};
|
|
87
|
+
readonly proxy?: {
|
|
88
|
+
readonly server: string;
|
|
89
|
+
readonly username?: string;
|
|
90
|
+
readonly password?: string;
|
|
91
|
+
};
|
|
92
|
+
readonly acceptDownloads: true;
|
|
93
|
+
}
|
|
94
|
+
interface DownloadResult {
|
|
95
|
+
readonly filename: string;
|
|
96
|
+
readonly savePath: string;
|
|
97
|
+
readonly size: number;
|
|
98
|
+
readonly method: 'direct' | 'fallback';
|
|
99
|
+
}
|
|
100
|
+
declare class BrowserManager implements AsyncDisposable {
|
|
101
|
+
private browser;
|
|
102
|
+
private context;
|
|
103
|
+
private page;
|
|
104
|
+
private readonly logger;
|
|
105
|
+
private readonly config;
|
|
106
|
+
constructor(logger: Logger, config: Partial<BrowserConfig>);
|
|
107
|
+
launch(): Promise<Result<void, BrowserError>>;
|
|
108
|
+
private setupListeners;
|
|
109
|
+
navigate(url: string, options?: {
|
|
110
|
+
readonly waitUntil?: 'load' | 'domcontentloaded' | 'networkidle' | 'commit';
|
|
111
|
+
readonly timeout?: number;
|
|
112
|
+
}): Promise<Result<void, NetworkError>>;
|
|
113
|
+
waitForDownloadButton(timeout?: number): Promise<Result<void, Error>>;
|
|
114
|
+
extractDownloadUrl(): Promise<Result<string, Error>>;
|
|
115
|
+
waitForDownload(timeout?: number): Promise<Result<Download, Error>>;
|
|
116
|
+
collectResponses(waitMs?: number): Promise<readonly Response[]>;
|
|
117
|
+
findFileResponse(responses: readonly Response[]): Response | undefined;
|
|
118
|
+
saveDebugArtifacts(errorMessage: string): Promise<Result<string, Error>>;
|
|
119
|
+
private cleanup;
|
|
120
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
121
|
+
[Symbol.dispose](): void;
|
|
122
|
+
}
|
|
123
|
+
interface DownloaderConfig {
|
|
124
|
+
readonly saveDir: string;
|
|
125
|
+
readonly timeout: number;
|
|
126
|
+
readonly retryAttempts: number;
|
|
127
|
+
}
|
|
128
|
+
declare class Downloader {
|
|
129
|
+
private readonly logger;
|
|
130
|
+
private readonly config;
|
|
131
|
+
constructor(logger: Logger, config: DownloaderConfig);
|
|
132
|
+
download(url: string): Promise<Result<DownloadResult, AppError>>;
|
|
133
|
+
private executeDownload;
|
|
134
|
+
private handleDirectDownload;
|
|
135
|
+
private handleFallbackDownload;
|
|
136
|
+
}
|
|
137
|
+
declare class App {
|
|
138
|
+
private readonly logger;
|
|
139
|
+
constructor();
|
|
140
|
+
run(): Promise<number>;
|
|
141
|
+
showHelp(): void;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export { App, AppError, BrowserError, BrowserManager, CliParser, Downloader, FileError, Logger, NetworkError, ValidationError };
|
|
145
|
+
export type { BrowserConfig, CliArgs, CliFlags, DownloadResult, DownloaderConfig, LogEntry, LogLevel, Result };
|