Local daemon control channel for MoonBit: length-prefixed frames, token auth over loopback TCP, contact files in the state dir
Dependencies
moon add chensuiyi/dcipc| Function | Description |
|---|---|
| generate_token() | 256 bits from the kernel RNG |
| dial(state_dir) | Connect via the port file |
| accept_authed(server, token) | Accept + authenticate |
| round_trip_bytes(conn, token, payload, timeout_ms) | Authenticated round trip |
| read_frame_timeout(conn, timeout_ms) | Read one frame, silence-tolerant |
| read_token / read_daemon_port | Contact files |
// Daemon side
let token = @dcipc.generate_token()
@fsx.write_atomic(state_dir + "/daemon.token", @utf8.encode(token))
let conn = @dcipc.accept_authed(server, token)
@dcipc.write_frame(conn, response_payload)
// Client side
let conn = @dcipc.dial(state_dir)
let resp = @dcipc.round_trip_bytes(conn, token, request_payload, 5000)moon add chensuiyi/dcipc| 函数 | 说明 |
|---|---|
| generate_token() | 内核 RNG 256-bit |
| dial(state_dir) | 按 port 文件连接 |
| accept_authed(server, token) | 接受并认证 |
| round_trip_bytes(conn, token, payload, timeout_ms) | 认证往返 |
| read_frame_timeout(conn, timeout_ms) | 读一帧(静默容错) |
| read_token / read_daemon_port | 接触文件 |
// 守护进程侧
let token = @dcipc.generate_token()
@fsx.write_atomic(state_dir + "/daemon.token", @utf8.encode(token))
let conn = @dcipc.accept_authed(server, token)
@dcipc.write_frame(conn, response_payload)
// 客户端侧
let conn = @dcipc.dial(state_dir)
let resp = @dcipc.round_trip_bytes(conn, token, request_payload, 5000)pub suberror IpcError {
Timeout
AuthFailed
Closed(String)
TooLarge(size~ : Int, limit~ : Int)
} derive(Debug)let AUTH_TIMEOUT_MS : Intlet MAX_MSG_BYTES : Intlet PORT_FILE : Stringfn generate_token() -> String raisefn read_daemon_port(state_dir : String) -> Int?fn read_token(state_dir : String) -> String?Install
Download zipLocal daemon control channel for MoonBit: length-prefixed frames, token auth over loopback TCP, contact files in the state dir
Dependencies