Releases: kite88/go-websocket
Releases · kite88/go-websocket
Release list
v1.0.0
首个正式版本:一个可运行、可阅读的定向 WebSocket 消息投递服务。
新增
- 定向投递:按报文里的
receiver只投递给指定 uid,接收人离线时回一条type=error回执。 - 身份不可伪造:
sender由服务端按连接身份填写,客户端传入的同名字段一律丢弃。 - uid 校验前置:只允许字母、数字、下划线、连字符,长度 1~64;非法 uid 在升级握手之前返回
400+ JSON 原因。 - WebSocket 通道:
GET /ws?uid=你的uid,支持重复 uid 顶号,断开后可重连。 - 在线列表接口:
GET /api/online返回{"count":N,"users":[...]},uid 升序。 - 聊天页面:亮色 / 跟随系统 / 暗色三态主题(首帧应用,暗色不闪白屏)、断线指数退避重连、
点击在线用户选中接收人、uid 本地持久化。 - 命令行参数:
-config指定外部配置文件,-version打印版本号。
实现要点
- 连接中心
Hub在单个 goroutine 内维护 uid → 连接 映射,map 无锁,外部一律经 channel 交互。 - 每个连接只有一个写方(
writePump),其余 goroutine 仅向send队列投递,避免并发写连接。 - 连接退出用
sync.Once+close(done)通知,投递方不会 panic。 - 服务端按周期发 ping,
pong_wait超时或读超时即断开死连接。 - 慢客户端(
send队列满)直接断开并回告发送方,防止拖垮整个连接中心。 SetReadLimit限制单条消息大小,避免超大帧耗尽内存。- 默认只允许同源连接,可用
allow_all_origins放开;非浏览器客户端(无Origin)放行。
工程
- 页面模板、静态资源、配置模板全部通过
//go:embed内嵌,go run .即可运行,运行时不依赖外部文件。 - 配置为 INI 格式,内置
debug/local/release/test四份模板,外部env.ini可覆盖。 - 配置读取带默认值且不 panic:
env_mode非法时回落release,GetInt/GetBool/GetDuration出错返回默认值。 Ctrl+C/SIGTERM优雅退出:先停止监听,再统一断开仍挂着的 WebSocket。- 版本号由构建时
-ldflags "-X main.version=..."注入,源码直跑显示dev。 - 分层结构:
config/common/handle/router,依赖通过参数显式注入,便于测试。 - 以 MIT 许可开源,源码与发布产物均可自由使用、修改、分发。
build.sh一次交叉编译 windows / linux / darwin 六个平台并打包为归档
(Windows 为.zip,其余为.tar.gz),归档内是「可执行文件 +start启动脚本 +
env.ini+LICENSE」,另有checksums.txt记录全部归档的 SHA256;
推送v*标签时 GitHub Actions 自动重跑go vet/go test/ 构建 / 校验并创建 Release。
测试
go vet ./...静态检查通过。go test ./...覆盖首页与静态资源、404、/api/online、定向转发、sender不可伪造、
接收人离线回执、三类非法上行报文、非法 uid 被 400 拒绝、同一 uid 顶号、断开后重连。
已知局限
- 无鉴权:知道 uid 即可连接,适合本机 / 内网使用。
- 无持久化:只做转发,不支持离线补发与历史消息。
- 无 TLS:HTTPS / WSS 需由前置反向代理终结。
- 单进程:连接中心在内存中,多实例部署需引入 Redis 等跨进程投递。
- 仅点对点:不支持分组、广播与群聊。