diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 1940611..68a3f60 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -94,9 +94,21 @@ if we hit a peer that requires it. the tunnel. Negative tests confirm: plaintext connection fails, wrong-CA client cert fails. -## Phase 7 — unfeed integration +## Phase 7 — unfeed integration ✅ -- `ErlangDistTransport` implementing unfeed's `WalletTransport` Protocol -- Maps `/v1/health`, `/v1/address`, ... to gen_call requests -- `unfeed` deploys with a config switch: `wallet_transport = http | erldist` -- Cutover after a soak period on staging +- `ErlangDistTransport` lives in `unfeed/wallet.py` (not erldistpy + itself — keeps erldistpy app-agnostic) +- Implements `WalletTransport` Protocol via `erldistpy.Node.call` +- Wraps each HTTP-shape `(method, path, json, params)` into a single + `{:unfeed_rpc, Method, Path, JsonBody, Params}` gen_server request +- Reply translation: atoms/binaries → str, nested maps/lists recurse +- Error mapping: `{:error, code, msg, retryable}` → `WalletBridgeError`; + `CallTimeout` → `bridge_timeout`; `NodeError` → `bridge_unreachable` +- Selected per-deploy via `unfeed.wallet_transport = http | erldist` +- Optional TLS dist by setting `wallet_node_tls_*` config keys +- 11 tests in unfeed/tests/test_wallet_erldist.py mock `Node.call` + and verify the full request/reply contract + +The Elixir-side gen_server (`wallet_rpc`) doesn't exist yet — it's +the next ticket on the Elixir wallet bridge side. Once it lands and a +staging deploy stays healthy, flip the production switch.