bpframework
Version:
Web framework like java springboot and springcloud
267 lines • 12.3 kB
JavaScript
;
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());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Application = void 0;
const febs_decorator_1 = require("febs-decorator");
const febs = require("febs");
const config_1 = require("./config");
const RefreshRemoteEvent = require("./decorators/events/RefreshRemoteEvent");
const ContextRefreshedEvent = require("./decorators/events/ContextRefreshedEvent");
const FindMicroserviceConfigure = require("./decorators/configure/FindMicroserviceConfigure");
const FeignClientConfigure = require("./decorators/configure/FeignClientConfigure");
const RestControllerConfigure = require("./decorators/configure/RestControllerConfigure");
const discovery = require("./discovery");
const utils_1 = require("./utils");
const discovery_1 = require("./discovery");
const logger_1 = require("./logger");
const global_1 = require("./global");
const CONFIG_FILE = './config/bootstrap.yml';
class Application {
static runKoa(cfg) {
logger_1.setLogger(cfg.logger);
logger_1.setLogLevel(cfg.logLevel);
global_1.setEnableScheduled(!!cfg.enableScheduled);
Application.initial(cfg)
.then(() => {
Application.useKoa(cfg.app);
let port = this.getConfig()['server.port'];
cfg.app.listen(port, '0.0.0.0', () => {
logger_1.getLogger().info('[pid]: ' + process.pid);
logger_1.getLogger().info('[Evn is] : ' + (__debug ? 'dev' : 'prod'));
logger_1.getLogger().info('[Port is]: ' + port);
logger_1.getLogger().info('[koa server is running]');
});
})
.catch((e) => {
logger_1.getLogger().error(logger_1.LOG_TAG, '[Init] error\r\n' + utils_1.getErrorMessage(e));
process.exit(0);
});
}
static useKoa(koaApp) {
koaApp.use((ctx, next) => __awaiter(this, void 0, void 0, function* () {
let request = {
headers: ctx.request.headers,
url: ctx.request.url,
origin: ctx.request.origin,
method: ctx.request.method,
host: ctx.request.host,
protocol: ctx.request.protocol,
ip: ctx.request.ip,
body: ctx.request.body,
};
let response = yield febs_decorator_1.CallRestControllerRoute(request, ctx);
if (response) {
if (response.headers) {
for (const key in response.headers) {
ctx.set(key, response.headers[key]);
}
}
ctx.response.status = response.status;
ctx.response.body = response.body;
}
yield next();
}));
}
static initial(cfg) {
return Application.initialWithConfig(cfg, cfg.configPath || CONFIG_FILE)
.then(() => Application.initialWithNacos())
.then(() => Application.initialWithFeignClient(cfg))
.then(() => Application.initialWithRouters());
}
static initialWithConfig(cfg, configPath) {
return __awaiter(this, void 0, void 0, function* () {
logger_1.getLogger().info("[ConfigCenter] Use config from local: " + configPath);
let config = config_1.readYamlConfig(configPath);
let configs = config_1.setCloudConfig(config);
yield ContextRefreshedEvent._callContextRefreshedEvent({ configs: configs });
if (config['spring.cloud.config.uri']) {
logger_1.getLogger().info("[ConfigCenter] Fetch cloud config from: " + config['spring.cloud.config.uri']);
try {
yield config_1.initSpringCloudConfig({
springCloudBusConfigurePrefix: cfg.springCloudBusConfigurePrefix || 'spring.rabbitmq',
yamlConfig: config,
cbRefresh: (changed, all) => {
let ev = {
updatedConfigs: changed,
latestConfigs: all,
};
Application.onConfigRefresh(cfg, ev)
.then(() => RefreshRemoteEvent._callRefreshRemoteEvent(ev))
.then(() => { })
.catch((e) => {
logger_1.getLogger().error(e);
});
},
});
logger_1.getLogger().info(logger_1.LOG_TAG, 'init config');
}
catch (e) {
logger_1.getLogger().error(e);
process.exit(0);
}
}
else {
return Promise.resolve();
}
});
}
static initialWithFeignClient(cfg) {
return __awaiter(this, void 0, void 0, function* () {
let config = this.getConfig();
let maxAutoRetriesNextServer;
let maxAutoRetries;
let readTimeout;
if (config.ribbon) {
maxAutoRetriesNextServer =
config.ribbon.MaxAutoRetriesNextServer || maxAutoRetriesNextServer;
maxAutoRetries = config.ribbon.MaxAutoRetries || maxAutoRetries;
readTimeout = config.ribbon.ReadTimeout || readTimeout;
}
let levelFeign = 'basic';
if (config['bp.feignLoggingLevel']) {
levelFeign = config['bp.feignLoggingLevel'];
}
let c = yield FeignClientConfigure._callFeignClient();
febs_decorator_1.setFeignClientDefaultCfg({
fetch: febs.net.fetch,
maxAutoRetriesNextServer,
maxAutoRetries,
logLevel: levelFeign,
timeout: readTimeout,
headers: c ? c.defaultHeaders : null,
findServiceCallback: this.onFindServiceCallback,
filterMessageCallback: (receiveMessage, returnMessage, requestServiceName, requestUrl) => {
if (c && c.filterResponseCallback) {
c.filterResponseCallback({
receiveMessage,
returnMessage,
requestServiceName,
requestUrl,
});
}
},
});
});
}
static initialWithNacos() {
return __awaiter(this, void 0, void 0, function* () {
try {
let cloudConfig = Application.getConfig();
let port = cloudConfig['spring.cloud.nacos.discovery.port'] ||
cloudConfig['server.port'];
if (!port) {
throw new Error(logger_1.LOG_TAG + 'must provide a server port');
}
if (cloudConfig['spring.cloud.nacos.discovery.serverAddr']) {
yield discovery.initNacosNamingClient({
serverList: cloudConfig['spring.cloud.nacos.discovery.serverAddr'],
namespace: cloudConfig['spring.cloud.nacos.discovery.namespace'],
ssl: utils_1.castBoolean(cloudConfig['spring.cloud.nacos.discovery.secure']),
registerInfo: {
serviceName: cloudConfig['spring.application.name'],
ip: cloudConfig['spring.cloud.nacos.discovery.ip'],
port: port,
},
});
logger_1.getLogger().info(logger_1.LOG_TAG, 'init nacos finish');
}
else {
return Promise.resolve();
}
}
catch (e) {
logger_1.getLogger().error(e);
process.exit(0);
}
});
}
static initialWithRouters() {
return __awaiter(this, void 0, void 0, function* () {
let c = yield RestControllerConfigure._callRestController();
let config = this.getConfig();
let levelRest = 'basic';
if (config['bp.restControllerLoggingLevel']) {
levelRest = config['bp.restControllerLoggingLevel'];
}
febs_decorator_1.setRestControllerDefaultCfg({
logLevel: levelRest,
headers: c ? c.defaultHeaders : null,
filterMessageCallback: (returnMessage, requestUrl) => {
if (c && c.filterResponseCallback) {
return c.filterResponseCallback({
returnMessage,
requestUrl,
});
}
else {
return returnMessage;
}
},
errorRequestCallback: (error, request, response) => {
if (c && c.errorRequestCallback) {
return c.errorRequestCallback(error, request, response);
}
},
errorResponseCallback: (error, request, response) => {
if (c && c.errorResponseCallback) {
return c.errorResponseCallback(error, request, response);
}
},
notFoundCallback: (request, response) => {
if (c && c.notFoundCallback) {
return c.notFoundCallback(request, response);
}
}
});
});
}
static onFindServiceCallback(serviceName, excludeHost) {
return __awaiter(this, void 0, void 0, function* () {
let r = yield FindMicroserviceConfigure._callFindMicroservice(serviceName, excludeHost);
if (r) {
return r;
}
let hosts = yield discovery_1.getNacosService(serviceName);
if (!hosts || hosts.length == 0) {
throw new Error('Cannot find service: ' + serviceName);
}
while (true) {
let host = hosts[Math.floor(Math.random() * hosts.length)];
if (`${host.ip}:${host.port}` === excludeHost && hosts.length > 1) {
continue;
}
return host;
}
});
}
static onConfigRefresh(cfg, ev) {
return __awaiter(this, void 0, void 0, function* () {
if (ev.updatedConfigs['spring.cloud.config.uri']) {
yield Application.initialWithConfig(cfg, cfg.configPath || CONFIG_FILE);
}
if (ev.updatedConfigs.spring &&
ev.updatedConfigs.spring.cloud &&
ev.updatedConfigs.spring.cloud.nacos) {
yield Application.initialWithNacos();
}
if (ev.updatedConfigs.ribbon || (ev.updatedConfigs.bp && ev.updatedConfigs.bp.feignLoggingLevel)) {
yield Application.initialWithFeignClient(cfg);
}
if (ev.updatedConfigs.bp && ev.updatedConfigs.bp.restControllerLoggingLevel) {
yield Application.initialWithRouters();
}
});
}
}
exports.Application = Application;
Application.getConfig = config_1.getCloudConfig;
Application.readYamlConfig = config_1.readYamlConfigToObjectMap;
//# sourceMappingURL=Application.js.map