UNPKG

@mvx/mvc

Version:

@mvx/mvc is mvc framework on server, base on koa, @tsdi frameworks

350 lines (348 loc) 17.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MvcStartupService = exports.MvcApplication = void 0; var tslib_1 = require("tslib"); var ioc_1 = require("@tsdi/ioc"); var core_1 = require("@tsdi/core"); var aop_1 = require("@tsdi/aop"); var logs_1 = require("@tsdi/logs"); var boot_1 = require("@tsdi/boot"); var platform_server_boot_1 = require("@tsdi/platform-server-boot"); var platform_server_logs_1 = require("@tsdi/platform-server-logs"); var decorators_1 = require("./decorators"); var MvcContext_1 = require("./MvcContext"); var ControllerRegisterAction_1 = require("./registers/ControllerRegisterAction"); var MiddlewareRegisterAction_1 = require("./registers/MiddlewareRegisterAction"); var MvcServer_1 = require("./MvcServer"); var DefaultMvcMiddlewares_1 = require("./DefaultMvcMiddlewares"); var http = require("http"); var https = require("https"); var MvcApp_1 = require("./MvcApp"); var RouteChecker_1 = require("./services/RouteChecker"); var AuthorizationAspect_1 = require("./aop/AuthorizationAspect"); var MvcMiddleware_1 = require("./middlewares/MvcMiddleware"); var ControllerRoute_1 = require("./router/ControllerRoute"); var CorsMiddleware_1 = require("./router/CorsMiddleware"); var Router_1 = require("./router/Router"); var MvcMiddlewares_1 = require("./middlewares/MvcMiddlewares"); var MiddlewareRegister_1 = require("./middlewares/MiddlewareRegister"); var RouterMiddleware_1 = require("./router/RouterMiddleware"); var BeforeMidddlewareStartupService_1 = require("./services/BeforeMidddlewareStartupService"); var AfterMidddlewareStartupService_1 = require("./services/AfterMidddlewareStartupService"); var ServerFactory_1 = require("./ServerFactory"); var mount = require('koa-mount'); /** * Default Application of type mvc. * * @export * @class Application * @implements {IApplication} */ var MvcApplication = /** @class */ (function (_super) { tslib_1.__extends(MvcApplication, _super); function MvcApplication() { return _super !== null && _super.apply(this, arguments) || this; } MvcApplication.prototype.getBootDeps = function () { var deps = _super.prototype.getBootDeps.call(this); return tslib_1.__spreadArrays([aop_1.AopModule, logs_1.LogModule, platform_server_boot_1.ServerBootstrapModule, boot_1.ORMCoreModule, platform_server_logs_1.ServerLogsModule, MvcCoreModule, MvcStartupService], deps); }; /** * run mvc application. * * @static * @template T * @param {(T | Type | MvcOptions)} [target] * @param {(LoadType[] | LoadType | string)} [deps] * @param {...string[]} args * @returns {Promise<T>} * @memberof MvcApplication */ MvcApplication.run = function (target, deps) { var args = []; for (var _i = 2; _i < arguments.length; _i++) { args[_i - 2] = arguments[_i]; } return tslib_1.__awaiter(this, void 0, void 0, function () { var mdargs; var _a; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: mdargs = boot_1.checkBootArgs.apply(void 0, tslib_1.__spreadArrays([deps], args)); target = target || MvcApp_1.MvcApp; return [4 /*yield*/, (_a = new MvcApplication(target, mdargs.deps)).run.apply(_a, mdargs.args)]; case 1: return [2 /*return*/, _b.sent()]; } }); }); }; MvcApplication.prototype.onContextInit = function (ctx) { _super.prototype.onContextInit.call(this, ctx); this.getContainer().setValue(MvcContext_1.MvcContextToken, ctx); }; MvcApplicationAnn = function () { return { "name": "MvcApplication" }; }; return MvcApplication; }(boot_1.BootApplication)); exports.MvcApplication = MvcApplication; /** * configure register. * * @export * @class MvcConfigureRegister * @extends {ConfigureRegister} */ var MvcStartupService = /** @class */ (function (_super) { tslib_1.__extends(MvcStartupService, _super); function MvcStartupService() { return _super !== null && _super.apply(this, arguments) || this; } MvcStartupService.prototype.configureService = function (ctx) { return tslib_1.__awaiter(this, void 0, void 0, function () { var config, injector, logConfig, middlewares, metadata, mvcMiddles; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: // befor process exit. if (ioc_1.isDefined(process)) { process.once('beforeExit', function () { ctx.destroy(); }); } this.ctx = ctx; this.logger = ctx.getLogManager().getLogger(); this.logger.info('startup mvc controllers and middlewares'); config = ctx.getConfiguration(); this.subs = []; ctx.getKoa().keys = config.keys; injector = ctx.injector; logConfig = config.logConfig; if (logConfig && !injector.has(logs_1.LogConfigureToken)) { injector.bindProvider(logs_1.LogConfigureToken, logConfig); } if (!injector.has(DefaultMvcMiddlewares_1.DefaultMvcMiddlewaresToken)) { injector.bindProvider(DefaultMvcMiddlewares_1.DefaultMvcMiddlewaresToken, DefaultMvcMiddlewares_1.DefaultMvcMiddlewares); } middlewares = injector.get(MvcMiddlewares_1.MvcMiddlewares); metadata = ctx.getAnnoation(); mvcMiddles = metadata.middlewares || injector.get(DefaultMvcMiddlewares_1.DefaultMvcMiddlewaresToken); if (ioc_1.isArray(mvcMiddles)) { mvcMiddles.forEach(function (middle) { if (ioc_1.isClass(middle)) { middlewares.use(middle); } else if (ioc_1.isFunction(middle)) { var mid = middle(config, ctx); if (ioc_1.isFunction(mid)) { middlewares.use(mid); } } else if (middle instanceof boot_1.Handle) { middlewares.use(middle); } }); } if (!config.loadMiddlewares) return [3 /*break*/, 2]; return [4 /*yield*/, injector.load({ basePath: ctx.getRootPath(), files: config.loadMiddlewares })]; case 1: _a.sent(); _a.label = 2; case 2: injector.invoke(MiddlewareRegister_1.MiddlewareRegister, function (tag) { return tag.setup; }); if (!injector.hasRegister(ServerFactory_1.ServerFactoryToken)) { injector.setValue(ServerFactory_1.ServerFactoryToken, function (ctx, config) { return config.httpsOptions ? (config.httpsOptions.secureProtocol ? https.createServer(config.httpsOptions, ctx.getKoa().callback()) : http.createServer(config.httpsOptions, ctx.getKoa().callback())) : http.createServer(ctx.getKoa().callback()); }); } if (!ctx.httpServer) { ctx.httpServer = injector.get(ServerFactory_1.ServerFactoryToken)(ctx, config); } if (!config.loadControllers) return [3 /*break*/, 4]; return [4 /*yield*/, injector.load({ basePath: ctx.getRootPath(), files: config.loadControllers })]; case 3: _a.sent(); _a.label = 4; case 4: return [4 /*yield*/, Promise.all(injector.getServices(BeforeMidddlewareStartupService_1.BeforeMidddlewareStartupService) .map(function (s) { return s.startup(ctx, middlewares); }))]; case 5: _a.sent(); injector.get(MvcMiddlewares_1.MvcMiddlewares) .setup(ctx); return [4 /*yield*/, Promise.all(injector.getServices(AfterMidddlewareStartupService_1.AfterMidddlewareStartupService) .map(function (s) { return s.startup(ctx, middlewares); }))]; case 6: _a.sent(); if (!(config.subSites && config.subSites.length)) return [3 /*break*/, 8]; return [4 /*yield*/, Promise.all(config.subSites.map(function (site) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var koa, subCtx, subCtx_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!ioc_1.isClass(site.app)) return [3 /*break*/, 2]; return [4 /*yield*/, MvcApplication.run({ autorun: false, module: site.app, configures: [ioc_1.lang.omit(config, 'subsites')] })]; case 1: subCtx_1 = _a.sent(); this.subs.push(subCtx_1); koa = subCtx_1.getKoa(); return [3 /*break*/, 5]; case 2: if (!ioc_1.isFunction(site.app)) return [3 /*break*/, 4]; return [4 /*yield*/, site.app(config)]; case 3: koa = _a.sent(); return [3 /*break*/, 5]; case 4: koa = site.app; _a.label = 5; case 5: if (koa) { ctx.getKoa().use(mount(site.routePrefix, koa)); } return [2 /*return*/]; } }); }); }))]; case 7: _a.sent(); _a.label = 8; case 8: return [2 /*return*/]; } }); }); }; MvcStartupService.prototype.destroying = function () { this.logger.info('remove controllers and middlewares.'); var koa = this.ctx.getKoa(); koa.removeAllListeners(); koa.middleware.length = 0; if (this.subs.length) { this.subs.forEach(function (s) { return s === null || s === void 0 ? void 0 : s.destroy(); }); } }; MvcStartupServiceAnn = function () { return { "name": "MvcStartupService", "params": { "configureService": ["ctx"] } }; }; MvcStartupService = tslib_1.__decorate([ boot_1.Boot({ before: 'all' }) ], MvcStartupService); return MvcStartupService; }(boot_1.StartupService)); exports.MvcStartupService = MvcStartupService; var MvcCoreModule = /** @class */ (function () { function MvcCoreModule() { } MvcCoreModule.prototype.setup = function (container) { container.registerType(MvcContext_1.MvcContext) .registerType(MvcServer_1.MvcServer); container.inject(AuthorizationAspect_1.AuthorizationAspect, RouteChecker_1.RouteChecker, MvcMiddleware_1.CompositeMiddleware, MvcMiddlewares_1.MvcMiddlewares, MiddlewareRegister_1.MiddlewareRegister, CorsMiddleware_1.CorsMiddleware, Router_1.Router, ControllerRoute_1.ControllerRoute, RouterMiddleware_1.RouterMiddleware); container.bindProvider(boot_1.DefaultConfigureToken, { hostname: '', port: 3000, routePrefix: '', setting: {}, loadMiddlewares: ['./middlewares/**/*{.js,.ts}', '!./**/*.d.ts'], loadControllers: ['./controllers/**/*{.js,.ts}', '!./**/*.d.ts'], aop: ['./aop/**/*{.js,.ts}', '!./**/*.d.ts'], views: './views', corsOptions: { allowMethods: 'GET,PUT,POST,DELETE,OPTIONS', keepHeadersOnError: true, maxAge: 60 * 60 * 1000 }, viewsOptions: { extension: 'ejs', map: { html: 'nunjucks' } }, models: ['./models/**/*{.js,.ts}', '!./**/*.d.ts'], repositories: ['./repositories/**/*.(ts|js)', '!./**/*.d.ts'], keys: ['typemvc'], contents: ['./public'] }); var actInjector = container.getInstance(ioc_1.ActionInjector); actInjector.register(ControllerRegisterAction_1.ControllerRegisterAction) .register(MiddlewareRegisterAction_1.MiddlewareRegisterAction); var dreger = actInjector.getInstance(ioc_1.DesignRegisterer); dreger.register(decorators_1.Controller, 'Class', ioc_1.TypeProviderAction, ControllerRegisterAction_1.ControllerRegisterAction) .register(decorators_1.Authorization, 'Class', ioc_1.TypeProviderAction) .register(decorators_1.Middleware, 'Class', ioc_1.TypeProviderAction, MiddlewareRegisterAction_1.MiddlewareRegisterAction); boot_1.registerModule(decorators_1.MvcModule, dreger); var runtimeRgr = actInjector.getInstance(ioc_1.RuntimeRegisterer); runtimeRgr.register(decorators_1.Authorization, 'Method', ioc_1.MthProviderAction) .register(decorators_1.MvcModule, 'Class', ioc_1.IocSetCacheAction); actInjector.getInstance(ioc_1.DecoratorProvider) .bindProviders(decorators_1.MvcModule, { provide: boot_1.ModuleProvidersBuilderToken, useValue: { build: function (providers, annoation) { if (annoation.controllers && annoation.controllers.length) { providers.injectModule.apply(providers, annoation.controllers); } } } }, { provide: boot_1.BootContext, deps: [core_1.ContainerToken], useFactory: function (container) { var providers = []; for (var _i = 1; _i < arguments.length; _i++) { providers[_i - 1] = arguments[_i]; } var ref = new ioc_1.InjectReference(boot_1.BootContext, decorators_1.MvcModule.toString()); if (container.has(ref)) { return container.get.apply(container, tslib_1.__spreadArrays([ref], providers)); } else { return container.get.apply(container, tslib_1.__spreadArrays([MvcContext_1.MvcContext], providers)); } } }, { provide: boot_1.Startup, deps: [core_1.ContainerToken], useFactory: function (container) { var providers = []; for (var _i = 1; _i < arguments.length; _i++) { providers[_i - 1] = arguments[_i]; } var ref = new ioc_1.InjectReference(boot_1.Startup, decorators_1.MvcModule.toString()); if (container.has(ref)) { return container.get.apply(container, tslib_1.__spreadArrays([ref], providers)); } return null; } }); }; MvcCoreModuleAnn = function () { return { "name": "MvcCoreModule", "params": { "setup": ["container"] } }; }; tslib_1.__decorate([ tslib_1.__param(0, ioc_1.Inject(core_1.ContainerToken)), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [Object]), tslib_1.__metadata("design:returntype", void 0) ], MvcCoreModule.prototype, "setup", null); MvcCoreModule = tslib_1.__decorate([ ioc_1.IocExt(), tslib_1.__metadata("design:paramtypes", []) ], MvcCoreModule); return MvcCoreModule; }()); //# sourceMappingURL=sourcemaps/MvcApplication.js.map