UNPKG

@fangcha/backend-kit

Version:
128 lines 5.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RouterPlugin = void 0; const tslib_1 = require("tslib"); const Koa = require("koa"); const koa_1 = require("@fangcha/logger/lib/koa"); const app_error_1 = require("@fangcha/app-error"); const logger_1 = require("@fangcha/logger"); const assert_1 = require("@fangcha/assert"); const session_1 = require("@fangcha/session"); const main_1 = require("../main"); const _RouterState_1 = require("./_RouterState"); const compose = require('koa-compose'); const bodyParser = require('koa-body'); class RouterPlugin { constructor(options) { assert_1.default.ok(!_RouterState_1._RouterState.locked, '_RouterState.locked must be false', 500); _RouterState_1._RouterState.locked = true; _RouterState_1._RouterState.routerApp = options.routerApp; this.options = options; this.updateOptions(options); } updateOptions(options) { options = Object.assign({}, options); delete options.routerApp; if (options.baseURL) { session_1._SessionApp.setBaseURL(options.baseURL); } assert_1.default.ok(!(options.jwtProtocol && options.basicAuthProtocol), 'jwtProtocol and basicAuthProtocol can only pass one', 500); if (options.jwtProtocol) { session_1._SessionApp.setJWTProtocol(options.jwtProtocol); } if (options.basicAuthProtocol) { _RouterState_1._RouterState.routerApp.updateParams({ useBasicAuth: true, }); session_1._SessionApp.basicAuthProtocol = options.basicAuthProtocol; } Object.assign(this.options, options); } appDidLoad(app) { const options = this.options; const koaApp = new Koa(); const onRequestError = options.onRequestError || ((err, ctx) => { console.error(err); if (ctx.status >= 500) { const session = ctx.session; main_1._FangchaState.botProxy.notifyApiError({ api: ctx.path || '', errorMsg: err.message, method: (ctx.method || '').toUpperCase(), statusCode: ctx.status, user: session.curUserStr(), ipAddress: session.realIP, duration: ctx.duration, reqid: session.reqid || '-', referer: ctx.headers.referer || '-', }); } }); koaApp.on('error', onRequestError); const routerApp = options.routerApp; for (const plugin of app.plugins) { const specDocItems = plugin.specDocItems || []; specDocItems.forEach((item) => { routerApp.addDocItem(item); }); } const codeVersion = process.env.CODE_VERSION || 'Unknown'; const writeLogMiddlewareBuilder = options.customWriteLogMiddlewareBuilder || new koa_1.WriteLogMiddlewareBuilder(); if (options.jwtProtocol && !options.Session) { options.Session = session_1.FangchaAdminSession; } if (options.basicAuthProtocol && !options.Session) { options.Session = session_1.FangchaOpenSession; } const sessionClazz = options.Session || session_1.FangchaSession; koaApp.use(compose([ ...routerApp.getMiddlewaresBeforeInit(), (ctx, next) => tslib_1.__awaiter(this, void 0, void 0, function* () { ctx.set('x-code-version', codeVersion); ctx.session = new sessionClazz(ctx); ctx.logger = ctx.session.logger; yield next(); }), writeLogMiddlewareBuilder.build(), (ctx, next) => tslib_1.__awaiter(this, void 0, void 0, function* () { const bodyParserOptions = options.bodyParserOptions || {}; const parser = bodyParser(Object.assign({ multipart: true }, bodyParserOptions)); try { yield parser(ctx, () => { }); } catch (e) { console.error(e); throw new app_error_1.default(`JSON parse error. ${e.message}`, 400); } yield next(); }), ...routerApp.getPreHandleMiddlewares(), // 暴露公开 api routerApp.makePublicRouterMiddleware(), (ctx, next) => tslib_1.__awaiter(this, void 0, void 0, function* () { const handleAuth = options.handleAuth || ((ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { const session = ctx.session; yield session.auth(); })); yield handleAuth(ctx); yield next(); }), routerApp.makePrivateRouterMiddleware(), ])); const onKoaAppLaunched = options.onKoaAppLaunched || (() => { // _FangchaState.botProxy.notify(`[${_FangchaState.tags.join(', ')}] App launched.`) logger_1.logger.info(`[${main_1._FangchaState.env}] Backend service listening on port ${options.backendPort}!`); }); const server = koaApp.listen(options.backendPort, () => { onKoaAppLaunched(); }); if (options.serverTimeout) { server.setTimeout(options.serverTimeout); } } } exports.RouterPlugin = RouterPlugin; //# sourceMappingURL=RouterPlugin.js.map