跳转到内容

CLI、API 与协议参考

本页汇总 pair-demo 命令行参数与退出码、iroh-pairing / connector-core 公开 API 概览、仓库内协议与技术文档永久链接,以及项目的开源许可证与归属说明。

pair-demo invite [OPTIONS]
pair-demo chat [OPTIONS]
pair-demo peers list --state-dir <DIR>
pair-demo peers revoke <ENDPOINT-ID> --state-dir <DIR>
pair-demo serve --state-dir <DIR> [--lan-only | --relay <URL>]
pair-demo ping <ENDPOINT-ID> --state-dir <DIR> [--direct <ADDR>]...
  • stdout:仅输出单行结构化 JSON 结果(不含邀请 token、密钥或聊天正文)。
  • stderr:输出终端二维码、备用邀请行(Invitation (paste/scan): <value>)、7 项 SAS 提示、本地交互提示及白名单 tracing 诊断。
  • 无自动确认开关:生产 CLI 不提供 --auto-confirm 或任何环境变量自动确认开关,SAS 比较结果必须由本地终端 stdin 输入。
参数 默认值 说明
--profile <ID> generic.pair 业务 profile 标识;两端必须完全一致,未知自定义 ID 同样支持由通用扫码器介绍
--namespace <TEXT> iroh.pairing.demo 应用命名空间;两端必须完全一致
--role <ROLE> peer 本端声明的角色(不按扫码先后分配)
--accept-role <ROLE> 等于 --role 可重复指定;对端声明的 --role 必须包含在此集合内
--purpose <TEXT> 内置演示说明 人类可读用途说明;两端可不同,但会被 SAS 上下文完整绑定
--scope <ITEM> demo.echo 可重复指定;显式传入时覆盖默认 demo.echo(若不含 demo.echo,验证后将跳过回显业务动作)
--name <TEXT> pair-demo-device 自报设备名称
--payload-file <PATH> 无 验证完成后交换的本地文件(上限 65536 字节 / 64 KiB)
--content-type <TEXT> application/octet-stream 验证后 payload 的 MIME / 内容类型
--schema-version <U32> 1 验证后 payload 的应用 schema 版本号
--lan-only 关闭 禁用 relay 与地址发现,仅使用直连 UDP 地址(与 --relay 互斥)
--relay <URL> 无 仅使用指定的自定义 relay,不启用额外发现(与 --lan-only 互斥)
--connector-url <URL> 无 将邀请编码为 <URL>#<envelope>(wire 契约固定要求路径恰好为无尾斜杠的 /pair,如 https://iroh-pairing.gjz010.page/pair;HTTPS 或 loopback HTTP,总长 ≤ 2048 字节)
--qr-svg <PATH> 无 将二维码额外导出为独立 SVG 文件
--state-dir <DIR> 无 在 <DIR>/state.json 持久化本机长期身份与 Persistent 授权记录
参数 默认值 说明
--name <TEXT> pair-demo-chat 自报设备名称
--lan-only 关闭 禁用 relay 与地址发现,仅使用直连 UDP 地址(与 --relay 互斥)
--relay <URL> 无 仅使用指定的自定义 relay(与 --lan-only 互斥)
--ttl <SECS> 300 未使用邀请的有效期(秒,1..=3600)
  • pair-demo peers list --state-dir <DIR>:列出 <DIR>/state.json 中已保存的持久授权记录。
  • pair-demo peers revoke <ENDPOINT-ID> --state-dir <DIR>:按 64 位小写十六进制 EndpointId 幂等删除持久授权记录(重启 serve 后对新连接生效)。
  • pair-demo serve --state-dir <DIR> [--lan-only | --relay <URL>]:使用已保存的长期身份启动受保护的 /iroh-pairing/demo-echo/1 服务,等待 Ctrl-C。
  • pair-demo ping <ENDPOINT-ID> --state-dir <DIR> [--direct <ADDR>]...:使用已保存的长期身份与持久授权向目标对端发起一次受保护回显请求(可重复传入 --direct <IP:PORT> 覆盖重启后变化的直连端口)。
退出码 常量 含义
0 EXIT_OK 成功完成(身份验证、载荷交换及所需的业务回显或聊天会话均完成)
1 EXIT_LOCAL 本地配置、payload 文件读取、状态文件校验或二维码导出错误
2 EXIT_CANCELLED 本地取消(输入 no、stdin EOF、本地 cancel 或 Ctrl-C)
3 EXIT_EXPIRED 邀请已过期
4 EXIT_NETWORK 网络、relay、可达性或传输层失败
5 EXIT_VERIFICATION SAS 验证失败,或业务授权缺失/被对端 Gate 以 403 拒绝
6 EXIT_EXCHANGE 身份已验证,但载荷交换失败、结果不确定(Indeterminate),或业务回显校验失败
64 EXIT_USAGE 命令行参数语法或互斥选项错误

源码位于 crates/iroh-pairing/src/lib.rs:

类型 / 常量 核心方法 / 说明
PAIRING_ALPN b"/iroh-pairing/1" 专用配对协议 ALPN 常量
Pairing Pairing::attach(endpoint, config)、pairing.handler()(用于 Router::accept)、pairing.accept(connection)(用于手写 accept loop)、pairing.create_invite(request)
PairingConfig 配置活跃会话上限(默认 4)、未使用邀请 TTL(默认 5 min)、介绍后活跃期限(默认 10 min)、RPC/连接超时及可选 HostValidator
InviteRequest InviteRequest::new(app_name, device_name, application, network)、.with_payload(payload);network 取 NetworkMode::Internet 或 NetworkMode::Lan
Session invite()、invite_url(connector_url)、snapshot()、subscribe()、confirm(matches)、accept_payload()、accept_payload_with_digest(expected)、cancel()、revoke_invite()、verified()、result().await
SessionEvent PhaseChanged、SasReady { display }、Verified { peer }、PayloadReceived { payload, content_digest }、PayloadAccepted、ExchangeFinished { outcome }、Failed、Indeterminate
VerifiedPeer 经完整 SAS 与双向 MAC 验证的对端身份:remote_id()、local_id()、transaction_id()、context()、application()、scope()、addresses()、role()
AuthorizationState AuthorizationState::new(protected_alpns)、state.gate()(安装至 EndpointBuilder::hooks)、state.grant(&peer, alpn, lifetime)、state.authorization(remote_id, alpn)、state.records()、state.restore(record)、state.revoke(remote_id)

2.2 手机介绍核心 connector-core 与平台绑定

Section titled “2.2 手机介绍核心 connector-core 与平台绑定”

源码位于 crates/connector-core/ 与 crates/connector-android-bindings/:

  • Rust Connector:Connector::new(config).await、set_slot(slot, input)、clear_slot(slot)、check_compatibility()、start_introduction().await、snapshot()、watch_progress()、detach().await、cancel_before_handoff().await、reset().await、close().await。
  • Web WASM 绑定(WasmConnector):导出与上述方法对应的 JSON 字符串接口及 parse_invite_json / parse_invite_json_at。
  • Android UniFFI Kotlin 绑定(com.gjz010.irohpairing.core):导出 NativeBootstrap.install(applicationContext)(进程级 JNI/DNS 初始化)与 NativeConnector(注意关闭顺序:先异步调用 closeEndpoint() 关闭手机 Endpoint,再调用 AutoCloseable.close() 释放 UniFFI handle)。

3. 协议规范与仓库技术资料索引

Section titled “3. 协议规范与仓库技术资料索引”

4. 关于项目、归属与开源许可(About & License)

Section titled “4. 关于项目、归属与开源许可(About & License)”
  • 维护者与独立性声明:iroh-pairing 由 gjz010 独立开发与维护。iroh-pairing 是独立社区项目,与 iroh 项目及其官方团队、n0 computer 不存在隶属或其他官方关联,也未获其赞助、认可或背书。相关名称与商标归各自权利人所有。
  • 官方链接:
  • 项目许可证:本仓库源码采用 Apache License 2.0 许可发布。项目品牌 Logo(assets/icon.svg 及其派生品牌图标)由 gjz010 创作,采用 CC BY 4.0 许可发布(详见 assets/LICENSE.md 与 NOTICE)。connector-web 与 connector-android 的“设置 → 关于”面板同样内置展示上述仓库地址、文档主页与 Apache-2.0 许可信息。
  • 包名与上游第三方归属:
    • 本项目 Android 客户端包名为 com.gjz010.irohpairing(Kotlin 绑定包名为 com.gjz010.irohpairing.core)。
    • 项目所使用的上游开源组件——包括但不限于 iroh、iroh-gossip、vodozemac、SolidJS、ZXing 以及 shared/design/icons/ 中的 Tabler Icons(MIT 许可证,详见 shared/design/icons/LICENSE 与 shared/design/icons/SOURCE.md)——均保留各自的原始名称、版权归属与开源许可证。