☰
cal.diy 集成 Jitsi Meet:免费开源视频会议的应用接入原理与配置指南
2026/10/11 13:22:49 网站建设 项目流程
  • 后端
  • 前端
  • 企业应用

【免费下载链接】cal.diy

Scheduling infrastructure for absolutely everyone.

项目地址:https://gitcode.com/GitHub_Trending/ca/cal.diy
点击查看免费下载

导读

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 中的应用场景:

  1. 免登录发起通话:无需复杂凭证,安装后即可为每个预约动态生成会议链接;
  2. 可自托管(launch on your own servers):Jitsi 允许部署在自有服务器上,cal.diy 通过jitsiHost配置键对接任意 Jitsi 实例;
  3. 可集成进应用(integrate into your app):cal.diy 以 App Store 插件方式将其接入预约流程,作为“会议地点”类型使用。

同一目录下的 package.json 将应用包命名为@calcom/jitsivideo,description 字段与文档完全一致,说明该模块自始至终被当作一个独立的视频会议适配应用来维护。

二、应用注册:元数据如何定义集成类型

应用商店中的每个应用都需要一份元数据声明,Jitsi 的声明位于 packages/app-store/jitsivideo/_metadata.ts,关键字段如下:

字段值含义
nameJitsi Video应用显示名
slugjitsi应用唯一标识,也是数据库中App表的查询键
typejitsi_video凭证(Credential)类型,用于安装记录匹配
variantconferencing应用分类变体,归属“会议”类
categories["conferencing"]应用分类
logoicon.svg应用图标,位于 static/icon.svg
appData.location{ linkType: "dynamic", type: "integrations:jitsi", label: "Jitsi Video" }位置类型声明
concurrentMeetingstrue支持并发会议
isOAuthfalse无需 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)。

安装流程分为四步:

  1. 登录校验:请求必须携带有效会话,否则返回401;
  2. 权限校验:若附带teamId查询参数(团队级安装),会调用 throwIfNotHaveAdminAccessToTeam 校验当前用户是该团队管理员;
  3. 幂等检查:按type: "jitsi_video"+ 安装对象(userId或teamId)在Credential表中查询是否已安装,已安装则报错Already installed;
  4. 创建凭证记录:向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.type30min
{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):

配置键类型默认值作用
jitsiHoststring(可选)https://meet.jit.si/cal指定 Jitsi 服务器主机地址
jitsiPathPatternstring(可选){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.

项目地址:https://gitcode.com/GitHub_Trending/ca/cal.diy
点击查看免费下载

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询