开源 IM 框架 · 自己部署 · Apache-2.0
Talkwire 由一个 Go 实时服务端、Android 与 Web 客户端 SDK 和一份线协议组成。你的业务后端只实现身份、好友、资料、推送和媒体几个接口,就能得到单聊、群聊、媒体消息、已读回执、撤回、多端在线与离线推送。
github.com/dishikun2786-prog/Talkwire架构
用户、好友和资料留在你自己的业务库里。Talkwire 服务端只管连接、消息与离线队列,需要业务数据时回调你的后端;你的后端也可以经内部接口推一张卡片、结束一通电话。
能力
群主、管理员、成员三种角色;邀请、移除、转让与解散。角色以服务端名册为准,拉不到时按普通成员处理。
客户端传到你的存储,消息里只带地址。气泡按内容类型选,不看正文里的文字。
撤回留下一条墓碑,看得到谁在何时撤回;清空对所有成员生效,离线的成员上线后照样生效。
单聊已读位置、可关闭的群已读回执、正在输入。换一台新设备,看过的消息不会重新算成未读。
一个账号默认最多 10 台设备同时在线。在一台设备上发的消息,在其他设备上像收到的一样出现。
FCM、APNs 与 Web Push,按设备登记令牌;通知文案由宿主决定。
在线、离线、未知,记录会过期。拿不准的时候显示“未知”,不冒充“离线”。
同一账号的多个标签页共用一条 WebSocket;持有连接的标签关掉,其他标签自动接管。
聊天记录、通话记录与通话详情;清空只给超级管理员,要写理由并逐字输入确认语。
可靠性
这三件事在小桃子的线上系统里都出过事故。Talkwire 把每一次的修法写进协议规范,再用用例钉住。
每条消息带 clientMsgId。回执丢了就保持“发送中”,重连后用同一个 id 再发,服务端认出来,只存一次。
红线 C2
漏掉的从缺口补;离线时被撤回、本机没收过的 42 也记下,不会每次重连都从那里重拉。strict 档一次请求就知道哪些会话变了。
红线 C3 · 协议第 8.1、8.2 节
legacy 档与原版服务逐帧一致,已经发出去的客户端照常工作;新客户端换到 strict 档,拿到错误码、请求关联和 8 处缺陷修正。
协议第 0.3、18 节
快速开始
起服务端,实现宿主接口,再把客户端 SDK 接进 App。下面是每一端的最小代码。
# 1. 安装
npm install @talkwire/client @talkwire/storage-idb @talkwire/react
// 2. 连接与同步
import { ImClient, ChatEngine } from "@talkwire/client";
import { IdbChatStore } from "@talkwire/storage-idb";
const client = new ImClient({
endpoints: ["wss://im.example.com/ws/im"],
tokenProvider, // 返回你的后端签发的访问令牌
deviceName, // 本浏览器的设备名,存在 localStorage
});
const store = await IdbChatStore.open({ name: "talkwire", encrypt: true });
const engine = new ChatEngine(client, store, { appUserId: userId });
await engine.open();
client.start();可选模块
每个模块单独发布、单独开关。核心的依赖树里不会出现 RTC SDK 或 libsignal,构建时有检查。
现状
首个公开版本之前,接口仍可能调整。每一端验证到什么程度,手册里逐项写明。
| 组成部分 | 状态 | 验证 |
|---|---|---|
| Go 服务端 | 可用 | 黄金对话两档全过、竞态检测;正式压测待在 Linux 上做 |
| Node 宿主 SDK | 可用 | 接入后黄金对话 33/33,契约测试双向通过 |
| Android SDK 与界面套件 | 可用 | 单测与真实服务端用例;一台真机上验证了聊天、通话信令、扫码入群与网页互通;FCM、视频压缩、E2EE 未上真机 |
| Web SDK 与 React 套件 | 可用 | 单测、端到端用例、与 Android 真机互发 |
| 云端测试服务 | 已上线 | imtalk.openedskill.com;每次发布后从公网跑端到端检查 17 步 |
| iOS SDK | 规划中 | — |