channel-worker 1.1.4 → 1.1.6

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.
@@ -631,7 +631,7 @@ class CommandPoller {
631
631
  }
632
632
  if (!el) return null;
633
633
  const rect = el.getBoundingClientRect();
634
- return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };
634
+ return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2, tag: el.tagName, aria: (el.getAttribute('aria-label') || '').substring(0, 50), text: (el.textContent || '').trim().substring(0, 30) };
635
635
  })()
636
636
  `,
637
637
  returnByValue: true,
@@ -643,27 +643,36 @@ class CommandPoller {
643
643
  // Click with mouse
644
644
  await send('Input.dispatchMouseEvent', { type: 'mousePressed', x: pos.x, y: pos.y, button: 'left', clickCount: 1 });
645
645
  await send('Input.dispatchMouseEvent', { type: 'mouseReleased', x: pos.x, y: pos.y, button: 'left', clickCount: 1 });
646
- console.log(`[commands] Mouse clicked Upload at (${pos.x}, ${pos.y})`);
646
+ console.log(`[commands] Mouse clicked at (${pos.x}, ${pos.y}) — ${pos.tag} "${pos.aria}" "${pos.text}"`);
647
647
 
648
648
  // Wait for file chooser
649
649
  const chooserResult = await chooserPromise;
650
650
  console.log(`[commands] File chooser: ${chooserResult}`);
651
651
 
652
652
  if (chooserResult === 'opened') {
653
- // File chooser intercepted — now set file via DOM.setFileInputFiles
654
- // Find the file input that triggered the chooser
653
+ // File chooser intercepted — set file + trigger events
655
654
  const doc = await send('DOM.getDocument');
656
- const fileNode = await send('DOM.querySelector', { nodeId: doc.root.nodeId, selector: 'input[type="file"][accept*="image"]' });
657
- if (!fileNode?.nodeId) {
658
- // Fallback: any file input
659
- const fallbackNode = await send('DOM.querySelector', { nodeId: doc.root.nodeId, selector: 'input[type="file"]' });
660
- if (fallbackNode?.nodeId) {
661
- await send('DOM.setFileInputFiles', { nodeId: fallbackNode.nodeId, files: [file_path] });
662
- }
663
- } else {
664
- await send('DOM.setFileInputFiles', { nodeId: fileNode.nodeId, files: [file_path] });
655
+ let targetNode = await send('DOM.querySelector', { nodeId: doc.root.nodeId, selector: 'input[type="file"][accept*="image"]' });
656
+ if (!targetNode?.nodeId) {
657
+ targetNode = await send('DOM.querySelector', { nodeId: doc.root.nodeId, selector: 'input[type="file"]' });
658
+ }
659
+ if (targetNode?.nodeId) {
660
+ await send('DOM.setFileInputFiles', { nodeId: targetNode.nodeId, files: [file_path] });
661
+ // Trigger change/input events so React picks it up
662
+ await send('Runtime.evaluate', {
663
+ expression: `
664
+ const inputs = document.querySelectorAll('input[type="file"]');
665
+ inputs.forEach(inp => {
666
+ inp.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
667
+ inp.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
668
+ });
669
+ 'triggered'
670
+ `,
671
+ });
665
672
  }
673
+ // Disable intercept + wait for Facebook to process
666
674
  await send('Page.setInterceptFileChooserDialog', { enabled: false });
675
+ await new Promise(r => setTimeout(r, 2000));
667
676
  ws.close();
668
677
  resolve({ success: true, method: 'file_chooser_intercepted' });
669
678
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "channel-worker",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
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": {