跳转至

GUI、CLI、C FFI 与 UniFFI 宿主契约

依赖:client_runtime.md、shared.md。宿主负责稳定数据位置、用户动作和事件呈现,不复制 SDK 状态机。

pub trait ClientHost: Send + Sync {
    fn local_store_location(
        &self,
        actor: &AuthenticatedActor,
    ) -> Result<LocalStoreLocation, ClientHostError>;

    fn create_runtime(
        &self,
        location: LocalStoreLocation,
    ) -> Result<Box<dyn ClientRuntime>, ClientHostError>;

    async fn connect_after_user_action(
        &self,
        runtime: &dyn ClientRuntime,
        request: ConnectRequest,
    ) -> Result<(), ClientHostError>;

    async fn present(
        &self,
        event: ClientEvent,
    ) -> Result<(), ClientHostError>;
}

pub trait BindingEventStream: Send + Sync {
    async fn next_exported_event(
        &self,
    ) -> Result<Option<ClientEvent>, ClientHostError>;
}

前置条件

  • 生产宿主必须按 endpoint、tenant、user 隔离 Persistent 本地库;内存库只能在显式测试配置下请求。
  • 建立网络连接必须源自用户登录或显式重连动作,不得在界面挂载时用默认身份自动连接。
  • 绑定层只能从 BindingEventStream 逐项读取 SDK 事件,不能重新解析同步帧或维护第二套 pending、游标、未读逻辑。

后置条件

  • GUI/CLI 在 runtime 创建后通过 connect_after_user_action 调用 ClientRuntime::connect;路径稳定性使关闭重开可恢复本地状态。
  • 创建群在收到 MembersUpdated 或明确失败事件前仅显示 pending;未支持能力返回 UnsupportedCapability 或明确禁用,禁止产生本地伪成功。
  • C FFI、UniFFI 与 Tauri 对批量 SDK 事件逐项导出,不得只保留首项。宿主按 ClientEvent 终态更新 UI,并呈现连接、重置和顶号状态。

错误

  • 无法提供稳定路径时返回 StablePathUnavailable 或 PersistentStoreRequired,不得静默回退内存库。
  • EventExportFailed 必须保留未导出事件的可恢复顺序,禁止丢弃批次。