import { Hono } from 'hono'; import { serve as honoServe } from '@hono/node-server'; import { clearCache } from "../../fn/functionContextClient.js"; import { discoverDocuments } from "../utils/discover.js"; import { watchForChanges } from "../utils/watchForChanges.js"; import { checkDuplicatePath } from "../middleware/checkDuplicatePath.js"; import { redirectRoot } from "../middleware/redirectRoot.js"; import { serveUploads } from "../middleware/serveUploads.js"; import { serveDocument } from "../middleware/serveDocument.js"; import log from "../utils/log.js"; /** * Serve multiple documents from the current working directory * Discovers all settings.json files and routes to appropriate documents on-demand */ export const serve = async (ctx, port, watchFiles = true, clearCacheFlag = false, fnMode = 'api') => { // Clear cache if requested if (clearCacheFlag) { await clearCache(); } // Discover all documents in the directory tree let discovery = await discoverDocuments(process.cwd(), { throwOnEmpty: true }); // Getter function for middleware (allows for mutable discovery) const getDiscovery = () => discovery; const app = new Hono(); // Apply middleware in order: // 1. Check for duplicate paths (returns 500 if path is duplicated) // 2. Redirect root to first document if no root document exists // 3. Serve uploads from document directories // 4. Serve documents app.get('/*', checkDuplicatePath(getDiscovery), redirectRoot(getDiscovery), serveUploads(getDiscovery), serveDocument(getDiscovery, ctx, fnMode)); log.info(`\nšŸš€ Serving at http://localhost:${port}/`); if (watchFiles) { log.info(`šŸ‘€ Watching for file changes...`); watchForChanges(newDiscovery => { discovery = newDiscovery; }); } const server = honoServe({ fetch: app.fetch, port, }); // Ensure the HTTP server keeps the process alive even if the underlying // implementation uses `unref()`. if (typeof server.ref === 'function') { ; server.ref(); } // Keep the command running until the server closes. await new Promise((resolve, reject) => { ; server.once('close', () => resolve()); server.once('error', err => reject(err)); }); }; //# sourceMappingURL=serve.js.map