Use `tractor.Address` for endpoint resolution

Replace manual `layers['ipv4']['addr']` / `layers['tcp']['port']` tuple
extraction with direct `tractor.Address` objects returned from
`load_trans_eps()`. In `open_pikerd()` call `addr.unwrap()` for the
raw-tuple comparison against `root_actor.accept_addrs`.

Deats,
- `conf.toml`: update maddr prefix `/ipv4/` ->
  `/ipv/`, add commented UDS socket path example.
- `cli/__init__.py`: wrap endpoint loading in
  `maybe_open_crash_handler`, append `addr`
  objects directly to `regaddrs`.
- `ui/cli.py`: restructure `chart()` body into
  `maybe_open_crash_handler` scope, switch to
  `registry_addrs` from config, comment out the
  `network`-based `load_trans_eps` path (WIP
  `multiaddr` transition).
- `_actor_runtime.py`: use `addr.unwrap()` for
  accept-addr membership check.
- `uv.lock`: add `multiaddr >= 0.2.0` and its
  transitive deps.

(this commit msg was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
wkt/land_flake_update
Gud Boi 2026-04-13 13:40:40 -04:00
parent c347ab08ea
commit 1fde12d3fd
4 changed files with 75 additions and 71 deletions

View File

@ -1,7 +1,8 @@
[network] [network]
pikerd = [ pikerd = [
'/ipv4/127.0.0.1/tcp/6116', # std localhost daemon-actor tree '/ipv/127.0.0.1/tcp/6116', # TCP localhost loopback
# '/uds/6116', # TODO std uds socket file
# '/uds/run/user/1000/piker/pikerd@6116.sock', # UDS socket path using `multiaddr` lib!
] ]

View File

@ -161,15 +161,15 @@ def pikerd(
)] )]
else: else:
eps: dict = load_trans_eps( from tractor.devx import maybe_open_crash_handler
network, with maybe_open_crash_handler(pdb=pdb):
maddr, eps: dict[str, list] = load_trans_eps(
) network,
for layers in eps['pikerd']: maddr,
regaddrs.append(( )
layers['ipv4']['addr'], addrs: list[tractor.Address] = eps['pikerd']
layers['tcp']['port'], for addr in addrs:
)) regaddrs.append(addr)
from .. import service from .. import service

View File

@ -210,7 +210,10 @@ async def open_pikerd(
trio.open_nursery() as service_tn, trio.open_nursery() as service_tn,
): ):
for addr in reg_addrs: for addr in reg_addrs:
if addr not in root_actor.accept_addrs: uaddr: tuple = addr.unwrap()
if (
uaddr not in root_actor.accept_addrs
):
raise RuntimeError( raise RuntimeError(
f'`pikerd` failed to bind on {addr}!\n' f'`pikerd` failed to bind on {addr}!\n'
'Maybe you have another daemon already running?' 'Maybe you have another daemon already running?'

View File

@ -22,7 +22,10 @@ import os
import click import click
import tractor import tractor
from ..cli import cli from ..cli import (
cli,
load_trans_eps,
)
from .. import watchlists as wl from .. import watchlists as wl
from ..service import maybe_spawn_brokerd from ..service import maybe_spawn_brokerd
@ -159,67 +162,64 @@ def chart(
needed if not discovered via [network] config. needed if not discovered via [network] config.
''' '''
# eg. ``--profile 3`` reports profiling for anything slower then 3 ms.
if profile is not None:
from .. import _profile
_profile._pg_profile = True
_profile.ms_slower_then = float(profile)
# Qt UI entrypoint
from ._app import _main
for symbol in symbols:
if '.' not in symbol:
click.echo(click.style(
f'symbol: {symbol} must have a {symbol}.<provider> suffix',
fg='red',
))
return
# global opts
# brokernames: list[str] = config['brokers']
brokermods = config['brokermods']
assert brokermods
tractorloglevel = config['tractorloglevel']
pikerloglevel = config['loglevel']
maddrs: list[tuple[str, int]] = config.get(
'maddrs',
[],
)
# if maddrs:
# from tractor._multiaddr import parse_maddr
# for addr in maddrs:
# breakpoint()
# layers: dict = parse_maddr(addr)
regaddrs: list[tuple[str, int]] = config.get(
'registry_addrs',
[],
)
from ..config import load
conf, _ = load(
conf_name='conf',
)
network: dict = conf.get('network')
if network:
from ..cli import load_trans_eps
eps: dict = load_trans_eps(
network,
maddrs,
)
for layers in eps['pikerd']:
regaddrs.append((
layers['ipv4']['addr'],
layers['tcp']['port'],
))
# breakpoint()
from tractor.devx import maybe_open_crash_handler from tractor.devx import maybe_open_crash_handler
pdb: bool = config['pdb'] pdb: bool = config['pdb']
with maybe_open_crash_handler(pdb=pdb): with maybe_open_crash_handler(pdb=pdb):
# eg. ``--profile 3`` reports profiling for anything slower then 3 ms.
if profile is not None:
from .. import _profile
_profile._pg_profile = True
_profile.ms_slower_then = float(profile)
# Qt UI entrypoint
from ._app import _main
for symbol in symbols:
if '.' not in symbol:
click.echo(click.style(
f'symbol: {symbol} must have a {symbol}.<provider> suffix',
fg='red',
))
return
# global opts
# brokernames: list[str] = config['brokers']
brokermods = config['brokermods']
assert brokermods
tractorloglevel = config['tractorloglevel']
pikerloglevel = config['loglevel']
# !TODO, allow declaring bind addr via maddr!
from ..config import load
conf, _ = load(
conf_name='conf',
)
regaddrs: list[tuple[str, int]] = config.get(
'registry_addrs',
[],
)
# network: dict = conf.get('network')
# if network:
# eps: dict = load_trans_eps(
# network,
# maddrs=None,
# )
# addr: tractor.Address
# for addr in eps['pikerd']:
# regaddrs.append(addr)
# # !TODO, expose this from open_root_actor()!
# tpt_bind_addrs: list[
# tractor.Address # `Address.get_random()` case
# |tractor.UnwrappedAddress # registrar case `= uw_reg_addrs`
# ] = []
# chart_maddrs: list[str] = eps.get('chart')
# if chart_maddrs:
# addr: tractor.Address
# for addr in load_trans_eps(chart_maddrs):
# tpt_bind_addrs.append(addr)
_main( _main(
syms=symbols, syms=symbols,
brokermods=brokermods, brokermods=brokermods,