servers.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { createHash, Color } from "./deps.ts";
  2. export interface server { host: string; secret: string };
  3. export class Servers {
  4. servers: server[]
  5. iterator: IterableIterator<server>
  6. current_server: server
  7. constructor() {
  8. this.servers = []
  9. this.iterator = undefined as unknown as IterableIterator<server>
  10. this.current_server = undefined as unknown as server
  11. }
  12. async init(): Promise<server[]> {
  13. // store your BBB servers in servers.json
  14. const file: string = await Deno.readTextFile('servers.json')
  15. this.servers = JSON.parse(file)
  16. // create an iterator so that we can treat all servers equally
  17. this.iterator = this.servers[Symbol.iterator]();
  18. this.check()
  19. this.get_available_server()
  20. return this.servers
  21. }
  22. check(): void {
  23. console.log('Checking servers first …')
  24. console.log(this.servers)
  25. // check servers for connectivity and if the secret is correct
  26. this.servers.forEach(async s => {
  27. const hash = createHash("sha1");
  28. hash.update(`getMeetings${s.secret}`)
  29. try {
  30. // throw an error if cannot connect or if secret fails
  31. const res = await fetch(`${s.host}/bigbluebutton/api/getMeetings?checksum=${hash.toString()}`)
  32. if (!res.ok) throw "Connection error. Please check your host configuration"
  33. const body = await res.text()
  34. const ok = body.includes('SUCCESS')
  35. console.log(`${s.host} is ${ok ? Color.green('ok') : Color.red('misconfigured. Please check your secret in servers.json')}`)
  36. if (!ok) throw "Configuration error. Exiting …"
  37. } catch (e) {
  38. // exit tinyscale if an error is encountered in servers.json
  39. console.log(Color.brightRed(e))
  40. Deno.exit(1);
  41. }
  42. })
  43. }
  44. // pick the next server, using an iterator to cycle through all servers available
  45. get_available_server(): server {
  46. let candidate = this.iterator.next()
  47. if (candidate.done) {
  48. this.iterator = this.servers[Symbol.iterator]()
  49. candidate = this.iterator.next()
  50. }
  51. console.log(`Using next server ${Color.green(candidate.value.host)}`)
  52. this.current_server = candidate.value;
  53. return this.current_server
  54. }
  55. }