Spaces:
Runtime error
Runtime error
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"));
|