hemera.ts 1.7 KB
import * as fs from 'fs';
import _ = require('lodash');
import { connect } from 'nats';
import * as path from 'path';
const Hemera = require('nats-hemera');

let hemera;
let logger;

export function init(cfg: any) {
    logger = console

    hemera = new Hemera(connect(cfg.nats), {
        ...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(async () => {
        logger.log('hemera initialized');
    });
    return hemera;
}

interface Pattern {
    pubsub$?: boolean
    timeout$?: number
    maxMessages$?: number
    expectedMessages$?: number
    [key: string]: any
}


export async function act(args: Pattern, isThrowError = false) {
    const starttime = Date.now();

    let localfn = hemera.router.lookup(args);
    if (localfn) localfn = localfn.action;
    if (!args.context) args.context = {};

    let ret = await (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;
}