sfiledl 2.2.1 → 2.2.3
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.cjs +23 -3
- package/build/lib.cjs.map +1 -1
- package/build/lib.mjs +23 -3
- package/build/lib.mjs.map +1 -1
- package/package.json +2 -3
- package/readme.md +104 -44
- package/changelog +0 -793
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/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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"}
|
|
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 === undefined || options === null) {\n\t\t\treturn\n\t\t}\n\t\tif (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 && opts[field] !== undefined && 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 && opts[field] !== undefined && 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\tconst stringFields = ['correlationId', 'logFile', 'userAgent'] as const\n\t\tfor (const field of stringFields) {\n\t\t\tif (field in opts && opts[field] !== undefined && typeof opts[field] !== 'string') {\n\t\t\t\tthrow new ValidationError(`Option '${field}' must be a string`, {\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\tif (\n\t\t\t'onProgress' in opts &&\n\t\t\topts['onProgress'] !== undefined &&\n\t\t\ttypeof opts['onProgress'] !== 'function'\n\t\t) {\n\t\t\tthrow new ValidationError(`Option 'onProgress' must be a function`, {\n\t\t\t\treceived: typeof opts['onProgress'],\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":";;;;;;;;AAAM,MAAgB,QAAS,SAAQ,KAAK,CAAA;AAC3B,IAAA,SAAS;AACT,IAAA,OAAO;AACP,IAAA,IAAI;AACJ,IAAA,SAAS;AACzB,IAAA,WAAA,CACC,OAAe,EACf,IAAY,EACZ,SAAA,GAAqB,KAAK,EAC1B,OAAiC,EAAA;QAEjC,KAAK,CAAC,OAAO,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI;AACjC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1E,QAAA,IAAI,KAAK,CAAC,iBAAiB,EAAE;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;QAChD;AACA,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACpB;IACA,MAAM,GAAA;QACL,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,aAAa,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS;SACzE;IACF;IACA,QAAQ,GAAA;AACP,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,IAAI,CAAA,GAAA,EAAM,IAAI,CAAC,OAAO,EAAE;IACtD;AACA,IAAA,MAAM,CAAC,IAAY,EAAA;AAClB,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI;IAC1B;IACA,WAAW,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACtB;AACA;;ACzCK,MAAO,eAAgB,SAAQ,QAAQ,CAAA;IAC5C,WAAA,CAAY,OAAe,EAAE,OAAiC,EAAA;QAC7D,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,CAAC;AAClD,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACpB;AACA;AACK,MAAO,YAAa,SAAQ,QAAQ,CAAA;IACzC,WAAA,CAAY,OAAe,EAAE,OAAiC,EAAA;QAC7D,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC;AAC9C,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACpB;AACA;AACK,MAAO,SAAU,SAAQ,QAAQ,CAAA;IACtC,WAAA,CAAY,OAAe,EAAE,OAAiC,EAAA;QAC7D,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC;AAC5C,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACpB;AACA;AACK,MAAO,YAAa,SAAQ,QAAQ,CAAA;IACzC,WAAA,CAAY,OAAe,EAAE,OAAiC,EAAA;QAC7D,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC;AAC9C,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACpB;AACA;AACK,SAAU,UAAU,CAAC,GAAY,EAAA;IACtC,OAAO,GAAG,YAAY,QAAQ;AAC/B;AACM,SAAU,gBAAgB,CAAC,GAAY,EAAA;IAC5C,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,SAAS;AACxC;AACM,SAAU,eAAe,CAAC,GAAY,EAAE,IAAY,EAAA;IACzD,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;AAC5C;;ACjCO,MAAM,QAAQ,GAAG;AACvB,IAAA,SAAS,EACR,iHAAiH;AAClH,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,qBAAqB,EAAE,KAAK;AAC5B,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,kBAAkB,EAAE,IAAI;AACxB,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,mBAAmB,EAAE,GAAG;;;MCTZ,qBAAqB,CAAA;AAExB,IAAA,IAAA;AACA,IAAA,MAAA;IAFT,WAAA,CACS,IAAU,EACV,MAAc,EAAA;QADd,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,MAAM,GAAN,MAAM;IACZ;IACH,MAAM,qBAAqB,CAAC,OAAe,EAAA;QAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;AAC7C,QAAA,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACnD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC;AAC1D,QAAA,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAC9B,MAAK;YACJ,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAA6B;AAC3E,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,KAAK;YACtB,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC1C,YAAA,MAAM,UAAU,GACf,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;AAC5B,gBAAA,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM;AAC5C,gBAAA,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;YACnC,OAAO,CAAC,EACP,IAAI;AACJ,gBAAA,IAAI,KAAK,GAAG;AACZ,gBAAA,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAClB,KAAK,CAAC,aAAa,KAAK,MAAM;gBAC9B,CAAC,UAAU,CACX;AACF,QAAA,CAAC,EACD,EAAE,OAAO,EAAE,CACX;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC;IACzD;AACA,IAAA,MAAM,sBAAsB,GAAA;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC;AAC1D,QAAA,IAAI;AACH,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,KAAI;gBACtD,MAAM,MAAM,GAAG,EAAuB;gBACtC,OAAO,MAAM,CAAC,IAAI;AACnB,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAChD,MAAM,IAAI,YAAY,CAAC,0CAA0C,EAAE,EAAE,IAAI,EAAE,CAAC;YAC7E;AACA,YAAA,OAAO,IAAI;QACZ;QAAE,OAAO,GAAY,EAAE;AACtB,YAAA,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE;AACvE,gBAAA,MAAM,IAAI,YAAY,CAAC,+CAA+C,EAAE;AACvE,oBAAA,QAAQ,EAAE,WAAW;oBACrB,aAAa,EAAE,GAAG,CAAC,OAAO;AAC1B,iBAAA,CAAC;YACH;AACA,YAAA,MAAM,GAAG;QACV;IACD;AACA;;SCxDe,gBAAgB,CAAC,IAAY,EAAE,WAAW,GAAG,GAAG,EAAA;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG;AAChB,SAAA,OAAO,CAAC,wBAAwB,EAAE,WAAW;AAC7C,SAAA,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,EAAG,WAAW,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC,EAAE,WAAW;AACvD,SAAA,IAAI,EAAE;IACR,MAAM,SAAS,GAAG,GAAG;IACrB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;AAC7C,IAAA,OAAO,OAAO,IAAI,CAAA,IAAA,EAAO,WAAW,KAAK;AAC1C;AACO,MAAM,KAAK,GAAG,CAAC,EAAU,KAC/B,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;SACjC,aAAa,CAAC,KAAc,EAAE,MAAM,GAAG,CAAC,EAAA;AACvD,IAAA,IAAI;AACH,QAAA,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE;QAC1B,OAAO,IAAI,CAAC,SAAS,CACpB,KAAK,EACL,CAAC,IAAI,EAAE,GAAG,KAAI;YACb,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;AAC5C,gBAAA,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,oBAAA,OAAO,YAAY;AACtC,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACd;YACA,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,gBAAA,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG;AACxD,YAAA,IAAI,GAAG,YAAY,KAAK,EAAE;AACzB,gBAAA,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;YAClE;AACA,YAAA,OAAO,GAAG;QACX,CAAC,EACD,MAAM,CACN;IACF;AAAE,IAAA,MAAM;AACP,QAAA,OAAO,kBAAkB;IAC1B;AACD;AACM,SAAU,qCAAqC,CAAC,MAA0B,EAAA;AAC/E,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI;IACxB,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC;AAClE,IAAA,IAAI,YAAY,GAAG,CAAC,CAAC,EAAE;AACtB,QAAA,IAAI;AACH,YAAA,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C;QAAE,MAAM,EAAC;IACV;IACA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC;AAC7D,IAAA,IAAI,WAAW,GAAG,CAAC,CAAC;AAAE,QAAA,OAAO,WAAW,CAAC,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC;AAC9D,IAAA,IAAI,UAAU,GAAG,CAAC,CAAC;AAAE,QAAA,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAChD,IAAA,OAAO,IAAI;AACZ;AACM,SAAU,mBAAmB,CAClC,OAAe,EACf,WAAmB,EACnB,UAAU,GAAG,KAAK,EAAA;AAElB,IAAA,MAAM,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,WAAW;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,EAAE,UAAU,CAAC;AAClD;AACM,SAAU,OAAO,CAAC,KAAc,EAAA;IACrC,QACC,KAAK,YAAY,KAAK;AACtB,SAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC;AAErE;;MC9Ca,cAAc,CAAA;AAQjB,IAAA,MAAA;AACA,IAAA,IAAA;IARD,OAAO,GAAmB,IAAI;IAC9B,OAAO,GAA0B,IAAI;IACrC,IAAI,GAAgB,IAAI;IACxB,YAAY,GAAiC,IAAI;IACjD,QAAQ,GAAkB,IAAI;IACrB,YAAY,GAAyC,EAAE;IACxE,WAAA,CACS,MAAc,EACd,IAA2B,EAAA;QAD3B,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,IAAI,GAAJ,IAAI;IACV;AACK,IAAA,UAAU,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAClD;AACA,IAAA,MAAM,MAAM,GAAA;QACX,MAAM,KAAK,GAAG,QAAQ;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI;AACH,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACvE,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;AACpC,gBAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;AAC5B,gBAAA,IAAI,EAAE;oBACL,cAAc;oBACd,0BAA0B;oBAC1B,yBAAyB;oBACzB,iCAAiC;oBACjC,gBAAgB;oBAChB,aAAa;AACb,iBAAA;AACD,aAAA,CAAC;YACF,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAC5C,gBAAA,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;AAC9B,gBAAA,eAAe,EAAE,IAAI;AACrB,gBAAA,MAAM,EAAE,OAAO;AACf,gBAAA,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;AACtC,aAAA,CAAC;AACF,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAC7B,gBAAA;AACC,oBAAA,IAAI,EAAE,mBAAmB;AACzB,oBAAA,KAAK,EAAE,GAAG;AACV,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,IAAI,EAAE,GAAG;AACT,oBAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;AAC7C,iBAAA;AACD,aAAA,CAAC;YACF,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACxC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;AACrE,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBACpB,IAAI,CAAC,mBAAmB,EAAE;YAC3B;AACA,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;QAClC;QAAE,OAAO,GAAQ,EAAE;YAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC;YACvC,MAAM,IAAI,YAAY,CAAC,CAAA,0BAAA,EAA6B,GAAG,CAAC,OAAO,EAAE,EAAE;gBAClE,KAAK;gBACL,aAAa,EAAE,GAAG,CAAC,OAAO;AAC1B,gBAAA,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;AAC9B,aAAA,CAAC;QACH;IACD;IACQ,mBAAmB,GAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,KAAI;AAC/B,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE;AACvB,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE;AACvB,YAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACrB,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,CAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrE;AAAO,iBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,CAAE,CAAC;YACtC;AAAO,iBAAA,IAAI,IAAI,KAAK,OAAO,EAAE;gBAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,CAAE,CAAC;YACvC;AACD,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,KAAI;YACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,CAAC;AACjD,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,KAAI;AACrC,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACnC,gBAAA,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACd,gBAAA,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;gBACpB,KAAK,EAAE,OAAO,EAAE,SAAS;AACzB,aAAA,CAAC;AACH,QAAA,CAAC,CAAC;IACH;AACA,IAAA,MAAM,IAAI,CACT,GAAW,EACX,YAAoE,aAAa,EAAA;QAEjF,MAAM,KAAK,GAAG,YAAY;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACf,MAAM,IAAI,YAAY,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC;QAC1D;AACA,QAAA,IAAI;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,cAAA,EAAiB,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpF,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACrE;QAAE,OAAO,GAAQ,EAAE;YAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC;YACvC,MAAM,IAAI,YAAY,CAAC,CAAA,mBAAA,EAAsB,GAAG,CAAC,OAAO,EAAE,EAAE;gBAC3D,GAAG;gBACH,KAAK;gBACL,SAAS;AACT,gBAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAC1B,aAAa,EAAE,GAAG,CAAC,OAAO;AAC1B,aAAA,CAAC;QACH;IACD;AACA,IAAA,MAAM,qBAAqB,GAAA;QAC1B,MAAM,KAAK,GAAG,eAAe;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACvB,MAAM,IAAI,YAAY,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC;QAC5D;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,QAAQ,CAAC,qBAAqB;AACjF,QAAA,IAAI;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC;QACvD;QAAE,OAAO,GAAQ,EAAE;YAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC;YACvC,MAAM,IAAI,YAAY,CAAC,CAAA,oCAAA,EAAuC,GAAG,CAAC,OAAO,EAAE,EAAE;gBAC5E,KAAK;gBACL,OAAO;gBACP,aAAa,EAAE,GAAG,CAAC,OAAO;AAC1B,aAAA,CAAC;QACH;IACD;AACA,IAAA,MAAM,kBAAkB,GAAA;QACvB,MAAM,KAAK,GAAG,YAAY;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACvB,MAAM,IAAI,YAAY,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC;QAC5D;AACA,QAAA,IAAI;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE;YAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,GAAG,EAAE,CAAC;AACxD,YAAA,OAAO,GAAG;QACX;QAAE,OAAO,GAAQ,EAAE;YAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC;YACvC,MAAM,IAAI,YAAY,CAAC,CAAA,oCAAA,EAAuC,GAAG,CAAC,OAAO,EAAE,EAAE;gBAC5E,KAAK;gBACL,aAAa,EAAE,GAAG,CAAC,OAAO;AAC1B,aAAA,CAAC;QACH;IACD;IACA,MAAM,oBAAoB,CAAC,OAAe,EAAA;QACzC,MAAM,KAAK,GAAG,cAAc;AAC5B,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACf,MAAM,IAAI,YAAY,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC;QAC1D;AACA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;AAC3B,aAAA,YAAY,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACvD,aAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACd,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;AAC3C,gBAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAC1B,KAAK,EAAE,GAAG,CAAC,OAAO;AAClB,aAAA,CAAC;AACF,YAAA,OAAO,IAAI;AACZ,QAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QACtE,MAAM,IAAI,CAAC;AACT,aAAA,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjE,aAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACd,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;gBACpE,KAAK,EAAE,GAAG,CAAC,OAAO;AAClB,aAAA,CAAC;AACH,QAAA,CAAC,CAAC;AACH,QAAA,MAAM,QAAQ,GAAG,MAAM,eAAe;QACtC,IAAI,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC;AAC3C,YAAA,OAAO,QAAQ;QAChB;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC;AAC9D,QAAA,OAAO,IAAI;IACZ;AACA,IAAA,MAAM,2BAA2B,GAAA;QAChC,MAAM,KAAK,GAAG,mBAAmB;AACjC,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACf,MAAM,IAAI,YAAY,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC;QAC1D;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC;QACzD,MAAM,SAAS,GAAe,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,CAAC,GAAa,KAAK,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;AACjC,QAAA,MAAM,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC;AAClC,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;AACxD,YAAA,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE;AAC3B,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC;AAClD,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;AAC3C,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE;YACnB,QACC,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC;AAClD,gBAAA,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAC9B,iBAAC,WAAW;AACX,oBAAA,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC;oBACpC,CAAC,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAE/C,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,YAAY,EAAE;AAClB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE;gBAChE,aAAa,EAAE,SAAS,CAAC,MAAM;gBAC/B,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;AACrD,aAAA,CAAC;AACF,YAAA,OAAO,IAAI;QACZ;AACA,QAAA,IAAI;AACH,YAAA,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE;AACxC,YAAA,IAAI,QAAQ,GAAG,qCAAqC,CACnD,YAAY,CAAC,OAAO,EAAE,CAAC,qBAAqB,CAAC,CAC7C;YACD,IAAI,CAAC,QAAQ,EAAE;gBACd,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C,gBAAA,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU;YACtE;YACA,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;AACjD,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBAC9C,QAAQ;gBACR,IAAI,EAAE,MAAM,CAAC,MAAM;AACnB,gBAAA,WAAW,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC;AACnD,aAAA,CAAC;AACF,YAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;QAC5B;QAAE,OAAO,GAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AAClF,YAAA,OAAO,IAAI;QACZ;IACD;IACA,MAAM,kBAAkB,CAAC,YAAoB,EAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;AAC/C,QAAA,IAAI;AACH,YAAA,IAAI,CAAC,QAAQ,GAAGA,aAAI,CAAC,IAAI,CACxB,EAAE,CAAC,MAAM,EAAE,EACX,CAAA,YAAA,EAAe,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE,CACrE;AACD,YAAA,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAClD,YAAA,MAAM,KAAK,GAAoB;AAC9B,gBAAA,IAAI,CAAC;AACH,qBAAA,UAAU,CAAC;oBACX,IAAI,EAAEA,aAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;AAC3C,oBAAA,QAAQ,EAAE,IAAI;iBACd;AACA,qBAAA,IAAI,CAAC,MAAK,EAAE,CAAC,CAAC;gBAChB,EAAE,CAAC,SAAS,CAACA,aAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC/E,gBAAA,EAAE,CAAC,SAAS,CAACA,aAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC;gBACjE,EAAE,CAAC,SAAS,CACXA,aAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAC1C;aACD;AACD,YAAA,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC,QAAQ;QACrB;QAAE,OAAO,CAAM,EAAE;AAChB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AACzE,YAAA,OAAO,IAAI;QACZ;IACD;AACQ,IAAA,MAAM,gBAAgB,CAAC,KAAa,EAAE,KAAU,EAAA;AACvD,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACpB,YAAA,MAAM,IAAI,CAAC,kBAAkB,CAC5B,mBAAmB,KAAK,CAAA,GAAA,EAAM,KAAK,EAAE,OAAO,IAAI,eAAe,CAAA,CAAE,CACjE;QACF;IACD;AACA,IAAA,MAAM,KAAK,GAAA;AACV,QAAA,MAAM,aAAa,GAAG;AACrB,YAAA,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;AAClC,YAAA,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;AACrC,SAAA,CAAC,MAAM,CAAC,OAAO,CAAoB;AACpC,QAAA,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAChC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IAC1E;AACA,IAAA,MAAM,OAAO,GAAA;QACZ,OAAO,IAAI,CAAC,IAAI;IACjB;IACA,WAAW,GAAA;QACV,OAAO,IAAI,CAAC,QAAQ;IACrB;IACA,eAAe,GAAA;AACd,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;IAC9B;AACA;;MCnSY,MAAM,CAAA;AACV,IAAA,QAAQ;AACR,IAAA,aAAa;IACb,UAAU,GAAuB,IAAI;AACrC,IAAA,MAAM;AACd,IAAA,WAAA,CAAY,UAAyB,EAAE,EAAA;AACtC,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,GAAG,MAAM;AACpD,QAAA,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa;QAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE;AAClC,QAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AACpB,YAAA,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QACrE;IACD;AACA,IAAA,gBAAgB,CAAC,EAAU,EAAA;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;IACxB;AACA,IAAA,QAAQ,CAAC,OAAgB,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM;IAC3C;AACQ,IAAA,aAAa,CAAC,KAAe,EAAA;QACpC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IACvD;AACQ,IAAA,SAAS,CAAC,KAAe,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;IACtE;AACQ,IAAA,MAAM,CAAC,KAAe,EAAE,OAAe,EAAE,OAAiB,EAAA;QACjE,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,GAAG,CAAA,EAAA,EAAK,IAAI,CAAC,aAAa,CAAA,CAAA,CAAG,GAAG,EAAE;AACjE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,CAAA,CAAA,CAAG,GAAG,EAAE;AACrD,QAAA,MAAM,GAAG,GAAG,OAAO,GAAG,CAAA,GAAA,EAAM,aAAa,CAAC,OAAO,CAAC,CAAA,CAAE,GAAG,EAAE;AACzD,QAAA,OAAO,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,CAAC,WAAW,EAAE,CAAA,EAAA,EAAK,OAAO,CAAA,EAAG,GAAG,EAAE;IAC1E;AACQ,IAAA,KAAK,CAAC,KAAe,EAAE,OAAe,EAAE,OAAiB,EAAA;AAChE,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE;AAC5B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QACtD,MAAM,aAAa,GAAG,KAAK,KAAK,OAAO,GAAG,OAAO,GAAG,KAAK,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK;AACrF,QAAA,OAAO,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACxC;IACD;IACA,KAAK,CAAC,GAAW,EAAE,GAAa,EAAA;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC;IAC9B;IACA,IAAI,CAAC,GAAW,EAAE,GAAa,EAAA;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC;IAC7B;IACA,IAAI,CAAC,GAAW,EAAE,GAAa,EAAA;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC;IAC7B;AACA,IAAA,KAAK,CAAC,GAAW,EAAE,GAAa,EAAE,GAAW,EAAA;AAC5C,QAAA,IAAI,QAAiB;QACrB,IAAI,GAAG,EAAE;YACR,MAAM,OAAO,GACZ,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK;AACzC,kBAAE,EAAE,GAAI,GAA+B;kBACrC,EAAE;AACN,YAAA,QAAQ,GAAG;AACV,gBAAA,GAAG,OAAO;AACV,gBAAA,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;aAC/C;QACF;aAAO;YACN,QAAQ,GAAG,GAAG;QACf;QACA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC;IACnC;AACA,IAAA,KAAK,CAAC,MAAc,EAAA;AACnB,QAAA,MAAM,YAAY,GAAkB;AACnC,YAAA,SAAS,EAAE,IAAI,CAAC,QAAQ,KAAK,OAAO;AACpC,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC9E,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,CAAA,EAAI,MAAM,EAAE,GAAG,MAAM;SACzD;AACD,QAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC;AACtC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AAClB,YAAA,KAAa,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC7C;AACA,QAAA,OAAO,KAAK;IACb;AACA,IAAA,MAAM,KAAK,GAAA;QACV,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AAC/C,YAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/D;IACD;AACA;;ACvDK,SAAU,gBAAgB,CAAC,IAAsB,EAAA;AACtD,IAAA,MAAM,IAAI,GAAG;AACZ,QAAA,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,QAAQ,CAAC,QAAQ;AAC7C,QAAA,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,QAAQ,CAAC,SAAS;AAChD,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO;AAC1C,QAAA,qBAAqB,EAAE,IAAI,EAAE,qBAAqB,IAAI,QAAQ,CAAC,qBAAqB;AACpF,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO;AAC1C,QAAA,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,QAAQ,CAAC,UAAU;AACnD,QAAA,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK;AAC3B,QAAA,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,IAAI,QAAQ,CAAC,kBAAkB;KAC3E;AACD,IAAA,MAAM,QAAQ,GAAG;AAChB,QAAA,IAAI,IAAI,EAAE,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;AACtE,QAAA,IAAI,IAAI,EAAE,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC/E,QAAA,IAAI,IAAI,EAAE,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AACnE,QAAA,IAAI,IAAI,EAAE,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;KAC7D;AACD,IAAA,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAuB;AACrD;;MCpDa,cAAc,CAAA;IAC1B,OAAO,WAAW,CACjB,GAAY,EACZ,iBAAoC,CAAC,UAAU,EAAE,YAAY,CAAC,EAAA;QAE9D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACpC,YAAA,MAAM,IAAI,eAAe,CAAC,gCAAgC,EAAE;gBAC3D,QAAQ,EAAE,OAAO,GAAG;gBACpB,GAAG;AACH,aAAA,CAAC;QACH;AACA,QAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9E,IAAI,CAAC,gBAAgB,EAAE;YACtB,MAAM,IAAI,eAAe,CAAC,CAAA,yBAAA,EAA4B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,EAAE;gBAClF,GAAG;gBACH,cAAc;AACd,aAAA,CAAC;QACH;AACA,QAAA,IAAI;AACH,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,YAAA,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AACnD,gBAAA,MAAM,IAAI,eAAe,CAAC,qCAAqC,EAAE;oBAChE,GAAG;oBACH,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACzB,iBAAA,CAAC;YACH;QACD;QAAE,OAAO,QAAQ,EAAE;AAClB,YAAA,MAAM,IAAI,eAAe,CAAC,oBAAoB,EAAE;gBAC/C,GAAG;AACH,gBAAA,UAAU,EAAE,QAAQ,YAAY,KAAK,GAAG,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3E,aAAA,CAAC;QACH;IACD;IACA,OAAO,eAAe,CAAC,GAAY,EAAA;QAClC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACpC,YAAA,MAAM,IAAI,eAAe,CAAC,2CAA2C,EAAE;gBACtE,QAAQ,EAAE,OAAO,GAAG;gBACpB,GAAG;AACH,aAAA,CAAC;QACH;IACD;IACA,OAAO,gBAAgB,CAAC,IAAY,EAAA;AACnC,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,mBAAmB;AAChD,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,iBAAiB;QAC5C,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC;QACrD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK;YAC9D,OAAO,CAAA,eAAA,EAAkB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAA,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;QACpE;QACA,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;IACrC;IACA,OAAO,eAAe,CAAC,OAAgB,EAAA;QACtC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE;YAC9C;QACD;AACA,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAChC,YAAA,MAAM,IAAI,eAAe,CAAC,wCAAwC,EAAE;gBACnE,QAAQ,EAAE,OAAO,OAAO;AACxB,aAAA,CAAC;QACH;QACA,MAAM,IAAI,GAAG,OAAkC;QAC/C,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,CAAU;AAC5F,QAAA,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;AAClC,YAAA,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE;AAClF,gBAAA,MAAM,IAAI,eAAe,CAAC,CAAA,QAAA,EAAW,KAAK,oBAAoB,EAAE;oBAC/D,KAAK;AACL,oBAAA,QAAQ,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC;AAC5B,oBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;AAClB,iBAAA,CAAC;YACH;QACD;QACA,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,oBAAoB,CAAU;AAC1E,QAAA,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;AAClC,YAAA,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;AACnF,gBAAA,MAAM,IAAI,eAAe,CAAC,CAAA,QAAA,EAAW,KAAK,qBAAqB,EAAE;oBAChE,KAAK;AACL,oBAAA,QAAQ,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC;AAC5B,oBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;AAClB,iBAAA,CAAC;YACH;QACD;QACA,MAAM,YAAY,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,WAAW,CAAU;AACvE,QAAA,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE;AACjC,YAAA,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE;AAClF,gBAAA,MAAM,IAAI,eAAe,CAAC,CAAA,QAAA,EAAW,KAAK,oBAAoB,EAAE;oBAC/D,KAAK;AACL,oBAAA,QAAQ,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC;AAC5B,oBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;AAClB,iBAAA,CAAC;YACH;QACD;QACA,IACC,YAAY,IAAI,IAAI;AACpB,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,SAAS;AAChC,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,UAAU,EACvC;AACD,YAAA,MAAM,IAAI,eAAe,CAAC,CAAA,sCAAA,CAAwC,EAAE;AACnE,gBAAA,QAAQ,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC;AACnC,aAAA,CAAC;QACH;IACD;AACA;;AC9FD,SAAS,cAAc,CAAoC,GAAM,EAAA;IAChE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAM;AACvF;AACA,SAAS,YAAY,CACpB,UAAmB,EACnB,OAAe,EACf,KAAa,EACb,IAA6B,EAAA;AAE7B,IAAA,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE;AACrC,QAAA,IAAI;AACD,YAAA,UAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;QAC3C;QAAE,OAAO,GAAG,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,CAAC;QAC9C;IACD;AACD;AACA,eAAe,eAAe,CAC7B,GAAW,EACX,OAAe,EACf,IAAyC,EACzC,MAAc,EAAA;AAEd,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;IAC5B,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE;QACrE,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;AACjD,KAAA,CAAC;AACF,IAAA,IAAI,SAAiB;AACrB,IAAA,IAAI,QAAgB;AACpB,IAAA,IAAI,MAA6B;AACjC,IAAA,IAAI;QACH,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,GAAG,EAAE,CAAC;QAClD,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE;AACtC,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,mBAAmB;AAC5B,YAAA,OAAO,EAAE,CAAC;AACV,SAAA,CAAC;AACF,QAAA,MAAM,UAAU,CAAC,MAAM,EAAE;QACzB,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;AACzC,QAAA,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AACvF,QAAA,MAAM,UAAU,CAAC,qBAAqB,EAAE;QACxC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE;AACtC,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,uBAAuB;AAChC,SAAA,CAAC;AACF,QAAA,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,kBAAkB,EAAE;AAC7D,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG;cACzC,CAAA,EAAG,eAAe,CAAA,OAAA;AACpB,cAAE,CAAA,EAAG,eAAe,CAAA,OAAA,CAAS;QAC9B,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,CAAC;AAChD,QAAA,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;QAC3F,IAAI,QAAQ,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC;QAC7D,IAAI,QAAQ,EAAE;YACb,MAAM,SAAS,GAAG,QAAQ,CAAC,iBAAiB,EAAE,IAAI,UAAU;YAC5D,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAC3D,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;AACxC,YAAA,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;YAChC,MAAM,IAAI,GAAG,MAAMC,QAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AACrC,YAAA,QAAQ,GAAG,IAAI,CAAC,IAAI;YACpB,MAAM,GAAG,QAAQ;AACjB,YAAA,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9E;aAAO;AACN,YAAA,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC;AAC5D,YAAA,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,2BAA2B,EAAE;YAC/D,IAAI,CAAC,QAAQ,EAAE;AACd,gBAAA,MAAM,IAAI,YAAY,CAAC,8CAA8C,EAAE;oBACtE,GAAG;oBACH,eAAe;oBACf,OAAO;AACP,oBAAA,KAAK,EAAE,gBAAgB;AACvB,iBAAA,CAAC;YACH;YACA,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ;YAC9C,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACzD,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;YACxC,MAAMA,QAAE,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;AACrC,YAAA,QAAQ,GAAG,MAAM,CAAC,MAAM;YACxB,MAAM,GAAG,UAAU;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACvE;AACA,QAAA,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC5F,QAAA,MAAM,MAAM,GAAmB;AAC9B,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM;AACN,YAAA,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;AAClC,YAAA,QAAQ,EAAE,CAAC;SACX;AACD,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;AACrC,YAAA,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;QAC1C;AACA,QAAA,OAAO,MAAM;IACd;IAAE,OAAO,GAAY,EAAE;QACtB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACjE,QAAA,MAAM,QAAQ,GACb,KAAK,YAAY;AAChB,cAAE;AACF,cAAE,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE;gBAChC,GAAG;gBACH,OAAO;gBACP,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,aAAa,EAAE,KAAK,CAAC,OAAO;gBAC5B,SAAS,EAAE,KAAK,CAAC,IAAI;AACrB,aAAA,CAAC;AACL,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC5B,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvE,IAAI,SAAS,EAAE;AACZ,gBAAA,QAAgB,CAAC,SAAS,GAAG,SAAS;gBACxC,IAAI,QAAQ,CAAC,OAAO,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE;AAC3D,oBAAA,QAAQ,CAAC,OAAe,CAAC,SAAS,GAAG,SAAS;gBACjD;YACD;QACD;AACA,QAAA,MAAM,QAAQ;IACf;YAAU;AACT,QAAA,MAAM;AACJ,aAAA,KAAK;aACL,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;IAC9E;AACD;AACO,eAAe,aAAa,CAClC,GAAW,EACX,OAAe,EACf,OAAyB,EAAA;AAEzB,IAAA,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,UAAU,EAAE;AAGxD,IAAA,MAAM,aAAa,GAAsB;QACxC,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,aAAa;AACb,QAAA,MAAM,EAAE,eAAe;KACvB;AACD,IAAA,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;AAC/B,QAAA,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;IACrC;AACA,IAAA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC;AACxC,IAAA,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC;AAC/B,IAAA,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC;AACvC,IAAA,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC;AACvC,IAAA,MAAMA,QAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC5C,IAAA,IAAI,SAA4B;IAChC,IAAI,OAAO,GAAG,CAAC;AACf,IAAA,OAAO,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,EAAE;AACT,QAAA,IAAI;AACH,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;AACnE,YAAA,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC;AAChE,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,kBAAA,CAAoB,EAAE;gBACjC,QAAQ,EAAE,MAAM,CAAC,UAAU;AAC3B,gBAAA,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM;AACrB,aAAA,CAAC;YACF,OAAO;AACN,gBAAA,GAAG,MAAM;AACT,gBAAA,QAAQ,EAAE,OAAO;gBACjB,aAAa;aACb;QACF;QAAE,OAAO,GAAY,EAAE;AACtB,YAAA,SAAS,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,SAAS,YAAY,QAAQ,IAAI,SAAS,CAAC,SAAS;AACxE,YAAA,MAAM,aAAa,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO;AAC7C,YAAA,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE;AAClC,gBAAA,MAAM,CAAC,KAAK,CAAC,CAAA,2BAAA,CAA6B,EAAE;oBAC3C,KAAK,EAAE,SAAS,CAAC,OAAO;oBACxB,OAAO;AACP,oBAAA,SAAS,EAAE,WAAW;AACtB,oBAAA,WAAW,EAAE,aAAa;AAC1B,iBAAA,CAAC;AACF,gBAAA,MAAM,SAAS;YAChB;AACA,YAAA,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC;AACnF,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,CAAmB,EAAE;gBAChC,OAAO;gBACP,WAAW,EAAE,IAAI,CAAC,OAAO;AACzB,gBAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC1B,KAAK,EAAE,SAAS,CAAC,OAAO;AACxB,aAAA,CAAC;YACF,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE;AACrC,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,OAAO,EAAE,CAAA,MAAA,EAAS,OAAO,IAAI,IAAI,CAAC,OAAO,CAAA,CAAE;gBAC3C,OAAO;AACP,aAAA,CAAC;AACF,YAAA,MAAM,KAAK,CAAC,KAAK,CAAC;QACnB;IACD;AACA,IAAA,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,mCAAmC,CAAC;AAClE;AACO,eAAe,iBAAiB,CACtC,GAAW,EACX,OAAe,EACf,OAAyB,EAAA;AAEzB,IAAA,IAAI;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IACxC;IAAE,OAAO,KAAK,EAAE;QACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE;IACjD;AACD;AACM,SAAU,gBAAgB,CAAC,cAAgC,EAAA;AAChE,IAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,cAAc,CAAC;IACjD,OAAO;AACN,QAAA,MAAM,QAAQ,CACb,GAAW,EACX,OAAe,EACf,WAA6B,EAAA;AAE7B,YAAA,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;YAC9D,OAAO,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAyB,CAAC;QAC9D,CAAC;AACD,QAAA,MAAM,YAAY,CACjB,GAAW,EACX,OAAe,EACf,WAA6B,EAAA;AAE7B,YAAA,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;YAC9D,OAAO,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAyB,CAAC;QAClE,CAAC;AACD,QAAA,WAAW,CAAC,WAAqC,EAAA;AAChD,YAAA,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;AAC9D,YAAA,OAAO,gBAAgB,CAAC,MAAyB,CAAC;QACnD,CAAC;KACD;AACF;;ACzOM,SAAU,SAAS,CAAO,MAAoB,EAAA;AACnD,IAAA,OAAO,MAAM,CAAC,OAAO,KAAK,IAAI;AAC/B;AACM,SAAU,SAAS,CAAO,MAAoB,EAAA;AACnD,IAAA,OAAO,MAAM,CAAC,OAAO,KAAK,KAAK;AAChC;AAOM,SAAU,QAAQ,CAAU,MAAoB,EAAE,EAAmB,EAAA;AAC1E,IAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACpB,QAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACnD;AACA,IAAA,OAAO,MAAM;AACd;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sfiledl",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.3",
|
|
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",
|
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"build",
|
|
12
12
|
"readme.md",
|
|
13
|
-
"license"
|
|
14
|
-
"changelog"
|
|
13
|
+
"license"
|
|
15
14
|
],
|
|
16
15
|
"sideEffects": false,
|
|
17
16
|
"engines": {
|
package/readme.md
CHANGED
|
@@ -2,10 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
> Automate file downloads from [sfile.co](https://sfile.co/) — reliable, retry‑aware, and fully typed.
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/sfiledl)
|
|
6
|
-
[](https://www.npmjs.com/package/sfiledl)
|
|
6
|
+
[](https://www.npmjs.com/package/sfiledl)
|
|
7
|
+
[](https://github.com/neuxdotdev/sfiledl/blob/main/license)
|
|
8
|
+
[](https://github.com/neuxdotdev/sfiledl/actions)
|
|
9
|
+
[](https://www.typescriptlang.org)
|
|
10
|
+
[](https://playwright.dev)
|
|
11
|
+
[](https://bun.sh)
|
|
12
|
+
[](https://nodejs.org)
|
|
13
|
+
[](https://prettier.io)
|
|
14
|
+
[](http://makeapullrequest.com)
|
|
15
|
+
<<<<<<< HEAD
|
|
16
|
+
=======
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Table of Contents
|
|
21
|
+
|
|
22
|
+
- [Installation](#installation)
|
|
23
|
+
- [Quick Start](#quick-start)
|
|
24
|
+
- [API Reference](#api-reference)
|
|
25
|
+
- [downloadSfile](#downloadsfile)
|
|
26
|
+
- [downloadSfileSafe](#downloadsfilesafe)
|
|
27
|
+
- [createDownloader](#createdownloader)
|
|
28
|
+
- [DownloadOptions](#downloadoptions)
|
|
29
|
+
- [DownloadResult](#downloadresult)
|
|
30
|
+
- [Error Handling](#error-handling)
|
|
31
|
+
- [Error Types](#error-types)
|
|
32
|
+
- [Retryable Errors](#retryable-errors)
|
|
33
|
+
- [Debug Mode & Artifacts](#debug-mode--artifacts)
|
|
34
|
+
- [Logging & Correlation](#logging--correlation)
|
|
35
|
+
- [Progress Tracking](#progress-tracking)
|
|
36
|
+
- [Development](#development)
|
|
37
|
+
- [Project Structure](#project-structure)
|
|
38
|
+
- [Scripts](#scripts)
|
|
39
|
+
- [Contributing](#contributing)
|
|
40
|
+
- [License](#license)
|
|
41
|
+
>>>>>>> 91ae467 (docs: imrpoving documentation)
|
|
9
42
|
|
|
10
43
|
---
|
|
11
44
|
|
|
@@ -22,6 +55,8 @@ npm install sfiledl
|
|
|
22
55
|
bunx playwright install chromium # or npx playwright install chromium
|
|
23
56
|
```
|
|
24
57
|
|
|
58
|
+
**Prerequisites:** Node.js >=24 or Bun >=1.3.
|
|
59
|
+
|
|
25
60
|
---
|
|
26
61
|
|
|
27
62
|
## Quick Start
|
|
@@ -80,46 +115,42 @@ Creates a reusable downloader with preset options.
|
|
|
80
115
|
```typescript
|
|
81
116
|
const dl = createDownloader({ headless: false, debug: true })
|
|
82
117
|
const result = await dl.download('https://sfile.co/file/xyz', './out')
|
|
83
|
-
|
|
118
|
+
|
|
119
|
+
// safe variant
|
|
84
120
|
const safeResult = await dl.downloadSafe(url, './out')
|
|
85
|
-
|
|
121
|
+
|
|
122
|
+
// chain new defaults
|
|
86
123
|
const quietDl = dl.withOptions({ debug: false })
|
|
87
124
|
```
|
|
88
125
|
|
|
89
126
|
### `DownloadOptions`
|
|
90
127
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
saveDebugArtifacts?: boolean // save screenshot/html on error – default: true
|
|
107
|
-
logFile?: string // write structured logs to file
|
|
108
|
-
}
|
|
109
|
-
```
|
|
128
|
+
All options are optional.
|
|
129
|
+
|
|
130
|
+
| Option | Type | Default | Description |
|
|
131
|
+
| ----------------------- | -------------------------------- | -------------------- | --------------------------------------------------------------- |
|
|
132
|
+
| `headless` | `boolean` | `true` | Run browser in headless mode. |
|
|
133
|
+
| `debug` | `boolean` | `false` | Enable verbose logging and debug artifacts. |
|
|
134
|
+
| `userAgent` | `string` | Chrome on Windows UA | Custom user agent string. |
|
|
135
|
+
| `timeout` | `number` (ms) | `60000` | Navigation and download timeout. |
|
|
136
|
+
| `downloadButtonTimeout` | `number` (ms) | `30000` | Timeout for download button to appear. |
|
|
137
|
+
| `retries` | `number` | `3` | Total attempts (including first). |
|
|
138
|
+
| `retryDelay` | `number` (ms) | `1000` | Base delay before exponential backoff. |
|
|
139
|
+
| `onProgress` | `(percent, total, meta) => void` | `undefined` | Progress callback. See [Progress Tracking](#progress-tracking). |
|
|
140
|
+
| `correlationId` | `string` | auto-generated UUID | ID for tracing across logs. |
|
|
141
|
+
| `saveDebugArtifacts` | `boolean` | `true` | Save screenshot and HTML on error. |
|
|
142
|
+
| `logFile` | `string` | `undefined` | Write structured logs to file. |
|
|
110
143
|
|
|
111
144
|
### `DownloadResult`
|
|
112
145
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
```
|
|
146
|
+
| Property | Type | Description |
|
|
147
|
+
| --------------- | -------------------------- | -------------------------------------------- |
|
|
148
|
+
| `filePath` | `string` | Absolute path to saved file. |
|
|
149
|
+
| `size` | `number` (bytes) | File size. |
|
|
150
|
+
| `method` | `'direct'` or `'fallback'` | How the file was captured. |
|
|
151
|
+
| `correlationId` | `string` (optional) | The ID used for logging. |
|
|
152
|
+
| `durationMs` | `number` (optional) | Total time from start to finish. |
|
|
153
|
+
| `attempts` | `number` (optional) | Number of attempts made (including retries). |
|
|
123
154
|
|
|
124
155
|
---
|
|
125
156
|
|
|
@@ -149,7 +180,7 @@ try {
|
|
|
149
180
|
}
|
|
150
181
|
```
|
|
151
182
|
|
|
152
|
-
### Error
|
|
183
|
+
### Error Types
|
|
153
184
|
|
|
154
185
|
| Class | Code | Retryable | When |
|
|
155
186
|
| ----------------- | ------------------ | --------- | -------------------------------------------------------------- |
|
|
@@ -234,17 +265,46 @@ bun run rebuild
|
|
|
234
265
|
bun run test
|
|
235
266
|
```
|
|
236
267
|
|
|
268
|
+
### Project Structure
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
.
|
|
272
|
+
├── lib
|
|
273
|
+
│ ├── browser
|
|
274
|
+
│ │ ├── browser-manager.ts
|
|
275
|
+
│ │ └── page-interactions.ts
|
|
276
|
+
│ ├── config
|
|
277
|
+
│ │ ├── defaults.ts
|
|
278
|
+
│ │ └── schema.ts
|
|
279
|
+
│ ├── core
|
|
280
|
+
│ │ ├── downloader.ts
|
|
281
|
+
│ │ └── validator.ts
|
|
282
|
+
│ ├── errors
|
|
283
|
+
│ │ ├── base.ts
|
|
284
|
+
│ │ ├── errors.ts
|
|
285
|
+
│ │ └── index.ts
|
|
286
|
+
│ ├── utils
|
|
287
|
+
│ │ ├── helpers.ts
|
|
288
|
+
│ │ ├── logger.ts
|
|
289
|
+
│ │ └── result.ts
|
|
290
|
+
│ └── lib.ts
|
|
291
|
+
├── build # generated output (CJS, ESM, types)
|
|
292
|
+
├── package.json
|
|
293
|
+
└── tsconfig.json
|
|
294
|
+
```
|
|
237
295
|
|
|
238
296
|
### Scripts
|
|
239
297
|
|
|
240
|
-
| Command | Description
|
|
241
|
-
| ---------------------- |
|
|
242
|
-
| `bun run clean` | Remove `build/` and cache
|
|
243
|
-
| `bun run typecheck` | Run `tsc --noEmit`
|
|
244
|
-
| `bun run build:ts` | Compile TypeScript to `build/`
|
|
245
|
-
| `bun run build:bundle` | Bundle with Rollup
|
|
246
|
-
| `bun run
|
|
247
|
-
| `bun run
|
|
298
|
+
| Command | Description |
|
|
299
|
+
| ---------------------- | --------------------------------------------------- |
|
|
300
|
+
| `bun run clean` | Remove `build/` and cache |
|
|
301
|
+
| `bun run typecheck` | Run `tsc --noEmit` |
|
|
302
|
+
| `bun run build:ts` | Compile TypeScript to `build/` |
|
|
303
|
+
| `bun run build:bundle` | Bundle with Rollup |
|
|
304
|
+
| `bun run build` | Clean + typecheck + build:ts + build:bundle |
|
|
305
|
+
| `bun run rebuild` | Full rebuild pipeline (clean-code + build + format) |
|
|
306
|
+
| `bun run format` | Format all files with Prettier |
|
|
307
|
+
| `bun run test` | Run tests (requires test files) |
|
|
248
308
|
|
|
249
309
|
---
|
|
250
310
|
|