hemera.js 3.8 KB
"use strict";
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.act = exports.add = exports.init = void 0;
const fs = require("fs");
const _ = require("lodash");
const nats_1 = require("nats");
const path = require("path");
const Hemera = require('nats-hemera');
let hemera;
let logger;
function init(cfg, callback) {
    logger = cfg.log ? new cfg.log(`${cfg.name}/hemera`) : console;
    hemera = new Hemera((0, nats_1.connect)(cfg.nats), Object.assign({}, cfg.hemera));
    logger.info('msbase hemera log init success');
    try {
        const HemeraZipkin = require('hemera-zipkin');
        hemera.use(HemeraZipkin, {
            host: process.env.ZIPKIN_URL,
            port: process.env.ZIPKIN_PORT,
            sampling: 1
        });
    }
    catch (e) {
        logger.info('zipkin未配置: ');
    }
    hemera.ready(() => __awaiter(this, void 0, void 0, function* () {
        logger.log('hemera initialized');
        callback(() => {
            try {
                _.forEach(cfg.apipath ? cfg.apipath : ['./build/services/'], requirefile);
            }
            catch (error) {
                logger.log(error.message);
            }
            logger.log('api initialized');
        });
    }));
    return hemera;
}
exports.init = init;
function requirefile(dir) {
    fs.readdirSync(dir).forEach((file) => {
        try {
            console.info(`初始化微服务,扫描文件 ${path.resolve(dir + file)}`);
            if (file.substr(-3) === '.js' && require(path.resolve(dir + file)))
                return;
            if (file.indexOf('.') === -1)
                requirefile(`${dir}${file}/`);
        }
        catch (e) {
            console.info(`微服务初始化异常 ${dir} ${file}`, e);
        }
    });
}
function add(args, callback) {
    if (hemera) {
        hemera.add(args, (req) => __awaiter(this, void 0, void 0, function* () { return callback(req).catch(e => { return { error: e.message }; }); }));
        // hemera.add(args, async (req, cb) => {
        //     const ret = await callback(req);
        //     cb(null, ret);
        // });
    }
}
exports.add = add;
function act(args, isThrowError = false) {
    return __awaiter(this, void 0, void 0, function* () {
        const starttime = Date.now();
        let localfn = hemera.router.lookup(args);
        if (localfn)
            localfn = localfn.action;
        if (!args.context)
            args.context = {};
        let ret = yield (localfn ?
            localfn(args)
            : hemera.act(args)).catch((error) => ({ error: error.message, code: 1001 }));
        if (ret && ret.context)
            ret = ret.data;
        if (ret && ret.error)
            logger.error(ret.error);
        if (isThrowError && ret && ret.error)
            throw new Error(ret.error);
        const total = Date.now() - starttime;
        if (total > 200) {
            // logger.log(`${JSON.stringify(args)} 调用时间耗时:${total}毫秒 ${JSON.stringify(ret)}`);
            logger.log(`${JSON.stringify(args)} 调用时间耗时:${total}毫秒 `);
        }
        return ret;
    });
}
exports.act = act;
//# sourceMappingURL=hemera.js.map