Files
open-gsio/packages/server/api-router.ts
2025-06-24 17:32:59 -04:00

85 lines
2.9 KiB
TypeScript

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