@mvx/mvc
Version:
@mvx/mvc is mvc framework on server, base on koa, @tsdi frameworks
350 lines (348 loc) • 17.7 kB
JavaScript
;
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);
};
MvcApplication.ρAnn = 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(); });
}
};
MvcStartupService.ρAnn = 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;
}
});
};
MvcCoreModule.ρAnn = 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