network.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { State } from "/tun/tailscale_tun.js";
  2. import { autoConf } from "/tun/tailscale_tun_auto.js";
  3. let resolveLogin = null;
  4. let loginPromise = new Promise((f,r) => {
  5. resolveLogin = f;
  6. });
  7. const loginElem = document.getElementById("loginLink");
  8. const statusElem = document.getElementById("networkStatus");
  9. const loginUrlCb = (url) => {
  10. loginElem.href = url;
  11. loginElem.target = "_blank";
  12. statusElem.innerHTML = "Tailscale Login";
  13. resolveLogin(url);
  14. };
  15. const stateUpdateCb = (state) => {
  16. switch(state)
  17. {
  18. case State.NeedsLogin:
  19. {
  20. break;
  21. }
  22. case State.Running:
  23. {
  24. loginElem.href = "https://login.tailscale.com/admin/machines";
  25. break;
  26. }
  27. case State.Starting:
  28. {
  29. break;
  30. }
  31. case State.Stopped:
  32. {
  33. break;
  34. }
  35. case State.NoState:
  36. {
  37. break;
  38. }
  39. }
  40. };
  41. const netmapUpdateCb = (map) => {
  42. const ip = map.self.addresses[0];
  43. statusElem.innerHTML = "IP: "+ip;
  44. };
  45. const { listen, connect, bind, up } = await autoConf({
  46. loginUrlCb,
  47. stateUpdateCb,
  48. netmapUpdateCb,
  49. });
  50. window.networkInterface.bind = bind;
  51. window.networkInterface.connect = connect;
  52. window.networkInterface.listen = listen;
  53. window.networkInterface.ready = true;
  54. loginElem.style.cursor = "pointer";
  55. statusElem.style.color = "white";
  56. loginElem.onclick = () => {
  57. loginElem.onclick = null;
  58. statusElem.innerHTML = "Downloading network code...";
  59. const w = window.open("login.html", "_blank");
  60. async function waitLogin() {
  61. await up();
  62. statusElem.innerHTML = "Starting login...";
  63. const url = await loginPromise;
  64. w.location.href = url;
  65. }
  66. waitLogin();
  67. };