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 注册机制会读取它来生成应用元数据(见下文"生成的注册文件"小节)。各字段含义如下:
| 字段 | 值 | 说明 |
|---|---|---|
name | Mirotalk | 应用展示名称 |
slug | mirotalk | 应用唯一标识,文件内注释明确要求不得随意修改 slug,如需变更须使用 CLI 的 edit 命令 |
type | mirotalk_video | 应用类型标识,与 Credential 表中type字段对应 |
logo | icon.svg | 应用图标,位于 static/icon.svg |
variant | conferencing | 应用变体分类,标记为会议/通话类 |
categories | ["conferencing"] | 应用目录归属 |
publisher/email | Cal.com, Inc./support@cal.com | 发布方信息 |
isOAuth | false | 非 OAuth 授权类应用,安装不涉及第三方 OAuth 流程 |
isTemplate | false | 非模板应用 |
dirName | mirotalk | 应用源码目录名 |
__template | event-type-location-video-static | 使用的脚手架模板:静态链接型事件地点视频应用 |
__createdUsingCli | true | 由 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._-]+$" } }type:integrations:{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._-]+),协议限定为http或https。这从配置层面印证了 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),并按调用方上下文写入userId或teamId。凭证创建失败时会抛出明确错误信息。
由于isOAuth: false且key为空,Mirotalk 的"安装"本质上只完成两件事:记录一次安装行为、解锁integrations:mirotalk_video这一地点选项。API 入口统一由 api/index.ts 导出add处理器,而模块根入口 index.ts 则整体导出api命名空间。
接入方式:在事件类型中使用 Mirotalk 会议
基于以上配置与源码,实际接入流程如下:
- 在 Cal.com 管理后台的 App Store 中安装Mirotalk(无 OAuth 跳转,安装即完成凭证创建)。
- 新建或编辑一个事件类型,在会议地点(Location)中选择Mirotalk。
- 在输入框中粘贴一个 Mirotalk 房间链接,格式必须满足
urlRegExp:https://p2p.mirotalk.com/join/<房间名>(P2P)https://sfu.mirotalk.com/join/<房间名>(SFU)
- 预订者完成预约后,预订确认信息中即携带该房间链接,双方点击即可进入视频会议——无需下载客户端、插件或登录。
房间名示例:80085ShinyPhone(P2P 占位符)、43245BlackFish、96468TallSnake(见本应用 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),仅供参考