UNPKG

yog-ral

Version:

node-ral with mcpack and nshead

101 lines (90 loc) 3.09 kB
/* * fis * http://fis.baidu.com/ * 2014/8/20 */ 'use strict'; var ConfigNormalizer = require('node-ral').ConfigNormalizer; var util = require('util'); var logger = require('node-ral').Logger('WebfootNormalizer'); var bns; var webfootCache = {}; function lazyFetchFromWebfootCache(bnsName) { bns = bns || require('@baidu/bns'); // 初期调用时使用同步获取服务器配置 if (bns.get_service_conf_async && webfootCache[bnsName]) { bns.get_service_conf_async(bnsName).then(ret => { logger.trace('cache updated by get_service_conf_async ' + bnsName); webfootCache[bnsName] = ret; }).catch(err => { logger.warning("BNS " + bnsName + " aysnc update failed: " + err); }); return webfootCache[bnsName]; } var ret = bns.get_service_conf(bnsName); if (ret.error === -1) { throw new Error('bns fetch failed bns=' + bnsName); } webfootCache[bnsName] = ret; return webfootCache[bnsName]; } function WebfootNormalizer() { ConfigNormalizer.call(this); } util.inherits(WebfootNormalizer, ConfigNormalizer); WebfootNormalizer.prototype.normalizeConfig = function (config) { if (!config.webfoot) { return config; } var bnsConf = lazyFetchFromWebfootCache(config.webfoot); if (!bnsConf) { throw new Error('webfoot ' + config.webfoot + ' load failed'); } bnsConf = JSON.parse(bnsConf); if (bnsConf.error) { throw new Error('webfoot ' + config.webfoot + ' load failed, error:' + bnsConf.error); } var conf = this._translate(config.webfoot, bnsConf); var keys = Object.keys(config); for (var i = 0; i < keys.length; i++) { if (config[keys[i]] !== null) { conf[keys[i]] = config[keys[i]]; } } logger.trace(config.webfoot + ' webfoot config is updated'); return conf; }; WebfootNormalizer.prototype.getName = function () { return 'webfoot'; }; WebfootNormalizer.prototype.needUpdate = function (config) { if (config.webfoot) { return true; } }; WebfootNormalizer.prototype._translate = function (webfootName, bnsConfig) { var service = bnsConfig.services[webfootName]; if (!service) { throw new Error('invalid webfoot info, webfoot: ' + webfootName); } var unpack = service.converter.name; //webfoot兼容,只有mcpack2与json数据打包协议使用本协议进行解包,其余协议均使用string解包 if (['protobuf', 'msgpack', 'mcpack2', 'json'].indexOf(unpack) === -1) { unpack = 'string'; } var conf = { unpack: unpack, pack: service.converter.name, balance: 'random', protocol: service.protocol.name, retry: parseInt(service.service_retry, 10) || 0, timeout: service.service_ctimeout + service.service_rtimeout + service.service_wtimeout, headers: service.Headers || {}, server: [{ bns: webfootName }], idc_map: service.idc_map }; return conf; }; module.exports = WebfootNormalizer;