const fastify = require('fastify')({ logger: true }); const axios = require('axios'); // SSE proxy endpoint fastify.get('/api/proxy/sse/events/orders/:orderId', async (request, reply) => { try { // Get the order ID from the request parameters const orderId = request.params.orderId; // Get the auth header from the request const authHeader = request.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}`; fastify.log.info(`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 reply.header('Content-Type', 'text/event-stream'); reply.header('Cache-Control', 'no-cache'); reply.header('Connection', 'keep-alive'); // Copy other headers from the response for (const [key, value] of Object.entries(response.headers)) { if (key.toLowerCase() !== 'content-length') { reply.header(key, value); } } // Send the response reply.send(response.data); // Handle client disconnect request.raw.on('close', () => { fastify.log.info(`Client disconnected from SSE for order ${orderId}`); response.data.destroy(); }); } catch (error) { fastify.log.error('Error in SSE proxy:', error); reply.status(500).send({ error: 'Internal server error' }); } }); // Start the server const start = async () => { try { await fastify.listen({ port: 3000 }); fastify.log.info(`SSE proxy server listening at http://localhost:3000`); } catch (err) { fastify.log.error(err); process.exit(1); } }; start();