12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import { createError, opine, proxy, ErrorRequestHandler, Router, createHash } from "./deps.ts";
- export interface server { host: string; secret: string };
- import { BBB } from './bbb.ts';
- const secret = Deno.env.get("TINYSCALE_SECRET") || ""
- if (!secret) throw "No secret set for tinyscale"
- const file: string = await Deno.readTextFile('servers.json')
- const servers: server[] = JSON.parse(file)
- let iterator = servers[Symbol.iterator]();
- console.log(servers)
- console.log('Checking servers first …')
- servers.forEach(async s => {
- const hash = createHash("sha1");
- hash.update(`getMeetings${s.secret}`)
- try {
-
- const res = await fetch(`${s.host}/bigbluebutton/api/getMeetings?checksum=${hash.toString()}`)
- if (!res.ok) throw "Connection error. Please check your host configuration"
- const body = await res.text()
- const ok = body.includes('SUCCESS')
- console.log(`${s.host} is ${ok ? 'ok':'misconfigured. Please check your secret in servers.json'}`)
- if (!ok) throw "Configuration error. Exiting …"
- } catch (e) {
-
- console.log(e)
- Deno.exit(1);
- }
- })
- function get_available_server(): server {
- let candidate = iterator.next()
- if (candidate.done) {
- iterator = servers[Symbol.iterator]()
- candidate = iterator.next()
- }
- console.log(`Using next server ${candidate.value.host}`)
- return candidate.value;
- }
- const router = Router()
- const api = async (req, res, next) => {
- const handler = new BBB(req)
- if (!handler.authenticated(secret)) {
- res.setStatus(401).end()
- return
- }
- let server: server
- try {
- server = await handler.find_meeting_id(servers)
- } catch (e) {
- console.log(`Found no server with Meeting ID ${handler.meeting_id}`)
- server = get_available_server()
- }
- console.log(`Redirecting to ${server.host}`)
- const redirect = handler.rewritten_query(server)
- console.log(redirect)
- return redirect
- };
- router.all("/bigbluebutton/api/:call", api)
- router.get("/bigbluebutton/api", (req, res, next) => {
- console.log('sending fake xml response')
- res.set('Content-Type', 'text/xml');
- res.send(`<response>
- <returncode>SUCCESS</returncode>
- <version>2.0</version>
- </response>`);
- })
- const errorHandler: ErrorRequestHandler = (err, req, res, next) => {
- res.setStatus(err.status ?? 500);
- console.log(res.status, req.originalUrl)
- res.end();
- };
- const app = opine()
- .use(async (req, res, next) => {
- console.log(req.method, req.originalUrl)
- next()
- })
- .use("/", router)
- .use((req, res, next) => { next(createError(404)); })
- .use(errorHandler);
- export default app;
|