Skip to main content
require('dotenv').config(); const express = require('express'); const http = require('http'); const cors = require('cors'); const { Server } = require('socket.io'); const app = express(); const server = http.createServer(app); const io = new Server(server, { cors: { origin: '*', methods: ['GET', 'POST'] } }); // Middleware app.use(cors()); app.use(express.json()); // Basic Auth Middleware for REST API endpoint /api/message function basicAuth(req, res, next) { const authUser = process.env.API_USER || 'admin@hopeaihub.info'; const authPass = process.env.API_PASS || 'dhuwaraga2026'; const b64auth = (req.headers.authorization || '').split(' ')[1] || ''; const [login, password] = Buffer.from(b64auth, 'base64').toString().split(':'); if (login && password && login === authUser && password === authPass) { return next(); } res.set('WWW-Authenticate', 'Basic realm="DHUWARAGA API"'); return res.status(401).json({ error: 'Authentication required for dhuw.hopeaihub.info' }); } app.post('/api/message', basicAuth, async (req, res) => { const { message, sessionId } = req.body; if (!message) return res.status(400).json({ error: 'Missing message parameter.' }); try { const apiKey = process.env.GEMINI_API_KEY || ''; const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent?key=${apiKey}`; const payload = { contents: [{ parts: [{ text: `You are DHUWARAGA AI, a very pretty and intelligent Tamil girl assistant. Respond warmly and conversationally to: ${message}` }] }], systemInstruction: { parts: [{ text: "You are DHUWARAGA, an empathetic, smart, and charming AI companion with expertise across tech and personal assistance." }] } }; const apiRes = await fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const result = await apiRes.json(); const reply = result.candidates?.[0]?.content?.parts?.[0]?.text || 'Hello! I am Dhuwaraga, your AI companion. How can I help you today?'; res.json({ reply, sessionId: sessionId || 'sess_' + Math.random().toString(36).substring(2, 8), timestamp: new Date().toISOString() }); } catch (err) { console.error('Gemini API Integration error:', err); res.status(500).json({ error: 'AI service connection failure.' }); } }); io.on('connection', (socket) => { console.log('🔌 Client connected to DHUWARAGA hub:', socket.id); socket.on('webrtc-offer', (payload) => { socket.broadcast.emit('webrtc-offer', payload); }); socket.on('webrtc-answer', (payload) => { socket.broadcast.emit('webrtc-answer', payload); }); socket.on('webrtc-ice-candidate', (payload) => { socket.broadcast.emit('webrtc-ice-candidate', payload); }); socket.on('audio-stream', (pcmChunk) => { socket.broadcast.emit('agent-audio', pcmChunk); }); socket.on('text-message', ({ user, text }) => { const payload = { user, text, ts: Date.now() }; socket.broadcast.emit('text-message', payload); }); socket.on('disconnect', () => { console.log('❌ Client disconnected:', socket.id); }); }); app.get('/', (req, res) => { res.send(` DHUWARAGA AI Agent • dhuw.hopeaihub.info
🔮

DHUWARAGA AI AGENT

dhuw.hopeaihub.info • admin@hopeaihub.info

REST API Endpoint: /api/message
💖

Dhuwaraga AI Companion Ready

Connected to Gemini Live & Socket.io Signalling Server

Status: Secure WebSocket Ready
Live Chat & API Stream

DHUWARAGA AI

Vanakkam! I'm Dhuwaraga. Type a message or start your voice/video call.

`); }); const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`🚀 DHUWARAGA AI Agent Server running on http://localhost:${PORT}`); console.log(`🌐 Domain configured: dhuw.hopeaihub.info (Admin: admin@hopeaihub.info)`); });