File size: 1,661 Bytes
d390f23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// app.js
import express from "express";
import crypto from "crypto";
import { RtcRole, RtcTokenBuilder } from "agora-access-token";

const app = express();
app.use(express.json());

const AGORA_APP_ID = process.env.AGORA_APP_ID;
const AGORA_APP_CERTIFICATE = process.env.AGORA_APP_CERTIFICATE;

// Root route
app.get("/", (req, res) => {
  res.send("βœ… Agora Token API is running on Hugging Face!");
});

// Token generation route
app.post("/generate-token", (req, res) => {
  try {
    const { channelName, firebaseUid, role } = req.body;

    if (!channelName || !firebaseUid) {
      return res.status(400).json({
        error: "channelName and firebaseUid are required.",
      });
    }

    const agoraRole = role === "subscriber" ? RtcRole.SUBSCRIBER : RtcRole.PUBLISHER;

    // Convert Firebase UID β†’ deterministic Agora UID
    const agoraUid = parseInt(
      crypto.createHash("md5").update(firebaseUid).digest("hex").slice(0, 6),
      16
    );

    // Token expiry (1 hour)
    const expireTime = 3600;
    const now = Math.floor(Date.now() / 1000);
    const privilegeExpiredTs = now + expireTime;

    // Build token
    const token = RtcTokenBuilder.buildTokenWithUid(
      AGORA_APP_ID,
      AGORA_APP_CERTIFICATE,
      channelName,
      agoraUid,
      agoraRole,
      privilegeExpiredTs
    );

    return res.status(200).json({
      token,
      appId: AGORA_APP_ID,
      agoraUid,
      expireTime,
    });
  } catch (err) {
    console.error("Error generating token:", err);
    return res.status(500).json({ error: err.message });
  }
});

app.listen(7860, "0.0.0.0", () => console.log("πŸš€ Server started on port 7860"));