forked from quic-issues/427e7578-d7bf-49c8-aee9-2dd999e25316
- Add complete P2P polling application with React + TypeScript frontend - Implement Node.js backend with Yjs WebSocket and WebRTC signaling - Support dynamic poll creation, answer management, and voting - Add CRDT-based state synchronization using Yjs for conflict-free merging - Implement user tracking and vote prevention (one vote per user per option) - Create modern UI with Tailwind CSS and visual feedback - Add comprehensive documentation and setup instructions Features: - Users can create polls with custom questions - Anyone can add answer options to any poll - Real-time voting with instant cross-client synchronization - Smart vote tracking with visual feedback for voted options - User attribution showing who created polls and options - Connection status indicators for WebSocket and P2P connections Technical: - Hybrid P2P architecture (WebSocket + WebRTC) - CRDT-based state management with Yjs
60 lines
1.4 KiB
TypeScript
60 lines
1.4 KiB
TypeScript
import express from 'express';
|
|
import http from 'http';
|
|
import cors from 'cors';
|
|
import dotenv from 'dotenv';
|
|
import { createYjsServer } from './yjs-server';
|
|
import { createSignalingServer } from './signaling-server';
|
|
import { logger } from './utils/logger';
|
|
|
|
dotenv.config();
|
|
|
|
const app = express();
|
|
const PORT = process.env.PORT || 3000;
|
|
|
|
app.use(cors({
|
|
origin: process.env.CORS_ORIGIN || 'http://localhost:5173',
|
|
credentials: true
|
|
}));
|
|
|
|
app.use(express.json());
|
|
|
|
app.get('/health', (req, res) => {
|
|
res.json({
|
|
status: 'ok',
|
|
timestamp: new Date().toISOString(),
|
|
services: {
|
|
yjs: 'running',
|
|
signaling: 'running'
|
|
}
|
|
});
|
|
});
|
|
|
|
app.get('/', (req, res) => {
|
|
res.json({
|
|
message: 'P2P Poll Server',
|
|
endpoints: {
|
|
health: '/health',
|
|
yjs: 'ws://localhost:' + PORT + '/yjs',
|
|
signaling: 'ws://localhost:' + PORT + '/signal'
|
|
}
|
|
});
|
|
});
|
|
|
|
const server = http.createServer(app);
|
|
|
|
createYjsServer(server, PORT as number);
|
|
createSignalingServer(server);
|
|
|
|
server.listen(PORT, () => {
|
|
logger.info(`Server running on port ${PORT}`);
|
|
logger.info(`Yjs WebSocket: ws://localhost:${PORT}/yjs`);
|
|
logger.info(`Signaling WebSocket: ws://localhost:${PORT}/signal`);
|
|
});
|
|
|
|
process.on('SIGTERM', () => {
|
|
logger.info('SIGTERM signal received: closing HTTP server');
|
|
server.close(() => {
|
|
logger.info('HTTP server closed');
|
|
});
|
|
});
|