UNPKG

@daiyu-5577/quickbuild

Version:

front-end build service

137 lines (136 loc) 5.43 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import express from 'express'; import { createServer } from "http"; import { Server } from "socket.io"; import cors from 'cors'; import path from 'path'; import chalk from 'chalk'; import controller from './controller.js'; import controller_page from './controller.page.js'; import controller_io from './controller.io.js'; import Builder from '../commandBuild/index.js'; import logger from '../../utils/log.js'; import { startCron } from '../../utils/cron.js'; import { loadDatabase } from '../../database/index.js'; const __dirname = new URL('.', import.meta.url).pathname; class BaseClass { add(name, instance) { this[name] = instance; } } export default class BuildServer extends BaseClass { constructor(props) { super(); this.app = express(); this.httpServer = createServer(this.app); this.io = new Server(this.httpServer, { path: '/ws/', pingTimeout: 20000, pingInterval: 6000, maxHttpBufferSize: 1e8 * 60, }); this.port = 3000; this.database = new Map(); const { port } = props; this.port = port || this.port; const builder = new Builder({ buildServer: this, }); this.app.set('builder', builder); this.app.set('io', this.io); this.app.set('port', this.port); this.builder = builder; } use(name, instance) { this[name] = instance; this.app.set(name, instance); } init() { return __awaiter(this, void 0, void 0, function* () { yield this.getDatabase(); this.app.use('/static', express.static(path.resolve(__dirname, '../../static'), { extensions: ['html', 'js', 'css'], })); this.app.use(express.json({ limit: '50mb' })); this.app.use((req, res, next) => { var _a; const excludePaths = [ '/static', '/page', '/api/getAllTask', '/api/getAllPackage', '/api/getLogFiles', '/api/showLog', ]; if (excludePaths.some(v => req.path.startsWith(v))) return next(); if (req.path.startsWith('/api/notify') && ((_a = req.body) === null || _a === void 0 ? void 0 : _a.type) == 'on:msg-build') return next(); logger.log({ level: 'http', message: `Request: ${req.method} ${req.url}`, headers: req.headers, body: req.body, }); const originalEnd = res.end; res.end = function (chunk, encoding, callback) { logger.log({ level: 'http', message: `Response: ${req.method} ${req.url}`, code: res.statusCode, headers: req.headers, body: !!chunk && chunk instanceof Buffer ? chunk.toString('utf8') : '' }); originalEnd.call(this, chunk, encoding, callback); }; next(); }); this.app.use(cors({ origin: true, methods: ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'], allowedHeaders: ['Content-Type', 'Authorization', 'X-Debug'], credentials: true, })); this.app.use('/api', controller); this.app.use('/page', controller_page); controller_io.use(this).start(); this.app.use((err, req, res, next) => { const errorMsg = err instanceof Error ? err.stack : JSON.stringify(err); if (res.headersSent) { console.error('errorHandler: ' + errorMsg); next(err); return; } res.status(500); res.send({ message: errorMsg, success: false, }); }); }); } getDatabase() { return __awaiter(this, void 0, void 0, function* () { const database = yield loadDatabase(); this.app.set('database', database); this.database = database; }); } start() { return __awaiter(this, void 0, void 0, function* () { yield this.init(); startCron(); this.httpServer.listen(this.port, () => { console.log(chalk.green(`server start listening on port ${this.port}`)); }); }); } }