channel-worker 2.5.122 → 2.5.123

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "channel-worker",
3
- "version": "2.5.122",
3
+ "version": "2.5.123",
4
4
  "description": "Channel Manager worker daemon — runs on remote machines to execute video pipeline jobs",
5
5
  "main": "lib/daemon.js",
6
6
  "bin": {
@@ -640,7 +640,34 @@ async function isCustomThumbApplied(page) {
640
640
  if (/Gỡ hình thu nhỏ tùy chỉnh|Remove( your)? custom thumbnail/i.test(al) && vis(el)) return true;
641
641
  }
642
642
  return false;
643
- }).catch(() => false);
643
+ // `null` = KHÔNG ĐO ĐƯỢC (page.evaluate ném giữa lúc FB dựng lại panel).
644
+ // Bản cũ nuốt thành `false` = "không có thumb", và một mẫu đơn lẻ như thế
645
+ // được quyền bấm Hủy = GỠ ảnh bìa vừa dán. Xem thumbVerdict().
646
+ }).catch(() => null);
647
+ }
648
+
649
+ // Một lần đo KHÔNG được quyết định hành động PHÁ. Đo trên log prod 20/09/2026:
650
+ // trong 152 lượt "hết giờ chờ hộp ảnh bìa đóng", 138 lượt đo thấy thumb đang
651
+ // áp rồi đăng bình thường, còn 14 lượt mẫu CUỐI trả "không áp" (trong khi suốt
652
+ // vòng chờ trước đó mẫu nào cũng "đang áp") → rơi vào nhánh ESC+Hủy, gỡ mất
653
+ // ảnh bìa, rồi chết ở cổng "Custom thumbnail required but not applied".
654
+ // 'applied' — có ít nhất một mẫu thấy nút "Gỡ hình thu nhỏ tùy chỉnh"
655
+ // 'unknown' — không mẫu nào thấy, nhưng có mẫu đo hỏng
656
+ // 'absent' — mọi mẫu đo được và đều không thấy
657
+ function thumbVerdict(samples) {
658
+ const list = Array.isArray(samples) ? samples : [];
659
+ if (list.some((s) => s === true)) return 'applied';
660
+ if (list.some((s) => s === null || s === undefined)) return 'unknown';
661
+ return 'absent';
662
+ }
663
+
664
+ async function sampleCustomThumb(page, { samples = 3, gapMs = 1500 } = {}) {
665
+ const out = [];
666
+ for (let i = 0; i < samples; i++) {
667
+ if (i) await pause(page, gapMs);
668
+ out.push(await isCustomThumbApplied(page));
669
+ }
670
+ return { verdict: thumbVerdict(out), samples: out };
644
671
  }
645
672
 
646
673
  // Composer đang ở trạng thái gì? Đọc từ CHỮ trong hộp thoại — ba chữ ký nhìn
@@ -2136,6 +2163,7 @@ async function runOnce({ page, payload, log }) {
2136
2163
  // doesn't close within 12s of polling, RE-CLICK Lưu (in case
2137
2164
  // the first click didn't register because the button was
2138
2165
  // disabled while FB was still hashing the upload).
2166
+ let thumbTimeoutSt = { verdict: 'unknown', samples: [] };
2139
2167
  const closeDeadline = Date.now() + 60_000;
2140
2168
  let modalClosed = false;
2141
2169
  let closedPolls = 0;
@@ -2230,7 +2258,11 @@ async function runOnce({ page, payload, log }) {
2230
2258
  }
2231
2259
  thumbApplied = true;
2232
2260
  log('info', `[fb-pw] page-wall thumb — modal closed after save (retries=${retryCount})`);
2233
- } else if (await isCustomThumbApplied(page)) {
2261
+ } else if (await (async () => {
2262
+ // Giữ kết quả đo để ghi vào log: bằng chứng vì sao KHÔNG Hủy.
2263
+ thumbTimeoutSt = await sampleCustomThumb(page);
2264
+ return thumbTimeoutSt.verdict !== 'absent';
2265
+ })()) {
2234
2266
  // Hết giờ chờ đóng nhưng bằng chứng áp thumb còn đó — tuyệt
2235
2267
  // đối không ESC/Hủy (Hủy trên panel này là GỠ thumb).
2236
2268
  //
@@ -2241,10 +2273,10 @@ async function runOnce({ page, payload, log }) {
2241
2273
  // "Custom thumbnail required but not applied" (đo 04/09/2026,
2242
2274
  // 3 lượt liên tiếp, log ghi rõ variant=modal). Nút "Gỡ" là
2243
2275
  // bằng chứng vật lý thumb đang áp, biến thể nào cũng đúng.
2244
- log('info', `[fb-pw] page-wall thumb — hết giờ chờ đóng nhưng nút "Gỡ hình thu nhỏ" đang hiện (variant=${thumbEditorVia}) → giữ panel, coi như dán xong`);
2276
+ log('info', `[fb-pw] page-wall thumb — hết giờ chờ đóng, đo 3 nhịp ${JSON.stringify(thumbTimeoutSt.samples)} → ${thumbTimeoutSt.verdict} (variant=${thumbEditorVia}) → giữ panel, coi như dán xong, KHÔNG Hủy`);
2245
2277
  thumbApplied = true;
2246
2278
  } else {
2247
- log('warn', '[fb-pw] page-wall thumb — modal still open 60s after Lưu click; trying ESC + click Hủy fallback');
2279
+ log('warn', `[fb-pw] page-wall thumb — modal still open 60s after Lưu click, đo 3 nhịp ${JSON.stringify(thumbTimeoutSt.samples)} → CHẮC CHẮN chưa áp; ESC + click Hủy fallback`);
2248
2280
  // Chụp lại trước khi ESC/Hủy: đây là nhánh phá lượt nhiều
2249
2281
  // nhất mà lại không có ảnh nào để soi (04/09/2026).
2250
2282
  await dumpFailure(page, 'thumb-modal-stuck-before-cancel', log);
@@ -2625,8 +2657,9 @@ async function runOnce({ page, payload, log }) {
2625
2657
  // customThumbDone lỡ false trong khi nút "Gỡ hình thu nhỏ tùy chỉnh"
2626
2658
  // ngay trên bước này chứng minh thumb ĐANG được áp — cả 5 lượt fail
2627
2659
  // 02-03/09 của idea 6a965a32 đều ở trạng thái này (diag 158386).
2628
- if (await isCustomThumbApplied(page)) {
2629
- log('info', '[fb-pw] pre-publish: nút "Gỡ hình thu nhỏ tùy chỉnh" đang hiện — thumb đã áp dù cờ chưa bật, tiếp tục đăng');
2660
+ const gateSt = await sampleCustomThumb(page);
2661
+ if (gateSt.verdict === 'applied') {
2662
+ log('info', `[fb-pw] pre-publish: nút "Gỡ hình thu nhỏ tùy chỉnh" đang hiện (${JSON.stringify(gateSt.samples)}) — thumb đã áp dù cờ chưa bật, tiếp tục đăng`);
2630
2663
  customThumbDone = true;
2631
2664
  } else {
2632
2665
  // Defensive: we normally fail at the caption step (before any Tiếp)
@@ -3501,6 +3534,9 @@ module.exports = { run };
3501
3534
  // Exposed so the overlay-click escalation can be exercised against a synthetic
3502
3535
  // page (toast covering the CTA) without driving the whole upload flow.
3503
3536
  module.exports.__testables = {
3537
+ // Phán quyết "ảnh bìa đã áp chưa" từ nhiều mẫu đo — một mẫu đo hỏng không
3538
+ // được biến thành "chưa áp" rồi kéo theo hành động PHÁ (Hủy = gỡ ảnh bìa).
3539
+ thumbVerdict,
3504
3540
  // Dùng chung cho comment_facebook: script nào trượt giữa chừng cũng cần chụp
3505
3541
  // lại màn hình, viết bản thứ hai là sớm muộn hai bên lệch nhau.
3506
3542
  dumpFailure,