@skrillex1224/android-toolkit 1.0.3 → 1.0.5
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/README.md +7 -8
- package/browser.d.ts +12 -0
- package/dist/browser.js +21 -4
- package/dist/browser.js.map +3 -3
- package/dist/index.cjs +358 -368
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +357 -367
- package/dist/index.js.map +4 -4
- package/index.d.ts +11 -7
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../entrys/node.js", "../src/apify-kit.js", "../src/constants.js", "../src/context.js", "../src/device.js", "../src/errors.js", "../src/logger.js", "../src/device-view.js", "../src/device-input.js", "../src/
|
|
4
|
-
"sourcesContent": ["import { ApifyKit } from '../src/apify-kit.js';\nimport { Context } from '../src/context.js';\nimport { Device } from '../src/device.js';\nimport { DeviceInput } from '../src/device-input.js';\nimport { DeviceView } from '../src/device-view.js';\nimport { Frida } from '../src/frida-client.js';\nimport { Launch } from '../src/launch.js';\nimport { Logger } from '../src/logger.js';\nimport { Mutation } from '../src/mutation.js';\nimport { Share } from '../src/share.js';\nimport * as Constants from '../src/constants.js';\nimport * as Errors from '../src/errors.js';\n\nexport const useAndroidToolKit = () => ({\n Launch,\n ApifyKit,\n DeviceInput,\n DeviceView,\n Device,\n Mutation,\n Share,\n Frida,\n Constants,\n Errors,\n Logger,\n Context,\n});\n", "import fs from 'node:fs';\n\nimport { Code, Status } from './constants.js';\nimport { Context } from './context.js';\nimport { Device } from './device.js';\nimport { CrawlerError, serializeError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nlet instance = null;\n\nexport const ApifyKit = {\n useApifyKit,\n};\n\nasync function useApifyKit(options = {}) {\n if (!instance || options.reset) {\n instance = createApifyKit(options);\n }\n return instance;\n}\n\nfunction createApifyKit(options = {}) {\n const inputPath = String(options.inputPath || '').trim();\n const outputPath = requiredOption(options.outputPath, 'outputPath');\n const input = options.input || (inputPath ? JSON.parse(fs.readFileSync(inputPath, 'utf8')) : {});\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\n let pushed = false;\n\n return {\n ctx,\n input,\n inputPath,\n outputPath,\n async runStep(step, target, actionFn, options = {}) {\n const { failActor = true, retry = {} } = options;\n const retryTimes = Math.max(0, Number(retry.times || 0));\n const startedAt = Date.now();\n let lastError = null;\n\n for (let attempt = 0; attempt <= retryTimes; attempt += 1) {\n const attemptLabel = attempt > 0 ? ` (\u91CD\u8BD5 #${attempt})` : '';\n Logger.start(`[Step] ${step}${attemptLabel}`, stepDetail(target));\n try {\n const result = await actionFn();\n Logger.success(`[Step] ${step}${attemptLabel}`, { duration: Logger.duration(startedAt) });\n return result;\n } catch (error) {\n lastError = error;\n Logger.fail(`[Step] ${step}${attemptLabel}`, error);\n if (attempt < retryTimes) {\n if (typeof retry.before === 'function') {\n await retry.before(ctx, attempt + 1);\n } else {\n await sleep(3000);\n }\n }\n }\n }\n\n if (failActor) {\n let base64 = '';\n try {\n base64 = await Device.screenshotBase64(ctx);\n } catch (error) {\n base64 = `\u622A\u56FE\u5931\u8D25: ${error?.message || String(error)}`;\n }\n await this.pushFailed(lastError, { step, base64, retryAttempts: retryTimes });\n }\n throw lastError;\n },\n async runStepLoose(step, target, actionFn, options = {}) {\n return this.runStep(step, target, actionFn, { ...options, failActor: false });\n },\n async pushSuccess(data = {}, options = {}) {\n pushed = true;\n appendOutput(outputPath, {\n code: Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data: sanitizeData(data),\n ...(options.meta ? { meta: sanitizeData(options.meta) } : {}),\n });\n Logger.success('pushSuccess', { outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushArtifact(data = {}) {\n appendOutput(outputPath, sanitizeData(data));\n Logger.success('pushArtifact', { outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushFailed(error, meta = {}) {\n const normalized = CrawlerError.isCrawlerError(error)\n ? error\n : CrawlerError.from(error, { code: Code.UnknownError, context: meta });\n pushed = true;\n appendOutput(outputPath, {\n code: normalized.code,\n status: Status.Failed,\n error: serializeError(normalized),\n meta: sanitizeData(meta),\n context: sanitizeData(normalized.context),\n timestamp: new Date().toISOString(),\n });\n Logger.success('pushFailed', { outputPath, code: normalized.code, message: normalized.message });\n },\n hasPushed() {\n return pushed;\n },\n };\n}\n\nfunction appendOutput(outputPath, item) {\n const items = readOutputArray(outputPath);\n items.push(item);\n fs.writeFileSync(outputPath, JSON.stringify(items, null, 2) + '\\n', 'utf8');\n}\n\nfunction readOutputArray(outputPath) {\n if (!fs.existsSync(outputPath)) return [];\n const raw = fs.readFileSync(outputPath, 'utf8').trim();\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) throw new Error(`Android output must be a JSON array: ${outputPath}`);\n return parsed;\n}\n\nfunction requiredOption(value, name) {\n const clean = String(value || '').trim();\n if (!clean) throw new Error(`ApifyKit.useApifyKit requires ${name}`);\n return clean;\n}\n\nfunction stepDetail(target) {\n if (!target) return {};\n if (typeof target === 'string') return { target };\n if (typeof target === 'object') {\n return {\n serial: target.serial,\n packageName: target.packageName,\n runId: target.runId,\n };\n }\n return { target: String(target) };\n}\n\nfunction sanitizeData(value, depth = 0, seen = new WeakSet()) {\n if (depth > 8) return '[MaxDepth]';\n if (value == null) return value;\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return value.toString();\n if (type === 'function' || type === 'symbol') return undefined;\n if (value instanceof Error) return serializeError(value);\n if (Array.isArray(value)) return value.map((item) => sanitizeData(item, depth + 1, seen)).filter((item) => item !== undefined);\n if (type !== 'object') return String(value);\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n const out = {};\n for (const [key, item] of Object.entries(value)) {\n const safe = sanitizeData(item, depth + 1, seen);\n if (safe !== undefined) out[key] = safe;\n }\n return out;\n}\n", "export const Code = Object.freeze({\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\n InvalidRequest: 30010001,\n AdbUnavailable: 30010002,\n ContentUnavailable: 30010003,\n SourceExtractionFailed: 30010004,\n AutomationFailed: 30010005,\n FridaUnavailable: 30010008,\n AppNotInstalled: 30010009,\n});\n\nexport const Status = Object.freeze({\n Success: 'SUCCESS',\n Failed: 'FAILED',\n});\n\nexport const UnicodeIme = Object.freeze({\n packageName: 'io.appium.settings',\n component: 'io.appium.settings/.UnicodeIME',\n inputTextAction: 'ADB_INPUT_TEXT',\n});\n\nconst normalizeShare = (share) => {\n const source = share && typeof share === 'object' ? share : {};\n return {\n mode: 'clipboard',\n prefix: String(source.prefix || '').trim(),\n xurl: Array.isArray(source.xurl) ? source.xurl : [],\n };\n};\n\nconst createActorInfo = (info) => {\n const key = String(info.key || '').trim();\n return Object.freeze({\n key,\n name: String(info.name || key),\n icon: String(info.icon || `https://static.heartbitai.com/general/actors/${key}.png`),\n share: Object.freeze(normalizeShare(info.share)),\n });\n};\n\nexport const ActorInfo = Object.freeze({\n 'doubao.android': createActorInfo({\n key: 'doubao.android',\n name: '\u8C46\u5305 Android',\n share: {\n prefix: 'https://www.doubao.com/thread/',\n xurl: [],\n },\n }),\n});\n", "export const Context = {\n createAndroidContext,\n firstNonEmpty,\n requireNonEmpty,\n};\n\nfunction createAndroidContext(input = {}, defaults = {}) {\n const runtime = input.runtime && typeof input.runtime === 'object' ? input.runtime : {};\n const device = runtime.device && typeof runtime.device === 'object'\n ? runtime.device\n : {};\n\n return {\n runId: firstNonEmpty(defaults.runId, runtime.runId, input.runId),\n query: String(firstNonEmpty(defaults.query, input.query) || '').trim(),\n serial: firstNonEmpty(defaults.serial, device.serial),\n packageName: firstNonEmpty(defaults.packageName, device.packageName),\n adbPath: firstNonEmpty(defaults.adbPath, process.env.ANDROID_TOOLKIT_ADB_PATH),\n fridaPath: firstNonEmpty(defaults.fridaPath, process.env.ANDROID_TOOLKIT_FRIDA_PATH),\n appVersion: firstNonEmpty(defaults.appVersion, device.appVersion),\n slotKey: firstNonEmpty(defaults.slotKey, device.slotKey),\n instanceId: firstNonEmpty(defaults.instanceId, device.instanceId),\n externalIp: firstNonEmpty(defaults.externalIp, device.externalIp),\n };\n}\n\nfunction firstNonEmpty(...values) {\n for (const value of values) {\n const clean = String(value ?? '').trim();\n if (clean) return clean;\n }\n return '';\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new Error(`${name} is required`);\n return clean;\n}\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { Code, UnicodeIme } from './constants.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const Device = {\n adbExec,\n adbShell,\n forceStopApp,\n startActivity,\n startLauncher,\n focusedActivity,\n waitForActivity,\n waitForForeground,\n screenSize,\n screenDensity,\n tapAbsolute,\n swipe,\n pressKey,\n pressBack,\n pressEnter,\n typeText,\n screenshotPng,\n screenshotBase64,\n dumpUiXml,\n wakeAndUnlock,\n hideKeyboard,\n isKeyboardVisible,\n sleep,\n ensureUnicodeIme,\n};\n\nasync function adbExec(ctx, args, options = {}) {\n const adbPath = requireDeviceField(ctx, 'adbPath');\n const startedAt = Date.now();\n try {\n const { stdout } = await execFileAsync(adbPath, args.map(String), {\n timeout: Number(options.timeoutMs || 15000),\n maxBuffer: Number(options.maxBuffer || 12 * 1024 * 1024),\n encoding: options.encoding || 'utf8',\n });\n Logger.debug('adbExec', { duration: Logger.duration(startedAt), args: compactArgs(args) });\n return stdout;\n } catch (error) {\n if (isAdbUnavailableError(error)) {\n throw new CrawlerError({\n message: `adb_unavailable: ${error?.message || String(error)}`,\n code: Code.AdbUnavailable,\n context: { args: compactArgs(args), adbPath },\n });\n }\n throw error;\n }\n}\n\nasync function adbShell(ctx, args, options = {}) {\n const serial = requireDeviceField(ctx, 'serial');\n return adbExec(ctx, ['-s', serial, 'shell', ...args], options);\n}\n\nasync function adbInput(ctx, args, options = {}) {\n return adbShell(ctx, ['input', ...args], options);\n}\n\nasync function forceStopApp(ctx, packageName = ctx.packageName) {\n await adbShell(ctx, ['am', 'force-stop', requireValue(packageName, 'packageName')], { timeoutMs: 15000 });\n}\n\nasync function startActivity(ctx, component, args = []) {\n await adbShell(ctx, ['am', 'start', '-n', requireValue(component, 'component'), ...args], { timeoutMs: 20000 });\n await sleep(1500);\n}\n\nasync function startLauncher(ctx, packageName = ctx.packageName, launcherActivity) {\n await startActivity(ctx, `${requireValue(packageName, 'packageName')}/${requireValue(launcherActivity, 'launcherActivity')}`, [\n '-a',\n 'android.intent.action.MAIN',\n '-c',\n 'android.intent.category.LAUNCHER',\n ]);\n}\n\nasync function focusedActivity(ctx) {\n const resumed = await resumedActivity(ctx).catch(() => '');\n if (resumed) return resumed;\n const out = await adbShell(ctx, ['dumpsys', 'window'], { timeoutMs: 15000, maxBuffer: 12 * 1024 * 1024 });\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.includes('mCurrentFocus=Window') && !trimmed.includes('=null')) return trimmed;\n }\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.includes('mFocusedApp=AppWindowToken') && !trimmed.includes('=null')) return trimmed;\n }\n return String(out || '').trim();\n}\n\nasync function resumedActivity(ctx) {\n const out = await adbShell(ctx, ['dumpsys', 'activity', 'activities'], {\n timeoutMs: 15000,\n maxBuffer: 12 * 1024 * 1024,\n });\n let fallback = '';\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed.includes('ActivityRecord') || !trimmed.includes('/')) continue;\n if (trimmed.includes('mTopResumedActivity') || trimmed.includes('topResumedActivity')) return trimmed;\n if (trimmed.includes('mResumedActivity')) fallback = trimmed;\n }\n return fallback;\n}\n\nasync function waitForActivity(ctx, predicate, timeoutMs = 15000, intervalMs = 700) {\n const deadline = Date.now() + Number(timeoutMs);\n let lastFocused = '';\n while (Date.now() < deadline) {\n lastFocused = await focusedActivity(ctx).catch((error) => `ERROR: ${error?.message || String(error)}`);\n if (predicate(lastFocused)) return lastFocused;\n await sleep(intervalMs);\n }\n throw new CrawlerError({\n message: `automation_failed: waitForActivity timeout focused=${lastFocused}`,\n code: Code.AutomationFailed,\n });\n}\n\nasync function waitForForeground(ctx, packageName = ctx.packageName, timeoutMs = 6000) {\n const target = requireValue(packageName, 'packageName');\n return waitForActivity(ctx, (value) => String(value || '').includes(target), timeoutMs, 500);\n}\n\nasync function screenSize(ctx) {\n const out = await adbShell(ctx, ['wm', 'size'], { timeoutMs: 15000 });\n const match = /(\\d+)x(\\d+)/.exec(String(out || ''));\n if (!match) throw new CrawlerError({ message: `adb_unavailable: cannot parse screen size: ${out}`, code: Code.AdbUnavailable });\n return { width: Number(match[1]), height: Number(match[2]) };\n}\n\nasync function screenDensity(ctx) {\n const out = await adbShell(ctx, ['wm', 'density'], { timeoutMs: 15000 });\n const match = /(\\d+)/.exec(String(out || ''));\n if (!match) throw new CrawlerError({ message: `adb_unavailable: cannot parse screen density: ${out}`, code: Code.AdbUnavailable });\n return Number(match[1]);\n}\n\nasync function tapAbsolute(ctx, x, y) {\n await adbInput(ctx, ['tap', Math.round(Number(x)), Math.round(Number(y))], { timeoutMs: 15000 });\n}\n\nasync function swipe(ctx, from, to, durationMs = 360) {\n await adbInput(ctx, [\n 'swipe',\n Math.round(Number(from?.x)),\n Math.round(Number(from?.y)),\n Math.round(Number(to?.x)),\n Math.round(Number(to?.y)),\n Math.round(Number(durationMs)),\n ], { timeoutMs: 15000 });\n}\n\nasync function pressKey(ctx, key) {\n await adbInput(ctx, ['keyevent', String(key)], { timeoutMs: 15000 });\n}\n\nasync function pressBack(ctx) {\n await pressKey(ctx, 'BACK');\n}\n\nasync function pressEnter(ctx) {\n await pressKey(ctx, 'KEYCODE_ENTER');\n}\n\nasync function typeText(ctx, text) {\n await ensureUnicodeIme(ctx);\n await adbShell(ctx, ['am', 'broadcast', '-a', UnicodeIme.inputTextAction, '--es', 'msg', String(text ?? '')], {\n timeoutMs: 30000,\n maxBuffer: 4 * 1024 * 1024,\n });\n}\n\nasync function ensureUnicodeIme(ctx) {\n const out = await adbShell(ctx, ['ime', 'list', '-s'], { timeoutMs: 15000 });\n if (!String(out || '').split(/\\s+/).includes(UnicodeIme.component)) {\n throw new CrawlerError({\n message: `adb_unavailable: UnicodeIME \u672A\u5B89\u88C5\u6216\u4E0D\u53EF\u7528 ${UnicodeIme.component}`,\n code: Code.AdbUnavailable,\n context: { component: UnicodeIme.component },\n });\n }\n await adbShell(ctx, ['ime', 'set', UnicodeIme.component], { timeoutMs: 15000 });\n}\n\nasync function screenshotPng(ctx) {\n const serial = requireDeviceField(ctx, 'serial');\n const adbPath = requireDeviceField(ctx, 'adbPath');\n const { stdout } = await execFileAsync(adbPath, ['-s', serial, 'exec-out', 'screencap', '-p'], {\n timeout: 30000,\n maxBuffer: 40 * 1024 * 1024,\n encoding: 'buffer',\n });\n return Buffer.from(stdout);\n}\n\nasync function screenshotBase64(ctx) {\n return `data:image/png;base64,${(await screenshotPng(ctx)).toString('base64')}`;\n}\n\nasync function dumpUiXml(ctx) {\n const dumpPath = `/data/local/tmp/android-toolkit-window-${Date.now()}-${Math.random().toString(16).slice(2)}.xml`;\n await adbShell(ctx, ['rm', '-f', dumpPath], { timeoutMs: 10000 }).catch(() => {});\n await adbShell(ctx, ['uiautomator', 'dump', dumpPath], {\n timeoutMs: 30000,\n maxBuffer: 4 * 1024 * 1024,\n });\n try {\n const raw = await adbShell(ctx, ['cat', dumpPath], {\n timeoutMs: 30000,\n maxBuffer: 16 * 1024 * 1024,\n });\n const start = String(raw || '').indexOf('<?xml');\n if (start < 0) throw new CrawlerError({ message: `automation_failed: uiautomator dump missing xml: ${raw}`, code: Code.AutomationFailed });\n return String(raw || '').slice(start).trim();\n } finally {\n await adbShell(ctx, ['rm', '-f', dumpPath], { timeoutMs: 10000 }).catch(() => {});\n }\n}\n\nasync function wakeAndUnlock(ctx) {\n await pressKey(ctx, 'KEYCODE_WAKEUP').catch(() => {});\n await sleep(300);\n await pressKey(ctx, 'MENU').catch(() => {});\n await sleep(300);\n const size = await screenSize(ctx);\n await swipe(ctx, { x: size.width * 0.5, y: size.height * 0.82 }, { x: size.width * 0.5, y: size.height * 0.25 }, 350).catch(() => {});\n await sleep(600);\n}\n\nasync function isKeyboardVisible(ctx) {\n const out = await adbShell(ctx, ['dumpsys', 'input_method'], { timeoutMs: 15000, maxBuffer: 4 * 1024 * 1024 });\n return /mInputShown=true|mIsInputViewShown=true|inputShown=true/i.test(String(out || ''));\n}\n\nasync function hideKeyboard(ctx, options = {}) {\n const attempts = Math.max(1, Math.trunc(Number(options.attempts || 2)));\n for (let i = 0; i < attempts; i += 1) {\n if (!await isKeyboardVisible(ctx).catch(() => false)) return true;\n await pressBack(ctx).catch(() => {});\n await sleep(Number(options.settleMs || 400));\n }\n return !await isKeyboardVisible(ctx).catch(() => false);\n}\n\nfunction requireDeviceField(ctx, key) {\n return requireValue(ctx?.[key], key);\n}\n\nfunction requireValue(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction isAdbUnavailableError(error) {\n const message = String(error?.message || error || '');\n return /ENOENT|spawn .*adb|not found|No such file|device .* not found|no devices|offline/i.test(message);\n}\n\nfunction compactArgs(args) {\n return args.map(String).join(' ').slice(0, 500);\n}\n", "import { Code } from './constants.js';\n\nexport class CrawlerError extends Error {\n constructor(input = {}, options = {}) {\n const payload = typeof input === 'string' ? { message: input } : input;\n super(payload.message || 'Android crawler error', options);\n this.name = 'CrawlerError';\n this.code = payload.code || Code.UnknownError;\n this.context = payload.context || {};\n }\n\n static isCrawlerError(error) {\n return error instanceof CrawlerError || error?.name === 'CrawlerError';\n }\n\n static from(error, fallback = {}) {\n if (CrawlerError.isCrawlerError(error)) return error;\n return new CrawlerError({\n message: error?.message || String(error),\n code: fallback.code || Code.UnknownError,\n context: fallback.context || {},\n });\n }\n}\n\nexport function serializeError(error) {\n if (!error) return { message: '' };\n return {\n name: error.name || 'Error',\n message: error.message || String(error),\n stack: error.stack || '',\n code: error.code || '',\n context: error.context || undefined,\n };\n}\n", "const defaultLogger = {\n info: (...args) => console.error(...args),\n warning: (...args) => console.error(...args),\n warn: (...args) => console.error(...args),\n error: (...args) => console.error(...args),\n debug: (...args) => console.error(...args),\n};\n\nlet activeLogger = defaultLogger;\n\nexport const LOG_TEMPLATES = Object.freeze({\n stepStart: '[Step] start',\n stepSuccess: '[Step] success',\n stepFail: '[Step] failed',\n mutationStable: '[Mutation] stable',\n shareStart: '[Share] start',\n screenshotDone: '[Share] screenshot done',\n dataPush: '[Dataset] push',\n});\n\nexport const Logger = {\n setLogger(logger) {\n activeLogger = logger || defaultLogger;\n },\n createLogger(scope) {\n const prefix = scope ? `[${scope}] ` : '';\n return {\n start: (message, detail) => Logger.start(`${prefix}${message}`, detail),\n success: (message, detail) => Logger.success(`${prefix}${message}`, detail),\n fail: (message, error) => Logger.fail(`${prefix}${message}`, error),\n warn: (message, detail) => Logger.warn(`${prefix}${message}`, detail),\n info: (message, detail) => Logger.info(`${prefix}${message}`, detail),\n debug: (message, detail) => Logger.debug(`${prefix}${message}`, detail),\n };\n },\n useTemplate() {\n return {\n taskStart: (detail) => Logger.start('\u4EFB\u52A1\u5F00\u59CB', detail),\n taskSuccess: (detail) => Logger.success('\u4EFB\u52A1\u5B8C\u6210', detail),\n taskFail: (detail, error) => Logger.fail(`\u4EFB\u52A1\u5931\u8D25 ${detail || ''}`.trim(), error),\n stepStart: (step, detail) => Logger.start(`[Step] ${step}`, detail),\n stepSuccess: (step, detail) => Logger.success(`[Step] ${step}`, detail),\n stepFail: (step, error) => Logger.fail(`[Step] ${step}`, error),\n mutationStable: (detail) => Logger.success('[Mutation] stable', detail),\n shareStart: (detail) => Logger.start('[Share] capture', detail),\n screenshotDone: (detail) => Logger.success('[Share] screenshot', detail),\n dataPush: (detail) => Logger.success('[Dataset] push', detail),\n };\n },\n start(message, detail = '') {\n write('info', `\u25B6 ${message}`, detail);\n },\n success(message, detail = '') {\n write('info', `\u2713 ${message}`, detail);\n },\n fail(message, error = '') {\n write('error', `\u2717 ${message}`, error?.message || error);\n },\n warn(message, detail = '') {\n write('warn', `\u26A0 ${message}`, detail);\n },\n warning(message, detail = '') {\n Logger.warn(message, detail);\n },\n info(message, detail = '') {\n write('info', message, detail);\n },\n debug(message, detail = '') {\n write('debug', message, detail);\n },\n duration(startedAt) {\n return `${((Date.now() - startedAt) / 1000).toFixed(2)}s`;\n },\n};\n\nexport function stripAnsi(value) {\n return String(value || '').replace(/\\u001b\\[[0-9;]*m/g, '');\n}\n\nexport function sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction write(level, message, detail = '') {\n const formattedDetail = formatDetail(detail);\n const line = formattedDetail\n ? `[${formatTimestamp()}] [android-toolkit] ${message} ${formattedDetail}`\n : `[${formatTimestamp()}] [android-toolkit] ${message}`;\n const writer = activeLogger[level] || activeLogger.warning || activeLogger.warn || activeLogger.info || console.error;\n writer.call(activeLogger, line);\n}\n\nfunction formatTimestamp(date = new Date()) {\n const pad = (value, size = 2) => String(value).padStart(size, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}`;\n}\n\nfunction formatDetail(detail) {\n if (detail == null || detail === '') return '';\n if (detail instanceof Error) return detail.message;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) return detail.map(formatDetail).filter(Boolean).join(' ');\n if (typeof detail === 'object') {\n return Object.entries(detail)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=${typeof value === 'object' ? safeJson(value) : String(value)}`)\n .join(' ');\n }\n return String(detail);\n}\n\nfunction safeJson(value) {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n", "import { createHash } from 'node:crypto';\n\nimport { XMLParser } from 'fast-xml-parser';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { sleep } from './logger.js';\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '',\n allowBooleanAttributes: true,\n});\n\nexport const DeviceView = {\n snapshot,\n find,\n findAll,\n waitFor,\n bounds,\n text,\n exists,\n isScrollable,\n hashNode,\n normalizeSelector,\n};\n\nasync function snapshot(ctx, options = {}) {\n const xml = options.xml || await Device.dumpUiXml(ctx);\n const parsed = parser.parse(xml);\n const roots = toArray(parsed?.hierarchy?.node).map((node) => normalizeNode(node, null, 0));\n const flat = [];\n for (const root of roots) collectFlat(root, flat);\n return { xml, tree: roots, roots, flat, nodes: flat };\n}\n\nasync function find(ctx, selector, options = {}) {\n const nodes = await findAll(ctx, selector, options);\n if (nodes.length > 0) return nodes[0];\n if (options.optional) return null;\n throw new CrawlerError({\n message: `automation_failed: View \u672A\u627E\u5230 ${selectorLabel(selector)}`,\n code: Code.AutomationFailed,\n context: { selector },\n });\n}\n\nasync function findAll(ctx, selector, options = {}) {\n const view = options.snapshot || await snapshot(ctx, options);\n const normalized = normalizeSelector(selector);\n return view.flat.filter((node) => matchesSelector(node, normalized, options));\n}\n\nasync function waitFor(ctx, selector, options = {}) {\n const timeoutMs = Number(options.timeoutMs || options.timeout || 30000);\n const intervalMs = Number(options.intervalMs || options.pollIntervalMs || 500);\n const deadline = Date.now() + timeoutMs;\n let lastError = null;\n while (Date.now() < deadline) {\n try {\n const node = await find(ctx, selector, { ...options, optional: true });\n if (node) return node;\n } catch (error) {\n lastError = error;\n }\n await sleep(intervalMs);\n }\n if (lastError) throw lastError;\n throw new CrawlerError({\n message: `automation_failed: \u7B49\u5F85 View \u8D85\u65F6 ${selectorLabel(selector)}`,\n code: Code.AutomationFailed,\n context: { selector, timeoutMs },\n });\n}\n\nasync function bounds(ctx, selector, options = {}) {\n return (await find(ctx, selector, options)).bounds;\n}\n\nasync function text(ctx, selector, options = {}) {\n const node = await find(ctx, selector, options);\n return node.text || node.contentDesc || '';\n}\n\nasync function exists(ctx, selector, options = {}) {\n return Boolean(await find(ctx, selector, { ...options, optional: true }));\n}\n\nasync function isScrollable(ctx, selector, options = {}) {\n const node = await find(ctx, selector, options);\n return Boolean(node.scrollable);\n}\n\nfunction normalizeSelector(selector) {\n if (!selector || typeof selector !== 'object' || Array.isArray(selector)) {\n throw new CrawlerError({\n message: 'invalid_request: DeviceView selector must be an object',\n code: Code.InvalidRequest,\n context: { selector },\n });\n }\n const out = {};\n for (const key of ['id', 'text', 'textContains', 'contentDesc']) {\n if (selector[key] != null && String(selector[key]).trim()) out[key] = String(selector[key]).trim();\n }\n if (Object.keys(out).length === 0) {\n throw new CrawlerError({\n message: 'invalid_request: DeviceView selector requires id/text/textContains/contentDesc',\n code: Code.InvalidRequest,\n context: { selector },\n });\n }\n return out;\n}\n\nfunction hashNode(node) {\n return createHash('sha256').update(stableNodeString(node)).digest('hex');\n}\n\nfunction normalizeNode(raw, parent, index) {\n const childrenRaw = toArray(raw?.node);\n const bounds = parseBounds(raw?.bounds);\n const node = {\n resourceId: String(raw?.['resource-id'] || ''),\n id: shortResourceId(raw?.['resource-id']),\n text: String(raw?.text || ''),\n contentDesc: String(raw?.['content-desc'] || ''),\n className: String(raw?.class || ''),\n packageName: String(raw?.package || ''),\n bounds,\n clickable: toBoolean(raw?.clickable),\n enabled: toBoolean(raw?.enabled),\n focusable: toBoolean(raw?.focusable),\n focused: toBoolean(raw?.focused),\n scrollable: toBoolean(raw?.scrollable),\n visible: bounds.right > bounds.left && bounds.bottom > bounds.top,\n index: Number(raw?.index ?? index),\n parent: null,\n children: [],\n };\n node.parent = parent || null;\n node.children = childrenRaw.map((child, childIndex) => normalizeNode(child, node, childIndex));\n return node;\n}\n\nfunction matchesSelector(node, selector, options = {}) {\n if (options.visibleOnly !== false && !node.visible) return false;\n if (options.enabledOnly === true && !node.enabled) return false;\n if (selector.id && !matchesId(node, selector.id)) return false;\n if (selector.text && node.text !== selector.text) return false;\n if (selector.textContains && !node.text.includes(selector.textContains)) return false;\n if (selector.contentDesc && node.contentDesc !== selector.contentDesc) return false;\n return true;\n}\n\nfunction matchesId(node, expected) {\n const actual = node.resourceId || '';\n if (!actual) return false;\n if (actual === expected) return true;\n return actual.endsWith(`:id/${expected}`) || node.id === expected;\n}\n\nfunction collectFlat(node, out) {\n out.push(node);\n for (const child of node.children) collectFlat(child, out);\n}\n\nfunction toArray(value) {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction parseBounds(value) {\n const match = /\\[(\\d+),(\\d+)]\\[(\\d+),(\\d+)]/.exec(String(value || ''));\n if (!match) return { left: 0, top: 0, right: 0, bottom: 0, width: 0, height: 0, centerX: 0, centerY: 0 };\n const left = Number(match[1]);\n const top = Number(match[2]);\n const right = Number(match[3]);\n const bottom = Number(match[4]);\n return {\n left,\n top,\n right,\n bottom,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n centerX: (left + right) / 2,\n centerY: (top + bottom) / 2,\n };\n}\n\nfunction shortResourceId(value) {\n const raw = String(value || '');\n const marker = ':id/';\n const index = raw.indexOf(marker);\n return index >= 0 ? raw.slice(index + marker.length) : raw;\n}\n\nfunction toBoolean(value) {\n return value === true || String(value).toLowerCase() === 'true';\n}\n\nfunction stableNodeString(node) {\n if (!node) return '';\n return JSON.stringify({\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n bounds: node.bounds,\n clickable: node.clickable,\n enabled: node.enabled,\n focusable: node.focusable,\n focused: node.focused,\n scrollable: node.scrollable,\n children: node.children.map((child) => JSON.parse(stableNodeString(child) || '{}')),\n });\n}\n\nfunction selectorLabel(selector) {\n try {\n return JSON.stringify(selector);\n } catch {\n return String(selector);\n }\n}\n", "import { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { DeviceView } from './device-view.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nexport const DeviceInput = {\n click,\n tap: click,\n fill,\n type: fill,\n press,\n pressEnter,\n scroll,\n scrollToEnd,\n scrollToTop,\n};\n\nasync function click(ctx, selectorOrPoint, options = {}) {\n if (isPoint(selectorOrPoint)) {\n await Device.tapAbsolute(ctx, selectorOrPoint.x, selectorOrPoint.y);\n return { point: selectorOrPoint };\n }\n if (isBounds(selectorOrPoint)) {\n const point = centerOf(selectorOrPoint);\n await Device.tapAbsolute(ctx, point.x, point.y);\n return { point };\n }\n const target = await DeviceView.find(ctx, selectorOrPoint, options);\n const actual = nearestClickable(target);\n if (!actual) {\n throw new CrawlerError({\n message: `automation_failed: View \u4E0D\u53EF\u70B9\u51FB ${JSON.stringify(selectorOrPoint)}`,\n code: Code.AutomationFailed,\n context: { selector: selectorOrPoint, target: simplifyNode(target) },\n });\n }\n const point = centerOf(actual.bounds);\n Logger.info('DeviceInput.click', {\n selector: selectorOrPoint,\n target: simplifyNode(target),\n actual: simplifyNode(actual),\n point,\n });\n await Device.tapAbsolute(ctx, point.x, point.y);\n await sleep(Number(options.settleMs || 250));\n return { target, actual, point };\n}\n\nasync function fill(ctx, selector, text, options = {}) {\n await click(ctx, selector, options);\n await Device.typeText(ctx, text);\n await sleep(Number(options.settleMs || 350));\n}\n\nasync function press(ctx, key) {\n await Device.pressKey(ctx, key);\n}\n\nasync function pressEnter(ctx) {\n await Device.pressEnter(ctx);\n}\n\nasync function scroll(ctx, selector, direction, options = {}) {\n const node = await DeviceView.find(ctx, selector, options);\n const box = node.bounds;\n const ratio = Number(options.swipeRatio || 0.72);\n const durationMs = Number(options.durationMs || 360);\n const x = box.centerX;\n const distance = Math.max(40, box.height * ratio);\n const down = String(direction || '').toLowerCase() === 'down';\n const from = {\n x,\n y: down ? box.top + box.height * 0.25 : box.bottom - box.height * 0.25,\n };\n const to = {\n x,\n y: down ? Math.min(box.bottom - 10, from.y + distance) : Math.max(box.top + 10, from.y - distance),\n };\n await Device.swipe(ctx, from, to, durationMs);\n await sleep(Number(options.settleMs || 500));\n}\n\nasync function scrollToEnd(ctx, selector, options = {}) {\n return scrollUntilStable(ctx, selector, 'up', options);\n}\n\nasync function scrollToTop(ctx, selector, options = {}) {\n return scrollUntilStable(ctx, selector, 'down', options);\n}\n\nasync function scrollUntilStable(ctx, selector, direction, options = {}) {\n const maxSwipes = Math.max(1, Number(options.maxSwipes || 20));\n const stableRoundsTarget = Math.max(1, Number(options.stableRounds || 2));\n let lastHash = '';\n let stableRounds = 0;\n for (let index = 0; index < maxSwipes; index += 1) {\n const node = await DeviceView.find(ctx, selector, options);\n const currentHash = DeviceView.hashNode(node);\n if (currentHash === lastHash) {\n stableRounds += 1;\n if (stableRounds >= stableRoundsTarget) {\n return { swipes: index, stableRounds, hash: currentHash };\n }\n } else {\n stableRounds = 0;\n lastHash = currentHash;\n }\n await scroll(ctx, selector, direction, options);\n }\n return { swipes: maxSwipes, stableRounds, hash: lastHash };\n}\n\nfunction nearestClickable(node) {\n let current = node;\n while (current) {\n if (current.visible && current.enabled && current.clickable) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction isPoint(value) {\n return value && typeof value === 'object' && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));\n}\n\nfunction isBounds(value) {\n return value && typeof value === 'object'\n && Number.isFinite(Number(value.left))\n && Number.isFinite(Number(value.top))\n && Number.isFinite(Number(value.right))\n && Number.isFinite(Number(value.bottom));\n}\n\nfunction centerOf(bounds) {\n return {\n x: (Number(bounds.left) + Number(bounds.right)) / 2,\n y: (Number(bounds.top) + Number(bounds.bottom)) / 2,\n };\n}\n\nfunction simplifyNode(node) {\n if (!node) return null;\n return {\n id: node.id,\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n clickable: node.clickable,\n enabled: node.enabled,\n bounds: node.bounds,\n };\n}\n", "import { spawn } from 'node:child_process';\nimport { mkdtempSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport { Code } from '../constants.js';\nimport { Device } from '../device.js';\nimport { CrawlerError } from '../errors.js';\nimport { Logger } from '../logger.js';\n\nexport async function runFridaScriptInternal(ctx, source, options = {}) {\n await assertFridaReady(ctx);\n const label = String(options.label || 'frida-script');\n const marker = String(options.marker || 'ANDROID_TOOLKIT_SCRIPT_JSON ');\n const pid = await resolvePid(ctx, options.packageName || ctx.packageName);\n const scriptPath = writeTempScript(source, label);\n const args = [\n '-q',\n '-t',\n String(Number(options.fridaTimeoutSeconds || 8)),\n '-D',\n ctx.serial,\n '-p',\n pid,\n '-l',\n scriptPath,\n ];\n\n Logger.info('frida script start', { label, pid, timeoutMs: Number(options.timeoutMs || 12000) });\n try {\n return await runFridaProcess(ctx.fridaPath, args, {\n marker,\n timeoutMs: Number(options.timeoutMs || 12000),\n maxLines: Number(options.maxLines || 1500),\n });\n } finally {\n rmSync(path.dirname(scriptPath), { recursive: true, force: true });\n }\n}\n\nexport async function resolveFridaPid(ctx, packageName = ctx.packageName) {\n return resolvePid(ctx, packageName);\n}\n\nasync function assertFridaReady(ctx) {\n if (!ctx?.fridaPath) {\n throw new CrawlerError({\n message: 'frida_unavailable: ANDROID_TOOLKIT_FRIDA_PATH is required',\n code: Code.FridaUnavailable,\n });\n }\n if (!ctx?.serial) {\n throw new CrawlerError({\n message: 'frida_unavailable: device serial is required',\n code: Code.FridaUnavailable,\n });\n }\n}\n\nasync function resolvePid(ctx, packageName = ctx.packageName) {\n const target = String(packageName || '').trim();\n if (!target) {\n throw new CrawlerError({\n message: 'frida_unavailable: packageName is required',\n code: Code.FridaUnavailable,\n });\n }\n const out = await Device.adbShell(ctx, ['pidof', target], { timeoutMs: 8000 }).catch(() => '');\n const pid = String(out || '').trim().split(/\\s+/).find(Boolean);\n if (!pid) {\n throw new CrawlerError({\n message: `frida_unavailable: target app pid not found ${target}`,\n code: Code.FridaUnavailable,\n context: { packageName: target },\n });\n }\n return pid;\n}\n\nfunction runFridaProcess(fridaPath, args, options) {\n return new Promise((resolve, reject) => {\n const events = [];\n const lines = [];\n let buffer = '';\n let finished = false;\n const child = spawn(fridaPath, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n const timer = setTimeout(() => {\n if (finished) return;\n finished = true;\n child.kill('SIGTERM');\n reject(new CrawlerError({\n message: `frida_unavailable: frida script timeout ${options.timeoutMs}ms`,\n code: Code.FridaUnavailable,\n context: { lines: lines.slice(-40) },\n }));\n }, options.timeoutMs);\n\n const consumeLine = (line) => {\n const text = String(line || '').trim();\n if (!text) return;\n lines.push(text);\n if (lines.length > options.maxLines) lines.shift();\n const markerIndex = text.indexOf(options.marker);\n if (markerIndex < 0) return;\n const jsonText = text.slice(markerIndex + options.marker.length).trim();\n try {\n events.push(JSON.parse(jsonText));\n } catch (error) {\n events.push({ type: 'parse_error', error: error?.message || String(error), line: text });\n }\n };\n\n const onChunk = (chunk) => {\n buffer += chunk.toString('utf8');\n let index = buffer.indexOf('\\n');\n while (index >= 0) {\n consumeLine(buffer.slice(0, index));\n buffer = buffer.slice(index + 1);\n index = buffer.indexOf('\\n');\n }\n };\n\n child.stdout.on('data', onChunk);\n child.stderr.on('data', onChunk);\n child.on('error', (error) => {\n if (finished) return;\n finished = true;\n clearTimeout(timer);\n reject(new CrawlerError({\n message: `frida_unavailable: ${error?.message || String(error)}`,\n code: Code.FridaUnavailable,\n }));\n });\n child.on('close', () => {\n if (finished) return;\n finished = true;\n clearTimeout(timer);\n if (buffer.trim()) consumeLine(buffer);\n const parsed = events.filter((event) => event?.type !== 'parse_error');\n if (parsed.length === 0) {\n reject(new CrawlerError({\n message: 'frida_unavailable: script emitted no event',\n code: Code.FridaUnavailable,\n context: { lines: lines.slice(-40), events },\n }));\n return;\n }\n resolve(parsed.at(-1));\n });\n });\n}\n\nfunction writeTempScript(source, label) {\n const dir = mkdtempSync(path.join(tmpdir(), `android-toolkit-${safeName(label)}-`));\n const scriptPath = path.join(dir, 'script.js');\n writeFileSync(scriptPath, String(source || ''), 'utf8');\n return scriptPath;\n}\n\nfunction safeName(value) {\n return String(value || 'script').replace(/[^a-z0-9_-]+/gi, '-').slice(0, 80);\n}\n", "import { Code } from './constants.js';\nimport { CrawlerError } from './errors.js';\nimport { resolveFridaPid, runFridaScriptInternal } from './internals/frida-script.js';\n\nexport const Frida = {\n querySQLite,\n health,\n};\n\nasync function querySQLite(ctx, options = {}) {\n if (!options.sql) {\n throw new CrawlerError({\n message: 'invalid_request: sql is required',\n code: Code.InvalidRequest,\n });\n }\n\n const config = {\n dbPath: String(options.dbPath || ''),\n dbDir: String(options.dbDir || ''),\n dbNamePrefix: String(options.dbNamePrefix || ''),\n dbNameIncludes: String(options.dbNameIncludes || ''),\n dbNameExcludes: normalizeStringArray(options.dbNameExcludes),\n sql: String(options.sql || ''),\n args: normalizeStringArray(options.args),\n maxRows: Math.max(1, Number(options.maxRows || 200)),\n };\n\n const event = await runFridaScriptInternal(ctx, sqliteScript(config), {\n label: options.label || 'query-sqlite',\n packageName: options.packageName || ctx.packageName,\n timeoutMs: options.timeoutMs || 30000,\n fridaTimeoutSeconds: options.fridaTimeoutSeconds || 25,\n maxLines: options.maxLines || 4000,\n });\n\n if (!event.ok) {\n throw new CrawlerError({\n message: `content_unavailable: sqlite query failed ${event.error || ''}`.trim(),\n code: Code.ContentUnavailable,\n context: event,\n });\n }\n\n return event;\n}\n\nasync function health(ctx) {\n if (!ctx?.fridaPath) {\n throw new CrawlerError({\n message: 'frida_unavailable: ANDROID_TOOLKIT_FRIDA_PATH is required',\n code: Code.FridaUnavailable,\n });\n }\n if (!ctx?.serial) {\n throw new CrawlerError({\n message: 'frida_unavailable: device serial is required',\n code: Code.FridaUnavailable,\n });\n }\n const pid = await resolveFridaPid(ctx, ctx.packageName);\n return { ok: true, pid };\n}\n\nfunction sqliteScript(config) {\n return `\nJava.perform(function () {\n function emit(payload) { console.log('ANDROID_TOOLKIT_SCRIPT_JSON ' + JSON.stringify(payload)); }\n var config = ${JSON.stringify(config)};\n var JavaString = Java.use('java.lang.String');\n function safeString(cursor, index) {\n try { return cursor.isNull(index) ? '' : String(cursor.getString(index)); } catch (_) { return ''; }\n }\n function stringArray(values) {\n if (!values || values.length === 0) return null;\n var out = [];\n for (var i = 0; i < values.length; i++) out.push(String(values[i]));\n return Java.array('java.lang.String', out);\n }\n function matchesName(name) {\n if (config.dbNamePrefix && name.indexOf(config.dbNamePrefix) !== 0) return false;\n if (config.dbNameIncludes && name.indexOf(config.dbNameIncludes) < 0) return false;\n for (var i = 0; i < config.dbNameExcludes.length; i++) {\n if (String(name).indexOf(config.dbNameExcludes[i]) >= 0) return false;\n }\n return true;\n }\n function dbPaths() {\n if (config.dbPath) return [config.dbPath];\n var File = Java.use('java.io.File');\n var dir = File.$new(config.dbDir);\n var files = dir.listFiles();\n var out = [];\n if (!files) return out;\n for (var i = 0; i < files.length; i++) {\n var name = String(files[i].getName());\n if (matchesName(name)) out.push(String(files[i].getAbsolutePath()));\n }\n return out;\n }\n function queryOne(dbPath) {\n var SQLiteDatabase = Java.use('android.database.sqlite.SQLiteDatabase');\n var db = SQLiteDatabase.openDatabase(JavaString.$new(dbPath), null, 1);\n try {\n var cursor = db.rawQuery(JavaString.$new(config.sql), stringArray(config.args));\n var columns = [];\n var columnCount = cursor.getColumnCount();\n for (var c = 0; c < columnCount; c++) columns.push(String(cursor.getColumnName(c)));\n var rows = [];\n var truncated = false;\n while (cursor.moveToNext()) {\n if (rows.length >= config.maxRows) { truncated = true; break; }\n var row = {};\n for (var i = 0; i < columns.length; i++) row[columns[i]] = safeString(cursor, i);\n rows.push(row);\n }\n cursor.close();\n return { dbPath: dbPath, columns: columns, rows: rows, rowCount: rows.length, truncated: truncated };\n } finally {\n db.close();\n }\n }\n try {\n var paths = dbPaths();\n if (paths.length === 0) { emit({ ok: false, error: 'sqlite database not found', config: config }); return; }\n var databases = [];\n for (var d = 0; d < paths.length; d++) databases.push(queryOne(paths[d]));\n emit({ ok: true, databases: databases, rows: databases.length === 1 ? databases[0].rows : [] });\n } catch (error) {\n emit({ ok: false, error: String(error), stack: String(error.stack || '') });\n }\n});\n`;\n}\n\nfunction normalizeStringArray(value) {\n if (Array.isArray(value)) return value.map((item) => String(item ?? ''));\n if (value == null) return [];\n return [String(value)];\n}\n", "import fs from 'node:fs';\n\nimport { ApifyKit } from './apify-kit.js';\nimport { Context } from './context.js';\nimport { Device } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { DeviceView } from './device-view.js';\nimport { Frida } from './frida-client.js';\nimport { Logger } from './logger.js';\nimport { Mutation } from './mutation.js';\nimport { Share } from './share.js';\n\nconst DEFAULT_INPUT_PATH = '/apify_storage/input.json';\nconst DEFAULT_OUTPUT_PATH = '/apify_storage/output.json';\n\nexport const Launch = {\n run,\n};\n\nasync function run(handler, options = {}) {\n const startedAt = Date.now();\n const inputPath = pathOption(options.inputPath, DEFAULT_INPUT_PATH);\n const outputPath = pathOption(options.outputPath, DEFAULT_OUTPUT_PATH);\n const input = options.input || JSON.parse(fs.readFileSync(inputPath, 'utf8'));\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\n ctx.runId = ctx.runId || input.run_id || input.runId || input.runtime?.run_id || input.runtime?.runId || '';\n ctx.actorKey = ctx.actorKey || options.actorKey || input.actorKey || input.actor_name || input.actorName || '';\n\n const apifyKit = await ApifyKit.useApifyKit({\n reset: true,\n input,\n ctx,\n inputPath,\n outputPath,\n });\n\n const kit = {\n Launch,\n ApifyKit: apifyKit,\n Device,\n DeviceInput,\n DeviceView,\n Frida,\n Share,\n Mutation,\n Logger,\n Context,\n };\n\n try {\n Logger.start('Launch.run', {\n inputPath,\n outputPath,\n runId: ctx.runId,\n serial: ctx.serial,\n packageName: ctx.packageName,\n queryChars: ctx.query.length,\n });\n if (typeof options.hooks?.preNavigation === 'function') {\n await options.hooks.preNavigation({ input, ctx, kit, ApifyKit: apifyKit });\n }\n await handler({ input, ctx, kit, ApifyKit: apifyKit });\n if (typeof options.hooks?.postRun === 'function') {\n await options.hooks.postRun({ input, ctx, kit, ApifyKit: apifyKit });\n }\n Logger.success('Launch.run', { duration: Logger.duration(startedAt) });\n } catch (error) {\n Logger.fail(`Launch.run duration=${Logger.duration(startedAt)}`, error);\n if (typeof options.hooks?.onError === 'function') {\n await options.hooks.onError(error, { input, ctx, kit, ApifyKit: apifyKit });\n }\n if (!apifyKit.hasPushed()) await apifyKit.pushFailed(error);\n throw error;\n }\n}\n\nfunction pathOption(value, fallback) {\n const clean = String(value || '').trim();\n return clean || fallback;\n}\n", "import { DeviceView } from './device-view.js';\nimport { Logger, sleep } from './logger.js';\n\nconst MUTATION_MONITOR_MODE = Object.freeze({\n Added: 'added',\n Changed: 'changed',\n All: 'all',\n});\n\nexport const Mutation = {\n Mode: MUTATION_MONITOR_MODE,\n waitForStable,\n waitForStableAcrossRoots,\n useMonitor,\n};\n\nasync function waitForStable(ctx, selectors, options = {}) {\n const selectorList = normalizeSelectors(selectors);\n const initialTimeout = Math.max(0, Number(options.initialTimeout ?? 30000));\n const stableTime = Math.max(0, Number(options.stableTime ?? 5000));\n const timeout = Math.max(0, Number(options.timeout ?? 120000));\n const pollIntervalMs = Math.max(100, Number(options.pollIntervalMs ?? 500));\n const onMutation = typeof options.onMutation === 'function' ? options.onMutation : null;\n const startedAt = Date.now();\n const deadline = timeout === 0 ? Infinity : startedAt + timeout;\n const initialDeadline = initialTimeout === 0 ? startedAt : startedAt + initialTimeout;\n\n Logger.start('Mutation.waitForStable', {\n selectors: selectorList.map(selectorLabel).join(','),\n stableTime,\n timeout,\n pollIntervalMs,\n });\n\n let foundInitial = false;\n let lastSnapshot = null;\n let stableSince = 0;\n let mutationCount = 0;\n let wasPaused = false;\n\n while (Date.now() < deadline) {\n const snapshot = await captureSnapshot(ctx, selectorList, options);\n if (!foundInitial) {\n if (snapshot.found || Date.now() >= initialDeadline) {\n foundInitial = true;\n if (!snapshot.found) Logger.warn('Mutation.waitForStable \u521D\u59CB\u7B49\u5F85\u672A\u627E\u5230\u8282\u70B9', { initialTimeout });\n } else {\n await sleep(pollIntervalMs);\n continue;\n }\n }\n\n const changed = !lastSnapshot || snapshot.hash !== lastSnapshot.hash;\n if (changed) {\n if (lastSnapshot) mutationCount += 1;\n lastSnapshot = snapshot;\n }\n\n let paused = false;\n if ((changed || !stableSince) && onMutation) {\n const signal = await onMutation({\n mutationCount,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n });\n paused = !(signal === null || signal === undefined);\n wasPaused = wasPaused || paused;\n }\n\n if (paused) {\n stableSince = 0;\n } else if (changed || !stableSince) {\n stableSince = Date.now();\n } else if (Date.now() - stableSince >= stableTime) {\n const result = {\n mutationCount,\n stableTime,\n wasPaused,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n };\n Logger.success('Mutation.waitForStable', {\n duration: Logger.duration(startedAt),\n mutationCount,\n wasPaused,\n });\n return result;\n }\n\n await sleep(pollIntervalMs);\n }\n\n throw new Error(`Mutation.waitForStable \u8D85\u65F6 (${timeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316`);\n}\n\nasync function waitForStableAcrossRoots(ctx, selectors, options = {}) {\n return waitForStable(ctx, selectors, options);\n}\n\nasync function useMonitor(ctx, selectors, options = {}) {\n const selectorList = normalizeSelectors(selectors);\n const pollIntervalMs = Math.max(100, Number(options.pollIntervalMs ?? 500));\n const onMutation = typeof options.onMutation === 'function' ? options.onMutation : null;\n let stopped = false;\n let totalMutations = 0;\n let lastHash = '';\n\n const loop = async () => {\n while (!stopped) {\n const snapshot = await captureSnapshot(ctx, selectorList, options).catch(() => null);\n if (snapshot && snapshot.hash !== lastHash) {\n if (lastHash) totalMutations += 1;\n lastHash = snapshot.hash;\n if (onMutation) {\n await onMutation({\n mutationCount: totalMutations,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n });\n }\n }\n await sleep(pollIntervalMs);\n }\n };\n loop();\n\n return {\n stop: async () => {\n stopped = true;\n return { totalMutations };\n },\n };\n}\n\nasync function captureSnapshot(ctx, selectors, options = {}) {\n const view = await DeviceView.snapshot(ctx, options);\n const matched = selectors.length\n ? selectors.flatMap((selector) => view.flat.filter((node) => matchesSelector(node, selector, options)))\n : view.flat;\n const unique = uniqueNodes(matched);\n const mutationNodes = unique.map((node) => ({\n html: nodeToText(node),\n text: [node.text, node.contentDesc].filter(Boolean).join(' ').trim(),\n mutationType: 'stable',\n resourceId: node.resourceId,\n className: node.className,\n bounds: node.bounds,\n }));\n const html = mutationNodes.map((node) => node.html).join('\\n');\n const text = mutationNodes.map((node) => node.text).filter(Boolean).join('\\n');\n return {\n found: unique.length > 0,\n html,\n text,\n mutationNodes,\n hash: unique.map((node) => DeviceView.hashNode(node)).join('|'),\n };\n}\n\nfunction normalizeSelectors(selectors) {\n if (selectors == null) return [];\n const values = Array.isArray(selectors) ? selectors : [selectors];\n return values.map(normalizeSelector).filter(Boolean);\n}\n\nfunction normalizeSelector(selector) {\n if (selector === '*' || selector == null) return null;\n if (typeof selector === 'object') return selector;\n const text = String(selector || '').trim();\n if (!text) return null;\n return { id: text.replace(/^#/, '') };\n}\n\nfunction matchesSelector(node, selector, options) {\n if (!selector) return true;\n if (options.visibleOnly !== false && !node.visible) return false;\n if (selector.id) {\n const id = String(selector.id || '');\n if (node.resourceId !== id && node.id !== id && !node.resourceId.endsWith(`:id/${id}`)) return false;\n }\n if (selector.text && node.text !== selector.text) return false;\n if (selector.textContains && !node.text.includes(selector.textContains)) return false;\n if (selector.contentDesc && node.contentDesc !== selector.contentDesc) return false;\n return true;\n}\n\nfunction uniqueNodes(nodes) {\n const seen = new Set();\n const out = [];\n for (const node of nodes) {\n const key = `${node.resourceId}|${node.bounds.left},${node.bounds.top},${node.bounds.right},${node.bounds.bottom}|${node.text}|${node.contentDesc}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(node);\n }\n return out;\n}\n\nfunction nodeToText(node) {\n return JSON.stringify({\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n bounds: node.bounds,\n children: node.children?.length || 0,\n });\n}\n\nfunction selectorLabel(selector) {\n try {\n return JSON.stringify(selector);\n } catch {\n return String(selector);\n }\n}\n", "import { createHash } from 'node:crypto';\n\nimport { Jimp, JimpMime } from 'jimp';\n\nimport { ActorInfo, Code } from './constants.js';\nimport { Device } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { DeviceView } from './device-view.js';\nimport { CrawlerError } from './errors.js';\nimport { runFridaScriptInternal } from './internals/frida-script.js';\nimport { compressImageBufferToBase64, resolveImageCompression } from './internals/compression.js';\nimport { Logger, sleep } from './logger.js';\n\nconst DEFAULT_CAPTURE_COUNT = 9;\nconst DEFAULT_COLUMNS = 3;\nconst DEFAULT_SETTLE_MS = 550;\nconst DEFAULT_TIMEOUT_MS = 50000;\nconst DEFAULT_POLL_INTERVAL_MS = 800;\n\nexport const Share = {\n captureScreen,\n captureLink,\n};\n\nasync function captureScreen(ctx, options = {}) {\n const startedAt = Date.now();\n const frameBuffers = [];\n const seen = new Set();\n const targetSelector = options.selector || { id: 'message_list' };\n\n await Device.hideKeyboard(ctx, { attempts: 2, settleMs: 350 }).catch(() => {});\n await DeviceInput.scrollToTop(ctx, targetSelector, {\n maxSwipes: Number(options.scrollToTopMaxSwipes || 12),\n stableRounds: 2,\n settleMs: 400,\n }).catch((error) => {\n Logger.warn('captureScreen scrollToTop skipped', { message: error?.message || String(error) });\n });\n\n for (let index = 0; index < DEFAULT_CAPTURE_COUNT; index += 1) {\n await Device.hideKeyboard(ctx, { attempts: 1, settleMs: 250 }).catch(() => {});\n await sleep(DEFAULT_SETTLE_MS);\n const png = await Device.screenshotPng(ctx);\n const hash = createHash('sha256').update(png).digest('hex');\n if (seen.has(hash)) break;\n seen.add(hash);\n frameBuffers.push(png);\n if (index >= DEFAULT_CAPTURE_COUNT - 1) break;\n await DeviceInput.scroll(ctx, targetSelector, 'up', {\n swipeRatio: 0.72,\n durationMs: 360,\n settleMs: DEFAULT_SETTLE_MS,\n }).catch(() => {});\n }\n\n const sprite = await composeSprite(frameBuffers, { columns: DEFAULT_COLUMNS, gap: 16 });\n const compression = resolveImageCompression(options);\n const base64 = await compressImageBufferToBase64(sprite, compression);\n Logger.success('Share.captureScreen', {\n duration: Logger.duration(startedAt),\n frameCount: frameBuffers.length,\n base64Bytes: Math.ceil(base64.length),\n });\n return `data:image/jpeg;base64,${base64}`;\n}\n\nasync function captureLink(ctx, options = {}) {\n const actorInfo = resolveActorInfo(options.actorInfo || options.actorKey || ctx.actorKey);\n const share = actorInfo?.share || {};\n if (share.mode !== 'clipboard') {\n throw new CrawlerError({\n message: `source_extraction_failed: unsupported Android share mode ${share.mode || ''}`,\n code: Code.SourceExtractionFailed,\n });\n }\n\n const timeoutMs = Number(options.timeoutMs || DEFAULT_TIMEOUT_MS);\n const pollIntervalMs = Number(options.pollIntervalMs || DEFAULT_POLL_INTERVAL_MS);\n const deadline = Date.now() + timeoutMs;\n const prefix = String(share.prefix || '').trim();\n\n Logger.start('Share.captureLink', { actor: actorInfo.key, prefix, timeoutMs });\n await clearClipboard(ctx).catch((error) => {\n Logger.warn('Share.captureLink clearClipboard failed', { message: error?.message || String(error) });\n });\n\n if (typeof options.performActions === 'function') {\n await options.performActions();\n }\n\n let lastEvent = null;\n while (Date.now() < deadline) {\n const event = await readClipboard(ctx).catch((error) => ({ ok: false, error: error?.message || String(error) }));\n lastEvent = event;\n const link = selectLink(event, prefix);\n if (link) {\n Logger.success('Share.captureLink', { link });\n return { link, source: event.source || 'clipboard', payloadSnapshot: event.payloadSnapshot || '' };\n }\n await sleep(pollIntervalMs);\n }\n\n throw new CrawlerError({\n message: 'source_extraction_failed: \u672A\u6355\u83B7\u5206\u4EAB\u94FE\u63A5',\n code: Code.SourceExtractionFailed,\n context: { prefix, lastEvent },\n });\n}\n\nasync function clearClipboard(ctx) {\n await runFridaScriptInternal(ctx, clipboardScript('clear'), {\n label: 'share-clear-clipboard',\n timeoutMs: 8000,\n fridaTimeoutSeconds: 8,\n });\n}\n\nasync function readClipboard(ctx) {\n return runFridaScriptInternal(ctx, clipboardScript('read'), {\n label: 'share-read-clipboard',\n timeoutMs: 9000,\n fridaTimeoutSeconds: 8,\n maxLines: 1500,\n });\n}\n\nfunction clipboardScript(mode) {\n return `\nJava.perform(function () {\n function emit(payload) { console.log('ANDROID_TOOLKIT_SCRIPT_JSON ' + JSON.stringify(payload)); }\n var mode = ${JSON.stringify(mode)};\n var JavaObject = Java.use('java.lang.Object');\n function text(value) {\n if (value === null || value === undefined) return '';\n try { return Java.cast(value, JavaObject).toString() + ''; } catch (_) {}\n try { return value.toString.overload().call(value) + ''; } catch (_) {}\n try { return value.toString() + ''; } catch (_) {}\n return '';\n }\n function addCandidate(out, source, value) {\n var s = text(value);\n if (!s) return;\n var matches = s.match(/https?:\\\\/\\\\/[^\\\\s\"'<>\uFF0C\u3002]+/g) || [];\n for (var i = 0; i < matches.length; i++) {\n var link = matches[i].replace(/[)\\\\].,\uFF0C\u3002\uFF1B;!?\uFF01\uFF1F]+$/g, '');\n out.push({ source: source, link: link, payload: s.slice(0, 1000) });\n }\n }\n try {\n var ActivityThread = Java.use('android.app.ActivityThread');\n var ClipData = Java.use('android.content.ClipData');\n var app = ActivityThread.currentApplication();\n var manager = app ? app.getSystemService('clipboard') : null;\n if (!manager) { emit({ ok: false, error: 'clipboard manager unavailable' }); return; }\n if (mode === 'clear') {\n manager.setPrimaryClip(ClipData.newPlainText('android-toolkit', ''));\n emit({ ok: true, source: 'clipboard.clear' });\n return;\n }\n var candidates = [];\n var clip = manager.getPrimaryClip();\n var count = clip ? clip.getItemCount() : 0;\n for (var i = 0; i < count; i++) {\n var item = clip.getItemAt(i);\n try { addCandidate(candidates, 'clipboard.text', item.getText()); } catch (_) {}\n try { addCandidate(candidates, 'clipboard.html', item.getHtmlText()); } catch (_) {}\n try { addCandidate(candidates, 'clipboard.uri', item.getUri()); } catch (_) {}\n try { addCandidate(candidates, 'clipboard.intent', item.getIntent()); } catch (_) {}\n try { addCandidate(candidates, 'clipboard.coerceToText', item.coerceToText(app)); } catch (_) {}\n }\n emit({\n ok: candidates.length > 0,\n link: candidates.length > 0 ? candidates[0].link : '',\n source: candidates.length > 0 ? candidates[0].source : 'clipboard',\n candidates: candidates,\n payloadSnapshot: candidates.length > 0 ? String(candidates[0].payload || '').slice(0, 500) : ''\n });\n } catch (error) {\n emit({ ok: false, error: String(error), stack: String(error.stack || '') });\n }\n});\n`;\n}\n\nasync function composeSprite(buffers, options = {}) {\n if (!buffers.length) {\n throw new CrawlerError({ message: 'source_extraction_failed: no screenshots captured', code: Code.SourceExtractionFailed });\n }\n const images = [];\n for (const buffer of buffers) images.push(await Jimp.read(buffer));\n const columns = Math.max(1, Number(options.columns || DEFAULT_COLUMNS));\n const gap = Math.max(0, Number(options.gap || 0));\n const cellWidth = Math.max(...images.map((image) => image.bitmap.width));\n const cellHeight = Math.max(...images.map((image) => image.bitmap.height));\n const rows = Math.ceil(images.length / columns);\n const width = columns * cellWidth + (columns - 1) * gap;\n const height = rows * cellHeight + (rows - 1) * gap;\n const sprite = new Jimp({ width, height, color: 0xffffffff });\n images.forEach((image, index) => {\n const x = (index % columns) * (cellWidth + gap);\n const y = Math.floor(index / columns) * (cellHeight + gap);\n sprite.composite(image, x, y);\n });\n return sprite.getBuffer(JimpMime.png);\n}\n\nfunction resolveActorInfo(value) {\n if (value && typeof value === 'object') return value;\n const key = String(value || '').trim();\n const info = ActorInfo[key];\n if (!info) {\n throw new CrawlerError({\n message: `invalid_request: unknown actorInfo ${key}`,\n code: Code.InvalidRequest,\n });\n }\n return info;\n}\n\nfunction selectLink(event, prefix) {\n const candidates = [];\n if (event?.link) candidates.push(event.link);\n if (Array.isArray(event?.candidates)) {\n for (const candidate of event.candidates) {\n if (candidate?.link) candidates.push(candidate.link);\n }\n }\n return candidates.find((link) => !prefix || String(link).startsWith(prefix)) || '';\n}\n", "import {Jimp, JimpMime, ResizeStrategy} from 'jimp';\n\nimport {Logger} from '../logger.js';\n\nconst DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_SCREENSHOT_OUTPUT_TYPE = 'jpeg';\nconst DEFAULT_SCREENSHOT_QUALITY = 0.72;\nconst DEFAULT_SCREENSHOT_MIN_QUALITY = 0.38;\nconst DEFAULT_SCREENSHOT_MIN_SCALE = 0.25;\nconst SUPPORTED_SCREENSHOT_OUTPUT_TYPES = new Set(['jpeg']);\n\nconst toPositiveInteger = (value, fallback = 0) => {\n const number = Math.floor(Number(value) || 0);\n return number > 0 ? number : fallback;\n};\n\nconst normalizeQuality = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n const normalized = number > 1 ? number / 100 : number;\n return Math.min(1, Math.max(0.01, normalized));\n};\n\nconst normalizeScale = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n return Math.min(1, Math.max(0.05, number));\n};\n\nconst normalizeScreenshotOutputType = (value) => {\n const raw = String(value || DEFAULT_SCREENSHOT_OUTPUT_TYPE).trim().toLowerCase();\n const normalized = raw === 'jpg' ? 'jpeg' : raw;\n return SUPPORTED_SCREENSHOT_OUTPUT_TYPES.has(normalized)\n ? normalized\n : DEFAULT_SCREENSHOT_OUTPUT_TYPE;\n};\n\nconst getBase64BytesFromBuffer = (buffer) => Math.ceil(buffer.length / 3) * 4;\n\nconst toJpegQuality = (value) => Math.round(normalizeQuality(value, DEFAULT_SCREENSHOT_QUALITY) * 100);\n\nexport const resolveImageCompression = (options = {}) => {\n const explicit = options.compression;\n const source = explicit && typeof explicit === 'object' && !Array.isArray(explicit)\n ? explicit\n : {};\n\n const enabled = explicit !== false\n && source.enabled !== false\n && options.compress !== false;\n\n const quality = normalizeQuality(\n source.quality ?? options.quality,\n DEFAULT_SCREENSHOT_QUALITY\n );\n const minQuality = Math.min(\n quality,\n normalizeQuality(source.minQuality ?? options.minQuality, DEFAULT_SCREENSHOT_MIN_QUALITY)\n );\n\n return {\n enabled,\n maxBytes: toPositiveInteger(\n source.maxBytes\n ?? source.maxBase64Bytes\n ?? options.maxBytes\n ?? options.maxBase64Bytes,\n DEFAULT_SCREENSHOT_MAX_BYTES\n ),\n outputType: normalizeScreenshotOutputType(\n source.type\n ?? source.outputType\n ?? options.type\n ?? options.outputType\n ),\n quality,\n minQuality,\n minScale: normalizeScale(\n source.minScale ?? options.minScale,\n DEFAULT_SCREENSHOT_MIN_SCALE\n ),\n };\n};\n\nconst encodeJpeg = async (sourceImage, compression, scale, quality) => {\n const width = Math.max(1, Math.round(sourceImage.bitmap.width * scale));\n const height = Math.max(1, Math.round(sourceImage.bitmap.height * scale));\n const image = sourceImage.clone();\n\n if (scale < 0.999) {\n image.resize({\n w: width,\n h: height,\n mode: ResizeStrategy.BILINEAR,\n });\n }\n\n const buffer = await image.getBuffer(JimpMime.jpeg, {quality});\n return {\n buffer,\n bytes: getBase64BytesFromBuffer(buffer),\n width,\n height,\n quality,\n scale: Number(scale.toFixed(3)),\n format: compression.outputType,\n };\n};\n\nconst compressImageBuffer = async (buffer, compression) => {\n const sourceImage = await Jimp.read(buffer);\n const maxQuality = toJpegQuality(compression.quality);\n const minQuality = Math.min(maxQuality, toJpegQuality(compression.minQuality));\n let quality = maxQuality;\n let scale = 1;\n let smallest = null;\n\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = await encodeJpeg(sourceImage, compression, scale, quality);\n if (!smallest || candidate.bytes < smallest.bytes) {\n smallest = candidate;\n }\n if (candidate.bytes <= compression.maxBytes) {\n return {...candidate, withinLimit: true};\n }\n\n if (quality > minQuality) {\n quality = Math.max(minQuality, Math.floor(quality * 0.75));\n continue;\n }\n\n const ratio = Math.sqrt(compression.maxBytes / Math.max(1, candidate.bytes));\n const nextScale = Math.max(\n compression.minScale,\n Math.min(scale * 0.85, scale * ratio * 0.94)\n );\n\n if (nextScale >= scale * 0.99 || scale <= compression.minScale) {\n break;\n }\n\n scale = nextScale;\n }\n\n const finalCandidate = await encodeJpeg(sourceImage, compression, compression.minScale, minQuality);\n const fallback = !smallest || finalCandidate.bytes < smallest.bytes\n ? finalCandidate\n : smallest;\n return {...fallback, withinLimit: fallback.bytes <= compression.maxBytes};\n};\n\nexport const compressImageBufferToBase64 = async (buffer, compression) => {\n const originalBytes = getBase64BytesFromBuffer(buffer);\n if (!compression.enabled || originalBytes <= compression.maxBytes) {\n return buffer.toString('base64');\n }\n\n const result = await compressImageBuffer(buffer, compression).catch((error) => {\n Logger.warn('captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE', {message: error?.message || String(error)});\n return null;\n });\n\n if (!result?.buffer) {\n return buffer.toString('base64');\n }\n\n if (result.withinLimit) {\n Logger.info('captureScreen \u5DF2\u538B\u7F29', {\n originalBytes,\n outputBytes: result.bytes,\n format: result.format,\n quality: result.quality,\n scale: result.scale,\n size: `${result.width}x${result.height}`,\n });\n } else {\n Logger.warn('captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807', {\n originalBytes,\n outputBytes: result.bytes,\n maxBytes: compression.maxBytes,\n format: result.format,\n quality: result.quality,\n scale: result.scale,\n });\n }\n\n return result.buffer.toString('base64');\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["text", "fs", "options", "bounds", "pressEnter", "point", "text", "bounds", "import_node_child_process", "
|
|
3
|
+
"sources": ["../entrys/node.js", "../src/apify-kit.js", "../src/constants.js", "../src/context.js", "../src/device.js", "../src/errors.js", "../src/logger.js", "../src/device-view.js", "../src/device-input.js", "../src/device-sqlite.js", "../src/launch.js", "../src/mutation.js", "../src/share.js", "../src/internals/compression.js"],
|
|
4
|
+
"sourcesContent": ["import { ApifyKit } from '../src/apify-kit.js';\nimport { Context } from '../src/context.js';\nimport { Device } from '../src/device.js';\nimport { DeviceInput } from '../src/device-input.js';\nimport { DeviceSQLite } from '../src/device-sqlite.js';\nimport { DeviceView } from '../src/device-view.js';\nimport { Launch } from '../src/launch.js';\nimport { Logger } from '../src/logger.js';\nimport { Mutation } from '../src/mutation.js';\nimport { Share } from '../src/share.js';\nimport * as Constants from '../src/constants.js';\nimport * as Errors from '../src/errors.js';\n\nconst ToolkitMode = Object.freeze({\n default: 'default',\n});\n\nexport const useAndroidToolKit = () => {\n return {\n Launch,\n ApifyKit,\n DeviceInput,\n DeviceView,\n DeviceSQLite,\n Device,\n Mutation,\n Share,\n Constants,\n Errors,\n Logger,\n Context,\n };\n};\n\nuseAndroidToolKit.Mode = ToolkitMode;\n", "import fs from 'node:fs';\n\nimport { Code, Status } from './constants.js';\nimport { Context } from './context.js';\nimport { Device } from './device.js';\nimport { CrawlerError, serializeError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nlet instance = null;\n\nexport const ApifyKit = {\n useApifyKit,\n};\n\nasync function useApifyKit(options = {}) {\n if (!instance || options.reset) {\n instance = createApifyKit(options);\n }\n return instance;\n}\n\nfunction createApifyKit(options = {}) {\n const inputPath = String(options.inputPath || '').trim();\n const outputPath = requiredOption(options.outputPath, 'outputPath');\n const input = options.input || (inputPath ? JSON.parse(fs.readFileSync(inputPath, 'utf8')) : {});\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\n let pushed = false;\n\n return {\n ctx,\n input,\n inputPath,\n outputPath,\n async runStep(step, target, actionFn, options = {}) {\n const { failActor = true, retry = {} } = options;\n const retryTimes = Math.max(0, Number(retry.times || 0));\n const startedAt = Date.now();\n let lastError = null;\n\n for (let attempt = 0; attempt <= retryTimes; attempt += 1) {\n const attemptLabel = attempt > 0 ? ` (\u91CD\u8BD5 #${attempt})` : '';\n Logger.start(`[Step] ${step}${attemptLabel}`, stepDetail(target));\n try {\n const result = await actionFn();\n Logger.success(`[Step] ${step}${attemptLabel}`, { duration: Logger.duration(startedAt) });\n return result;\n } catch (error) {\n lastError = error;\n Logger.fail(`[Step] ${step}${attemptLabel}`, error);\n if (attempt < retryTimes) {\n if (typeof retry.before === 'function') {\n await retry.before(ctx, attempt + 1);\n } else {\n await sleep(3000);\n }\n }\n }\n }\n\n if (failActor) {\n let base64 = '';\n try {\n base64 = await Device.screenshotBase64(ctx);\n } catch (error) {\n base64 = `\u622A\u56FE\u5931\u8D25: ${error?.message || String(error)}`;\n }\n await this.pushFailed(lastError, { step, base64, retryAttempts: retryTimes });\n }\n throw lastError;\n },\n async runStepLoose(step, target, actionFn, options = {}) {\n return this.runStep(step, target, actionFn, { ...options, failActor: false });\n },\n async pushSuccess(data = {}, options = {}) {\n pushed = true;\n appendOutput(outputPath, {\n code: Code.Success,\n status: Status.Success,\n timestamp: new Date().toISOString(),\n data: sanitizeData(data),\n ...(options.meta ? { meta: sanitizeData(options.meta) } : {}),\n });\n Logger.success('pushSuccess', { outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushArtifact(data = {}) {\n appendOutput(outputPath, sanitizeData(data));\n Logger.success('pushArtifact', { outputPath, keys: Object.keys(data || {}).join(',') });\n },\n async pushFailed(error, meta = {}) {\n const normalized = CrawlerError.isCrawlerError(error)\n ? error\n : CrawlerError.from(error, { code: Code.UnknownError, context: meta });\n pushed = true;\n appendOutput(outputPath, {\n code: normalized.code,\n status: Status.Failed,\n error: serializeError(normalized),\n meta: sanitizeData(meta),\n context: sanitizeData(normalized.context),\n timestamp: new Date().toISOString(),\n });\n Logger.success('pushFailed', { outputPath, code: normalized.code, message: normalized.message });\n },\n hasPushed() {\n return pushed;\n },\n };\n}\n\nfunction appendOutput(outputPath, item) {\n const items = readOutputArray(outputPath);\n items.push(item);\n fs.writeFileSync(outputPath, JSON.stringify(items, null, 2) + '\\n', 'utf8');\n}\n\nfunction readOutputArray(outputPath) {\n if (!fs.existsSync(outputPath)) return [];\n const raw = fs.readFileSync(outputPath, 'utf8').trim();\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) throw new Error(`Android output must be a JSON array: ${outputPath}`);\n return parsed;\n}\n\nfunction requiredOption(value, name) {\n const clean = String(value || '').trim();\n if (!clean) throw new Error(`ApifyKit.useApifyKit requires ${name}`);\n return clean;\n}\n\nfunction stepDetail(target) {\n if (!target) return {};\n if (typeof target === 'string') return { target };\n if (typeof target === 'object') {\n return {\n serial: target.serial,\n packageName: target.packageName,\n runId: target.runId,\n };\n }\n return { target: String(target) };\n}\n\nfunction sanitizeData(value, depth = 0, seen = new WeakSet()) {\n if (depth > 8) return '[MaxDepth]';\n if (value == null) return value;\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return value.toString();\n if (type === 'function' || type === 'symbol') return undefined;\n if (value instanceof Error) return serializeError(value);\n if (Array.isArray(value)) return value.map((item) => sanitizeData(item, depth + 1, seen)).filter((item) => item !== undefined);\n if (type !== 'object') return String(value);\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n const out = {};\n for (const [key, item] of Object.entries(value)) {\n const safe = sanitizeData(item, depth + 1, seen);\n if (safe !== undefined) out[key] = safe;\n }\n return out;\n}\n", "export const Code = Object.freeze({\n Success: 0,\n UnknownError: -1,\n NotLogin: 30000001,\n Timeout: 30000003,\n InitialTimeout: 30000004,\n OverallTimeout: 30000005,\n InvalidRequest: 30010001,\n AdbUnavailable: 30010002,\n ContentUnavailable: 30010003,\n SourceExtractionFailed: 30010004,\n AutomationFailed: 30010005,\n DataAccessUnavailable: 30010008,\n AppNotInstalled: 30010009,\n});\n\nexport const Status = Object.freeze({\n Success: 'SUCCESS',\n Failed: 'FAILED',\n});\n\nexport const UnicodeIme = Object.freeze({\n packageName: 'io.appium.settings',\n component: 'io.appium.settings/.UnicodeIME',\n inputAction: 'ADB_INPUT_TEXT',\n});\n\nexport const AppiumSettings = Object.freeze({\n packageName: 'io.appium.settings',\n clipboardReceiver: 'io.appium.settings/.receivers.ClipboardReceiver',\n clipboardGetAction: 'io.appium.settings.clipboard.get',\n});\n\nconst normalizeShare = (share) => {\n const source = share && typeof share === 'object' ? share : {};\n return {\n mode: 'clipboard',\n prefix: String(source.prefix || '').trim(),\n xurl: Array.isArray(source.xurl) ? source.xurl : [],\n };\n};\n\nconst createActorInfo = (info) => {\n const key = String(info.key || '').trim();\n return Object.freeze({\n key,\n name: String(info.name || key),\n icon: String(info.icon || `https://static.heartbitai.com/general/actors/${key}.png`),\n share: Object.freeze(normalizeShare(info.share)),\n });\n};\n\nexport const ActorInfo = Object.freeze({\n 'doubao.android': createActorInfo({\n key: 'doubao.android',\n name: '\u8C46\u5305 Android',\n share: {\n prefix: 'https://www.doubao.com/thread/',\n xurl: [],\n },\n }),\n});\n", "export const Context = {\n createAndroidContext,\n firstNonEmpty,\n requireNonEmpty,\n};\n\nfunction createAndroidContext(input = {}, defaults = {}) {\n const runtime = input.runtime && typeof input.runtime === 'object' ? input.runtime : {};\n const device = runtime.device && typeof runtime.device === 'object'\n ? runtime.device\n : {};\n\n return {\n runId: firstNonEmpty(defaults.runId, runtime.runId, input.runId),\n query: String(firstNonEmpty(defaults.query, input.query) || '').trim(),\n serial: firstNonEmpty(defaults.serial, device.serial),\n packageName: firstNonEmpty(defaults.packageName, device.packageName),\n adbPath: firstNonEmpty(defaults.adbPath, process.env.ANDROID_TOOLKIT_ADB_PATH),\n appVersion: firstNonEmpty(defaults.appVersion, device.appVersion),\n slotKey: firstNonEmpty(defaults.slotKey, device.slotKey),\n instanceId: firstNonEmpty(defaults.instanceId, device.instanceId),\n externalIp: firstNonEmpty(defaults.externalIp, device.externalIp),\n };\n}\n\nfunction firstNonEmpty(...values) {\n for (const value of values) {\n const clean = String(value ?? '').trim();\n if (clean) return clean;\n }\n return '';\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new Error(`${name} is required`);\n return clean;\n}\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { AppiumSettings, Code, UnicodeIme } from './constants.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const Device = {\n adbExec,\n adbShell,\n forceStopApp,\n startActivity,\n startLauncher,\n focusedActivity,\n waitForActivity,\n waitForForeground,\n screenSize,\n screenDensity,\n tapAbsolute,\n swipe,\n pressKey,\n pressBack,\n pressEnter,\n typeText,\n screenshotPng,\n screenshotBase64,\n dumpUiXml,\n readClipboard,\n clearClipboard,\n wakeAndUnlock,\n hideKeyboard,\n isKeyboardVisible,\n sleep,\n ensureUnicodeIme,\n};\n\nasync function adbExec(ctx, args, options = {}) {\n const adbPath = requireDeviceField(ctx, 'adbPath');\n const startedAt = Date.now();\n try {\n const { stdout } = await execFileAsync(adbPath, args.map(String), {\n timeout: Number(options.timeoutMs || 15000),\n maxBuffer: Number(options.maxBuffer || 12 * 1024 * 1024),\n encoding: options.encoding || 'utf8',\n });\n Logger.debug('adbExec', { duration: Logger.duration(startedAt), args: compactArgs(args) });\n return stdout;\n } catch (error) {\n if (isAdbUnavailableError(error)) {\n throw new CrawlerError({\n message: `adb_unavailable: ${error?.message || String(error)}`,\n code: Code.AdbUnavailable,\n context: { args: compactArgs(args), adbPath },\n });\n }\n throw error;\n }\n}\n\nasync function adbShell(ctx, args, options = {}) {\n const serial = requireDeviceField(ctx, 'serial');\n return adbExec(ctx, ['-s', serial, 'shell', ...args], options);\n}\n\nasync function adbInput(ctx, args, options = {}) {\n return adbShell(ctx, ['input', ...args], options);\n}\n\nasync function forceStopApp(ctx, packageName = ctx.packageName) {\n await adbShell(ctx, ['am', 'force-stop', requireValue(packageName, 'packageName')], { timeoutMs: 15000 });\n}\n\nasync function startActivity(ctx, component, args = []) {\n await adbShell(ctx, ['am', 'start', '-n', requireValue(component, 'component'), ...args], { timeoutMs: 20000 });\n await sleep(1500);\n}\n\nasync function startLauncher(ctx, packageName = ctx.packageName, launcherActivity) {\n await startActivity(ctx, `${requireValue(packageName, 'packageName')}/${requireValue(launcherActivity, 'launcherActivity')}`, [\n '-a',\n 'android.intent.action.MAIN',\n '-c',\n 'android.intent.category.LAUNCHER',\n ]);\n}\n\nasync function focusedActivity(ctx) {\n const resumed = await resumedActivity(ctx).catch(() => '');\n if (resumed) return resumed;\n const out = await adbShell(ctx, ['dumpsys', 'window'], { timeoutMs: 15000, maxBuffer: 12 * 1024 * 1024 });\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.includes('mCurrentFocus=Window') && !trimmed.includes('=null')) return trimmed;\n }\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.includes('mFocusedApp=AppWindowToken') && !trimmed.includes('=null')) return trimmed;\n }\n return String(out || '').trim();\n}\n\nasync function resumedActivity(ctx) {\n const out = await adbShell(ctx, ['dumpsys', 'activity', 'activities'], {\n timeoutMs: 15000,\n maxBuffer: 12 * 1024 * 1024,\n });\n let fallback = '';\n for (const line of String(out || '').split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed.includes('ActivityRecord') || !trimmed.includes('/')) continue;\n if (trimmed.includes('mTopResumedActivity') || trimmed.includes('topResumedActivity')) return trimmed;\n if (trimmed.includes('mResumedActivity')) fallback = trimmed;\n }\n return fallback;\n}\n\nasync function waitForActivity(ctx, predicate, timeoutMs = 15000, intervalMs = 700) {\n const deadline = Date.now() + Number(timeoutMs);\n let lastFocused = '';\n while (Date.now() < deadline) {\n lastFocused = await focusedActivity(ctx).catch((error) => `ERROR: ${error?.message || String(error)}`);\n if (predicate(lastFocused)) return lastFocused;\n await sleep(intervalMs);\n }\n throw new CrawlerError({\n message: `automation_failed: waitForActivity timeout focused=${lastFocused}`,\n code: Code.AutomationFailed,\n });\n}\n\nasync function waitForForeground(ctx, packageName = ctx.packageName, timeoutMs = 6000) {\n const target = requireValue(packageName, 'packageName');\n return waitForActivity(ctx, (value) => String(value || '').includes(target), timeoutMs, 500);\n}\n\nasync function screenSize(ctx) {\n const out = await adbShell(ctx, ['wm', 'size'], { timeoutMs: 15000 });\n const match = /(\\d+)x(\\d+)/.exec(String(out || ''));\n if (!match) throw new CrawlerError({ message: `adb_unavailable: cannot parse screen size: ${out}`, code: Code.AdbUnavailable });\n return { width: Number(match[1]), height: Number(match[2]) };\n}\n\nasync function screenDensity(ctx) {\n const out = await adbShell(ctx, ['wm', 'density'], { timeoutMs: 15000 });\n const match = /(\\d+)/.exec(String(out || ''));\n if (!match) throw new CrawlerError({ message: `adb_unavailable: cannot parse screen density: ${out}`, code: Code.AdbUnavailable });\n return Number(match[1]);\n}\n\nasync function tapAbsolute(ctx, x, y) {\n await adbInput(ctx, ['tap', Math.round(Number(x)), Math.round(Number(y))], { timeoutMs: 15000 });\n}\n\nasync function swipe(ctx, from, to, durationMs = 360) {\n await adbInput(ctx, [\n 'swipe',\n Math.round(Number(from?.x)),\n Math.round(Number(from?.y)),\n Math.round(Number(to?.x)),\n Math.round(Number(to?.y)),\n Math.round(Number(durationMs)),\n ], { timeoutMs: 15000 });\n}\n\nasync function pressKey(ctx, key) {\n await adbInput(ctx, ['keyevent', String(key)], { timeoutMs: 15000 });\n}\n\nasync function pressBack(ctx) {\n await pressKey(ctx, 'BACK');\n}\n\nasync function pressEnter(ctx) {\n await pressKey(ctx, 'KEYCODE_ENTER');\n}\n\nasync function typeText(ctx, text) {\n await ensureUnicodeIme(ctx);\n const value = String(text ?? '');\n if (!value) return;\n\n await adbShell(ctx, ['input', 'text', shellSingleQuote(encodeUnicodeImeText(value))], {\n timeoutMs: Math.max(15000, value.length * 300),\n });\n await sleep(1200);\n}\n\nasync function ensureUnicodeIme(ctx) {\n const out = await adbShell(ctx, ['ime', 'list', '-s'], { timeoutMs: 15000 });\n if (!String(out || '').split(/\\s+/).includes(UnicodeIme.component)) {\n throw new CrawlerError({\n message: `adb_unavailable: UnicodeIME \u672A\u5B89\u88C5\u6216\u4E0D\u53EF\u7528 ${UnicodeIme.component}`,\n code: Code.AdbUnavailable,\n context: { component: UnicodeIme.component },\n });\n }\n await adbShell(ctx, ['ime', 'set', UnicodeIme.component], { timeoutMs: 15000 });\n}\n\nasync function screenshotPng(ctx) {\n const serial = requireDeviceField(ctx, 'serial');\n const adbPath = requireDeviceField(ctx, 'adbPath');\n const { stdout } = await execFileAsync(adbPath, ['-s', serial, 'exec-out', 'screencap', '-p'], {\n timeout: 30000,\n maxBuffer: 40 * 1024 * 1024,\n encoding: 'buffer',\n });\n return Buffer.from(stdout);\n}\n\nasync function screenshotBase64(ctx) {\n return `data:image/png;base64,${(await screenshotPng(ctx)).toString('base64')}`;\n}\n\nasync function readClipboard(ctx) {\n const out = await adbShell(ctx, [\n 'am',\n 'broadcast',\n '-n',\n AppiumSettings.clipboardReceiver,\n '-a',\n AppiumSettings.clipboardGetAction,\n ], {\n timeoutMs: 8000,\n maxBuffer: 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `source_extraction_failed: Appium Settings clipboard receiver unavailable ${error?.message || String(error)}`,\n code: Code.SourceExtractionFailed,\n context: { receiver: AppiumSettings.clipboardReceiver },\n });\n });\n const text = normalizeAppiumClipboardBroadcast(out);\n if (!text) {\n throw new CrawlerError({\n message: 'source_extraction_failed: ADB clipboard is empty',\n code: Code.SourceExtractionFailed,\n context: { receiver: AppiumSettings.clipboardReceiver, output: String(out || '').slice(0, 1000) },\n });\n }\n return text;\n}\n\nasync function clearClipboard(ctx) {\n Logger.info('Device.clearClipboard skipped', {\n reason: 'Android shell clipboard set is not portable; captureLink validates by link change.',\n });\n}\n\nasync function dumpUiXml(ctx) {\n let lastError = null;\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const dumpPath = `/data/local/tmp/android-toolkit-window-${Date.now()}-${Math.random().toString(16).slice(2)}.xml`;\n await adbShell(ctx, ['rm', '-f', dumpPath], { timeoutMs: 10000 }).catch(() => {});\n try {\n await adbShell(ctx, ['uiautomator', 'dump', dumpPath], {\n timeoutMs: 30000,\n maxBuffer: 4 * 1024 * 1024,\n });\n const raw = await adbShell(ctx, ['cat', dumpPath], {\n timeoutMs: 30000,\n maxBuffer: 16 * 1024 * 1024,\n });\n const start = String(raw || '').indexOf('<?xml');\n if (start < 0) throw new CrawlerError({ message: `automation_failed: uiautomator dump missing xml: ${raw}`, code: Code.AutomationFailed });\n return String(raw || '').slice(start).trim();\n } catch (error) {\n lastError = error;\n Logger.warn('uiautomator dump retry', { attempt, message: error?.message || String(error) });\n await sleep(350 * attempt);\n } finally {\n await adbShell(ctx, ['rm', '-f', dumpPath], { timeoutMs: 10000 }).catch(() => {});\n }\n }\n throw CrawlerError.isCrawlerError(lastError)\n ? lastError\n : new CrawlerError({\n message: `automation_failed: uiautomator dump failed ${lastError?.message || String(lastError || '')}`.trim(),\n code: Code.AutomationFailed,\n context: { lastError: lastError?.message || String(lastError || '') },\n });\n}\n\nasync function wakeAndUnlock(ctx) {\n await pressKey(ctx, 'KEYCODE_WAKEUP').catch(() => {});\n await sleep(300);\n await pressKey(ctx, 'MENU').catch(() => {});\n await sleep(300);\n const size = await screenSize(ctx);\n await swipe(ctx, { x: size.width * 0.5, y: size.height * 0.82 }, { x: size.width * 0.5, y: size.height * 0.25 }, 350).catch(() => {});\n await sleep(600);\n}\n\nasync function isKeyboardVisible(ctx) {\n const out = await adbShell(ctx, ['dumpsys', 'input_method'], { timeoutMs: 15000, maxBuffer: 4 * 1024 * 1024 });\n return /mInputShown=true|mIsInputViewShown=true|inputShown=true/i.test(String(out || ''));\n}\n\nasync function hideKeyboard(ctx, options = {}) {\n const attempts = Math.max(1, Math.trunc(Number(options.attempts || 2)));\n for (let i = 0; i < attempts; i += 1) {\n if (!await isKeyboardVisible(ctx).catch(() => false)) return true;\n await pressBack(ctx).catch(() => {});\n await sleep(Number(options.settleMs || 400));\n }\n return !await isKeyboardVisible(ctx).catch(() => false);\n}\n\nfunction requireDeviceField(ctx, key) {\n return requireValue(ctx?.[key], key);\n}\n\nfunction requireValue(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction isAdbUnavailableError(error) {\n const message = String(error?.message || error || '');\n return /ENOENT|spawn .*adb|device .* not found|no devices|offline/i.test(message);\n}\n\nfunction compactArgs(args) {\n return args.map(String).join(' ').slice(0, 500);\n}\n\nfunction encodeUnicodeImeText(text) {\n let out = '';\n let buffer = '';\n const flush = () => {\n if (!buffer) return;\n const bytes = Buffer.alloc(buffer.length * 2);\n for (let index = 0; index < buffer.length; index += 1) {\n bytes.writeUInt16BE(buffer.charCodeAt(index), index * 2);\n }\n out += `&${bytes.toString('base64').replace(/\\//g, ',').replace(/=+$/g, '')}-`;\n buffer = '';\n };\n for (const char of String(text || '')) {\n const code = char.charCodeAt(0);\n if (code >= 0x20 && code <= 0x7e) {\n flush();\n out += char === '&' ? '&-' : char;\n } else {\n buffer += char;\n }\n }\n flush();\n return out;\n}\n\nfunction shellSingleQuote(value) {\n return `'${String(value).replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction normalizeAppiumClipboardBroadcast(value) {\n const out = String(value || '');\n if (!/Broadcast completed:\\s*result=-1\\b/.test(out)) return '';\n const match = /data=\"([^\"]*)\"/.exec(out) || /data=([^\\s]+)/.exec(out);\n const base64 = match ? String(match[1] || '').trim() : '';\n if (!base64) return '';\n try {\n return Buffer.from(base64, 'base64').toString('utf8').trim();\n } catch {\n return '';\n }\n}\n\nexport const $DeviceInternalsForTest = Object.freeze({\n});\n", "import { Code } from './constants.js';\n\nexport class CrawlerError extends Error {\n constructor(input = {}, options = {}) {\n const payload = typeof input === 'string' ? { message: input } : input;\n super(payload.message || 'Android crawler error', options);\n this.name = 'CrawlerError';\n this.code = payload.code || Code.UnknownError;\n this.context = payload.context || {};\n }\n\n static isCrawlerError(error) {\n return error instanceof CrawlerError || error?.name === 'CrawlerError';\n }\n\n static from(error, fallback = {}) {\n if (CrawlerError.isCrawlerError(error)) return error;\n return new CrawlerError({\n message: error?.message || String(error),\n code: fallback.code || Code.UnknownError,\n context: fallback.context || {},\n });\n }\n}\n\nexport function serializeError(error) {\n if (!error) return { message: '' };\n return {\n name: error.name || 'Error',\n message: error.message || String(error),\n stack: error.stack || '',\n code: error.code || '',\n context: error.context || undefined,\n };\n}\n", "const defaultLogger = {\n info: (...args) => console.error(...args),\n warning: (...args) => console.error(...args),\n warn: (...args) => console.error(...args),\n error: (...args) => console.error(...args),\n debug: (...args) => console.error(...args),\n};\n\nlet activeLogger = defaultLogger;\n\nexport const LOG_TEMPLATES = Object.freeze({\n stepStart: '[Step] start',\n stepSuccess: '[Step] success',\n stepFail: '[Step] failed',\n mutationStable: '[Mutation] stable',\n shareStart: '[Share] start',\n screenshotDone: '[Share] screenshot done',\n dataPush: '[Dataset] push',\n});\n\nexport const Logger = {\n setLogger(logger) {\n activeLogger = logger || defaultLogger;\n },\n createLogger(scope) {\n const prefix = scope ? `[${scope}] ` : '';\n return {\n start: (message, detail) => Logger.start(`${prefix}${message}`, detail),\n success: (message, detail) => Logger.success(`${prefix}${message}`, detail),\n fail: (message, error) => Logger.fail(`${prefix}${message}`, error),\n warn: (message, detail) => Logger.warn(`${prefix}${message}`, detail),\n info: (message, detail) => Logger.info(`${prefix}${message}`, detail),\n debug: (message, detail) => Logger.debug(`${prefix}${message}`, detail),\n };\n },\n useTemplate() {\n return {\n taskStart: (detail) => Logger.start('\u4EFB\u52A1\u5F00\u59CB', detail),\n taskSuccess: (detail) => Logger.success('\u4EFB\u52A1\u5B8C\u6210', detail),\n taskFail: (detail, error) => Logger.fail(`\u4EFB\u52A1\u5931\u8D25 ${detail || ''}`.trim(), error),\n stepStart: (step, detail) => Logger.start(`[Step] ${step}`, detail),\n stepSuccess: (step, detail) => Logger.success(`[Step] ${step}`, detail),\n stepFail: (step, error) => Logger.fail(`[Step] ${step}`, error),\n mutationStable: (detail) => Logger.success('[Mutation] stable', detail),\n shareStart: (detail) => Logger.start('[Share] capture', detail),\n screenshotDone: (detail) => Logger.success('[Share] screenshot', detail),\n dataPush: (detail) => Logger.success('[Dataset] push', detail),\n };\n },\n start(message, detail = '') {\n write('info', `\u25B6 ${message}`, detail);\n },\n success(message, detail = '') {\n write('info', `\u2713 ${message}`, detail);\n },\n fail(message, error = '') {\n write('error', `\u2717 ${message}`, error?.message || error);\n },\n warn(message, detail = '') {\n write('warn', `\u26A0 ${message}`, detail);\n },\n warning(message, detail = '') {\n Logger.warn(message, detail);\n },\n info(message, detail = '') {\n write('info', message, detail);\n },\n debug(message, detail = '') {\n write('debug', message, detail);\n },\n duration(startedAt) {\n return `${((Date.now() - startedAt) / 1000).toFixed(2)}s`;\n },\n};\n\nexport function stripAnsi(value) {\n return String(value || '').replace(/\\u001b\\[[0-9;]*m/g, '');\n}\n\nexport function sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction write(level, message, detail = '') {\n const formattedDetail = formatDetail(detail);\n const line = formattedDetail\n ? `[${formatTimestamp()}] [android-toolkit] ${message} ${formattedDetail}`\n : `[${formatTimestamp()}] [android-toolkit] ${message}`;\n const writer = activeLogger[level] || activeLogger.warning || activeLogger.warn || activeLogger.info || console.error;\n writer.call(activeLogger, line);\n}\n\nfunction formatTimestamp(date = new Date()) {\n const pad = (value, size = 2) => String(value).padStart(size, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}`;\n}\n\nfunction formatDetail(detail) {\n if (detail == null || detail === '') return '';\n if (detail instanceof Error) return detail.message;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) return detail.map(formatDetail).filter(Boolean).join(' ');\n if (typeof detail === 'object') {\n return Object.entries(detail)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=${typeof value === 'object' ? safeJson(value) : String(value)}`)\n .join(' ');\n }\n return String(detail);\n}\n\nfunction safeJson(value) {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n", "import { createHash } from 'node:crypto';\n\nimport { XMLParser } from 'fast-xml-parser';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { sleep } from './logger.js';\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '',\n allowBooleanAttributes: true,\n});\n\nexport const DeviceView = {\n snapshot,\n find,\n findAll,\n waitFor,\n bounds,\n text,\n exists,\n isScrollable,\n hashNode,\n normalizeSelector,\n};\n\nasync function snapshot(ctx, options = {}) {\n const xml = options.xml || await Device.dumpUiXml(ctx);\n const parsed = parser.parse(xml);\n const roots = toArray(parsed?.hierarchy?.node).map((node) => normalizeNode(node, null, 0));\n const flat = [];\n for (const root of roots) collectFlat(root, flat);\n return { xml, tree: roots, roots, flat, nodes: flat };\n}\n\nasync function find(ctx, selector, options = {}) {\n const nodes = await findAll(ctx, selector, options);\n if (nodes.length > 0) return nodes[0];\n if (options.optional) return null;\n throw new CrawlerError({\n message: `automation_failed: View \u672A\u627E\u5230 ${selectorLabel(selector)}`,\n code: Code.AutomationFailed,\n context: { selector },\n });\n}\n\nasync function findAll(ctx, selector, options = {}) {\n const view = options.snapshot || await snapshot(ctx, options);\n const normalized = normalizeSelector(selector);\n return view.flat.filter((node) => matchesSelector(node, normalized, options));\n}\n\nasync function waitFor(ctx, selector, options = {}) {\n const timeoutMs = Number(options.timeoutMs || options.timeout || 30000);\n const intervalMs = Number(options.intervalMs || options.pollIntervalMs || 500);\n const deadline = Date.now() + timeoutMs;\n let lastError = null;\n let sawCleanPoll = false;\n while (Date.now() < deadline) {\n try {\n const node = await find(ctx, selector, { ...options, optional: true });\n sawCleanPoll = true;\n lastError = null;\n if (node) return node;\n } catch (error) {\n lastError = error;\n }\n await sleep(intervalMs);\n }\n if (lastError && !sawCleanPoll) throw lastError;\n throw new CrawlerError({\n message: `automation_failed: \u7B49\u5F85 View \u8D85\u65F6 ${selectorLabel(selector)}`,\n code: Code.AutomationFailed,\n context: { selector, timeoutMs },\n });\n}\n\nasync function bounds(ctx, selector, options = {}) {\n return (await find(ctx, selector, options)).bounds;\n}\n\nasync function text(ctx, selector, options = {}) {\n const node = await find(ctx, selector, options);\n return node.text || node.contentDesc || '';\n}\n\nasync function exists(ctx, selector, options = {}) {\n return Boolean(await find(ctx, selector, { ...options, optional: true }));\n}\n\nasync function isScrollable(ctx, selector, options = {}) {\n const node = await find(ctx, selector, options);\n return Boolean(node.scrollable);\n}\n\nfunction normalizeSelector(selector) {\n if (!selector || typeof selector !== 'object' || Array.isArray(selector)) {\n throw new CrawlerError({\n message: 'invalid_request: DeviceView selector must be an object',\n code: Code.InvalidRequest,\n context: { selector },\n });\n }\n const out = {};\n for (const key of ['id', 'text', 'textContains', 'contentDesc']) {\n if (selector[key] != null && String(selector[key]).trim()) out[key] = String(selector[key]).trim();\n }\n if (Object.keys(out).length === 0) {\n throw new CrawlerError({\n message: 'invalid_request: DeviceView selector requires id/text/textContains/contentDesc',\n code: Code.InvalidRequest,\n context: { selector },\n });\n }\n return out;\n}\n\nfunction hashNode(node) {\n return createHash('sha256').update(stableNodeString(node)).digest('hex');\n}\n\nfunction normalizeNode(raw, parent, index) {\n const childrenRaw = toArray(raw?.node);\n const bounds = parseBounds(raw?.bounds);\n const node = {\n resourceId: String(raw?.['resource-id'] || ''),\n id: shortResourceId(raw?.['resource-id']),\n text: String(raw?.text || ''),\n contentDesc: String(raw?.['content-desc'] || ''),\n className: String(raw?.class || ''),\n packageName: String(raw?.package || ''),\n bounds,\n clickable: toBoolean(raw?.clickable),\n enabled: toBoolean(raw?.enabled),\n focusable: toBoolean(raw?.focusable),\n focused: toBoolean(raw?.focused),\n scrollable: toBoolean(raw?.scrollable),\n visible: bounds.right > bounds.left && bounds.bottom > bounds.top,\n index: Number(raw?.index ?? index),\n parent: null,\n children: [],\n };\n node.parent = parent || null;\n node.children = childrenRaw.map((child, childIndex) => normalizeNode(child, node, childIndex));\n return node;\n}\n\nfunction matchesSelector(node, selector, options = {}) {\n if (options.visibleOnly !== false && !node.visible) return false;\n if (options.enabledOnly === true && !node.enabled) return false;\n if (selector.id && !matchesId(node, selector.id)) return false;\n if (selector.text && node.text !== selector.text) return false;\n if (selector.textContains && !node.text.includes(selector.textContains)) return false;\n if (selector.contentDesc && node.contentDesc !== selector.contentDesc) return false;\n return true;\n}\n\nfunction matchesId(node, expected) {\n const actual = node.resourceId || '';\n if (!actual) return false;\n if (actual === expected) return true;\n return actual.endsWith(`:id/${expected}`) || node.id === expected;\n}\n\nfunction collectFlat(node, out) {\n out.push(node);\n for (const child of node.children) collectFlat(child, out);\n}\n\nfunction toArray(value) {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction parseBounds(value) {\n const match = /\\[(\\d+),(\\d+)]\\[(\\d+),(\\d+)]/.exec(String(value || ''));\n if (!match) return { left: 0, top: 0, right: 0, bottom: 0, width: 0, height: 0, centerX: 0, centerY: 0 };\n const left = Number(match[1]);\n const top = Number(match[2]);\n const right = Number(match[3]);\n const bottom = Number(match[4]);\n return {\n left,\n top,\n right,\n bottom,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n centerX: (left + right) / 2,\n centerY: (top + bottom) / 2,\n };\n}\n\nfunction shortResourceId(value) {\n const raw = String(value || '');\n const marker = ':id/';\n const index = raw.indexOf(marker);\n return index >= 0 ? raw.slice(index + marker.length) : raw;\n}\n\nfunction toBoolean(value) {\n return value === true || String(value).toLowerCase() === 'true';\n}\n\nfunction stableNodeString(node) {\n if (!node) return '';\n return JSON.stringify({\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n bounds: node.bounds,\n clickable: node.clickable,\n enabled: node.enabled,\n focusable: node.focusable,\n focused: node.focused,\n scrollable: node.scrollable,\n children: node.children.map((child) => JSON.parse(stableNodeString(child) || '{}')),\n });\n}\n\nfunction selectorLabel(selector) {\n try {\n return JSON.stringify(selector);\n } catch {\n return String(selector);\n }\n}\n", "import { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { DeviceView } from './device-view.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger, sleep } from './logger.js';\n\nexport const DeviceInput = {\n click,\n tap: click,\n fill,\n type: fill,\n press,\n pressEnter,\n scroll,\n scrollToEnd,\n scrollToTop,\n};\n\nasync function click(ctx, selectorOrPoint, options = {}) {\n if (isPoint(selectorOrPoint)) {\n await Device.tapAbsolute(ctx, selectorOrPoint.x, selectorOrPoint.y);\n return { point: selectorOrPoint };\n }\n if (isBounds(selectorOrPoint)) {\n const point = centerOf(selectorOrPoint);\n await Device.tapAbsolute(ctx, point.x, point.y);\n return { point };\n }\n const target = await DeviceView.find(ctx, selectorOrPoint, options);\n const actual = nearestClickable(target);\n if (!actual) {\n throw new CrawlerError({\n message: `automation_failed: View \u4E0D\u53EF\u70B9\u51FB ${JSON.stringify(selectorOrPoint)}`,\n code: Code.AutomationFailed,\n context: { selector: selectorOrPoint, target: simplifyNode(target) },\n });\n }\n const point = centerOf(actual.bounds);\n Logger.info('DeviceInput.click', {\n selector: selectorOrPoint,\n target: simplifyNode(target),\n actual: simplifyNode(actual),\n point,\n });\n await Device.tapAbsolute(ctx, point.x, point.y);\n await sleep(Number(options.settleMs || 250));\n return { target, actual, point };\n}\n\nasync function fill(ctx, selector, text, options = {}) {\n const value = String(text ?? '');\n const clicked = await click(ctx, selector, {\n ...options,\n settleMs: Number(options.focusSettleMs || 350),\n });\n try {\n await Device.typeText(ctx, value);\n } catch (error) {\n throw new CrawlerError({\n message: `automation_failed: View \u5199\u5165\u6587\u672C\u5931\u8D25 ${JSON.stringify(selector)}`,\n code: Code.AutomationFailed,\n context: { selector, error: error?.message || String(error) },\n });\n }\n Logger.info('DeviceInput.fill', {\n selector,\n target: simplifyNode(clicked.actual || clicked.target),\n chars: value.length,\n });\n await sleep(Number(options.settleMs || 350));\n return { target: clicked.actual || clicked.target, chars: value.length };\n}\n\nasync function press(ctx, key) {\n await Device.pressKey(ctx, key);\n}\n\nasync function pressEnter(ctx) {\n await Device.pressEnter(ctx);\n}\n\nasync function scroll(ctx, selector, direction, options = {}) {\n const node = await DeviceView.find(ctx, selector, options);\n const box = node.bounds;\n const ratio = Number(options.swipeRatio || 0.72);\n const durationMs = Number(options.durationMs || 360);\n const x = box.centerX;\n const distance = Math.max(40, box.height * ratio);\n const down = String(direction || '').toLowerCase() === 'down';\n const from = {\n x,\n y: down ? box.top + box.height * 0.25 : box.bottom - box.height * 0.25,\n };\n const to = {\n x,\n y: down ? Math.min(box.bottom - 10, from.y + distance) : Math.max(box.top + 10, from.y - distance),\n };\n await Device.swipe(ctx, from, to, durationMs);\n await sleep(Number(options.settleMs || 500));\n}\n\nasync function scrollToEnd(ctx, selector, options = {}) {\n return scrollUntilStable(ctx, selector, 'up', options);\n}\n\nasync function scrollToTop(ctx, selector, options = {}) {\n return scrollUntilStable(ctx, selector, 'down', options);\n}\n\nasync function scrollUntilStable(ctx, selector, direction, options = {}) {\n const maxSwipes = Math.max(1, Number(options.maxSwipes || 20));\n const stableRoundsTarget = Math.max(1, Number(options.stableRounds || 2));\n let lastHash = '';\n let stableRounds = 0;\n for (let index = 0; index < maxSwipes; index += 1) {\n const node = await DeviceView.find(ctx, selector, options);\n const currentHash = DeviceView.hashNode(node);\n if (currentHash === lastHash) {\n stableRounds += 1;\n if (stableRounds >= stableRoundsTarget) {\n return { swipes: index, stableRounds, hash: currentHash };\n }\n } else {\n stableRounds = 0;\n lastHash = currentHash;\n }\n await scroll(ctx, selector, direction, options);\n }\n return { swipes: maxSwipes, stableRounds, hash: lastHash };\n}\n\nfunction nearestClickable(node) {\n let current = node;\n while (current) {\n if (current.visible && current.enabled && current.clickable) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction isPoint(value) {\n return value && typeof value === 'object' && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));\n}\n\nfunction isBounds(value) {\n return value && typeof value === 'object'\n && Number.isFinite(Number(value.left))\n && Number.isFinite(Number(value.top))\n && Number.isFinite(Number(value.right))\n && Number.isFinite(Number(value.bottom));\n}\n\nfunction centerOf(bounds) {\n return {\n x: (Number(bounds.left) + Number(bounds.right)) / 2,\n y: (Number(bounds.top) + Number(bounds.bottom)) / 2,\n };\n}\n\nfunction simplifyNode(node) {\n if (!node) return null;\n return {\n id: node.id,\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n clickable: node.clickable,\n enabled: node.enabled,\n bounds: node.bounds,\n };\n}\n", "import { execFile } from 'node:child_process';\nimport { mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { Code } from './constants.js';\nimport { Device } from './device.js';\nimport { CrawlerError } from './errors.js';\nimport { Logger } from './logger.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const DeviceSQLite = {\n query,\n health,\n};\n\nasync function query(ctx, options = {}) {\n if (!options.sql) {\n throw new CrawlerError({\n message: 'invalid_request: sql is required',\n code: Code.InvalidRequest,\n });\n }\n const config = {\n dbPath: String(options.dbPath || ''),\n dbDir: String(options.dbDir || ''),\n dbNamePrefix: String(options.dbNamePrefix || ''),\n dbNameIncludes: String(options.dbNameIncludes || ''),\n dbNameExcludes: normalizeStringArray(options.dbNameExcludes),\n sql: String(options.sql || ''),\n args: normalizeStringArray(options.args),\n maxRows: Math.max(1, Number(options.maxRows || 200)),\n label: String(options.label || 'query-sqlite'),\n };\n if (!config.dbPath && !config.dbDir) {\n throw new CrawlerError({\n message: 'invalid_request: dbPath or dbDir is required',\n code: Code.InvalidRequest,\n });\n }\n\n const startedAt = Date.now();\n const dir = await mkdtemp(path.join(tmpdir(), 'android-toolkit-sqlite-'));\n try {\n const dbPaths = await resolveDeviceDbPaths(ctx, config);\n if (dbPaths.length === 0) {\n throw new CrawlerError({\n message: 'data_access_unavailable: sqlite database not found',\n code: Code.DataAccessUnavailable,\n context: { dbDir: config.dbDir, dbPath: config.dbPath, dbNamePrefix: config.dbNamePrefix },\n });\n }\n const databases = [];\n for (const dbPath of dbPaths) {\n const localDbPath = await pullDatabaseSnapshot(ctx, dbPath, dir);\n const result = await queryLocalSQLite(localDbPath, config);\n databases.push({\n dbPath,\n columns: result.columns,\n rows: result.rows,\n rowCount: result.rows.length,\n truncated: result.truncated,\n });\n }\n Logger.info('DeviceSQLite.query', {\n label: config.label,\n databaseCount: databases.length,\n rowCount: databases.reduce((total, item) => total + item.rowCount, 0),\n duration: Logger.duration(startedAt),\n });\n return { ok: true, databases, rows: databases.length === 1 ? databases[0].rows : [] };\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\nasync function health(ctx, options = {}) {\n const packageName = String(options.packageName || ctx?.packageName || '').trim();\n if (!packageName) {\n throw new CrawlerError({\n message: 'invalid_request: packageName is required',\n code: Code.InvalidRequest,\n });\n }\n await adbSuShell(ctx, `test -d ${shellQuote(`/data/data/${packageName}`)}`, {\n timeoutMs: Number(options.timeoutMs || 10_000),\n });\n return { ok: true, packageName };\n}\n\nasync function resolveDeviceDbPaths(ctx, config) {\n if (config.dbPath) return [config.dbPath];\n const command = `cd ${shellQuote(config.dbDir)} || exit 1; for file in *; do [ -f \"$file\" ] || continue; case \"$file\" in *-wal|*-shm) continue ;; esac; printf \"%s\\\\n\" \"$file\"; done`;\n const out = await adbSuShell(ctx, command, {\n timeoutMs: 15_000,\n maxBuffer: 2 * 1024 * 1024,\n }).catch((error) => {\n throw new CrawlerError({\n message: `data_access_unavailable: sqlite dbDir unavailable ${error?.message || String(error)}`,\n code: Code.DataAccessUnavailable,\n context: { dbDir: config.dbDir },\n });\n });\n return String(out || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((name) => matchesName(name, config))\n .map((name) => `${config.dbDir.replace(/\\/+$/, '')}/${name}`)\n .sort();\n}\n\nasync function pullDatabaseSnapshot(ctx, dbPath, localDir) {\n const serial = requireNonEmpty(ctx?.serial, 'serial');\n const adbPath = requireNonEmpty(ctx?.adbPath, 'adbPath');\n const baseName = path.basename(dbPath);\n const remoteDir = `/data/local/tmp/android-toolkit-sqlite-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n const remoteDb = `${remoteDir}/${baseName}`;\n const localDb = path.join(localDir, baseName);\n const copyCommand = [\n `rm -rf ${shellQuote(remoteDir)}`,\n `mkdir -p ${shellQuote(remoteDir)}`,\n `cp ${shellQuote(dbPath)} ${shellQuote(remoteDb)}`,\n `[ -f ${shellQuote(`${dbPath}-wal`)} ] && cp ${shellQuote(`${dbPath}-wal`)} ${shellQuote(`${remoteDb}-wal`)} || true`,\n `[ -f ${shellQuote(`${dbPath}-shm`)} ] && cp ${shellQuote(`${dbPath}-shm`)} ${shellQuote(`${remoteDb}-shm`)} || true`,\n `chmod 644 ${shellQuote(remoteDir)}/*`,\n ].join(' && ');\n try {\n await adbSuShell(ctx, copyCommand, { timeoutMs: 30_000, maxBuffer: 4 * 1024 * 1024 });\n await adbPull(adbPath, serial, remoteDb, localDb).catch((error) => {\n throw new CrawlerError({\n message: `data_access_unavailable: sqlite snapshot pull failed ${error?.message || String(error)}`,\n code: Code.DataAccessUnavailable,\n context: { dbPath },\n });\n });\n await adbPullOptional(adbPath, serial, `${remoteDb}-wal`, `${localDb}-wal`);\n await adbPullOptional(adbPath, serial, `${remoteDb}-shm`, `${localDb}-shm`);\n return localDb;\n } finally {\n await adbSuShell(ctx, `rm -rf ${shellQuote(remoteDir)}`, { timeoutMs: 10_000 }).catch(() => {});\n }\n}\n\nasync function adbSuShell(ctx, command, options = {}) {\n return Device.adbShell(ctx, [`su -c ${shellQuote(command)}`], options);\n}\n\nasync function queryLocalSQLite(dbPath, config) {\n const payloadPath = `${dbPath}.query.json`;\n const outputPath = `${dbPath}.rows.json`;\n await writeFile(payloadPath, JSON.stringify({\n dbPath,\n sql: config.sql,\n args: config.args,\n maxRows: config.maxRows,\n outputPath,\n }), 'utf8');\n const code = `\nconst fs = require('node:fs');\nconst { DatabaseSync } = require('node:sqlite');\nconst payload = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));\nconst db = new DatabaseSync(payload.dbPath, { open: true, readOnly: true });\ntry {\n const stmt = db.prepare(payload.sql);\n const columns = stmt.columns().map((column) => String(column.name || ''));\n const rows = [];\n let truncated = false;\n for (const row of stmt.iterate(...payload.args)) {\n if (rows.length >= payload.maxRows) { truncated = true; break; }\n const out = {};\n for (const column of columns) out[column] = row[column] == null ? '' : String(row[column]);\n rows.push(out);\n }\n fs.writeFileSync(payload.outputPath, JSON.stringify({ columns, rows, truncated }), 'utf8');\n} finally {\n db.close();\n}\n`;\n await execFileAsync(process.execPath, ['-e', code, payloadPath], {\n timeout: 30_000,\n maxBuffer: 4 * 1024 * 1024,\n encoding: 'utf8',\n });\n return JSON.parse(await import('node:fs/promises').then((fs) => fs.readFile(outputPath, 'utf8')));\n}\n\nasync function adbPull(adbPath, serial, remotePath, localPath) {\n await execFileAsync(adbPath, ['-s', serial, 'pull', remotePath, localPath], {\n timeout: 30_000,\n maxBuffer: 8 * 1024 * 1024,\n encoding: 'utf8',\n });\n}\n\nasync function adbPullOptional(adbPath, serial, remotePath, localPath) {\n await adbPull(adbPath, serial, remotePath, localPath).catch(() => {});\n}\n\nfunction matchesName(name, config) {\n if (config.dbNamePrefix && !name.startsWith(config.dbNamePrefix)) return false;\n if (config.dbNameIncludes && !name.includes(config.dbNameIncludes)) return false;\n for (const item of config.dbNameExcludes || []) {\n if (item && name.includes(item)) return false;\n }\n return true;\n}\n\nfunction normalizeStringArray(value) {\n if (Array.isArray(value)) return value.map((item) => String(item ?? ''));\n if (value == null) return [];\n return [String(value)];\n}\n\nfunction requireNonEmpty(value, name) {\n const clean = String(value ?? '').trim();\n if (!clean) throw new CrawlerError({ message: `invalid_request: ${name} is required`, code: Code.InvalidRequest });\n return clean;\n}\n\nfunction shellQuote(value) {\n return `'${String(value).replace(/'/g, `'\\\\''`)}'`;\n}\n", "import fs from 'node:fs';\n\nimport { ApifyKit } from './apify-kit.js';\nimport { Context } from './context.js';\nimport { Device } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { DeviceSQLite } from './device-sqlite.js';\nimport { DeviceView } from './device-view.js';\nimport { Logger } from './logger.js';\nimport { Mutation } from './mutation.js';\nimport { Share } from './share.js';\n\nconst DEFAULT_INPUT_PATH = '/apify_storage/input.json';\nconst DEFAULT_OUTPUT_PATH = '/apify_storage/output.json';\n\nexport const Launch = {\n run,\n};\n\nasync function run(handler, options = {}) {\n const startedAt = Date.now();\n const inputPath = pathOption(options.inputPath, DEFAULT_INPUT_PATH);\n const outputPath = pathOption(options.outputPath, DEFAULT_OUTPUT_PATH);\n const input = options.input || JSON.parse(fs.readFileSync(inputPath, 'utf8'));\n const ctx = options.ctx || Context.createAndroidContext(input, options.contextDefaults || {});\n ctx.runId = ctx.runId || input.run_id || input.runId || input.runtime?.run_id || input.runtime?.runId || '';\n ctx.actorKey = ctx.actorKey || options.actorKey || input.actorKey || input.actor_name || input.actorName || '';\n\n const apifyKit = await ApifyKit.useApifyKit({\n reset: true,\n input,\n ctx,\n inputPath,\n outputPath,\n });\n\n const kit = {\n Launch,\n ApifyKit: apifyKit,\n Device,\n DeviceInput,\n DeviceView,\n DeviceSQLite,\n Share,\n Mutation,\n Logger,\n Context,\n };\n\n try {\n Logger.start('Launch.run', {\n inputPath,\n outputPath,\n runId: ctx.runId,\n serial: ctx.serial,\n packageName: ctx.packageName,\n queryChars: ctx.query.length,\n });\n if (typeof options.hooks?.preNavigation === 'function') {\n await options.hooks.preNavigation({ input, ctx, kit, ApifyKit: apifyKit });\n }\n await handler({ input, ctx, kit, ApifyKit: apifyKit });\n if (typeof options.hooks?.postRun === 'function') {\n await options.hooks.postRun({ input, ctx, kit, ApifyKit: apifyKit });\n }\n Logger.success('Launch.run', { duration: Logger.duration(startedAt) });\n } catch (error) {\n Logger.fail(`Launch.run duration=${Logger.duration(startedAt)}`, error);\n if (typeof options.hooks?.onError === 'function') {\n await options.hooks.onError(error, { input, ctx, kit, ApifyKit: apifyKit });\n }\n if (!apifyKit.hasPushed()) await apifyKit.pushFailed(error);\n throw error;\n }\n}\n\nfunction pathOption(value, fallback) {\n const clean = String(value || '').trim();\n return clean || fallback;\n}\n", "import { DeviceView } from './device-view.js';\nimport { Logger, sleep } from './logger.js';\n\nconst MUTATION_MONITOR_MODE = Object.freeze({\n Added: 'added',\n Changed: 'changed',\n All: 'all',\n});\n\nexport const Mutation = {\n Mode: MUTATION_MONITOR_MODE,\n waitForStable,\n waitForStableAcrossRoots,\n useMonitor,\n};\n\nasync function waitForStable(ctx, selectors, options = {}) {\n const selectorList = normalizeSelectors(selectors);\n const initialTimeout = Math.max(0, Number(options.initialTimeout ?? 30000));\n const stableTime = Math.max(0, Number(options.stableTime ?? 5000));\n const timeout = Math.max(0, Number(options.timeout ?? 120000));\n const pollIntervalMs = Math.max(100, Number(options.pollIntervalMs ?? 500));\n const onMutation = typeof options.onMutation === 'function' ? options.onMutation : null;\n const startedAt = Date.now();\n const deadline = timeout === 0 ? Infinity : startedAt + timeout;\n const initialDeadline = initialTimeout === 0 ? startedAt : startedAt + initialTimeout;\n\n Logger.start('Mutation.waitForStable', {\n selectors: selectorList.map(selectorLabel).join(','),\n stableTime,\n timeout,\n pollIntervalMs,\n });\n\n let foundInitial = false;\n let lastSnapshot = null;\n let stableSince = 0;\n let mutationCount = 0;\n let wasPaused = false;\n\n while (Date.now() < deadline) {\n const snapshot = await captureSnapshot(ctx, selectorList, options);\n if (!foundInitial) {\n if (snapshot.found || Date.now() >= initialDeadline) {\n foundInitial = true;\n if (!snapshot.found) Logger.warn('Mutation.waitForStable \u521D\u59CB\u7B49\u5F85\u672A\u627E\u5230\u8282\u70B9', { initialTimeout });\n } else {\n await sleep(pollIntervalMs);\n continue;\n }\n }\n\n const changed = !lastSnapshot || snapshot.hash !== lastSnapshot.hash;\n if (changed) {\n if (lastSnapshot) mutationCount += 1;\n lastSnapshot = snapshot;\n }\n\n let paused = false;\n if ((changed || !stableSince) && onMutation) {\n const signal = await onMutation({\n mutationCount,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n });\n paused = !(signal === null || signal === undefined);\n wasPaused = wasPaused || paused;\n }\n\n if (paused) {\n stableSince = 0;\n } else if (changed || !stableSince) {\n stableSince = Date.now();\n } else if (Date.now() - stableSince >= stableTime) {\n const result = {\n mutationCount,\n stableTime,\n wasPaused,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n };\n Logger.success('Mutation.waitForStable', {\n duration: Logger.duration(startedAt),\n mutationCount,\n wasPaused,\n });\n return result;\n }\n\n await sleep(pollIntervalMs);\n }\n\n throw new Error(`Mutation.waitForStable \u8D85\u65F6 (${timeout}ms), \u5DF2\u68C0\u6D4B\u5230 ${mutationCount} \u6B21\u53D8\u5316`);\n}\n\nasync function waitForStableAcrossRoots(ctx, selectors, options = {}) {\n return waitForStable(ctx, selectors, options);\n}\n\nasync function useMonitor(ctx, selectors, options = {}) {\n const selectorList = normalizeSelectors(selectors);\n const pollIntervalMs = Math.max(100, Number(options.pollIntervalMs ?? 500));\n const onMutation = typeof options.onMutation === 'function' ? options.onMutation : null;\n let stopped = false;\n let totalMutations = 0;\n let lastHash = '';\n\n const loop = async () => {\n while (!stopped) {\n const snapshot = await captureSnapshot(ctx, selectorList, options).catch(() => null);\n if (snapshot && snapshot.hash !== lastHash) {\n if (lastHash) totalMutations += 1;\n lastHash = snapshot.hash;\n if (onMutation) {\n await onMutation({\n mutationCount: totalMutations,\n html: snapshot.html,\n text: snapshot.text,\n mutationNodes: snapshot.mutationNodes,\n });\n }\n }\n await sleep(pollIntervalMs);\n }\n };\n loop();\n\n return {\n stop: async () => {\n stopped = true;\n return { totalMutations };\n },\n };\n}\n\nasync function captureSnapshot(ctx, selectors, options = {}) {\n const view = await DeviceView.snapshot(ctx, options);\n const matched = selectors.length\n ? selectors.flatMap((selector) => view.flat.filter((node) => matchesSelector(node, selector, options)))\n : view.flat;\n const unique = uniqueNodes(matched);\n const mutationNodes = unique.map((node) => ({\n html: nodeToText(node),\n text: [node.text, node.contentDesc].filter(Boolean).join(' ').trim(),\n mutationType: 'stable',\n resourceId: node.resourceId,\n className: node.className,\n bounds: node.bounds,\n }));\n const html = mutationNodes.map((node) => node.html).join('\\n');\n const text = mutationNodes.map((node) => node.text).filter(Boolean).join('\\n');\n return {\n found: unique.length > 0,\n html,\n text,\n mutationNodes,\n hash: unique.map((node) => DeviceView.hashNode(node)).join('|'),\n };\n}\n\nfunction normalizeSelectors(selectors) {\n if (selectors == null) return [];\n const values = Array.isArray(selectors) ? selectors : [selectors];\n return values.map(normalizeSelector).filter(Boolean);\n}\n\nfunction normalizeSelector(selector) {\n if (selector === '*' || selector == null) return null;\n if (typeof selector === 'object') return selector;\n const text = String(selector || '').trim();\n if (!text) return null;\n return { id: text.replace(/^#/, '') };\n}\n\nfunction matchesSelector(node, selector, options) {\n if (!selector) return true;\n if (options.visibleOnly !== false && !node.visible) return false;\n if (selector.id) {\n const id = String(selector.id || '');\n if (node.resourceId !== id && node.id !== id && !node.resourceId.endsWith(`:id/${id}`)) return false;\n }\n if (selector.text && node.text !== selector.text) return false;\n if (selector.textContains && !node.text.includes(selector.textContains)) return false;\n if (selector.contentDesc && node.contentDesc !== selector.contentDesc) return false;\n return true;\n}\n\nfunction uniqueNodes(nodes) {\n const seen = new Set();\n const out = [];\n for (const node of nodes) {\n const key = `${node.resourceId}|${node.bounds.left},${node.bounds.top},${node.bounds.right},${node.bounds.bottom}|${node.text}|${node.contentDesc}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(node);\n }\n return out;\n}\n\nfunction nodeToText(node) {\n return JSON.stringify({\n resourceId: node.resourceId,\n text: node.text,\n contentDesc: node.contentDesc,\n className: node.className,\n bounds: node.bounds,\n children: node.children?.length || 0,\n });\n}\n\nfunction selectorLabel(selector) {\n try {\n return JSON.stringify(selector);\n } catch {\n return String(selector);\n }\n}\n", "import { createHash } from 'node:crypto';\n\nimport { Jimp, JimpMime } from 'jimp';\n\nimport { ActorInfo, Code } from './constants.js';\nimport { Device } from './device.js';\nimport { DeviceInput } from './device-input.js';\nimport { CrawlerError } from './errors.js';\nimport { compressImageBufferToBase64, resolveImageCompression } from './internals/compression.js';\nimport { Logger, sleep } from './logger.js';\n\nconst DEFAULT_CAPTURE_COUNT = 9;\nconst DEFAULT_COLUMNS = 3;\nconst DEFAULT_SETTLE_MS = 550;\nconst DEFAULT_TIMEOUT_MS = 50000;\nconst DEFAULT_POLL_INTERVAL_MS = 800;\n\nexport const Share = {\n captureScreen,\n captureLink,\n};\n\nasync function captureScreen(ctx, options = {}) {\n const startedAt = Date.now();\n const frameBuffers = [];\n const seen = new Set();\n const targetSelector = options.selector || { id: 'message_list' };\n\n await Device.hideKeyboard(ctx, { attempts: 2, settleMs: 350 }).catch(() => {});\n await DeviceInput.scrollToTop(ctx, targetSelector, {\n maxSwipes: Number(options.scrollToTopMaxSwipes || 12),\n stableRounds: 2,\n settleMs: 400,\n }).catch((error) => {\n Logger.warn('captureScreen scrollToTop skipped', { message: error?.message || String(error) });\n });\n\n for (let index = 0; index < DEFAULT_CAPTURE_COUNT; index += 1) {\n await Device.hideKeyboard(ctx, { attempts: 1, settleMs: 250 }).catch(() => {});\n await sleep(DEFAULT_SETTLE_MS);\n const png = await Device.screenshotPng(ctx);\n const hash = createHash('sha256').update(png).digest('hex');\n if (seen.has(hash)) break;\n seen.add(hash);\n frameBuffers.push(png);\n if (index >= DEFAULT_CAPTURE_COUNT - 1) break;\n await DeviceInput.scroll(ctx, targetSelector, 'up', {\n swipeRatio: 0.72,\n durationMs: 360,\n settleMs: DEFAULT_SETTLE_MS,\n }).catch(() => {});\n }\n\n const sprite = await composeSprite(frameBuffers, { columns: DEFAULT_COLUMNS, gap: 16 });\n const compression = resolveImageCompression(options);\n const base64 = await compressImageBufferToBase64(sprite, compression);\n Logger.success('Share.captureScreen', {\n duration: Logger.duration(startedAt),\n frameCount: frameBuffers.length,\n base64Bytes: Math.ceil(base64.length),\n });\n return `data:image/jpeg;base64,${base64}`;\n}\n\nasync function captureLink(ctx, options = {}) {\n const actorInfo = resolveActorInfo(options.actorInfo || options.actorKey || ctx.actorKey);\n const share = actorInfo?.share || {};\n if (share.mode !== 'clipboard') {\n throw new CrawlerError({\n message: `source_extraction_failed: unsupported Android share mode ${share.mode || ''}`,\n code: Code.SourceExtractionFailed,\n });\n }\n\n const timeoutMs = Number(options.timeoutMs || DEFAULT_TIMEOUT_MS);\n const pollIntervalMs = Number(options.pollIntervalMs || DEFAULT_POLL_INTERVAL_MS);\n const deadline = Date.now() + timeoutMs;\n const prefix = String(share.prefix || '').trim();\n\n Logger.start('Share.captureLink', { actor: actorInfo.key, prefix, timeoutMs });\n const beforeEvent = await readClipboard(ctx).catch(() => null);\n const beforeLink = beforeEvent ? selectLink(beforeEvent, prefix) : '';\n if (beforeLink) Logger.info('Share.captureLink baseline', { beforeLink });\n\n if (typeof options.performActions === 'function') {\n await options.performActions();\n }\n\n let lastEvent = null;\n while (Date.now() < deadline) {\n const event = await readClipboard(ctx).catch((error) => ({ ok: false, error: error?.message || String(error) }));\n lastEvent = event;\n const link = selectLink(event, prefix);\n if (link && link !== beforeLink) {\n Logger.success('Share.captureLink', { link });\n return { link, source: event.source || 'clipboard', payloadSnapshot: event.payloadSnapshot || '' };\n }\n if (link && link === beforeLink) {\n lastEvent = { ...event, rejected: 'same_as_baseline', beforeLink };\n }\n await sleep(pollIntervalMs);\n }\n\n throw new CrawlerError({\n message: 'source_extraction_failed: \u672A\u6355\u83B7\u5206\u4EAB\u94FE\u63A5',\n code: Code.SourceExtractionFailed,\n context: { prefix, lastEvent },\n });\n}\n\nasync function readClipboard(ctx) {\n const payload = await Device.readClipboard(ctx);\n const candidates = extractLinks(payload).map((link) => ({\n source: 'adb.clipboard',\n link,\n payload: payload.slice(0, 1000),\n }));\n return {\n ok: candidates.length > 0,\n link: candidates[0]?.link || '',\n source: 'adb.clipboard',\n candidates,\n payloadSnapshot: payload.slice(0, 500),\n };\n}\n\nasync function composeSprite(buffers, options = {}) {\n if (!buffers.length) {\n throw new CrawlerError({ message: 'source_extraction_failed: no screenshots captured', code: Code.SourceExtractionFailed });\n }\n const images = [];\n for (const buffer of buffers) images.push(await Jimp.read(buffer));\n const columns = Math.max(1, Number(options.columns || DEFAULT_COLUMNS));\n const gap = Math.max(0, Number(options.gap || 0));\n const cellWidth = Math.max(...images.map((image) => image.bitmap.width));\n const cellHeight = Math.max(...images.map((image) => image.bitmap.height));\n const rows = Math.ceil(images.length / columns);\n const width = columns * cellWidth + (columns - 1) * gap;\n const height = rows * cellHeight + (rows - 1) * gap;\n const sprite = new Jimp({ width, height, color: 0xffffffff });\n images.forEach((image, index) => {\n const x = (index % columns) * (cellWidth + gap);\n const y = Math.floor(index / columns) * (cellHeight + gap);\n sprite.composite(image, x, y);\n });\n return sprite.getBuffer(JimpMime.png);\n}\n\nfunction resolveActorInfo(value) {\n if (value && typeof value === 'object') return value;\n const key = String(value || '').trim();\n const info = ActorInfo[key];\n if (!info) {\n throw new CrawlerError({\n message: `invalid_request: unknown actorInfo ${key}`,\n code: Code.InvalidRequest,\n });\n }\n return info;\n}\n\nfunction selectLink(event, prefix) {\n const candidates = [];\n if (event?.link) candidates.push(event.link);\n if (Array.isArray(event?.candidates)) {\n for (const candidate of event.candidates) {\n if (candidate?.link) candidates.push(candidate.link);\n }\n }\n return candidates.find((link) => !prefix || String(link).startsWith(prefix)) || '';\n}\n\nfunction extractLinks(value) {\n const text = String(value || '');\n const matches = text.match(/https?:\\/\\/[^\\s\"'<>\uFF0C\u3002]+/g) || [];\n return matches.map((link) => link.replace(/[)\\].,\uFF0C\u3002\uFF1B;!?\uFF01\uFF1F]+$/g, ''));\n}\n", "import { Jimp, JimpMime, ResizeStrategy } from 'jimp';\n\nimport { Logger } from '../logger.js';\n\nconst DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_SCREENSHOT_OUTPUT_TYPE = 'jpeg';\nconst DEFAULT_SCREENSHOT_QUALITY = 0.72;\nconst DEFAULT_SCREENSHOT_MIN_QUALITY = 0.38;\nconst DEFAULT_SCREENSHOT_MIN_SCALE = 0.25;\nconst SUPPORTED_SCREENSHOT_OUTPUT_TYPES = new Set(['jpeg']);\n\nconst toPositiveInteger = (value, fallback = 0) => {\n const number = Math.floor(Number(value) || 0);\n return number > 0 ? number : fallback;\n};\n\nconst normalizeQuality = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n const normalized = number > 1 ? number / 100 : number;\n return Math.min(1, Math.max(0.01, normalized));\n};\n\nconst normalizeScale = (value, fallback) => {\n const number = Number(value);\n if (!Number.isFinite(number) || number <= 0) return fallback;\n return Math.min(1, Math.max(0.05, number));\n};\n\nconst normalizeScreenshotOutputType = (value) => {\n const raw = String(value || DEFAULT_SCREENSHOT_OUTPUT_TYPE).trim().toLowerCase();\n const normalized = raw === 'jpg' ? 'jpeg' : raw;\n return SUPPORTED_SCREENSHOT_OUTPUT_TYPES.has(normalized)\n ? normalized\n : DEFAULT_SCREENSHOT_OUTPUT_TYPE;\n};\n\nconst getBase64BytesFromBuffer = (buffer) => Math.ceil(buffer.length / 3) * 4;\n\nconst toJpegQuality = (value) => Math.round(normalizeQuality(value, DEFAULT_SCREENSHOT_QUALITY) * 100);\n\nexport const resolveImageCompression = (options = {}) => {\n const explicit = options.compression;\n const source = explicit && typeof explicit === 'object' && !Array.isArray(explicit)\n ? explicit\n : {};\n\n const enabled = explicit !== false\n && source.enabled !== false\n && options.compress !== false;\n\n const quality = normalizeQuality(\n source.quality ?? options.quality,\n DEFAULT_SCREENSHOT_QUALITY,\n );\n const minQuality = Math.min(\n quality,\n normalizeQuality(source.minQuality ?? options.minQuality, DEFAULT_SCREENSHOT_MIN_QUALITY),\n );\n\n return {\n enabled,\n maxBytes: toPositiveInteger(\n source.maxBytes\n ?? source.maxBase64Bytes\n ?? options.maxBytes\n ?? options.maxBase64Bytes,\n DEFAULT_SCREENSHOT_MAX_BYTES,\n ),\n outputType: normalizeScreenshotOutputType(\n source.type\n ?? source.outputType\n ?? options.type\n ?? options.outputType,\n ),\n quality,\n minQuality,\n minScale: normalizeScale(\n source.minScale ?? options.minScale,\n DEFAULT_SCREENSHOT_MIN_SCALE,\n ),\n };\n};\n\nconst encodeJpeg = async (sourceImage, compression, scale, quality) => {\n const width = Math.max(1, Math.round(sourceImage.bitmap.width * scale));\n const height = Math.max(1, Math.round(sourceImage.bitmap.height * scale));\n const image = sourceImage.clone();\n\n if (scale < 0.999) {\n image.resize({\n w: width,\n h: height,\n mode: ResizeStrategy.BILINEAR,\n });\n }\n\n const buffer = await image.getBuffer(JimpMime.jpeg, { quality });\n return {\n buffer,\n bytes: getBase64BytesFromBuffer(buffer),\n width,\n height,\n quality,\n scale: Number(scale.toFixed(3)),\n format: compression.outputType,\n };\n};\n\nconst compressImageBuffer = async (buffer, compression) => {\n const sourceImage = await Jimp.read(buffer);\n const maxQuality = toJpegQuality(compression.quality);\n const minQuality = Math.min(maxQuality, toJpegQuality(compression.minQuality));\n let quality = maxQuality;\n let scale = 1;\n let smallest = null;\n\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = await encodeJpeg(sourceImage, compression, scale, quality);\n if (!smallest || candidate.bytes < smallest.bytes) smallest = candidate;\n if (candidate.bytes <= compression.maxBytes) return { ...candidate, withinLimit: true };\n\n if (quality > minQuality) {\n quality = Math.max(minQuality, Math.floor(quality * 0.75));\n continue;\n }\n\n const ratio = Math.sqrt(compression.maxBytes / Math.max(1, candidate.bytes));\n const nextScale = Math.max(\n compression.minScale,\n Math.min(scale * 0.85, scale * ratio * 0.94),\n );\n\n if (nextScale >= scale * 0.99 || scale <= compression.minScale) break;\n scale = nextScale;\n }\n\n const finalCandidate = await encodeJpeg(sourceImage, compression, compression.minScale, minQuality);\n const fallback = !smallest || finalCandidate.bytes < smallest.bytes\n ? finalCandidate\n : smallest;\n return { ...fallback, withinLimit: fallback.bytes <= compression.maxBytes };\n};\n\nexport const compressImageBufferToBase64 = async (buffer, compression) => {\n const originalBytes = getBase64BytesFromBuffer(buffer);\n if (!compression.enabled || originalBytes <= compression.maxBytes) {\n return buffer.toString('base64');\n }\n\n const result = await compressImageBuffer(buffer, compression).catch((error) => {\n Logger.warn('captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE', { message: error?.message || String(error) });\n return null;\n });\n\n if (!result?.buffer) return buffer.toString('base64');\n\n if (result.withinLimit) {\n Logger.info('captureScreen \u5DF2\u538B\u7F29', {\n originalBytes,\n outputBytes: result.bytes,\n format: result.format,\n quality: result.quality,\n scale: result.scale,\n size: `${result.width}x${result.height}`,\n });\n } else {\n Logger.warn('captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807', {\n originalBytes,\n outputBytes: result.bytes,\n maxBytes: compression.maxBytes,\n format: result.format,\n quality: result.quality,\n scale: result.scale,\n });\n }\n\n return result.buffer.toString('base64');\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["text", "fs", "options", "bounds", "pressEnter", "point", "text", "bounds", "import_node_child_process", "import_node_util", "execFileAsync", "path", "requireNonEmpty", "fs", "import_node_fs", "selectorLabel", "snapshot", "matchesSelector", "text", "normalizeSelector", "import_node_crypto", "import_jimp", "readClipboard", "text", "fs"]
|
|
7
7
|
}
|