Spaces:
Sleeping
Sleeping
| const WebSocket = require('ws'); | |
| const http = require('http'); | |
| const SERVER_URL = process.env.SERVER_URL || 'wss://choruyt-ai-exocore.hf.space/cpu-pool'; | |
| const WORKER_ID = process.env.WORKER_ID || 'cpu' + (Math.floor(Math.random() * 1000)); | |
| const CPU_CORES = 2; // HF Spaces = 2 vCPU | |
| console.log(`🚀 CPU Worker ${WORKER_ID} starting...`); | |
| let ws; | |
| let heartbeatInterval; | |
| function connectToPool() { | |
| ws = new WebSocket(SERVER_URL); | |
| ws.on('open', () => { | |
| console.log(`✅ ${WORKER_ID} connected to CPU POOL`); | |
| ws.send(JSON.stringify({ | |
| type: 'register', | |
| workerId: WORKER_ID, | |
| cpuCores: CPU_CORES, | |
| status: 'ready' | |
| })); | |
| // Heartbeat | |
| heartbeatInterval = setInterval(() => { | |
| if (ws.readyState === WebSocket.OPEN) { | |
| ws.send(JSON.stringify({ | |
| type: 'heartbeat', | |
| workerId: WORKER_ID, | |
| load: process.uptime() % 10 // Fake load | |
| })); | |
| } | |
| }, 5000); | |
| }); | |
| ws.on('message', async (data) => { | |
| try { | |
| const task = JSON.parse(data.toString()); | |
| if (task.type === 'cpu-task') { | |
| const result = await heavyCPUWork(task.data); | |
| ws.send(JSON.stringify({ | |
| type: 'task-complete', | |
| taskId: task.taskId, | |
| workerId: WORKER_ID, | |
| result: result | |
| })); | |
| } | |
| } catch (e) { | |
| console.error('Task error:', e); | |
| } | |
| }); | |
| ws.on('close', () => { | |
| console.log('🔌 Disconnected, reconnecting...'); | |
| clearInterval(heartbeatInterval); | |
| setTimeout(connectToPool, 3000); | |
| }); | |
| } | |
| // 🔥 HEAVY CPU WORK (for Qwen3 token processing) | |
| function heavyCPUWork(data) { | |
| return new Promise((resolve) => { | |
| let result = 0; | |
| const start = Date.now(); | |
| // Simulate Qwen3 token generation (CPU intensive) | |
| for (let i = 0; i < data.iterations || 10000000; i++) { | |
| result += Math.sqrt(i) * Math.sin(i / 1000); | |
| } | |
| resolve({ | |
| tokensGenerated: data.iterations || 512, | |
| computationTime: Date.now() - start, | |
| result: result.toFixed(2) | |
| }); | |
| }); | |
| } | |
| // Auto-reconnect | |
| connectToPool(); | |
| // Health check server | |
| const server = http.createServer((req, res) => { | |
| res.writeHead(200); | |
| res.end(`CPU Worker ${WORKER_ID} OK | Cores: ${CPU_CORES}`); | |
| }); | |
| server.listen(process.env.PORT || 7860, '0.0.0.0', () => { | |
| console.log(`✅ Worker ${WORKER_ID} listening on ${process.env.PORT || 7860}`); | |
| }); |