/**
* rMeets module — video meetings powered by Jitsi.
*
* Hub page with Quick Meet + room name input,
* room pages embed Jitsi via renderExternalAppShell.
*/
import { Hono } from "hono";
import { renderShell, renderExternalAppShell, escapeHtml } from "../../server/shell";
import { getModuleInfoList } from "../../shared/module";
import type { RSpaceModule } from "../../shared/module";
import { renderLanding } from "./landing";
const JITSI_URL = process.env.JITSI_URL || "https://jeffsi.localvibe.live";
const routes = new Hono();
// ── Room embed ──
routes.get("/room/:room", (c) => {
const space = c.req.param("space") || "demo";
const room = c.req.param("room");
const useApi = c.req.query("api") === "1";
if (useApi) {
const director = c.req.query("director") === "1";
const sessionId = c.req.query("session") || "";
return c.html(renderShell({
title: `${room} — rMeets | rSpace`,
moduleId: "rmeets",
spaceSlug: space,
modules: getModuleInfoList(),
theme: "dark",
body: ``,
scripts: ``,
}));
}
return c.html(renderExternalAppShell({
title: `${room} — rMeets | rSpace`,
moduleId: "rmeets",
spaceSlug: space,
modules: getModuleInfoList(),
appUrl: `${JITSI_URL}/${encodeURIComponent(room)}`,
appName: "Jitsi Meet",
theme: "dark",
}));
});
// ── Direct Jitsi lobby ──
routes.get("/meet", (c) => {
const space = c.req.param("space") || "demo";
return c.html(renderExternalAppShell({
title: `Jitsi Meet — rMeets | rSpace`,
moduleId: "rmeets",
spaceSlug: space,
modules: getModuleInfoList(),
appUrl: JITSI_URL,
appName: "Jitsi Meet",
theme: "dark",
}));
});
// ── Hub page ──
routes.get("/", (c) => {
const space = c.req.param("space") || "demo";
const base = `/${escapeHtml(space)}/rmeets`;
const randomId = Math.random().toString(36).slice(2, 10);
return c.html(renderShell({
title: `rMeets — ${space} | rSpace`,
moduleId: "rmeets",
spaceSlug: space,
modules: getModuleInfoList(),
styles: ``,
body: `
`,
}));
});
// ── Module export ──
export const meetsModule: RSpaceModule = {
id: "rmeets",
name: "rMeets",
icon: "📹",
description: "Video meetings powered by Jitsi",
scoping: { defaultScope: "space", userConfigurable: false },
routes,
landingPage: renderLanding,
externalApp: { url: JITSI_URL, name: "Jitsi Meet" },
outputPaths: [
{ path: "meet", name: "Create Call", icon: "🚀", description: "Start a new video meeting" },
{ path: "rooms", name: "Rooms", icon: "🚪", description: "Meeting rooms and video calls" },
{ path: "recordings", name: "Recordings", icon: "🎥", description: "Meeting recordings" },
],
};