network.js 2.2 KB

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