UNPKG

sdg-rpc

Version:

pomelo ts rpc

171 lines 11.8 kB
"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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