code-server
Version:
Run VS Code on a remote server.
14 lines (10 loc) • 3.86 kB
JavaScript
const perf=require("../base/common/performance"),performance=require("perf_hooks").performance,product=require("../../../product.json"),readline=require("readline");perf.mark("code/server/start"),global.vscodeServerStartTime=performance.now();async function start(){if(process.argv[2]==="--exec"){process.argv.splice(1,2),require(process.argv[1]);return}const e=require("minimist")(process.argv.slice(2),{boolean:["start-server","list-extensions","print-ip-address","help","version","accept-server-license-terms"],string:["install-extension","install-builtin-extension","uninstall-extension","locate-extension","socket-path","host","port","pick-port"]}),r=["list-extensions","install-extension","install-builtin-extension","uninstall-extension","locate-extension"];if(e.help||e.version||!e["start-server"]&&r.some(t=>!!e[t])){loadCode().then(t=>{t.spawnCli()});return}let i=null,n=null;const c=()=>(n||(n=loadCode().then(t=>t.createServer(l))),n),g=require("http"),h=require("os");if(Array.isArray(product.serverLicense)&&product.serverLicense.length&&(console.log(product.serverLicense.join(`
`)),product.serverLicensePrompt&&e["accept-server-license-terms"]!==!0))try{await prompt(product.serverLicensePrompt)||process.exit()}catch(t){console.log(t),process.exit()}let f=!0,m=!0,l=null;const p=g.createServer(async(t,a)=>(f&&(f=!1,perf.mark("code/server/firstRequest")),(await c()).handleRequest(t,a)));p.on("upgrade",async(t,a)=>(m&&(m=!1,perf.mark("code/server/firstWebSocket")),(await c()).handleUpgrade(t,a))),p.on("error",async t=>(await c()).handleServerError(t));const v=e["socket-path"]?{path:e["socket-path"]}:{host:e.host,port:await parsePort(e.port,e["pick-port"])};p.listen(v,async()=>{const t=product.serverGreeting.join(`
`);let a=t?`
${t}
`:"";if(typeof v.port=="number"&&e["print-ip-address"]){const u=h.networkInterfaces();Object.keys(u).forEach(function(E){u[E].forEach(function(d){!d.internal&&d.family==="IPv4"&&(a+=`IP Address: ${d.address}
`)})})}if(l=p.address(),l===null)throw new Error("Unexpected server address");a+=`Extension host agent listening on ${typeof l=="string"?l:l.port}
`,console.log(a),perf.mark("code/server/started"),global.vscodeServerListenTime=performance.now(),await c()}),process.on("exit",()=>{p.close(),i&&i.dispose()})}async function parsePort(s,e){let r=-1;if(s){const o=parseInt(s,10);isNaN(o)?console.log("Port is not a number, will default to 8000 if no pick-port is given."):r=o}if(e)if(e.match(/^\d+-\d+$/)){const[o,i]=e.split("-").map(n=>parseInt(n,10));if(!isNaN(o)&&!isNaN(i))return r!==-1&&r>=o&&r<=i?r:await findFreePort(o,o,i);console.log("Port range are not numbers, using 8000 instead.")}else console.log(`Port range: "${e}" is not properly formatted, using 8000 instead.`);return r!==-1?r:8e3}async function findFreePort(s,e,r){const o=require("http");return new Promise((i,n)=>{if(e>r)throw new Error(`Could not find free port in range: ${s}-${r}`);const c=o.createServer();c.listen(e,()=>{c.close(),i(e)}).on("error",()=>{i(findFreePort(s,e+1,r))})})}function loadCode(){return new Promise((s,e)=>{const r=require("path");process.env.VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH=process.env.VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH||r.join(__dirname,"..","..","..","remote","node_modules"),require("../../bootstrap-node").injectNodeModuleLookupPath(process.env.VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH),require("../../bootstrap-amd").load("vs/server/remoteExtensionHostAgent",s,e)})}function prompt(s){const e=readline.createInterface({input:process.stdin,output:process.stdout});return new Promise((r,o)=>{e.question(s+" ",async function(i){e.close();const n=i.toString().trim().toLowerCase();n===""||n==="y"||n==="yes"?r(!0):n==="n"||n==="no"?r(!1):(process.stdout.write(`
Invalid Response. Answer either yes (y, yes) or no (n, no)
`),r(await prompt(s)))})})}start();
//# sourceMappingURL=main.js.map