Migrated from https://git2.unturf.com/python/erldistpy.git
handshake(sock, our_name=..., cookie=...) drives the OTP 23+ dance over a 2-byte length-prefixed frame stream: send_name (N) client -> server recv_status (s) server -> client recv_challenge (N) server -> client challenge_reply (r) client -> server challenge_ack (a) server -> client Cookie digest formula md5(cookie ++ integer_to_list(challenge)) was cross-checked against erlang:md5/1 output as a test reference. Distribution flags in erldistpy/flags.py advertise the minimum useful set: extended refs/pids, new fun tags, utf8 atoms, maps, big creation, v6 handshake, unlink id, v4 node containers. 86 tests green: frame builders + parsers as pure functions, digest reference, full live handshake against `erl -sname -setcookie`, and a wrong-cookie rejection test. Newer SHA-256 digest (DFLAG_MANDATORY_25_DIGEST) deferred until a peer requires it. |
||
|---|---|---|
| docs | ||
| erldistpy | ||
| tests | ||
| .gitignore | ||
| LICENSE | ||
| Makefile | ||
| pyproject.toml | ||
| README.md | ||
erldistpy
Native Python client for our Erlang distribution protocol. Talk Erlang/Elixir nodes from CPython without HTTP shim layers.
Built to swap into unfeed's WalletTransport so a Python web app can call
Unsandbox.WalletRPC over native dist instead of HTTPS. Same gen_call
semantics, lower latency, fewer moving parts.
Status
Phase 0 — repo bones. See docs/ROADMAP.md for the phase plan.
Quick start
make bootstrap # create venv, install editable + dev deps
make test # run pytest
make lint # ruff check
Scope
- ETF (External Term Format) codec — encode/decode Erlang terms
- EPMD client — node name → port lookup
- Distribution handshake — cookie auth, version negotiation
- gen_call to registered processes on a remote node
- TLS dist support (Erlang
inet_tls_dist)
Out of scope: full Erlang node impersonation, link/monitor lifecycles, distributed Mnesia. We are a client, not a peer node.
Why not Pyrlang?
Pyrlang implements a full asyncio Erlang node. Heavy, asyncio-first, complex.
We need a small synchronous client that fits behind the same WalletTransport
Protocol as httpx. Different shape.
License
Unlicense (public domain).