sfiledl 2.1.1 → 2.2.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/lib.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.mjs","sources":["../lib/errors/base.ts","../lib/errors/errors.ts","../lib/config/defaults.ts","../lib/browser/page-interactions.ts","../lib/utils/helpers.ts","../lib/browser/browser-manager.ts","../lib/utils/logger.ts","../lib/config/schema.ts","../lib/core/downloader.ts"],"sourcesContent":["export abstract class AppError extends Error {\n\tpublic readonly timestamp: string\n\tpublic readonly context: Record<string, unknown> | undefined\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly retryable: boolean = false,\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 ? { ...context } : undefined\n\t\tError.captureStackTrace?.(this, this.constructor)\n\t}\n\ttoJSON() {\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}\n\t}\n}\n","import { AppError } from './base.js'\nexport class ValidationError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'VALIDATION_ERROR', false, context)\n\t}\n}\nexport class NetworkError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'NETWORK_ERROR', true, context)\n\t}\n}\nexport class FileError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'FILE_ERROR', false, context)\n\t}\n}\nexport class BrowserError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'BROWSER_ERROR', true, context)\n\t}\n}\n","export const DEFAULTS = {\n\tuserAgent:\n\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\theadless: true,\n\ttimeout: 100000,\n\tdownloadButtonTimeout: 100000,\n\tfallbackWaitMs: 5000,\n}\n","import { Page } from 'playwright'\nimport { Logger } from '../utils/logger.js'\nimport { NetworkError } from '../errors/index.js'\nexport class SfilePageInteractions {\n\tconstructor(\n\t\tprivate page: Page,\n\t\tprivate logger: Logger,\n\t) {}\n\tasync waitForDownloadButton(timeout: number): Promise<void> {\n\t\tthis.logger.debug('Waiting for #download button to be visible')\n\t\tconst button = this.page.locator('#download')\n\t\tawait button.waitFor({ state: 'visible', timeout })\n\t\tthis.logger.debug(\n\t\t\t'Waiting for button to become active (href != \"#\" and pointerEvents != \"none\")',\n\t\t)\n\t\tawait this.page.waitForFunction(\n\t\t\t() => {\n\t\t\t\tconst btn = document.querySelector('#download') as HTMLAnchorElement | null\n\t\t\t\tif (!btn) return false\n\t\t\t\tconst href = btn.getAttribute('href')\n\t\t\t\tconst style = window.getComputedStyle(btn)\n\t\t\t\treturn href && href !== '#' && style.pointerEvents !== 'none'\n\t\t\t},\n\t\t\t{ timeout },\n\t\t)\n\t}\n\tasync extractIntermediateUrl(): Promise<string> {\n\t\tthis.logger.debug('Extracting href from #download')\n\t\tconst href = await this.page.$eval('#download', (el) => (el as HTMLAnchorElement).href)\n\t\tif (!href || href === '#') {\n\t\t\tthrow new NetworkError('Download button href is invalid', { href })\n\t\t}\n\t\treturn href\n\t}\n}\n","export function 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}\nexport const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\nexport function safeStringify(value: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(value)\n\t} catch {\n\t\treturn '[unserializable]'\n\t}\n}\n","import { chromium, Browser, BrowserContext, Page, Download, Response } from 'playwright'\nimport * as fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { Logger } from '../utils/logger.js'\nimport { BrowserError, NetworkError } from '../errors/index.js'\nimport { DEFAULTS } from '../config/defaults.js'\nimport { SfilePageInteractions } from './page-interactions.js'\nimport { sleep } from '../utils/helpers.js'\nexport interface BrowserManagerOptions {\n\theadless: boolean\n\tuserAgent: string\n\ttimeout: number\n\tdebug: boolean\n}\nexport class BrowserManager {\n\tprivate browser: Browser | null = null\n\tprivate context: BrowserContext | null = null\n\tprivate page: Page | null = null\n\tprivate interactions: SfilePageInteractions | null = null\n\tprivate debugDir: string | null = null\n\tconstructor(\n\t\tprivate logger: Logger,\n\t\tprivate opts: BrowserManagerOptions,\n\t) {}\n\tasync launch(): Promise<void> {\n\t\ttry {\n\t\t\tthis.logger.info('Launching browser', { headless: this.opts.headless })\n\t\t\tthis.browser = await chromium.launch({\n\t\t\t\theadless: this.opts.headless,\n\t\t\t\targs: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'],\n\t\t\t})\n\t\t\tthis.context = await this.browser.newContext({\n\t\t\t\tuserAgent: this.opts.userAgent,\n\t\t\t\tacceptDownloads: true,\n\t\t\t\tlocale: 'en-US',\n\t\t\t})\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.interactions = new SfilePageInteractions(this.page, this.logger)\n\t\t\tif (this.opts.debug) {\n\t\t\t\tthis.page.on('console', (msg) => {\n\t\t\t\t\tif (msg.type() === 'error') this.logger.error(`[console] ${msg.text()}`)\n\t\t\t\t\telse if (msg.type() === 'warning') this.logger.warn(`[console] ${msg.text()}`)\n\t\t\t\t})\n\t\t\t\tthis.page.on('pageerror', (err) => this.logger.error(`[pageerror] ${err.message}`))\n\t\t\t}\n\t\t\tthis.logger.info('Browser ready')\n\t\t} catch (err: any) {\n\t\t\tthrow new BrowserError(`Failed to launch browser: ${err.message}`)\n\t\t}\n\t}\n\tasync goto(\n\t\turl: string,\n\t\twaitUntil: 'load' | 'networkidle' | 'commit' = 'networkidle',\n\t): Promise<void> {\n\t\tif (!this.page) throw new BrowserError('Page not initialized')\n\t\ttry {\n\t\t\tthis.logger.debug(`Navigating to ${url} (waitUntil=${waitUntil})`)\n\t\t\tawait this.page.goto(url, { waitUntil, timeout: this.opts.timeout })\n\t\t} catch (err: any) {\n\t\t\tthrow new NetworkError(`Navigation failed: ${err.message}`, { url })\n\t\t}\n\t}\n\tasync waitForDownloadButton(): Promise<void> {\n\t\tif (!this.interactions) throw new BrowserError('Interactions not ready')\n\t\tawait this.interactions.waitForDownloadButton(DEFAULTS.downloadButtonTimeout)\n\t}\n\tasync getIntermediateUrl(): Promise<string> {\n\t\tif (!this.interactions) throw new BrowserError('Interactions not ready')\n\t\treturn this.interactions.extractIntermediateUrl()\n\t}\n\tasync startDownloadAndWait(autoUrl: string): Promise<Download | null> {\n\t\tif (!this.page) throw new BrowserError('Page not initialized')\n\t\tconst downloadPromise = this.page\n\t\t\t.waitForEvent('download', { timeout: this.opts.timeout })\n\t\t\t.catch((err) => {\n\t\t\t\tthis.logger.warn(`Download event wait failed: ${err.message}`)\n\t\t\t\treturn null\n\t\t\t})\n\t\tthis.logger.debug(`Navigating to auto URL: ${autoUrl}`)\n\t\tawait this.page.goto(autoUrl, { waitUntil: 'commit', timeout: this.opts.timeout })\n\t\tconst download = await downloadPromise\n\t\tif (download) {\n\t\t\tthis.logger.info('Download event captured')\n\t\t\treturn download\n\t\t}\n\t\treturn null\n\t}\n\tasync fallbackCollectFileResponse(): Promise<{ buffer: Buffer; filename: string } | null> {\n\t\tif (!this.page) throw new BrowserError('Page not initialized')\n\t\tthis.logger.warn('Falling back to response interception')\n\t\tconst responses: Response[] = []\n\t\tconst handler = (res: Response) => responses.push(res)\n\t\tthis.page.on('response', handler)\n\t\tawait sleep(DEFAULTS.fallbackWaitMs)\n\t\tthis.page.off('response', handler)\n\t\tconst fileResponse = [...responses].reverse().find((r) => {\n\t\t\tconst disposition = r.headers()['content-disposition']\n\t\t\treturn (\n\t\t\t\t(disposition && disposition.includes('attachment')) ||\n\t\t\t\tr.url().includes('/downloadfile/')\n\t\t\t)\n\t\t})\n\t\tif (!fileResponse) return null\n\t\tconst buffer = await fileResponse.body()\n\t\tlet filename = fileResponse.url().split('/').pop()?.split('?')[0] || 'file.bin'\n\t\tfilename = filename.replace(/[<>:\"/\\\\|?*]/g, '_')\n\t\treturn { buffer, filename }\n\t}\n\tasync saveDebugArtifacts(errorMessage: string): Promise<void> {\n\t\tif (!this.page) return\n\t\ttry {\n\t\t\tthis.debugDir = path.join(os.tmpdir(), `sfile_debug_${Date.now()}`)\n\t\t\tawait fs.mkdir(this.debugDir, { recursive: true })\n\t\t\tawait Promise.all([\n\t\t\t\tthis.page.screenshot({\n\t\t\t\t\tpath: path.join(this.debugDir, 'error.png'),\n\t\t\t\t\tfullPage: true,\n\t\t\t\t}),\n\t\t\t\tfs.writeFile(path.join(this.debugDir, 'error.html'), await this.page.content()),\n\t\t\t\tfs.writeFile(path.join(this.debugDir, 'error.txt'), errorMessage),\n\t\t\t])\n\t\t\tthis.logger.info(`Debug artifacts saved to ${this.debugDir}`)\n\t\t} catch (e: any) {\n\t\t\tthis.logger.error(`Failed to save debug artifacts: ${e.message}`)\n\t\t}\n\t}\n\tasync close(): Promise<void> {\n\t\tif (this.page) await this.page.close().catch(() => {})\n\t\tif (this.context) await this.context.close().catch(() => {})\n\t\tif (this.browser) await this.browser.close().catch(() => {})\n\t\tthis.logger.debug('Browser closed')\n\t}\n}\n","import { safeStringify } from './helpers.js'\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error'\nexport class Logger {\n\tprivate minLevel: LogLevel\n\tconstructor(debugMode = false) {\n\t\tthis.minLevel = debugMode ? 'debug' : 'info'\n\t}\n\tsetDebug(enabled: boolean) {\n\t\tthis.minLevel = enabled ? 'debug' : 'info'\n\t}\n\tprivate shouldLog(level: LogLevel): boolean {\n\t\tconst levels: Record<LogLevel, number> = { debug: 0, info: 1, warn: 2, error: 3 }\n\t\treturn levels[level] >= levels[this.minLevel]\n\t}\n\tprivate log(level: LogLevel, message: string, context?: any) {\n\t\tif (!this.shouldLog(level)) return\n\t\tconst ts = new Date().toISOString()\n\t\tconst ctx = context ? ` ${safeStringify(context)}` : ''\n\t\tconsole.log(`[${ts}] ${level.toUpperCase()}: ${message}${ctx}`)\n\t}\n\tdebug(msg: string, ctx?: any) {\n\t\tthis.log('debug', msg, ctx)\n\t}\n\tinfo(msg: string, ctx?: any) {\n\t\tthis.log('info', msg, ctx)\n\t}\n\twarn(msg: string, ctx?: any) {\n\t\tthis.log('warn', msg, ctx)\n\t}\n\terror(msg: string, ctx?: any) {\n\t\tthis.log('error', msg, ctx)\n\t}\n}\n","import { DEFAULTS } from './defaults.js'\nexport interface DownloadOptions {\n\theadless?: boolean\n\tdebug?: boolean\n\tuserAgent?: string\n\ttimeout?: number\n}\nexport interface DownloadResult {\n\tfilePath: string\n\tsize: number\n\tmethod: 'direct' | 'fallback'\n}\nexport function normalizeOptions(opts?: DownloadOptions) {\n\treturn {\n\t\theadless: opts?.headless ?? DEFAULTS.headless,\n\t\tdebug: opts?.debug ?? false,\n\t\tuserAgent: opts?.userAgent ?? DEFAULTS.userAgent,\n\t\ttimeout: opts?.timeout ?? DEFAULTS.timeout,\n\t}\n}\n","import path from 'path'\nimport fs from 'fs/promises'\nimport { BrowserManager } from '../browser/browser-manager.js'\nimport { Logger } from '../utils/logger.js'\nimport { ValidationError, NetworkError } from '../errors/index.js'\nimport { DownloadOptions, DownloadResult, normalizeOptions } from '../config/schema.js'\nimport { sanitizeFilename } from '../utils/helpers.js'\nexport async function downloadSfile(\n\turl: string,\n\tsaveDir: string,\n\toptions?: DownloadOptions,\n): Promise<DownloadResult> {\n\tconst opts = normalizeOptions(options)\n\tconst logger = new Logger(opts.debug)\n\tif (!url || !url.includes('sfile.co')) {\n\t\tthrow new ValidationError('URL must contain sfile.co', { url })\n\t}\n\tawait fs.mkdir(saveDir, { recursive: true })\n\tconst browserMgr = new BrowserManager(logger, {\n\t\theadless: opts.headless,\n\t\tuserAgent: opts.userAgent,\n\t\ttimeout: opts.timeout,\n\t\tdebug: opts.debug,\n\t})\n\ttry {\n\t\tawait browserMgr.launch()\n\t\tawait browserMgr.goto(url, 'networkidle')\n\t\tawait browserMgr.waitForDownloadButton()\n\t\tconst intermediateUrl = await browserMgr.getIntermediateUrl()\n\t\tconst autoUrl = intermediateUrl.includes('?')\n\t\t\t? `${intermediateUrl}&auto=1`\n\t\t\t: `${intermediateUrl}?auto=1`\n\t\tlet download = await browserMgr.startDownloadAndWait(autoUrl)\n\t\tlet finalPath: string\n\t\tlet fileSize: number\n\t\tlet method: 'direct' | 'fallback'\n\t\tif (download) {\n\t\t\tconst suggested = download.suggestedFilename() || 'file.bin'\n\t\t\tconst filename = sanitizeFilename(suggested)\n\t\t\tfinalPath = path.join(saveDir, filename)\n\t\t\tawait download.saveAs(finalPath)\n\t\t\tconst stat = await fs.stat(finalPath)\n\t\t\tfileSize = stat.size\n\t\t\tmethod = 'direct'\n\t\t\tlogger.info(`Saved via direct download: ${finalPath} (${fileSize} bytes)`)\n\t\t} else {\n\t\t\tconst fallback = await browserMgr.fallbackCollectFileResponse()\n\t\t\tif (!fallback) {\n\t\t\t\tthrow new NetworkError('No download event and no file response found')\n\t\t\t}\n\t\t\tconst { buffer, filename: rawName } = fallback\n\t\t\tconst filename = sanitizeFilename(rawName)\n\t\t\tfinalPath = path.join(saveDir, filename)\n\t\t\tawait fs.writeFile(finalPath, buffer)\n\t\t\tfileSize = buffer.length\n\t\t\tmethod = 'fallback'\n\t\t\tlogger.info(`Saved via fallback: ${finalPath} (${fileSize} bytes)`)\n\t\t}\n\t\treturn { filePath: finalPath, size: fileSize, method }\n\t} catch (err: any) {\n\t\tawait browserMgr.saveDebugArtifacts(err.message)\n\t\tthrow err\n\t} finally {\n\t\tawait browserMgr.close()\n\t}\n}\n"],"names":["fs"],"mappings":"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"}
1
+ {"version":3,"file":"lib.mjs","sources":["../lib/errors/base.ts","../lib/errors/errors.ts","../lib/config/defaults.ts","../lib/browser/page-interactions.ts","../lib/utils/helpers.ts","../lib/browser/browser-manager.ts","../lib/utils/logger.ts","../lib/config/schema.ts","../lib/core/validator.ts","../lib/core/downloader.ts","../lib/utils/result.ts"],"sourcesContent":["export abstract class AppError extends Error {\n\tpublic readonly timestamp: string\n\tpublic readonly context: Readonly<Record<string, unknown>>\n\tpublic readonly code: string\n\tpublic readonly retryable: boolean\n\tconstructor(\n\t\tmessage: string,\n\t\tcode: string,\n\t\tretryable: boolean = false,\n\t\tcontext?: Record<string, unknown>,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = this.constructor.name\n\t\tthis.code = code\n\t\tthis.retryable = retryable\n\t\tthis.timestamp = new Date().toISOString()\n\t\tthis.context = context ? Object.freeze({ ...context }) : Object.freeze({})\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, this.constructor)\n\t\t}\n\t\tObject.freeze(this)\n\t}\n\ttoJSON(): Record<string, unknown> {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\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\ttoString(): string {\n\t\treturn `${this.name} [${this.code}]: ${this.message}`\n\t}\n\tisCode(code: string): boolean {\n\t\treturn this.code === code\n\t}\n\tisRetryable(): boolean {\n\t\treturn this.retryable\n\t}\n}\n","import { AppError } from './base.js'\nexport class ValidationError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'VALIDATION_ERROR', false, context)\n\t\tObject.freeze(this)\n\t}\n}\nexport class NetworkError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'NETWORK_ERROR', true, context)\n\t\tObject.freeze(this)\n\t}\n}\nexport class FileError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'FILE_ERROR', false, context)\n\t\tObject.freeze(this)\n\t}\n}\nexport class BrowserError extends AppError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'BROWSER_ERROR', true, context)\n\t\tObject.freeze(this)\n\t}\n}\nexport function isAppError(err: unknown): err is AppError {\n\treturn err instanceof AppError\n}\nexport function isRetryableError(err: unknown): boolean {\n\treturn isAppError(err) && err.retryable\n}\nexport function isErrorWithCode(err: unknown, code: string): boolean {\n\treturn isAppError(err) && err.code === code\n}\n","export const DEFAULTS = {\n\tuserAgent:\n\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\theadless: true,\n\ttimeout: 60000,\n\tdownloadButtonTimeout: 30000,\n\tfallbackWaitMs: 3000,\n\tretries: 3,\n\tretryDelay: 1000,\n\tmaxRetryDelay: 30000,\n\tsaveDebugArtifacts: true,\n\tmaxFilenameLength: 255,\n\tsanitizeReplacement: '_',\n} as const\nexport type Defaults = typeof DEFAULTS\n","import { Page } from 'playwright'\nimport { Logger } from '../utils/logger.js'\nimport { NetworkError } from '../errors/index.js'\nexport class SfilePageInteractions {\n\tconstructor(\n\t\tprivate page: Page,\n\t\tprivate logger: Logger,\n\t) {}\n\tasync waitForDownloadButton(timeout: number): Promise<void> {\n\t\tthis.logger.debug('Waiting for #download button', { timeout })\n\t\tconst button = this.page.locator('#download')\n\t\tawait button.waitFor({ state: 'visible', timeout })\n\t\tthis.logger.debug('Button is visible, checking if active')\n\t\tawait this.page.waitForFunction(\n\t\t\t() => {\n\t\t\t\tconst btn = document.querySelector('#download') as HTMLAnchorElement | null\n\t\t\t\tif (!btn) return false\n\t\t\t\tconst href = btn.getAttribute('href')\n\t\t\t\tconst style = window.getComputedStyle(btn)\n\t\t\t\tconst isDisabled =\n\t\t\t\t\tbtn.hasAttribute('disabled') ||\n\t\t\t\t\tbtn.getAttribute('aria-disabled') === 'true' ||\n\t\t\t\t\tbtn.classList.contains('disabled')\n\t\t\t\treturn !!(\n\t\t\t\t\thref &&\n\t\t\t\t\thref !== '#' &&\n\t\t\t\t\thref.trim() !== '' &&\n\t\t\t\t\tstyle.pointerEvents !== 'none' &&\n\t\t\t\t\t!isDisabled\n\t\t\t\t)\n\t\t\t},\n\t\t\t{ timeout },\n\t\t)\n\t\tthis.logger.debug('Download button is active and ready')\n\t}\n\tasync extractIntermediateUrl(): Promise<string> {\n\t\tthis.logger.debug('Extracting href from #download button')\n\t\ttry {\n\t\t\tconst href = await this.page.$eval('#download', (el) => {\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 || href === '#' || href.trim() === '') {\n\t\t\t\tthrow new NetworkError('Download button href is empty or invalid', { href })\n\t\t\t}\n\t\t\treturn href\n\t\t} catch (err: unknown) {\n\t\t\tif (err instanceof Error && err.message?.includes('Element not found')) {\n\t\t\t\tthrow new NetworkError('Download button (#download) not found in page', {\n\t\t\t\t\tselector: '#download',\n\t\t\t\t\toriginalError: err.message,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow err\n\t\t}\n\t}\n}\n","export function sanitizeFilename(name: string, replacement = '_'): string {\n\tconst safeName = name.replace(/\\.\\.[\\\\/]/g, '')\n\tconst sanitized = safeName\n\t\t.replace(/[<>:\"/\\\\|?*\\x00-\\x1F]/g, replacement)\n\t\t.replace(new RegExp(`${replacement}+`, 'g'), replacement)\n\t\t.trim()\n\tconst maxLength = 255\n\tconst trimmed = sanitized.slice(0, maxLength)\n\treturn trimmed || `file${replacement}bin`\n}\nexport const sleep = (ms: number): Promise<void> =>\n\tnew Promise((resolve) => setTimeout(resolve, ms))\nexport function safeStringify(value: unknown, indent = 0): string {\n\ttry {\n\t\tconst seen = new WeakSet()\n\t\treturn JSON.stringify(\n\t\t\tvalue,\n\t\t\t(_key, val) => {\n\t\t\t\tif (typeof val === 'object' && val !== null) {\n\t\t\t\t\tif (seen.has(val)) return '[Circular]'\n\t\t\t\t\tseen.add(val)\n\t\t\t\t}\n\t\t\t\tif (typeof val === 'bigint') return val.toString() + 'n'\n\t\t\t\tif (val instanceof Error) {\n\t\t\t\t\treturn { name: val.name, message: val.message, stack: val.stack }\n\t\t\t\t}\n\t\t\t\treturn val\n\t\t\t},\n\t\t\tindent,\n\t\t)\n\t} catch {\n\t\treturn '[unserializable]'\n\t}\n}\nexport function extractFilenameFromContentDisposition(header: string | undefined): string | null {\n\tif (!header) return null\n\tconst encodedMatch = header.match(/filename\\*=UTF-8''([^;\\n\"]+)/i)\n\tif (encodedMatch?.[1]) {\n\t\ttry {\n\t\t\treturn decodeURIComponent(encodedMatch[1])\n\t\t} catch {}\n\t}\n\tconst quotedMatch = header.match(/filename\\s*=\\s*\"([^\"]+)\"/i)\n\tif (quotedMatch?.[1]) return quotedMatch[1]\n\tconst plainMatch = header.match(/filename\\s*=\\s*([^;,\\n\"]+)/i)\n\tif (plainMatch?.[1]) return plainMatch[1].trim()\n\treturn null\n}\nexport function calculateRetryDelay(\n\tattempt: number,\n\tbaseDelayMs: number,\n\tmaxDelayMs = 30000,\n): number {\n\tconst exponential = baseDelayMs * Math.pow(2, attempt - 1)\n\tconst jitter = Math.random() * 0.3 * exponential\n\treturn Math.min(exponential + jitter, maxDelayMs)\n}\nexport function isError(value: unknown): value is Error {\n\treturn (\n\t\tvalue instanceof Error ||\n\t\t(typeof value === 'object' && value !== null && 'message' in value)\n\t)\n}\n","import { chromium, Browser, BrowserContext, Page, Download, Response } from 'playwright'\nimport * as fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { Logger } from '../utils/logger.js'\nimport { BrowserError, NetworkError } from '../errors/index.js'\nimport { DEFAULTS } from '../config/defaults.js'\nimport { SfilePageInteractions } from './page-interactions.js'\nimport { sleep, extractFilenameFromContentDisposition } from '../utils/helpers.js'\nexport interface BrowserManagerOptions {\n\theadless: boolean\n\tuserAgent: string\n\ttimeout: number\n\tdebug: boolean\n\tdownloadButtonTimeout?: number\n}\nexport class BrowserManager {\n\tprivate browser: Browser | null = null\n\tprivate context: BrowserContext | null = null\n\tprivate page: Page | null = null\n\tprivate interactions: SfilePageInteractions | null = null\n\tprivate debugDir: string | null = null\n\tprivate readonly stageHistory: Array<{ stage: string; ts: number }> = []\n\tconstructor(\n\t\tprivate logger: Logger,\n\t\tprivate opts: BrowserManagerOptions,\n\t) {}\n\tprivate trackStage(stage: string): void {\n\t\tthis.stageHistory.push({ stage, ts: Date.now() })\n\t}\n\tasync launch(): Promise<void> {\n\t\tconst stage = 'launch'\n\t\tthis.trackStage(stage)\n\t\ttry {\n\t\t\tthis.logger.info('Launching browser', { headless: this.opts.headless })\n\t\t\tthis.browser = await chromium.launch({\n\t\t\t\theadless: this.opts.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-accelerated-2d-canvas',\n\t\t\t\t\t'--no-first-run',\n\t\t\t\t\t'--no-zygote',\n\t\t\t\t],\n\t\t\t})\n\t\t\tthis.context = await this.browser.newContext({\n\t\t\t\tuserAgent: this.opts.userAgent,\n\t\t\t\tacceptDownloads: true,\n\t\t\t\tlocale: 'en-US',\n\t\t\t\ttimezoneId: 'UTC',\n\t\t\t\tviewport: { width: 1280, height: 720 },\n\t\t\t})\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.interactions = new SfilePageInteractions(this.page, this.logger)\n\t\t\tif (this.opts.debug) {\n\t\t\t\tthis.setupDebugListeners()\n\t\t\t}\n\t\t\tthis.logger.info('Browser ready')\n\t\t} catch (err: any) {\n\t\t\tawait this.handleStageError(stage, err)\n\t\t\tthrow new BrowserError(`Failed to launch browser: ${err.message}`, {\n\t\t\t\tstage,\n\t\t\t\toriginalError: err.message,\n\t\t\t\tuserAgent: this.opts.userAgent,\n\t\t\t})\n\t\t}\n\t}\n\tprivate setupDebugListeners(): void {\n\t\tif (!this.page) return\n\t\tthis.page.on('console', (msg) => {\n\t\t\tconst type = msg.type()\n\t\t\tconst text = msg.text()\n\t\t\tif (type === 'error') {\n\t\t\t\tthis.logger.error(`[console] ${text}`, { location: msg.location() })\n\t\t\t} else if (type === 'warning') {\n\t\t\t\tthis.logger.warn(`[console] ${text}`)\n\t\t\t} else if (type === 'debug') {\n\t\t\t\tthis.logger.debug(`[console] ${text}`)\n\t\t\t}\n\t\t})\n\t\tthis.page.on('pageerror', (err) => {\n\t\t\tthis.logger.error('[pageerror]', undefined, err)\n\t\t})\n\t\tthis.page.on('requestfailed', (req) => {\n\t\t\tconst failure = req.failure()\n\t\t\tthis.logger.warn('[requestfailed]', {\n\t\t\t\turl: req.url(),\n\t\t\t\tmethod: req.method(),\n\t\t\t\terror: failure?.errorText,\n\t\t\t})\n\t\t})\n\t}\n\tasync goto(\n\t\turl: string,\n\t\twaitUntil: 'load' | 'networkidle' | 'commit' | 'domcontentloaded' = 'networkidle',\n\t): Promise<void> {\n\t\tconst stage = 'navigation'\n\t\tthis.trackStage(stage)\n\t\tif (!this.page) {\n\t\t\tthrow new BrowserError('Page not initialized', { stage })\n\t\t}\n\t\ttry {\n\t\t\tthis.logger.debug(`Navigating to ${url}`, { waitUntil, timeout: this.opts.timeout })\n\t\t\tawait this.page.goto(url, { waitUntil, timeout: this.opts.timeout })\n\t\t} catch (err: any) {\n\t\t\tawait this.handleStageError(stage, err)\n\t\t\tthrow new NetworkError(`Navigation failed: ${err.message}`, {\n\t\t\t\turl,\n\t\t\t\tstage,\n\t\t\t\twaitUntil,\n\t\t\t\ttimeout: this.opts.timeout,\n\t\t\t\toriginalError: err.message,\n\t\t\t})\n\t\t}\n\t}\n\tasync waitForDownloadButton(): Promise<void> {\n\t\tconst stage = 'waitForButton'\n\t\tthis.trackStage(stage)\n\t\tif (!this.interactions) {\n\t\t\tthrow new BrowserError('Interactions not ready', { stage })\n\t\t}\n\t\tconst timeout = this.opts.downloadButtonTimeout ?? DEFAULTS.downloadButtonTimeout\n\t\ttry {\n\t\t\tawait this.interactions.waitForDownloadButton(timeout)\n\t\t} catch (err: any) {\n\t\t\tawait this.handleStageError(stage, err)\n\t\t\tthrow new NetworkError(`Failed to wait for download button: ${err.message}`, {\n\t\t\t\tstage,\n\t\t\t\ttimeout,\n\t\t\t\toriginalError: err.message,\n\t\t\t})\n\t\t}\n\t}\n\tasync getIntermediateUrl(): Promise<string> {\n\t\tconst stage = 'extractUrl'\n\t\tthis.trackStage(stage)\n\t\tif (!this.interactions) {\n\t\t\tthrow new BrowserError('Interactions not ready', { stage })\n\t\t}\n\t\ttry {\n\t\t\tconst url = await this.interactions.extractIntermediateUrl()\n\t\t\tthis.logger.debug('Intermediate URL extracted', { url })\n\t\t\treturn url\n\t\t} catch (err: any) {\n\t\t\tawait this.handleStageError(stage, err)\n\t\t\tthrow new NetworkError(`Failed to extract intermediate URL: ${err.message}`, {\n\t\t\t\tstage,\n\t\t\t\toriginalError: err.message,\n\t\t\t})\n\t\t}\n\t}\n\tasync startDownloadAndWait(autoUrl: string): Promise<Download | null> {\n\t\tconst stage = 'downloadWait'\n\t\tthis.trackStage(stage)\n\t\tif (!this.page) {\n\t\t\tthrow new BrowserError('Page not initialized', { stage })\n\t\t}\n\t\tconst downloadPromise = this.page\n\t\t\t.waitForEvent('download', { timeout: this.opts.timeout })\n\t\t\t.catch((err) => {\n\t\t\t\tthis.logger.debug('Download event timeout', {\n\t\t\t\t\ttimeout: this.opts.timeout,\n\t\t\t\t\terror: err.message,\n\t\t\t\t})\n\t\t\t\treturn null\n\t\t\t})\n\t\tthis.logger.debug('Navigating to auto download URL', { url: autoUrl })\n\t\tawait this.page\n\t\t\t.goto(autoUrl, { waitUntil: 'commit', timeout: this.opts.timeout })\n\t\t\t.catch((err) => {\n\t\t\t\tthis.logger.warn('Navigation to auto URL failed, continuing anyway', {\n\t\t\t\t\terror: err.message,\n\t\t\t\t})\n\t\t\t})\n\t\tconst download = await downloadPromise\n\t\tif (download) {\n\t\t\tthis.logger.info('Download event captured')\n\t\t\treturn download\n\t\t}\n\t\tthis.logger.debug('No download event captured within timeout')\n\t\treturn null\n\t}\n\tasync fallbackCollectFileResponse(): Promise<{ buffer: Buffer; filename: string } | null> {\n\t\tconst stage = 'fallbackIntercept'\n\t\tthis.trackStage(stage)\n\t\tif (!this.page) {\n\t\t\tthrow new BrowserError('Page not initialized', { stage })\n\t\t}\n\t\tthis.logger.info('Falling back to response interception')\n\t\tconst responses: Response[] = []\n\t\tconst handler = (res: Response) => responses.push(res)\n\t\tthis.page.on('response', handler)\n\t\tawait sleep(DEFAULTS.fallbackWaitMs)\n\t\tthis.page.off('response', handler)\n\t\tconst fileResponse = [...responses].reverse().find((r) => {\n\t\t\tconst headers = r.headers()\n\t\t\tconst disposition = headers['content-disposition']\n\t\t\tconst contentType = headers['content-type']\n\t\t\tconst url = r.url()\n\t\t\treturn (\n\t\t\t\t(disposition && disposition.includes('attachment')) ||\n\t\t\t\turl.includes('/downloadfile/') ||\n\t\t\t\t(contentType &&\n\t\t\t\t\t!contentType.startsWith('text/html') &&\n\t\t\t\t\t!contentType.startsWith('application/json'))\n\t\t\t)\n\t\t})\n\t\tif (!fileResponse) {\n\t\t\tthis.logger.debug('No suitable file response found in fallback', {\n\t\t\t\tresponseCount: responses.length,\n\t\t\t\tsampleUrls: responses.slice(0, 3).map((r) => r.url()),\n\t\t\t})\n\t\t\treturn null\n\t\t}\n\t\ttry {\n\t\t\tconst buffer = await fileResponse.body()\n\t\t\tlet filename = extractFilenameFromContentDisposition(\n\t\t\t\tfileResponse.headers()['content-disposition'],\n\t\t\t)\n\t\t\tif (!filename) {\n\t\t\t\tconst urlParts = fileResponse.url().split('/')\n\t\t\t\tfilename = urlParts[urlParts.length - 1]?.split('?')[0] || 'file.bin'\n\t\t\t}\n\t\t\tfilename = filename.replace(/[<>:\"/\\\\|?*]/g, '_')\n\t\t\tthis.logger.info('Fallback response captured', {\n\t\t\t\tfilename,\n\t\t\t\tsize: buffer.length,\n\t\t\t\tcontentType: fileResponse.headers()['content-type'],\n\t\t\t})\n\t\t\treturn { buffer, filename }\n\t\t} catch (err: any) {\n\t\t\tthis.logger.error('Failed to read fallback response body', { error: err.message })\n\t\t\treturn null\n\t\t}\n\t}\n\tasync saveDebugArtifacts(errorMessage: string): Promise<string | null> {\n\t\tif (!this.opts.debug || !this.page) return null\n\t\ttry {\n\t\t\tthis.debugDir = path.join(\n\t\t\t\tos.tmpdir(),\n\t\t\t\t`sfile_debug_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n\t\t\t)\n\t\t\tawait fs.mkdir(this.debugDir, { recursive: true })\n\t\t\tconst tasks: Promise<void>[] = [\n\t\t\t\tthis.page\n\t\t\t\t\t.screenshot({\n\t\t\t\t\t\tpath: path.join(this.debugDir, 'error.png'),\n\t\t\t\t\t\tfullPage: true,\n\t\t\t\t\t})\n\t\t\t\t\t.then(() => {}),\n\t\t\t\tfs.writeFile(path.join(this.debugDir, 'error.html'), await this.page.content()),\n\t\t\t\tfs.writeFile(path.join(this.debugDir, 'error.txt'), errorMessage),\n\t\t\t\tfs.writeFile(\n\t\t\t\t\tpath.join(this.debugDir, 'stages.json'),\n\t\t\t\t\tJSON.stringify(this.stageHistory, null, 2),\n\t\t\t\t),\n\t\t\t]\n\t\t\tawait Promise.all(tasks)\n\t\t\tthis.logger.info('Debug artifacts saved', { debugDir: this.debugDir })\n\t\t\treturn this.debugDir\n\t\t} catch (e: any) {\n\t\t\tthis.logger.error('Failed to save debug artifacts', { error: e.message })\n\t\t\treturn null\n\t\t}\n\t}\n\tprivate async handleStageError(stage: string, error: any): Promise<void> {\n\t\tif (this.opts.debug) {\n\t\t\tawait this.saveDebugArtifacts(\n\t\t\t\t`Error at stage \"${stage}\": ${error?.message || 'Unknown error'}`,\n\t\t\t)\n\t\t}\n\t}\n\tasync close(): Promise<void> {\n\t\tconst closePromises = [\n\t\t\tthis.page?.close().catch(() => {}),\n\t\t\tthis.context?.close().catch(() => {}),\n\t\t\tthis.browser?.close().catch(() => {}),\n\t\t].filter(Boolean) as Promise<void>[]\n\t\tawait Promise.all(closePromises)\n\t\tthis.logger.debug('Browser closed', { stages: this.stageHistory.length })\n\t}\n\tasync getPage(): Promise<Page | null> {\n\t\treturn this.page\n\t}\n\tgetDebugDir(): string | null {\n\t\treturn this.debugDir\n\t}\n\tgetStageHistory(): ReadonlyArray<{ stage: string; ts: number }> {\n\t\treturn [...this.stageHistory]\n\t}\n}\n","import { createWriteStream, type WriteStream } from 'fs'\nimport { safeStringify } from './helpers.js'\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error'\nexport interface LoggerOptions {\n\tdebugMode?: boolean\n\tcorrelationId?: string\n\tlogFile?: string\n\tprefix?: string\n}\nexport class Logger {\n\tprivate minLevel: LogLevel\n\tprivate correlationId: string | undefined\n\tprivate fileStream: WriteStream | null = null\n\tprivate prefix: string\n\tconstructor(options: LoggerOptions = {}) {\n\t\tthis.minLevel = options.debugMode ? 'debug' : 'info'\n\t\tthis.correlationId = options.correlationId\n\t\tthis.prefix = options.prefix || ''\n\t\tif (options.logFile) {\n\t\t\tthis.fileStream = createWriteStream(options.logFile, { flags: 'a' })\n\t\t}\n\t}\n\tsetCorrelationId(id: string): void {\n\t\tthis.correlationId = id\n\t}\n\tsetDebug(enabled: boolean): void {\n\t\tthis.minLevel = enabled ? 'debug' : 'info'\n\t}\n\tprivate levelPriority(level: LogLevel): number {\n\t\treturn { debug: 0, info: 1, warn: 2, error: 3 }[level]\n\t}\n\tprivate shouldLog(level: LogLevel): boolean {\n\t\treturn this.levelPriority(level) >= this.levelPriority(this.minLevel)\n\t}\n\tprivate format(level: LogLevel, message: string, context?: unknown): string {\n\t\tconst ts = new Date().toISOString()\n\t\tconst corr = this.correlationId ? ` [${this.correlationId}]` : ''\n\t\tconst prefix = this.prefix ? ` [${this.prefix}]` : ''\n\t\tconst ctx = context ? ` | ${safeStringify(context)}` : ''\n\t\treturn `[${ts}]${corr}${prefix} ${level.toUpperCase()}: ${message}${ctx}`\n\t}\n\tprivate write(level: LogLevel, message: string, context?: unknown): void {\n\t\tif (!this.shouldLog(level)) return\n\t\tconst formatted = this.format(level, message, context)\n\t\tconst consoleMethod = level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log'\n\t\tconsole[consoleMethod](formatted)\n\t\tif (this.fileStream?.writable) {\n\t\t\tthis.fileStream.write(formatted + '\\n')\n\t\t}\n\t}\n\tdebug(msg: string, ctx?: unknown): void {\n\t\tthis.write('debug', msg, ctx)\n\t}\n\tinfo(msg: string, ctx?: unknown): void {\n\t\tthis.write('info', msg, ctx)\n\t}\n\twarn(msg: string, ctx?: unknown): void {\n\t\tthis.write('warn', msg, ctx)\n\t}\n\terror(msg: string, ctx?: unknown, err?: Error): void {\n\t\tlet errorCtx: unknown\n\t\tif (err) {\n\t\t\tconst baseObj =\n\t\t\t\tctx && typeof ctx === 'object' && ctx !== null\n\t\t\t\t\t? { ...(ctx as Record<string, unknown>) }\n\t\t\t\t\t: {}\n\t\t\terrorCtx = {\n\t\t\t\t...baseObj,\n\t\t\t\terror: { name: err.name, message: err.message },\n\t\t\t}\n\t\t} else {\n\t\t\terrorCtx = ctx\n\t\t}\n\t\tthis.write('error', msg, errorCtx)\n\t}\n\tchild(prefix: string): Logger {\n\t\tconst childOptions: LoggerOptions = {\n\t\t\tdebugMode: this.minLevel === 'debug',\n\t\t\t...(this.correlationId !== undefined && { correlationId: this.correlationId }),\n\t\t\tprefix: this.prefix ? `${this.prefix}:${prefix}` : prefix,\n\t\t}\n\t\tconst child = new Logger(childOptions)\n\t\tif (this.fileStream) {\n\t\t\t;(child as any).fileStream = this.fileStream\n\t\t}\n\t\treturn child\n\t}\n\tasync close(): Promise<void> {\n\t\tif (this.fileStream && !this.fileStream.closed) {\n\t\t\treturn new Promise((resolve) => this.fileStream?.end(resolve))\n\t\t}\n\t}\n}\n","import { DEFAULTS } from './defaults.js'\nexport interface DownloadOptions {\n\theadless?: boolean\n\tuserAgent?: string\n\ttimeout?: number\n\tdownloadButtonTimeout?: number\n\tretries?: number\n\tretryDelay?: number\n\tonProgress?: (\n\t\tpercent: number,\n\t\ttotal: 100,\n\t\tmeta: { stage: string; message: string; attempt?: number },\n\t) => void\n\tcorrelationId?: string\n\tdebug?: boolean\n\tsaveDebugArtifacts?: boolean\n\tlogFile?: string\n\t_internal?: {\n\t\tstage?: string\n\t}\n}\nexport interface DownloadResult {\n\tfilePath: string\n\tsize: number\n\tmethod: 'direct' | 'fallback'\n\tcorrelationId?: string\n\tdurationMs?: number\n\tattempts?: number\n}\ntype NormalizedOptions = Required<\n\tOmit<DownloadOptions, 'onProgress' | 'correlationId' | '_internal' | 'logFile'>\n> & {\n\tonProgress?: DownloadOptions['onProgress']\n\tcorrelationId?: string\n\t_internal?: DownloadOptions['_internal']\n\tlogFile?: string\n}\nexport function normalizeOptions(opts?: DownloadOptions): NormalizedOptions {\n\tconst base = {\n\t\theadless: opts?.headless ?? DEFAULTS.headless,\n\t\tuserAgent: opts?.userAgent ?? DEFAULTS.userAgent,\n\t\ttimeout: opts?.timeout ?? DEFAULTS.timeout,\n\t\tdownloadButtonTimeout: opts?.downloadButtonTimeout ?? DEFAULTS.downloadButtonTimeout,\n\t\tretries: opts?.retries ?? DEFAULTS.retries,\n\t\tretryDelay: opts?.retryDelay ?? DEFAULTS.retryDelay,\n\t\tdebug: opts?.debug ?? false,\n\t\tsaveDebugArtifacts: opts?.saveDebugArtifacts ?? DEFAULTS.saveDebugArtifacts,\n\t}\n\tconst optional = {\n\t\t...(opts?.onProgress !== undefined && { onProgress: opts.onProgress }),\n\t\t...(opts?.correlationId !== undefined && { correlationId: opts.correlationId }),\n\t\t...(opts?._internal !== undefined && { _internal: opts._internal }),\n\t\t...(opts?.logFile !== undefined && { logFile: opts.logFile }),\n\t}\n\treturn { ...base, ...optional } as NormalizedOptions\n}\n","import { ValidationError } from '../errors/index.js'\nimport { sanitizeFilename } from '../utils/helpers.js'\nimport { DEFAULTS } from '../config/defaults.js'\nexport class InputValidator {\n\tstatic validateUrl(\n\t\turl: unknown,\n\t\tallowedDomains: readonly string[] = ['sfile.co', 'sfile.mobi'],\n\t): asserts url is string {\n\t\tif (!url || typeof url !== 'string') {\n\t\t\tthrow new ValidationError('URL must be a non-empty string', {\n\t\t\t\treceived: typeof url,\n\t\t\t\turl,\n\t\t\t})\n\t\t}\n\t\tconst hasAllowedDomain = allowedDomains.some((domain) => url.includes(domain))\n\t\tif (!hasAllowedDomain) {\n\t\t\tthrow new ValidationError(`URL must contain one of: ${allowedDomains.join(', ')}`, {\n\t\t\t\turl,\n\t\t\t\tallowedDomains,\n\t\t\t})\n\t\t}\n\t\ttry {\n\t\t\tconst parsed = new URL(url)\n\t\t\tif (!['http:', 'https:'].includes(parsed.protocol)) {\n\t\t\t\tthrow new ValidationError('URL must use http or https protocol', {\n\t\t\t\t\turl,\n\t\t\t\t\tprotocol: parsed.protocol,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (parseErr) {\n\t\t\tthrow new ValidationError('Invalid URL format', {\n\t\t\t\turl,\n\t\t\t\tparseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n\t\t\t})\n\t\t}\n\t}\n\tstatic validateSaveDir(dir: unknown): asserts dir is string {\n\t\tif (!dir || typeof dir !== 'string') {\n\t\t\tthrow new ValidationError('Save directory must be a non-empty string', {\n\t\t\t\treceived: typeof dir,\n\t\t\t\tdir,\n\t\t\t})\n\t\t}\n\t}\n\tstatic sanitizeFilename(name: string): string {\n\t\tconst replacement = DEFAULTS.sanitizeReplacement\n\t\tconst maxLength = DEFAULTS.maxFilenameLength\n\t\tconst sanitized = sanitizeFilename(name, replacement)\n\t\tif (!sanitized || sanitized.length === 0) {\n\t\t\tconst ext = name.includes('.') ? name.split('.').pop() : 'bin'\n\t\t\treturn `downloaded_file${ext ? '.' + ext : ''}`.slice(0, maxLength)\n\t\t}\n\t\treturn sanitized.slice(0, maxLength)\n\t}\n\tstatic validateOptions(options: unknown): void {\n\t\tif (options && typeof options !== 'object') {\n\t\t\tthrow new ValidationError('Options must be an object or undefined', {\n\t\t\t\treceived: typeof options,\n\t\t\t})\n\t\t}\n\t\tconst opts = options as Record<string, unknown>\n\t\tconst numericFields = ['timeout', 'retries', 'retryDelay', 'downloadButtonTimeout'] as const\n\t\tfor (const field of numericFields) {\n\t\t\tif (field in opts && typeof opts[field] !== 'number') {\n\t\t\t\tthrow new ValidationError(`Option '${field}' must be a number`, {\n\t\t\t\t\tfield,\n\t\t\t\t\treceived: typeof opts[field],\n\t\t\t\t\tvalue: opts[field],\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst booleanFields = ['headless', 'debug', 'saveDebugArtifacts'] as const\n\t\tfor (const field of booleanFields) {\n\t\t\tif (field in opts && typeof opts[field] !== 'boolean') {\n\t\t\t\tthrow new ValidationError(`Option '${field}' must be a boolean`, {\n\t\t\t\t\tfield,\n\t\t\t\t\treceived: typeof opts[field],\n\t\t\t\t\tvalue: opts[field],\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n","import * as path from 'path'\nimport { promises as fs } from 'fs'\nimport { randomUUID } from 'crypto'\nimport { BrowserManager } from '../browser/browser-manager.js'\nimport { Logger } from '../utils/logger.js'\nimport { NetworkError, AppError } from '../errors/index.js'\nimport { DownloadOptions, DownloadResult, normalizeOptions } from '../config/schema.js'\nimport { DEFAULTS } from '../config/defaults.js'\nimport { InputValidator } from './validator.js'\nimport { sleep, calculateRetryDelay } from '../utils/helpers.js'\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): T {\n\treturn Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as T\n}\nfunction safeProgress(\n\tonProgress: unknown,\n\tpercent: number,\n\ttotal: number,\n\tmeta: Record<string, unknown>,\n): void {\n\tif (typeof onProgress === 'function') {\n\t\ttry {\n\t\t\t;(onProgress as any)(percent, total, meta)\n\t\t} catch (err) {\n\t\t\tconsole.warn('Progress callback error:', err)\n\t\t}\n\t}\n}\nasync function executeDownload(\n\turl: string,\n\tsaveDir: string,\n\topts: ReturnType<typeof normalizeOptions>,\n\tlogger: Logger,\n): Promise<DownloadResult> {\n\tconst startTime = Date.now()\n\tconst browserMgr = new BrowserManager(logger.child('BrowserManager'), {\n\t\theadless: opts.headless,\n\t\tuserAgent: opts.userAgent,\n\t\ttimeout: opts.timeout,\n\t\tdebug: opts.debug,\n\t\tdownloadButtonTimeout: opts.downloadButtonTimeout,\n\t})\n\tlet finalPath: string\n\tlet fileSize: number\n\tlet method: 'direct' | 'fallback'\n\ttry {\n\t\tlogger.info('Starting download workflow', { url })\n\t\tsafeProgress(opts.onProgress, 10, 100, {\n\t\t\tstage: 'launch',\n\t\t\tmessage: 'Launching browser',\n\t\t\tattempt: 1,\n\t\t})\n\t\tawait browserMgr.launch()\n\t\tawait browserMgr.goto(url, 'networkidle')\n\t\tsafeProgress(opts.onProgress, 30, 100, { stage: 'navigation', message: 'Page loaded' })\n\t\tawait browserMgr.waitForDownloadButton()\n\t\tsafeProgress(opts.onProgress, 50, 100, {\n\t\t\tstage: 'button',\n\t\t\tmessage: 'Download button ready',\n\t\t})\n\t\tconst intermediateUrl = await browserMgr.getIntermediateUrl()\n\t\tconst autoUrl = intermediateUrl.includes('?')\n\t\t\t? `${intermediateUrl}&auto=1`\n\t\t\t: `${intermediateUrl}?auto=1`\n\t\tlogger.debug('Triggering download', { autoUrl })\n\t\tsafeProgress(opts.onProgress, 70, 100, { stage: 'trigger', message: 'Download triggered' })\n\t\tlet download = await browserMgr.startDownloadAndWait(autoUrl)\n\t\tif (download) {\n\t\t\tconst suggested = download.suggestedFilename() || 'file.bin'\n\t\t\tconst filename = InputValidator.sanitizeFilename(suggested)\n\t\t\tfinalPath = path.join(saveDir, filename)\n\t\t\tawait download.saveAs(finalPath)\n\t\t\tconst stat = await fs.stat(finalPath)\n\t\t\tfileSize = stat.size\n\t\t\tmethod = 'direct'\n\t\t\tlogger.info('Saved via direct download', { path: finalPath, size: fileSize })\n\t\t} else {\n\t\t\tlogger.warn('Direct download not captured, trying fallback')\n\t\t\tconst fallback = await browserMgr.fallbackCollectFileResponse()\n\t\t\tif (!fallback) {\n\t\t\t\tthrow new NetworkError('No download event and no file response found', {\n\t\t\t\t\turl,\n\t\t\t\t\tintermediateUrl,\n\t\t\t\t\tautoUrl,\n\t\t\t\t\tstage: 'fallbackFailed',\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst { buffer, filename: rawName } = fallback\n\t\t\tconst filename = InputValidator.sanitizeFilename(rawName)\n\t\t\tfinalPath = path.join(saveDir, filename)\n\t\t\tawait fs.writeFile(finalPath, buffer)\n\t\t\tfileSize = buffer.length\n\t\t\tmethod = 'fallback'\n\t\t\tlogger.info('Saved via fallback', { path: finalPath, size: fileSize })\n\t\t}\n\t\tsafeProgress(opts.onProgress, 100, 100, { stage: 'complete', message: 'Download finished' })\n\t\tconst result: DownloadResult = {\n\t\t\tfilePath: finalPath,\n\t\t\tsize: fileSize,\n\t\t\tmethod,\n\t\t\tdurationMs: Date.now() - startTime,\n\t\t\tattempts: 1,\n\t\t}\n\t\tif (opts.correlationId !== undefined) {\n\t\t\tresult.correlationId = opts.correlationId\n\t\t}\n\t\treturn result\n\t} catch (err: unknown) {\n\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\tconst appError =\n\t\t\terror instanceof AppError\n\t\t\t\t? error\n\t\t\t\t: new NetworkError(error.message, {\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tsaveDir,\n\t\t\t\t\t\tcorrelationId: opts.correlationId,\n\t\t\t\t\t\toriginalError: error.message,\n\t\t\t\t\t\terrorName: error.name,\n\t\t\t\t\t})\n\t\tif (opts.saveDebugArtifacts) {\n\t\t\tconst debugPath = await browserMgr.saveDebugArtifacts(appError.message)\n\t\t\tif (debugPath) {\n\t\t\t\t;(appError as any).debugPath = debugPath\n\t\t\t\tif (appError.context && typeof appError.context === 'object') {\n\t\t\t\t\t;(appError.context as any).debugPath = debugPath\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow appError\n\t} finally {\n\t\tawait browserMgr\n\t\t\t.close()\n\t\t\t.catch((e) => logger.error('Failed to close browser', { error: e.message }))\n\t\tawait logger.close().catch((e) => console.error('Failed to close logger', e))\n\t}\n}\nexport async function downloadSfile(\n\turl: string,\n\tsaveDir: string,\n\toptions?: DownloadOptions,\n): Promise<DownloadResult> {\n\tconst opts = normalizeOptions(options)\n\tconst correlationId = opts.correlationId || randomUUID()\n\ttype LoggerConstructorParams = ConstructorParameters<typeof Logger>\n\ttype LoggerOptionsType = LoggerConstructorParams[0]\n\tconst loggerOptions: LoggerOptionsType = {\n\t\tdebugMode: opts.debug,\n\t\tcorrelationId,\n\t\tprefix: 'downloadSfile',\n\t}\n\tif (opts.logFile !== undefined) {\n\t\tloggerOptions.logFile = opts.logFile\n\t}\n\tconst logger = new Logger(loggerOptions)\n\tInputValidator.validateUrl(url)\n\tInputValidator.validateSaveDir(saveDir)\n\tInputValidator.validateOptions(options)\n\tawait fs.mkdir(saveDir, { recursive: true })\n\tlet lastError: Error | undefined\n\tlet attempt = 0\n\twhile (attempt < opts.retries) {\n\t\tattempt++\n\t\ttry {\n\t\t\tlogger.info(`Download attempt ${attempt}/${opts.retries}`, { url })\n\t\t\tconst result = await executeDownload(url, saveDir, opts, logger)\n\t\t\tlogger.info(`Download succeeded`, {\n\t\t\t\tduration: result.durationMs,\n\t\t\t\tattempts: attempt,\n\t\t\t\tmethod: result.method,\n\t\t\t})\n\t\t\treturn {\n\t\t\t\t...result,\n\t\t\t\tattempts: attempt,\n\t\t\t\tcorrelationId,\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tlastError = err instanceof Error ? err : new Error(String(err))\n\t\t\tconst isRetryable = lastError instanceof AppError && lastError.retryable\n\t\t\tconst isLastAttempt = attempt >= opts.retries\n\t\t\tif (!isRetryable || isLastAttempt) {\n\t\t\t\tlogger.error(`Download failed permanently`, {\n\t\t\t\t\terror: lastError.message,\n\t\t\t\t\tattempt,\n\t\t\t\t\tretryable: isRetryable,\n\t\t\t\t\tlastAttempt: isLastAttempt,\n\t\t\t\t})\n\t\t\t\tthrow lastError\n\t\t\t}\n\t\t\tconst delay = calculateRetryDelay(attempt, opts.retryDelay, DEFAULTS.maxRetryDelay)\n\t\t\tlogger.warn(`Retrying download`, {\n\t\t\t\tattempt,\n\t\t\t\tmaxAttempts: opts.retries,\n\t\t\t\tdelayMs: Math.round(delay),\n\t\t\t\terror: lastError.message,\n\t\t\t})\n\t\t\tsafeProgress(opts.onProgress, 0, 100, {\n\t\t\t\tstage: 'retry',\n\t\t\t\tmessage: `Retry ${attempt}/${opts.retries}`,\n\t\t\t\tattempt,\n\t\t\t})\n\t\t\tawait sleep(delay)\n\t\t}\n\t}\n\tthrow lastError || new Error('Download failed after all retries')\n}\nexport async function downloadSfileSafe(\n\turl: string,\n\tsaveDir: string,\n\toptions?: DownloadOptions,\n): Promise<import('../utils/result.js').Result<DownloadResult, Error>> {\n\ttry {\n\t\tconst result = await downloadSfile(url, saveDir, options)\n\t\treturn { success: true, value: result }\n\t} catch (error) {\n\t\treturn { success: false, error: error as Error }\n\t}\n}\nexport function createDownloader(defaultOptions?: DownloadOptions) {\n\tconst defaults = normalizeOptions(defaultOptions)\n\treturn {\n\t\tasync download(\n\t\t\turl: string,\n\t\t\tsaveDir: string,\n\t\t\tcallOptions?: DownloadOptions,\n\t\t): Promise<DownloadResult> {\n\t\t\tconst merged = stripUndefined({ ...defaults, ...callOptions })\n\t\t\treturn downloadSfile(url, saveDir, merged as DownloadOptions)\n\t\t},\n\t\tasync downloadSafe(\n\t\t\turl: string,\n\t\t\tsaveDir: string,\n\t\t\tcallOptions?: DownloadOptions,\n\t\t): Promise<import('../utils/result.js').Result<DownloadResult, Error>> {\n\t\t\tconst merged = stripUndefined({ ...defaults, ...callOptions })\n\t\t\treturn downloadSfileSafe(url, saveDir, merged as DownloadOptions)\n\t\t},\n\t\twithOptions(newDefaults: Partial<DownloadOptions>) {\n\t\t\tconst merged = stripUndefined({ ...defaults, ...newDefaults })\n\t\t\treturn createDownloader(merged as DownloadOptions)\n\t\t},\n\t}\n}\n","export type Result<T, E = Error> = { success: true; value: T } | { success: false; error: E }\nexport function ok<T, E = never>(value: T): Result<T, E> {\n\treturn { success: true, value }\n}\nexport function err<E, T = never>(error: E): Result<T, E> {\n\treturn { success: false, error }\n}\nexport function isSuccess<T, E>(result: Result<T, E>): result is { success: true; value: T } {\n\treturn result.success === true\n}\nexport function isFailure<T, E>(result: Result<T, E>): result is { success: false; error: E } {\n\treturn result.success === false\n}\nexport function map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> {\n\tif (result.success) {\n\t\treturn { success: true, value: fn(result.value) }\n\t}\n\treturn result\n}\nexport function mapError<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> {\n\tif (!result.success) {\n\t\treturn { success: false, error: fn(result.error) }\n\t}\n\treturn result\n}\nexport function getOrThrow<T, E>(result: Result<T, E>): T {\n\tif (result.success) return result.value\n\tthrow result.error\n}\n"],"names":["path","fs"],"mappings":"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"}
package/changelog CHANGED
@@ -1,3 +1,111 @@
1
+ commit bee596315d96e819de09fc3c41be8dbf48a0cff6
2
+ Author: neuxdotdev <neuxdev1@gmail.com>
3
+ Date: Thu Apr 2 15:43:57 2026 +0700
4
+
5
+ update to v 2.2.0
6
+
7
+ commit 1815dceedf75d9bcf6792d434e29c13f1df3febb
8
+ Author: neuxdotdev <neuxdev1@gmail.com>
9
+ Date: Thu Apr 2 15:43:35 2026 +0700
10
+
11
+ release v2.2.0
12
+
13
+ commit d6c9f4ba721946e3ad1fbf03e62c303b2b0db4e2
14
+ Author: neuxdotdev <neuxdev1@gmail.com>
15
+ Date: Thu Apr 2 15:42:30 2026 +0700
16
+
17
+ chore: add homepage adn remake email addres
18
+
19
+ commit 4d496d12961ac124dc925023edd09f3b2ed4ca5d
20
+ Author: neuxdotdev <neuxdev1@gmail.com>
21
+ Date: Thu Apr 2 14:41:42 2026 +0700
22
+
23
+ docs: add license documentation
24
+
25
+ commit 1ef8bc47f743ae5d9635f8a9a523339270f059b3
26
+ Author: neuxdotdev <neuxdev1@gmail.com>
27
+ Date: Thu Apr 2 14:38:30 2026 +0700
28
+
29
+ chore(deps): install docsify-cli
30
+
31
+ commit 3957dff22a80224a94e773c483b5c9e1ef1b862d
32
+ Author: neuxdotdev <neuxdev1@gmail.com>
33
+ Date: Thu Apr 2 14:37:47 2026 +0700
34
+
35
+ docs: add documentation
36
+
37
+ commit ac756423e300f61657cd12684b65b1193598de39
38
+ Author: neuxdotdev <neuxdev1@gmail.com>
39
+ Date: Thu Apr 2 14:29:09 2026 +0700
40
+
41
+ chore(ci): remove --forzed flags
42
+
43
+ commit ea96232f1d174bf637ca02b3ba5e15f6cd1e8379
44
+ Author: neuxdotdev <neuxdev1@gmail.com>
45
+ Date: Thu Apr 2 14:16:02 2026 +0700
46
+
47
+ chore(ci): remove --forzed flags
48
+
49
+ commit b5f26e7d68db524dde16e415f389513a5aa1d625
50
+ Author: neuxdotdev <neuxdev1@gmail.com>
51
+ Date: Thu Apr 2 14:14:00 2026 +0700
52
+
53
+ chore: make all deps to latest version
54
+
55
+ commit aec077df776784f2454d4f02137a0e4da2b47c3f
56
+ Author: neuxdotdev <neuxdev1@gmail.com>
57
+ Date: Thu Apr 2 14:13:43 2026 +0700
58
+
59
+ chore: make all deps to latest version
60
+
61
+ commit 3d97ed023174f7b516911f08ff13b8591cb383a4
62
+ Author: neuxdotdev <neuxdev1@gmail.com>
63
+ Date: Thu Apr 2 14:09:48 2026 +0700
64
+
65
+ refactor(scripts): remove format-build.js — no longer needed
66
+
67
+ commit a58bb5ac7fb2264404366473ad7fd29cb004d82d
68
+ Author: neuxdotdev <neuxdev1@gmail.com>
69
+ Date: Thu Apr 2 14:09:48 2026 +0700
70
+
71
+ refactor(build): remove rollup.config.mjs — build system simplified
72
+
73
+ commit 6d382fcdba8c4d7cf66603227fc5c16de012100a
74
+ Author: neuxdotdev <neuxdev1@gmail.com>
75
+ Date: Thu Apr 2 14:09:47 2026 +0700
76
+
77
+ chore(lock): sync bun.lock with new dev dependency
78
+
79
+ commit 3600641dfaa04be4b72c4a5030a0518df7f77e5b
80
+ Author: neuxdotdev <neuxdev1@gmail.com>
81
+ Date: Thu Apr 2 14:09:47 2026 +0700
82
+
83
+ chore(deps): add @types/rollup-plugin-peer-deps-external for type safety
84
+
85
+ commit 2d7e364aad740865ebfaf1b9e93527d2a239b7d9
86
+ Author: neuxdotdev <neuxdev1@gmail.com>
87
+ Date: Thu Apr 2 11:53:26 2026 +0700
88
+
89
+ docs: edit changelog
90
+
91
+ commit c2d0e21d0e8bbae449db5ba6e6af0b6f572b3374
92
+ Author: neuxdotdev <neuxdev1@gmail.com>
93
+ Date: Thu Apr 2 11:52:54 2026 +0700
94
+
95
+ chore: make all deps to latest version
96
+
97
+ commit c383258c2f9f74541c8d5a254d1fe4f7bf45f79e
98
+ Author: neuxdotdev <neuxdev1@gmail.com>
99
+ Date: Thu Apr 2 11:45:20 2026 +0700
100
+
101
+ docs: edit readme.md
102
+
103
+ commit 70c7736412b06fb7d4660d2f0b8d6769efa6ae88
104
+ Author: neuxdotdev <neuxdev1@gmail.com>
105
+ Date: Thu Apr 2 11:34:23 2026 +0700
106
+
107
+ docs: update changelog
108
+
1
109
  commit 549aec09f8297318fcf52d69bc8262d78d769e0d
2
110
  Author: neuxdotdev <neuxdev1@gmail.com>
3
111
  Date: Thu Apr 2 11:31:54 2026 +0700
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sfiledl",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
4
4
  "description": "Implement and automate downloading of any file from sfile.co with javascripts library, written entirely in typescripts",
5
5
  "type": "module",
6
6
  "main": "./build/lib.cjs",
@@ -32,12 +32,12 @@
32
32
  "clean": "rm -rf build node_modules/.cache",
33
33
  "typecheck": "tsc --noEmit",
34
34
  "build:ts": "tsc",
35
- "build:bundle": "rollup -c",
35
+ "build:bundle": "rollup -c rollup.config.ts --configPlugin typescript",
36
36
  "build": "bun run clean && bun run typecheck && bun run build:ts && bun run build:bundle",
37
37
  "dev:ts": "tsc --emitDeclarationOnly --outDir build --watch",
38
38
  "build:prod": "NODE_ENV=production bun run build",
39
39
  "dev": "rollup -c -w --bundleConfigAsCjs",
40
- "format:build": "bun ./scripts/format-build.js",
40
+ "format:build": "bun ./scripts/format-build.ts",
41
41
  "lint": "tsc --noEmit",
42
42
  "format": "prettier . --write",
43
43
  "format:check": "prettier . --check",
@@ -57,7 +57,7 @@
57
57
  "bun",
58
58
  "sfile-downloader"
59
59
  ],
60
- "author": "neuxdotdev <neux@github.com>",
60
+ "author": "neuxdotdev <neuxdev1@gmail.com>",
61
61
  "repository": {
62
62
  "type": "git",
63
63
  "url": "git+https://github.com/neuxdotdev/sfiledl.git"
@@ -65,20 +65,22 @@
65
65
  "bugs": {
66
66
  "url": "https://github.com/neuxdotdev/sfiledl/issues"
67
67
  },
68
- "homepage": "https://github.com/neuxdotdev/sfiledl#readme",
68
+ "homepage": "https://neuxdotdev.github.io/sfiledl/",
69
69
  "dependencies": {
70
- "playwright": "^1.58.2"
70
+ "playwright": "^1.59.1"
71
71
  },
72
72
  "devDependencies": {
73
- "@types/node": "^25.5.0",
74
73
  "@rollup/plugin-commonjs": "^29.0.2",
75
74
  "@rollup/plugin-json": "^6.1.0",
76
75
  "@rollup/plugin-node-resolve": "^16.0.3",
77
76
  "@rollup/plugin-replace": "^6.0.3",
78
77
  "@rollup/plugin-terser": "^1.0.0",
79
78
  "@rollup/plugin-typescript": "^12.3.0",
79
+ "@types/node": "^25.5.0",
80
+ "@types/rollup-plugin-peer-deps-external": "^2.2.6",
81
+ "docsify-cli": "^4.4.4",
80
82
  "dts-bundle-generator": "^9.5.1",
81
- "esbuild": "^0.27.4",
83
+ "esbuild": "^0.27.5",
82
84
  "husky": "^9.1.7",
83
85
  "prettier": "^3.8.1",
84
86
  "rollup": "^4.60.1",