From 87c774145d007d5dc496219624412c9be0fa7fc6 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Sat, 26 Apr 2025 15:15:57 -0300 Subject: [PATCH] feat(GBMinService): add endpoint for generating meeting tokens with LiveKit --- packages/core.gbapp/services/GBMinService.ts | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 01bdad2f9..4a3a045e7 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -567,6 +567,52 @@ export class GBMinService { }) .bind(min); + GBServer.globals.server + .all('/${min.instance.botId}/meeting-token', async (req, res) => { + try { + // 1. Validate request + const { room, identity, name } = req.query; + if (!room || !identity) { + return res.status(400).json({ error: 'Missing required parameters: room, identity' }); + } + + // 2. Get API keys from config (replace with your actual config access) + const apiKey = process.env.LIVEKIT_API_KEY; + const apiSecret = process.env.LIVEKIT_API_SECRET; + if (!apiKey || !apiSecret) { + return res.status(500).json({ error: 'Server misconfigured' }); + } + + // 3. Generate token + const { AccessToken } = require('livekit-server-sdk'); + const token = new AccessToken(apiKey, apiSecret, { + identity: identity.toString(), + name: name?.toString() || identity.toString() + }); + + // 4. Set permissions + token.addGrant({ + roomJoin: true, + room: room.toString(), + canPublish: true, + canSubscribe: true, + canPublishData: true + }); + + // 5. Set expiration (24 hours default) + token.setTtl(24 * 60 * 60); // 6 hours in seconds + + // 6. Return JWT + const jwt = token.toJwt(); + res.json({ token: jwt }); + + } catch (err) { + GBLog.error(`Meeting token generation failed: ${err}`); + res.status(500).json({ error: 'Token generation failed' }); + } + }); + + GBDeployer.mountGBKBAssets(`${botId}.gbkb`, botId, `${botId}.gbkb`); return min;