news 2026/9/10 15:12:23

Cal.com 集成 Mirotalk 视频会议应用(mirotalk_video)接入指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cal.com 集成 Mirotalk 视频会议应用(mirotalk_video)接入指南

Cal.com 集成 Mirotalk 视频会议应用(mirotalk_video)接入指南

【免费下载链接】cal.diyScheduling infrastructure for absolutely everyone.项目地址: https://gitcode.com/GitHub_Trending/ca/cal.diy

Mirotalk 是一个基于 WebRTC 的免费实时视频会议服务,支持 P2P 与 SFU 两种架构。本指南以 Cal.com 开源仓库中的 packages/app-store/mirotalk 应用模块为对象,讲解如何在 Cal.com 事件类型中把 Mirotalk 房间链接作为会议地点,涵盖应用清单(config.json)各字段的语义、安装时默认凭证的创建机制、以及 SFU/P2P 两种模式的链接校验规则。读完本文,你将掌握该应用的完整接入方式、URL 格式约定与底层安装流程,可直接用于自托管 Cal.com 环境的集成排查与二次开发。

应用定位与核心能力

仓库内 DESCRIPTION.md 用两句话概括了该应用的全部核心价值:

  • Copy your room link and start scheduling calls in Mirotalk.
  • Both SFU and P2P are supported.

即:复制你的房间链接,在 Cal.com 的预订流程中直接开始 Mirotalk 通话,并且同时支持 SFU(Selective Forwarding Unit)与 P2P(点对点)两种会议模式。它属于事件类型地点(Event Type Location)类型的视频会议应用——用户无需注册 Mirotalk 账号,只需粘贴一个房间 URL 即可完成会议地点配置。

package.json 中进一步补充了底层协议信息:该应用基于免费 WebRTC,支持最高 4K / 60fps 的实时视频会议,兼容所有浏览器与平台;应用自身仅依赖@calcom/lib工作区包,开发依赖@calcom/types,模块结构非常轻量。

应用清单(config.json)字段逐项解析

config.json 是该应用的声明式配置文件,Cal.com 的 App Store 注册机制会读取它来生成应用元数据(见下文"生成的注册文件"小节)。各字段含义如下:

字段说明
nameMirotalk应用展示名称
slugmirotalk应用唯一标识,文件内注释明确要求不得随意修改 slug,如需变更须使用 CLI 的 edit 命令
typemirotalk_video应用类型标识,与 Credential 表中type字段对应
logoicon.svg应用图标,位于 static/icon.svg
variantconferencing应用变体分类,标记为会议/通话类
categories["conferencing"]应用目录归属
publisher/emailCal.com, Inc./support@cal.com发布方信息
isOAuthfalse非 OAuth 授权类应用,安装不涉及第三方 OAuth 流程
isTemplatefalse非模板应用
dirNamemirotalk应用源码目录名
__templateevent-type-location-video-static使用的脚手架模板:静态链接型事件地点视频应用
__createdUsingClitrue由 App Store CLI 创建

appData.location:地点类型配置

appData.location定义了该应用如何作为"会议地点"接入事件类型:

"appData": { "location": { "type": "integrations:{SLUG}_video", "label": "{TITLE}", "linkType": "static", "organizerInputPlaceholder": "https://p2p.mirotalk.com/join/80085ShinyPhone", "urlRegExp": "^(http|https):\\/\\/(p2p|sfu)\\.mirotalk\\.com\\/join\\/[a-zA-Z0-9._-]+$" } }
  • typeintegrations:{SLUG}_video中的{SLUG}在运行时替换为mirotalk,最终对应integrations:mirotalk_video这一地点类型。在平台类型定义中,该值被明确枚举为合法地点类型之一,见 locations.output.ts 中的"mirotalk-video"

  • linkType: "static":表示地点链接是静态 URL(由组织者预先提供),而不是动态生成的会议链接——这是"粘贴房间链接"这一交互模式的关键。

  • organizerInputPlaceholder:组织者在事件类型配置页面输入地点链接时的占位提示,示例格式为https://p2p.mirotalk.com/join/80085ShinyPhone,即一个 Mirotalk P2P 房间地址。

  • urlRegExp:组织者输入 URL 的正则校验规则,仅允许以下两种形态的链接通过:

    • https://p2p.mirotalk.com/join/<房间名>(P2P 模式)
    • https://sfu.mirotalk.com/join/<房间名>(SFU 模式)

    其中房间名允许包含大小写字母、数字、点、下划线与连字符([a-zA-Z0-9._-]+),协议限定为httphttps。这从配置层面印证了 DESCRIPTION.md 中"SFU 和 P2P 均支持"的声明——两种模式对应不同的域名前缀。

description:容量与限制

description字段写明了产品定位:面向小团体的点对点实时视频会议,不限时长、不限房间数,每个房间支持 5–8 名参与者。这是从官方应用描述继承的事实,可作为容量规划参考。

安装机制:默认凭证的声明式创建

Mirotalk 应用的安装入口在 api/add.ts,它实现了一个AppDeclarativeHandler(声明式应用处理器):

const handler: AppDeclarativeHandler = { appType: appConfig.type, // "mirotalk_video" variant: appConfig.variant, // "conferencing" slug: appConfig.slug, // "mirotalk" supportsMultipleInstalls: false, // 每个用户/团队仅允许安装一次 handlerType: "add", createCredential: ({ appType, user, slug, teamId }) => createDefaultInstallation({ appType, user: user, slug, key: {}, teamId }), };

关键点:

  • supportsMultipleInstalls: false:同一用户(或团队)不能重复安装该应用,安装前会通过checkInstalled检测,若已存在凭证则抛出 422 "Already installed" 错误,见 installation.ts。
  • createCredential调用createDefaultInstallation,这是 App Store 的通用默认安装工具,实现在 installation.ts:直接在 PrismaCredential表中插入一条记录,type为应用类型、appId为 slug、key为空对象{}(Mirotalk 无需存储任何密钥,因为房间链接是公开的静态 URL),并按调用方上下文写入userIdteamId。凭证创建失败时会抛出明确错误信息。

由于isOAuth: falsekey为空,Mirotalk 的"安装"本质上只完成两件事:记录一次安装行为、解锁integrations:mirotalk_video这一地点选项。API 入口统一由 api/index.ts 导出add处理器,而模块根入口 index.ts 则整体导出api命名空间。

接入方式:在事件类型中使用 Mirotalk 会议

基于以上配置与源码,实际接入流程如下:

  1. 在 Cal.com 管理后台的 App Store 中安装Mirotalk(无 OAuth 跳转,安装即完成凭证创建)。
  2. 新建或编辑一个事件类型,在会议地点(Location)中选择Mirotalk
  3. 在输入框中粘贴一个 Mirotalk 房间链接,格式必须满足urlRegExp
    • https://p2p.mirotalk.com/join/<房间名>(P2P)
    • https://sfu.mirotalk.com/join/<房间名>(SFU)
  4. 预订者完成预约后,预订确认信息中即携带该房间链接,双方点击即可进入视频会议——无需下载客户端、插件或登录。

房间名示例:80085ShinyPhone(P2P 占位符)、43245BlackFish96468TallSnake(见本应用 static 目录中的官方截图),均可按^[a-zA-Z0-9._-]+$的字符集自定义。

生成的注册文件与代码结构总览

应用安装后会被 App Store 的代码生成机制登记到全局注册表中:

  • apps.metadata.generated.ts 引入./mirotalk/config.json,并在第 178 行以mirotalk: mirotalk_config_json的形式注册到元数据映射中,供应用市场列表、图标与详情页渲染使用。
  • 同类生成文件还包括 apps.server.generated.ts 与 bookerApps.metadata.generated.ts,分别用于服务端应用注册与预订页(Booker)侧的应用元数据。

整个模块的文件结构非常精简,便于理解一个"静态链接型视频应用"的最小实现范式:

packages/app-store/mirotalk/ ├── api/ │ ├── add.ts # 声明式安装处理器(创建默认凭证) │ └── index.ts # API 导出 ├── static/ │ ├── 1.jpeg # SFU 界面截图(文档配图) │ ├── 2.jpeg # 品牌宣传页截图(文档配图) │ └── icon.svg # 应用图标 ├── DESCRIPTION.md # 应用商店展示文案 ├── config.json # 应用声明配置(类型、地点规则、正则) ├── index.ts # 模块入口 └── package.json # @calcom/mirotalk 包定义

小结

Mirotalk 应用是理解 Cal.com 视频会议类集成的最佳入门示例之一:config.json中的appData.location定义了静态链接地点的完整行为(占位符 + 正则校验 + 类型映射),api/add.ts展示了基于createDefaultInstallation的免 OAuth 声明式安装范式,而urlRegExp同时约束了 P2P 与 SFU 两种官方部署形态的 URL 格式。如果你需要为 Cal.com 接入另一款"房间链接式"会议服务,直接以本模块为模板修改config.json并替换静态资源即可。

【免费下载链接】cal.diyScheduling infrastructure for absolutely everyone.项目地址: https://gitcode.com/GitHub_Trending/ca/cal.diy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 15:06:24

5 分钟让老 SWF 重新跑起来:Ruffle Flash 模拟器上手指南

5 分钟让老 SWF 重新跑起来&#xff1a;Ruffle Flash 模拟器上手指南 【免费下载链接】ruffle A Flash Player emulator written in Rust 项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle Ruffle 是一个用 Rust 编写的 Flash 模拟器&#xff0c;面向需要打开 …

作者头像 李华