@skrillex1224/playwright-toolkit 2.1.221 → 2.1.223

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
@@ -361,18 +361,18 @@ var fallbackLog = {
361
361
  error: (...args) => console.error(...args),
362
362
  debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
363
363
  };
364
- var resolveLogMethod = (logger14, name) => {
365
- if (logger14 && typeof logger14[name] === "function") {
366
- return logger14[name].bind(logger14);
364
+ var resolveLogMethod = (logger15, name) => {
365
+ if (logger15 && typeof logger15[name] === "function") {
366
+ return logger15[name].bind(logger15);
367
367
  }
368
- if (name === "warning" && logger14 && typeof logger14.warn === "function") {
369
- return logger14.warn.bind(logger14);
368
+ if (name === "warning" && logger15 && typeof logger15.warn === "function") {
369
+ return logger15.warn.bind(logger15);
370
370
  }
371
371
  return fallbackLog[name];
372
372
  };
373
373
  var defaultLogger = null;
374
- var setDefaultLogger = (logger14) => {
375
- defaultLogger = logger14;
374
+ var setDefaultLogger = (logger15) => {
375
+ defaultLogger = logger15;
376
376
  };
377
377
  var resolveLogger = (explicitLogger) => {
378
378
  if (explicitLogger && typeof explicitLogger.info === "function") {
@@ -399,8 +399,8 @@ var colorize = (text, color) => {
399
399
  var createBaseLogger = (prefix = "", explicitLogger) => {
400
400
  const name = prefix ? String(prefix) : "";
401
401
  const dispatch = (methodName, icon, message, color) => {
402
- const logger14 = resolveLogger(explicitLogger);
403
- const logFn = resolveLogMethod(logger14, methodName);
402
+ const logger15 = resolveLogger(explicitLogger);
403
+ const logFn = resolveLogMethod(logger15, methodName);
404
404
  const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
405
405
  const line = formatLine(name, icon, message);
406
406
  const coloredLine = colorize(line, color);
@@ -439,7 +439,6 @@ function createInternalLogger(moduleName, explicitLogger) {
439
439
  },
440
440
  warning(message) {
441
441
  baseLogger.warning(message);
442
- a;
443
442
  },
444
443
  info(message) {
445
444
  baseLogger.info(message);
@@ -686,9 +685,9 @@ var resolveResourceTypeMeta = (domain) => {
686
685
  if (!byType || byType.size === 0) {
687
686
  return { resourceType: "", resourceTypeCounts: void 0 };
688
687
  }
689
- const entries = Array.from(byType.entries()).filter(([type, count]) => type && Number(count) > 0).sort((a2, b) => {
690
- if (Number(b[1]) !== Number(a2[1])) return Number(b[1]) - Number(a2[1]);
691
- return String(a2[0]).localeCompare(String(b[0]));
688
+ const entries = Array.from(byType.entries()).filter(([type, count]) => type && Number(count) > 0).sort((a, b) => {
689
+ if (Number(b[1]) !== Number(a[1])) return Number(b[1]) - Number(a[1]);
690
+ return String(a[0]).localeCompare(String(b[0]));
692
691
  });
693
692
  if (entries.length === 0) {
694
693
  return { resourceType: "", resourceTypeCounts: void 0 };
@@ -778,10 +777,10 @@ var normalizeDomainRows = (hosts) => {
778
777
  resourceTypeCounts: resourceTypeMeta.resourceTypeCounts || void 0
779
778
  });
780
779
  }
781
- rows.sort((a2, b) => {
782
- if (b.totalBytes !== a2.totalBytes) return b.totalBytes - a2.totalBytes;
783
- if (b.requests !== a2.requests) return b.requests - a2.requests;
784
- return String(a2.domain).localeCompare(String(b.domain));
780
+ rows.sort((a, b) => {
781
+ if (b.totalBytes !== a.totalBytes) return b.totalBytes - a.totalBytes;
782
+ if (b.requests !== a.requests) return b.requests - a.requests;
783
+ return String(a.domain).localeCompare(String(b.domain));
785
784
  });
786
785
  return {
787
786
  topDomains: rows.slice(0, MAX_TOP_DOMAINS),
@@ -4935,7 +4934,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
4935
4934
  };
4936
4935
  var getDefaultBaseLogger = () => createBaseLogger("");
4937
4936
  var Logger = {
4938
- setLogger: (logger14) => setDefaultLogger(logger14),
4937
+ setLogger: (logger15) => setDefaultLogger(logger15),
4939
4938
  info: (message) => getDefaultBaseLogger().info(message),
4940
4939
  success: (message) => getDefaultBaseLogger().success(message),
4941
4940
  warning: (message) => getDefaultBaseLogger().warning(message),
@@ -4943,8 +4942,8 @@ var Logger = {
4943
4942
  error: (message) => getDefaultBaseLogger().error(message),
4944
4943
  debug: (message) => getDefaultBaseLogger().debug(message),
4945
4944
  start: (message) => getDefaultBaseLogger().start(message),
4946
- useTemplate: (logger14) => {
4947
- if (logger14) return createTemplateLogger(createBaseLogger("", logger14));
4945
+ useTemplate: (logger15) => {
4946
+ if (logger15) return createTemplateLogger(createBaseLogger("", logger15));
4948
4947
  return createTemplateLogger();
4949
4948
  }
4950
4949
  };
@@ -6273,8 +6272,147 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null) => {
6273
6272
  return await composeScreenshotBufferWithBrowser(page, buffer, overlaySvg, imageInfo);
6274
6273
  };
6275
6274
 
6275
+ // src/internals/screenshot-compression.js
6276
+ var import_jimp = require("jimp");
6277
+ var logger13 = createInternalLogger("ScreenshotCompression");
6278
+ var DEFAULT_SCREENSHOT_MAX_BYTES = 8 * 1024 * 1024;
6279
+ var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
6280
+ var DEFAULT_SCREENSHOT_QUALITY = 0.72;
6281
+ var DEFAULT_SCREENSHOT_MIN_QUALITY = 0.38;
6282
+ var DEFAULT_SCREENSHOT_MIN_SCALE = 0.25;
6283
+ var SUPPORTED_SCREENSHOT_OUTPUT_TYPES = /* @__PURE__ */ new Set(["jpeg"]);
6284
+ var toPositiveInteger = (value, fallback = 0) => {
6285
+ const number = Math.floor(Number(value) || 0);
6286
+ return number > 0 ? number : fallback;
6287
+ };
6288
+ var normalizeQuality2 = (value, fallback) => {
6289
+ const number = Number(value);
6290
+ if (!Number.isFinite(number) || number <= 0) return fallback;
6291
+ const normalized = number > 1 ? number / 100 : number;
6292
+ return Math.min(1, Math.max(0.01, normalized));
6293
+ };
6294
+ var normalizeScale = (value, fallback) => {
6295
+ const number = Number(value);
6296
+ if (!Number.isFinite(number) || number <= 0) return fallback;
6297
+ return Math.min(1, Math.max(0.05, number));
6298
+ };
6299
+ var normalizeScreenshotOutputType = (value) => {
6300
+ const raw = String(value || DEFAULT_SCREENSHOT_OUTPUT_TYPE).trim().toLowerCase();
6301
+ const normalized = raw === "jpg" ? "jpeg" : raw;
6302
+ return SUPPORTED_SCREENSHOT_OUTPUT_TYPES.has(normalized) ? normalized : DEFAULT_SCREENSHOT_OUTPUT_TYPE;
6303
+ };
6304
+ var getBase64BytesFromBuffer = (buffer) => Math.ceil(buffer.length / 3) * 4;
6305
+ var toJpegQuality = (value) => Math.round(normalizeQuality2(value, DEFAULT_SCREENSHOT_QUALITY) * 100);
6306
+ var resolveCaptureScreenCompression = (options = {}) => {
6307
+ const explicit = options.compression;
6308
+ const source = explicit && typeof explicit === "object" && !Array.isArray(explicit) ? explicit : {};
6309
+ const enabled = explicit !== false && source.enabled !== false && options.compress !== false;
6310
+ const quality = normalizeQuality2(
6311
+ source.quality ?? options.quality,
6312
+ DEFAULT_SCREENSHOT_QUALITY
6313
+ );
6314
+ const minQuality = Math.min(
6315
+ quality,
6316
+ normalizeQuality2(source.minQuality ?? options.minQuality, DEFAULT_SCREENSHOT_MIN_QUALITY)
6317
+ );
6318
+ return {
6319
+ enabled,
6320
+ maxBytes: toPositiveInteger(
6321
+ source.maxBytes ?? source.maxBase64Bytes ?? options.maxBytes ?? options.maxBase64Bytes,
6322
+ DEFAULT_SCREENSHOT_MAX_BYTES
6323
+ ),
6324
+ outputType: normalizeScreenshotOutputType(
6325
+ source.type ?? source.outputType ?? options.type ?? options.outputType
6326
+ ),
6327
+ quality,
6328
+ minQuality,
6329
+ minScale: normalizeScale(
6330
+ source.minScale ?? options.minScale,
6331
+ DEFAULT_SCREENSHOT_MIN_SCALE
6332
+ )
6333
+ };
6334
+ };
6335
+ var encodeJpeg = async (sourceImage, compression, scale, quality) => {
6336
+ const width = Math.max(1, Math.round(sourceImage.bitmap.width * scale));
6337
+ const height = Math.max(1, Math.round(sourceImage.bitmap.height * scale));
6338
+ const image = sourceImage.clone();
6339
+ if (scale < 0.999) {
6340
+ image.resize({
6341
+ w: width,
6342
+ h: height,
6343
+ mode: import_jimp.ResizeStrategy.BILINEAR
6344
+ });
6345
+ }
6346
+ const buffer = await image.getBuffer(import_jimp.JimpMime.jpeg, { quality });
6347
+ return {
6348
+ buffer,
6349
+ bytes: getBase64BytesFromBuffer(buffer),
6350
+ width,
6351
+ height,
6352
+ quality,
6353
+ scale: Number(scale.toFixed(3)),
6354
+ format: compression.outputType
6355
+ };
6356
+ };
6357
+ var compressScreenshotBuffer = async (buffer, compression) => {
6358
+ const sourceImage = await import_jimp.Jimp.read(buffer);
6359
+ const maxQuality = toJpegQuality(compression.quality);
6360
+ const minQuality = Math.min(maxQuality, toJpegQuality(compression.minQuality));
6361
+ let quality = maxQuality;
6362
+ let scale = 1;
6363
+ let smallest = null;
6364
+ for (let attempt = 0; attempt < 12; attempt += 1) {
6365
+ const candidate = await encodeJpeg(sourceImage, compression, scale, quality);
6366
+ if (!smallest || candidate.bytes < smallest.bytes) {
6367
+ smallest = candidate;
6368
+ }
6369
+ if (candidate.bytes <= compression.maxBytes) {
6370
+ return { ...candidate, withinLimit: true };
6371
+ }
6372
+ if (quality > minQuality) {
6373
+ quality = Math.max(minQuality, Math.floor(quality * 0.75));
6374
+ continue;
6375
+ }
6376
+ const ratio = Math.sqrt(compression.maxBytes / Math.max(1, candidate.bytes));
6377
+ const nextScale = Math.max(
6378
+ compression.minScale,
6379
+ Math.min(scale * 0.85, scale * ratio * 0.94)
6380
+ );
6381
+ if (nextScale >= scale * 0.99 || scale <= compression.minScale) {
6382
+ break;
6383
+ }
6384
+ scale = nextScale;
6385
+ }
6386
+ const finalCandidate = await encodeJpeg(sourceImage, compression, compression.minScale, minQuality);
6387
+ const fallback = !smallest || finalCandidate.bytes < smallest.bytes ? finalCandidate : smallest;
6388
+ return { ...fallback, withinLimit: fallback.bytes <= compression.maxBytes };
6389
+ };
6390
+ var compressScreenshotBufferToBase64 = async (buffer, compression) => {
6391
+ const originalBytes = getBase64BytesFromBuffer(buffer);
6392
+ if (!compression.enabled || originalBytes <= compression.maxBytes) {
6393
+ return buffer.toString("base64");
6394
+ }
6395
+ const result = await compressScreenshotBuffer(buffer, compression).catch((error) => {
6396
+ logger13.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
6397
+ return null;
6398
+ });
6399
+ if (!result?.buffer) {
6400
+ return buffer.toString("base64");
6401
+ }
6402
+ if (result.withinLimit) {
6403
+ logger13.info(
6404
+ `captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
6405
+ );
6406
+ } else {
6407
+ logger13.warning(
6408
+ `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}`
6409
+ );
6410
+ }
6411
+ return result.buffer.toString("base64");
6412
+ };
6413
+
6276
6414
  // src/share.js
6277
- var logger13 = createInternalLogger("Share");
6415
+ var logger14 = createInternalLogger("Share");
6278
6416
  var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
6279
6417
  var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
6280
6418
  var DEFAULT_POLL_INTERVAL_MS = 120;
@@ -6411,7 +6549,7 @@ var createDomShareMonitor = async (page, options = {}) => {
6411
6549
  const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
6412
6550
  const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
6413
6551
  let matched = false;
6414
- logger13.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
6552
+ logger14.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
6415
6553
  const monitor = await Mutation.useMonitor(page, selectors, {
6416
6554
  mode,
6417
6555
  onMutation: (context = {}) => {
@@ -6429,12 +6567,12 @@ ${text}`;
6429
6567
  });
6430
6568
  }
6431
6569
  if (mutationCount <= 5 || mutationCount % 50 === 0) {
6432
- logger13.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
6570
+ logger14.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
6433
6571
  }
6434
6572
  const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
6435
6573
  if (!candidate) return;
6436
6574
  matched = true;
6437
- logger13.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
6575
+ logger14.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
6438
6576
  if (onMatch) {
6439
6577
  onMatch({
6440
6578
  link: candidate,
@@ -6450,7 +6588,7 @@ ${text}`;
6450
6588
  return {
6451
6589
  stop: async () => {
6452
6590
  const result = await monitor.stop();
6453
- logger13.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
6591
+ logger14.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
6454
6592
  return result;
6455
6593
  }
6456
6594
  };
@@ -6490,8 +6628,8 @@ var Share = {
6490
6628
  if (share.mode === "response" && apiMatchers.length === 0) {
6491
6629
  throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
6492
6630
  }
6493
- logger13.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutMs}, prefix=${share.prefix}`);
6494
- logger13.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
6631
+ logger14.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutMs}, prefix=${share.prefix}`);
6632
+ logger14.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
6495
6633
  const stats = {
6496
6634
  actionTimedOut: false,
6497
6635
  domMutationCount: 0,
@@ -6516,7 +6654,7 @@ var Share = {
6516
6654
  link: validated,
6517
6655
  payloadText: String(payloadText || "")
6518
6656
  };
6519
- logger13.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
6657
+ logger14.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
6520
6658
  return true;
6521
6659
  };
6522
6660
  const resolveResponseCandidate = (responseText) => {
@@ -6551,7 +6689,7 @@ var Share = {
6551
6689
  try {
6552
6690
  await monitor.stop();
6553
6691
  } catch (error) {
6554
- logger13.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
6692
+ logger14.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
6555
6693
  }
6556
6694
  };
6557
6695
  const onResponse = async (response) => {
@@ -6564,29 +6702,29 @@ var Share = {
6564
6702
  stats.responseSampleUrls.push(url);
6565
6703
  }
6566
6704
  if (stats.responseObserved <= 5) {
6567
- logger13.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
6705
+ logger14.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
6568
6706
  }
6569
6707
  if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
6570
6708
  stats.responseMatched += 1;
6571
6709
  stats.lastMatchedUrl = url;
6572
- logger13.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
6710
+ logger14.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
6573
6711
  const text = await response.text();
6574
6712
  const hit = resolveResponseCandidate(text);
6575
6713
  if (!hit?.link) {
6576
6714
  if (stats.responseMatched <= 3) {
6577
- logger13.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
6715
+ logger14.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
6578
6716
  }
6579
6717
  return;
6580
6718
  }
6581
6719
  stats.responseResolved += 1;
6582
- logger13.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
6720
+ logger14.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
6583
6721
  setCandidate("response", hit.link, hit.payloadText);
6584
6722
  } catch (error) {
6585
- logger13.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
6723
+ logger14.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
6586
6724
  }
6587
6725
  };
6588
6726
  if (share.mode === "dom") {
6589
- logger13.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
6727
+ logger14.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
6590
6728
  domMonitor = await createDomShareMonitor(page, {
6591
6729
  prefix: share.prefix,
6592
6730
  selectors: domSelectors,
@@ -6601,14 +6739,14 @@ var Share = {
6601
6739
  });
6602
6740
  }
6603
6741
  if (share.mode === "response") {
6604
- logger13.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
6742
+ logger14.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
6605
6743
  page.on("response", onResponse);
6606
6744
  }
6607
6745
  const deadline = Date.now() + timeoutMs;
6608
6746
  const getRemainingMs = () => Math.max(0, deadline - Date.now());
6609
6747
  try {
6610
6748
  const actionTimeout = getRemainingMs();
6611
- logger13.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${actionTimeout}ms`);
6749
+ logger14.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${actionTimeout}ms`);
6612
6750
  if (actionTimeout > 0) {
6613
6751
  let timer = null;
6614
6752
  let actionError = null;
@@ -6622,21 +6760,21 @@ var Share = {
6622
6760
  const actionResult = await Promise.race([actionPromise, timeoutPromise]);
6623
6761
  if (timer) clearTimeout(timer);
6624
6762
  if (actionResult === "__ACTION_ERROR__") {
6625
- logger13.fail("captureLink.performActions", actionError);
6763
+ logger14.fail("captureLink.performActions", actionError);
6626
6764
  throw actionError;
6627
6765
  }
6628
6766
  if (actionResult === "__ACTION_TIMEOUT__") {
6629
6767
  stats.actionTimedOut = true;
6630
- logger13.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
6768
+ logger14.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
6631
6769
  } else {
6632
- logger13.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
6770
+ logger14.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
6633
6771
  }
6634
6772
  }
6635
6773
  let nextProgressLogTs = Date.now() + 3e3;
6636
6774
  while (true) {
6637
6775
  const selected = share.mode === "dom" ? candidates.dom : candidates.response;
6638
6776
  if (selected?.link) {
6639
- logger13.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
6777
+ logger14.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
6640
6778
  return {
6641
6779
  link: selected.link,
6642
6780
  payloadText: selected.payloadText,
@@ -6648,7 +6786,7 @@ var Share = {
6648
6786
  if (remaining <= 0) break;
6649
6787
  const now = Date.now();
6650
6788
  if (now >= nextProgressLogTs) {
6651
- logger13.info(
6789
+ logger14.info(
6652
6790
  `captureLink \u7B49\u5F85\u4E2D: remaining=${remaining}ms, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
6653
6791
  );
6654
6792
  nextProgressLogTs = now + 5e3;
@@ -6656,11 +6794,11 @@ var Share = {
6656
6794
  await (0, import_delay2.default)(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
6657
6795
  }
6658
6796
  if (share.mode === "response" && stats.responseMatched === 0) {
6659
- logger13.warning(
6797
+ logger14.warning(
6660
6798
  `\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
6661
6799
  );
6662
6800
  }
6663
- logger13.warning(
6801
+ logger14.warning(
6664
6802
  `captureLink \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"}`
6665
6803
  );
6666
6804
  return {
@@ -6672,7 +6810,7 @@ var Share = {
6672
6810
  } finally {
6673
6811
  if (share.mode === "response") {
6674
6812
  page.off("response", onResponse);
6675
- logger13.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
6813
+ logger14.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
6676
6814
  }
6677
6815
  await stopDomMonitor();
6678
6816
  }
@@ -6685,7 +6823,10 @@ var Share = {
6685
6823
  * @param {number} [options.buffer]
6686
6824
  * @param {boolean} [options.restore]
6687
6825
  * @param {number} [options.maxHeight]
6688
- * @returns {Promise<string>} base64 png
6826
+ * @param {number} [options.maxBytes] 默认 8MiB,返回 base64 超过后会压缩
6827
+ * @param {'jpeg'|'jpg'} [options.type] 压缩输出格式,默认 jpeg
6828
+ * @param {boolean|Object} [options.compression] 传 false 可关闭压缩
6829
+ * @returns {Promise<string>} base64 image
6689
6830
  */
6690
6831
  async captureScreen(page, options = {}) {
6691
6832
  const originalViewport = await resolveCurrentViewportSize(page);
@@ -6694,6 +6835,7 @@ var Share = {
6694
6835
  const restore = options.restore ?? false;
6695
6836
  const maxHeight = options.maxHeight ?? 8e3;
6696
6837
  const screenshotWatermarkify = resolveCaptureScreenWatermarkify(page, options.watermarkify);
6838
+ const compression = resolveCaptureScreenCompression(options);
6697
6839
  try {
6698
6840
  const maxScrollHeight = await page.evaluate(() => {
6699
6841
  let maxHeight2 = document.body.scrollHeight;
@@ -6727,15 +6869,15 @@ var Share = {
6727
6869
  type: "png",
6728
6870
  maxClipHeight: targetHeight
6729
6871
  });
6730
- if (!screenshotWatermarkify.enabled) {
6731
- return rawBuffer.toString("base64");
6872
+ let outputBuffer = rawBuffer;
6873
+ if (screenshotWatermarkify.enabled) {
6874
+ const watermarkifyMeta = await resolveScreenshotWatermarkifyMeta(page, {
6875
+ ...screenshotWatermarkify,
6876
+ capturedAt
6877
+ });
6878
+ outputBuffer = await watermarkifyScreenshotBuffer(rawBuffer, watermarkifyMeta, page);
6732
6879
  }
6733
- const watermarkifyMeta = await resolveScreenshotWatermarkifyMeta(page, {
6734
- ...screenshotWatermarkify,
6735
- capturedAt
6736
- });
6737
- const buffer_ = await watermarkifyScreenshotBuffer(rawBuffer, watermarkifyMeta, page);
6738
- return buffer_.toString("base64");
6880
+ return await compressScreenshotBufferToBase64(outputBuffer, compression);
6739
6881
  } finally {
6740
6882
  if (restore) {
6741
6883
  await page.evaluate(() => {