bpframework
Version:
Web framework like java springboot and springcloud
253 lines • 10.8 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._FeignClientDo = exports.FeignClient = exports.getFeignClientDefaultCfg = exports.setFeignClientDefaultCfg = exports._FeignClientMetadataKey = void 0;
require("reflect-metadata");
const febs = require("febs");
const logger_1 = require("../../logger");
const loggerRest_1 = require("../../loggerRest");
const urlUtils_1 = require("../../utils/urlUtils");
const objectUtils_1 = require("../../utils/objectUtils");
const paramUtils_1 = require("../../utils/paramUtils");
const utils_1 = require("../../utils");
const FeignClientConfigure_1 = require("../../decorators/configure/FeignClientConfigure");
var qs = require('../../utils/qs/dist');
const DefaultFeignClientCfg = Symbol('DefaultFeignClientCfg');
exports._FeignClientMetadataKey = Symbol('_FeignClientMetadataKey');
function setFeignClientDefaultCfg(cfg) {
if (cfg.hasOwnProperty('logLevel')) {
(0, loggerRest_1.setFeignLoggerLevel)(cfg.logLevel);
}
let c = global[DefaultFeignClientCfg];
if (!c) {
c = {};
global[DefaultFeignClientCfg] = c;
}
if (cfg.hasOwnProperty('fetch')) {
c.fetch = cfg.fetch;
}
if (cfg.hasOwnProperty('maxAutoRetriesNextServer')) {
c.maxAutoRetriesNextServer = cfg.maxAutoRetriesNextServer;
}
if (cfg.hasOwnProperty('maxAutoRetries')) {
c.maxAutoRetries = cfg.maxAutoRetries;
}
if (cfg.hasOwnProperty('findServiceCallback')) {
c.findServiceCallback = cfg.findServiceCallback;
}
if (cfg.hasOwnProperty('filterMessageCallback')) {
c.filterMessageCallback = cfg.filterMessageCallback;
}
if (cfg.hasOwnProperty('mode')) {
c.mode = cfg.mode;
}
if (cfg.hasOwnProperty('headers')) {
c.headers = febs.utils.mergeMap(cfg.headers);
}
if (cfg.hasOwnProperty('timeout')) {
c.timeout = cfg.timeout;
}
if (cfg.hasOwnProperty('credentials')) {
c.credentials = cfg.credentials;
}
}
exports.setFeignClientDefaultCfg = setFeignClientDefaultCfg;
function getFeignClientDefaultCfg() {
let cfg = global[DefaultFeignClientCfg];
cfg = cfg || {};
cfg.fetch = cfg.fetch || febs.net.fetch;
cfg.maxAutoRetriesNextServer = cfg.maxAutoRetriesNextServer || 3;
cfg.maxAutoRetries = cfg.maxAutoRetries || 2;
cfg.timeout = cfg.timeout || 20000;
return cfg;
}
exports.getFeignClientDefaultCfg = getFeignClientDefaultCfg;
function FeignClient(cfg) {
if (febs.string.isEmpty(cfg.name)) {
throw new Error("@FeignClient need 'name' parameter");
}
cfg.path = cfg.path || '';
return (target) => {
Reflect.defineMetadata(exports._FeignClientMetadataKey, {
name: cfg.name,
url: cfg.url,
path: cfg.path,
}, target);
};
}
exports.FeignClient = FeignClient;
function _FeignClientDo(target, requestMapping, feignData, restObject, castType, args, fallback) {
return __awaiter(this, void 0, void 0, function* () {
if (requestMapping.qs.length > 1) {
throw new Error("@RequestMapping in FeignClient class, 'path' must container only one url");
}
let meta = Reflect.getOwnMetadata(exports._FeignClientMetadataKey, target.constructor);
let url = urlUtils_1.default.join(meta.path, requestMapping.qs[0]);
let feignClientCfg = getFeignClientDefaultCfg();
if (typeof feignClientCfg.findServiceCallback !== 'function') {
throw new Error(`feignClient 'findServiceCallback' must be a function`);
}
let excludeHost = null;
let request;
let response;
let responseMsg;
let lastError;
let cfgurl = (0, paramUtils_1.getLazyParameterValue)(meta.url);
for (let i = 0; i < feignClientCfg.maxAutoRetriesNextServer; i++) {
let uri;
let uriPathname = url;
if (!febs.string.isEmpty(cfgurl) && __debugFeignClient) {
uri = urlUtils_1.default.join(cfgurl, url);
}
else {
let host;
try {
host = yield feignClientCfg.findServiceCallback(meta.name, excludeHost);
if (!host) {
continue;
}
}
catch (e) {
lastError = e;
(0, logger_1.getLogger)().error((0, utils_1.getErrorMessage)(e));
continue;
}
excludeHost = `${host.ip}:${host.port}`;
uri = urlUtils_1.default.join(excludeHost, url);
if (host.port == 443) {
if (uri[0] == '/')
uri = 'https:/' + uri;
else
uri = 'https://' + uri;
}
else {
if (uri[0] == '/')
uri = 'http:/' + uri;
else
uri = 'http://' + uri;
}
}
request = {
method: requestMapping.method.toString(),
mode: requestMapping.mode,
headers: febs.utils.mergeMap(feignClientCfg.headers, requestMapping.headers, feignData ? feignData.headers : null),
timeout: requestMapping.timeout,
credentials: requestMapping.credentials,
body: requestMapping.body,
url: uri,
};
let c = yield (0, FeignClientConfigure_1._callFeignClient)();
if (c && c.filterRequestCallback) {
c.filterRequestCallback(request, feignData);
}
for (let j = 0; j < feignClientCfg.maxAutoRetries; j++) {
let status;
let r;
let interval = Date.now();
try {
response = null;
responseMsg = null;
lastError = null;
let ret = yield feignClientCfg.fetch(uri, request);
response = ret;
status = ret.status;
interval = Date.now() - interval;
let contentType = ret.headers.get('content-type');
if (Array.isArray(contentType)) {
contentType = contentType[0];
}
contentType = contentType ? contentType.toLowerCase() : 'application/json';
if (febs.string.isEmpty(contentType) || contentType.indexOf('application/x-www-form-urlencoded') >= 0) {
let txt = yield ret.text();
(0, loggerRest_1.logFeignClient)(request, febs.utils.mergeMap(response, { body: txt }), interval);
r = qs.parse(txt);
}
else if (contentType.indexOf('application/json') >= 0) {
r = yield ret.json();
(0, loggerRest_1.logFeignClient)(request, febs.utils.mergeMap(response, { body: r }), interval);
}
else {
r = yield ret.blob();
(0, loggerRest_1.logFeignClient)(request, febs.utils.mergeMap(response, { body: r }), interval);
}
responseMsg = r;
}
catch (e) {
(0, loggerRest_1.logFeignClient)(request, { err: e }, 0);
lastError = e;
(0, logger_1.getLogger)().error((0, utils_1.getErrorMessage)(e));
continue;
}
try {
if (status && (status < 200 || status >= 300)) {
throw new Error("HttpStatusCode is " + status);
}
if (!r) {
return r;
}
else if (!castType) {
if (feignClientCfg.filterMessageCallback) {
let rr = {};
feignClientCfg.filterMessageCallback(r, rr, meta.name, uriPathname);
return rr;
}
else {
return r;
}
}
else {
let o = new castType();
if (feignClientCfg.filterMessageCallback) {
feignClientCfg.filterMessageCallback(r, o, meta.name, uriPathname);
return o;
}
else {
let datar = objectUtils_1.default.castType(r, castType, false);
if (datar.e) {
throw datar.e;
}
o = datar.data;
}
return o;
}
}
catch (e) {
if (restObject) {
if (args.length <= restObject.parameterIndex) {
args.length = restObject.parameterIndex + 1;
}
args[restObject.parameterIndex] = {
request,
response,
responseMsg: responseMsg,
error: e,
};
}
return yield fallback();
}
}
}
if (restObject) {
if (args.length <= restObject.parameterIndex) {
args.length = restObject.parameterIndex + 1;
}
args[restObject.parameterIndex] = {
request,
response,
responseMsg: responseMsg,
error: lastError,
};
}
return yield fallback();
});
}
exports._FeignClientDo = _FeignClientDo;
//# sourceMappingURL=FeignClient.js.map