十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rocket.Chat `@rocket.chat/models` 数据访问层变更解读:从 0.x 到 2.4.0 的模型层演进

Rocket.Chat `@rocket.chat/models` 数据访问层变更解读:从 0.x 到 2.4.0 的模型层演进 Rocket.Chatrocket.chat/models数据访问层变更解读从 0.x 到 2.4.0 的模型层演进【免费下载链接】Rocket.ChatThe Secure CommsOS™ for mission-critical operations项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.Chatrocket.chat/models是 Rocket.Chat 中的数据访问层Data Access Layer包封装了用户、消息、会话、订阅、Livechat 等全部 MongoDB 集合的读写操作其 CHANGELOG.md 记录了该包从 0.0.2 一路演进到 2.4.0 的完整轨迹。本篇文章以该 CHANGELOG 为主体骨架结合包内源码与相关配置为开发者梳理 2.x 系列中新增能力、破坏性变更与并发安全修复的技术细节帮助读者在升级依赖或排查数据库层问题时快速定位版本行为差异。先认识这个包定位、依赖与源码结构package.json 显示该包当前版本为2.4.0声明为private: true即仅工作区内部使用不发布到 npm编译产物输出到dist。它的运行时依赖与版本号在 CHANGELOG 中反复以Updated dependencies形式出现核心依赖包括rocket.chat/model-typings定义各集合对应的模型接口IMessagesModel、IUsersModel、ISessionsModel等models 包是这些接口的 Mongo 实现rocket.chat/core-typings提供领域实体类型ISubscription、ILivechatInquiryRecord、DeviceManagementSession等rocket.chat/rest-typingsREST API 端点相关类型rocket.chat/random、rocket.chat/sha256、rocket.chat/tracing等工具型依赖。从 packages/models/src 的源码结构看包内主要包含index.ts导出全部模型类其中getCollectionName统一为集合名加上rocketchat_前缀如rocketchat_usersmodels/各集合的*Raw模型实现例如Sessions.ts、Messages.ts、BaseRaw.tsproxify.ts 与对应的 proxify.spec.ts模型的惰性代理机制避免在导入阶段就强制初始化数据库连接updater.ts 与 updater.spec.ts字段更新的辅助逻辑readSecondaryPreferred.ts构造从库优先的读偏好这正是新版 spotlight 搜索从副本读取的实现支点。理解这一层就能明白 CHANGELOG 中大量数据库模型级改动索引、原子操作、聚合查询的真正落点。2.0.0 破坏性变更移除旧 VoIP重构停用态与访问控制CHANGELOG 中标记为Major Changes的 2.0.0含 PR #37672带来两项清理性破坏变更移除 Omnichannel 中已废弃的 VoIP功能移除废弃的 FreeSwitch 集成。这两项移除意味着依赖相关字段、集合或方法的自定义实现例如自定义路由、基于旧 VoIP 事件解析的代码在升级到 2.0.0 后需要同步清理。配套的 Minor 与 Patch 变更则说明模型层在语义上的进一步收紧用户停用状态语义细化将pending待处理与deactivated已停用明确区分避免模型层把两者混为一谈影响IUsersModel相关查询与users.deactivateidle流程ABACAttribute Based Access Control落地为私有频道与私有团队引入基于属性的访问控制访问判定不再只依赖角色还依赖实体属性与条件该能力对应仓库中的 ee/packages/abac 包修复/v1/users.logout未标记会话已登出的问题——此前该端点执行后可能残留陈旧活跃会话本次要求在模型层正确更新loginAt/logoutAt相关记录。说明日志中的2.0.0-rc.0~2.0.0-rc.5与2.0.0内容一致RC 阶段多为依赖同步占位最终发布以2.0.0为准。2.1.x 与 2.2.0并发限额、文件生命周期与路由排他性这两批版本集中在数据一致性与资源生命周期上且大多是针对存量缺陷的模型级修复。2.1.x独占式坐席分配与统计清理文件独立删除端点2.1.0 为上传文件新增单独删除端点PR #38173模型层相应补充了按单个文件清理记录与存储对象的能力坐席超量分配修复微服务部署下Omnichannel 坐席可能被分配到超过max chats上限的会话。2.1.0 通过显式的用户级锁将分配过程串行化PR #37776避免多实例并发抢单端点校验修正修复livechat/custom-fields.save的校验问题以及omnichannel/contacts.update、omnichannel/contacts.conflicts中 contact manager 字段无法被清空的问题PR #38376、#38265统计集合自动清理为 statistics 集合引入TTL 索引1 年保留期让历史统计数据自动过期PR #38568 的createIndexes流程中登记创建。2.2.0媒体会话、访客标识与路由排他修正媒体通话端点新增在不持有活跃媒体会话时可接受/拒绝媒体通话的 REST 端点PR #40141Livechat 访客externalIds为访客增加外部平台标识字段PR #39535路由排他规则重定义PR #39495Omnichannel 路由现在始终排除offline状态的坐席Livechat_enabled_when_agent_idle设置只对away暂离坐席生效。此前该设置被路由算法整体忽略2.1.x 中的 #35029 曾修复过同类问题本次进一步收紧语义读回执不再计入已停用用户PR #39246避免所有人都已读但消息仍显示未读的假象访客 email/phone 数组重排序修复PR #39905确保会话转写transcript发往正确的登记邮箱Livechat_accept_chats_with_no_agents生效PR #40175当设置允许时离线坐席才会被纳入分配考虑。2.3.0文件校验、房间级全文索引与令牌清理2.3.0 的两个 Minor 变更直接反映了模型层如何通过索引与端点定义反哺业务。custom-sounds.create/custom-sounds.update端点新增自定义提示音的管理端点并对文件大小与 MIME 类型做严格校验以确保系统兼容性PR #39617。这意味着上传阶段即拦截非法媒体模型层存储的都是可被客户端播放器消费的合法文件。USE_ROOM_SEARCH_INDEX可切换的房间级全文索引这是 2.3.0 最值得关注的环境变量PR #40397默认情况下消息集合rocketchat_message的文本索引形态为{ msg: text }当USE_ROOM_SEARCH_INDEXtrue时索引形态变为复合索引{ rid: 1, msg: text }使按房间的$text搜索可以先用rid作为前缀裁剪扫描范围在禁用全局搜索的工作区中这能显著减少每次 per-room 搜索需要扫描的索引片段索引在每次启动时自动对账若现有文本索引与期望形态一致则不动不一致则先删旧索引再重建之后取消该环境变量即可恢复默认形态。源码侧可印证这一设计在 Messages.ts 的注释中明确写着msg上的文本索引由启动阶段的ensureMessagesTextIndex管理默认{ msg: text }对比房间级{ rid: 1, msg: text }。这属于环境变量依赖行为部署升级 2.3.0 后如需切换索引形态重启实例即可触发对账逻辑。Patch 侧停用即清理令牌OAuth 令牌在用户停用后被清理PR #40524users.deactivateidle流程确保停用用户的登录令牌同步清理PR #40496。2.4.0设备会话的当前会话标识与抗钓鱼 OAuth2.4.0 是 CHANGELOG 中信息密度最高的一个版本Minor 与 Patch 都有实质内容。current字段与aggregateSessionsByUserId设备会话管理类型DeviceManagementSession新增current字段聚合方法aggregateSessionsByUserId新增currentLoginToken参数PR #40351其目的在于让会话管理端点能识别并标记调用者当前正在使用的活跃会话例如本机当前会话与其它已登录设备的区分展示。源码佐证见 Sessions.ts方法签名接收uid、sort、search、offset、count以及可选的currentLoginToken。聚合管线中命中当前令牌的记录会被投影出current: true$project: { _id: $sessionId, sessionId: 1, userId: 1, device: 1, host: 1, ip: 1, loginAt: 1, ...(currentLoginToken { current: { $eq: [$_id, currentLoginToken], }, }), }同时该会话集合按loginAt倒序、logoutAt不存在、loginToken非空的记录做分组聚合返回分页化的会话列表。实现细节可继续阅读 Sessions.ts 中$match、$group与$project的完整编排。Phishing-Resistant MFA服务端 OAuth 与Accounts_OAuth_Use_Modern_Flow版本 2.4.0以及其前的 2.3.0-rc.0反复出现标题为Phishing-Resistant Multi-Factor Authentication的 Minor ChangePR #40721核心内容是一套更安全、可靠的服务端 OAuth 认证流程OAuth 认证完全在服务端完成降低令牌窃取、钓鱼攻击与客户端凭据被拦截的风险内建 CSRF、state 校验与 PKCE 防护针对 CSRF 攻击、请求篡改与授权码拦截提供强校验OAuth 登录也强制二次验证开启 email 或 TOTP 双因子认证的用户在通过 Google、GitHub、GitLab 等 Provider 登录时同样需要完成 2FA移动端与桌面端深度链接登录更顺滑、更安全以上能力统一由新设置项Accounts_OAuth_Use_Modern_Flow控制开关。这对模型层的影响在于服务端持有 OAuth 令牌与授权码的生命周期管理变得更重要与 2.3.0 中停用即清理 OAuth 令牌的修复形成闭环。Patch 侧把先查后写收敛为原子操作2.4.0 的 Patch Changes 强调将若干check-then-write 竞态流程收敛为单个原子操作PR #41174CAS 登录令牌不再可能被两个并发登录同时消费撤销房间邀请不再发出重复的移除通知**删除集成Integration**时在删除动作本身即强制仅创建者权限范围。同类竞态修复还包括 E2EE 房间密钥建立PR #41169当多个成员同时进入启用加密的房间时每个客户端曾可能独立生成并分发不同的群组密钥导致消息永久不可解密incorrect encryption key。修复后密钥建立在服务端原子化first-write-wins输掉竞争的客户端丢弃本地生成的密钥、采用已确立的密钥而不是用分叉密钥加密。其余 Patch 修复速览Slack 导入器不再把共享文件以原始 URL 写进消息体PR #41285导入的文件消息保持隐藏直到用户点击 Download Pending Files 拉取失败下载如导出链接失效不再被静默保存为文件内容而是计为错误并可重试LDAP 同步合并修复PR #41279按 email 匹配的既有用户可正确合并避免用户名与目录不一致时报Username already exists/v1/spotlight搜索性能提升PR #41101 提供的从库优先读偏好直接相关。更早版本1.x 与 0.x的关键里程碑2.x 之外CHANGELOG 前段还记录了模型层的演进起点值得关注的里程碑包括版本类型要点0.0.28Patch将rocket.chat/ui-kit移入主仓库 monorepo0.1.0MinorApps-Engine 新增基于Deno 平台的应用运行时0.2.0Minor视频会议持久化聊天Persistent Chat为会议 Provider 提供 discussion id 以留存会议期间消息0.3.0MinorOmnichannel 新增 create contacts 端点1.0.0Major新增集合持久化全部 workspace cloud tokens移除Cloud_Workspace_Access_Token及Cloud_Workspace_Access_Token_Expires_At设置把竞态管理从 settings 缓存下沉到 MongoDB1.1.0Minor允许 Rocket.Chat 存储通话事件call events1.3.0Minor新增rooms.hide端点按房间 ID 隐藏任意类型房间livechat/rooms支持按多个部门与 livechat 单位过滤Omnichannel 会话启动流程事务化房间成员列表加入 Leader 分组1.5.0Minorspotlight 支持双引号精确匹配访客名/api/apps/installed与/api/apps/:id/status在 HA/微服务部署下跨集群获取应用状态/v1/users.update增加审计事件1.5.3Patch弃用基于 MongoDB oplog / Change Streams 的实时数据订阅旧行为可用DISABLE_DB_WATCHERSfalse临时恢复并预告未来主版本移除stream-hub-service1.6.0Minor新版侧边导航All / Mentions / Favorites / Discussions / Omnichannel 过滤器与按 Teams、Channels、DMs 分组处于 Enhanced navigation experience 特性预览下1.7.0Minor新增按 id 停用 Livechat 联系人端点与delete-livechat-contact权限1.8.0Minor语音通话结束时的频道内消息2.1.xPatch统一 presence 引擎的后端基础优先级声明体系internal manual external、状态过期与上一状态恢复2.3.1 条目提示以上仅挑选了含实质功能/语义变化的条目CHANGELOG 中大量-rc.*版本与Updated dependencies []占位条目本质是发布流水线产物无独立技术增量。结语如何基于这份 CHANGELOG 做版本决策rocket.chat/models作为私有数据访问层其 CHANGELOG 是判断升级破坏面与缺陷修复覆盖面的最直接依据。结合本文整理的源码证据建议读者按以下顺序决策先确定基线版本若从2.0.0之前的版本升级需关注 VoIP / FreeSwitch 移除、cloud token 集合迁移1.0.0与 oplog/Change Streams 弃用1.5.3检查是否依赖2.3.0的USE_ROOM_SEARCH_INDEX、2.4.0的Accounts_OAuth_Use_Modern_Flow等新增开关型行为并规划在测试环境的启动对账索引重建观察对涉及会话、设备管理、Livechat 路由的二次开发可分别在 Sessions.ts、BaseRaw.ts 与 index.ts 中找到聚合、建索引与集合注册的实际实现作为对照。如需逐条核对历史改动完整记录请查阅 packages/models/CHANGELOG.md并结合 packages/model-typings 与 packages/core-typings 中的类型定义理解模型契约的变化。【免费下载链接】Rocket.ChatThe Secure CommsOS™ for mission-critical operations项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.Chat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表