import { logger } from './logger'; import { Server, createServer as cts } from 'http'; import connect, { NextHandleFunction } from 'connect'; import { routers } from './router'; import { Builder } from './builder'; import { createWebSocketServer, WebSocketServer } from './ws'; export const createServer = async (builder: Builder) => { let port = 8378; let wss: WebSocketServer; return new Promise((reslove, reject) => { const host = '0.0.0.0'; const server = connect(); server.use(async (req, res, next) => { res.setHeader('Access-Control-Allow-Origin', req.headers.origin || '*'); res.setHeader('Access-Control-Allow-Credentials', 'true'); res.setHeader('Access-Control-Allow-Headers', '*'); res.setHeader('Access-Control-Allow-Methods', '*'); res.setHeader('Access-Control-Allow-Methods', '*'); next(); }); server.use(handelMain(builder, port)); const httpServer = cts(server); const onError = (e: Error & { code?: string }) => { if (e.code === 'EADDRINUSE') { logger.info(`Port ${port} is in use, trying another one...`); httpServer.listen(++port, host); } else { httpServer.removeListener('error', onError); console.log(e); } }; httpServer.on('error', onError); httpServer.listen(port, host, () => { wss = createWebSocketServer(httpServer); handelWss(wss, builder); httpServer.removeListener('error', onError); // console.log('server at', port); reslove(port); }); }); }; export const handelWss = (wss: WebSocketServer, builder: Builder) => { builder.on('result', () => { // result change wss.send(JSON.stringify({ type: 'rc' })); }); }; export const handelMain = (builder: Builder, port: number): NextHandleFunction => (req, res, next) => { console.log(req.url); if (req.url && routers[req.url]) { routers[req.url](req, res, next); } if (req.url === '/api/componentMeta') { res.setHeader('content-type', 'application/json'); res.end( JSON.stringify({ main: `http://0.0.0.0:${port}/file/main.js`, deps: Object.keys(builder.results.deps).map((key, i) => { const ele = builder.results.deps[key]; const ext = ele.type; return `http://0.0.0.0:${port}/file/deps_${key}.${ext}`; }), }), ); } if (req.url?.match(/file\/*/)) { if (req.url.match('main')) { res.setHeader('content-type', 'application/javascript'); res.end(builder.results.main); } if (req.url.match('deps')) { const meta = req.url.split('_')[1].split('.'); res.setHeader('content-type', 'text/css'); res.end(builder.results.deps[meta[0]].code); } } };