moonbit-beam-rpc

    Erlang 远程调用客户端(rpc:call 元协议+:erlang/:ets/:application/:supervisor 词表面;EETF 承 moonbit-eetf)

    erlang
    rpc
    moonbit
    Download zip
    Author
    Version
    0.0.6
    License
    Apache-2.0
    Last updated
    11 hours ago
    Downloads
    17

    #moonbit-beam-rpc

    Erlang 远程调用客户端(MoonBit 纯核):rpc:call 元协议(rex 服务形)+四模块 词表面(:erlang/:ets/:application/:supervisor)。线形自 kernel/src/rpc.erl 的 \$gen_call 元协议重写(clean-room 零拷贝)。

    依赖倒置:EETF 编解码藏 EtfCodec trait 后(组合根 moonbit-eetf 实现); 传输藏 RpcPort trait 后——核心包零依赖,组合根一行装配。

    #包结构

    包内容
    thy1016/moonbit-beam-rpcrex 元协议+词表面+EtfCodec/RpcPort 注入位(唯一包)

    状态:0.0.1 骨架(阶段 5)。

    #特性

    • build_call:{call, Mod, Fun, Args} 线形($gen_call 包裹挂账)。
    • parse_reply:rex 形直解/badrex 形诚实拒。
    • call 全程:build→send→recv→parse(组合根一行装配)。
    • 词表面:erlang.nodes/ets.all/application.which_applications/ supervisor.which_children(显式穷尽,TOML 化挂账)。
    • 双注入位:EtfCodec(eetf 组合)/RpcPort(传输组合)——假实现罐形。

    #测试门

    moon check --deny-warn && moon test --target native

    #演进位

    • $gen_call 包裹形+caller pid/ref 真形(联动 beam-node 语义面)
    • EtfCodec 真实现(moonbit-eetf impl)+真网门(归役自跑)
    • 词表 TOML 化(大 gen:模块方法词表数据面)

    #仓库

    • mooncakes 名: thy1016/moonbit-beam-rpc
    • 仓库: git@gitlink.org.cn:thy7/mbt.beam.rpc.git(master)
    • 孵化: bitbang 主仓孵化件独立入库(2026-11-06;孵化期零跨仓 import——组合根候 mooncakes 发版后 moon add 接线)

    EtfCodec

    pub(open) trait EtfCodec {
    fn encode(self : Self, terms : Array[EtfVal]) -> Bytes raise RpcError
    fn decode(self : Self, data : Bytes) -> EtfVal raise RpcError
    }

    EETF 编解码注入位(moonbit-eetf 组合根实现——双实现安放律)

    RpcPort

    pub(open) trait RpcPort {
    async fn send(self : Self, node : String, data : Bytes) -> Unit raise RpcError
    async fn recv(self : Self) -> Bytes raise RpcError
    }

    RpcPort(传输注入位):send 发请求字节;recv 收应答字节(阻塞/超时由实现定; 线形组帧——同包单头 'p'+131+ctl+131+msg——住调用方/probe 的 dist_frame 形, 核心保持值构造纯核)

    RpcError

    pub(all) suberror RpcError {
    Codec(String)
    Transport(String)
    BadReply(String)
    }

    RpcError::show

    fn RpcError::show(self : RpcError) -> String

    错域文本面(手写防 0079 晋升+零依赖)

    EtfVal

    pub(all) enum EtfVal {
    VAtom(String)
    VInt(Int)
    VFloat(Double)
    VTuple(Array[EtfVal])
    VList(Array[EtfVal])
    VNil
    VBinary(Bytes)
    VString(String)
    VMap(Array[(EtfVal, EtfVal)])
    VPid(String, Int, Int, Int)
    VPort(String, Int, Int)
    VRef(String, Int, Int, Int)
    VOther(String)
    }

    EtfVal:rpc 面项值(eetf EtfTerm 的 rpc 面映射——组合根 eetf_codec 全谱)

    Gleader

    pub(all) enum Gleader {
    StdoutToCaller
    GPid(String)
    }

    group leader 处理形(rpc.erl 真源三路径勘定 2026-11-07——EXIT 堆栈直证): Pid 真形=标准形(rpc.erl:130 set_group_leader(Gleader) pid 域; $gen_call/handle_call 路径不自补——裸 atom=function_clause); StdoutToCaller atom=仅 handle_info({From,{call,...}}) 隐藏 C 节点路径 自补形(rpc.erl:220 {send_stdout_to_caller, From})——gen_call 路径禁用

    application_which_applications

    fn application_which_applications() -> EtfVal

    build_call

    fn build_call(mod_ : String, fun : String, args : Array[EtfVal], gleader~ : EtfVal) -> EtfVal

    rpc:call 请求组装(rex 元协议——Request 五元真形): {call, Mod, Fun, Args, Gleader}(rpc.erl handle_call 首参铁证; Gleader=真 pid($gen_call 路径)——GPid 形传 caller pid 文本→ 组合根 VPid 化;StdoutToCaller 裸 atom 在 $gen_call 路径=function_clause)

    call

    async fn call(codec : &EtfCodec, port : &RpcPort, node : String, caller~ : EtfVal, ref_~ : EtfVal, mod_ : String, fun : String, args : Array[EtfVal]) -> EtfVal raise RpcError

    rpc:call 全程:组装→send→recv→parse(组合根一行装配; caller/refv=真 ALIVE2 注册 pid/ref(编造 creation=shutdown 铁律); 传输面组帧=同包单头 'p'+131+ctl+131+msg(dist_frame 形,probe 实证))

    erlang_nodes

    fn erlang_nodes() -> EtfVal

    词表面(数据化骨架——:erlang/:ets/:application/:supervisor 常用调用形; 大 gen 思想:词表 TOML 化挂账,现显式穷尽;Gleader 由 call 装配注入)

    ets_all

    fn ets_all(node_name : String) -> EtfVal

    observer_port_list

    fn observer_port_list() -> EtfVal

    observer_process_info

    fn observer_process_info(pid : EtfVal) -> EtfVal

    进程详情 fetch(FetchPort v2 真件——简化路 v2 per-pid 五键: memory/reductions/message_queue_len/registered_name/current_function; 键映射 etop_proc_info 七字段谱:pid/mem/reds/name/runtime/cf/mq—— runtime 侧两拍差分自算;真网勘形回执全解通 2026-11-07)

    observer_socket_info

    fn observer_socket_info() -> EtfVal

    observer_socket_list

    fn observer_socket_list() -> EtfVal

    observer_sys_info

    fn observer_sys_info() -> EtfVal

    observer FetchPort 词表(真件④ v1——零参面四件;真源勘定 2026-11-07: observer_backend 无常驻进程(etop.erl:184 remote spawn 一次性形)—— 跨节点数据面走 rex apply 观察键勘定 39 键谱(uptime/schedulers/ process_count/内存七项等);procs_info/1 需 opts record 参数候勘形)

    parse_reply

    fn parse_reply(data : Bytes, codec : &EtfCodec, expect_ref~ : EtfVal) -> EtfVal raise RpcError

    应答解真形(probea rex 实测直证 2026-11-07):rex 经 gen_server:reply 回投 {Ref, Reply}(SEND_SENDER 22 形投递)——{rex, Result} 老形勘误 退役(真 Erlang rex 从不发 {rex,...};旧罐随勘误退役)。 expect_ref=我方发的 ref(回显匹配核——不匹配=串包,拒)

    reg_send_ctl

    fn reg_send_ctl(from : EtfVal, to_name : EtfVal) -> EtfVal

    reg_send 控制元组 4 元(dist.c DOP_REG_SEND 臂真源:tuple_arity 必须为 4): {6, FromPid, Cookie='', ToName}——R9B+ cookie 恒空 atom(''); 3 元=arity≠4→Invalid→erts_kill_dist_connection→FIN(茗篇层 2)

    show_val

    fn show_val(v : EtfVal) -> String

    项值印面(勘定/诊断)

    spawn_frame

    fn spawn_frame(codec : &EtfCodec, ref_ : EtfVal, from_pid : EtfVal, group_leader : EtfVal, mod_ : String, fun : String, arity : Int, opts : EtfVal, arglist : EtfVal) -> Bytes raise RpcError

    spawn 请求组形真件(send 面真件——spawn ctl 29 ctl-only 帧,ArgList 同 131 域真帧组形 2026-11-07 本机双节点 strace 铁证;契约与 call 形统一: 返 131|ctl|arglist,'p' 前缀由 RpcPort.send impl 加;MFA 第三位=Arity 非 ArgList——单变量对拍钉死;Opts=nil(spawn)/link)

    supervisor_which_children

    fn supervisor_which_children(sup_name : String) -> EtfVal

    wrap_gen_call

    fn wrap_gen_call(from_pid : EtfVal, ref_ : EtfVal, request : EtfVal) -> EtfVal

    gen_call', {FromPid, Ref}, Request}——From={caller pid, ref} 二元 (ref=NEW_REFERENCE 结构真形;rex reply 经 {Ref, Reply} 回投——ref 匹配 由 parse_reply 判)

    Source Files