@skrillex1224/playwright-toolkit 2.1.279 → 2.1.280

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/dist/index.cjs CHANGED
@@ -387,18 +387,18 @@ var fallbackLog = {
387
387
  error: (...args) => console.error(...args),
388
388
  debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
389
389
  };
390
- var resolveLogMethod = (logger17, name) => {
391
- if (logger17 && typeof logger17[name] === "function") {
392
- return logger17[name].bind(logger17);
390
+ var resolveLogMethod = (logger16, name) => {
391
+ if (logger16 && typeof logger16[name] === "function") {
392
+ return logger16[name].bind(logger16);
393
393
  }
394
- if (name === "warning" && logger17 && typeof logger17.warn === "function") {
395
- return logger17.warn.bind(logger17);
394
+ if (name === "warning" && logger16 && typeof logger16.warn === "function") {
395
+ return logger16.warn.bind(logger16);
396
396
  }
397
397
  return fallbackLog[name];
398
398
  };
399
399
  var defaultLogger = null;
400
- var setDefaultLogger = (logger17) => {
401
- defaultLogger = logger17;
400
+ var setDefaultLogger = (logger16) => {
401
+ defaultLogger = logger16;
402
402
  };
403
403
  var resolveLogger = (explicitLogger) => {
404
404
  if (explicitLogger && typeof explicitLogger.info === "function") {
@@ -425,8 +425,8 @@ var colorize = (text, color) => {
425
425
  var createBaseLogger = (prefix = "", explicitLogger) => {
426
426
  const name = prefix ? String(prefix) : "";
427
427
  const dispatch = (methodName, icon, message, color) => {
428
- const logger17 = resolveLogger(explicitLogger);
429
- const logFn = resolveLogMethod(logger17, methodName);
428
+ const logger16 = resolveLogger(explicitLogger);
429
+ const logFn = resolveLogMethod(logger16, methodName);
430
430
  const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
431
431
  const line = formatLine(name, icon, message);
432
432
  const coloredLine = colorize(line, color);
@@ -923,7 +923,7 @@ var prepareExpandedFullPageScreenshot = async (page, options = {}) => {
923
923
  viewportResized
924
924
  };
925
925
  };
926
- var restoreExpandedFullPageScreenshot = async (page, state = {}) => {
926
+ var restoreExpandedFullPageScreenshot = async (page, state2 = {}) => {
927
927
  await page.evaluate((className) => {
928
928
  const targets = new Set([
929
929
  ...document.querySelectorAll(`.${className}`),
@@ -947,8 +947,8 @@ var restoreExpandedFullPageScreenshot = async (page, state = {}) => {
947
947
  el.classList.remove(className);
948
948
  });
949
949
  }, EXPANDED_SCROLLABLE_CLASS);
950
- if (state?.originalViewport && state?.viewportResized) {
951
- await page.setViewportSize(state.originalViewport);
950
+ if (state2?.originalViewport && state2?.viewportResized) {
951
+ await page.setViewportSize(state2.originalViewport);
952
952
  }
953
953
  };
954
954
  var capturePageScreenshot = async (page, options = {}) => {
@@ -1005,21 +1005,21 @@ var capturePageScreenshot = async (page, options = {}) => {
1005
1005
  }
1006
1006
  };
1007
1007
  var captureExpandedFullPageScreenshot = async (page, options = {}) => {
1008
- const state = await prepareExpandedFullPageScreenshot(page, options);
1008
+ const state2 = await prepareExpandedFullPageScreenshot(page, options);
1009
1009
  try {
1010
1010
  return await capturePageScreenshot(page, {
1011
1011
  fullPage: true,
1012
1012
  type: options.type || "png",
1013
1013
  quality: options.quality,
1014
1014
  timeout: options.timeout,
1015
- maxClipHeight: state.targetHeight
1015
+ maxClipHeight: state2.targetHeight
1016
1016
  });
1017
1017
  } finally {
1018
1018
  await restoreAffixedElementsForExpandedScreenshot(page).catch((error) => {
1019
1019
  logger.warning(`\u79FB\u52A8\u7AEF\u5438\u9644\u5143\u7D20\u6062\u590D\u5931\u8D25: ${error?.message || error}`);
1020
1020
  });
1021
1021
  if (options.restore) {
1022
- await restoreExpandedFullPageScreenshot(page, state);
1022
+ await restoreExpandedFullPageScreenshot(page, state2);
1023
1023
  }
1024
1024
  }
1025
1025
  };
@@ -1915,8 +1915,8 @@ var normalizeBrowserProfile = (value) => {
1915
1915
  payload: buildBrowserProfilePayload(core, observed)
1916
1916
  };
1917
1917
  };
1918
- var rememberRuntimeState = (state) => {
1919
- rememberedRuntimeState = deepClone(state);
1918
+ var rememberRuntimeState = (state2) => {
1919
+ rememberedRuntimeState = deepClone(state2);
1920
1920
  return rememberedRuntimeState;
1921
1921
  };
1922
1922
  var normalizeRuntimeState = (source = {}, actor = "") => {
@@ -1975,7 +1975,7 @@ var RuntimeEnv = {
1975
1975
  } else {
1976
1976
  delete normalizedRuntime.browser_profile;
1977
1977
  }
1978
- const state = {
1978
+ const state2 = {
1979
1979
  actor: resolvedActor,
1980
1980
  device,
1981
1981
  runtime: normalizedRuntime,
@@ -1989,73 +1989,73 @@ var RuntimeEnv = {
1989
1989
  browserProfileCore: browserProfile.core,
1990
1990
  browserProfileObserved: browserProfile.observed
1991
1991
  };
1992
- rememberRuntimeState(state);
1993
- return state;
1992
+ rememberRuntimeState(state2);
1993
+ return state2;
1994
1994
  },
1995
1995
  // buildEnvPatch 只构造允许回写到后端 env 的字段集合。
1996
1996
  buildEnvPatch(source = {}, actor = "") {
1997
- const state = normalizeRuntimeState(source, actor);
1998
- const browserProfile = buildBrowserProfilePayload(state.browserProfileCore, state.browserProfileObserved);
1997
+ const state2 = normalizeRuntimeState(source, actor);
1998
+ const browserProfile = buildBrowserProfilePayload(state2.browserProfileCore, state2.browserProfileObserved);
1999
1999
  const envPatch = {
2000
- ...Array.isArray(state.cookies) && state.cookies.length > 0 ? { cookies: state.cookies } : {},
2001
- ...Object.keys(state.localStorage || {}).length > 0 ? { local_storage: state.localStorage } : {},
2002
- ...Object.keys(state.sessionStorage || {}).length > 0 ? { session_storage: state.sessionStorage } : {},
2000
+ ...Array.isArray(state2.cookies) && state2.cookies.length > 0 ? { cookies: state2.cookies } : {},
2001
+ ...Object.keys(state2.localStorage || {}).length > 0 ? { local_storage: state2.localStorage } : {},
2002
+ ...Object.keys(state2.sessionStorage || {}).length > 0 ? { session_storage: state2.sessionStorage } : {},
2003
2003
  ...Object.keys(browserProfile).length > 0 ? { browser_profile: browserProfile } : {}
2004
2004
  };
2005
2005
  return Object.keys(envPatch).length > 0 ? envPatch : null;
2006
2006
  },
2007
2007
  // hasLoginState 只判断 runtime 是否存在有效载荷,不再区分具体字段来源。
2008
2008
  hasLoginState(source = {}, actor = "") {
2009
- const state = normalizeRuntimeState(source, actor);
2010
- return isPlainObject(state.runtime) && Object.keys(state.runtime || {}).length > 0;
2009
+ const state2 = normalizeRuntimeState(source, actor);
2010
+ return isPlainObject(state2.runtime) && Object.keys(state2.runtime || {}).length > 0;
2011
2011
  },
2012
2012
  rememberState(source = {}) {
2013
- const state = normalizeRuntimeState(source);
2014
- rememberRuntimeState(state);
2013
+ const state2 = normalizeRuntimeState(source);
2014
+ rememberRuntimeState(state2);
2015
2015
  return RuntimeEnv.peekRememberedState();
2016
2016
  },
2017
2017
  peekRememberedState() {
2018
2018
  return rememberedRuntimeState ? deepClone(rememberedRuntimeState) : null;
2019
2019
  },
2020
2020
  getBrowserProfileCore(source = {}, actor = "") {
2021
- const state = normalizeRuntimeState(source, actor);
2022
- return deepClone(state.browserProfileCore || {});
2021
+ const state2 = normalizeRuntimeState(source, actor);
2022
+ return deepClone(state2.browserProfileCore || {});
2023
2023
  },
2024
2024
  setBrowserProfileCore(source = {}, core = {}, actor = "") {
2025
- const state = normalizeRuntimeState(source, actor);
2025
+ const state2 = normalizeRuntimeState(source, actor);
2026
2026
  const normalizedCore = normalizeBrowserProfileCore({
2027
2027
  ...core,
2028
- device: normalizeKnownDevice(core?.device) || state.device
2028
+ device: normalizeKnownDevice(core?.device) || state2.device
2029
2029
  });
2030
- state.browserProfileCore = normalizedCore;
2031
- state.browserProfile = buildBrowserProfilePayload(normalizedCore, state.browserProfileObserved);
2032
- if (Object.keys(state.browserProfile).length > 0) {
2033
- state.runtime.browser_profile = state.browserProfile;
2030
+ state2.browserProfileCore = normalizedCore;
2031
+ state2.browserProfile = buildBrowserProfilePayload(normalizedCore, state2.browserProfileObserved);
2032
+ if (Object.keys(state2.browserProfile).length > 0) {
2033
+ state2.runtime.browser_profile = state2.browserProfile;
2034
2034
  } else {
2035
- delete state.runtime.browser_profile;
2035
+ delete state2.runtime.browser_profile;
2036
2036
  }
2037
- rememberRuntimeState(state);
2038
- return state;
2037
+ rememberRuntimeState(state2);
2038
+ return state2;
2039
2039
  },
2040
2040
  // applyToPage 只负责把登录态相关字段注入页面:
2041
2041
  // cookies / localStorage / sessionStorage。
2042
2042
  // 指纹、时区、UA、viewport 的回放发生在 launch.js 启动阶段,不在这里做。
2043
2043
  async applyToPage(page, source = {}, options = {}) {
2044
2044
  if (!page) return;
2045
- let state = normalizeRuntimeState(source, options?.actor || "");
2045
+ let state2 = normalizeRuntimeState(source, options?.actor || "");
2046
2046
  if (typeof options?.preapply === "function") {
2047
- state = await options.preapply(state) || state;
2048
- rememberRuntimeState(state);
2047
+ state2 = await options.preapply(state2) || state2;
2048
+ rememberRuntimeState(state2);
2049
2049
  }
2050
2050
  Object.defineProperty(page, PageRuntimeStateKey, {
2051
2051
  configurable: true,
2052
2052
  enumerable: false,
2053
2053
  writable: true,
2054
- value: state
2054
+ value: state2
2055
2055
  });
2056
- const localStorage = state.localStorage || {};
2057
- const sessionStorage = state.sessionStorage || {};
2058
- const cookies = (state.cookies || []).map((cookie) => {
2056
+ const localStorage = state2.localStorage || {};
2057
+ const sessionStorage = state2.sessionStorage || {};
2058
+ const cookies = (state2.cookies || []).map((cookie) => {
2059
2059
  const normalized = { ...cookie };
2060
2060
  if (!normalized.path) {
2061
2061
  normalized.path = "/";
@@ -2093,8 +2093,8 @@ var RuntimeEnv = {
2093
2093
  },
2094
2094
  // captureEnvPatch 在任务结束时采集最新环境快照,用于 pushSuccess / pushFailed 自动回写。
2095
2095
  async captureEnvPatch(page, source = {}, options = {}) {
2096
- const state = normalizeRuntimeState(source, options?.actor || "");
2097
- const baseline = RuntimeEnv.buildEnvPatch(state) || {};
2096
+ const state2 = normalizeRuntimeState(source, options?.actor || "");
2097
+ const baseline = RuntimeEnv.buildEnvPatch(state2) || {};
2098
2098
  if (!page || typeof page.evaluate !== "function" || typeof page.context !== "function") {
2099
2099
  return Object.keys(baseline).length > 0 ? baseline : null;
2100
2100
  }
@@ -2113,7 +2113,7 @@ var RuntimeEnv = {
2113
2113
  cookies
2114
2114
  },
2115
2115
  {
2116
- browserProfileCore: state.browserProfileCore
2116
+ browserProfileCore: state2.browserProfileCore
2117
2117
  }
2118
2118
  );
2119
2119
  return RuntimeEnv.mergeEnvPatches(baseline, capturedPatch);
@@ -2127,11 +2127,11 @@ var RuntimeEnv = {
2127
2127
  var logger3 = createInternalLogger("ApifyKit");
2128
2128
  var resolveRuntimeContext = (input) => {
2129
2129
  const rememberedState = RuntimeEnv.peekRememberedState();
2130
- const state = rememberedState || RuntimeEnv.parseInput(input || {});
2131
- const envPatch = RuntimeEnv.buildEnvPatch(state) || null;
2130
+ const state2 = rememberedState || RuntimeEnv.parseInput(input || {});
2131
+ const envPatch = RuntimeEnv.buildEnvPatch(state2) || null;
2132
2132
  return {
2133
- actor: state.actor,
2134
- runtime: state.runtime,
2133
+ actor: state2.actor,
2134
+ runtime: state2.runtime,
2135
2135
  envPatch
2136
2136
  };
2137
2137
  };
@@ -2490,6 +2490,57 @@ var Utils = {
2490
2490
  }
2491
2491
  };
2492
2492
 
2493
+ // src/internals/context.js
2494
+ var state = {
2495
+ mode: Mode.Default
2496
+ };
2497
+ var normalizeStrategies = (strategies) => strategies && typeof strategies === "object" ? strategies : {};
2498
+ var ToolkitContext = {
2499
+ get mode() {
2500
+ return state.mode;
2501
+ },
2502
+ setMode(mode = Mode.Default) {
2503
+ state.mode = normalizeMode(mode, Mode.Default);
2504
+ return state.mode;
2505
+ }
2506
+ };
2507
+ var getToolkitMode = () => state.mode;
2508
+ var setToolkitMode = (mode = Mode.Default) => ToolkitContext.setMode(mode);
2509
+ var resolveModeStrategy = (strategies = {}, mode = getToolkitMode(), fallbackMode = Mode.Default) => {
2510
+ const normalizedStrategies = normalizeStrategies(strategies);
2511
+ const normalizedMode = normalizeMode(mode, fallbackMode);
2512
+ const delegate = normalizedStrategies[normalizedMode] ?? normalizedStrategies[fallbackMode] ?? Object.values(normalizedStrategies).find(Boolean) ?? null;
2513
+ return {
2514
+ mode: normalizedMode,
2515
+ delegate
2516
+ };
2517
+ };
2518
+
2519
+ // src/internals/delegate.js
2520
+ var normalizeMethodDefinition = (definition) => typeof definition === "string" ? { name: definition, enumerable: true } : {
2521
+ name: String(definition?.name || "").trim(),
2522
+ enumerable: definition?.enumerable !== false
2523
+ };
2524
+ var createMethodDescriptor = (namespace, methodName, enumerable, strategies) => ({
2525
+ enumerable,
2526
+ value: (...args) => {
2527
+ const { mode, delegate } = resolveModeStrategy(strategies);
2528
+ if (typeof delegate?.[methodName] !== "function") {
2529
+ throw new Error(`${namespace}.${methodName} is not available in ${mode} mode`);
2530
+ }
2531
+ return delegate[methodName](...args);
2532
+ }
2533
+ });
2534
+ var createDelegatedFacade = (namespace, strategies = {}, methods = []) => {
2535
+ const descriptors = Object.fromEntries(
2536
+ methods.map(normalizeMethodDefinition).filter((method) => method.name).map((method) => [
2537
+ method.name,
2538
+ createMethodDescriptor(namespace, method.name, method.enumerable, strategies)
2539
+ ])
2540
+ );
2541
+ return Object.defineProperties({}, descriptors);
2542
+ };
2543
+
2493
2544
  // src/internals/anti-cheat/default.js
2494
2545
  var BASE_CONFIG = Object.freeze({
2495
2546
  locale: "zh-CN",
@@ -2563,43 +2614,52 @@ var DefaultAntiCheat = {
2563
2614
  };
2564
2615
 
2565
2616
  // src/internals/anti-cheat/cloakbrowser.js
2566
- var CloakBrowserAntiCheat = DefaultAntiCheat;
2567
-
2568
- // src/internals/toolkit-mode.js
2569
- var currentMode = Mode.Default;
2570
- var getToolkitMode = () => currentMode;
2571
- var setToolkitMode = (mode = Mode.Default) => {
2572
- currentMode = normalizeMode(mode, Mode.Default);
2573
- return currentMode;
2574
- };
2575
-
2576
- // src/anti-cheat.js
2577
- var resolveAntiCheatDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserAntiCheat : DefaultAntiCheat;
2578
- var callAntiCheat = (method, ...args) => {
2579
- const delegate = resolveAntiCheatDelegate();
2580
- if (typeof delegate?.[method] !== "function") {
2581
- throw new Error(`AntiCheat.${method} is not available in ${getToolkitMode()} mode`);
2582
- }
2583
- return delegate[method](...args);
2584
- };
2585
- var AntiCheat = {
2617
+ var CLOAK_BROWSER_BASE_CONFIG = Object.freeze({
2618
+ locale: "",
2619
+ acceptLanguage: "",
2620
+ timezoneId: "",
2621
+ timezoneOffset: null,
2622
+ geolocation: null
2623
+ });
2624
+ var normalizeHeaders = (headers) => headers && typeof headers === "object" ? headers : {};
2625
+ var CloakBrowserAntiCheat = {
2626
+ /**
2627
+ * CloakBrowser 自身会负责浏览器指纹,toolkit 在该模式下尽量不再注入额外反检测配置。
2628
+ */
2586
2629
  getBaseConfig() {
2587
- return callAntiCheat("getBaseConfig");
2630
+ return { ...CLOAK_BROWSER_BASE_CONFIG };
2588
2631
  },
2589
- getFingerprintGeneratorOptions(options = {}) {
2590
- return callAntiCheat("getFingerprintGeneratorOptions", options);
2632
+ getFingerprintGeneratorOptions() {
2633
+ return {};
2591
2634
  },
2592
- getLaunchArgs(options = {}) {
2593
- return callAntiCheat("getLaunchArgs", options);
2635
+ getLaunchArgs() {
2636
+ return [];
2594
2637
  },
2595
- getTlsFingerprintOptions(userAgent = "", acceptLanguage = "", options = {}) {
2596
- return callAntiCheat("getTlsFingerprintOptions", userAgent, acceptLanguage, options);
2638
+ getTlsFingerprintOptions() {
2639
+ return {};
2597
2640
  },
2598
2641
  applyLocaleHeaders(headers, acceptLanguage = "") {
2599
- return callAntiCheat("applyLocaleHeaders", headers, acceptLanguage);
2642
+ const normalizedHeaders = normalizeHeaders(headers);
2643
+ if (acceptLanguage && !normalizedHeaders["accept-language"]) {
2644
+ normalizedHeaders["accept-language"] = acceptLanguage;
2645
+ }
2646
+ return normalizedHeaders;
2600
2647
  }
2601
2648
  };
2602
2649
 
2650
+ // src/anti-cheat.js
2651
+ var antiCheatStrategies = {
2652
+ [Mode.Default]: DefaultAntiCheat,
2653
+ [Mode.CloakBrowser]: CloakBrowserAntiCheat
2654
+ };
2655
+ var AntiCheat = createDelegatedFacade("AntiCheat", antiCheatStrategies, [
2656
+ "getBaseConfig",
2657
+ "getFingerprintGeneratorOptions",
2658
+ "getLaunchArgs",
2659
+ "getTlsFingerprintOptions",
2660
+ "applyLocaleHeaders"
2661
+ ]);
2662
+
2603
2663
  // src/device-input.js
2604
2664
  var resolveDeviceFromPage = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
2605
2665
  var assertPage = (page, method) => {
@@ -2999,12 +3059,12 @@ var resolveDescriptor = (descriptor, device) => {
2999
3059
  }
3000
3060
  return resolved;
3001
3061
  };
3002
- var attachRuntimeState = (page, state) => {
3062
+ var attachRuntimeState = (page, state2) => {
3003
3063
  Object.defineProperty(page, PageRuntimeStateKey, {
3004
3064
  configurable: true,
3005
3065
  enumerable: false,
3006
3066
  writable: true,
3007
- value: state
3067
+ value: state2
3008
3068
  });
3009
3069
  };
3010
3070
  var restoreRuntimeState = (page, snapshot) => {
@@ -4058,7 +4118,7 @@ var restoreWindowFromSnapshot = async (page, before, after) => {
4058
4118
  return;
4059
4119
  }
4060
4120
  await page.evaluate(
4061
- (state) => window.scrollTo(state.x, state.y),
4121
+ (state2) => window.scrollTo(state2.x, state2.y),
4062
4122
  { x: Number(before.scrollX || 0), y: Number(before.scrollY || 0) }
4063
4123
  ).catch(() => {
4064
4124
  });
@@ -4304,7 +4364,7 @@ var MobileHumanize = {
4304
4364
  if (scrollRect && beforeWindowState) {
4305
4365
  const afterWindowState = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4306
4366
  if (Math.abs(afterWindowState.x - beforeWindowState.x) > 2 || Math.abs(afterWindowState.y - beforeWindowState.y) > 2) {
4307
- await page.evaluate((state) => window.scrollTo(state.x, state.y), beforeWindowState);
4367
+ await page.evaluate((state2) => window.scrollTo(state2.x, state2.y), beforeWindowState);
4308
4368
  logger6.debug(`humanScroll | \u7A97\u53E3\u6EDA\u52A8\u56DE\u6536 from=${Math.round(afterWindowState.y)} to=${Math.round(beforeWindowState.y)}`);
4309
4369
  }
4310
4370
  }
@@ -4671,23 +4731,60 @@ var DefaultHumanize = {
4671
4731
 
4672
4732
  // src/internals/humanize/cloakbrowser.js
4673
4733
  var import_delay4 = __toESM(require("delay"), 1);
4674
- var logger7 = createInternalLogger("Humanize.CloakBrowser");
4675
- var humanizedPages = /* @__PURE__ */ new WeakSet();
4676
- var cachedCloakHumanModulePromise = null;
4677
4734
  var isPageLike2 = (value) => value && typeof value === "object" && typeof value.evaluate === "function";
4678
4735
  var isPoint2 = (value) => value && typeof value === "object" && Number.isFinite(Number(value.x)) && Number.isFinite(Number(value.y));
4679
4736
  var resolveDeviceFromPage3 = (page) => normalizeDevice(page?.[PageRuntimeStateKey]?.device);
4680
4737
  var isMobilePage = (page) => resolveDeviceFromPage3(page) === Device.Mobile;
4681
- var loadCloakHumanModule = async () => {
4682
- if (!cachedCloakHumanModulePromise) {
4683
- cachedCloakHumanModulePromise = import("cloakbrowser/human").catch((error) => {
4684
- cachedCloakHumanModulePromise = null;
4685
- throw new Error("cloakbrowser/human \u6A21\u5757\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u5DF2\u5B89\u88C5 cloakbrowser\u3002", {
4686
- cause: error
4738
+ var resolveNativeTarget2 = (page, target) => typeof target === "string" ? page.locator(target).first() : target;
4739
+ var targetExists = async (target) => {
4740
+ if (!target) {
4741
+ return false;
4742
+ }
4743
+ if (typeof target.count === "function") {
4744
+ const count = await target.count().catch(() => 0);
4745
+ return count > 0;
4746
+ }
4747
+ if (typeof target.elementHandle === "function") {
4748
+ const handle = await target.elementHandle().catch(() => null);
4749
+ try {
4750
+ return Boolean(handle);
4751
+ } finally {
4752
+ await handle?.dispose?.().catch(() => {
4687
4753
  });
4688
- });
4754
+ }
4755
+ }
4756
+ return true;
4757
+ };
4758
+ var getTargetBoundingBox2 = async (target) => {
4759
+ if (!target) {
4760
+ return null;
4761
+ }
4762
+ if (typeof target.boundingBox === "function") {
4763
+ return await target.boundingBox().catch(() => null);
4764
+ }
4765
+ if (typeof target.elementHandle === "function") {
4766
+ const handle = await target.elementHandle().catch(() => null);
4767
+ try {
4768
+ return await handle?.boundingBox?.().catch(() => null);
4769
+ } finally {
4770
+ await handle?.dispose?.().catch(() => {
4771
+ });
4772
+ }
4773
+ }
4774
+ return null;
4775
+ };
4776
+ var resolveActionTarget = async (page, target, { throwOnMissing = true } = {}) => {
4777
+ if (target == null) {
4778
+ return null;
4689
4779
  }
4690
- return cachedCloakHumanModulePromise;
4780
+ const resolvedTarget = resolveNativeTarget2(page, target);
4781
+ if (throwOnMissing || await targetExists(resolvedTarget)) {
4782
+ return resolvedTarget;
4783
+ }
4784
+ return null;
4785
+ };
4786
+ var readViewportScroll = async (page) => {
4787
+ return await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY })).catch(() => ({ x: 0, y: 0 }));
4691
4788
  };
4692
4789
  var buildTypingHumanConfig = (options = {}) => {
4693
4790
  const humanConfig = {};
@@ -4707,237 +4804,109 @@ var buildTypingHumanConfig = (options = {}) => {
4707
4804
  return Object.keys(humanConfig).length > 0 ? humanConfig : null;
4708
4805
  };
4709
4806
  var buildActionOptions = (options = {}) => {
4710
- const actionOptions = {};
4807
+ const actionOptions = {
4808
+ force: true
4809
+ };
4711
4810
  if (options && options.timeout != null) {
4712
4811
  actionOptions.timeout = options.timeout;
4713
4812
  }
4714
- actionOptions.force = true;
4715
4813
  const humanConfig = buildTypingHumanConfig(options);
4716
4814
  if (humanConfig) {
4717
4815
  actionOptions.human_config = humanConfig;
4718
4816
  }
4719
4817
  return actionOptions;
4720
4818
  };
4721
- var ensureDesktopHumanized = async (page) => {
4722
- if (!page || typeof page !== "object") {
4723
- throw new Error("Humanize requires a Playwright page");
4724
- }
4725
- const humanModule = await loadCloakHumanModule();
4726
- if (page._original && page._humanCursor) {
4727
- humanizedPages.add(page);
4728
- return humanModule;
4729
- }
4730
- if (humanizedPages.has(page)) {
4731
- return humanModule;
4732
- }
4733
- const config = page._humanCfg || humanModule.resolveConfig?.("default") || humanModule.resolveConfig?.();
4734
- const cursor = page._humanCursor || { x: 0, y: 0, initialized: false };
4735
- humanModule.patchPage(page, config, cursor);
4736
- humanizedPages.add(page);
4737
- return humanModule;
4738
- };
4739
- var patchHandle = async (page, handle) => {
4740
- if (!handle || typeof handle !== "object") return handle;
4741
- const humanModule = await ensureDesktopHumanized(page);
4742
- humanModule.patchSingleElementHandle(
4743
- handle,
4744
- page,
4745
- page._humanCfg,
4746
- page._humanCursor,
4747
- page._humanRaw,
4748
- page._humanRawKb,
4749
- page._humanOriginals,
4750
- page._stealth
4751
- );
4752
- return handle;
4753
- };
4754
- var resolvePatchedTarget = async (page, target, { throwOnMissing = true } = {}) => {
4755
- if (target == null) {
4756
- return { target: null, dispose: null };
4757
- }
4758
- if (typeof target === "string") {
4759
- const handle = await page.$(target);
4760
- if (!handle) {
4761
- if (throwOnMissing) {
4762
- throw new Error(`\u627E\u4E0D\u5230\u5143\u7D20 ${String(target)}`);
4763
- }
4764
- return { target: null, dispose: null };
4765
- }
4766
- return { target: handle, dispose: null };
4767
- }
4768
- if (typeof target.elementHandle === "function") {
4769
- const handle = await target.elementHandle();
4770
- if (!handle) {
4771
- if (throwOnMissing) {
4772
- throw new Error("\u627E\u4E0D\u5230 locator \u5BF9\u5E94\u7684\u5143\u7D20");
4773
- }
4774
- return { target: null, dispose: null };
4775
- }
4776
- await patchHandle(page, handle);
4777
- return {
4778
- target: handle,
4779
- dispose: async () => {
4780
- await handle.dispose().catch(() => {
4781
- });
4782
- }
4783
- };
4784
- }
4785
- await patchHandle(page, target);
4786
- return { target, dispose: null };
4787
- };
4788
4819
  var jitterSleep = async (baseMs, jitterPercent = 0.3) => {
4789
4820
  await (0, import_delay4.default)(jitterMs(baseMs, jitterPercent));
4790
4821
  };
4791
- var humanMoveToPoint = async (page, point) => {
4792
- await ensureDesktopHumanized(page);
4822
+ var moveCursorToPoint = async (page, point) => {
4793
4823
  await page.mouse.move(Number(point.x), Number(point.y));
4794
4824
  return true;
4795
4825
  };
4796
- var doDesktopHumanClick = async (page, target, options = {}) => {
4797
- await ensureDesktopHumanized(page);
4798
- if (target == null) {
4799
- const cursor = page._humanCursor || { x: 0, y: 0 };
4800
- await page.mouse.click(cursor.x || 0, cursor.y || 0);
4801
- return true;
4802
- }
4803
- if (isPoint2(target)) {
4804
- return humanMoveToPoint(page, target).then(async () => {
4805
- await page.mouse.click(Number(target.x), Number(target.y));
4806
- return true;
4807
- });
4808
- }
4809
- const throwOnMissing = options.throwOnMissing !== false;
4810
- if (typeof target === "string") {
4811
- if (!throwOnMissing) {
4812
- const existingHandle = await page.$(target);
4813
- if (!existingHandle) {
4814
- return false;
4815
- }
4816
- await existingHandle.click(buildActionOptions(options));
4817
- return true;
4818
- }
4819
- await page.click(target, buildActionOptions(options));
4820
- return true;
4821
- }
4822
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing });
4823
- try {
4824
- if (!resolvedTarget) {
4825
- return false;
4826
- }
4827
- if (typeof resolvedTarget.click === "function") {
4828
- await resolvedTarget.click(buildActionOptions(options));
4829
- return true;
4830
- }
4831
- const box = await resolvedTarget.boundingBox?.();
4832
- if (!box) {
4833
- if (throwOnMissing) {
4834
- throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4835
- }
4836
- return false;
4837
- }
4838
- await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
4839
- return true;
4840
- } finally {
4841
- if (typeof dispose === "function") {
4842
- await dispose();
4843
- }
4844
- }
4845
- };
4846
4826
  var CloakBrowserHumanize = {
4847
4827
  jitterMs(base, jitterPercent = 0.3) {
4848
4828
  return jitterMs(base, jitterPercent);
4849
4829
  },
4850
4830
  async initializeCursor(page) {
4851
4831
  if (isMobilePage(page)) {
4852
- return MobileHumanize.initializeCursor(page);
4832
+ return await MobileHumanize.initializeCursor(page);
4853
4833
  }
4854
- await ensureDesktopHumanized(page);
4855
- logger7.debug("initializeCursor: cloakbrowser human layer ready");
4834
+ return Boolean(page);
4856
4835
  },
4857
4836
  async humanMove(page, target) {
4858
4837
  if (isMobilePage(page)) {
4859
4838
  return await MobileHumanize.humanMove(page, target);
4860
4839
  }
4861
- await ensureDesktopHumanized(page);
4862
4840
  if (isPoint2(target)) {
4863
- return await humanMoveToPoint(page, target);
4841
+ return await moveCursorToPoint(page, target);
4864
4842
  }
4865
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4866
- try {
4867
- if (!resolvedTarget) {
4868
- return false;
4869
- }
4870
- if (typeof resolvedTarget.hover === "function") {
4871
- await resolvedTarget.hover({ force: true });
4872
- return true;
4873
- }
4874
- const box = await resolvedTarget.boundingBox?.();
4875
- if (!box) {
4876
- return false;
4877
- }
4878
- await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
4843
+ const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
4844
+ if (!resolvedTarget) {
4845
+ return false;
4846
+ }
4847
+ if (typeof resolvedTarget.hover === "function") {
4848
+ await resolvedTarget.hover({ force: true });
4879
4849
  return true;
4880
- } finally {
4881
- if (typeof dispose === "function") {
4882
- await dispose();
4883
- }
4884
4850
  }
4851
+ const box = await getTargetBoundingBox2(resolvedTarget);
4852
+ if (!box) {
4853
+ return false;
4854
+ }
4855
+ return await moveCursorToPoint(page, {
4856
+ x: box.x + box.width / 2,
4857
+ y: box.y + box.height / 2
4858
+ });
4885
4859
  },
4886
4860
  async humanScroll(page, target, options = {}) {
4887
4861
  if (isMobilePage(page)) {
4888
4862
  return await MobileHumanize.humanScroll(page, target, options);
4889
4863
  }
4890
- const humanModule = await ensureDesktopHumanized(page);
4891
- if (typeof target === "string") {
4892
- const { x = 0, y = 0 } = page._humanCursor || {};
4893
- try {
4894
- const result = await humanModule.scrollToElement(
4895
- page,
4896
- page._humanRaw,
4897
- target,
4898
- x,
4899
- y,
4900
- page._humanCfg,
4901
- options.timeout
4902
- );
4903
- if (page._humanCursor) {
4904
- page._humanCursor.x = result.cursorX;
4905
- page._humanCursor.y = result.cursorY;
4906
- }
4907
- return {
4908
- element: await page.$(target),
4909
- didScroll: Boolean(result.didScroll),
4910
- restore: null
4911
- };
4912
- } catch (error) {
4913
- logger7.warn(`humanScroll: cloakbrowser \u6EDA\u52A8\u5931\u8D25\uFF0C\u8DF3\u8FC7 (${error?.message || error})`);
4914
- return { element: null, didScroll: false, restore: null };
4915
- }
4916
- }
4917
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, target, { throwOnMissing: false });
4918
- try {
4919
- if (!resolvedTarget) {
4920
- return { element: null, didScroll: false, restore: null };
4921
- }
4922
- const before = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4923
- await resolvedTarget.scrollIntoViewIfNeeded?.();
4924
- const after = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
4925
- return {
4926
- element: resolvedTarget,
4927
- didScroll: before.x !== after.x || before.y !== after.y,
4928
- restore: null
4929
- };
4930
- } finally {
4931
- if (typeof dispose === "function") {
4932
- await dispose();
4933
- }
4864
+ const resolvedTarget = await resolveActionTarget(page, target, { throwOnMissing: false });
4865
+ if (!resolvedTarget) {
4866
+ return { element: null, didScroll: false, restore: null };
4934
4867
  }
4868
+ const before = await readViewportScroll(page);
4869
+ await resolvedTarget.scrollIntoViewIfNeeded?.().catch(() => {
4870
+ });
4871
+ const after = await readViewportScroll(page);
4872
+ return {
4873
+ element: resolvedTarget,
4874
+ didScroll: before.x !== after.x || before.y !== after.y,
4875
+ restore: null
4876
+ };
4935
4877
  },
4936
4878
  async humanClick(page, target, options = {}) {
4937
4879
  if (isMobilePage(page)) {
4938
4880
  return await MobileHumanize.humanClick(page, target, options);
4939
4881
  }
4940
- return await doDesktopHumanClick(page, target, options);
4882
+ if (target == null) {
4883
+ const { x = 0, y = 0 } = page?._humanCursor || {};
4884
+ await page.mouse.click(x || 0, y || 0);
4885
+ return true;
4886
+ }
4887
+ if (isPoint2(target)) {
4888
+ await page.mouse.click(Number(target.x), Number(target.y));
4889
+ return true;
4890
+ }
4891
+ const resolvedTarget = await resolveActionTarget(page, target, {
4892
+ throwOnMissing: options.throwOnMissing !== false
4893
+ });
4894
+ if (!resolvedTarget) {
4895
+ return false;
4896
+ }
4897
+ if (typeof resolvedTarget.click === "function") {
4898
+ await resolvedTarget.click(buildActionOptions(options));
4899
+ return true;
4900
+ }
4901
+ const box = await getTargetBoundingBox2(resolvedTarget);
4902
+ if (!box) {
4903
+ if (options.throwOnMissing !== false) {
4904
+ throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5143\u7D20\u4F4D\u7F6E");
4905
+ }
4906
+ return false;
4907
+ }
4908
+ await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
4909
+ return true;
4941
4910
  },
4942
4911
  async randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
4943
4912
  if (isPageLike2(pageOrBaseMs)) {
@@ -4953,7 +4922,6 @@ var CloakBrowserHumanize = {
4953
4922
  if (isMobilePage(page)) {
4954
4923
  return await MobileHumanize.simulateGaze(page, baseDurationMs);
4955
4924
  }
4956
- await ensureDesktopHumanized(page);
4957
4925
  const durationMs = jitterMs(baseDurationMs, 0.4);
4958
4926
  const startTime = Date.now();
4959
4927
  const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
@@ -4969,29 +4937,21 @@ var CloakBrowserHumanize = {
4969
4937
  if (isMobilePage(page)) {
4970
4938
  return await MobileHumanize.humanType(page, selector, text, options);
4971
4939
  }
4972
- await ensureDesktopHumanized(page);
4973
4940
  const actionOptions = buildActionOptions(options);
4974
4941
  if (typeof selector === "string") {
4975
4942
  await page.type(selector, text, actionOptions);
4976
4943
  return;
4977
4944
  }
4978
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, selector, { throwOnMissing: true });
4979
- try {
4980
- if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
4981
- throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
4982
- }
4983
- await resolvedTarget.type(text, actionOptions);
4984
- } finally {
4985
- if (typeof dispose === "function") {
4986
- await dispose();
4987
- }
4945
+ const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
4946
+ if (!resolvedTarget || typeof resolvedTarget.type !== "function") {
4947
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 type()");
4988
4948
  }
4949
+ await resolvedTarget.type(text, actionOptions);
4989
4950
  },
4990
4951
  async humanPress(page, targetOrKey, maybeKey, options = {}) {
4991
4952
  if (isMobilePage(page)) {
4992
4953
  return await MobileHumanize.humanPress(page, targetOrKey, maybeKey, options);
4993
4954
  }
4994
- await ensureDesktopHumanized(page);
4995
4955
  const hasTarget = typeof maybeKey === "string";
4996
4956
  const key = hasTarget ? maybeKey : targetOrKey;
4997
4957
  const pressOptions = hasTarget ? options : maybeKey || options;
@@ -5007,49 +4967,57 @@ var CloakBrowserHumanize = {
5007
4967
  await page.press(targetOrKey, key, buildActionOptions(pressOptions));
5008
4968
  return true;
5009
4969
  }
5010
- const { target: resolvedTarget, dispose } = await resolvePatchedTarget(page, targetOrKey, {
4970
+ const resolvedTarget = await resolveActionTarget(page, targetOrKey, {
5011
4971
  throwOnMissing: pressOptions.throwOnMissing !== false
5012
4972
  });
5013
- try {
5014
- if (!resolvedTarget) {
5015
- return false;
5016
- }
5017
- if (typeof resolvedTarget.press === "function") {
5018
- await resolvedTarget.press(key, buildActionOptions(pressOptions));
5019
- return true;
5020
- }
5021
- await doDesktopHumanClick(page, targetOrKey, {
5022
- ...pressOptions,
5023
- reactionDelay: pressOptions.focusDelay ?? 180
5024
- });
5025
- await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
5026
- await page.keyboard.press(key, {
5027
- ...pressOptions.keyboardOptions || {},
5028
- delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
5029
- });
4973
+ if (!resolvedTarget) {
4974
+ return false;
4975
+ }
4976
+ if (typeof resolvedTarget.press === "function") {
4977
+ await resolvedTarget.press(key, buildActionOptions(pressOptions));
5030
4978
  return true;
5031
- } finally {
5032
- if (typeof dispose === "function") {
5033
- await dispose();
5034
- }
5035
4979
  }
4980
+ await this.humanClick(page, targetOrKey, {
4981
+ ...pressOptions,
4982
+ reactionDelay: pressOptions.focusDelay ?? 180
4983
+ });
4984
+ await jitterSleep(pressOptions.reactionDelay ?? 180, 0.45);
4985
+ await page.keyboard.press(key, {
4986
+ ...pressOptions.keyboardOptions || {},
4987
+ delay: jitterMs(pressOptions.holdDelay ?? 45, 0.5)
4988
+ });
4989
+ return true;
5036
4990
  },
5037
4991
  async humanClear(page, selector) {
5038
4992
  if (isMobilePage(page)) {
5039
4993
  return await MobileHumanize.humanClear(page, selector);
5040
4994
  }
5041
- await ensureDesktopHumanized(page);
5042
- if (typeof page.clear === "function") {
5043
- await page.clear(selector, { force: true });
4995
+ if (typeof selector === "string") {
4996
+ if (typeof page.clear === "function") {
4997
+ await page.clear(selector, { force: true });
4998
+ return;
4999
+ }
5000
+ await page.fill(selector, "", { force: true });
5001
+ return;
5002
+ }
5003
+ const resolvedTarget = await resolveActionTarget(page, selector, { throwOnMissing: true });
5004
+ if (!resolvedTarget) {
5005
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
5006
+ }
5007
+ if (typeof resolvedTarget.clear === "function") {
5008
+ await resolvedTarget.clear(buildActionOptions());
5009
+ return;
5010
+ }
5011
+ if (typeof resolvedTarget.fill === "function") {
5012
+ await resolvedTarget.fill("", buildActionOptions());
5044
5013
  return;
5045
5014
  }
5046
- await page.fill(selector, "", { force: true });
5015
+ throw new Error("\u76EE\u6807\u5143\u7D20\u4E0D\u652F\u6301 clear()");
5047
5016
  },
5048
5017
  async warmUpBrowsing(page, baseDuration = 3500) {
5049
5018
  if (isMobilePage(page)) {
5050
5019
  return await MobileHumanize.warmUpBrowsing(page, baseDuration);
5051
5020
  }
5052
- await ensureDesktopHumanized(page);
5053
5021
  const durationMs = jitterMs(baseDuration, 0.4);
5054
5022
  const startTime = Date.now();
5055
5023
  const viewportSize = page.viewportSize() || { width: 1365, height: 900 };
@@ -5075,7 +5043,6 @@ var CloakBrowserHumanize = {
5075
5043
  if (isMobilePage(page)) {
5076
5044
  return await MobileHumanize.naturalScroll(page, direction, distance, baseSteps);
5077
5045
  }
5078
- await ensureDesktopHumanized(page);
5079
5046
  const steps = Math.max(3, baseSteps + Math.floor(Math.random() * 3) - 1);
5080
5047
  const actualDistance = jitterMs(distance, 0.15);
5081
5048
  const sign = direction === "down" ? 1 : -1;
@@ -5090,55 +5057,24 @@ var CloakBrowserHumanize = {
5090
5057
  };
5091
5058
 
5092
5059
  // src/humanize.js
5093
- var resolveHumanizeDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserHumanize : DefaultHumanize;
5094
- var callHumanize = (method, ...args) => {
5095
- const delegate = resolveHumanizeDelegate();
5096
- if (typeof delegate?.[method] !== "function") {
5097
- throw new Error(`Humanize.${method} is not available in ${getToolkitMode()} mode`);
5098
- }
5099
- return delegate[method](...args);
5100
- };
5101
- var Humanize2 = {
5102
- jitterMs(base, jitterPercent = 0.3) {
5103
- return callHumanize("jitterMs", base, jitterPercent);
5104
- },
5105
- initializeCursor(page) {
5106
- return callHumanize("initializeCursor", page);
5107
- },
5108
- humanMove(page, target) {
5109
- return callHumanize("humanMove", page, target);
5110
- },
5111
- humanScroll(page, target, options = {}) {
5112
- return callHumanize("humanScroll", page, target, options);
5113
- },
5114
- humanClick(page, target, options = {}) {
5115
- return callHumanize("humanClick", page, target, options);
5116
- },
5117
- randomSleep(pageOrBaseMs, maybeBaseMs, maybeJitterPercent) {
5118
- return callHumanize("randomSleep", pageOrBaseMs, maybeBaseMs, maybeJitterPercent);
5119
- },
5120
- simulateGaze(page, baseDurationMs = 2500) {
5121
- return callHumanize("simulateGaze", page, baseDurationMs);
5122
- },
5123
- humanType(page, selector, text, options = {}) {
5124
- return callHumanize("humanType", page, selector, text, options);
5125
- },
5126
- humanPress(page, targetOrKey, maybeKey, options = {}) {
5127
- if (typeof maybeKey === "string") {
5128
- return callHumanize("humanPress", page, targetOrKey, maybeKey, options);
5129
- }
5130
- return callHumanize("humanPress", page, targetOrKey, maybeKey || options);
5131
- },
5132
- humanClear(page, selector) {
5133
- return callHumanize("humanClear", page, selector);
5134
- },
5135
- warmUpBrowsing(page, baseDuration = 3500) {
5136
- return callHumanize("warmUpBrowsing", page, baseDuration);
5137
- },
5138
- naturalScroll(page, direction = "down", distance = 300, baseSteps = 5) {
5139
- return callHumanize("naturalScroll", page, direction, distance, baseSteps);
5140
- }
5141
- };
5060
+ var humanizeStrategies = {
5061
+ [Mode.Default]: DefaultHumanize,
5062
+ [Mode.CloakBrowser]: CloakBrowserHumanize
5063
+ };
5064
+ var Humanize2 = createDelegatedFacade("Humanize", humanizeStrategies, [
5065
+ "jitterMs",
5066
+ "initializeCursor",
5067
+ "humanMove",
5068
+ "humanScroll",
5069
+ "humanClick",
5070
+ "randomSleep",
5071
+ "simulateGaze",
5072
+ "humanType",
5073
+ "humanPress",
5074
+ "humanClear",
5075
+ "warmUpBrowsing",
5076
+ "naturalScroll"
5077
+ ]);
5142
5078
 
5143
5079
  // src/internals/launch/default.js
5144
5080
  var import_node_child_process = require("node:child_process");
@@ -5226,7 +5162,7 @@ var ByPass = {
5226
5162
  };
5227
5163
 
5228
5164
  // src/internals/launch/default.js
5229
- var logger8 = createInternalLogger("Launch");
5165
+ var logger7 = createInternalLogger("Launch");
5230
5166
  var REQUEST_HOOK_FLAG = Symbol("playwright-toolkit-request-hook");
5231
5167
  var injectedContexts = /* @__PURE__ */ new WeakSet();
5232
5168
  var browserMajorVersionCache = /* @__PURE__ */ new Map();
@@ -5278,7 +5214,7 @@ var detectBrowserMajorVersion = (launcher) => {
5278
5214
  });
5279
5215
  detectedVersion = parseChromeMajorVersion(rawVersion);
5280
5216
  } catch (error) {
5281
- logger8.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
5217
+ logger7.warn(`\u8BFB\u53D6\u6D4F\u89C8\u5668\u7248\u672C\u5931\u8D25: ${error?.message || error}`);
5282
5218
  }
5283
5219
  browserMajorVersionCache.set(executablePath, detectedVersion);
5284
5220
  return detectedVersion;
@@ -5315,7 +5251,7 @@ var generateFingerprintForCore = ({ locale, browserMajorVersion, device }) => {
5315
5251
  if (requestedBrowserMajorVersion <= 0) {
5316
5252
  throw error;
5317
5253
  }
5318
- logger8.warn(
5254
+ logger7.warn(
5319
5255
  `\u5F53\u524D\u6D4F\u89C8\u5668\u5927\u7248\u672C ${requestedBrowserMajorVersion} \u65E0\u53EF\u7528 strict \u6307\u7EB9\u6837\u672C\uFF0C\u9000\u56DE\u4E0D\u7ED1\u5B9A\u5927\u7248\u672C\u751F\u6210: ${error?.message || error}`
5320
5256
  );
5321
5257
  }
@@ -5360,7 +5296,7 @@ var buildReplayableBrowserProfile = (runtimeState, launcher) => {
5360
5296
  schema_version: DEFAULT_BROWSER_PROFILE_SCHEMA_VERSION
5361
5297
  };
5362
5298
  nextState = RuntimeEnv.setBrowserProfileCore(nextState, browserProfileCore);
5363
- logger8.info(
5299
+ logger7.info(
5364
5300
  `\u5DF2\u751F\u6210\u6D4F\u89C8\u5668\u6307\u7EB9\u771F\u6E90 | env=${String(nextState.envId || "-")} | device=${device} | version=${browserProfileCore.browser_major_version || "-"} | fingerprintVersion=${fingerprintBrowserMajorVersion || "-"} | exactVersion=${generated.exactBrowserMajorVersion ? "true" : "false"} | timezone=${timezoneId}`
5365
5301
  );
5366
5302
  return { runtimeState: nextState, browserProfileCore };
@@ -5489,18 +5425,18 @@ var DefaultLaunch = {
5489
5425
  upstreamLabel = `${parsedProxyUrl.protocol}//${parsedProxyUrl.host}`;
5490
5426
  } catch {
5491
5427
  }
5492
- logger8.info(
5428
+ logger7.info(
5493
5429
  `[\u4EE3\u7406\u5DF2\u542F\u7528] \u672C\u5730=${launchProxy.server} \u4E0A\u6E38=${upstreamLabel || "-"} \u76F4\u8FDE\u57DF\u540D=${(byPassDomains || []).join(",")}`
5494
5430
  );
5495
- logger8.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
5431
+ logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
5496
5432
  } else if (enableByPassLogger && enableProxy && !launchProxy) {
5497
- logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
5498
- logger8.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
5433
+ logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=true \u4F46 proxy_url \u4E3A\u7A7A");
5434
+ logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
5499
5435
  } else if (enableByPassLogger && !enableProxy && proxyUrl) {
5500
- logger8.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
5501
- logger8.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
5436
+ logger7.info("[\u4EE3\u7406\u672A\u542F\u7528] enable_proxy=false \u4E14 proxy_url \u5DF2\u914D\u7F6E");
5437
+ logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
5502
5438
  } else if (enableByPassLogger) {
5503
- logger8.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
5439
+ logger7.info(`[\u6D41\u91CF\u89C2\u6D4B] \u9010\u8BF7\u6C42\u8C03\u8BD5=${Boolean(debugMode) ? "\u5F00\u542F" : "\u5173\u95ED"}\uFF08\u6C47\u603B\u59CB\u7EC8\u5F00\u542F\uFF09`);
5504
5440
  }
5505
5441
  const onPageCreated = (page) => {
5506
5442
  const recommendedGotoOptions = {
@@ -5522,7 +5458,7 @@ var DefaultLaunch = {
5522
5458
  }
5523
5459
  if (!enableByPassLogger || byPassDomains.length === 0) return;
5524
5460
  if (!matched || !matched.rule) return;
5525
- logger8.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${resourceType} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);
5461
+ logger7.info(`[\u76F4\u8FDE\u547D\u4E2D] \u89C4\u5219=${matched.rule.pattern} \u57DF\u540D=${matched.hostname} \u8D44\u6E90\u7C7B\u578B=${resourceType} \u65B9\u6CD5=${req.method()} \u5730\u5740=${requestUrl}`);
5526
5462
  };
5527
5463
  page.on("request", requestHandler);
5528
5464
  return recommendedGotoOptions;
@@ -5579,7 +5515,7 @@ var DefaultLaunch = {
5579
5515
  // src/internals/launch/cloakbrowser.js
5580
5516
  var import_node_child_process2 = require("node:child_process");
5581
5517
  var import_node_util = require("node:util");
5582
- var logger9 = createInternalLogger("CloakBrowser");
5518
+ var logger8 = createInternalLogger("CloakBrowser");
5583
5519
  var execFileAsync = (0, import_node_util.promisify)(import_node_child_process2.execFile);
5584
5520
  var DEFAULT_CLOAK_CRAWLER_BASE_OPTIONS = Object.freeze({
5585
5521
  maxConcurrency: 1,
@@ -5715,7 +5651,7 @@ var forceTerminateBrowsersByFingerprintArg = async (fingerprintArg) => {
5715
5651
  if (error?.code === 1 || error?.code === "ENOENT") {
5716
5652
  return;
5717
5653
  }
5718
- logger9.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
5654
+ logger8.info(`\u5F3A\u5236\u5173\u95ED CloakBrowser \u8FDB\u7A0B\u5931\u8D25\uFF08\u5FFD\u7565\uFF09: ${error?.message || String(error)}`);
5719
5655
  });
5720
5656
  };
5721
5657
  var CloakBrowserLaunch = {
@@ -5729,8 +5665,21 @@ var CloakBrowserLaunch = {
5729
5665
  return createStableGotoHook(recommendedGotoOptions);
5730
5666
  },
5731
5667
  async getPlaywrightCrawlerOptions(options = {}) {
5732
- const { crawlerOptions } = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
5733
- return crawlerOptions;
5668
+ const runtime2 = await CloakBrowserLaunch.createPlaywrightCrawlerRuntime(options);
5669
+ return Object.defineProperties(runtime2.crawlerOptions, {
5670
+ cleanup: {
5671
+ enumerable: false,
5672
+ value: runtime2.cleanup
5673
+ },
5674
+ closeActiveBrowsers: {
5675
+ enumerable: false,
5676
+ value: runtime2.closeActiveBrowsers
5677
+ },
5678
+ forceTerminateActiveProcesses: {
5679
+ enumerable: false,
5680
+ value: runtime2.forceTerminateActiveProcesses
5681
+ }
5682
+ });
5734
5683
  },
5735
5684
  async buildLaunchOptions(options = {}) {
5736
5685
  return await buildCloakLaunchOptions(options);
@@ -5811,39 +5760,18 @@ var CloakBrowserLaunch = {
5811
5760
  };
5812
5761
 
5813
5762
  // src/launch.js
5814
- var resolveLaunchDelegate = () => getToolkitMode() === Mode.CloakBrowser ? CloakBrowserLaunch : DefaultLaunch;
5815
- var callLaunch = (method, ...args) => {
5816
- const delegate = resolveLaunchDelegate();
5817
- if (typeof delegate?.[method] !== "function") {
5818
- throw new Error(`Launch.${method} is not available in ${getToolkitMode()} mode`);
5819
- }
5820
- return delegate[method](...args);
5821
- };
5822
- var Launch = {
5823
- getPlaywrightCrawlerOptions(options = {}) {
5824
- return callLaunch("getPlaywrightCrawlerOptions", options);
5825
- },
5826
- resolveProxyConfiguration(proxyConfiguration = {}) {
5827
- return callLaunch("resolveProxyConfiguration", proxyConfiguration);
5828
- },
5829
- extractFingerprintArg(launchOptions = {}) {
5830
- return callLaunch("extractFingerprintArg", launchOptions);
5831
- },
5832
- createStableGotoHook(recommendedGotoOptions = {}) {
5833
- return callLaunch("createStableGotoHook", recommendedGotoOptions);
5834
- },
5835
- buildLaunchOptions(options = {}) {
5836
- return callLaunch("buildLaunchOptions", options);
5837
- },
5838
- createPlaywrightCrawlerRuntime(options = {}) {
5839
- return callLaunch("createPlaywrightCrawlerRuntime", options);
5840
- }
5763
+ var launchStrategies = {
5764
+ [Mode.Default]: DefaultLaunch,
5765
+ [Mode.CloakBrowser]: CloakBrowserLaunch
5841
5766
  };
5767
+ var Launch = createDelegatedFacade("Launch", launchStrategies, [
5768
+ "getPlaywrightCrawlerOptions"
5769
+ ]);
5842
5770
 
5843
5771
  // src/live-view.js
5844
5772
  var import_express = __toESM(require("express"), 1);
5845
5773
  var import_apify = require("apify");
5846
- var logger10 = createInternalLogger("LiveView");
5774
+ var logger9 = createInternalLogger("LiveView");
5847
5775
  async function startLiveViewServer(liveViewKey) {
5848
5776
  const app = (0, import_express.default)();
5849
5777
  app.get("/", async (req, res) => {
@@ -5868,13 +5796,13 @@ async function startLiveViewServer(liveViewKey) {
5868
5796
  </html>
5869
5797
  `);
5870
5798
  } catch (error) {
5871
- logger10.fail("Live View Server", error);
5799
+ logger9.fail("Live View Server", error);
5872
5800
  res.status(500).send(`\u65E0\u6CD5\u52A0\u8F7D\u5C4F\u5E55\u622A\u56FE: ${error.message}`);
5873
5801
  }
5874
5802
  });
5875
5803
  const port = process.env.APIFY_CONTAINER_PORT || 4321;
5876
5804
  app.listen(port, () => {
5877
- logger10.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
5805
+ logger9.success("startLiveViewServer", `\u76D1\u542C\u7AEF\u53E3 ${port}`);
5878
5806
  });
5879
5807
  }
5880
5808
  async function takeLiveScreenshot(liveViewKey, page, logMessage) {
@@ -5882,10 +5810,10 @@ async function takeLiveScreenshot(liveViewKey, page, logMessage) {
5882
5810
  const buffer = await capturePageScreenshot(page, { type: "png" });
5883
5811
  await import_apify.Actor.setValue(liveViewKey, buffer, { contentType: "image/png" });
5884
5812
  if (logMessage) {
5885
- logger10.info(`(\u622A\u56FE): ${logMessage}`);
5813
+ logger9.info(`(\u622A\u56FE): ${logMessage}`);
5886
5814
  }
5887
5815
  } catch (e) {
5888
- logger10.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
5816
+ logger9.warn(`\u65E0\u6CD5\u6355\u83B7 Live View \u5C4F\u5E55\u622A\u56FE: ${e.message}`);
5889
5817
  }
5890
5818
  }
5891
5819
  var useLiveView = (liveViewKey = PresetOfLiveViewKey) => {
@@ -5994,7 +5922,7 @@ var dragCaptchaAction = async (page, sourceLocator, targetLocator, options = {})
5994
5922
  };
5995
5923
 
5996
5924
  // src/internals/captcha/bytedance.js
5997
- var logger11 = createInternalLogger("Captcha");
5925
+ var logger10 = createInternalLogger("Captcha");
5998
5926
  var DEFAULT_BYTEDANCE_CAPTCHA_OPTIONS = Object.freeze({
5999
5927
  apiType: "31234",
6000
5928
  maxRetries: 3,
@@ -6126,7 +6054,7 @@ var collectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase,
6126
6054
  }
6127
6055
  await (0, import_promises.writeFile)(infoPath, JSON.stringify(payload, null, 2), "utf8");
6128
6056
  }
6129
- logger11.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
6057
+ logger10.info(`\u5DF2\u5199\u51FA\u9A8C\u8BC1\u7801\u8C03\u8BD5\u4EA7\u7269\uFF1A${debugDir}`);
6130
6058
  };
6131
6059
  var maybeCollectCaptchaDebugInfo = async (page, frame, iframeLocator, attempt, phase, options, extra = null) => {
6132
6060
  if (!options.debugArtifacts) {
@@ -6163,14 +6091,14 @@ var getVerifycenterCaptchaContext = async (page, options) => {
6163
6091
  if (!isContainerVisible) {
6164
6092
  return null;
6165
6093
  }
6166
- logger11.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
6094
+ logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u5BB9\u5668\uFF0C\u5F00\u59CB\u7B49\u5F85 iframe \u52A0\u8F7D\u3002");
6167
6095
  let iframeLocator = page.locator(options.iframeSelector).first();
6168
6096
  let isIframeVisible = await waitForVisible(
6169
6097
  iframeLocator,
6170
6098
  options.iframeVisibleTimeoutMs
6171
6099
  );
6172
6100
  if (!isIframeVisible) {
6173
- logger11.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
6101
+ logger10.warn("\u672A\u5728\u9884\u671F\u9009\u62E9\u5668\u4E2D\u627E\u5230 verifycenter iframe\uFF0C\u5C1D\u8BD5\u5BB9\u5668\u5185\u4EFB\u610F iframe\u3002");
6174
6102
  iframeLocator = captchaContainer.locator(options.iframeFallbackSelector).first();
6175
6103
  isIframeVisible = await waitForVisible(
6176
6104
  iframeLocator,
@@ -6180,7 +6108,7 @@ var getVerifycenterCaptchaContext = async (page, options) => {
6180
6108
  if (!isIframeVisible) {
6181
6109
  throw new Error("verifycenter iframe not found inside captcha container.");
6182
6110
  }
6183
- logger11.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
6111
+ logger10.info("\u9A8C\u8BC1\u7801 iframe \u5DF2\u53EF\u89C1\uFF0C\u5F00\u59CB\u89E3\u6790\u5185\u5BB9 frame\u3002");
6184
6112
  const frame = await resolveContentFrame(page, iframeLocator, options);
6185
6113
  if (!frame) {
6186
6114
  throw new Error("Failed to resolve verifycenter iframe content frame.");
@@ -6296,11 +6224,11 @@ var refreshCaptcha = async (page, frame, options) => {
6296
6224
  const clicked = await clickCaptchaAction(frame, options.refreshTexts, {
6297
6225
  ...options,
6298
6226
  page,
6299
- logger: logger11,
6227
+ logger: logger10,
6300
6228
  forceMouse: true
6301
6229
  }).catch(() => false);
6302
6230
  if (!clicked) {
6303
- logger11.warn("Refresh button not found.");
6231
+ logger10.warn("Refresh button not found.");
6304
6232
  return false;
6305
6233
  }
6306
6234
  await page.waitForTimeout(options.refreshWaitMs);
@@ -6331,24 +6259,24 @@ var waitForCaptchaChallengeReady = async (page, frame, options) => {
6331
6259
  const hasGuideMaskVisible = options.guideMaskSelector ? await frame.locator(options.guideMaskSelector).first().isVisible({ timeout: options.loadingIndicatorVisibleTimeoutMs }).catch(() => false) : false;
6332
6260
  hasSeenGuideMask = hasSeenGuideMask || hasGuideMaskVisible;
6333
6261
  if (hasGuideMaskVisible && !hasLoggedGuideMask) {
6334
- logger11.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u64CD\u4F5C\u5F15\u5BFC\u5C42\uFF0C\u7B49\u5F85\u5176\u6D88\u5931\u540E\u518D\u5F00\u59CB\u8BC6\u522B\u3002");
6262
+ logger10.info("\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\u64CD\u4F5C\u5F15\u5BFC\u5C42\uFF0C\u7B49\u5F85\u5176\u6D88\u5931\u540E\u518D\u5F00\u59CB\u8BC6\u522B\u3002");
6335
6263
  hasLoggedGuideMask = true;
6336
6264
  }
6337
6265
  if (!isLoadingVisible && hasVisibleSourceImage && hasVisibleDropTarget && !hasGuideMaskVisible) {
6338
- logger11.info(
6266
+ logger10.info(
6339
6267
  hasSeenGuideMask ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u548C\u62D6\u62FD\u533A\u57DF\u5DF2\u5C31\u7EEA\uFF0C\u5F15\u5BFC\u5C42\u5DF2\u6D88\u5931\u3002" : hasSeenLoading ? "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002" : "\u9A8C\u8BC1\u7801\u56FE\u7247\u5DF2\u5C31\u7EEA\u3002"
6340
6268
  );
6341
6269
  return;
6342
6270
  }
6343
6271
  if (hasErrorTextVisible) {
6344
- logger11.warn("\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002");
6272
+ logger10.warn("\u9A8C\u8BC1\u7801\u9762\u677F\u51FA\u73B0\u7F51\u7EDC\u5F02\u5E38\u6587\u6848\uFF0C\u5C1D\u8BD5\u7ACB\u5373\u5237\u65B0\u9898\u76EE\u3002");
6345
6273
  await refreshCaptcha(page, frame, options);
6346
6274
  refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
6347
6275
  hasSeenLoading = false;
6348
6276
  continue;
6349
6277
  }
6350
6278
  if ((!hasVisibleSourceImage || !hasVisibleDropTarget) && Date.now() >= refreshDeadline) {
6351
- logger11.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);
6279
+ logger10.warn(`\u9A8C\u8BC1\u7801\u9898\u76EE\u8D85\u8FC7 ${options.challengeReadyRefreshTimeoutMs}ms \u4ECD\u672A\u51C6\u5907\u597D\uFF0C\u5C1D\u8BD5\u5237\u65B0\u9898\u76EE\u3002`);
6352
6280
  await refreshCaptcha(page, frame, options);
6353
6281
  refreshDeadline = Date.now() + options.challengeReadyRefreshTimeoutMs;
6354
6282
  hasSeenLoading = false;
@@ -6396,7 +6324,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
6396
6324
  accepted
6397
6325
  };
6398
6326
  dragAttempts.push(attemptInfo);
6399
- logger11.info(
6327
+ logger10.info(
6400
6328
  `\u9A8C\u8BC1\u7801\u62D6\u62FD\u7B2C ${visualIndex + 1} \u5F20\uFF0C\u65B9\u6848 ${plan.name}\uFF0Cbadge ${baselineState.badgeCount} -> ${afterState.badgeCount}\uFF0Cselected ${baselineState.selectedCount} -> ${afterState.selectedCount}`
6401
6329
  );
6402
6330
  if (accepted) {
@@ -6414,7 +6342,7 @@ var dragPromptCaptchaImage = async (page, frame, iframeLocator, sourceLocator, d
6414
6342
  dragAttempts,
6415
6343
  finalState: await readPromptCaptchaState(frame, options)
6416
6344
  }).catch((error) => {
6417
- logger11.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6345
+ logger10.warn(`\u9A8C\u8BC1\u7801\u62D6\u62FD\u5931\u8D25\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6418
6346
  });
6419
6347
  return {
6420
6348
  accepted: false,
@@ -6431,16 +6359,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6431
6359
  ...options
6432
6360
  };
6433
6361
  if (!config.token) {
6434
- logger11.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
6362
+ logger10.warn("\u7F3A\u5C11\u9A8C\u8BC1\u7801 token\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u8BC6\u522B\u3002");
6435
6363
  return false;
6436
6364
  }
6437
- logger11.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
6365
+ logger10.info("\u5F53\u524D\u4F7F\u7528\u672Ctool\u2014\u2014\u6D4B\u8BD5\u7248\u672C");
6438
6366
  for (let attempt = 1; attempt <= config.maxRetries; attempt += 1) {
6439
- logger11.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
6367
+ logger10.info(`\u5F00\u59CB\u7B2C ${attempt}/${config.maxRetries} \u6B21 verifycenter \u9A8C\u8BC1\u7801\u8BC6\u522B\u3002`);
6440
6368
  try {
6441
6369
  const captchaContext = await getVerifycenterCaptchaContext(page, config);
6442
6370
  if (!captchaContext) {
6443
- logger11.info("Captcha container is not visible anymore.");
6371
+ logger10.info("Captcha container is not visible anymore.");
6444
6372
  return true;
6445
6373
  }
6446
6374
  const { iframeLocator, frame } = captchaContext;
@@ -6453,7 +6381,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6453
6381
  "ready",
6454
6382
  config
6455
6383
  ).catch((error) => {
6456
- logger11.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6384
+ logger10.warn(`\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6457
6385
  });
6458
6386
  await page.waitForTimeout(config.recognitionDelayMs);
6459
6387
  const screenshotBuffer = await iframeLocator.screenshot();
@@ -6465,16 +6393,16 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6465
6393
  });
6466
6394
  const serialNumbers = extractCaptchaSerialNumbers(apiResponse);
6467
6395
  if (apiResponse?.code !== config.recognitionSuccessCode || serialNumbers.length === 0) {
6468
- logger11.warn(
6396
+ logger10.warn(
6469
6397
  `\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\u3002code=${apiResponse?.code}, msg=${apiResponse?.msg || "unknown"}`
6470
6398
  );
6471
6399
  await refreshCaptcha(page, frame, config);
6472
6400
  continue;
6473
6401
  }
6474
- logger11.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
6402
+ logger10.info(`\u9A8C\u8BC1\u7801\u8BC6\u522B\u6210\u529F\uFF0C\u5E8F\u53F7\uFF1A${serialNumbers.join(", ")}`);
6475
6403
  const dropTarget = await findCaptchaDropTarget(frame, config);
6476
6404
  if (!dropTarget) {
6477
- logger11.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
6405
+ logger10.warn("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u62D6\u62FD\u76EE\u6807\u533A\u57DF\u3002");
6478
6406
  await refreshCaptcha(page, frame, config);
6479
6407
  continue;
6480
6408
  }
@@ -6485,7 +6413,7 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6485
6413
  `Captcha image indexes could not be normalized. raw=${serialNumbers.join(", ")}, count=${orderedSourceImages.length}`
6486
6414
  );
6487
6415
  }
6488
- logger11.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
6416
+ logger10.info(`\u9A8C\u8BC1\u7801\u89C6\u89C9\u4F4D\u5E8F\u6620\u5C04\uFF1A${normalizedIndexes.map((index) => index + 1).join(", ")}`);
6489
6417
  for (const imageIndex of normalizedIndexes) {
6490
6418
  if (imageIndex < 0 || imageIndex >= orderedSourceImages.length) {
6491
6419
  throw new Error(
@@ -6517,52 +6445,52 @@ async function solveCaptcha(page, options = {}, dependencies = {}) {
6517
6445
  }
6518
6446
  }
6519
6447
  const beforeSubmitState = await readPromptCaptchaState(frame, config);
6520
- logger11.info(
6448
+ logger10.info(
6521
6449
  `\u63D0\u4EA4\u524D\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${beforeSubmitState.badgeCount}, selected=${beforeSubmitState.selectedCount}, submitDisabled=${beforeSubmitState.submitDisabled}`
6522
6450
  );
6523
6451
  const submitted = await clickCaptchaAction(frame, config.submitTexts, {
6524
6452
  ...config,
6525
6453
  page,
6526
- logger: logger11,
6454
+ logger: logger10,
6527
6455
  forceMouse: true,
6528
6456
  actionVisibleTimeoutMs: config.submitReadyTimeoutMs
6529
6457
  }).catch(() => false);
6530
6458
  if (!submitted) {
6531
- logger11.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
6459
+ logger10.warn("\u672A\u627E\u5230\u63D0\u4EA4\u6309\u94AE\uFF0C\u53EF\u80FD\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002");
6532
6460
  }
6533
6461
  await page.waitForTimeout(config.submitWaitMs);
6534
6462
  const afterSubmitState = await readPromptCaptchaState(frame, config);
6535
- logger11.info(
6463
+ logger10.info(
6536
6464
  `\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u72B6\u6001\uFF1Abadge=${afterSubmitState.badgeCount}, selected=${afterSubmitState.selectedCount}, submitDisabled=${afterSubmitState.submitDisabled}`
6537
6465
  );
6538
6466
  const stillVisible = await iframeLocator.isVisible({ timeout: config.containerVisibleTimeoutMs }).catch(() => false);
6539
6467
  if (!stillVisible) {
6540
- logger11.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
6468
+ logger10.info("\u9A8C\u8BC1\u7801\u8BC6\u522B\u5E76\u63D0\u4EA4\u6210\u529F\u3002");
6541
6469
  return true;
6542
6470
  }
6543
6471
  await maybeCollectCaptchaDebugInfo(page, frame, iframeLocator, attempt, "submit-still-visible", config, {
6544
6472
  beforeSubmitState,
6545
6473
  afterSubmitState
6546
6474
  }).catch((error) => {
6547
- logger11.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6475
+ logger10.warn(`\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801\u8C03\u8BD5\u6293\u53D6\u5931\u8D25\uFF1A${error?.message || error}`);
6548
6476
  });
6549
- logger11.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
6477
+ logger10.warn("\u63D0\u4EA4\u540E\u9A8C\u8BC1\u7801 iframe \u4ECD\u7136\u53EF\u89C1\uFF0C\u51C6\u5907\u5237\u65B0\u540E\u91CD\u8BD5\u3002");
6550
6478
  await page.waitForTimeout(2e3);
6551
6479
  await refreshCaptcha(page, frame, config);
6552
6480
  } catch (error) {
6553
- logger11.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
6481
+ logger10.error(`\u7B2C ${attempt}/${config.maxRetries} \u6B21\u9A8C\u8BC1\u7801\u8BC6\u522B\u5931\u8D25\uFF1A${error?.message || error}`);
6554
6482
  }
6555
6483
  if (attempt < config.maxRetries) {
6556
6484
  await page.waitForTimeout(config.retryDelayBaseMs + attempt * config.retryDelayStepMs);
6557
6485
  }
6558
6486
  }
6559
- logger11.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
6487
+ logger10.error(`\u91CD\u8BD5 ${config.maxRetries} \u6B21\u540E\uFF0C\u9A8C\u8BC1\u7801\u4ECD\u672A\u8BC6\u522B\u6210\u529F\u3002`);
6560
6488
  return false;
6561
6489
  }
6562
6490
  var sloveCaptcha = solveCaptcha;
6563
6491
 
6564
6492
  // src/chaptcha.js
6565
- var logger12 = createInternalLogger("Captcha");
6493
+ var logger11 = createInternalLogger("Captcha");
6566
6494
  var DEFAULT_CAPTCHA_RECOGNITION_OPTIONS = Object.freeze({
6567
6495
  token: "eKJvBfwfN0YRav0-VD_44E2VBSfm7l0YtddUQ7cFySI",
6568
6496
  apiUrl: "https://api.jfbym.com/api/YmServer/customApi"
@@ -6649,7 +6577,7 @@ function useCaptchaMonitor(page, options) {
6649
6577
  };
6650
6578
  })();
6651
6579
  }, { selector: domSelector, callbackName: exposedFunctionName, cleanerName });
6652
- logger12.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
6580
+ logger11.success("useCaptchaMonitor", `DOM \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${domSelector}`);
6653
6581
  cleanupFns.push(async () => {
6654
6582
  try {
6655
6583
  await page.evaluate((name) => {
@@ -6673,14 +6601,14 @@ function useCaptchaMonitor(page, options) {
6673
6601
  }
6674
6602
  };
6675
6603
  page.on("framenavigated", frameHandler);
6676
- logger12.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
6604
+ logger11.success("useCaptchaMonitor", `URL \u76D1\u63A7\u5DF2\u542F\u7528\uFF1A${urlPattern}`);
6677
6605
  cleanupFns.push(async () => {
6678
6606
  page.off("framenavigated", frameHandler);
6679
6607
  });
6680
6608
  }
6681
6609
  return {
6682
6610
  stop: async () => {
6683
- logger12.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
6611
+ logger11.info("\u6B63\u5728\u505C\u6B62\u9A8C\u8BC1\u7801\u76D1\u63A7...");
6684
6612
  for (const fn of cleanupFns) {
6685
6613
  await fn();
6686
6614
  }
@@ -6719,7 +6647,7 @@ async function solveCaptchaWithStrategy(strategyName, page, options = {}) {
6719
6647
  );
6720
6648
  return strategy.sloveCaptcha(page, resolvedOptions, {
6721
6649
  callCaptchaRecognitionApi,
6722
- logger: logger12
6650
+ logger: logger11
6723
6651
  });
6724
6652
  }
6725
6653
  var Captcha = {
@@ -6730,7 +6658,7 @@ var Captcha = {
6730
6658
  // src/mutation.js
6731
6659
  var import_node_crypto = require("node:crypto");
6732
6660
  var import_uuid2 = require("uuid");
6733
- var logger13 = createInternalLogger("Mutation");
6661
+ var logger12 = createInternalLogger("Mutation");
6734
6662
  var MUTATION_MONITOR_MODE = Object.freeze({
6735
6663
  Added: "added",
6736
6664
  Changed: "changed",
@@ -6763,14 +6691,14 @@ var Mutation = {
6763
6691
  const stableTime = options.stableTime ?? 5 * 1e3;
6764
6692
  const timeout = options.timeout ?? 120 * 1e3;
6765
6693
  const onMutation = options.onMutation;
6766
- logger13.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
6694
+ logger12.start("waitForStable", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, \u7A33\u5B9A\u65F6\u95F4=${stableTime}ms`);
6767
6695
  if (initialTimeout > 0) {
6768
6696
  const selectorQuery = selectorList.join(",");
6769
6697
  try {
6770
6698
  await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
6771
- logger13.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6699
+ logger12.info(`waitForStable \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
6772
6700
  } catch (e) {
6773
- logger13.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
6701
+ logger12.warning(`waitForStable \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
6774
6702
  throw e;
6775
6703
  }
6776
6704
  }
@@ -6786,7 +6714,7 @@ var Mutation = {
6786
6714
  return "__CONTINUE__";
6787
6715
  }
6788
6716
  });
6789
- logger13.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
6717
+ logger12.info("waitForStable \u5DF2\u542F\u7528 onMutation \u56DE\u8C03");
6790
6718
  } catch (e) {
6791
6719
  }
6792
6720
  }
@@ -6901,9 +6829,9 @@ var Mutation = {
6901
6829
  { selectorList, stableTime, timeout, callbackName, hasCallback: !!onMutation }
6902
6830
  );
6903
6831
  if (result.mutationCount === 0 && result.stableTime === 0) {
6904
- logger13.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
6832
+ logger12.warning("waitForStable \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
6905
6833
  }
6906
- logger13.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
6834
+ logger12.success("waitForStable", `DOM \u7A33\u5B9A, \u603B\u5171 ${result.mutationCount} \u6B21\u53D8\u5316${result.wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
6907
6835
  return result;
6908
6836
  },
6909
6837
  /**
@@ -7075,29 +7003,29 @@ var Mutation = {
7075
7003
  return "__CONTINUE__";
7076
7004
  }
7077
7005
  };
7078
- logger13.start(
7006
+ logger12.start(
7079
7007
  "waitForStableAcrossRoots",
7080
7008
  `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668(\u8DE8 root), \u7A33\u5B9A\u65F6\u95F4=${waitForStableTime}ms`
7081
7009
  );
7082
7010
  if (initialTimeout > 0) {
7083
7011
  try {
7084
7012
  await page.waitForSelector(selectorQuery, { timeout: initialTimeout });
7085
- logger13.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
7013
+ logger12.info(`waitForStableAcrossRoots \u5DF2\u68C0\u6D4B\u5230\u5143\u7D20: ${selectorQuery}`);
7086
7014
  } catch (e) {
7087
- logger13.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
7015
+ logger12.warning(`waitForStableAcrossRoots \u521D\u59CB\u7B49\u5F85\u8D85\u65F6 (${initialTimeout}ms): ${selectorQuery}`);
7088
7016
  throw e;
7089
7017
  }
7090
7018
  }
7091
- let state = await buildState();
7092
- if (!state?.hasMatched) {
7093
- logger13.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
7019
+ let state2 = await buildState();
7020
+ if (!state2?.hasMatched) {
7021
+ logger12.warning("waitForStableAcrossRoots \u672A\u627E\u5230\u53EF\u76D1\u63A7\u7684\u5143\u7D20");
7094
7022
  return { mutationCount: 0, stableTime: 0, wasPaused: false };
7095
7023
  }
7096
7024
  let mutationCount = 0;
7097
7025
  let stableSince = 0;
7098
7026
  let isPaused = false;
7099
7027
  let wasPaused = false;
7100
- let lastSnapshotKey = state.snapshotKey;
7028
+ let lastSnapshotKey = state2.snapshotKey;
7101
7029
  const applyPauseSignal = (signal) => {
7102
7030
  const nextPaused = signal === "__PAUSE__";
7103
7031
  if (nextPaused) {
@@ -7111,13 +7039,13 @@ var Mutation = {
7111
7039
  };
7112
7040
  const initialSignal = await invokeMutationCallback({
7113
7041
  mutationCount: 0,
7114
- html: state.html || "",
7115
- text: state.text || "",
7116
- mutationNodes: state.mutationNodes || []
7042
+ html: state2.html || "",
7043
+ text: state2.text || "",
7044
+ mutationNodes: state2.mutationNodes || []
7117
7045
  });
7118
7046
  applyPauseSignal(initialSignal);
7119
7047
  const deadline = Date.now() + overallTimeout;
7120
- let lastState = state;
7048
+ let lastState = state2;
7121
7049
  while (Date.now() < deadline) {
7122
7050
  await sleep(pollInterval);
7123
7051
  lastState = await buildState();
@@ -7127,7 +7055,7 @@ var Mutation = {
7127
7055
  if (lastState.snapshotKey !== lastSnapshotKey) {
7128
7056
  lastSnapshotKey = lastState.snapshotKey;
7129
7057
  mutationCount += 1;
7130
- logger13.info(
7058
+ logger12.info(
7131
7059
  `waitForStableAcrossRoots \u53D8\u5316#${mutationCount}, len=${lastState.snapshotLength}, path=${lastState.primaryPath || "unknown"}, preview="${truncate(lastState.text, 120)}"`
7132
7060
  );
7133
7061
  const signal = await invokeMutationCallback({
@@ -7140,7 +7068,7 @@ var Mutation = {
7140
7068
  continue;
7141
7069
  }
7142
7070
  if (!isPaused && stableSince > 0 && Date.now() - stableSince >= waitForStableTime) {
7143
- logger13.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
7071
+ logger12.success("waitForStableAcrossRoots", `DOM \u7A33\u5B9A, \u603B\u5171 ${mutationCount} \u6B21\u53D8\u5316${wasPaused ? ", \u66FE\u6682\u505C\u8BA1\u65F6" : ""}`);
7144
7072
  return {
7145
7073
  mutationCount,
7146
7074
  stableTime: waitForStableTime,
@@ -7167,7 +7095,7 @@ var Mutation = {
7167
7095
  const onMutation = options.onMutation;
7168
7096
  const rawMode = String(options.mode || MUTATION_MONITOR_MODE.Added).toLowerCase();
7169
7097
  const mode = [MUTATION_MONITOR_MODE.Added, MUTATION_MONITOR_MODE.Changed, MUTATION_MONITOR_MODE.All].includes(rawMode) ? rawMode : MUTATION_MONITOR_MODE.Added;
7170
- logger13.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
7098
+ logger12.start("useMonitor", `\u76D1\u63A7 ${selectorList.length} \u4E2A\u9009\u62E9\u5668, mode=${mode}`);
7171
7099
  const monitorKey = generateKey("pk_mon");
7172
7100
  const callbackName = generateKey("pk_mon_cb");
7173
7101
  const cleanerName = generateKey("pk_mon_clean");
@@ -7310,7 +7238,7 @@ var Mutation = {
7310
7238
  return total;
7311
7239
  };
7312
7240
  }, { selectorList, monitorKey, callbackName, cleanerName, hasCallback: !!onMutation, mode });
7313
- logger13.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
7241
+ logger12.success("useMonitor", "\u76D1\u63A7\u5668\u5DF2\u542F\u52A8");
7314
7242
  return {
7315
7243
  stop: async () => {
7316
7244
  let totalMutations = 0;
@@ -7323,7 +7251,7 @@ var Mutation = {
7323
7251
  }, cleanerName);
7324
7252
  } catch (e) {
7325
7253
  }
7326
- logger13.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
7254
+ logger12.success("useMonitor.stop", `\u76D1\u63A7\u5DF2\u505C\u6B62, \u5171 ${totalMutations} \u6B21\u53D8\u5316`);
7327
7255
  return { totalMutations };
7328
7256
  }
7329
7257
  };
@@ -8192,7 +8120,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
8192
8120
  };
8193
8121
  var getDefaultBaseLogger = () => createBaseLogger("");
8194
8122
  var Logger = {
8195
- setLogger: (logger17) => setDefaultLogger(logger17),
8123
+ setLogger: (logger16) => setDefaultLogger(logger16),
8196
8124
  info: (message) => getDefaultBaseLogger().info(message),
8197
8125
  success: (message) => getDefaultBaseLogger().success(message),
8198
8126
  warning: (message) => getDefaultBaseLogger().warning(message),
@@ -8200,8 +8128,8 @@ var Logger = {
8200
8128
  error: (message) => getDefaultBaseLogger().error(message),
8201
8129
  debug: (message) => getDefaultBaseLogger().debug(message),
8202
8130
  start: (message) => getDefaultBaseLogger().start(message),
8203
- useTemplate: (logger17) => {
8204
- if (logger17) return createTemplateLogger(createBaseLogger("", logger17));
8131
+ useTemplate: (logger16) => {
8132
+ if (logger16) return createTemplateLogger(createBaseLogger("", logger16));
8205
8133
  return createTemplateLogger();
8206
8134
  }
8207
8135
  };
@@ -8275,7 +8203,7 @@ var LOCATION_NETWORK_SUFFIX_PATTERNS = [
8275
8203
  ];
8276
8204
  var cachedStripLogoSrcPromise = null;
8277
8205
  var cachedEnrichmentByContext = /* @__PURE__ */ new WeakMap();
8278
- var logger14 = createInternalLogger("Watermarkify");
8206
+ var logger13 = createInternalLogger("Watermarkify");
8279
8207
  var normalizeText = (value) => String(value || "").trim();
8280
8208
  var toInline = (value, maxLen = 200) => {
8281
8209
  const text = normalizeText(value);
@@ -8517,9 +8445,9 @@ var resolveWithCustomResolver = async (page, baseMeta, options = {}) => {
8517
8445
  location: toInline(resolved.location, 80)
8518
8446
  };
8519
8447
  if (enrichment.ip || enrichment.location) {
8520
- logger14.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
8448
+ logger13.info(`\u81EA\u5B9A\u4E49 resolver \u547D\u4E2D: ip=${enrichment.ip || "-"}, loc=${enrichment.location || "-"}`);
8521
8449
  } else {
8522
- logger14.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
8450
+ logger13.warning("\u81EA\u5B9A\u4E49 resolver \u5DF2\u6267\u884C\uFF0C\u4F46\u672A\u8FD4\u56DE IP/Loc");
8523
8451
  }
8524
8452
  return enrichment;
8525
8453
  } finally {
@@ -8708,12 +8636,12 @@ var normalizeWatermarkifyRenderMode = (value) => {
8708
8636
  };
8709
8637
  var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageInfo = {}, options = {}) => {
8710
8638
  if (!page || typeof page.context !== "function") {
8711
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
8639
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u7F3A\u5C11\u53EF\u7528 page");
8712
8640
  return buffer;
8713
8641
  }
8714
8642
  const renderScope = await openProbePage(page);
8715
8643
  if (!renderScope?.page) {
8716
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
8644
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA render page");
8717
8645
  return buffer;
8718
8646
  }
8719
8647
  try {
@@ -8778,13 +8706,13 @@ var composeScreenshotBufferWithBrowser = async (page, buffer, overlaySvg, imageI
8778
8706
  fullPage: true,
8779
8707
  animations: "disabled"
8780
8708
  }).catch((error) => {
8781
- logger14.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
8709
+ logger13.warning(`watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
8782
8710
  return null;
8783
8711
  });
8784
8712
  if (Buffer.isBuffer(composed) && composed.length > 0) {
8785
8713
  return composed;
8786
8714
  }
8787
- logger14.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
8715
+ logger13.warning("watermarkify \u6D4F\u89C8\u5668\u5408\u6210\u5931\u8D25: \u672A\u5F97\u5230\u6709\u6548\u622A\u56FE\u7ED3\u679C");
8788
8716
  return buffer;
8789
8717
  } finally {
8790
8718
  await renderScope.close().catch(() => {
@@ -8797,7 +8725,7 @@ var resolveWithIpLookup = async (page, options = {}) => {
8797
8725
  }
8798
8726
  const probeScope = await openProbePage(page);
8799
8727
  if (!probeScope?.page) {
8800
- logger14.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
8728
+ logger13.warning("ipLookup \u8DF3\u8FC7: \u65E0\u6CD5\u521B\u5EFA probe page");
8801
8729
  return null;
8802
8730
  }
8803
8731
  const timeoutMs = Math.max(
@@ -8806,12 +8734,12 @@ var resolveWithIpLookup = async (page, options = {}) => {
8806
8734
  );
8807
8735
  try {
8808
8736
  const probePage = probeScope.page;
8809
- logger14.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
8737
+ logger13.info(`ipLookup \u5C1D\u8BD5: url=${DEFAULT_IP_LOOKUP_URL}, timeoutMs=${timeoutMs}`);
8810
8738
  const response = await probePage.goto(DEFAULT_IP_LOOKUP_URL, {
8811
8739
  waitUntil: "commit",
8812
8740
  timeout: timeoutMs
8813
8741
  }).catch((error) => {
8814
- logger14.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
8742
+ logger13.warning(`ipLookup \u8BF7\u6C42\u5931\u8D25: url=${DEFAULT_IP_LOOKUP_URL}, error=${error instanceof Error ? error.message : String(error)}`);
8815
8743
  return null;
8816
8744
  });
8817
8745
  const status = response && typeof response.status === "function" ? response.status() : 0;
@@ -8833,13 +8761,13 @@ var resolveWithIpLookup = async (page, options = {}) => {
8833
8761
  }
8834
8762
  const parsed = parseIpIpJsonResponse(rawText);
8835
8763
  if (parsed?.ip || parsed?.location) {
8836
- logger14.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
8764
+ logger13.info(`ipLookup \u6210\u529F: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, ip=${parsed.ip || "-"}, loc=${parsed.location || "-"}`);
8837
8765
  return parsed;
8838
8766
  }
8839
- logger14.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
8767
+ logger13.warning(`ipLookup \u672A\u89E3\u6790\u51FA IP/Loc: url=${DEFAULT_IP_LOOKUP_URL}, status=${status || "-"}, contentType=${contentType || "-"}, preview=${shortenTail(rawText, 120) || "[empty]"}`);
8840
8768
  return null;
8841
8769
  } catch (error) {
8842
- logger14.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
8770
+ logger13.warning(`ipLookup \u6267\u884C\u5F02\u5E38\uFF0C\u672A\u83B7\u5F97 IP/Loc: ${error instanceof Error ? error.message : String(error)}`);
8843
8771
  return null;
8844
8772
  } finally {
8845
8773
  await probeScope.close().catch(() => {
@@ -8853,10 +8781,10 @@ var resolveEnrichment = async (page, baseMeta, options) => {
8853
8781
  ip: toInline(options.ip, 80),
8854
8782
  location: toInline(options.location, 80)
8855
8783
  };
8856
- logger14.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
8784
+ logger13.info(`enrichment \u5F00\u59CB: host=${baseMeta.hostname || "-"}, hasPresetIp=${Boolean(merged.ip)}, hasPresetLoc=${Boolean(merged.location)}, ipLookup=${options.ipLookup !== false}`);
8857
8785
  if (!merged.ip || !merged.location) {
8858
8786
  if (cached?.ip || cached?.location) {
8859
- logger14.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
8787
+ logger13.info(`enrichment \u547D\u4E2D\u4E0A\u4E0B\u6587\u7F13\u5B58: ip=${cached.ip || "-"}, loc=${cached.location || "-"}`);
8860
8788
  }
8861
8789
  fillEnrichment(merged, cached);
8862
8790
  }
@@ -8880,15 +8808,15 @@ var resolveEnrichment = async (page, baseMeta, options) => {
8880
8808
  "x-geo-country"
8881
8809
  ]), 80);
8882
8810
  if (!merged.location || isWeakLocationValue(merged.location) && headerLocation) {
8883
- logger14.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
8811
+ logger13.info(`enrichment \u4F7F\u7528\u54CD\u5E94\u5934\u8865\u5145 Loc: ${headerLocation || "-"}`);
8884
8812
  merged.location = headerLocation || merged.location;
8885
8813
  }
8886
8814
  }
8887
8815
  writeCachedEnrichment(page, merged);
8888
8816
  if (merged.ip || merged.location) {
8889
- logger14.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
8817
+ logger13.info(`enrichment \u5B8C\u6210: ip=${merged.ip || "-"}, loc=${merged.location || "-"}`);
8890
8818
  } else {
8891
- logger14.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
8819
+ logger13.warning("enrichment \u5B8C\u6210: \u672A\u83B7\u5F97 IP/Loc");
8892
8820
  }
8893
8821
  return merged;
8894
8822
  };
@@ -9701,7 +9629,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
9701
9629
  }
9702
9630
  const imageInfo = readImageInfo(buffer);
9703
9631
  if (!imageInfo.width || !imageInfo.height || !imageInfo.mimeType) {
9704
- logger14.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
9632
+ logger13.warning("watermarkify \u8DF3\u8FC7: \u65E0\u6CD5\u89E3\u6790\u622A\u56FE\u5C3A\u5BF8\u6216\u683C\u5F0F");
9705
9633
  return buffer;
9706
9634
  }
9707
9635
  const isMobileStrip = normalizeDevice(meta.device) === Device.Mobile && hasStrip;
@@ -9719,7 +9647,7 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null, options = {
9719
9647
 
9720
9648
  // src/internals/compression.js
9721
9649
  var import_jimp = require("jimp");
9722
- var logger15 = createInternalLogger("Compression");
9650
+ var logger14 = createInternalLogger("Compression");
9723
9651
  var DEFAULT_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
9724
9652
  var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
9725
9653
  var DEFAULT_SCREENSHOT_QUALITY = 0.72;
@@ -9838,18 +9766,18 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
9838
9766
  return buffer.toString("base64");
9839
9767
  }
9840
9768
  const result = await compressImageBuffer(buffer, compression).catch((error) => {
9841
- logger15.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
9769
+ logger14.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
9842
9770
  return null;
9843
9771
  });
9844
9772
  if (!result?.buffer) {
9845
9773
  return buffer.toString("base64");
9846
9774
  }
9847
9775
  if (result.withinLimit) {
9848
- logger15.info(
9776
+ logger14.info(
9849
9777
  `captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
9850
9778
  );
9851
9779
  } else {
9852
- logger15.warning(
9780
+ logger14.warning(
9853
9781
  `captureScreen \u538B\u7F29\u540E\u4ECD\u8D85\u8FC7\u76EE\u6807: ${originalBytes} -> ${result.bytes} bytes, maxBytes=${compression.maxBytes}, format=${result.format}, quality=${result.quality}, scale=${result.scale}`
9854
9782
  );
9855
9783
  }
@@ -9857,7 +9785,7 @@ var compressImageBufferToBase64 = async (buffer, compression) => {
9857
9785
  };
9858
9786
 
9859
9787
  // src/share.js
9860
- var logger16 = createInternalLogger("Share");
9788
+ var logger15 = createInternalLogger("Share");
9861
9789
  var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
9862
9790
  var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
9863
9791
  var DEFAULT_POLL_INTERVAL_MS = 120;
@@ -9994,7 +9922,7 @@ var createDomShareMonitor = async (page, options = {}) => {
9994
9922
  const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
9995
9923
  const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
9996
9924
  let matched = false;
9997
- logger16.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
9925
+ logger15.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
9998
9926
  const monitor = await Mutation.useMonitor(page, selectors, {
9999
9927
  mode,
10000
9928
  onMutation: (context = {}) => {
@@ -10012,12 +9940,12 @@ ${text}`;
10012
9940
  });
10013
9941
  }
10014
9942
  if (mutationCount <= 5 || mutationCount % 50 === 0) {
10015
- logger16.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
9943
+ logger15.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
10016
9944
  }
10017
9945
  const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
10018
9946
  if (!candidate) return;
10019
9947
  matched = true;
10020
- logger16.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
9948
+ logger15.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
10021
9949
  if (onMatch) {
10022
9950
  onMatch({
10023
9951
  link: candidate,
@@ -10033,7 +9961,7 @@ ${text}`;
10033
9961
  return {
10034
9962
  stop: async () => {
10035
9963
  const result = await monitor.stop();
10036
- logger16.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
9964
+ logger15.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
10037
9965
  return result;
10038
9966
  }
10039
9967
  };
@@ -10082,8 +10010,8 @@ var Share = {
10082
10010
  if (share.mode === "response" && apiMatchers.length === 0) {
10083
10011
  throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
10084
10012
  }
10085
- logger16.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
10086
- logger16.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
10013
+ logger15.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutDisabled ? "disabled" : timeoutMs}, prefix=${share.prefix}`);
10014
+ logger15.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
10087
10015
  const stats = {
10088
10016
  actionTimedOut: false,
10089
10017
  domMutationCount: 0,
@@ -10095,7 +10023,7 @@ var Share = {
10095
10023
  responseSampleUrls: []
10096
10024
  };
10097
10025
  if (isAborted()) {
10098
- logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10026
+ logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10099
10027
  return {
10100
10028
  link: null,
10101
10029
  payloadText: "",
@@ -10118,7 +10046,7 @@ var Share = {
10118
10046
  link: validated,
10119
10047
  payloadText: String(payloadText || "")
10120
10048
  };
10121
- logger16.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
10049
+ logger15.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
10122
10050
  return true;
10123
10051
  };
10124
10052
  const resolveResponseCandidate = (responseText) => {
@@ -10153,7 +10081,7 @@ var Share = {
10153
10081
  try {
10154
10082
  await monitor.stop();
10155
10083
  } catch (error) {
10156
- logger16.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
10084
+ logger15.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
10157
10085
  }
10158
10086
  };
10159
10087
  const onResponse = async (response) => {
@@ -10167,29 +10095,29 @@ var Share = {
10167
10095
  stats.responseSampleUrls.push(url);
10168
10096
  }
10169
10097
  if (stats.responseObserved <= 5) {
10170
- logger16.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
10098
+ logger15.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
10171
10099
  }
10172
10100
  if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
10173
10101
  stats.responseMatched += 1;
10174
10102
  stats.lastMatchedUrl = url;
10175
- logger16.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
10103
+ logger15.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
10176
10104
  const text = await response.text();
10177
10105
  const hit = resolveResponseCandidate(text);
10178
10106
  if (!hit?.link) {
10179
10107
  if (stats.responseMatched <= 3) {
10180
- logger16.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
10108
+ logger15.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
10181
10109
  }
10182
10110
  return;
10183
10111
  }
10184
10112
  stats.responseResolved += 1;
10185
- logger16.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
10113
+ logger15.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
10186
10114
  setCandidate("response", hit.link, hit.payloadText);
10187
10115
  } catch (error) {
10188
- logger16.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
10116
+ logger15.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
10189
10117
  }
10190
10118
  };
10191
10119
  if (share.mode === "dom") {
10192
- logger16.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
10120
+ logger15.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
10193
10121
  domMonitor = await createDomShareMonitor(page, {
10194
10122
  prefix: share.prefix,
10195
10123
  selectors: domSelectors,
@@ -10204,17 +10132,17 @@ var Share = {
10204
10132
  });
10205
10133
  }
10206
10134
  if (share.mode === "response") {
10207
- logger16.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
10135
+ logger15.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
10208
10136
  page.on("response", onResponse);
10209
10137
  }
10210
10138
  if (share.mode === "custom") {
10211
- logger16.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
10139
+ logger15.info("\u5F53\u524D\u4E3A custom \u6A21\u5F0F\uFF0C\u5C06\u4F7F\u7528 performActions \u8FD4\u56DE\u503C");
10212
10140
  }
10213
10141
  const deadline = timeoutDisabled ? Infinity : Date.now() + timeoutMs;
10214
10142
  const getRemainingMs = () => timeoutDisabled ? Infinity : Math.max(0, deadline - Date.now());
10215
10143
  try {
10216
10144
  const actionTimeout = getRemainingMs();
10217
- logger16.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
10145
+ logger15.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${timeoutDisabled ? "disabled" : `${actionTimeout}ms`}`);
10218
10146
  let actionValue;
10219
10147
  if (!isAborted() && actionTimeout > 0) {
10220
10148
  let timer = null;
@@ -10227,30 +10155,30 @@ var Share = {
10227
10155
  ]);
10228
10156
  if (timer) clearTimeout(timer);
10229
10157
  if (actionResult.type === "error") {
10230
- logger16.fail("captureLink.performActions", actionResult.error);
10158
+ logger15.fail("captureLink.performActions", actionResult.error);
10231
10159
  throw actionResult.error;
10232
10160
  }
10233
10161
  if (actionResult.type === "timeout") {
10234
10162
  stats.actionTimedOut = true;
10235
- logger16.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
10163
+ logger15.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
10236
10164
  } else {
10237
10165
  actionValue = actionResult.result;
10238
- logger16.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
10166
+ logger15.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
10239
10167
  }
10240
10168
  }
10241
10169
  if (share.mode === "custom") {
10242
10170
  const customLink = typeof actionValue === "string" ? actionValue : actionValue?.link || actionValue?.payloadText;
10243
10171
  const customPayloadText = typeof actionValue === "string" ? actionValue : actionValue?.payloadText;
10244
10172
  if (setCandidate("custom", customLink, customPayloadText)) {
10245
- logger16.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
10173
+ logger15.success("captureLink.customResult", `custom \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: link=${candidates.custom.link}`);
10246
10174
  } else {
10247
- logger16.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
10175
+ logger15.warning("performActions \u6267\u884C\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u6709\u6548\u5206\u4EAB\u94FE\u63A5");
10248
10176
  }
10249
10177
  }
10250
10178
  let nextProgressLogTs = Date.now() + 3e3;
10251
10179
  while (true) {
10252
10180
  if (isAborted()) {
10253
- logger16.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10181
+ logger15.warning(`captureLink \u5DF2\u53D6\u6D88: ${abortReason()}`);
10254
10182
  return {
10255
10183
  link: null,
10256
10184
  payloadText: "",
@@ -10260,7 +10188,7 @@ var Share = {
10260
10188
  }
10261
10189
  const selected = candidates[share.mode];
10262
10190
  if (selected?.link) {
10263
- logger16.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
10191
+ logger15.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
10264
10192
  return {
10265
10193
  link: selected.link,
10266
10194
  payloadText: selected.payloadText,
@@ -10273,7 +10201,7 @@ var Share = {
10273
10201
  if (remaining <= 0) break;
10274
10202
  const now = Date.now();
10275
10203
  if (now >= nextProgressLogTs) {
10276
- logger16.info(
10204
+ logger15.info(
10277
10205
  `captureLink \u7B49\u5F85\u4E2D: remaining=${timeoutDisabled ? "disabled" : `${remaining}ms`}, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
10278
10206
  );
10279
10207
  nextProgressLogTs = now + 5e3;
@@ -10281,11 +10209,11 @@ var Share = {
10281
10209
  await (0, import_delay5.default)(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
10282
10210
  }
10283
10211
  if (!timeoutDisabled && share.mode === "response" && stats.responseMatched === 0) {
10284
- logger16.warning(
10212
+ logger15.warning(
10285
10213
  `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
10286
10214
  );
10287
10215
  }
10288
- logger16.warning(
10216
+ logger15.warning(
10289
10217
  `captureLink ${timeoutDisabled ? "\u672A\u62FF\u5230\u94FE\u63A5" : "\u8D85\u65F6\u672A\u62FF\u5230\u94FE\u63A5"}: mode=${share.mode}, actionTimedOut=${stats.actionTimedOut}, domMutationCount=${stats.domMutationCount}, responseObserved=${stats.responseObserved}, responseMatched=${stats.responseMatched}, lastMatchedUrl=${stats.lastMatchedUrl || "none"}`
10290
10218
  );
10291
10219
  return {
@@ -10297,7 +10225,7 @@ var Share = {
10297
10225
  } finally {
10298
10226
  if (share.mode === "response") {
10299
10227
  page.off("response", onResponse);
10300
- logger16.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
10228
+ logger15.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
10301
10229
  }
10302
10230
  await stopDomMonitor();
10303
10231
  }