9r-vps-worker 0.0.0-stage → 1.0.0
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/README.md +29 -2
- package/bin/index.js +2 -0
- package/package.json +28 -4
package/README.md
CHANGED
|
@@ -1,3 +1,30 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 9Router Worker Daemon
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Autonomous Compute Worker Daemon for 9Router Cluster on Manus.
|
|
4
|
+
|
|
5
|
+
## Quick Start in Manus AI
|
|
6
|
+
|
|
7
|
+
### Cách 1: Chạy trực tiếp từ tarball của VPS (Không cần publish npm)
|
|
8
|
+
```bash
|
|
9
|
+
npm install -g https://206-189-148-55.sslip.io/9router-worker.tgz
|
|
10
|
+
9router-worker --slot worker-slot-1
|
|
11
|
+
```
|
|
12
|
+
Hoặc dùng `npx` tức thì:
|
|
13
|
+
```bash
|
|
14
|
+
npx -y https://206-189-148-55.sslip.io/9router-worker.tgz --slot worker-slot-1
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Cách 2: Publish lên npm công khai (Nếu có tài khoản npmjs.com)
|
|
18
|
+
```bash
|
|
19
|
+
cd worker-package
|
|
20
|
+
npm login
|
|
21
|
+
npm publish --access public
|
|
22
|
+
```
|
|
23
|
+
Sau khi publish, Manus AI chỉ cần chạy đúng 1 lệnh:
|
|
24
|
+
```bash
|
|
25
|
+
npx 9router-worker --slot worker-slot-1
|
|
26
|
+
```
|
|
27
|
+
hoặc:
|
|
28
|
+
```bash
|
|
29
|
+
npm install -g 9router-worker && 9router-worker --slot worker-slot-1
|
|
30
|
+
```
|
package/bin/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var R=require("http"),v=require("https"),{spawn:$}=require("child_process"),u=require("fs"),T=require("os"),h=require("path"),n=process.argv.slice(2),a=process.env.SLOT_ID||"worker-slot-1",S=process.env.GATEWAY_URL||"",k=process.env.WORKER_TOKEN||"",i=parseInt(process.env.PORT,10)||20128,c=process.env.WORKER_PASSWORD||"";for(let e=0;e<n.length;e++)n[e]==="--slot"&&n[e+1]&&(a=n[++e]),n[e]==="--gateway"&&n[e+1]&&(S=n[++e].replace(/\/+$/,"")),n[e]==="--token"&&n[e+1]&&(k=n[++e]),n[e]==="--port"&&n[e+1]&&(i=parseInt(n[++e],10)),n[e]==="--password"&&n[e+1]&&(c=n[++e]);c||(c="router");var I={"worker-slot-1":10001,"worker-slot-2":10002,"worker-slot-3":10003,"worker-slot-4":10004,"worker-slot-5":10005,"worker-slot-6":10006},D=I[a]||10001,m=`${a}-node-${T.hostname()}`;function s(e){let r=new Date().toISOString().replace("T"," ").substring(0,19);console.log(`[${r}] [9Router-Worker] ${e}`)}function g(){let e=process.env.E2B_SANDBOX_ID||process.env.SANDBOX_ID||process.env.CONTAINER_ID;if(!e)for(let t of["/etc/e2b/sandbox_id","/etc/sandbox_id","/root/.e2b/sandbox_id"])try{if(u.existsSync(t)&&(e=u.readFileSync(t,"utf8").trim(),e))break}catch{}if(!e)try{let o=u.readFileSync("/proc/1/environ","utf8").match(/(?:E2B_SANDBOX_ID|SANDBOX_ID)=([^\0]+)/);o&&(e=o[1].trim())}catch{}let r=process.env.MANUS_CLUSTER||"sg2";return e&&e.length>=6?`https://20128-${e}.${r}.manus.computer`:""}function _(e){return new Promise(r=>{let t=R.get(`http://127.0.0.1:${e}/api/health`,o=>{r(!0)});t.on("error",()=>{let o=R.get(`http://127.0.0.1:${e}/`,l=>{r(!0)});o.on("error",()=>r(!1)),o.setTimeout(1500,()=>{o.destroy(),r(!1)})}),t.setTimeout(1500,()=>{t.destroy(),r(!1)})})}function y(){s(`Starting 9Router server on port ${i}...`);let e=h.join(T.homedir(),".9router","logs");u.mkdirSync(e,{recursive:!0});let r=h.join(e,"router.log"),t=u.openSync(r,"a"),o=u.openSync(r,"a"),l={...process.env,PORT:String(i),INITIAL_PASSWORD:c,PASSWORD:c,EMPTY_PEEK_DEADLINE_MS:"300000",STREAM_FIRST_CHUNK_TIMEOUT_MS:"600000",STREAM_STALL_TIMEOUT_MS:"1800000",FETCH_CONNECT_TIMEOUT_MS:"120000"};$("9router",["--no-browser","--skip-update","--port",String(i)],{env:l,detached:!0,stdio:["ignore",t,o]}).unref()}function E(e,r){return new Promise((t,o)=>{let l=JSON.stringify(r),w=new URL(`${S}${e}`),p=(w.protocol==="https:"?v:R).request(w,{method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(l),"X-Worker-Token":k},timeout:5e3},d=>{let f="";d.on("data",O=>f+=O),d.on("end",()=>{try{t(JSON.parse(f))}catch{t({ok:d.statusCode===200,raw:f})}})});p.on("error",o),p.on("timeout",()=>{p.destroy(),o(new Error("Gateway request timed out"))}),p.write(l),p.end()})}async function b(){let e=g(),r=`http://127.0.0.1:${D}`,t={slot_id:a,worker_id:m,tunnel_url:r,api_key:c,native_api_key:c,started_at:Date.now()/1e3,manus_preview_url:e};try{let o=await E("/workers/register",t);s(`Registration confirmed by Master Gateway: ${JSON.stringify(o)}`)}catch(o){s(`Registration note: ${o.message}`)}}async function A(){let e=g(),r={slot_id:a,worker_id:m};e&&(r.manus_preview_url=e);try{let t=await E("/workers/heartbeat",r);if(t&&t.action==="restart_router"){s("Received RESTART_ROUTER from Master. Restarting 9Router...");try{require("child_process").execSync("pkill -f '9router' || true")}catch{}y()}}catch{}}async function N(){if(s(`Initializing 9Router Worker for ${a}...`),s(`Gateway: ${S}`),await _(i))s(`9Router is already running on port ${i}.`);else{y();for(let t=0;t<25;t++)if(await new Promise(o=>setTimeout(o,1e3)),await _(i)){s(`9Router port ${i} is active!`);break}}await b();let r=g();for(r&&s(`Public Manus Preview URL: ${r}`),s(`Worker ${a} is fully READY.`),console.log("WORKER_READY");;){try{await _(i)||(s(`9Router port ${i} went down! Restarting...`),y()),await A()}catch(t){s(`Notice in supervisor loop: ${t.message}`)}await new Promise(t=>setTimeout(t,4e3))}}N().catch(e=>{console.error("Fatal error in 9router-worker:",e),process.exit(1)});
|
package/package.json
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "9r-vps-worker",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "9Router Autonomous Compute Worker Daemon for 9R-VPS Manus Cluster",
|
|
5
|
+
"main": "bin/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"9r-vps-worker": "bin/index.js",
|
|
8
|
+
"9router-worker": "bin/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"keywords": [
|
|
15
|
+
"9router",
|
|
16
|
+
"9r-vps",
|
|
17
|
+
"ai",
|
|
18
|
+
"gateway",
|
|
19
|
+
"cluster",
|
|
20
|
+
"manus"
|
|
21
|
+
],
|
|
22
|
+
"author": "9Router Team",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"9router": ">=0.5.100"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
}
|
|
30
|
+
}
|