diff --git a/index.html b/index.html
index 86e3a60..6b1bf86 100644
--- a/index.html
+++ b/index.html
@@ -40,34 +40,54 @@
window.networkInterface = {};
@@ -106,8 +126,8 @@
-
- Network Settings
+
+ Tailscale Login
diff --git a/tun/index.js b/tun/index.js
deleted file mode 100644
index 5f2b71d..0000000
--- a/tun/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import { init } from "./tailscale_tun.js";
-import { showPeers, showLoginURL } from "./ui.js";
-
-const { loginURL, ipStack } = await init({ netMapCallback: showPeers });
-showLoginURL(loginURL);
-const { connect, parseIP } = await ipStack;
-
-async function testTcp()
-{
- let p = await connect(parseIP("100.84.181.36"), 6666);
- if (!p)
- throw "cannot connect";
- p.onmessage = (ev) => {
- let str = "";
- if (ev.data == null)
- str = "CLOSED";
- else
- {
- let decoder = new TextDecoder();
- str = decoder.decode(ev.data)
- }
- console.log("received", str);
- };
- let encoder = new TextEncoder();
- let data = encoder.encode("hi from browser");
- p.postMessage(data, [data.buffer]);
-}
-
-testTcp();
diff --git a/tun/ipstack.js b/tun/ipstack.js
index d2e87e7..7adc736 100644
--- a/tun/ipstack.js
+++ b/tun/ipstack.js
@@ -13,10 +13,10 @@ function fetchBuffer(p){
}));
});
}
-function ___cxx_global_var_init$p3(){
+function ___cxx_global_var_init$p2(){
__ZN7IpStackL7chanMapE=_cheerpCreate_ZN6client4TMapIiPNS_14MessageChannelEEC2Ev();
}
-function ___cxx_global_var_init$p4(){
+function ___cxx_global_var_init$p3(){
__ZN7IpStackL11listenerMapE=_cheerpCreate_ZN6client4TMapIiPNS_13EventListenerEEC2Ev();
}
function _cheerpCreate_ZN6client4TMapIiPNS_13EventListenerEEC2Ev(){
@@ -58,7 +58,7 @@ function __ZN6cheerp14MakeTypedArrayIhN6client10Uint8ArrayEEEPT0_PKT_j(Lptr,Mptr
return tmp1.subarray((+(tmp0>>>0)));
}
function __Z14start_timeoutsv(){
- +setInterval(__ZN6cheerp8CallbackIZ14start_timeoutsvE3$_0EEPN6client13EventListenerEOT_(),100);
+ +setInterval(__ZN6cheerp8CallbackIZ14start_timeoutsvE3$_0EEPN6client13EventListenerEOT_(),10);
}
function __ZN6cheerp8CallbackIZ14start_timeoutsvE3$_0EEPN6client13EventListenerEOT_(){
var Lref$ptmp=null,Lcall1=null;
@@ -177,20 +177,15 @@ function __ZN7IpStack4downEv(){
__Z4downv();
}
function __ZN7IpStack5inputEPN6client10Uint8ArrayE(Lpkt){
- var LsavedStack=null,Ldata=0,Lcall1=null,Lcall1o=0,Lconv=0;
- LsavedStack=___getStackPtr();
- Lcall1=-16+LsavedStack|0;
- ___setStackPtr(Lcall1);
+ var Lconv=0,Lcall2=0,tmp2=null,tmp2o=0;
Lconv=~~ +Lpkt.length;
- Ldata=Lcall1|0;
- __ZNSt6vectorIhSaIhEEC2Ej(Ldata,Lconv);
- Lcall1=HEAP8;
- Lcall1o=__ZNSt6vectorIhSaIhEEixEj(Ldata,0)|0;
- __ZN6cheerp14MakeTypedArrayIhN6client10Uint8ArrayEEEPT0_PKT_j(Lcall1,Lcall1o,Lconv).set(Lpkt);
- Lconv=_pbuf_alloc(0,Lconv,386)|0;
- if((Lconv|0)!=(0|0))__Z22copy_to_pbuf_and_inputP4pbufRKSt6vectorIhSaIhEE(Lconv,Ldata);
- __ZNSt6vectorIhSaIhEED2Ev(Ldata);
- ___setStackPtr(LsavedStack);
+ Lcall2=_pbuf_alloc(0,Lconv)|0;
+ if((Lcall2|0)!=(0|0)){
+ tmp2o=HEAP32[4+Lcall2>>2];
+ tmp2=HEAP8;
+ __ZN6cheerp14MakeTypedArrayIhN6client10Uint8ArrayEEEPT0_PKT_j(tmp2,tmp2o,Lconv).set(Lpkt);
+ __ZN7IpStackL7doInputEP4pbuf(Lcall2);
+ }
}
function __ZN7IpStack6outputEPFvPN6client10Uint8ArrayEE(Lcallback){
__ZL9output_cb=Lcallback;
@@ -199,10 +194,7 @@ function __ZN7IpStack11recvAdapterEPN3tcp6SocketEPhj(Ls,Ldata,Mdata,Llen){
var Lcall1=null;
Lcall1=__ZN6client4TMapIiPNS_14MessageChannelEE3getEi(__ZN7IpStackL7chanMapE,((Ls|0)|0)).port2;
if(__ZN7IpStack10isWasmNullIhEEbPT_(Ldata,Mdata)|0){
- console.warn(_cheerpCreate_ZN6client6StringC2EPKc(HEAP8,1052568>>0));
__ZN3tcp6Socket5closeEv(Ls|0);
- __ZN3tcp6SocketD2Ev(Ls|0);
- _free(Ls|0);
Lcall1.postMessage(null);
return;
}
@@ -220,24 +212,6 @@ function __ZN7IpStack10isWasmNullIhEEbPT_(Lp,Mp){
}
return 0|0;
}
-function _cheerpCreate_ZN6client6StringC2EPKc(Larg0,Marg0){
- return String(__ZN6client6String11fromCharPtrIcEEPS0_PKT_(Larg0,Marg0));
-}
-function __ZN6client6String11fromCharPtrIcEEPS0_PKT_(Ls,Ms){
- var LretConstructor=null,tmp1=0,Lgeptoindexphi=0;
- LretConstructor=String();
- tmp1=Ls[Ms]|0;
- if((tmp1&255)===0)return LretConstructor;
- Lgeptoindexphi=0;
- while(1){
- LretConstructor=LretConstructor.concat(String.fromCharCode(tmp1<<24>>24));
- Lgeptoindexphi=Lgeptoindexphi+1|0;
- tmp1=Ls[Ms+Lgeptoindexphi|0]|0;
- if((tmp1&255)!==0)continue;
- break;
- }
- return LretConstructor;
-}
function __ZN7IpStack11connAdapterEPN3tcp6SocketEi(Ls,Lerr){
var tmp0=0,Lcall=null,Lcall2=null;
tmp0=((Ls|0)|0);
@@ -284,8 +258,9 @@ function __ZN7IpStackL12setupChannelEPN3tcp6SocketE(Ls){
Lcall1=LretConstructor.port2;
__ZN6client4TMapIiPNS_14MessageChannelEE3setEiS2_(__ZN7IpStackL7chanMapE,((Ls|0)|0),LretConstructor);
__ZN7IpStack8recvWasmEPN3tcp6SocketE(Ls|0);
- LretConstructor={a0:0};
- LretConstructor.a0=(Ls|0);
+ LretConstructor={a0:null,a1:0};
+ LretConstructor.a0=Lcall1;
+ LretConstructor.a1=(Ls|0);
Lcall1.onmessage=__ZN6cheerp8CallbackIZN7IpStackL12setupChannelEPN3tcp6SocketEE3$_7EEPN6client13EventListenerEOT_(LretConstructor);
}
function __ZN6client4TMapIiPNS_13EventListenerEE3setEiS2_(Lthis,Lk,Lv){
@@ -330,8 +305,9 @@ function __ZN6cheerp13ClosureHelperIZN7IpStackL12setupChannelEPN3tcp6SocketEE3$_
}
function __ZN6cheerp7ClosureIFvPN6client12MessageEventEEEC2IZN7IpStackL12setupChannelEPN3tcp6SocketEE3$_7EEOT_PNSt9enable_ifIXntsr3std14is_convertibleISC_PS4_EE5valueEvE4typeEPNSE_IXntsrNS5_13_must_destroyISC_EE5valueEvE4typeE(Lthis,Lf){
var tmp0=null,tmp1=null;
- tmp0=[{a0:0}];
- tmp0[0].a0=(Lf.a0|0);
+ tmp0=[{a0:null,a1:0}];
+ tmp0[0].a0=Lf.a0;
+ tmp0[0].a1=(Lf.a1|0);
tmp1=cheerpCreateClosure(__ZN6cheerp12InvokeHelperIvE6invokeIZN7IpStackL12setupChannelEPN3tcp6SocketEE3$_7JPN6client12MessageEventEEEEvPT_DpT0_,tmp0[0]);
Lthis.a0=tmp1;
Lthis.a1=null;
@@ -341,7 +317,7 @@ function __ZN6cheerp12InvokeHelperIvE6invokeIZN7IpStackL12setupChannelEPN3tcp6So
__ZZN7IpStackL12setupChannelEPN3tcp6SocketEENK3$_7clEPN6client12MessageEventE(Lfunc,Largs);
}
function __ZZN7IpStackL12setupChannelEPN3tcp6SocketEENK3$_7clEPN6client12MessageEventE(Lthis,Lev){
- var LsavedStack=null,Lcall=null,Lcall8=null,Lcall8o=0,Lcall7=null,Lcall7o=0,Lbuf=0,Li$p04=0;
+ var LsavedStack=null,Lcall=null,Lbuf=0,Lcall8=null,Lcall8o=0,Lcall7=null,Lcall7o=0,Li$p03=0;
LsavedStack=___getStackPtr();
Lcall7=-16+LsavedStack|0;
___setStackPtr(Lcall7);
@@ -350,27 +326,23 @@ function __ZZN7IpStackL12setupChannelEPN3tcp6SocketEENK3$_7clEPN6client12Message
Lbuf=Lcall7|0;
__ZNSt6vectorIhSaIhEEC2Ej(Lbuf,~~ +Lcall.length);
if( +Lcall.length>0){
- Li$p04=0;
+ Li$p03=0;
while(1){
- Lcall7=__ZN6client10Uint8ArrayixEi(Lcall,Li$p04);
+ Lcall7=__ZN6client10Uint8ArrayixEi(Lcall,Li$p03);
Lcall7o=oSlot;
Lcall8=HEAP8;
- Lcall8o=__ZNSt6vectorIhSaIhEEixEj(Lbuf,Li$p04)|0;
+ Lcall8o=__ZNSt6vectorIhSaIhEEixEj(Lbuf,Li$p03)|0;
Lcall8[Lcall8o]=Lcall7[Lcall7o]|0;
- Li$p04=Li$p04+1|0;
- if( +Lcall.length>(+(Li$p04|0)))continue;
+ Li$p03=Li$p03+1|0;
+ if( +Lcall.length>(+(Li$p03|0)))continue;
break;
}
}
- __ZN7IpStack8sendWasmEPN3tcp6SocketERKSt6vectorIhSaIhEE(Lthis.a0|0,Lbuf);
+ __ZN7IpStack8sendWasmEPN3tcp6SocketERKSt6vectorIhSaIhEE(Lthis.a1|0,Lbuf);
__ZNSt6vectorIhSaIhEED2Ev(Lbuf);
}else{
- __ZN3tcp6Socket5closeEv(Lthis.a0|0);
- Lbuf=Lthis.a0|0;
- if((Lbuf|0)!=(0|0)){
- __ZN3tcp6SocketD2Ev(Lbuf);
- _free(Lbuf|0);
- }
+ __ZN3tcp6Socket5closeEv(Lthis.a1|0);
+ Lthis.a0.onmessage=null;
}
___setStackPtr(LsavedStack);
}
@@ -430,6 +402,10 @@ function __ZN6cheerp7ClosureIFvPN6client12MessageEventEEEC2IZN7IpStack6listenEiE
Lthis.a2=tmp0[0];
}
function __ZN6cheerp12InvokeHelperIvE6invokeIZN7IpStack6listenEiE3$_4JPN6client12MessageEventEEEEvPT_DpT0_(Lfunc,Largs){
+ __ZZN7IpStack6listenEiENK3$_4clEPN6client12MessageEventE(Lfunc);
+}
+function __ZZN7IpStack6listenEiENK3$_4clEPN6client12MessageEventE(Lthis){
+ __ZN3tcp6Socket5closeEv(Lthis.a0|0);
}
function __ZN7IpStack14recvAdapterUdpEPN3udp6SocketEPhjii(Ls,Ldata,Mdata,Llen,Laddr,Lport){
var Lcall=0,Lcall2=null;
@@ -483,7 +459,7 @@ function __ZN6cheerp12InvokeHelperIvE6invokeIZN7IpStack4bindEiE3$_6JPN6client12M
__ZZN7IpStack4bindEiENK3$_6clEPN6client12MessageEventE(Lfunc,Largs);
}
function __ZZN7IpStack4bindEiENK3$_6clEPN6client12MessageEventE(Lthis,Lev){
- var LsavedStack=null,Lcall=null,Lcall3=null,Lcall9=null,Lcall9o=0,Lcall11=0,Lcall8=null,Lcall8o=0,Lbuf=0,Li$p04=0;
+ var LsavedStack=null,Lcall=null,Lcall3=null,Lbuf=0,Lcall9=null,Lcall9o=0,Lcall11=0,Lcall8=null,Lcall8o=0,Li$p03=0;
LsavedStack=___getStackPtr();
Lcall8=-16+LsavedStack|0;
___setStackPtr(Lcall8);
@@ -493,38 +469,31 @@ function __ZZN7IpStack4bindEiENK3$_6clEPN6client12MessageEventE(Lthis,Lev){
Lbuf=Lcall8|0;
__ZNSt6vectorIhSaIhEEC2Ej(Lbuf,~~ +Lcall3.length);
if( +Lcall3.length>0){
- Li$p04=0;
+ Li$p03=0;
while(1){
- Lcall8=__ZN6client10Uint8ArrayixEi(Lcall3,Li$p04);
+ Lcall8=__ZN6client10Uint8ArrayixEi(Lcall3,Li$p03);
Lcall8o=oSlot;
Lcall9=HEAP8;
- Lcall9o=__ZNSt6vectorIhSaIhEEixEj(Lbuf,Li$p04)|0;
+ Lcall9o=__ZNSt6vectorIhSaIhEEixEj(Lbuf,Li$p03)|0;
Lcall9[Lcall9o]=Lcall8[Lcall8o]|0;
- Li$p04=Li$p04+1|0;
- if( +Lcall3.length>(+(Li$p04|0)))continue;
+ Li$p03=Li$p03+1|0;
+ if( +Lcall3.length>(+(Li$p03|0)))continue;
break;
}
}
- Li$p04=Lcall.addr;
+ Li$p03=Lcall.addr;
Lcall11=Lcall.port;
- __ZN7IpStack11sendWasmUdpEPN3udp6SocketERKSt6vectorIhSaIhEEjj(Lthis.a0|0,Lbuf,Li$p04,Lcall11);
+ __ZN7IpStack11sendWasmUdpEPN3udp6SocketERKSt6vectorIhSaIhEEjj(Lthis.a0|0,Lbuf,Li$p03,Lcall11);
__ZNSt6vectorIhSaIhEED2Ev(Lbuf);
- }else{
- __ZN3udp6Socket5closeEv(Lthis.a0|0);
- Lbuf=Lthis.a0|0;
- if((Lbuf|0)!=(0|0)){
- __ZN3udp6SocketD2Ev(Lbuf);
- _free(Lbuf|0);
- }
- }
+ }else __ZN3udp6Socket5closeEv(Lthis.a0|0);
___setStackPtr(LsavedStack);
}
function __ZN10__cxxabiv1L24__cxa_throw_wasm_adapterEjPSt9type_infoj(Lthrown_object){
var Ldest$paddr=null,Lref$ptmp=null,Ltinfo$paddr=null;
Ltinfo$paddr=[0];
- Ltinfo$paddr[0]=(1048752|0);
+ Ltinfo$paddr[0]=(1048880|0);
Ldest$paddr=[0];
- Ldest$paddr[0]=((58|0)|0);
+ Ldest$paddr[0]=((59|0)|0);
Lref$ptmp=[nullObj];
Lref$ptmp[0]={d:null,o:Lthrown_object};
Ltinfo$paddr=__ZN10__cxxabiv19Exception8allocateIJPvRPSt9type_infoRjEEEPS0_DpOT_(Lref$ptmp,0,Ltinfo$paddr,0,Ldest$paddr,0);
@@ -598,6 +567,20 @@ function __ZN10__cxxabiv1L8do_throwEPNS_9ExceptionE(Lex){
throw LretConstructor8;
;
}
+function _cheerpCreate_ZN6client6StringC2EPKc(Larg0,Marg0){
+ var LretConstructor$pi=null,Lgeptoindexphi=0,LcheerpPtrAlloca$p07$pi=null;
+ LretConstructor$pi=String();
+ if((Larg0[Marg0]&255)===0)return String(LretConstructor$pi);
+ Lgeptoindexphi=0;
+ while(1){
+ LcheerpPtrAlloca$p07$pi=String.fromCharCode(Larg0[Marg0+Lgeptoindexphi|0]<<24>>24);
+ LretConstructor$pi=LretConstructor$pi.concat(LcheerpPtrAlloca$p07$pi);
+ Lgeptoindexphi=Lgeptoindexphi+1|0;
+ if((Larg0[Marg0+Lgeptoindexphi|0]&255)!==0)continue;
+ break;
+ }
+ return String(LretConstructor$pi);
+}
function _print(Lbuf,Mbuf,Llen){
var Lcall=null,Lsub=0;
Lcall=__ZN6client6String8fromUtf8EPKcj(Lbuf,Mbuf,Llen);
@@ -652,8 +635,8 @@ function __ZN6client6String8fromUtf8EPKcj(Lin,Min,Llen){
}
function __start(){
___cxx_global_var_init();
+ ___cxx_global_var_init$p2();
___cxx_global_var_init$p3();
- ___cxx_global_var_init$p4();
}
function ___wrapper__print(Larg0,Larg1){
_print(HEAP8,Larg0>>0,Larg1);
@@ -752,8 +735,8 @@ var __ZN3tcp6Socket4bindEii=null;
var __ZN3tcp6Socket6listenEv=null;
var __ZN7IpStack10acceptWasmEPN3tcp6SocketE=null;
var __ZN3tcp6SocketD2Ev=null;
-var __ZN7IpStack8recvWasmEPN3tcp6SocketE=null;
var __ZN3tcp6Socket5closeEv=null;
+var __ZN7IpStack8recvWasmEPN3tcp6SocketE=null;
var __ZN7IpStack8sendWasmEPN3tcp6SocketERKSt6vectorIhSaIhEE=null;
var __ZN7IpStack11connectWasmEPN3tcp6SocketEii=null;
var __ZN2ip4stonERKSs=null;
@@ -762,7 +745,7 @@ var __ZNSsC2Ev=null;
var __ZNSs6resizeEj=null;
var __ZNSsixEj_icf=null;
var _pbuf_alloc=null;
-var __Z22copy_to_pbuf_and_inputP4pbufRKSt6vectorIhSaIhEE=null;
+var __ZN7IpStackL7doInputEP4pbuf=null;
var __Z4downv=null;
var __ZNSt13unordered_mapISsSsSt4hashISsESt8equal_toISsESaISt4pairIKSsSsEEEC2Ev=null;
var __ZNSt13unordered_mapISsSsSt4hashISsESt8equal_toISsESaISt4pairIKSsSsEEE7emplaceIJSsSsEEES4_ISt19__hash_map_iteratorISt15__hash_iteratorIPSt11__hash_nodeISt17__hash_value_typeISsSsEPvEEEbEDpOT_=null;
@@ -821,8 +804,8 @@ export default function(Lh){
__ZN3tcp6Socket6listenEv=__asm.__ZN3tcp6Socket6listenEv;
__ZN7IpStack10acceptWasmEPN3tcp6SocketE=__asm.__ZN7IpStack10acceptWasmEPN3tcp6SocketE;
__ZN3tcp6SocketD2Ev=__asm.__ZN3tcp6SocketD2Ev;
- __ZN7IpStack8recvWasmEPN3tcp6SocketE=__asm.__ZN7IpStack8recvWasmEPN3tcp6SocketE;
__ZN3tcp6Socket5closeEv=__asm.__ZN3tcp6Socket5closeEv;
+ __ZN7IpStack8recvWasmEPN3tcp6SocketE=__asm.__ZN7IpStack8recvWasmEPN3tcp6SocketE;
__ZN7IpStack8sendWasmEPN3tcp6SocketERKSt6vectorIhSaIhEE=__asm.__ZN7IpStack8sendWasmEPN3tcp6SocketERKSt6vectorIhSaIhEE;
__ZN7IpStack11connectWasmEPN3tcp6SocketEii=__asm.__ZN7IpStack11connectWasmEPN3tcp6SocketEii;
__ZN2ip4stonERKSs=__asm.__ZN2ip4stonERKSs;
@@ -831,7 +814,7 @@ export default function(Lh){
__ZNSs6resizeEj=__asm.__ZNSs6resizeEj;
__ZNSsixEj_icf=__asm.__ZNSsixEj_icf;
_pbuf_alloc=__asm._pbuf_alloc;
- __Z22copy_to_pbuf_and_inputP4pbufRKSt6vectorIhSaIhEE=__asm.__Z22copy_to_pbuf_and_inputP4pbufRKSt6vectorIhSaIhEE;
+ __ZN7IpStackL7doInputEP4pbuf=__asm.__ZN7IpStackL7doInputEP4pbuf;
__Z4downv=__asm.__Z4downv;
__ZNSt13unordered_mapISsSsSt4hashISsESt8equal_toISsESaISt4pairIKSsSsEEEC2Ev=__asm.__ZNSt13unordered_mapISsSsSt4hashISsESt8equal_toISsESaISt4pairIKSsSsEEEC2Ev;
__ZNSt13unordered_mapISsSsSt4hashISsESt8equal_toISsESaISt4pairIKSsSsEEE7emplaceIJSsSsEEES4_ISt19__hash_map_iteratorISt15__hash_iteratorIPSt11__hash_nodeISt17__hash_value_typeISsSsEPvEEEbEDpOT_=__asm.__ZNSt13unordered_mapISsSsSt4hashISsESt8equal_toISsESaISt4pairIKSsSsEEE7emplaceIJSsSsEEES4_ISt19__hash_map_iteratorISt15__hash_iteratorIPSt11__hash_nodeISt17__hash_value_typeISsSsEPvEEEbEDpOT_;
diff --git a/tun/ipstack.wasm b/tun/ipstack.wasm
index 7aedda9..0ba2984 100644
Binary files a/tun/ipstack.wasm and b/tun/ipstack.wasm differ
diff --git a/tun/tailscale.wasm b/tun/tailscale.wasm
index 074c632..f1f2ed9 100755
Binary files a/tun/tailscale.wasm and b/tun/tailscale.wasm differ
diff --git a/tun/tailscale_tun.js b/tun/tailscale_tun.js
index 60d8be2..94dc365 100644
--- a/tun/tailscale_tun.js
+++ b/tun/tailscale_tun.js
@@ -2,8 +2,17 @@ import "./wasm_exec.js";
import ipStackAwait from "./ipstack.js";
-export async function init({ stateUpdateCb, netMapCb, loginUrlCb })
-{
+export const State = {
+ NoState: 0,
+ InUseOtherUser: 1,
+ NeedsLogin: 2,
+ NeedsMachineAuth: 3,
+ Stopped: 4,
+ Starting: 5,
+ Running: 6,
+};
+
+export async function init() {
const {IpStack} = await ipStackAwait();
const wasmUrl = new URL("tailscale.wasm", import.meta.url);
@@ -11,16 +20,11 @@ export async function init({ stateUpdateCb, netMapCb, loginUrlCb })
let {instance} = await WebAssembly.instantiateStreaming(fetch(wasmUrl),go.importObject);
go.run(instance);
- const State = {
- NoState: 0,
- InUseOtherUser: 1,
- NeedsLogin: 2,
- NeedsMachineAuth: 3,
- Stopped: 4,
- Starting: 5,
- Running: 6,
- };
-
+ const listeners = {
+ onstateupdate: () => {},
+ onnetmap: () => {},
+ onloginurl: () => {},
+ }
const sessionStateStorage = {
setState(id, value) {
@@ -54,11 +58,10 @@ export async function init({ stateUpdateCb, netMapCb, loginUrlCb })
let dnsIp = null;
ipn.run({
- notifyState: stateUpdateCb,
+ notifyState: (s) => listeners.onstateupdate(s),
notifyNetMap: (s) => {
const netMap = JSON.parse(s);
- if (netMapCb)
- netMapCb(netMap);
+ listeners.onnetmap(netMap);
const newLocalIp = netMap.self.addresses[0];
if (localIp != newLocalIp)
{
@@ -69,7 +72,7 @@ export async function init({ stateUpdateCb, netMapCb, loginUrlCb })
}});
}
},
- notifyBrowseToURL: loginUrlCb,
+ notifyBrowseToURL: (l) => listeners.onloginurl(l),
});
return {
@@ -88,6 +91,7 @@ export async function init({ stateUpdateCb, netMapCb, loginUrlCb })
},
login: () => ipn.login(),
logout: () => ipn.logout(),
+ listeners
};
}
diff --git a/tun/tailscale_tun_auto.js b/tun/tailscale_tun_auto.js
new file mode 100644
index 0000000..37f5b80
--- /dev/null
+++ b/tun/tailscale_tun_auto.js
@@ -0,0 +1,82 @@
+import {State, init} from "./tailscale_tun.js";
+
+export async function autoConf({loginUrlCb, stateUpdateCb, netmapUpdateCb}) {
+ const { listen, connect, bind, parseIP, up, down, login, logout, listeners } = await init();
+
+ const getSettings = () => {
+ settings.controlUrl = null;
+ settings.exitNodeIp = null;
+ settings.dnsIp = null;
+ settings.wantsRunning = true;
+ };
+
+ const settings = {
+ controlUrl: undefined,
+ exitNodeIp: undefined,
+ dnsIp: undefined,
+ wantsRunning: true,
+ };
+
+ listeners.onstateupdate = (state) => {
+ stateUpdateCb(state);
+ switch(state)
+ {
+ case State.NeedsLogin:
+ {
+ login();
+ break;
+ }
+ case State.Running:
+ {
+ break;
+ }
+ case State.Starting:
+ {
+ break;
+ }
+ case State.Stopped:
+ {
+ break;
+ }
+ case State.NoState:
+ {
+ up(settings);
+ break;
+ }
+ default:
+ {
+ console.log(state);
+ break;
+ }
+ }
+ };
+
+
+ listeners.onloginurl = (login) => {
+ console.log("login url:",login);
+ loginUrlCb(login);
+ };
+
+ listeners.onnetmap = (map) => {
+ netmapUpdateCb(map);
+ if (!settings.exitNodeIp) {
+ for (let p of map.peers) {
+ if (p.online && p.exitNode) {
+ settings.exitNodeIp = p.addresses[0];
+ settings.dnsIp = "8.8.8.8";
+ up(settings);
+ }
+ }
+ }
+ };
+
+ up(settings);
+
+ return {
+ bind,
+ connect,
+ listen,
+ parseIP,
+ }
+}
+