comp-hub 0.31.1 → 0.31.2
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/bin/cli.js +1 -0
- package/bin/lib/startup.js +33 -13
- package/dist/index.js +2 -2
- package/dist/master.js +1 -1
- package/package.json +1 -2
package/dist/master.js
CHANGED
|
@@ -69,7 +69,7 @@ ${s}\r
|
|
|
69
69
|
|
|
70
70
|
More details: https://github.com/chimurai/http-proxy-middleware/blob/master/MIGRATION.md#removed-logprovider-and-loglevel-options
|
|
71
71
|
`)),i}function Xs(e){let a=e.logProvider&&e.logProvider();return a&&(e.logger=a),(0,K6.getLogger)(e)}});var hb=f(Zs=>{"use strict";Object.defineProperty(Zs,"__esModule",{value:!0});Zs.legacyCreateProxyMiddleware=Q6;var X6=Ke(),V6=Bs(),Z6=xb(),vb=X6.Debug.extend("legacy-create-proxy-middleware");function Q6(e,a){vb("init");let i=(0,Z6.legacyOptionsAdapter)(e,a),n=(0,V6.createProxyMiddleware)(i);return vb("add marker for patching req.url (old behavior)"),n.__LEGACY_HTTP_PROXY_MIDDLEWARE__=!0,n}});var bb=f(Rt=>{"use strict";Object.defineProperty(Rt,"__esModule",{value:!0});Rt.legacyCreateProxyMiddleware=void 0;var J6=hb();Object.defineProperty(Rt,"legacyCreateProxyMiddleware",{enumerable:!0,get:function(){return J6.legacyCreateProxyMiddleware}})});var gb=f(Ra=>{"use strict";var eR=Ra&&Ra.__createBinding||(Object.create?(function(e,a,i,n){n===void 0&&(n=i);var t=Object.getOwnPropertyDescriptor(a,i);(!t||("get"in t?!a.__esModule:t.writable||t.configurable))&&(t={enumerable:!0,get:function(){return a[i]}}),Object.defineProperty(e,n,t)}):(function(e,a,i,n){n===void 0&&(n=i),e[n]=a[i]})),aR=Ra&&Ra.__exportStar||function(e,a){for(var i in e)i!=="default"&&!Object.prototype.hasOwnProperty.call(a,i)&&eR(a,e,i)};Object.defineProperty(Ra,"__esModule",{value:!0});aR(bb(),Ra)});var yb=f(Be=>{"use strict";var iR=Be&&Be.__createBinding||(Object.create?(function(e,a,i,n){n===void 0&&(n=i);var t=Object.getOwnPropertyDescriptor(a,i);(!t||("get"in t?!a.__esModule:t.writable||t.configurable))&&(t={enumerable:!0,get:function(){return a[i]}}),Object.defineProperty(e,n,t)}):(function(e,a,i,n){n===void 0&&(n=i),e[n]=a[i]})),Ct=Be&&Be.__exportStar||function(e,a){for(var i in e)i!=="default"&&!Object.prototype.hasOwnProperty.call(a,i)&&iR(a,e,i)};Object.defineProperty(Be,"__esModule",{value:!0});Ct(Bs(),Be);Ct(fb(),Be);Ct(ms(),Be);Ct(gb(),Be)});var Ob=le(oc(),1),Ca=le(kt(),1);var hr=le(ml(),1),fl=hr.default,fC=hr.default.HttpError;var Sb=le(Fl(),1),Rb=le(dx(),1),Di=le(require("path"),1),ni=le(require("fs"),1),Cb=le(require("os"),1);var s4="Comp Hub",c4="main",p4="container",u4="item",l4="/__global_config__",d4="local://",m4="comphubConfig",f4="__remote__",x4="__local__",v4="__admin__",h4="https://api.comphub.cn",b4="http://localhost:7002",g4="http://localhost:5000",y4="http://localhost:5001",w4="http://localhost:3580",E4="/_module_load_prefix_",_4="/_node_modules_load_prefix_",A4="/_comp_preview_prefix_local_",S4="/__proxy__",R4="/__master__",C4="csrfToken",O4="authorization",T4="x-refresh-token",k4="x-csrf-token",P4="accept-language",j4="comp-hub-db",q4="file-compiled",I4="https://oss.comphub.cn",M4="oss:sts:token",L4="oss:sts:expire",N4="/node_modules/.prebuild_module",F4="_metadata.json",D4="vue/dist/vue.esm-bundler.js",H4="comp.json",B4="README.md",U4="main.js",$4="index.vue",z4="/.comp_hub_temp",G4="screenshot_mini.png",mx="list_local",fx="list_remote",K4={COMP_LIST_TYPE_LOCAL:mx,COMP_LIST_TYPE_REMOTE:fx},xx="config",vx="error",hx="dir",bx="preview",gx="extra",yx="deps",wx="readme",Ex="upgradeLog",Y4={TAB_TYPE_CONFIG:xx,TAB_TYPE_ERROR:vx,TAB_TYPE_DIR:hx,TAB_TYPE_PREVIEW:bx,TAB_TYPE_EXTRA:gx,TAB_TYPE_DEPS:yx,TAB_TYPE_README:wx,TAB_TYPE_UPGRADE_LOG:Ex},_x="mini",Ax="full",W4={COMP_EDIT_TAB_TYPE_MINI:_x,COMP_EDIT_TAB_TYPE_FULL:Ax},Sx="EDIT",Rx="ADD",X4={DIALOG_TYPE_EDIT:Sx,DIALOG_TYPE_ADD:Rx},Cx="ONLY_INSTALL",Ox="AUTO",Tx="MAJOR_VERSION",kx="MINOR_VERSION",Px="EXACT_VERSION",V4={COMP_MATCH_TYPE_ONLY_INSTALL:Cx,COMP_MATCH_TYPE_AUTO:Ox,COMP_MATCH_TYPE_MAJOR_VERSION:Tx,COMP_MATCH_TYPE_MINOR_VERSION:kx,COMP_MATCH_TYPE_EXACT_VERSION:Px},jx="online",qx="offline",Z4={COMP_UPDATE_TYPE_ONLINE:jx,COMP_UPDATE_TYPE_OFFLINE:qx},Q4=0,J4=1,e2=-1,Ix="checkPreviewListForm",Mx="checkExtraInfoForm",Lx="checkCompConfig",Nx="checkUpgradeLogForm",Fx="getCompError",Dx="afterCompDel",Hx="afterCompCancelCollect",Bx="afterCompRenderRetry",Ux="openCompTerminal",a2={COMP_METHOD_KEY_CHECK_PREVIEW_LIST_FORM:Ix,COMP_METHOD_KEY_CHECK_EXTRA_INFO_FORM:Mx,COMP_METHOD_KEY_CHECK_COMP_CONFIG:Lx,COMP_METHOD_KEY_CHECK_UPGRADE_LOG_FORM:Nx,COMP_METHOD_KEY_GET_COMP_ERROR:Fx,COMP_METHOD_KEY_AFTER_COMP_DEL:Dx,COMP_METHOD_KEY_AFTER_COMP_CANCEL_COLLECT:Hx,COMP_METHOD_KEY_AFTER_COMP_RENDER_RETRY:Bx,COMP_METHOD_KEY_OPEN_COMP_TERMINAL:Ux},i2="compListStore",n2="compEditStore",t2="callbacks",r2={CONTAINER:{SHARE:"share",COLLECT:"collect",LOCAL:"local",MINE:"mine",SIMILAR:"similar",TEAM_ALL:"teamAll",TEAM_MINE:"teamMine",TEAM_GROUP:"teamGroup",TEAM_ADD:"teamAdd"},ITEM:{PREVIEW_REMOTE:"previewRemote",PREVIEW_LOCAL:"previewLocal",CAROUSEL_REMOTE:"carouselRemote",CAROUSEL_LOCAL:"carouselLocal",EDIT_PANEL:"editPanel"}},o2="http://127.0.0.1",s2="http://localhost:8095",c2="http://localhost:8096",p2="http://localhost:5198",u2="/item",l2="/container",d2="CREATE",m2="JOIN",f2="EXIT",x2="teamAddMyComp",v2="teamCompList",h2="teamCompGroupList",b2="teamMyCompList",g2="teamMyCompUpdate",y2="__v__",w2="local",E2="prod",_2="local",A2="prod",S2="http://localhost:5173/en/",R2="https://docs.comphub.cn",C2=20,O2=20,T2="SUPER_ADMIN",k2="ADMIN",pe=Object.freeze(Object.defineProperty({__proto__:null,ACCEPT_LANGUAGE_HEADER_NAME:P4,ADMIN_SERVICE_PREFIX:v4,ADMIN_SERVICE_URL_DEV:w4,AUTHORIZATION_HEADER_NAME:O4,CACHE_KEY_STS_EXPIRE_TIME:L4,CACHE_KEY_STS_TOKEN:M4,COMPHUB_CONFIG_KEY:m4,COMP_ACTION_ICON_HEIGHT:O2,COMP_ACTION_ICON_WIDTH:C2,COMP_CONFIG_FILENAME:H4,COMP_EDIT_TAB_TYPES:W4,COMP_EDIT_TAB_TYPE_FULL:Ax,COMP_EDIT_TAB_TYPE_MINI:_x,COMP_ENTRY_FILE:U4,COMP_HUB_DEV_DOCS_URL:S2,COMP_HUB_PROD_DOCS_URL:R2,COMP_LIST_TYPES:K4,COMP_LIST_TYPE_LOCAL:mx,COMP_LIST_TYPE_REMOTE:fx,COMP_MATCH_TYPES:V4,COMP_MATCH_TYPE_AUTO:Ox,COMP_MATCH_TYPE_EXACT_VERSION:Px,COMP_MATCH_TYPE_MAJOR_VERSION:Tx,COMP_MATCH_TYPE_MINOR_VERSION:kx,COMP_MATCH_TYPE_ONLY_INSTALL:Cx,COMP_METHOD_KEY_AFTER_COMP_CANCEL_COLLECT:Hx,COMP_METHOD_KEY_AFTER_COMP_DEL:Dx,COMP_METHOD_KEY_AFTER_COMP_RENDER_RETRY:Bx,COMP_METHOD_KEY_CHECK_COMP_CONFIG:Lx,COMP_METHOD_KEY_CHECK_EXTRA_INFO_FORM:Mx,COMP_METHOD_KEY_CHECK_PREVIEW_LIST_FORM:Ix,COMP_METHOD_KEY_CHECK_UPGRADE_LOG_FORM:Nx,COMP_METHOD_KEY_GET_COMP_ERROR:Fx,COMP_METHOD_KEY_OPEN_COMP_TERMINAL:Ux,COMP_PREVIEW_PREFIX_LOCAL:A4,COMP_README_FILENAME:B4,COMP_SCREENSHOT_MINI_FILENAME:G4,COMP_SUBMIT_MAX_FILE_COUNT:30,COMP_SUBMIT_MAX_SINGLE_FILE_SIZE:3145728,COMP_SUBMIT_MAX_TOTAL_SIZE:10485760,COMP_TEMP_DIR:z4,COMP_UPDATE_TYPES:Z4,COMP_UPDATE_TYPE_OFFLINE:qx,COMP_UPDATE_TYPE_ONLINE:jx,COMP_USE_ENTRY_FILE:$4,CSRF_KEY:C4,CSRF_TOKEN_HEADER_NAME:k4,DIALOG_TYPES:X4,DIALOG_TYPE_ADD:Rx,DIALOG_TYPE_EDIT:Sx,FILE_MANAGER_DIRNAME:d4,GLOBAL_CONFIG_PATH:l4,IFRAME_CONTAINER_WEBSITE_PATH:l2,IFRAME_HOST:o2,IFRAME_ITEM_WEBSITE_PATH:u2,IFRAME_ROUTES:r2,INDEX_DB_NAME:j4,INDEX_DB_TABLE_NAME:q4,LOCAL_CHILD_IFRAME_URL:s2,LOCAL_LEAF_IFRAME_URL:c2,LOCAL_MIDWAY_ENV_LOCAL:w2,LOCAL_MIDWAY_ENV_PROD:E2,LOCAL_SERVICE_PREFIX:x4,LOCAL_SERVICE_URL_DEV:g4,LOCAL_SERVICE_URL_DEV_SUB:y4,LOCAL_TOP_IFRAME_URL:p2,MASTER_API_PREFIX:R4,META_FILE_NAME:F4,MODULE_LOAD_PREFIX:E4,NODE_MODULES_LOAD_PREFIX:_4,OSS_CUSTOM_DOMAIN:I4,PREBUILD_MODULE_DIR:N4,PROVIDE_KEYS:a2,PROVIDE_KEY_CALLBACKS:t2,PROVIDE_KEY_COMP_EDIT_STORE:n2,PROVIDE_KEY_COMP_LIST_STORE:i2,PROXY_PATH_PREFIX:S4,REFRESH_TOKEN_HEADER_NAME:T4,REMOTE_MIDWAY_ENV_LOCAL:_2,REMOTE_MIDWAY_ENV_PROD:A2,REMOTE_SERVICE_PREFIX:f4,REMOTE_SERVICE_URL_DEV:b4,REMOTE_SERVICE_URL_PROD:h4,ROLE_CODE_ADMIN:k2,ROLE_CODE_SUPER_ADMIN:T2,ROUTE_STATE_KEY_VERSION:y2,SCOPE_ID_TEAM_ADD_MY_COMP:x2,SCOPE_ID_TEAM_COMP_GROUP_LIST:h2,SCOPE_ID_TEAM_COMP_LIST:v2,SCOPE_ID_TEAM_MY_COMP_LIST:b2,SCOPE_ID_TEAM_MY_COMP_UPDATE:g2,SITE_TITLE:s4,TAB_TYPES:Y4,TAB_TYPE_CONFIG:xx,TAB_TYPE_DEPS:yx,TAB_TYPE_DIR:hx,TAB_TYPE_ERROR:vx,TAB_TYPE_EXTRA:gx,TAB_TYPE_PREVIEW:bx,TAB_TYPE_README:wx,TAB_TYPE_UPGRADE_LOG:Ex,TEAM_OPERATE_TYPE_CREATE:d2,TEAM_OPERATE_TYPE_EXIT:f2,TEAM_OPERATE_TYPE_JOIN:m2,VERSION_COMPARE_GREATER:J4,VERSION_COMPARE_LESS:e2,VERSION_COMPARE_SAME:Q4,VUE_ESM_BUNDLER:D4,WEBSITE_PATH_CONTAINER:p4,WEBSITE_PATH_ITEM:u4,WEBSITE_PATH_MAIN:c4},Symbol.toStringTag,{value:"Module"}));var zx=require("child_process"),$o=le(kt(),1);var Uo=le(require("path"),1),ia=le(require("fs"),1),$x=le(require("os"),1);var tt=require("child_process");function Ai(e){try{if(process.platform==="win32"){let a=(0,tt.execSync)(`netstat -ano | findstr ":${e} "`,{encoding:"utf8",timeout:5e3});for(let i of a.split(`
|
|
72
|
-
`)){if(!i.includes("LISTENING"))continue;let n=i.trim().split(/\s+/);if(n.length<5||parseInt(n[1].split(":").pop(),10)!==e)continue;let r=n[n.length-1];if(r&&r!=="0")try{(0,tt.execSync)(`taskkill /F /PID ${r}`,{timeout:3e3})}catch{}}}else{let a=(0,tt.execSync)(`lsof -ti :${e}`,{encoding:"utf8",timeout:5e3}).trim();if(a)try{process.kill(parseInt(a,10),"SIGTERM")}catch{}}}catch{}}var rt=class{constructor(a){if(a)this.filePath=a;else{let i=Uo.default.join($x.default.tmpdir(),".comphub");ia.default.existsSync(i)||ia.default.mkdirSync(i,{recursive:!0}),this.filePath=Uo.default.join(i,"child-info.json")}}load(){try{if(ia.default.existsSync(this.filePath))return JSON.parse(ia.default.readFileSync(this.filePath,"utf8"))}catch{}return[]}save(a){let i=this.load(),n=i.findIndex(t=>t.hash===a.hash);n>=0?i[n]=a:i.push(a),ia.default.writeFileSync(this.filePath,JSON.stringify(i,null,2))}remove(a){let i=this.load().filter(n=>n.hash!==a);i.length>0?ia.default.writeFileSync(this.filePath,JSON.stringify(i,null,2)):this.deleteFile()}clear(){this.deleteFile()}cleanupOrphans(){let a=this.load();if(a.length!==0){console.log(`[master] Cleaning up ${a.length} orphaned child process(es) from previous session...`);for(let i of a){if(i.pid)try{process.kill(i.pid,"SIGTERM"),console.log(` [master] Killed orphan PID ${i.pid}`);continue}catch{}Ai(i.port)}this.deleteFile()}}deleteFile(){try{ia.default.unlinkSync(this.filePath)}catch{}}};var ot=class{constructor(a){this.projects=new Map;var i;this.childPortStart=a.childPortStart,this.midwayEntry=a.midwayEntry,this.persistence=(i=a.persistence)!=null?i:new rt,this.persistence.cleanupOrphans()}get(a){return this.projects.get(a)}has(a){return this.projects.has(a)}get size(){return this.projects.size}getAll(){return Array.from(this.projects.values()).map(a=>({hash:a.hash,cwd:a.cwd,port:a.port,subPort:a.subPort,registeredAt:a.registeredAt}))}get first(){return this.projects.values().next().value}async register(a){let i=await(0,$o.default)({port:$o.default.makeRange(this.childPortStart,this.childPortStart+200)}),n=(0,zx.spawn)(process.execPath,
|
|
72
|
+
`)){if(!i.includes("LISTENING"))continue;let n=i.trim().split(/\s+/);if(n.length<5||parseInt(n[1].split(":").pop(),10)!==e)continue;let r=n[n.length-1];if(r&&r!=="0")try{(0,tt.execSync)(`taskkill /F /PID ${r}`,{timeout:3e3})}catch{}}}else{let a=(0,tt.execSync)(`lsof -ti :${e}`,{encoding:"utf8",timeout:5e3}).trim();if(a)try{process.kill(parseInt(a,10),"SIGTERM")}catch{}}}catch{}}var rt=class{constructor(a){if(a)this.filePath=a;else{let i=Uo.default.join($x.default.tmpdir(),".comphub");ia.default.existsSync(i)||ia.default.mkdirSync(i,{recursive:!0}),this.filePath=Uo.default.join(i,"child-info.json")}}load(){try{if(ia.default.existsSync(this.filePath))return JSON.parse(ia.default.readFileSync(this.filePath,"utf8"))}catch{}return[]}save(a){let i=this.load(),n=i.findIndex(t=>t.hash===a.hash);n>=0?i[n]=a:i.push(a),ia.default.writeFileSync(this.filePath,JSON.stringify(i,null,2))}remove(a){let i=this.load().filter(n=>n.hash!==a);i.length>0?ia.default.writeFileSync(this.filePath,JSON.stringify(i,null,2)):this.deleteFile()}clear(){this.deleteFile()}cleanupOrphans(){let a=this.load();if(a.length!==0){console.log(`[master] Cleaning up ${a.length} orphaned child process(es) from previous session...`);for(let i of a){if(i.pid)try{process.kill(i.pid,"SIGTERM"),console.log(` [master] Killed orphan PID ${i.pid}`);continue}catch{}Ai(i.port)}this.deleteFile()}}deleteFile(){try{ia.default.unlinkSync(this.filePath)}catch{}}};var ot=class{constructor(a){this.projects=new Map;var i;this.childPortStart=a.childPortStart,this.midwayEntry=a.midwayEntry,this.persistence=(i=a.persistence)!=null?i:new rt,this.persistence.cleanupOrphans()}get(a){return this.projects.get(a)}has(a){return this.projects.has(a)}get size(){return this.projects.size}getAll(){return Array.from(this.projects.values()).map(a=>({hash:a.hash,cwd:a.cwd,port:a.port,subPort:a.subPort,registeredAt:a.registeredAt}))}get first(){return this.projects.values().next().value}async register(a){let i=await(0,$o.default)({port:$o.default.makeRange(this.childPortStart,this.childPortStart+200)}),n=["--no-deprecation",this.midwayEntry];a.logLevel&&n.push("--logLevel",a.logLevel);let t=(0,zx.spawn)(process.execPath,n,{cwd:a.cwd,stdio:["inherit","inherit","inherit","ipc"],env:{...process.env},windowsHide:!0}),r={hash:a.hash,cwd:a.cwd,port:i,process:t,config:{dir:a.dir,api:a.api,allowDebug:a.allowDebug,proxy:a.proxy},registeredAt:new Date};return this.addChild(r),t.send({type:"config",port:i,cwd:a.cwd,dir:a.dir,api:a.api,allowDebug:a.allowDebug,proxy:a.proxy}),r}addChild(a){var n;let i=a.process;i&&(i.on("message",t=>{(t==null?void 0:t.type)==="subPort"&&t.subPort!=null&&(a.subPort=t.subPort)}),i.on("exit",t=>{console.log(`[master] Project ${a.hash} exited with code ${t}`),this.projects.delete(a.hash),this.persistence.remove(a.hash)}),i.on("error",t=>{console.error(`[master] Project ${a.hash} failed:`,t.message),this.projects.delete(a.hash),this.persistence.remove(a.hash)})),this.projects.set(a.hash,a),this.persistence.save({pid:(n=i==null?void 0:i.pid)!=null?n:null,port:a.port,hash:a.hash,cwd:a.cwd,registeredAt:a.registeredAt.toISOString()})}deregister(a){let i=this.projects.get(a);i&&(i.process&&!i.process.killed?i.process.kill("SIGTERM"):Ai(i.port),this.projects.delete(a),this.persistence.remove(a),console.log(`[master] Deregistered project ${a}`))}killAll(){for(let[,a]of this.projects)if(a.process&&!a.process.killed)try{a.process.kill("SIGTERM"),console.log(` [master] Sent SIGTERM to MidwayJS (${a.hash})`)}catch{}else Ai(a.port)}get allChildrenDead(){return Array.from(this.projects.values()).every(a=>!a.process||a.process.killed)}clearPersistence(){this.persistence.clear()}};var Eb=le(require("http"),1),ec=le(yb(),1);var nR=new Eb.default.Agent({keepAlive:!0,keepAliveMsecs:3e4,maxSockets:50,maxFreeSockets:10}),Qs=new Map,Js=new Map;function tR(e){return Qs.has(e)||Qs.set(e,(0,ec.createProxyMiddleware)({target:e,changeOrigin:!0,agent:nR,on:{error:a=>{}}})),Qs.get(e)}function rR(e){return Js.has(e)||Js.set(e,(0,ec.createProxyMiddleware)({target:e,changeOrigin:!0,secure:!1,on:{error:a=>{}}})),Js.get(e)}function oR(e,a){let i=tR(a);return new Promise((n,t)=>{e.res.on("finish",()=>n()),e.res.on("close",()=>n()),i(e.req,e.res,r=>{r?t(r):n()})})}function wb(e){let a=e.get("referer");if(a){let i=a.match(/https?:\/\/[^/]+\/([a-f0-9]{6,})\//);if(i)return i[1]}}function _b(e){return async a=>{var r;let i,n="/"+pe.REMOTE_SERVICE_PREFIX;if(a.path.startsWith(n)){let o=wb(a);i=o?e(o):void 0;let s=((r=i==null?void 0:i.config)==null?void 0:r.api)||pe.REMOTE_SERVICE_URL_PROD,c=a.querystring?`?${a.querystring}`:"";a.req.url=a.path.slice(n.length)+c;let u=rR(s);await new Promise((l,d)=>{a.res.on("finish",()=>l()),a.res.on("close",()=>l()),u(a.req,a.res,p=>{p?d(p):l()})});return}let t=a.path.match(/^\/([a-f0-9]{6,})(\/.*)?$/);if(t){let o=t[1],s=t[2];if(i=e(o),i){if(!s||s==="/"){a.redirect(`/${o}/main/`);return}let c=a.querystring?`?${a.querystring}`:"";a.req.url=s+c}}if(!i){let o=wb(a);o&&(i=e(o))}if(i){await oR(a,`http://127.0.0.1:${i.port}`);return}a.status=404,a.body={error:"Not Found",message:"No project found. Start a project and access via /{hash}/main/"}}}var sR=Di.default.resolve(__dirname,"index.js"),cR=Di.default.resolve(__dirname,"../package.json"),pR=(()=>{try{return JSON.parse(ni.default.readFileSync(cR,"utf8")).version}catch{return"unknown"}})();function Ab(){let e=Di.default.join(Cb.default.tmpdir(),".comphub");return ni.default.existsSync(e)||ni.default.mkdirSync(e,{recursive:!0}),Di.default.join(e,"master.json")}var Ot=class{constructor(a){this.startTime=0;this.options=a,this.app=new fl,this.registry=new ot({childPortStart:a.childPortStart,midwayEntry:sR})}get displayPort(){var a;return(a=this.options.publicPort)!=null?a:this.options.port}get health(){return{status:"ok",version:pR,projects:this.registry.size,uptime:process.uptime()-this.startTime,mode:"production"}}get projects(){return this.registry.getAll()}async start(){this.setupSensitiveGuard(),this.setupAdminRouter(),this.setupProxy(),this.setupSignalHandlers(),await this.listen()}setupSensitiveGuard(){if(!this.options.publicPort||this.options.publicPort===this.options.port)return;let a=[`${pe.MASTER_API_PREFIX}/register`,`${pe.MASTER_API_PREFIX}/deregister`,`${pe.MASTER_API_PREFIX}/shutdown`];this.app.use(async(i,n)=>{if(a.includes(i.path)&&i.req.socket.localPort!==this.options.port){i.status=404;return}await n()})}setupAdminRouter(){let a=new Sb.default;a.get(`${pe.MASTER_API_PREFIX}/health`,async n=>{n.body=this.health}),a.get(`${pe.MASTER_API_PREFIX}/projects`,async n=>{n.body={projects:this.projects}}),a.post(`${pe.MASTER_API_PREFIX}/register`,async n=>{let{hash:t,cwd:r,dir:o,api:s,allowDebug:c,proxy:u,logLevel:l}=n.request.body;if(!t||!r){n.status=400,n.body={error:"hash and cwd are required"};return}if(this.registry.get(String(t))){n.body={url:`http://localhost:${this.displayPort}/${t}/${pe.WEBSITE_PATH_MAIN}/`,hash:t};return}let p=await this.registry.register({hash:String(t),cwd:String(r),dir:o,api:s,allowDebug:c,proxy:u,logLevel:l});n.body={url:`http://localhost:${this.displayPort}/${p.hash}/${pe.WEBSITE_PATH_MAIN}/`,hash:p.hash}}),a.post(`${pe.MASTER_API_PREFIX}/deregister`,async n=>{let{hash:t}=n.request.body;this.registry.deregister(String(t)),n.body={success:!0}}),a.post(`${pe.MASTER_API_PREFIX}/shutdown`,async n=>{n.body={success:!0},console.log("[master] Shutting down via API..."),this.registry.killAll(),this.deleteRuntime(),n.res.on("finish",()=>process.exit(0)),setTimeout(()=>process.exit(0),1e3)});let i=(0,Rb.default)();this.app.use(async(n,t)=>{n.path.startsWith(pe.MASTER_API_PREFIX)?await i(n,t):await t()}),this.app.use(a.routes()),this.app.use(a.allowedMethods())}setupProxy(){this.app.use(_b(a=>this.registry.get(a)))}setupSignalHandlers(){let a=()=>this.shutdown();process.on("SIGINT",a),process.on("SIGTERM",a)}async listen(){if(await new Promise(a=>{this.app.listen(this.options.port,()=>{this.startTime=process.uptime(),console.log(`[master] Management: http://localhost:${this.options.port}`),a()})}),this.writeRuntime(),this.options.publicPort&&this.options.publicPort!==this.options.port)try{await new Promise((a,i)=>{this.app.listen(this.options.publicPort,()=>{console.log(`[master] Public: http://localhost:${this.options.publicPort}`),a()}).on("error",i)})}catch{throw this.deleteRuntime(),new Error(`Public port ${this.options.publicPort} is not available`)}}shutdown(){let a=this.registry.size;console.log(`
|
|
73
73
|
[master] Shutting down, stopping ${a} project(s)...`),this.registry.killAll(),this.registry.clearPersistence(),this.deleteRuntime(),setTimeout(()=>{process.exit(0)},5e3);let i=setInterval(()=>{this.registry.allChildrenDead&&(clearInterval(i),process.exit(0))},200)}writeRuntime(){let a={managementPort:this.options.port,publicPort:this.displayPort,pid:process.pid,startedAt:new Date().toISOString()};try{ni.default.writeFileSync(Ab(),JSON.stringify(a,null,2))}catch{}}deleteRuntime(){try{ni.default.unlinkSync(Ab())}catch{}}};var ac=(0,Ob.default)(process.argv.slice(2));async function uR(){let e=Number(ac.port);e||(console.error("[master] --port is required"),process.exit(1));let a=await(0,Ca.default)({port:Ca.default.makeRange(e,e+100)}),i=ac["public-port"]?Number(ac["public-port"]):void 0;if(i&&i!==a){let r=await(0,Ca.default)({port:Ca.default.makeRange(i,i+100)});r!==i&&(console.warn(`[master] Public port ${i} \u88AB\u5360\u7528\uFF0C\u81EA\u52A8\u5207\u6362\u5230 ${r}`),i=r)}let n=await(0,Ca.default)({port:Ca.default.makeRange(a+1,a+101)});await new Ot({port:a,publicPort:i,childPortStart:n}).start()}uR().catch(e=>{console.error("[master] Failed to start:",e),process.exit(1)});
|
|
74
74
|
/*! Bundled license information:
|
|
75
75
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "comp-hub",
|
|
3
|
-
"version": "0.31.
|
|
3
|
+
"version": "0.31.2",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"comphub": "bin/cli.js"
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"build": "node scripts/build.js",
|
|
10
10
|
"build-ui": "node scripts/build-ui.js",
|
|
11
11
|
"build-iframes": "node scripts/build-iframes.js",
|
|
12
|
-
"publish:upgrade": "node scripts/publishUpgrade.js",
|
|
13
12
|
"release": "node scripts/publish.js",
|
|
14
13
|
"lint:eslint": "eslint",
|
|
15
14
|
"lint:fix": "eslint . --fix",
|