sdg-rpc
Version:
pomelo ts rpc
171 lines • 11.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const lodash_1 = tslib_1.__importDefault(require("lodash"));
const sdg_loader_1 = require("sdg-loader");
const mailStation_1 = tslib_1.__importDefault(require("./mailStation"));
const proxy_1 = require("../util/proxy");
const constants_1 = tslib_1.__importDefault(require("../util/constants"));
const router_1 = tslib_1.__importDefault(require("./router"));
const { STATE_STARTED } = constants_1.default.STATE;
class RpcClient {
constructor(opts) {
this.context = opts.context;
this.routeContext = opts.context;
this.opts = opts;
this.station = this.createStation();
this.proxies = {
sys: {},
user: {}
};
this.routerType = opts.routerType;
// 先默认简单的路由规则
this.router = opts.router || router_1.default.df;
}
start() {
this.state = STATE_STARTED;
this.station.start();
}
/**
* 推送消息到管理器
* @param serverId
* @param msg
*/
rpcInvoke(serverId, msg) {
return new Promise((resolve, reject) => {
this.station.dispatch(serverId, msg, (err, res) => err ? reject(err) : resolve(res));
});
}
/**
* 新server上线时,对应生成代理
* @param servers
*/
addServers(servers) {
this.station.addServers(servers);
}
removeServers(ids) {
this.station.removeServers(ids);
}
replaceServers(servers) {
this.station.replaceServers(servers);
}
/**
* 加载对应的代理对象
* @param record
*/
addProxy(record) {
const proxy = this.generateProxy(record);
if (lodash_1.default.isEmpty(proxy))
return;
this.insertProxy(record.namespace, record.serverType, proxy);
}
addProxies(records) {
records.map(r => this.addProxy(r));
}
insertProxy(namespace, serverType, proxy) {
this.proxies[namespace] = this.proxies[namespace] || {};
if (this.proxies[namespace][serverType]) {
for (const attr in proxy) {
this.proxies[namespace][serverType][attr] = proxy[attr];
}
}
else {
this.proxies[namespace][serverType] = proxy;
}
}
/**
* 把record的函数写到缓存中
* @param record
*/
generateProxy(record) {
if (!record)
return {};
const modules = sdg_loader_1.load(record.path, this.context);
const res = {};
if (modules) {
for (const name in modules) {
res[name] = proxy_1.create({
serviceName: name,
origin: modules[name],
attach: record,
proxyCb: this.proxyCb.bind(this)
});
}
}
return res;
}
async proxyCb(serviceName, method, args, attach) {
if (this.state !== STATE_STARTED) {
this.context.logger.error('[rpc] fail to invoke rpc proxy for client is not running');
return;
}
if (args.length < 1) {
this.context.logger.error('[rpc] invalid rpc invoke, arguments length less than 2, namespace: %j, type, %j, serviceName: %j, methodName: %j', attach.namespace, attach.serverType, serviceName, method, args);
return;
}
// 第一个参数,session,或者指定的serverId
const routeParam = args.shift();
// 第一个参数是对象,表示传的session,自动匹配rpc server,否则,指定id的server
const isToSpecifiedServer = typeof routeParam !== 'object';
const serverType = attach.serverType;
const msg = {
namespace: attach.namespace,
serverType,
service: serviceName,
method,
args
};
if (isToSpecifiedServer) {
return this.rpcInvoke(routeParam, msg);
}
else {
const serverId = await this.getRouteFunction(serverType, msg, routeParam);
// const serverId = this.router(routeParam, msg, this.routeContext);
return this.rpcInvoke(serverId, msg);
}
}
/**
* Calculate remote target server id for rpc client.
*/
async getRouteFunction(serverType, msg, routeParam) {
if (this.routerType) {
let method;
switch (this.routerType) {
case constants_1.default.SCHEDULE.ROUNDROBIN:
method = router_1.default.rr;
break;
case constants_1.default.SCHEDULE.WEIGHT_ROUNDROBIN:
method = router_1.default.wrr;
break;
// case constants.SCHEDULE.LEAST_ACTIVE:
// method = router.la;
// break;
// case constants.SCHEDULE.CONSISTENT_HASH:
// method = router.ch;
// break;
default:
method = router_1.default.rd;
break;
}
return method(this, serverType, msg);
}
else {
let route;
if (typeof this.router === 'function') {
route = this.router;
}
else if (typeof this.router.route === 'function') {
route = this.router.route;
}
else {
throw '[sdg-rpc] invalid route function.';
}
return route(routeParam, msg, this.routeContext);
}
}
createStation() {
return new mailStation_1.default(this.opts);
}
}
exports.default = RpcClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNERBQXVCO0FBQ3ZCLDJDQUFrQztBQUVsQyx3RUFBd0M7QUFheEMseUNBQXVDO0FBQ3ZDLDBFQUEwQztBQUMxQyw4REFBOEI7QUFFOUIsTUFBTSxFQUNKLGFBQWEsRUFDZCxHQUFHLG1CQUFTLENBQUMsS0FBSyxDQUFDO0FBRXBCLE1BQXFCLFNBQVM7SUFjNUIsWUFBWSxJQUFvQjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixHQUFHLEVBQUUsRUFBRTtZQUNQLElBQUksRUFBRSxFQUFFO1NBQ1QsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxhQUFhO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLGdCQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVMsQ0FBQyxRQUFnQixFQUFFLEdBQVk7UUFDN0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxR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