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 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)`);
});