- 后端
- 前端
- 企业应用
【免费下载链接】cal.diy
Scheduling infrastructure for absolutely everyone.
导读
Jitsi 是免费开源的视频会议软件,支持 Web 与移动端,用户可以自主发起通话、在自己的服务器上部署、并把它集成进自有应用。本指南以 cal.diy(Cal.com 开源调度平台)中的应用商店模块 jitsivideo 为核心,完整讲解 Jitsi Meet 作为视频会议应用的注册方式、安装流程、会议创建原理与可配置项。读完本文,你将掌握如何在 cal.diy 中启用 Jitsi 视频会议、理解动态会议链接的生成机制,并能通过两个配置键将会议托管到自建 Jitsi 服务器。
一、Jitsi 应用在 cal.diy 中的定位
关联文档 packages/app-store/jitsivideo/DESCRIPTION.md 以一句话概括了 Jitsi 的定位:
Jitsi is a free open-source video conferencing software for web and mobile. Make a call, launch on your own servers, integrate into your app, and more.
这可以拆解为三个核心能力维度,也正是它在 cal.diy 中的应用场景:
- 免登录发起通话:无需复杂凭证,安装后即可为每个预约动态生成会议链接;
- 可自托管(launch on your own servers):Jitsi 允许部署在自有服务器上,cal.diy 通过
jitsiHost配置键对接任意 Jitsi 实例; - 可集成进应用(integrate into your app):cal.diy 以 App Store 插件方式将其接入预约流程,作为“会议地点”类型使用。
同一目录下的 package.json 将应用包命名为@calcom/jitsivideo,description 字段与文档完全一致,说明该模块自始至终被当作一个独立的视频会议适配应用来维护。
二、应用注册:元数据如何定义集成类型
应用商店中的每个应用都需要一份元数据声明,Jitsi 的声明位于 packages/app-store/jitsivideo/_metadata.ts,关键字段如下:
| 字段 | 值 | 含义 |
|---|---|---|
name | Jitsi Video | 应用显示名 |
slug | jitsi | 应用唯一标识,也是数据库中App表的查询键 |
type | jitsi_video | 凭证(Credential)类型,用于安装记录匹配 |
variant | conferencing | 应用分类变体,归属“会议”类 |
categories | ["conferencing"] | 应用分类 |
logo | icon.svg | 应用图标,位于 static/icon.svg |
appData.location | { linkType: "dynamic", type: "integrations:jitsi", label: "Jitsi Video" } | 位置类型声明 |
concurrentMeetings | true | 支持并发会议 |
isOAuth | false | 无需 OAuth 授权流程 |
其中appData.location是本应用接入预约流程的关键:type: "integrations:jitsi"定义了事件类型(EventType)中可选的会议地点类型;linkType: "dynamic"表示该位置无需组织者手动填写链接,会议链接由系统在创建预约时动态生成。
在 packages/app-store/locations.ts 中,应用商店会遍历所有应用元数据,将带appData.location的应用注入到统一的位置类型集合(locationsFromApps)中,并写入AppStoreLocationType映射。之后通过getLocationByType即可按integrations:jitsi找到该位置类型。值得一提的是,这里的{SLUG}、{TITLE}模板变量会在运行时被替换为实际的应用 slug 与名称。
三、安装流程:无需密钥的静默安装
与需要 OAuth 或 API Key 的应用不同,Jitsi 使用公开的 meet.jit.si 服务时不需要任何凭证,因此安装逻辑非常轻量,实现在 packages/app-store/jitsivideo/api/add.ts,该端点运行于/api/integrations/jitsivideo/add(路由注册见 apps.server.generated.ts)。
安装流程分为四步:
- 登录校验:请求必须携带有效会话,否则返回
401; - 权限校验:若附带
teamId查询参数(团队级安装),会调用 throwIfNotHaveAdminAccessToTeam 校验当前用户是该团队管理员; - 幂等检查:按
type: "jitsi_video"+ 安装对象(userId或teamId)在Credential表中查询是否已安装,已安装则报错Already installed; - 创建凭证记录:向
prisma.credential写入一条key: {}的空密钥记录,appId: "jitsi",安装对象同样是用户或团队。
安装成功后会302/返回 JSON 跳转到 getInstalledAppPath 计算的地址(默认/apps/installed/conferencing?hl=jitsi),用户随即能在“已安装应用”页面看到它。
四、会议创建原理:动态会议链接的生成
Jitsi 视频应用的运行核心是 packages/app-store/jitsivideo/lib/VideoApiAdapter.ts 中的JitsiVideoApiAdapter,它实现了 packages/types/VideoApiAdapter.d.ts 定义的视频适配器接口,包含createMeeting、updateMeeting、deleteMeeting、getAvailability四个方法。
4.1 createMeeting:拼装会议地址
createMeeting(eventData)是核心方法,流程如下:
const appKeys = await getAppKeysFromSlug(metadata.slug); // 读取 App 表中的 keys 配置 const meetingPattern = (appKeys.jitsiPathPattern as string) || "{uuid}"; const hostUrl = (appKeys.jitsiHost as string) || "https://meet.jit.si/cal";- 读取配置:通过 getAppKeysFromSlug 按
slug: "jitsi"从prisma.app表读取keys字段(JSON 对象); - 会议路径模板:默认值为
{uuid},即用随机 UUID 作为会议 ID; - 主机地址:默认指向官方公共实例
https://meet.jit.si/cal。
4.2 模板变量替换规则
会议 ID 支持丰富的模板变量,用于生成可读性更好的会议名,全部替换逻辑如下:
| 模板变量 | 替换内容 | 示例 |
|---|---|---|
{uuid} | 随机 UUID(uuidv4()生成) | 0f8b… |
{Title} | 事件类型标题eventData.title | 产品评审 |
{Event Type Title} | 事件类型eventData.type | 30min |
{Scheduler} | 与会者姓名以-连接 | 张三-李四 |
{Organizer} | 组织者姓名organizer.name | 王五 |
{Location} | 事件地点eventData.location | 会议室A |
{Team} | 团队名称team?.name | 研发组 |
替换完成后还会执行最后一条规则:将所有空格替换为短横线-,保证生成的路径合法。随后将会议 ID 拼接到主机地址后并做encodeURIComponent编码,得到最终会议 URL:
url: `${hostUrl}/${encodeURIComponent(meetingID)}`例如配置jitsiPathPattern: "{Title}-{Scheduler}"后,一场“产品评审”会议会生成形如https://meet.jit.si/cal/%E4%BA%A7%E5%93%81%E8%AF%84%E5%AE%A1-%E5%BC%A0%E4%B8%89的链接。
4.3 其他适配器方法
updateMeeting:从已有的预约引用(PartialReference)中直接还原会议 ID、密码与 URL,用于预约改期场景;deleteMeeting:Jitsi 没有服务端房间管理 API,故为空实现;getAvailability:恒返回空数组,表示 Jitsi 会议不占用可用性时段。
4.4 适配器的注册与调度
该适配器通过 lib/index.ts 导出,并被 video.adapters.generated.ts 以动态导入方式注册到VideoApiAdapterMap。实际创建预约时,getVideoAdapters 会根据用户凭证的type去掉下划线(jitsi_video→jitsivideo)找到对应适配器并实例化,再调用createMeeting生成会议链接写入预约。
五、可配置项:对接自托管 Jitsi 服务器
Jitsi 模块通过 packages/app-store/jitsivideo/zod.ts 声明了两个可选配置键(schema 注册见 apps.keys-schemas.generated.ts):
| 配置键 | 类型 | 默认值 | 作用 |
|---|---|---|---|
jitsiHost | string(可选) | https://meet.jit.si/cal | 指定 Jitsi 服务器主机地址 |
jitsiPathPattern | string(可选) | {uuid} | 会议路径(房间名)生成模板 |
这两个键存放在数据库App表的keysJSON 字段中(对应slug: "jitsi")。结合“launch on your own servers”的能力,实际部署时的典型配置是:
{ "jitsiHost": "https://meet.example.com", "jitsiPathPattern": "{Title}-{uuid}" }这样所有会议都会被导向自建的 Jitsi 实例,会议链接既保留标题可读性,又通过 UUID 保证唯一性,避免房间名冲突。
六、集成后的预约效果
集成完成后,用户创建事件类型(Event Type)时,在“地点”选项中会出现Jitsi Video(类型integrations:jitsi)。由于linkType: "dynamic",组织者无需填写任何链接;受邀者完成预约后,会收到由createMeeting动态生成的 Jitsi 会议地址,直接点击即可入会。整个过程无需 OAuth 授权、无需预置密钥,是 cal.diy 应用商店中“零凭证、开箱即用”型视频会议方案的典型代表。
小结
- 定位:Jitsi 是免费开源的 Web/移动端视频会议软件,支持自托管与二次集成;
- 注册:通过 _metadata.ts 声明
integrations:jitsi动态位置类型; - 安装:通过 api/add.ts 完成用户级/团队级的幂等静默安装;
- 会议生成:通过 VideoApiAdapter.ts 按模板变量动态生成会议链接;
- 配置:
jitsiHost与jitsiPathPattern两个键即可对接自托管 Jitsi 服务器。
如需进一步探索,可阅读同目录下的 DESCRIPTION.md、package.json 与 static/icon.svg,以及应用商店基础设施 locations.ts 和 getVideoAdapters.ts。
- 后端
- 前端
- 企业应用
【免费下载链接】cal.diy
Scheduling infrastructure for absolutely everyone.
相关推荐
Jitsi Meet SDK 企业级视频会议集成实战指南
Jitsi Meet SDK 是一个基于 WebRTC 技术的底层 JavaScript 视频 API,允许开发者为 Web 应用添加完全自定义的视频会议体验。
cal.diy 集成 Tandem 虚拟办公室:视频会议应用接入指南与源码解析
cal.diy 集成 Tandem 虚拟办公室:视频会议应用接入指南与源码解析 本指南以开源调度平台 cal.diy 中 Tandem 应用集成模块( pack
后端前端企业应用Jitsi Meet Electron:开源视频会议的桌面利器
Jitsi Meet Electron:开源视频会议的桌面利器 项目介绍 Jitsi Meet Electron 是一款基于 Electron https://
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考