@yuandc/aica 0.1.74 → 0.1.76
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
import N from"node:http";import
|
|
1
|
+
import N from"node:http";import n from"node:fs";import f from"node:path";import{randomBytes as O}from"node:crypto";import{getAcaHome as j}from"../paths.js";import{managementActivity as e}from"./activity.js";import{enableManagedClaims as b,cancelManagedClaims as D}from"./claims.js";import{activeTerminalService as v}from"../terminal/service.js";import{readProcessStartTicks as k}from"../process-identity.js";import{AICA_VERSION as P}from"../../version.js";function E(s,y){const g=`${s}.${process.pid}.tmp`,i=n.openSync(g,"w",384);try{n.writeFileSync(i,JSON.stringify(y)),n.fsyncSync(i)}finally{n.closeSync(i)}n.renameSync(g,s);const c=n.openSync(f.dirname(s),"r");try{n.fsyncSync(c)}finally{n.closeSync(c)}}async function z(s,y,g){if(process.platform!=="linux")return;const i=f.join(j(),"management");n.mkdirSync(i,{recursive:!0,mode:448});const c=f.join(i,"worker.sock"),S=f.join(i,"worker.json");try{const r=JSON.parse(n.readFileSync(S,"utf8"));if(k(r.pid)===r.startTicks&&r.startTicks)throw new Error("已有 Worker 管理实例正在运行")}catch(r){if(r instanceof Error&&r.message==="已有 Worker 管理实例正在运行")throw r}n.rmSync(c,{force:!0});const I=O(32).toString("hex");let p=process.env.AICA_MANAGER_ID||"";const h=process.env.AICA_UPDATE_OPERATION||"";e.paused=!!h;let _=!1;const m=new Map,o=()=>({protocol:1,instanceId:s,pid:process.pid,startTicks:k(process.pid),version:P,entry:f.resolve(process.argv[1]),node:process.execPath,managerId:p,state:e.stopping?"stopping":e.paused?"paused":"running",operationId:h,busy:[...e.busy,...v?.hasActivity?["terminal"]:[]],uncertain:[...e.uncertain]}),u=N.createServer(async(r,d)=>{try{if(r.headers.authorization!==`Bearer ${I}`){d.writeHead(403).end();return}let l="";for await(const w of r)if(l+=w,l.length>16384)throw new Error("request_too_large");const t=JSON.parse(l||"{}");let a;if(t.command==="hello"||t.command==="status")a=o();else if(t.command==="manual"){if(t.instanceId!==s||e.paused||e.stopping)throw new Error("maintenance_in_progress");e.uncertain.add("manual-operation"),e.managed=!1,a={ok:!0}}else{if(t.instanceId!==s)throw new Error("worker_instance_changed");if(typeof t.managerId!="string"||!t.managerId)throw new Error("missing_manager");if(p&&p!==t.managerId)throw new Error("manager_conflict");if(t.command==="attach")await b(),p=t.managerId,e.managed=!0,a=o();else{if(!p)throw new Error("worker_not_attached");if(t.command==="detach"){if(e.paused||e.stopping)throw new Error("maintenance_in_progress");p="",e.managed=!1,a=o()}else if(t.command==="activate"){if(t.operationId!==h||!h||e.stopping)throw new Error("activation_mismatch");e.paused&&(e.paused=!1,g()),a=o()}else if(t.command==="canUpdate"){if(!t.operationId||!t.attemptId)throw new Error("missing_operation");const w=`${t.operationId}/${t.attemptId}`;if(m.has(w))a=m.get(w);else{if(!Number.isFinite(t.validUntil)||t.validUntil<Date.now()||t.validUntil>Date.now()+1e4)throw new Error("expired_update_attempt");if(_||e.paused||e.stopping||e.hasBusiness||v?.hasActivity||e.uncertain.has("manual-operation")||!e.managed)a={allowed:!1,...o()};else{_=!0,e.paused=!0;try{const A=Date.now()+1800;for(await D();e.busy.length&&Date.now()<A&&!e.hasBusiness;)await new Promise(T=>setTimeout(T,10));e.busy.length||v?.hasActivity||e.uncertain.has("manual-operation")||Date.now()>t.validUntil?a={allowed:!1,...o()}:(a={allowed:!0,...o(),state:"stopping",operationId:t.operationId,attemptId:t.attemptId},E(f.join(i,"shutdown.json"),a),e.stopping=!0,setTimeout(()=>{y()},50))}catch{a={allowed:!1,...o()}}finally{_=!1,e.stopping||(e.paused=!1)}}}m.size>1e3&&m.delete(m.keys().next().value),m.set(w,a)}else throw new Error("unsupported_command")}}d.setHeader("content-type","application/json"),d.end(JSON.stringify(a))}catch(l){d.writeHead(409,{"content-type":"application/json"}).end(JSON.stringify({error:l instanceof Error?l.message:"control_failed"}))}});u.requestTimeout=5e3,await new Promise((r,d)=>{u.once("error",d),u.listen(c,r)});try{n.chmodSync(c,384),E(S,{socketPath:c,secret:I,...o()})}catch(r){throw u.close(),r}return u}export{z as startManagementControl};
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const o="0.1.
|
|
1
|
+
const o="0.1.76";export{o as AICA_VERSION};
|