内容提要
计划基于Cloudflare Workers开发新的端到端加密聊天软件,优化安全性和代码实现,包括客户端、服务端、加密、大文件传输、聊天室自毁、部署简化等方面。使用Ably实现跨端通信,Cloudflare Durable Objects解决请求交换问题,Cloudflare D1做状态留存,定时任务清理过期房间。一次性链接通过密码实现,文件传输集成Cloudflare R2,加密使用Jose库。在线状态查询改为用户动作触发更新。计划开源代码并提供配置教程。
延伸解读
从自建服务器到 Cloudflare Workers 的架构转变
文章详细描述了从传统服务器迁移到 Cloudflare Workers 时遇到的挑战。在 Node.js 环境中,请求之间可以共享信息,但 Workers 出于性能考虑禁止跨请求 I/O,导致无法直接进行 WebSocket 跨端通信。作者最终引入 Ably 作为信息交换模块,将 Workers WebSocket 仅用于连接标识,而消息交换通过 Ably 的发布/订阅接口完成。这种架构调整虽然解决了问题,但也带来了对第三方服务的依赖。
聊天室自毁与一次性链接的可靠性改进
新版本使用 Cloudflare D1 数据库存储房间状态,通过 created 字段判断房间是否过期,并利用 Workers 的 CRON 定时任务每小时清理过期房间。一次性链接的实现从依赖易失的 WebSocket 连接 ID 改为基于数据库存储的密码验证,为 Alice 和 Bob 分别生成密码,确保链接只能使用一次。这种基于数据库的状态管理提高了可靠性和安全性,避免了服务重启导致的状态丢失。
文件传输与加密方案的优化方向
文章提到文件传输功能尚未实现,但计划集成 Cloudflare R2 作为中继,文件将加密存储并在房间销毁时一并删除。加密方面,作者放弃了 Web 原生 crypto API,改用零依赖的 Jose 库以提高兼容性。密钥对生成策略也进行了优化,从每次刷新页面生成新密钥对改为每个房间只生成一次,以支持未来离线消息暂存功能,确保消息能够正确解密。
在线状态查询的权衡与免费额度限制
由于 Workers 请求间不能共享信息,作者曾尝试用 D1 数据库存储在线状态,但免费版每天仅 10 万行写操作,一次聊天可能消耗 1 万行,成本过高。最终改为由用户动作(如打字或滚动)触发在线状态更新,并通过 Ably 频道进行一问一答,避免频繁数据库操作。这种方案节省了免费额度,但牺牲了实时性,对方可能无法立即察觉离线状态。
Q&A
M42聊天软件的主要功能是什么?
M42聊天软件的主要功能包括端到端加密、一对一聊天、无需登录、30Mb以内的文件互传、服务端和客户端不存储聊天记录、聊天室自毁、以及简化部署等。
如何实现M42的跨端通信?
M42使用Ably实现跨端通信,Cloudflare Workers的WebSocket用于标识用户连接,而信息交换通过Ably的频道进行。
M42如何处理聊天室自毁功能?
M42通过Cloudflare D1进行状态留存,使用创建时间字段判断房间是否过期,并设置定时任务每小时清理过期房间。
M42的文件传输功能有什么特点?
M42计划集成Cloudflare R2作为文件传输中继,支持大文件传输且不阻塞信息传输,文件在房间销毁时也会被删除。
M42如何优化加密过程?
M42使用Jose库进行加密,优化了加密流程,确保每个房间只生成一次密钥对,以支持未来的离线消息暂存功能。
M42计划如何提升用户体验?
M42计划开源代码并提供详细的配置教程,以提升用户体验和安全性,同时优化客户端和服务端的设计。