076914e5b7
- Split client, native, remote, serve, markdown, and SDK internals into focused packages with direct imports. - Move local and remote transport framing/protocol helpers behind clearer module boundaries. - Break up the extension injected DOM logic into a separate content dispatch bundle and dedicated content modules. - Add explicit client handling for passive remote discovery without noisy PQ warnings. - Keep behavior covered with updated unit, integration, and extension tests.
31 lines
781 B
Python
31 lines
781 B
Python
"""Chrome Native Messaging stdio protocol helpers."""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import struct
|
|
|
|
def read_exact_stream(stream, n: int) -> bytes | None:
|
|
buf = b""
|
|
while len(buf) < n:
|
|
chunk = stream.read(n - len(buf))
|
|
if not chunk:
|
|
return None
|
|
buf += chunk
|
|
return buf
|
|
|
|
def read_native_message(stream) -> dict | None:
|
|
raw_len = read_exact_stream(stream, 4)
|
|
if raw_len is None:
|
|
return None
|
|
msg_len = struct.unpack("<I", raw_len)[0]
|
|
data = read_exact_stream(stream, msg_len)
|
|
if data is None:
|
|
return None
|
|
return json.loads(data.decode("utf-8"))
|
|
|
|
def write_native_message(stream, msg: dict) -> None:
|
|
data = json.dumps(msg).encode("utf-8")
|
|
stream.write(struct.pack("<I", len(data)))
|
|
stream.write(data)
|
|
stream.flush()
|