@skrillex1224/playwright-toolkit 2.1.222 → 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/README.md +9 -1
- package/dist/index.cjs +189 -46
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +189 -46
- package/dist/index.js.map +4 -4
- package/index.d.ts +37 -0
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -334,18 +334,18 @@ var fallbackLog = {
|
|
|
334
334
|
error: (...args) => console.error(...args),
|
|
335
335
|
debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
|
|
336
336
|
};
|
|
337
|
-
var resolveLogMethod = (
|
|
338
|
-
if (
|
|
339
|
-
return
|
|
337
|
+
var resolveLogMethod = (logger15, name) => {
|
|
338
|
+
if (logger15 && typeof logger15[name] === "function") {
|
|
339
|
+
return logger15[name].bind(logger15);
|
|
340
340
|
}
|
|
341
|
-
if (name === "warning" &&
|
|
342
|
-
return
|
|
341
|
+
if (name === "warning" && logger15 && typeof logger15.warn === "function") {
|
|
342
|
+
return logger15.warn.bind(logger15);
|
|
343
343
|
}
|
|
344
344
|
return fallbackLog[name];
|
|
345
345
|
};
|
|
346
346
|
var defaultLogger = null;
|
|
347
|
-
var setDefaultLogger = (
|
|
348
|
-
defaultLogger =
|
|
347
|
+
var setDefaultLogger = (logger15) => {
|
|
348
|
+
defaultLogger = logger15;
|
|
349
349
|
};
|
|
350
350
|
var resolveLogger = (explicitLogger) => {
|
|
351
351
|
if (explicitLogger && typeof explicitLogger.info === "function") {
|
|
@@ -372,8 +372,8 @@ var colorize = (text, color) => {
|
|
|
372
372
|
var createBaseLogger = (prefix = "", explicitLogger) => {
|
|
373
373
|
const name = prefix ? String(prefix) : "";
|
|
374
374
|
const dispatch = (methodName, icon, message, color) => {
|
|
375
|
-
const
|
|
376
|
-
const logFn = resolveLogMethod(
|
|
375
|
+
const logger15 = resolveLogger(explicitLogger);
|
|
376
|
+
const logFn = resolveLogMethod(logger15, methodName);
|
|
377
377
|
const timestamp = colorize(`[${formatTimestamp()}]`, ANSI.gray);
|
|
378
378
|
const line = formatLine(name, icon, message);
|
|
379
379
|
const coloredLine = colorize(line, color);
|
|
@@ -4906,7 +4906,7 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
4906
4906
|
};
|
|
4907
4907
|
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
4908
4908
|
var Logger = {
|
|
4909
|
-
setLogger: (
|
|
4909
|
+
setLogger: (logger15) => setDefaultLogger(logger15),
|
|
4910
4910
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
4911
4911
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
4912
4912
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -4914,8 +4914,8 @@ var Logger = {
|
|
|
4914
4914
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
4915
4915
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
4916
4916
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
4917
|
-
useTemplate: (
|
|
4918
|
-
if (
|
|
4917
|
+
useTemplate: (logger15) => {
|
|
4918
|
+
if (logger15) return createTemplateLogger(createBaseLogger("", logger15));
|
|
4919
4919
|
return createTemplateLogger();
|
|
4920
4920
|
}
|
|
4921
4921
|
};
|
|
@@ -6244,8 +6244,147 @@ var watermarkifyScreenshotBuffer = async (buffer, meta, page = null) => {
|
|
|
6244
6244
|
return await composeScreenshotBufferWithBrowser(page, buffer, overlaySvg, imageInfo);
|
|
6245
6245
|
};
|
|
6246
6246
|
|
|
6247
|
+
// src/internals/screenshot-compression.js
|
|
6248
|
+
import { Jimp, JimpMime, ResizeStrategy } from "jimp";
|
|
6249
|
+
var logger13 = createInternalLogger("ScreenshotCompression");
|
|
6250
|
+
var DEFAULT_SCREENSHOT_MAX_BYTES = 8 * 1024 * 1024;
|
|
6251
|
+
var DEFAULT_SCREENSHOT_OUTPUT_TYPE = "jpeg";
|
|
6252
|
+
var DEFAULT_SCREENSHOT_QUALITY = 0.72;
|
|
6253
|
+
var DEFAULT_SCREENSHOT_MIN_QUALITY = 0.38;
|
|
6254
|
+
var DEFAULT_SCREENSHOT_MIN_SCALE = 0.25;
|
|
6255
|
+
var SUPPORTED_SCREENSHOT_OUTPUT_TYPES = /* @__PURE__ */ new Set(["jpeg"]);
|
|
6256
|
+
var toPositiveInteger = (value, fallback = 0) => {
|
|
6257
|
+
const number = Math.floor(Number(value) || 0);
|
|
6258
|
+
return number > 0 ? number : fallback;
|
|
6259
|
+
};
|
|
6260
|
+
var normalizeQuality2 = (value, fallback) => {
|
|
6261
|
+
const number = Number(value);
|
|
6262
|
+
if (!Number.isFinite(number) || number <= 0) return fallback;
|
|
6263
|
+
const normalized = number > 1 ? number / 100 : number;
|
|
6264
|
+
return Math.min(1, Math.max(0.01, normalized));
|
|
6265
|
+
};
|
|
6266
|
+
var normalizeScale = (value, fallback) => {
|
|
6267
|
+
const number = Number(value);
|
|
6268
|
+
if (!Number.isFinite(number) || number <= 0) return fallback;
|
|
6269
|
+
return Math.min(1, Math.max(0.05, number));
|
|
6270
|
+
};
|
|
6271
|
+
var normalizeScreenshotOutputType = (value) => {
|
|
6272
|
+
const raw = String(value || DEFAULT_SCREENSHOT_OUTPUT_TYPE).trim().toLowerCase();
|
|
6273
|
+
const normalized = raw === "jpg" ? "jpeg" : raw;
|
|
6274
|
+
return SUPPORTED_SCREENSHOT_OUTPUT_TYPES.has(normalized) ? normalized : DEFAULT_SCREENSHOT_OUTPUT_TYPE;
|
|
6275
|
+
};
|
|
6276
|
+
var getBase64BytesFromBuffer = (buffer) => Math.ceil(buffer.length / 3) * 4;
|
|
6277
|
+
var toJpegQuality = (value) => Math.round(normalizeQuality2(value, DEFAULT_SCREENSHOT_QUALITY) * 100);
|
|
6278
|
+
var resolveCaptureScreenCompression = (options = {}) => {
|
|
6279
|
+
const explicit = options.compression;
|
|
6280
|
+
const source = explicit && typeof explicit === "object" && !Array.isArray(explicit) ? explicit : {};
|
|
6281
|
+
const enabled = explicit !== false && source.enabled !== false && options.compress !== false;
|
|
6282
|
+
const quality = normalizeQuality2(
|
|
6283
|
+
source.quality ?? options.quality,
|
|
6284
|
+
DEFAULT_SCREENSHOT_QUALITY
|
|
6285
|
+
);
|
|
6286
|
+
const minQuality = Math.min(
|
|
6287
|
+
quality,
|
|
6288
|
+
normalizeQuality2(source.minQuality ?? options.minQuality, DEFAULT_SCREENSHOT_MIN_QUALITY)
|
|
6289
|
+
);
|
|
6290
|
+
return {
|
|
6291
|
+
enabled,
|
|
6292
|
+
maxBytes: toPositiveInteger(
|
|
6293
|
+
source.maxBytes ?? source.maxBase64Bytes ?? options.maxBytes ?? options.maxBase64Bytes,
|
|
6294
|
+
DEFAULT_SCREENSHOT_MAX_BYTES
|
|
6295
|
+
),
|
|
6296
|
+
outputType: normalizeScreenshotOutputType(
|
|
6297
|
+
source.type ?? source.outputType ?? options.type ?? options.outputType
|
|
6298
|
+
),
|
|
6299
|
+
quality,
|
|
6300
|
+
minQuality,
|
|
6301
|
+
minScale: normalizeScale(
|
|
6302
|
+
source.minScale ?? options.minScale,
|
|
6303
|
+
DEFAULT_SCREENSHOT_MIN_SCALE
|
|
6304
|
+
)
|
|
6305
|
+
};
|
|
6306
|
+
};
|
|
6307
|
+
var encodeJpeg = async (sourceImage, compression, scale, quality) => {
|
|
6308
|
+
const width = Math.max(1, Math.round(sourceImage.bitmap.width * scale));
|
|
6309
|
+
const height = Math.max(1, Math.round(sourceImage.bitmap.height * scale));
|
|
6310
|
+
const image = sourceImage.clone();
|
|
6311
|
+
if (scale < 0.999) {
|
|
6312
|
+
image.resize({
|
|
6313
|
+
w: width,
|
|
6314
|
+
h: height,
|
|
6315
|
+
mode: ResizeStrategy.BILINEAR
|
|
6316
|
+
});
|
|
6317
|
+
}
|
|
6318
|
+
const buffer = await image.getBuffer(JimpMime.jpeg, { quality });
|
|
6319
|
+
return {
|
|
6320
|
+
buffer,
|
|
6321
|
+
bytes: getBase64BytesFromBuffer(buffer),
|
|
6322
|
+
width,
|
|
6323
|
+
height,
|
|
6324
|
+
quality,
|
|
6325
|
+
scale: Number(scale.toFixed(3)),
|
|
6326
|
+
format: compression.outputType
|
|
6327
|
+
};
|
|
6328
|
+
};
|
|
6329
|
+
var compressScreenshotBuffer = async (buffer, compression) => {
|
|
6330
|
+
const sourceImage = await Jimp.read(buffer);
|
|
6331
|
+
const maxQuality = toJpegQuality(compression.quality);
|
|
6332
|
+
const minQuality = Math.min(maxQuality, toJpegQuality(compression.minQuality));
|
|
6333
|
+
let quality = maxQuality;
|
|
6334
|
+
let scale = 1;
|
|
6335
|
+
let smallest = null;
|
|
6336
|
+
for (let attempt = 0; attempt < 12; attempt += 1) {
|
|
6337
|
+
const candidate = await encodeJpeg(sourceImage, compression, scale, quality);
|
|
6338
|
+
if (!smallest || candidate.bytes < smallest.bytes) {
|
|
6339
|
+
smallest = candidate;
|
|
6340
|
+
}
|
|
6341
|
+
if (candidate.bytes <= compression.maxBytes) {
|
|
6342
|
+
return { ...candidate, withinLimit: true };
|
|
6343
|
+
}
|
|
6344
|
+
if (quality > minQuality) {
|
|
6345
|
+
quality = Math.max(minQuality, Math.floor(quality * 0.75));
|
|
6346
|
+
continue;
|
|
6347
|
+
}
|
|
6348
|
+
const ratio = Math.sqrt(compression.maxBytes / Math.max(1, candidate.bytes));
|
|
6349
|
+
const nextScale = Math.max(
|
|
6350
|
+
compression.minScale,
|
|
6351
|
+
Math.min(scale * 0.85, scale * ratio * 0.94)
|
|
6352
|
+
);
|
|
6353
|
+
if (nextScale >= scale * 0.99 || scale <= compression.minScale) {
|
|
6354
|
+
break;
|
|
6355
|
+
}
|
|
6356
|
+
scale = nextScale;
|
|
6357
|
+
}
|
|
6358
|
+
const finalCandidate = await encodeJpeg(sourceImage, compression, compression.minScale, minQuality);
|
|
6359
|
+
const fallback = !smallest || finalCandidate.bytes < smallest.bytes ? finalCandidate : smallest;
|
|
6360
|
+
return { ...fallback, withinLimit: fallback.bytes <= compression.maxBytes };
|
|
6361
|
+
};
|
|
6362
|
+
var compressScreenshotBufferToBase64 = async (buffer, compression) => {
|
|
6363
|
+
const originalBytes = getBase64BytesFromBuffer(buffer);
|
|
6364
|
+
if (!compression.enabled || originalBytes <= compression.maxBytes) {
|
|
6365
|
+
return buffer.toString("base64");
|
|
6366
|
+
}
|
|
6367
|
+
const result = await compressScreenshotBuffer(buffer, compression).catch((error) => {
|
|
6368
|
+
logger13.warning(`captureScreen \u538B\u7F29\u5931\u8D25\uFF0C\u8FD4\u56DE\u539F\u56FE: ${error instanceof Error ? error.message : String(error)}`);
|
|
6369
|
+
return null;
|
|
6370
|
+
});
|
|
6371
|
+
if (!result?.buffer) {
|
|
6372
|
+
return buffer.toString("base64");
|
|
6373
|
+
}
|
|
6374
|
+
if (result.withinLimit) {
|
|
6375
|
+
logger13.info(
|
|
6376
|
+
`captureScreen \u5DF2\u538B\u7F29: ${originalBytes} -> ${result.bytes} bytes, format=${result.format}, quality=${result.quality}, scale=${result.scale}, size=${result.width}x${result.height}`
|
|
6377
|
+
);
|
|
6378
|
+
} else {
|
|
6379
|
+
logger13.warning(
|
|
6380
|
+
`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}`
|
|
6381
|
+
);
|
|
6382
|
+
}
|
|
6383
|
+
return result.buffer.toString("base64");
|
|
6384
|
+
};
|
|
6385
|
+
|
|
6247
6386
|
// src/share.js
|
|
6248
|
-
var
|
|
6387
|
+
var logger14 = createInternalLogger("Share");
|
|
6249
6388
|
var DEFAULT_TIMEOUT_MS2 = 50 * 1e3;
|
|
6250
6389
|
var DEFAULT_PAYLOAD_SNAPSHOT_MAX_LEN = 500;
|
|
6251
6390
|
var DEFAULT_POLL_INTERVAL_MS = 120;
|
|
@@ -6382,7 +6521,7 @@ var createDomShareMonitor = async (page, options = {}) => {
|
|
|
6382
6521
|
const onMatch = typeof options.onMatch === "function" ? options.onMatch : null;
|
|
6383
6522
|
const onTelemetry = typeof options.onTelemetry === "function" ? options.onTelemetry : null;
|
|
6384
6523
|
let matched = false;
|
|
6385
|
-
|
|
6524
|
+
logger14.info(`DOM \u76D1\u542C\u51C6\u5907\u6302\u8F7D: selectors=${toJsonInline(selectors, 120)}, mode=${mode}`);
|
|
6386
6525
|
const monitor = await Mutation.useMonitor(page, selectors, {
|
|
6387
6526
|
mode,
|
|
6388
6527
|
onMutation: (context = {}) => {
|
|
@@ -6400,12 +6539,12 @@ ${text}`;
|
|
|
6400
6539
|
});
|
|
6401
6540
|
}
|
|
6402
6541
|
if (mutationCount <= 5 || mutationCount % 50 === 0) {
|
|
6403
|
-
|
|
6542
|
+
logger14.info(`DOM \u53D8\u5316\u5DF2\u6355\u83B7: mutationCount=${mutationCount}, mutationNodes=${mutationNodes.length}`);
|
|
6404
6543
|
}
|
|
6405
6544
|
const [candidate] = Utils.parseLinks(rawDom, { prefix }) || [];
|
|
6406
6545
|
if (!candidate) return;
|
|
6407
6546
|
matched = true;
|
|
6408
|
-
|
|
6547
|
+
logger14.success("captureLink.domHit", `DOM \u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: mutationCount=${mutationCount}, link=${candidate}`);
|
|
6409
6548
|
if (onMatch) {
|
|
6410
6549
|
onMatch({
|
|
6411
6550
|
link: candidate,
|
|
@@ -6421,7 +6560,7 @@ ${text}`;
|
|
|
6421
6560
|
return {
|
|
6422
6561
|
stop: async () => {
|
|
6423
6562
|
const result = await monitor.stop();
|
|
6424
|
-
|
|
6563
|
+
logger14.info(`DOM \u76D1\u542C\u5DF2\u505C\u6B62: totalMutations=${result?.totalMutations || 0}`);
|
|
6425
6564
|
return result;
|
|
6426
6565
|
}
|
|
6427
6566
|
};
|
|
@@ -6461,8 +6600,8 @@ var Share = {
|
|
|
6461
6600
|
if (share.mode === "response" && apiMatchers.length === 0) {
|
|
6462
6601
|
throw new Error("Share.captureLink requires share.xurl[0] api matcher when mode=response");
|
|
6463
6602
|
}
|
|
6464
|
-
|
|
6465
|
-
|
|
6603
|
+
logger14.start("captureLink", `mode=${share.mode}, timeoutMs=${timeoutMs}, prefix=${share.prefix}`);
|
|
6604
|
+
logger14.info(`captureLink \u914D\u7F6E: xurl=${toJsonInline(share.xurl)}, domMode=${domMode}, domSelectors=${toJsonInline(domSelectors, 120)}`);
|
|
6466
6605
|
const stats = {
|
|
6467
6606
|
actionTimedOut: false,
|
|
6468
6607
|
domMutationCount: 0,
|
|
@@ -6487,7 +6626,7 @@ var Share = {
|
|
|
6487
6626
|
link: validated,
|
|
6488
6627
|
payloadText: String(payloadText || "")
|
|
6489
6628
|
};
|
|
6490
|
-
|
|
6629
|
+
logger14.info(`\u5019\u9009\u94FE\u63A5\u5DF2\u786E\u8BA4: source=${source}, link=${validated}`);
|
|
6491
6630
|
return true;
|
|
6492
6631
|
};
|
|
6493
6632
|
const resolveResponseCandidate = (responseText) => {
|
|
@@ -6522,7 +6661,7 @@ var Share = {
|
|
|
6522
6661
|
try {
|
|
6523
6662
|
await monitor.stop();
|
|
6524
6663
|
} catch (error) {
|
|
6525
|
-
|
|
6664
|
+
logger14.warning(`\u505C\u6B62 DOM \u76D1\u542C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
|
|
6526
6665
|
}
|
|
6527
6666
|
};
|
|
6528
6667
|
const onResponse = async (response) => {
|
|
@@ -6535,29 +6674,29 @@ var Share = {
|
|
|
6535
6674
|
stats.responseSampleUrls.push(url);
|
|
6536
6675
|
}
|
|
6537
6676
|
if (stats.responseObserved <= 5) {
|
|
6538
|
-
|
|
6677
|
+
logger14.info(`\u63A5\u53E3\u54CD\u5E94\u91C7\u6837(${stats.responseObserved}): ${url}`);
|
|
6539
6678
|
}
|
|
6540
6679
|
if (!apiMatchers.some((matcher) => url.includes(matcher))) return;
|
|
6541
6680
|
stats.responseMatched += 1;
|
|
6542
6681
|
stats.lastMatchedUrl = url;
|
|
6543
|
-
|
|
6682
|
+
logger14.info(`\u63A5\u53E3\u547D\u4E2D\u5339\u914D(${stats.responseMatched}): ${url}`);
|
|
6544
6683
|
const text = await response.text();
|
|
6545
6684
|
const hit = resolveResponseCandidate(text);
|
|
6546
6685
|
if (!hit?.link) {
|
|
6547
6686
|
if (stats.responseMatched <= 3) {
|
|
6548
|
-
|
|
6687
|
+
logger14.info(`\u63A5\u53E3\u89E3\u6790\u5B8C\u6210\u4F46\u672A\u63D0\u53D6\u5230\u5206\u4EAB\u94FE\u63A5: payloadSize=${text.length}`);
|
|
6549
6688
|
}
|
|
6550
6689
|
return;
|
|
6551
6690
|
}
|
|
6552
6691
|
stats.responseResolved += 1;
|
|
6553
|
-
|
|
6692
|
+
logger14.success("captureLink.responseHit", `\u63A5\u53E3\u547D\u4E2D\u5206\u4EAB\u94FE\u63A5: url=${url}, link=${hit.link}`);
|
|
6554
6693
|
setCandidate("response", hit.link, hit.payloadText);
|
|
6555
6694
|
} catch (error) {
|
|
6556
|
-
|
|
6695
|
+
logger14.warning(`\u63A5\u53E3\u54CD\u5E94\u5904\u7406\u5F02\u5E38: ${error instanceof Error ? error.message : String(error)}`);
|
|
6557
6696
|
}
|
|
6558
6697
|
};
|
|
6559
6698
|
if (share.mode === "dom") {
|
|
6560
|
-
|
|
6699
|
+
logger14.info("\u5F53\u524D\u4E3A DOM \u6A21\u5F0F\uFF0C\u4EC5\u542F\u7528 DOM \u76D1\u542C");
|
|
6561
6700
|
domMonitor = await createDomShareMonitor(page, {
|
|
6562
6701
|
prefix: share.prefix,
|
|
6563
6702
|
selectors: domSelectors,
|
|
@@ -6572,14 +6711,14 @@ var Share = {
|
|
|
6572
6711
|
});
|
|
6573
6712
|
}
|
|
6574
6713
|
if (share.mode === "response") {
|
|
6575
|
-
|
|
6714
|
+
logger14.info(`\u5F53\u524D\u4E3A\u63A5\u53E3\u6A21\u5F0F\uFF0C\u6302\u8F7D response \u76D1\u542C: apiMatchers=${toJsonInline(apiMatchers, 160)}`);
|
|
6576
6715
|
page.on("response", onResponse);
|
|
6577
6716
|
}
|
|
6578
6717
|
const deadline = Date.now() + timeoutMs;
|
|
6579
6718
|
const getRemainingMs = () => Math.max(0, deadline - Date.now());
|
|
6580
6719
|
try {
|
|
6581
6720
|
const actionTimeout = getRemainingMs();
|
|
6582
|
-
|
|
6721
|
+
logger14.start("captureLink.performActions", `\u6267\u884C\u52A8\u4F5C\u9884\u7B97=${actionTimeout}ms`);
|
|
6583
6722
|
if (actionTimeout > 0) {
|
|
6584
6723
|
let timer = null;
|
|
6585
6724
|
let actionError = null;
|
|
@@ -6593,21 +6732,21 @@ var Share = {
|
|
|
6593
6732
|
const actionResult = await Promise.race([actionPromise, timeoutPromise]);
|
|
6594
6733
|
if (timer) clearTimeout(timer);
|
|
6595
6734
|
if (actionResult === "__ACTION_ERROR__") {
|
|
6596
|
-
|
|
6735
|
+
logger14.fail("captureLink.performActions", actionError);
|
|
6597
6736
|
throw actionError;
|
|
6598
6737
|
}
|
|
6599
6738
|
if (actionResult === "__ACTION_TIMEOUT__") {
|
|
6600
6739
|
stats.actionTimedOut = true;
|
|
6601
|
-
|
|
6740
|
+
logger14.warning(`performActions \u5DF2\u8D85\u65F6 (${actionTimeout}ms)\uFF0C\u52A8\u4F5C\u53EF\u80FD\u4ECD\u5728\u5F02\u6B65\u6267\u884C`);
|
|
6602
6741
|
} else {
|
|
6603
|
-
|
|
6742
|
+
logger14.success("captureLink.performActions", "\u6267\u884C\u52A8\u4F5C\u5B8C\u6210");
|
|
6604
6743
|
}
|
|
6605
6744
|
}
|
|
6606
6745
|
let nextProgressLogTs = Date.now() + 3e3;
|
|
6607
6746
|
while (true) {
|
|
6608
6747
|
const selected = share.mode === "dom" ? candidates.dom : candidates.response;
|
|
6609
6748
|
if (selected?.link) {
|
|
6610
|
-
|
|
6749
|
+
logger14.success("captureLink", `\u6355\u83B7\u6210\u529F: source=${share.mode}, link=${selected.link}`);
|
|
6611
6750
|
return {
|
|
6612
6751
|
link: selected.link,
|
|
6613
6752
|
payloadText: selected.payloadText,
|
|
@@ -6619,7 +6758,7 @@ var Share = {
|
|
|
6619
6758
|
if (remaining <= 0) break;
|
|
6620
6759
|
const now = Date.now();
|
|
6621
6760
|
if (now >= nextProgressLogTs) {
|
|
6622
|
-
|
|
6761
|
+
logger14.info(
|
|
6623
6762
|
`captureLink \u7B49\u5F85\u4E2D: remaining=${remaining}ms, domMutationCount=${stats.domMutationCount}, responseMatched=${stats.responseMatched}`
|
|
6624
6763
|
);
|
|
6625
6764
|
nextProgressLogTs = now + 5e3;
|
|
@@ -6627,11 +6766,11 @@ var Share = {
|
|
|
6627
6766
|
await delay2(Math.max(0, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)));
|
|
6628
6767
|
}
|
|
6629
6768
|
if (share.mode === "response" && stats.responseMatched === 0) {
|
|
6630
|
-
|
|
6769
|
+
logger14.warning(
|
|
6631
6770
|
`\u63A5\u53E3\u76D1\u542C\u672A\u547D\u4E2D: apiMatchers=${toJsonInline(apiMatchers, 220)}, \u54CD\u5E94\u6837\u672CURLs=${toJsonInline(stats.responseSampleUrls, 420)}`
|
|
6632
6771
|
);
|
|
6633
6772
|
}
|
|
6634
|
-
|
|
6773
|
+
logger14.warning(
|
|
6635
6774
|
`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"}`
|
|
6636
6775
|
);
|
|
6637
6776
|
return {
|
|
@@ -6643,7 +6782,7 @@ var Share = {
|
|
|
6643
6782
|
} finally {
|
|
6644
6783
|
if (share.mode === "response") {
|
|
6645
6784
|
page.off("response", onResponse);
|
|
6646
|
-
|
|
6785
|
+
logger14.info("response \u76D1\u542C\u5DF2\u5378\u8F7D");
|
|
6647
6786
|
}
|
|
6648
6787
|
await stopDomMonitor();
|
|
6649
6788
|
}
|
|
@@ -6656,7 +6795,10 @@ var Share = {
|
|
|
6656
6795
|
* @param {number} [options.buffer]
|
|
6657
6796
|
* @param {boolean} [options.restore]
|
|
6658
6797
|
* @param {number} [options.maxHeight]
|
|
6659
|
-
* @
|
|
6798
|
+
* @param {number} [options.maxBytes] 默认 8MiB,返回 base64 超过后会压缩
|
|
6799
|
+
* @param {'jpeg'|'jpg'} [options.type] 压缩输出格式,默认 jpeg
|
|
6800
|
+
* @param {boolean|Object} [options.compression] 传 false 可关闭压缩
|
|
6801
|
+
* @returns {Promise<string>} base64 image
|
|
6660
6802
|
*/
|
|
6661
6803
|
async captureScreen(page, options = {}) {
|
|
6662
6804
|
const originalViewport = await resolveCurrentViewportSize(page);
|
|
@@ -6665,6 +6807,7 @@ var Share = {
|
|
|
6665
6807
|
const restore = options.restore ?? false;
|
|
6666
6808
|
const maxHeight = options.maxHeight ?? 8e3;
|
|
6667
6809
|
const screenshotWatermarkify = resolveCaptureScreenWatermarkify(page, options.watermarkify);
|
|
6810
|
+
const compression = resolveCaptureScreenCompression(options);
|
|
6668
6811
|
try {
|
|
6669
6812
|
const maxScrollHeight = await page.evaluate(() => {
|
|
6670
6813
|
let maxHeight2 = document.body.scrollHeight;
|
|
@@ -6698,15 +6841,15 @@ var Share = {
|
|
|
6698
6841
|
type: "png",
|
|
6699
6842
|
maxClipHeight: targetHeight
|
|
6700
6843
|
});
|
|
6701
|
-
|
|
6702
|
-
|
|
6844
|
+
let outputBuffer = rawBuffer;
|
|
6845
|
+
if (screenshotWatermarkify.enabled) {
|
|
6846
|
+
const watermarkifyMeta = await resolveScreenshotWatermarkifyMeta(page, {
|
|
6847
|
+
...screenshotWatermarkify,
|
|
6848
|
+
capturedAt
|
|
6849
|
+
});
|
|
6850
|
+
outputBuffer = await watermarkifyScreenshotBuffer(rawBuffer, watermarkifyMeta, page);
|
|
6703
6851
|
}
|
|
6704
|
-
|
|
6705
|
-
...screenshotWatermarkify,
|
|
6706
|
-
capturedAt
|
|
6707
|
-
});
|
|
6708
|
-
const buffer_ = await watermarkifyScreenshotBuffer(rawBuffer, watermarkifyMeta, page);
|
|
6709
|
-
return buffer_.toString("base64");
|
|
6852
|
+
return await compressScreenshotBufferToBase64(outputBuffer, compression);
|
|
6710
6853
|
} finally {
|
|
6711
6854
|
if (restore) {
|
|
6712
6855
|
await page.evaluate(() => {
|