Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/app-store/apps.metadata.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,11 @@ import zoho_bigin_config_json from "./zoho-bigin/config.json";
import zohocalendar_config_json from "./zohocalendar/config.json";
import zohocrm_config_json from "./zohocrm/config.json";
import { metadata as zoomvideo__metadata_ts } from "./zoomvideo/_metadata";
import { metadata as bigbluebuttonvideo__metadata_ts } from "./bigbluebuttonvideo/_metadata";


export const appStoreMetadata = {
bigbluebuttonvideo: bigbluebuttonvideo__metadata_ts,
alby: alby_config_json,
amie: amie_config_json,
applecalendar: applecalendar__metadata_ts,
Expand Down
30 changes: 30 additions & 0 deletions packages/app-store/bigbluebuttonvideo/_metadata.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import type { AppMeta } from "@calcom/types/App";

export const metadata = {
linkType: "dynamic",
name: "BigBlueButton",
description:
"BigBlueButton is an open-source web conferencing system for online learning. It provides real-time sharing of audio, video, slides, chat, and screen, and is designed for online classrooms with features like breakout rooms, polls, and whiteboard.",
type: "bigbluebutton_video",
categories: ["conferencing"],
variant: "conferencing",
logo: "icon.svg",
publisher: "Cal.com",
url: "https://bigbluebutton.org/",
category: "conferencing",
slug: "bigbluebutton",
title: "BigBlueButton",
email: "help@cal.com",
appData: {
location: {
default: false,
linkType: "dynamic",
type: "integrations:bigbluebutton",
label: "BigBlueButton",
},
},
dirName: "bigbluebuttonvideo",
isOAuth: false,
} as AppMeta;

export default metadata;
1 change: 1 addition & 0 deletions packages/app-store/bigbluebuttonvideo/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./_metadata";
42 changes: 42 additions & 0 deletions packages/app-store/bigbluebuttonvideo/lib/VideoApiAdapter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import crypto from "crypto";
import { v4 as uuidv4 } from "uuid";
import type { CalendarEvent } from "@calcom/types/Calendar";
import type { PartialReference } from "@calcom/types/EventManager";
import type { VideoApiAdapter, VideoCallData } from "@calcom/types/VideoApiAdapter";
import getAppKeysFromSlug from "../../_utils/getAppKeysFromSlug";
import { metadata } from "../_metadata";
function generateBBBChecksum(apiCall: string, queryString: string, secret: string): string {
const stringToHash = apiCall + queryString + secret;
return crypto.createHash("sha1").update(stringToHash).digest("hex");
}
function buildBBBUrl(
host: string,
apiCall: string,
params: Record<string, string>,
secret: string
): string {
const queryString = new URLSearchParams(params).toString();
const checksum = generateBBBChecksum(apiCall, queryString, secret);
return `${host}/bigbluebutton/api/${apiCall}?${queryString}&checksum=${checksum}`;
}
const BigBlueButtonVideoApiAdapter = (): VideoApiAdapter => {
return {
getAvailability: () => {
return Promise.resolve([]);
},
createMeeting: async (eventData: CalendarEvent): Promise<VideoCallData> => {
const appKeys = await getAppKeysFromSlug(metadata.slug);
const host = (appKeys.bbbHost as string) || "https://test.bigbluebutton.org";
const secret = (appKeys.bbbSecret as string) || "";
const meetingID = `cal-${uuidv4()}`;
const moderatorPW = crypto.randomBytes(8).toString("hex");
const attendeePW = crypto.randomBytes(8).toString("hex");
const createParams: Record<string, string> = {
name: eventData.title || "Cal.com Meeting",
meetingID: meetingID,
moderatorPW: moderatorPW,
attendeePW: attendeePW,
welcome: "Welcome to this Cal.com meeting powered by BigBlueButton!",
record: "true",
autoStartRecording: "false",allowStartStopRecording: "true",
};
1 change: 1 addition & 0 deletions packages/app-store/bigbluebuttonvideo/lib/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as VideoApiAdapter } from "./VideoApiAdapter";
12 changes: 12 additions & 0 deletions packages/app-store/bigbluebuttonvideo/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Internal @calcom dependencies should use the workspace protocol ("workspace:") like other app-store packages. Using "" can resolve to registry versions instead of local workspace packages, causing version drift in CI/dev.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/app-store/bigbluebuttonvideo/package.json, line 6:

<comment>Internal @calcom dependencies should use the workspace protocol ("workspace:*") like other app-store packages. Using "*" can resolve to registry versions instead of local workspace packages, causing version drift in CI/dev.</comment>

<file context>
@@ -0,0 +1,12 @@
+  "version": "0.0.1",
+  "main": "./index.ts",
+  "dependencies": {
+    "@calcom/lib": "*",
+    "@calcom/types": "*"
+  },
</file context>
Fix with Cubic

"name": "@calcom/bigbluebutton",
"version": "0.0.1",
"main": "./index.ts",
"dependencies": {
"@calcom/lib": "*",
"@calcom/types": "*"
},
"devDependencies": {
"@calcom/tsconfig": "*"
}
}
6 changes: 6 additions & 0 deletions packages/app-store/bigbluebuttonvideo/zod.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { z } from "zod";

export const appKeysSchema = z.object({
bbbHost: z.string().optional(),
bbbSecret: z.string().optional(),
});
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading