pup-recorder 0.0.8

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.
Files changed (55) hide show
  1. package/Cargo.lock +230 -0
  2. package/Cargo.toml +23 -0
  3. package/LICENSE +26 -0
  4. package/README.md +96 -0
  5. package/build.rs +5 -0
  6. package/build.ts +55 -0
  7. package/build_rust.ts +51 -0
  8. package/dist/cjs/app.cjs +633 -0
  9. package/dist/cjs/app.cjs.map +7 -0
  10. package/dist/cjs/cli.cjs +691 -0
  11. package/dist/cjs/cli.cjs.map +7 -0
  12. package/dist/cjs/index.cjs +781 -0
  13. package/dist/cjs/index.cjs.map +7 -0
  14. package/dist/cli.js +667 -0
  15. package/dist/cli.js.map +7 -0
  16. package/dist/index.d.ts +93 -0
  17. package/dist/index.js +728 -0
  18. package/dist/index.js.map +7 -0
  19. package/package.json +37 -0
  20. package/rust/darwin-arm64.node +0 -0
  21. package/rust/darwin-x64.node +0 -0
  22. package/rust/linux-arm64.node +0 -0
  23. package/rust/linux-x64.node +0 -0
  24. package/src/app.ts +19 -0
  25. package/src/base/abort.ts +75 -0
  26. package/src/base/constants.ts +18 -0
  27. package/src/base/electron.ts +51 -0
  28. package/src/base/encoder.ts +35 -0
  29. package/src/base/env.ts +21 -0
  30. package/src/base/ffmpeg.ts +188 -0
  31. package/src/base/frame_sync.ts +139 -0
  32. package/src/base/image.ts +9 -0
  33. package/src/base/lazy.ts +20 -0
  34. package/src/base/limiter.ts +58 -0
  35. package/src/base/logging.ts +123 -0
  36. package/src/base/noerr.ts +18 -0
  37. package/src/base/parser.ts +12 -0
  38. package/src/base/process.ts +35 -0
  39. package/src/base/proxy.ts +33 -0
  40. package/src/base/record.ts +228 -0
  41. package/src/base/retry.ts +40 -0
  42. package/src/base/stream.ts +74 -0
  43. package/src/base/timing.ts +23 -0
  44. package/src/base/types.ts +19 -0
  45. package/src/cli.ts +6 -0
  46. package/src/common.ts +53 -0
  47. package/src/index.ts +14 -0
  48. package/src/pup.ts +142 -0
  49. package/src/rust/lib.rs +105 -0
  50. package/src/rust/lib.ts +28 -0
  51. package/tsconfig.json +25 -0
  52. package/x265/darwin-arm64 +0 -0
  53. package/x265/darwin-x64 +0 -0
  54. package/x265/linux-arm64 +0 -0
  55. package/x265/linux-x64 +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/app.ts", "../../src/base/electron.ts", "../../src/base/constants.ts", "../../src/base/env.ts", "../../src/base/parser.ts", "../../src/base/logging.ts", "../../src/base/process.ts", "../../src/base/record.ts", "../../src/rust/lib.ts", "../../src/base/frame_sync.ts", "../../src/base/image.ts", "../../src/base/proxy.ts", "../../src/base/retry.ts", "../../src/base/timing.ts", "../../src/common.ts", "../../src/base/noerr.ts"],
4
+ "sourcesContent": ["// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { app } from \"electron\";\nimport { ELECTRON_OPTS } from \"./base/electron\";\nimport { record, type RecordOptions } from \"./base/record\";\nimport { makeCLI } from \"./common\";\n\nprocess.once(\"exit\", () => app.quit());\n\nmakeCLI(\"app\", async (source: string, options: RecordOptions) => {\n try {\n ELECTRON_OPTS.forEach((o) => app.commandLine.appendSwitch(o));\n app.dock?.hide();\n await app.whenReady();\n await record(source, options);\n } finally {\n app.quit();\n }\n});\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n resolve(__dirname, \"cjs/app.cjs\"), // process from dist\n resolve(__dirname, \"app.cjs\"), // process from dist/cjs\n resolve(__dirname, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { BrowserWindow, session, type NativeImage } from \"electron\";\nimport { mkdir, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { FixedBufferWriter } from \"../rust/lib\";\nimport {\n buildWrapperHTML,\n decodeTimestamp,\n startSync,\n stopSync,\n} from \"./frame_sync\";\nimport { isEmpty } from \"./image\";\nimport { logger } from \"./logging\";\nimport { enableProxy, proxiedUrl } from \"./proxy\";\nimport { useRetry } from \"./retry\";\n\nconst TAG = \"[Record]\";\n\nexport interface RecordOptions {\n outDir: string;\n duration: number;\n fps: number;\n width: number;\n height: number;\n withAlphaChannel: boolean;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n\nasync function loadWindow(source: string, options: RecordOptions) {\n if (!source.startsWith(\"file://\") && !source.match(/^https?:\\/\\//)) {\n throw new Error(\"invalid source\");\n }\n\n const { width, height, useInnerProxy } = options;\n\n // Remove X-Frame-Options and CSP headers to allow iframe loading\n // Note: Electron's onHeadersReceived uses REPLACE behavior (not append).\n // Only the last attached listener is used, so no cleanup needed.\n // Ref: https://www.electronjs.org/docs/latest/api/web-request\n session.defaultSession.webRequest.onHeadersReceived((details, callback) => {\n const responseHeaders = { ...details.responseHeaders };\n delete responseHeaders[\"x-frame-options\"];\n delete responseHeaders[\"X-Frame-Options\"];\n delete responseHeaders[\"content-security-policy\"];\n delete responseHeaders[\"Content-Security-Policy\"];\n callback({ cancel: false, responseHeaders });\n });\n\n let src = source;\n if (useInnerProxy) {\n src = proxiedUrl(source);\n enableProxy();\n }\n\n const win = new BrowserWindow({\n width: width,\n height: height + 1,\n show: false,\n transparent: true,\n backgroundColor: undefined,\n webPreferences: {\n offscreen: true,\n backgroundThrottling: false,\n nodeIntegration: true,\n contextIsolation: false,\n webSecurity: false,\n allowRunningInsecureContent: true,\n experimentalFeatures: true,\n },\n });\n\n win.webContents.on(\"console-message\", (event) => {\n if (event.level === \"error\") {\n logger.error(TAG, \"console:\", event.message);\n }\n });\n\n const wrapperHTML = buildWrapperHTML(src, { width, height });\n const dataURL = `data:text/html;charset=utf-8,${encodeURIComponent(wrapperHTML)}`;\n let token: NodeJS.Timeout | undefined;\n\n await new Promise<void>((resolve, reject) => {\n token = setTimeout(() => {\n reject(new Error(\"load window timeout\"));\n }, 20 * 1000);\n\n win.webContents.once(\"did-finish-load\", resolve);\n\n win.webContents.once(\"did-fail-load\", (_event, code, desc, url) => {\n reject(new Error(`failed to load ${url}: [${code}] ${desc}`));\n });\n\n win.webContents.once(\"render-process-gone\", (_event, details) => {\n const { exitCode, reason } = details;\n reject(new Error(`renderer crashed: ${exitCode}, ${reason}`));\n });\n\n win.loadURL(dataURL);\n });\n clearTimeout(token);\n return win;\n}\n\nexport async function record(\n source: string,\n options: RecordOptions,\n): Promise<void> {\n logger.info(TAG, `progress: 0%`);\n const { outDir, fps, width, height, duration } = options;\n\n const win = await useRetry({ fn: loadWindow, maxAttempts: 2 })(\n source,\n options,\n );\n\n await mkdir(outDir, { recursive: true });\n\n const cdp = win.webContents.debugger;\n cdp.attach(\"1.3\");\n\n win.webContents.setFrameRate(fps);\n if (!win.webContents.isPainting()) {\n win.webContents.startPainting();\n }\n\n const bgraPath = join(outDir, \"output.bgra\");\n const total = Math.ceil(fps * duration);\n const frameInterval = 1000 / fps;\n const bufferSize = width * height * 4;\n\n const writer = new FixedBufferWriter(bgraPath, bufferSize, fps);\n\n let written = 0;\n let lastWrittenTime: number | undefined;\n let progress = 0;\n let frameError: Error | undefined;\n let resolver: (() => void) | undefined;\n let rejecter: ((reason?: unknown) => void) | undefined;\n\n const scheduleWrite = (buffer: Buffer) => {\n written++;\n try {\n writer.write(buffer);\n } catch (error) {\n frameError ??= error as Error;\n }\n };\n\n const paint = (_e: unknown, _r: unknown, image: NativeImage) => {\n if (frameError) {\n rejecter?.(frameError);\n return;\n }\n\n if (written >= total) {\n resolver?.();\n return;\n }\n\n if (isEmpty(image)) return;\n\n const bitmap = image.toBitmap();\n const currentTime = decodeTimestamp(bitmap, image.getSize());\n if (currentTime === undefined) {\n frameError ??= new Error(`no timestamp @ ${written}`);\n return;\n }\n\n const bytesPerRow = width * 4;\n const cropped = bitmap.subarray(0, height * bytesPerRow);\n\n if (lastWrittenTime === undefined) {\n scheduleWrite(cropped);\n lastWrittenTime = currentTime;\n return;\n }\n\n const timeSinceLastFrame = currentTime - lastWrittenTime;\n if (timeSinceLastFrame < frameInterval * 0.8) {\n return;\n }\n\n if (timeSinceLastFrame <= frameInterval * 1.2) {\n scheduleWrite(cropped);\n } else {\n const framesToInsert = Math.round(timeSinceLastFrame / frameInterval);\n for (let i = 0; i < framesToInsert && written < total; i++) {\n scheduleWrite(cropped);\n }\n }\n lastWrittenTime = currentTime;\n\n const newProgress = Math.floor((written / total) * 100);\n if (Math.abs(newProgress - progress) > 10) {\n progress = newProgress;\n logger.info(TAG, `progress: ${Math.round(progress)}%`);\n }\n };\n\n win.webContents.on(\"paint\", paint);\n await startSync(cdp);\n try {\n await new Promise<void>((r, j) => ([resolver, rejecter] = [r, j]));\n } finally {\n await stopSync(cdp);\n win.webContents.off(\"paint\", paint);\n await writer.close();\n }\n\n if (frameError || written === 0) {\n throw frameError ?? new Error(\"no frames captured\");\n }\n\n try {\n const result: RecordResult = { options, written, bgraPath };\n await writeFile(join(outDir, \"record.json\"), JSON.stringify(result));\n logger.info(TAG, `progress: 100%, ${written} frames written`);\n } finally {\n win.close();\n }\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/10.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\n\nconst { platform, arch } = process;\n\nconst rustPath = `rust/${platform}-${arch}.node`;\n\nconst nativeSearchPaths = [\n join(__dirname, `../../${rustPath}`), // process start from src\n join(__dirname, `../${rustPath}`), // process start from dist\n];\nconst mod = require(nativeSearchPaths.find(existsSync)!);\n\nexport interface FixedBufferWriter {\n new (\n path: string,\n bufferSize: number,\n queueDepth?: number,\n ): FixedBufferWriter;\n\n write(buffer: Buffer): void;\n\n close(): Promise<void>;\n}\n\nexport const FixedBufferWriter = mod.FixedBufferWriter as FixedBufferWriter;\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { Debugger, Size } from \"electron\";\n\nexport const FRAME_SYNC_MARKER_WIDTH = 32;\nexport const FRAME_SYNC_MARKER_HEIGHT = 1;\n\nexport function buildWrapperHTML(targetURL: string, size: Size): string {\n const { width, height } = size;\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n html, body { width: ${width}px; height: ${height + 1}px; overflow: hidden; }\n #target { \n position: absolute; \n top: 0; \n left: 0; \n width: ${width}px; \n height: ${height}px; \n border: none; \n display: block;\n }\n #stego { \n position: absolute; \n top: ${height}px; \n left: 0; \n width: ${width}px; \n height: 1px; \n display: block;\n image-rendering: pixelated;\n }\n </style>\n</head>\n<body>\n <iframe id=\"target\" src=\"${targetURL}\"></iframe>\n <canvas id=\"stego\" width=\"${width}\" height=\"1\"></canvas>\n <script>\n (function() {\n const WIDTH = ${width};\n const MARKER_WIDTH = ${FRAME_SYNC_MARKER_WIDTH};\n const canvas = document.getElementById('stego');\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n let startTime = null;\n let rafId = null;\n\n function encodeTimestamp(timestampMs) {\n const imageData = ctx.createImageData(WIDTH, 1);\n const data = imageData.data;\n \n const timestampInt = Math.floor(timestampMs) >>> 0;\n \n for (let i = 0; i < MARKER_WIDTH; i++) {\n const bit = (timestampInt >>> (MARKER_WIDTH - 1 - i)) & 1;\n const value = bit ? 255 : 0;\n const idx = i * 4;\n data[idx] = value;\n data[idx + 1] = value;\n data[idx + 2] = value;\n data[idx + 3] = 255;\n }\n \n for (let i = MARKER_WIDTH; i < WIDTH; i++) {\n const idx = i * 4;\n data[idx] = 0;\n data[idx + 1] = 0;\n data[idx + 2] = 0;\n data[idx + 3] = 255;\n }\n \n ctx.putImageData(imageData, 0, 0);\n }\n\n function updateLoop() {\n if (startTime === null) return;\n const elapsed = performance.now() - startTime;\n encodeTimestamp(elapsed);\n rafId = requestAnimationFrame(updateLoop);\n }\n\n window.__pup_start_recording__ = () => {\n startTime = performance.now();\n encodeTimestamp(0);\n requestAnimationFrame(updateLoop);\n };\n\n window.__pup_stop_recording__ = () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n };\n })();\n </script>\n</body>\n</html>`;\n}\n\nexport function decodeTimestamp(\n bitmap: Buffer,\n size: Size,\n): number | undefined {\n const { width, height } = size;\n if (width < FRAME_SYNC_MARKER_WIDTH || height < 2) {\n return undefined;\n }\n\n const markerRow = height - 1;\n\n let timestamp = 0;\n for (let i = 0; i < FRAME_SYNC_MARKER_WIDTH; i++) {\n const pixelIdx = (markerRow * width + i) * 4;\n const r = bitmap[pixelIdx] ?? 0;\n const bit = r > 127 ? 1 : 0;\n timestamp = (timestamp << 1) | bit;\n }\n\n timestamp = timestamp >>> 0;\n\n if (!Number.isFinite(timestamp) || timestamp < 0 || timestamp > 1e7) {\n return undefined;\n }\n\n return timestamp;\n}\n\nexport function startSync(cdp: Debugger) {\n return cdp.sendCommand(\"Runtime.evaluate\", {\n expression: `window.__pup_start_recording__()`,\n });\n}\n\nexport function stopSync(cdp: Debugger) {\n return cdp.sendCommand(\"Runtime.evaluate\", {\n expression: `window.__pup_stop_recording__()`,\n });\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { NativeImage } from \"electron\";\n\nexport function isEmpty(image: NativeImage) {\n const size = image.getSize();\n if (size.width === 0 || size.height === 0) return true;\n return image.isEmpty();\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { session } from \"electron\";\nimport { logger } from \"./logging\";\n\nconst TAG = \"[Proxy]\";\n\nexport function proxiedUrl(url: string) {\n if (!url.startsWith(\"http\")) {\n return url;\n }\n // Redirect boss.hdslb.com to boss.bilibili.co\n const match = url.match(/^https:\\/\\/([^-]+)-boss\\.hdslb\\.com(.*)$/);\n if (match) {\n const [, prefix, path] = match;\n return `http://${prefix}-boss.bilibili.co${path}`;\n }\n return url;\n}\n\nexport function enableProxy() {\n // Redirect boss.hdslb.com to boss.bilibili.co\n session.defaultSession.webRequest.onBeforeRequest((details, callback) => {\n const url = details.url;\n const proxied = proxiedUrl(url);\n if (proxied === url) {\n return callback({ cancel: false });\n } else {\n logger.debug(TAG, `${url} -> ${proxied}`);\n callback({ cancel: false, redirectURL: proxied });\n }\n });\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/05.\n\nimport { setTimeout } from \"timers/promises\";\nimport { sleep } from \"./timing\";\n\nexport interface RetryOptions<Args extends any[], Ret> {\n fn: (...args: Args) => Promise<Ret>;\n maxAttempts?: number;\n timeout?: number;\n}\n\nexport function useRetry<Args extends any[], Ret>({\n fn,\n maxAttempts = 3,\n timeout,\n}: RetryOptions<Args, Ret>) {\n const timeoutError = new Error(`timeout over ${timeout}ms`);\n return async function (...args: Args) {\n let attempt = 0;\n while (true) {\n try {\n const promises = [fn(...args)];\n if (timeout) {\n promises.push(\n setTimeout(timeout).then(() => {\n throw timeoutError;\n }),\n );\n }\n return await Promise.race(promises);\n } catch (e) {\n attempt++;\n if (attempt >= maxAttempts) {\n throw e;\n }\n await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);\n }\n }\n };\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nexport function sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nexport function periodical(\n callback: (count: number) => Promise<void> | void,\n ms: number,\n) {\n let token: NodeJS.Timeout;\n let closed = false;\n async function tick(count: number) {\n await callback(count);\n if (closed) return;\n token = setTimeout(() => tick(count + 1), ms);\n }\n token = setTimeout(() => tick(0), ms);\n return () => {\n closed = true;\n clearTimeout(token);\n };\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { program } from \"commander\";\nimport { pupUseInnerProxy } from \"./base/constants\";\nimport { logger } from \"./base/logging\";\nimport { noerr } from \"./base/noerr\";\nimport { parseNumber } from \"./base/parser\";\nimport { pargs } from \"./base/process\";\nimport type { RecordOptions } from \"./base/record\";\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport type CLICallback = (\n source: string,\n options: RecordOptions & Record<string, unknown>,\n) => Promise<unknown>;\n\nexport function makeCLI(name: string, callback: CLICallback) {\n program\n .name(name)\n .argument(\"<source>\", \"URL \u6216 HTML data\")\n .option(\"-w, --width <number>\", \"\u89C6\u9891\u5BBD\u5EA6\", `${DEFAULT_WIDTH}`)\n .option(\"-h, --height <number>\", \"\u89C6\u9891\u9AD8\u5EA6\", `${DEFAULT_HEIGHT}`)\n .option(\"-f, --fps <number>\", \"\u5E27\u7387\", `${DEFAULT_FPS}`)\n .option(\"-t, --duration <number>\", \"\u5F55\u5236\u65F6\u957F\uFF08\u79D2\uFF09\", `${DEFAULT_DURATION}`)\n .option(\"-o, --out-dir <path>\", \"\u8F93\u51FA\u76EE\u5F55\", `${DEFAULT_OUT_DIR}`)\n .option(\"-a, --with-alpha-channel\", \"\u8F93\u51FA\u5305\u542B alpha \u901A\u9053\u7684\u89C6\u9891\", false)\n .option(\n \"--use-inner-proxy\",\n \"\u4F7F\u7528 B \u7AD9\u5185\u7F51\u4EE3\u7406\u52A0\u901F\u8D44\u6E90\u8BBF\u95EE\",\n pupUseInnerProxy,\n )\n .action(async (source: string, opts) => {\n try {\n await callback(source, {\n width: noerr(parseNumber, DEFAULT_WIDTH)(opts.width),\n height: noerr(parseNumber, DEFAULT_HEIGHT)(opts.height),\n fps: noerr(parseNumber, DEFAULT_FPS)(opts.fps),\n duration: noerr(parseNumber, DEFAULT_DURATION)(opts.duration),\n outDir: opts.outDir ?? DEFAULT_OUT_DIR,\n withAlphaChannel: opts.withAlphaChannel ?? false,\n useInnerProxy: opts.useInnerProxy ?? pupUseInnerProxy,\n });\n } catch (e) {\n logger.fatal(e);\n }\n });\n program.parse(pargs());\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/24.\n\nexport function noerr<Fn extends (...args: any[]) => any, D>(\n fn: Fn,\n defaultValue: D,\n): (...args: Parameters<Fn>) => ReturnType<Fn> | D {\n return (...args) => {\n try {\n const ret = fn(...args);\n if (ret instanceof Promise) {\n return ret.catch(() => defaultValue);\n }\n return ret;\n } catch {\n return defaultValue;\n }\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_electron", "resolve", "import_electron", "import_promises", "import_path", "import_fs", "import_path", "import_electron", "resolve", "TAG", "resolve"]
7
+ }