network.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. function setupNetworkInterface()
  2. {
  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 ipCopiedElem = document.getElementById("ipCopied");
  15. const loginUrlCb = (url) => {
  16. loginElem.href = url;
  17. loginElem.target = "_blank";
  18. statusElem.innerHTML = "Tailscale Login";
  19. resolveLogin(url);
  20. };
  21. const stateUpdateCb = (state) => {
  22. switch(state)
  23. {
  24. case 6 /*Running*/:
  25. {
  26. if (loginElemUrl) {
  27. loginElem.href = loginElemUrl;
  28. }
  29. break;
  30. }
  31. }
  32. };
  33. const netmapUpdateCb = (map) => {
  34. const ip = map.self.addresses[0];
  35. statusElem.innerText = "IP: "+ip;
  36. loginElem.title = "Right click to copy"
  37. const rmb_to_copy = (event) => {
  38. // To prevent the default contexmenu from showing up when right-clicking..
  39. event.preventDefault();
  40. // Copy the IP to the clipboard.
  41. window.navigator.clipboard.writeText(ip)
  42. .catch((msg) => { console.log("network.js: Copy ip to clipboard: Error: " + msg) });
  43. statusElem.style.visibility = "hidden";
  44. ipCopiedElem.style.visibility = "unset";
  45. setTimeout(() => {
  46. statusElem.style.visibility = "unset";
  47. ipCopiedElem.style.visibility = "hidden";
  48. }, 2000);
  49. };
  50. loginElem.addEventListener("contextmenu", rmb_to_copy);
  51. };
  52. loginElem.style.cursor = "pointer";
  53. loginElem.title = "Connect to Tailscale";
  54. statusElem.style.color = "white";
  55. return {
  56. loginUrlCb,
  57. stateUpdateCb,
  58. netmapUpdateCb,
  59. authKey,
  60. controlUrl,
  61. loginElem,
  62. statusElem,
  63. loginElemUrl,
  64. loginPromise,
  65. };
  66. }
  67. function registerNetworkLogin(cx, { authKey, statusElem, loginElem, loginElemUrl, loginPromise })
  68. {
  69. if (authKey) {
  70. if (loginElemUrl) {
  71. loginElem.href = loginElemUrl;
  72. loginElem.target = "_blank";
  73. }
  74. cx.networkLogin();
  75. } else {
  76. loginElem.onclick = () => {
  77. loginElem.onclick = null;
  78. statusElem.innerHTML = "Downloading network code...";
  79. const w = window.open("login.html", "_blank");
  80. async function waitLogin() {
  81. await cx.networkLogin();
  82. statusElem.innerHTML = "Starting login...";
  83. const url = await loginPromise;
  84. statusElem.innerHTML = "Login URL ready...";
  85. w.location.href = url;
  86. }
  87. waitLogin();
  88. };
  89. }
  90. }