import engine from "./server-engine" import { F2EConfig } from "./interface" import { getConfigEvents, getConfigResult } from "./utils/config" import logger from "./utils/logger" import createMemoryTree from "./memory-tree" import { exit } from "node:process" import * as _ from './utils/misc' import { server_all } from "./server" import { getServerIPs } from "./utils/misc" export * from "./interface" export * from "./utils" export * from './routes' export * from './memory-tree/interface' export * from './middlewares/interface' export * from './middlewares/auth' export * from './middlewares/routes' const { App, SSLApp } = engine export const createBuilder = async (options: F2EConfig) => { const beginTime = Date.now() const conf = getConfigResult(options) const { root, watch, namehash, dest } = conf const events = await getConfigEvents(options) const { onMemoryInit, onMemoryLoad, buildFilter, watchFilter, outputFilter, onGet, onSet, buildWatcher } = events const memoryTree = createMemoryTree({ root, dest: dest, watch, namehash, buildFilter, watchFilter, outputFilter, onGet, onSet, buildWatcher }) try { await onMemoryInit(memoryTree.store) await memoryTree.input("") await onMemoryLoad(memoryTree.store) await memoryTree.output("") logger.info(`Build success in ${Date.now() - beginTime}ms`) } catch (e) { logger.error(e) exit(1) } return { conf, events, memoryTree } } export const createServer = async (options: F2EConfig) => { const startTime = Date.now() const conf = getConfigResult(options) const { root, watch, dest, mode, namehash, port, host, ssl, onServerCreate } = conf if (mode === 'build') { return createBuilder(options) } const events = await getConfigEvents(options) const { onMemoryLoad, onMemoryInit, buildFilter, watchFilter, outputFilter, onGet, onSet, buildWatcher } = events const memoryTree = createMemoryTree(mode === 'dev' ? { root, watch, namehash, dest, buildFilter, watchFilter, outputFilter, onGet, onSet, buildWatcher } : { root, buildFilter }); // prod模式下,仅加载 buildFilter await onMemoryInit(memoryTree.store) await memoryTree.input("") await onMemoryLoad(memoryTree.store) logger.debug('server init: ' + (Date.now() - startTime) + 'ms') watch && memoryTree.watch() const app = ssl ? SSLApp(ssl) : App() app.listen(host, port, function () { if (host === '0.0.0.0') { logger.debug(`Server start on: ${getServerIPs().map((ip) => `\n\t${conf.ssl ? 'https' : 'http'}://${ip}:${conf.port}`).join('')}\n`) } else { logger.debug(`Server start on ${conf.ssl ? 'https' : 'http'}://${host}:${conf.port}`) } if (conf.esbuild && conf.esbuild.with_bundle_analyze) { const analyze_page_path = conf.esbuild.analyze_page_path logger.debug(`Analyze page: ${getServerIPs().map((ip) => `\n\t${conf.ssl ? 'https' : 'http'}://${ip}:${conf.port}/${analyze_page_path}`).join('')}\n`) } onServerCreate(app, conf) }) .any('/*', server_all(conf, events, memoryTree)) return { app, conf, events, memoryTree } } export default createServer