尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

在 Cal.com 中接入 Huddle01:Web3 原生视频会议应用集成指南

在 Cal.com 中接入 Huddle01:Web3 原生视频会议应用集成指南 在 Cal.com 中接入 Huddle01Web3 原生视频会议应用集成指南【免费下载链接】cal.diyScheduling infrastructure for absolutely everyone.项目地址: https://gitcode.com/GitHub_Trending/ca/cal.diyHuddle01 是一个原生面向 Web3 的视频会议软件常被比作去中心化版本的 Zoom。在 Cal.com 的应用商店中它被作为一款视频会议conferencing类应用集成进来让调度系统创建的每个预约都能自动生成 Huddle01 会议链接。本文将围绕仓库中packages/app-store/huddle01video目录的完整实现讲解 Huddle01 的核心特性、应用注册元数据、凭证获取与存储流程以及视频会议适配器的源码级工作原理帮助你理解并复现这一集成。Huddle01 是什么Web3 原生的视频会议方案根据应用描述文档 packages/app-store/huddle01video/DESCRIPTION.mdHuddle01 是native to Web3Web3 原生的视频会议软件与去中心化版本的 Zoom 相当。它面向以下三类典型用户群体提供对话场景NFT 社区NFT communities围绕 NFT 项目开展社区语音与视频交流DAO去中心化自治组织的日常会议与治理讨论BuildersWeb3 开发者与建设者的协作沟通。除基础会议能力外Huddle01 还内置了一系列 Web3 特色功能功能说明Token gating代币门禁只有持有特定 Token / NFT 的地址才能进入会议实现基于链上资产的访问控制NFTs as avatars支持将 NFT 作为参会者头像展示Web3 Login ENS支持使用钱包地址 / ENS 域名如xxx.eth作为身份登录和展示Recording over IPFS会议录制内容上传至 IPFS 去中心化存储这一描述同样被写入了应用元数据与包描述中可在 packages/app-store/huddle01video/_metadata.ts 和 packages/app-store/huddle01video/package.json 中看到完全一致的表述说明它同时承担应用商店展示与包说明的双重角色。图片来自 Huddle01 官方界面展示了其 Web3 会议体验左侧为 Huddle01 视频会议界面支持录制、特效与钱包身份显示右侧为进入会议前的 Web3 钱包连接页可选择 MetaMask、WalletConnect、Coinbase 等钱包或以访客身份加入。应用注册与元数据Huddle01 如何进入 Cal.com 应用商店Cal.com 应用商店中的每个应用都在目录下维护一个_metadata.ts文件作为应用注册的身份证。Huddle01 的元数据定义在 packages/app-store/huddle01video/_metadata.ts 中关键字段如下export const metadata { name: Huddle01, type: huddle01_video, // 唯一类型标识同时作为 Credential 的 type 与 location type variant: conferencing, // 应用变体视频会议类 categories: [video, conferencing], logo: icon.svg, publisher: huddle01.com, slug: huddle01, isGlobal: false, // 非全局应用需要用户显式安装 email: supporthuddle01.com, appData: { location: { linkType: dynamic, // 动态链接会议链接在预约创建时生成 type: integrations:huddle01_video, label: Huddle01 Video, }, }, concurrentMeetings: true, // 支持并发会议 isOAuth: false, // 非 OAuth 流程当前为 API Token 模式 } as AppMeta;几个值得注意的设计点type: huddle01_video是整个集成的核心标识它贯穿于 Credential 记录、会议 location 类型和预约引用Booking Reference中保证各模块按同一标识关联appData.location声明了 Huddle01 作为动态链接dynamic会议提供商即会议链接不是预订时固定的而是在预约创建时由createMeeting动态生成concurrentMeetings: true表示同一凭证可同时创建多个会议这与 Huddle01 按 API Token 模式对接的模型一致。凭证获取从申请 API Token 到登录回跳第一步申请 Huddle01 API TokenHuddle01 目前尚未公开 OAuth 认证支持。根据 packages/app-store/huddle01video/README.md 的说明获取 API Token 的唯一途径是向supporthuddle01.com发送邮件邮件主题写明Require Huddle01 API Token在邮件中说明应用名称app name与 Token 用途purpose of token官方通过邮件回复分享 Token 详情。拿到 Token 后将其配置为环境变量HUDDLE01_API_TOKEN。适配器在每次请求前都会读取该变量若缺失则直接报错退出详见下文视频会议适配器一节。第二步第三方认证跳转应用安装入口 packages/app-store/huddle01video/api/add.ts 将用户重定向到 Huddle01 的第三方认证页面const params { response_type: code, redirect_uri: ${WEBAPP_URL}/api/integrations/huddle01video/callback, state, // 由 encodeOAuthState 编码的 OAuth 状态含 returnTo appName: Calcom, }; const url https://huddle01.app/thirdparty_auth?${query};该端点向https://huddle01.app/thirdparty_auth发起带参跳转state参数通过encodeOAuthState编码复用packages/app-store/_utils/oauth/encodeOAuthState用于回调时安全还原跳转来源。第三步回调与凭证存储用户完成 Huddle01 侧认证后浏览器会带着identityToken回到回调端点 packages/app-store/huddle01video/api/callback.ts。回调处理逻辑为通过getServerSession校验登录态未登录返回401 Unauthorized从 query 中取出identityToken兼容数组形式缺失则返回 401调用storeHuddle01Credential(userId, token)将 Token 持久化重定向回state.returnTo经getSafeRedirectUrl校验或已安装应用页面。凭证存储实现在 packages/app-store/huddle01video/utils/storage.ts基于 Prisma 的credential表按type: huddle01_video、appId: huddle01与userId定位记录存在则更新prisma.credential.update只更新key字段中的identityToken不存在则创建prisma.credential.create写入type、appId、userId与key: { identityToken }。读取侧getHuddle01Credential使用 zod 的huddle01AppKeySchema对credential.key做运行时校验要求必须包含identityToken字符串字段找不到凭证时抛出Huddle01 credential not found。这个写入 upsert 读取 schema 校验的模式保证了 Credential 数据的类型安全。视频会议适配器会议生命周期的四个核心操作Cal.com 通过VideoApiAdapter接口抽象所有视频会议提供商。Huddle01 的实现位于 packages/app-store/huddle01video/lib/VideoApiAdapter.ts通过 packages/app-store/huddle01video/lib/index.ts 导出。其底层调用固定的 API 端点const API_END_POINT https://platform-api.huddle01.workers.dev/api/v2/calendar;每次请求前fetchHuddleAPI会组装认证头将环境变量HUDDLE01_API_TOKEN作为x-api-key与数据库中的identityToken作为x-identity-token一并携带const headers { x-api-key: apiKey, // 应用级 API Token x-identity-token: identityToken, // 用户级身份 Token };如果环境变量缺失日志记录[Huddle01 Error] - app key not found并抛出Huddle01 app key not found。适配器统一返回一个带端点名参数的高阶函数支持subdomains、createMeeting、deleteMeeting、updateMeeting四种操作。createMeeting预约创建时生成会议createMeeting在用户发起预约时被调用向createMeeting端点发送POST请求请求体为事件CalendarEvent的标题与起止时间body: JSON.stringify({ title: e.title, startTime: e.startTime, endTime: e.endTime, }),响应解析出roomId与meetingLink后包装成标准会议引用返回return { type: huddle01_video, id: data.roomId, // 会议房间 ID password: , // Huddle01 无会议密码 url: data.meetingLink, // 参会链接 };updateMeeting改期时同步更新当预约被改期或内容调整时updateMeeting以PUT请求调用updateMeeting端点请求体在createMeeting基础上额外携带meetingId: bookingRef.uid即预约引用中保存的原始房间 ID用于定位并更新既有会议同样返回最新的roomId与meetingLink。deleteMeeting取消预约时清理会议预约取消时deleteMeeting以DELETE请求调用deleteMeeting端点仅需携带meetingId即可删除远端会议。getAvailability固定返回空由于 Huddle01 不提供类似日历忙闲的可用性接口getAvailability直接返回空数组[]表示对调度可用性无影响可用时段完全交由 Cal.com 自身的日程系统计算。此外三个会议操作在开始前都会检查credential.userId未登录用户会抛出User is not logged in整个调用过程由 try/catch 包裹并记录结构化日志通过logger.getSubLogger前缀为app-store/huddle01video/lib/VideoApiAdapter。实战接入要点与配置清单综合以上源码在 Cal.com 中启用 Huddle01 视频会议需满足以下前提申请应用 Token按上文流程向 Huddle01 官方邮件申请HUDDLE01_API_TOKEN配置环境变量在部署环境中设置HUDDLE01_API_TOKEN你的应用级 Token安装应用并完成身份绑定用户登录 Cal.com 后安装 Huddle01 应用跳转至 Huddle01 完成第三方认证回调将identityToken写入对应用户的credential记录type huddle01_videoappId huddle01在事件类型中选择会议地址创建或编辑事件类型时将会议地址location设为Huddle01 Video内部类型integrations:huddle01_video此后每次预约都会动态生成 Huddle01 会议链接取消或改期会自动同步远端会议状态。需要注意的限制当前版本为 API Token 模式isOAuth: false且应用级 Token 是全局共享的真正标识用户身份的是每人绑定后存储的identityToken因此凭证的安装、更新与读取流程是整个集成正确运行的关键环节。结语Huddle01 集成是 Cal.com 应用商店中一个典型的动态链接型视频会议接入范例它以轻量的_metadata.ts声明应用身份以API Token 用户身份 Token双凭证完成认证并通过实现VideoApiAdapter接口把会议创建、改期、删除三个生命周期动作映射到 Huddle01 的 Calendar API。若你计划为 Cal.com 接入其他视频会议服务或希望在自己的调度系统中复用类似的 Web3 会议能力上述源码路径与调用链是值得直接参考的完整实现样本。【免费下载链接】cal.diyScheduling infrastructure for absolutely everyone.项目地址: https://gitcode.com/GitHub_Trending/ca/cal.diy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表