9remote 0.1.32 → 0.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +27 -7
- package/index.js +1 -1
- package/package.json +1 -1
- package/utils/updateChecker.js +25 -5
package/dist/cli.cjs
CHANGED
|
@@ -61,34 +61,54 @@ ${N6.default.cursorShow}`)}releaseCursor(){this.extraLinesUnderPrompt>0&&Af(this
|
|
|
61
61
|
`:`
|
|
62
62
|
`)+t,i=n+1,n=r.indexOf(`
|
|
63
63
|
`,i)}while(n!==-1);return o+=r.slice(i),o}var{stdout:by,stderr:my}=hy,Xd=Symbol("GENERATOR"),ei=Symbol("STYLER"),lo=Symbol("IS_EMPTY"),yy=["ansi","ansi","ansi256","ansi16m"],ri=Object.create(null),nR=(r,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let t=by?by.level:0;r.level=e.level===void 0?t:e.level};var iR=r=>{let e=(...t)=>t.join(" ");return nR(e,r),Object.setPrototypeOf(e,fo.prototype),e};function fo(r){return iR(r)}Object.setPrototypeOf(fo.prototype,Function.prototype);for(let[r,e]of Object.entries(Ze))ri[r]={get(){let t=Qs(this,ex(e.open,e.close,this[ei]),this[lo]);return Object.defineProperty(this,r,{value:t}),t}};ri.visible={get(){let r=Qs(this,this[ei],!0);return Object.defineProperty(this,"visible",{value:r}),r}};var Zd=(r,e,t,...n)=>r==="rgb"?e==="ansi16m"?Ze[t].ansi16m(...n):e==="ansi256"?Ze[t].ansi256(Ze.rgbToAnsi256(...n)):Ze[t].ansi(Ze.rgbToAnsi(...n)):r==="hex"?Zd("rgb",e,t,...Ze.hexToRgb(...n)):Ze[t][r](...n),oR=["rgb","hex","ansi256"];for(let r of oR){ri[r]={get(){let{level:t}=this;return function(...n){let i=ex(Zd(r,yy[t],"color",...n),Ze.color.close,this[ei]);return Qs(this,i,this[lo])}}};let e="bg"+r[0].toUpperCase()+r.slice(1);ri[e]={get(){let{level:t}=this;return function(...n){let i=ex(Zd(r,yy[t],"bgColor",...n),Ze.bgColor.close,this[ei]);return Qs(this,i,this[lo])}}}}var aR=Object.defineProperties(()=>{},{...ri,level:{enumerable:!0,get(){return this[Xd].level},set(r){this[Xd].level=r}}}),ex=(r,e,t)=>{let n,i;return t===void 0?(n=r,i=e):(n=t.openAll+r,i=e+t.closeAll),{open:r,close:e,openAll:n,closeAll:i,parent:t}},Qs=(r,e,t)=>{let n=(...i)=>uR(n,i.length===1?""+i[0]:i.join(" "));return Object.setPrototypeOf(n,aR),n[Xd]=r,n[ei]=e,n[lo]=t,n},uR=(r,e)=>{if(r.level<=0||!e)return r[lo]?"":e;let t=r[ei];if(t===void 0)return e;let{openAll:n,closeAll:i}=t;if(e.includes("\x1B"))for(;t!==void 0;)e=py(e,t.close,t.open),t=t.parent;let o=e.indexOf(`
|
|
64
|
-
`);return o!==-1&&(e=vy(e,i,n,o)),n+e+i};Object.defineProperties(fo.prototype,ri);var sR=fo(),v$=fo({level:my?my.level:0});var A=sR;var c_=O(Vy(),1),oi=require("child_process"),Wt=O(require("path"),1),l_=require("url"),sc=O(require("fs"),1),f_=O(require("dns/promises"),1);var Ky=O($y(),1),ux=O(require("crypto"),1),{machineIdSync:bR}=Ky.default;async function ec(r=null){let e=r||process.env.MACHINE_ID_SALT||"9remote-salt";try{let t=bR();return ux.default.createHash("sha256").update(t+e).digest("hex").substring(0,16)}catch(t){return console.error("Error getting machine ID:",t),ux.default.randomUUID().replace(/-/g,"").substring(0,16)}}var Gy=O(require("crypto"),1),mR=process.env.API_KEY_SECRET||"9remote-api-key-secret";function yR(){let r="abcdefghijklmnopqrstuvwxyz0123456789",e="";for(let t=0;t<6;t++)e+=r.charAt(Math.floor(Math.random()*r.length));return e}function _R(r,e){return Gy.default.createHmac("sha256",mR).update(r+e).digest("hex").slice(0,8)}function ho(r){let e=yR(),t=_R(r,e);return{key:`sk-${r}-${e}-${t}`,keyId:e}}var Cr=O(require("fs"),1),tc=O(require("path"),1),Hy=O(require("os"),1),rc=tc.default.join(Hy.default.homedir(),".9remote"),sx=tc.default.join(rc,"state.json"),cx=tc.default.join(rc,"keys.json");function lx(){Cr.default.existsSync(rc)||Cr.default.mkdirSync(rc,{recursive:!0})}function Yy(r){try{lx(),Cr.default.writeFileSync(sx,JSON.stringify(r,null,2))}catch(e){console.error("Error saving state:",e)}}function zy(){try{Cr.default.existsSync(sx)&&Cr.default.unlinkSync(sx)}catch{}}function nc(){try{return lx(),Cr.default.existsSync(cx)?JSON.parse(Cr.default.readFileSync(cx,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function po(r,e,t="Default"){try{lx();let n={machineId:r,key:e,name:t,createdAt:new Date().toISOString()};return Cr.default.writeFileSync(cx,JSON.stringify(n,null,2)),n}catch(n){return console.error("Error saving key:",n),null}}async function fx(r,e){try{let t=await fetch(`${e}/api/temp-key/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:r,expiryMinutes:30})});if(!t.ok){let n=await t.json();throw new Error(n.error||"Failed to create temp key")}return await t.json()}catch(t){return console.error("Error creating temp key:",t),null}}var Nt=require("fs"),Qy=require("url"),Jy=require("child_process"),vo=O(require("path"),1),dx=O(require("os"),1),gR=vo.default.dirname((0,Qy.fileURLToPath)(__importMetaUrl)),Pe="9remote",DR=`https://registry.npmjs.org/${Pe}/latest`,wR=3e3,ER=8e3;function SR(){return"0.1.
|
|
64
|
+
`);return o!==-1&&(e=vy(e,i,n,o)),n+e+i};Object.defineProperties(fo.prototype,ri);var sR=fo(),v$=fo({level:my?my.level:0});var A=sR;var c_=O(Vy(),1),oi=require("child_process"),Wt=O(require("path"),1),l_=require("url"),sc=O(require("fs"),1),f_=O(require("dns/promises"),1);var Ky=O($y(),1),ux=O(require("crypto"),1),{machineIdSync:bR}=Ky.default;async function ec(r=null){let e=r||process.env.MACHINE_ID_SALT||"9remote-salt";try{let t=bR();return ux.default.createHash("sha256").update(t+e).digest("hex").substring(0,16)}catch(t){return console.error("Error getting machine ID:",t),ux.default.randomUUID().replace(/-/g,"").substring(0,16)}}var Gy=O(require("crypto"),1),mR=process.env.API_KEY_SECRET||"9remote-api-key-secret";function yR(){let r="abcdefghijklmnopqrstuvwxyz0123456789",e="";for(let t=0;t<6;t++)e+=r.charAt(Math.floor(Math.random()*r.length));return e}function _R(r,e){return Gy.default.createHmac("sha256",mR).update(r+e).digest("hex").slice(0,8)}function ho(r){let e=yR(),t=_R(r,e);return{key:`sk-${r}-${e}-${t}`,keyId:e}}var Cr=O(require("fs"),1),tc=O(require("path"),1),Hy=O(require("os"),1),rc=tc.default.join(Hy.default.homedir(),".9remote"),sx=tc.default.join(rc,"state.json"),cx=tc.default.join(rc,"keys.json");function lx(){Cr.default.existsSync(rc)||Cr.default.mkdirSync(rc,{recursive:!0})}function Yy(r){try{lx(),Cr.default.writeFileSync(sx,JSON.stringify(r,null,2))}catch(e){console.error("Error saving state:",e)}}function zy(){try{Cr.default.existsSync(sx)&&Cr.default.unlinkSync(sx)}catch{}}function nc(){try{return lx(),Cr.default.existsSync(cx)?JSON.parse(Cr.default.readFileSync(cx,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function po(r,e,t="Default"){try{lx();let n={machineId:r,key:e,name:t,createdAt:new Date().toISOString()};return Cr.default.writeFileSync(cx,JSON.stringify(n,null,2)),n}catch(n){return console.error("Error saving key:",n),null}}async function fx(r,e){try{let t=await fetch(`${e}/api/temp-key/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:r,expiryMinutes:30})});if(!t.ok){let n=await t.json();throw new Error(n.error||"Failed to create temp key")}return await t.json()}catch(t){return console.error("Error creating temp key:",t),null}}var Nt=require("fs"),Qy=require("url"),Jy=require("child_process"),vo=O(require("path"),1),dx=O(require("os"),1),gR=vo.default.dirname((0,Qy.fileURLToPath)(__importMetaUrl)),Pe="9remote",DR=`https://registry.npmjs.org/${Pe}/latest`,wR=3e3,ER=8e3;function SR(){return"0.1.34"}function OR(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let i=0;i<3;i++){if(n[i]>t[i])return!0;if(n[i]<t[i])return!1}return!1}function FR(){return process.env.CODESPACES==="true"||process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN?"GitHub Codespaces":(0,Nt.existsSync)("/.dockerenv")?"Docker":null}async function Xy(r=!1){if(r)return!1;let e=SR();if(!e)return!1;let t=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],n=0,i=null,o=u=>{process.stdout.isTTY&&(process.stdout.write(`\r${t[0]} ${u}`),i=setInterval(()=>{process.stdout.write(`\r${t[n++%t.length]} ${u}`)},80))},a=()=>{i&&(clearInterval(i),i=null),process.stdout.isTTY&&process.stdout.write("\r\x1B[K")};return new Promise(u=>{let s=!1,c=x=>{s||(s=!0,a(),u(x))},l=setTimeout(()=>c(!1),ER);o("Checking for updates..."),fetch(DR,{signal:AbortSignal.timeout(wR)}).then(x=>x.json()).then(x=>{if(s)return;clearTimeout(l);let h=x.version;if(!h||!OR(e,h)){c(!1);return}a(),console.log(A.green(`\u2705 New version available: ${e} \u2192 ${h}`));let p=FR();if(p){console.log(A.yellow(` \u26A0\uFE0F ${p} detected - manual update required`)),console.log(A.gray(` Run: npm install -g ${Pe}@latest
|
|
65
65
|
`)),c(!1);return}console.log(A.yellow(`\u{1F504} Auto-updating...
|
|
66
66
|
`));let b=process.argv.slice(2).filter(q=>q!=="--skip-update").join(" "),m=process.platform,y,_;if(m==="win32"){let q=`@echo off
|
|
67
67
|
echo \u{1F4E5} Downloading update...
|
|
68
|
+
echo \u23F3 Waiting for process to exit...
|
|
68
69
|
timeout /t 2 /nobreak >nul
|
|
70
|
+
|
|
71
|
+
echo \u{1F504} Installing new version...
|
|
72
|
+
call npm cache clean --force >nul 2>&1
|
|
69
73
|
call npm install -g ${Pe}@latest --prefer-online
|
|
74
|
+
|
|
70
75
|
if %ERRORLEVEL% EQU 0 (
|
|
71
|
-
echo \u2705 Update completed
|
|
76
|
+
echo \u2705 Update completed successfully
|
|
77
|
+
echo \u{1F680} Restarting with new version...
|
|
72
78
|
${Pe} ${b} --skip-update
|
|
73
79
|
) else (
|
|
74
|
-
echo \u274C Update failed
|
|
80
|
+
echo \u274C Update failed
|
|
81
|
+
echo \u{1F4A1} Try manually: npm install -g ${Pe}
|
|
82
|
+
echo \u{1F504} Starting with current version...
|
|
75
83
|
${Pe} ${b} --skip-update
|
|
76
84
|
)
|
|
77
85
|
`;y=vo.default.join(dx.default.tmpdir(),`${Pe}-update.bat`),(0,Nt.writeFileSync)(y,q),_=["cmd.exe",["/c",y]]}else{let q=`#!/bin/bash
|
|
78
86
|
echo "\u{1F4E5} Downloading update..."
|
|
87
|
+
echo "\u23F3 Waiting for process to exit..."
|
|
79
88
|
sleep 1
|
|
89
|
+
|
|
80
90
|
pkill -f "${Pe}" 2>/dev/null || true
|
|
81
91
|
sleep 1
|
|
92
|
+
|
|
93
|
+
echo "\u{1F504} Installing new version..."
|
|
94
|
+
npm cache clean --force 2>/dev/null
|
|
95
|
+
|
|
96
|
+
# Try to install with full output for debugging
|
|
82
97
|
npm install -g ${Pe}@latest --prefer-online 2>&1
|
|
83
|
-
|
|
84
|
-
|
|
98
|
+
EXIT_CODE=$?
|
|
99
|
+
|
|
100
|
+
if [ $EXIT_CODE -eq 0 ]; then
|
|
101
|
+
echo "\u2705 Update completed successfully"
|
|
102
|
+
echo "\u{1F680} Restarting with new version..."
|
|
85
103
|
${Pe} ${b} --skip-update
|
|
86
104
|
else
|
|
87
|
-
echo "\u274C Update failed
|
|
105
|
+
echo "\u274C Update failed (exit code: $EXIT_CODE)"
|
|
106
|
+
echo "\u{1F4A1} Update manually: npm install -g ${Pe}@latest"
|
|
107
|
+
echo "\u{1F504} Starting with current version..."
|
|
88
108
|
${Pe} ${b} --skip-update
|
|
89
109
|
fi
|
|
90
110
|
`;y=vo.default.join(dx.default.tmpdir(),`${Pe}-update.sh`),(0,Nt.writeFileSync)(y,q,{mode:493}),_=["sh",[y]]}(0,Jy.spawn)(_[0],_[1],{detached:!0,stdio:"inherit"}).unref(),process.exit(0)}).catch(()=>{clearTimeout(l),c(!1)})})}var pe=O(require("fs"),1),_o=O(require("path"),1),t_=O(require("https"),1),Ut=O(require("os"),1),uc=require("child_process"),yo=null,ic=null,ac=null,bo=_o.default.join(Ut.default.homedir(),".9remote","bin"),Zy="cloudflared",hx=Ut.default.platform()==="win32",CR=hx?`${Zy}.exe`:Zy,ti=_o.default.join(bo,CR),oc=_o.default.join(Ut.default.homedir(),".9remote","cloudflared.pid"),mo=!1,xx=5,e_=6e4,ni=[],ii=null,AR="https://github.com/cloudflare/cloudflared/releases/latest/download",qR={darwin:{x64:"cloudflared-darwin-amd64.tgz",arm64:"cloudflared-darwin-amd64.tgz"},win32:{x64:"cloudflared-windows-amd64.exe"},linux:{x64:"cloudflared-linux-amd64",arm64:"cloudflared-linux-arm64"}};function PR(){let r=Ut.default.platform(),e=Ut.default.arch(),t=qR[r];if(!t)throw new Error(`Unsupported platform: ${r}`);let n=t[e];if(!n)throw new Error(`Unsupported architecture: ${e} for platform ${r}`);return`${AR}/${n}`}async function n_(r,e){return new Promise((t,n)=>{let i=pe.default.createWriteStream(e);t_.default.get(r,o=>{if([301,302].includes(o.statusCode)){i.close(),pe.default.unlinkSync(e),n_(o.headers.location,e).then(t).catch(n);return}if(o.statusCode!==200){i.close(),pe.default.unlinkSync(e),n(new Error(`Download failed with status ${o.statusCode}`));return}o.pipe(i),i.on("finish",()=>{i.close(()=>t(e))}),i.on("error",a=>{i.close(),pe.default.unlinkSync(e),n(a)})}).on("error",o=>{i.close(),pe.default.existsSync(e)&&pe.default.unlinkSync(e),n(o)})})}async function px(){if(pe.default.existsSync(bo)||pe.default.mkdirSync(bo,{recursive:!0}),pe.default.existsSync(ti))return hx||pe.default.chmodSync(ti,"755"),ti;console.log("\u{1F4E5} Downloading tunnel binary...");let r=PR(),e=r.endsWith(".tgz"),t=e?_o.default.join(bo,"cloudflared.tgz"):ti;try{return await n_(r,t),e&&(console.log("\u2705 Extracting..."),(0,uc.execSync)(`tar -xzf "${t}" -C "${bo}"`,{stdio:"pipe"}),pe.default.unlinkSync(t)),hx||pe.default.chmodSync(ti,"755"),console.log("\u2705 cloudflared ready"),ti}catch(n){throw console.error("\u274C Failed to download cloudflared:",n.message),n}}var TR=["INF Starting tunnel","INF Version","GOOS:","Settings:","Autoupdate frequency","Generated Connector","Initial protocol","ICMP proxy","Created ICMP","Starting metrics server","curve preferences","Updated to new configuration"];async function i_(r,e=null){let t=await px();e&&(ii=e),ac=r;let n=(0,uc.spawn)(t,["tunnel","run","--token",r],{detached:!1,stdio:["ignore","pipe","pipe"]});mo=!1,console.log(`\u2705 Cloudflared spawned with PID: ${n.pid}`);let i=0,o=a=>{let u=a.toString().trim();if(!TR.some(s=>u.includes(s))&&!mo&&u.includes("Registered tunnel connection")){i++,i<=4&&(process.stdout.write(`\r \u2714 Connection ${i}/4 established`),i===4&&process.stdout.write(`
|
|
91
|
-
`));return}};return n.stdout.on("data",o),n.stderr.on("data",o),n.on("error",a=>{console.error("\u274C cloudflared error:",a)}),n.on("exit",(a,u)=>{if(console.log(`\u26A0\uFE0F Cloudflared process exited (code: ${a}, signal: ${u}, intentional: ${mo})`),mo)console.log("\u2139\uFE0F Cloudflared exit ignored (intentional shutdown)");else if(console.log("\u26A0\uFE0F Cloudflared unexpected exit detected - will restart"),ii){let s=Date.now();ni.push(s),ni=ni.filter(c=>c>s-e_),ni.length<=xx?(console.log(`\u{1F504} Restarting tunnel... (attempt ${ni.length}/${xx})`),setTimeout(()=>{console.log("\u{1F504} Executing tunnel restart..."),ii(r)},2e3)):console.log(`\u274C Too many tunnel restarts (${xx} in ${e_/1e3}s). Giving up.`)}else console.log("\u26A0\uFE0F No restart callback registered")}),pe.default.writeFileSync(oc,n.pid.toString()),BR(),n}function vx(){try{if(pe.default.existsSync(oc)){mo=!0;let r=parseInt(pe.default.readFileSync(oc,"utf8"));process.kill(r),pe.default.unlinkSync(oc),console.log("\u2705 Cloudflared killed")}}catch{}}function o_(){ni=[],ii=null,ac=null,jR()}function r_(){let r=Ut.default.networkInterfaces(),e=[];for(let[t,n]of Object.entries(r))if(n)for(let i of n)!i.internal&&i.family==="IPv4"&&e.push(`${t}:${i.address}`);return e.sort().join("|")}function BR(){yo||(ic=r_(),yo=setInterval(()=>{let r=r_();r!==ic&&(console.log("\u{1F504} Network change detected - restarting tunnel..."),ic=r,vx(),ii&&ac&&setTimeout(()=>{console.log("\u{1F504} Restarting tunnel after network change..."),ii(ac)},2e3))},5e3))}function jR(){yo&&(clearInterval(yo),yo=null),ic=null}var MR=process.argv.includes("--skip-update"),yx=Wt.default.dirname((0,l_.fileURLToPath)(__importMetaUrl)),RR=Wt.default.resolve(yx,".."),IR=Wt.default.join(yx,"server.cjs"),a_=Wt.default.join(RR,"server/index.js"),ft="https://
|
|
111
|
+
`));return}};return n.stdout.on("data",o),n.stderr.on("data",o),n.on("error",a=>{console.error("\u274C cloudflared error:",a)}),n.on("exit",(a,u)=>{if(console.log(`\u26A0\uFE0F Cloudflared process exited (code: ${a}, signal: ${u}, intentional: ${mo})`),mo)console.log("\u2139\uFE0F Cloudflared exit ignored (intentional shutdown)");else if(console.log("\u26A0\uFE0F Cloudflared unexpected exit detected - will restart"),ii){let s=Date.now();ni.push(s),ni=ni.filter(c=>c>s-e_),ni.length<=xx?(console.log(`\u{1F504} Restarting tunnel... (attempt ${ni.length}/${xx})`),setTimeout(()=>{console.log("\u{1F504} Executing tunnel restart..."),ii(r)},2e3)):console.log(`\u274C Too many tunnel restarts (${xx} in ${e_/1e3}s). Giving up.`)}else console.log("\u26A0\uFE0F No restart callback registered")}),pe.default.writeFileSync(oc,n.pid.toString()),BR(),n}function vx(){try{if(pe.default.existsSync(oc)){mo=!0;let r=parseInt(pe.default.readFileSync(oc,"utf8"));process.kill(r),pe.default.unlinkSync(oc),console.log("\u2705 Cloudflared killed")}}catch{}}function o_(){ni=[],ii=null,ac=null,jR()}function r_(){let r=Ut.default.networkInterfaces(),e=[];for(let[t,n]of Object.entries(r))if(n)for(let i of n)!i.internal&&i.family==="IPv4"&&e.push(`${t}:${i.address}`);return e.sort().join("|")}function BR(){yo||(ic=r_(),yo=setInterval(()=>{let r=r_();r!==ic&&(console.log("\u{1F504} Network change detected - restarting tunnel..."),ic=r,vx(),ii&&ac&&setTimeout(()=>{console.log("\u{1F504} Restarting tunnel after network change..."),ii(ac)},2e3))},5e3))}function jR(){yo&&(clearInterval(yo),yo=null),ic=null}var MR=process.argv.includes("--skip-update"),yx=Wt.default.dirname((0,l_.fileURLToPath)(__importMetaUrl)),RR=Wt.default.resolve(yx,".."),IR=Wt.default.join(yx,"server.cjs"),a_=Wt.default.join(RR,"server/index.js"),ft="https://9remote.cc",mx=2208,bx=10,u_=6e4,G=A.rgb(230,138,110),kR=A.rgb(200,120,95);function LR(){return"0.1.34"}function d_(){let r=LR(),e=Math.min(44,process.stdout.columns||44);console.log(""),console.log(G("\u2554"+"\u2550".repeat(e-2)+"\u2557")),console.log(G("\u2551")+" ".repeat(e-2)+G("\u2551"));let t=`\u{1F680} 9Remote v${r}`,n=Math.floor((e-2-t.length)/2);console.log(G("\u2551")+" ".repeat(n)+G.bold(t)+" ".repeat(e-2-n-t.length)+G("\u2551"));let i="Remote terminal access from anywhere",o=Math.floor((e-2-i.length)/2);console.log(G("\u2551")+" ".repeat(o)+A.gray(i)+" ".repeat(e-2-o-i.length)+G("\u2551")),console.log(G("\u2551")+" ".repeat(e-2)+G("\u2551")),console.log(G("\u255A"+"\u2550".repeat(e-2)+"\u255D")),console.log("")}function x_(r,e="\u{1F4F1} Scan QR to connect:"){console.log(G(`
|
|
92
112
|
${e}`)),c_.default.generate(r,{small:!0,type:"terminal",margin:0},t=>{let n=t.trim().split(`
|
|
93
113
|
`);console.log(n.join(`
|
|
94
114
|
`))})}async function h_(r,e){let t=await fx(r,ft);if(!t){console.log(A.red("\u274C Failed to create temp key"));return}let n=`${ft}/login?k=${t.tempKey}`,i=Math.min(44,process.stdout.columns||55);x_(n),console.log(A.gray(`
|
package/index.js
CHANGED
|
@@ -24,7 +24,7 @@ const PROJECT_ROOT = path.resolve(__dirname, "..");
|
|
|
24
24
|
// When running from cli/index.js (dev), use server/index.js
|
|
25
25
|
const STANDALONE_SERVER = path.join(__dirname, "server.cjs");
|
|
26
26
|
const DEV_SERVER = path.join(PROJECT_ROOT, "server/index.js");
|
|
27
|
-
const WORKER_URL = "https://
|
|
27
|
+
const WORKER_URL = "https://9remote.cc";
|
|
28
28
|
const SERVER_PORT = 2208;
|
|
29
29
|
const MAX_RESTART_ATTEMPTS = 10;
|
|
30
30
|
const RESTART_WINDOW_MS = 60000; // 1 minute
|
package/package.json
CHANGED
package/utils/updateChecker.js
CHANGED
|
@@ -172,13 +172,21 @@ export async function checkAndUpdate(skipUpdate = false) {
|
|
|
172
172
|
if (platform === "win32") {
|
|
173
173
|
const script = `@echo off
|
|
174
174
|
echo 📥 Downloading update...
|
|
175
|
+
echo ⏳ Waiting for process to exit...
|
|
175
176
|
timeout /t 2 /nobreak >nul
|
|
177
|
+
|
|
178
|
+
echo 🔄 Installing new version...
|
|
179
|
+
call npm cache clean --force >nul 2>&1
|
|
176
180
|
call npm install -g ${PACKAGE_NAME}@latest --prefer-online
|
|
181
|
+
|
|
177
182
|
if %ERRORLEVEL% EQU 0 (
|
|
178
|
-
echo ✅ Update completed
|
|
183
|
+
echo ✅ Update completed successfully
|
|
184
|
+
echo 🚀 Restarting with new version...
|
|
179
185
|
${PACKAGE_NAME} ${argsStr} --skip-update
|
|
180
186
|
) else (
|
|
181
|
-
echo ❌ Update failed
|
|
187
|
+
echo ❌ Update failed
|
|
188
|
+
echo 💡 Try manually: npm install -g ${PACKAGE_NAME}
|
|
189
|
+
echo 🔄 Starting with current version...
|
|
182
190
|
${PACKAGE_NAME} ${argsStr} --skip-update
|
|
183
191
|
)
|
|
184
192
|
`;
|
|
@@ -188,15 +196,27 @@ if %ERRORLEVEL% EQU 0 (
|
|
|
188
196
|
} else {
|
|
189
197
|
const script = `#!/bin/bash
|
|
190
198
|
echo "📥 Downloading update..."
|
|
199
|
+
echo "⏳ Waiting for process to exit..."
|
|
191
200
|
sleep 1
|
|
201
|
+
|
|
192
202
|
pkill -f "${PACKAGE_NAME}" 2>/dev/null || true
|
|
193
203
|
sleep 1
|
|
204
|
+
|
|
205
|
+
echo "🔄 Installing new version..."
|
|
206
|
+
npm cache clean --force 2>/dev/null
|
|
207
|
+
|
|
208
|
+
# Try to install with full output for debugging
|
|
194
209
|
npm install -g ${PACKAGE_NAME}@latest --prefer-online 2>&1
|
|
195
|
-
|
|
196
|
-
|
|
210
|
+
EXIT_CODE=$?
|
|
211
|
+
|
|
212
|
+
if [ $EXIT_CODE -eq 0 ]; then
|
|
213
|
+
echo "✅ Update completed successfully"
|
|
214
|
+
echo "🚀 Restarting with new version..."
|
|
197
215
|
${PACKAGE_NAME} ${argsStr} --skip-update
|
|
198
216
|
else
|
|
199
|
-
echo "❌ Update failed
|
|
217
|
+
echo "❌ Update failed (exit code: $EXIT_CODE)"
|
|
218
|
+
echo "💡 Update manually: npm install -g ${PACKAGE_NAME}@latest"
|
|
219
|
+
echo "🔄 Starting with current version..."
|
|
200
220
|
${PACKAGE_NAME} ${argsStr} --skip-update
|
|
201
221
|
fi
|
|
202
222
|
`;
|