@gabliam/web-core
Version:
Gabliam plugin for add web-core
95 lines (94 loc) • 4.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebPluginBase = void 0;
const tslib_1 = require("tslib");
const core_1 = require("@gabliam/core");
const constants_1 = require("./constants");
const metadatas_1 = require("./metadatas");
const utils_1 = require("./utils");
const web_configuration_1 = require("./web-configuration");
/**
* Build Webconfig before controller
*
* @param {Container} container
* @param {Registry} registry
*/
const buildWebConfig = (container, registry) => {
const middlewareConfig = container.get(web_configuration_1.WebConfiguration);
const app = container.get(constants_1.APP);
middlewareConfig.webConfigs
.sort((a, b) => a.order - b.order)
.forEach(({ instance }) => instance(app, container));
};
/**
* Build Webconfig after controller
*
* @param {Container} container
* @param {Registry} registry
*/
const buildWebConfigAfterCtrl = (container, registry) => {
const middlewareConfig = container.get(web_configuration_1.WebConfiguration);
const app = container.get(constants_1.APP);
middlewareConfig.WebConfigAfterCtrls.sort((a, b) => a.order - b.order).forEach(({ instance }) => instance(app, container));
};
/**
* Base class for web plugin.
*/
let WebPluginBase = class WebPluginBase {
constructor(config) {
this.webConfiguration = new web_configuration_1.WebConfiguration(config);
}
/**
* binding phase
*
* @param {Container} container - The container.
* @param {Registry} registry - The registry.
*/
async bind(container, registry) {
const webConfiguration = this.webConfiguration;
container.bind(web_configuration_1.WebConfiguration).toConstantValue(webConfiguration);
await (0, core_1.toPromise)(this.bindApp(container, registry, webConfiguration));
}
/**
* Management of @WebConfig and @WebConfigAfterControllers decorator in config class
*
* @param {Container} container - The container
* @param {Registry} registry - The registry
* @param {any} confInstance - The current instance of confi class
*/
config(container, registry, confInstance) {
const webConfig = container.get(web_configuration_1.WebConfiguration);
const webConfigList = core_1.reflection.propMetadataOfDecorator(confInstance.constructor, metadatas_1.WebConfig);
for (const [key, webConfigs] of Object.entries(webConfigList)) {
const [{ order }] = webConfigs.slice(-1);
webConfig.addwebConfig({
order,
instance: confInstance[key].bind(confInstance[key]),
});
}
const webConfigAfterCtlsList = core_1.reflection.propMetadataOfDecorator(confInstance.constructor, metadatas_1.WebConfigAfterControllers);
for (const [key, webConfigs] of Object.entries(webConfigAfterCtlsList)) {
const [{ order }] = webConfigs.slice(-1);
webConfig.addWebConfigAfterCtrl({
order,
instance: confInstance[key].bind(confInstance[key]),
});
}
}
async start(container, registry) {
buildWebConfig(container, registry);
await (0, core_1.toPromise)(this.buildControllers((0, utils_1.extractControllerMetadata)(container, registry), container));
buildWebConfigAfterCtrl(container, registry);
const restConfig = container.get(constants_1.WEB_PLUGIN_CONFIG);
const webConfiguration = container.get(web_configuration_1.WebConfiguration);
const serverStarter = webConfiguration.serverStarter;
const listenerCreator = container.get(constants_1.REQUEST_LISTENER_CREATOR);
const server = await (0, core_1.toPromise)(serverStarter.start(restConfig, webConfiguration, listenerCreator));
container.bind(constants_1.SERVER).toConstantValue(server);
}
};
WebPluginBase = tslib_1.__decorate([
(0, core_1.Scan)(),
tslib_1.__metadata("design:paramtypes", [Object])
], WebPluginBase);
exports.WebPluginBase = WebPluginBase;