Spaces:
Paused
Paused
Update bot.js
Browse files
bot.js
CHANGED
|
@@ -460,11 +460,15 @@ const server = app.listen(process.env.PORT || 7860, () => {
|
|
| 460 |
// 5. KESİNTİSİZ HAM WEBSOCKET TÜNELİ (Siyah ekranı bitiren kısım)
|
| 461 |
// Hugging Face'e dışarıdan gelen TÜM upgrade isteklerini yakalıyoruz
|
| 462 |
server.on('upgrade', (req, socket, head) => {
|
| 463 |
-
// İstek socket.io paketi mi veya bizim yoldan mı geliyor kontrolü
|
| 464 |
if (req.url.includes('socket.io') || req.url.startsWith('/3dview')) {
|
| 465 |
|
| 466 |
-
//
|
| 467 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 468 |
let targetWsPath = req.url;
|
| 469 |
if (targetWsPath.startsWith('/3dview')) {
|
| 470 |
targetWsPath = targetWsPath.replace('/3dview', '');
|
|
@@ -482,14 +486,33 @@ server.on('upgrade', (req, socket, head) => {
|
|
| 482 |
});
|
| 483 |
|
| 484 |
proxyReq.on('upgrade', (proxyRes, proxySocket, proxyHead) => {
|
| 485 |
-
// Tarayıcı ile Hugging Face arasında el sıkışma (Handshake) yanıtını kendimiz yazıyoruz
|
| 486 |
socket.write('HTTP/1.1 101 Switching Protocols\r\n' +
|
| 487 |
Object.keys(proxyRes.headers).map(key => `${key}: ${proxyRes.headers[key]}`).join('\r\n') +
|
| 488 |
'\r\n\r\n');
|
| 489 |
|
| 490 |
-
// Çift taraflı ham TCP data akışını mühürlüyoruz (Canlı Harita Paketleri)
|
| 491 |
proxySocket.pipe(socket);
|
| 492 |
socket.pipe(proxySocket);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 493 |
});
|
| 494 |
|
| 495 |
proxyReq.on('error', (err) => {
|
|
|
|
| 460 |
// 5. KESİNTİSİZ HAM WEBSOCKET TÜNELİ (Siyah ekranı bitiren kısım)
|
| 461 |
// Hugging Face'e dışarıdan gelen TÜM upgrade isteklerini yakalıyoruz
|
| 462 |
server.on('upgrade', (req, socket, head) => {
|
|
|
|
| 463 |
if (req.url.includes('socket.io') || req.url.startsWith('/3dview')) {
|
| 464 |
|
| 465 |
+
// Tasarruf Modu: Biri sayfaya bağlandığı an çalışan bir kapatma sayacı varsa iptal ediyoruz
|
| 466 |
+
if (viewerTimeout) {
|
| 467 |
+
clearTimeout(viewerTimeout);
|
| 468 |
+
viewerTimeout = null;
|
| 469 |
+
logger.info("[RAM Tasarrufu] Yeni kullanıcı bağlandı, kapatma sayacı iptal edildi.");
|
| 470 |
+
}
|
| 471 |
+
|
| 472 |
let targetWsPath = req.url;
|
| 473 |
if (targetWsPath.startsWith('/3dview')) {
|
| 474 |
targetWsPath = targetWsPath.replace('/3dview', '');
|
|
|
|
| 486 |
});
|
| 487 |
|
| 488 |
proxyReq.on('upgrade', (proxyRes, proxySocket, proxyHead) => {
|
|
|
|
| 489 |
socket.write('HTTP/1.1 101 Switching Protocols\r\n' +
|
| 490 |
Object.keys(proxyRes.headers).map(key => `${key}: ${proxyRes.headers[key]}`).join('\r\n') +
|
| 491 |
'\r\n\r\n');
|
| 492 |
|
|
|
|
| 493 |
proxySocket.pipe(socket);
|
| 494 |
socket.pipe(proxySocket);
|
| 495 |
+
|
| 496 |
+
// KRİTİK KISIM: Kullanıcı sekmeyi kapattığında tetiklenir
|
| 497 |
+
socket.on('close', () => {
|
| 498 |
+
logger.info("[RAM Tasarrufu] Kullanıcı canlı yayından ayrıldı. 10 saniye sonra harita motoru durdurulacak...");
|
| 499 |
+
|
| 500 |
+
// Üst üste binmeleri önlemek için eski sayacı temizleyip yenisini açıyoruz
|
| 501 |
+
if (viewerTimeout) clearTimeout(viewerTimeout);
|
| 502 |
+
|
| 503 |
+
viewerTimeout = setTimeout(() => {
|
| 504 |
+
if (viewerInstance && typeof viewerInstance.close === 'function') {
|
| 505 |
+
try {
|
| 506 |
+
viewerInstance.close(); // 3000 portundaki HTTP ve WebSocket sunucusunu tamamen kapatır
|
| 507 |
+
bot.viewer = null;
|
| 508 |
+
viewerInstance = null;
|
| 509 |
+
logger.info("[RAM Tasarrufu] 10 saniyedir kimse izlemiyor. Harita motoru kapatıldı, RAM serbest bırakıldı!");
|
| 510 |
+
} catch (e) {
|
| 511 |
+
logger.error("Viewer kapatılırken hata oluştu: " + e.message);
|
| 512 |
+
}
|
| 513 |
+
}
|
| 514 |
+
}, 10000); // 10 saniye bekleme payı (Anlık sayfa yenilemelerinde motor hemen kapanmasın diye)
|
| 515 |
+
});
|
| 516 |
});
|
| 517 |
|
| 518 |
proxyReq.on('error', (err) => {
|