import { Router, withParams } from 'itty-router'; import { createRequestContext } from './RequestContext'; export function createRouter() { return ( Router() .get('/assets/*', (r, e, c) => { const { assetService } = createRequestContext(e, c); return assetService.handleStaticAssets(r, e, c); }) .post('/api/contact', (r, e, c) => { const { contactService } = createRequestContext(e, c); return contactService.handleContact(r); }) .post('/api/chat', (r, e, c) => { const { chatService } = createRequestContext(e, c); return chatService.handleChatRequest(r); }) .get('/api/streams/:streamId', withParams, async ({ streamId }, env, ctx) => { const { chatService } = createRequestContext(env, ctx); return chatService.handleSseStream(streamId); // Handles SSE for streamId }) .get('/api/models', async (req, env, ctx) => { const { chatService } = createRequestContext(env, ctx); return chatService.getSupportedModels(); }) .post('/api/feedback', async (r, e, c) => { const { feedbackService } = createRequestContext(e, c); return feedbackService.handleFeedback(r); }) .post('/api/tx', async (r, e, c) => { const { transactionService } = createRequestContext(e, c); return transactionService.handleTransact(r); }) // used for file handling, can be enabled but is not fully implemented in this fork. // .post('/api/documents', async (r, e, c) => { // const {documentService} = createServerContext(e, c); // return documentService.handlePutDocument(r) // }) // // .get('/api/documents', async (r, e, c) => { // const {documentService} = createServerContext(e, c); // return documentService.handleGetDocument(r) // }) .get('/api/metrics*', async (r, e, c) => { const { metricsService } = createRequestContext(e, c); return metricsService.handleMetricsRequest(r); }) .post('/api/metrics*', async (r, e, c) => { const { metricsService } = createRequestContext(e, c); return metricsService.handleMetricsRequest(r); }) // renders the app .all('^(?!/api/)(?!/assets/).*$', async (r, e, c) => { const { assetService } = createRequestContext(e, c); // First attempt to serve pre-rendered HTML const preRenderedHtml = await assetService.handleStaticAssets(r, e); if (preRenderedHtml !== null) { return preRenderedHtml; } // If no pre-rendered HTML, attempt SSR const ssrResponse = await assetService.handleSsr(r.url, r.headers, e); if (ssrResponse !== null) { return ssrResponse; } // Finally, proxy to static assets if nothing else matched return assetService.handleStaticAssets(r, e); }) ); }