const express = require('express'); const axios = require('axios'); const app = express(); const port = 3000; // Middleware to parse JSON app.use(express.json()); // SSE proxy endpoint app.get('/api/proxy/sse/events/orders/:orderId', async (req, res) => { try { // Get the order ID from the request parameters const orderId = req.params.orderId; // Get the auth header from the request const authHeader = req.headers['x-signed-auth']; // API base URL const apiBaseUrl = process.env.API_ENDPOINT || 'https://api.example.com'; // Target URL const targetUrl = `${apiBaseUrl}/events/orders/${orderId}`; console.log(`Proxying SSE request to: ${targetUrl}`); // Create headers for the proxy request const headers = { 'Accept': 'text/event-stream', 'Cache-Control': 'no-cache', }; // Add auth header if available if (authHeader) { headers['X-Signed-Auth'] = authHeader; } // Make the request to the target URL const response = await axios({ method: 'GET', url: targetUrl, headers, responseType: 'stream', // Skip SSL certificate validation for development ...(process.env.NODE_ENV === 'development' && { httpsAgent: new (require('https').Agent)({ rejectUnauthorized: false }) }) }); // Set headers for SSE res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // Copy other headers from the response for (const [key, value] of Object.entries(response.headers)) { if (key.toLowerCase() !== 'content-length') { res.setHeader(key, value); } } // Pipe the response stream to the client response.data.pipe(res); // Handle client disconnect req.on('close', () => { console.log(`Client disconnected from SSE for order ${orderId}`); response.data.destroy(); }); } catch (error) { console.error('Error in SSE proxy:', error); res.status(500).json({ error: 'Internal server error' }); } }); // Start the server app.listen(port, () => { console.log(`SSE proxy server listening at http://localhost:${port}`); });