0d5c49c19a
Testing / test (push) Failing after 10m21s
- compat.py → compat/ package: auth.py (auth-field normalizers), commands.py (command-format shims), __init__.py (re-exports) - Add _auth_0_9_3 transformer: normalizes pubkey to lowercase before auth so clients < 0.9.3 sending uppercase hex are accepted - adapt_auth() now called before auth check in serve.py; command extracted after adapt_auth so future transformers can rename commands safely - serve.py: deduplicate _recv_exact (import from client), unify resp/resp_payload across Windows/Unix branches, require lowercase hex pubkey (re.fullmatch), reorganize imports, drop unused os import - client.py: move payload/framed construction inside branches (remote path no longer serializes JSON it never uses); fix _is_valid_key_spec operator precedence; import MAX_MSG_BYTES from version_manager - auth.py: narrow except clause (ValueError instead of bare Exception) - Bump version 0.9.2 → 0.9.3 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.7 KiB
Python
44 lines
1.7 KiB
Python
"""
|
|
Command-format shims — applied to clean_msg (protocol fields already stripped)
|
|
before forwarding to the native host, and to responses before sending back.
|
|
|
|
Add one entry per breaking command-format change:
|
|
("X.Y.Z", request_fn, response_fn)
|
|
|
|
- request_fn(msg: dict) -> dict or None
|
|
- response_fn(resp: bytes, command: str) -> bytes or None
|
|
|
|
Entries must stay in ascending version order.
|
|
adapt_request walks forward (oldest first); adapt_response walks backward.
|
|
|
|
Current baseline: 0.9.3 — no command-format shims needed yet.
|
|
"""
|
|
from __future__ import annotations
|
|
from typing import Callable
|
|
from browser_cli.version_manager import parse_version
|
|
|
|
|
|
# ── registry ──────────────────────────────────────────────────────────────────
|
|
|
|
_COMPAT: list[tuple[str, Callable[[dict], dict] | None, Callable[[bytes, str], bytes] | None]] = [
|
|
# ("1.0.0", _req_1_0_0, _resp_1_0_0),
|
|
]
|
|
|
|
|
|
def adapt_request(msg: dict, client_version: str) -> dict:
|
|
"""Upgrade a client message to the current browser command format."""
|
|
cv = parse_version(client_version)
|
|
for version, req_fn, _ in _COMPAT:
|
|
if cv < parse_version(version) and req_fn is not None:
|
|
msg = req_fn(msg)
|
|
return msg
|
|
|
|
|
|
def adapt_response(resp: bytes, command: str, client_version: str) -> bytes:
|
|
"""Downgrade a native-host response to the format the client expects."""
|
|
cv = parse_version(client_version)
|
|
for version, _, resp_fn in reversed(_COMPAT):
|
|
if cv < parse_version(version) and resp_fn is not None:
|
|
resp = resp_fn(resp, command)
|
|
return resp
|