diff --git a/bin/muse-chat-api.py b/bin/muse-chat-api.py index 37599db..21238fd 100755 --- a/bin/muse-chat-api.py +++ b/bin/muse-chat-api.py @@ -284,6 +284,24 @@ def cdp_call(ws, method, params=None): cdp_call.counter = 100 +def ev1(ws, expr, await_p=False): + """Runtime.evaluate that skips CDP event chatter while awaiting its + response. ev() reads a single message and can catch an event + instead (the known None-result quirk); uploads do several DOM + calls first, so chatter is likely.""" + ws.send(json.dumps({ + "id": 1, "method": "Runtime.evaluate", + "params": {"expression": expr, "returnByValue": True, + "awaitPromise": await_p} + })) + for _ in range(30): + resp = json.loads(ws.recv()) + if resp.get("id") != 1: + continue + return resp.get("result", {}).get("result", {}).get("value") + return None + + def cmd_upload(ws, filepath, message=None, dry_run=False): """Attach a file to the chat composer via CDP DOM.setFileInputFiles. @@ -327,7 +345,7 @@ def cmd_upload(ws, filepath, message=None, dry_run=False): # element's OWN text: React swaps the file input after change, so # input.files is unreliable, and innerText on ancestors over-matches. base = os.path.basename(filepath) - preview = ev(ws, """(() => { + preview = ev1(ws, """(() => { const needle = %s; const own = e => [...e.childNodes].filter(n => n.nodeType === 3) .map(n => n.nodeValue).join(''); @@ -369,7 +387,7 @@ def cmd_upload(ws, filepath, message=None, dry_run=False): })()""", True) print("send: %s" % sent) time.sleep(5) - recent = ev(ws, """(() => { + recent = ev1(ws, """(() => { const ps = [...document.querySelectorAll('p')].slice(-10) .map(p => p.innerText.slice(0,200)); return ps.join('\\n---\\n');