UNPKG

tom-microservice

Version:

Tom creates customers, subscriptions plans & send notifications.

52 lines (39 loc) 1.26 kB
'use strict' const { omit, isEmpty, split, first, reduce } = require('lodash') const { randomUUID } = require('crypto') const pRetry = require('p-retry') const timeSpan = require('@kikobeats/time-span')({ format: require('@lukeed/ms').format }) const printError = require('../log/print-error') const createLog = require('../log/create-log') const toObject = arr => reduce(arr, (acc, obj) => ({ ...acc, ...obj }), {}) const eventNamespace = eventName => first(split(eventName, ':')) module.exports = ({ eventName, fn, tom }) => { const log = createLog({ keyword: eventName }) return async opts => { try { const run = () => fn(opts) let time = timeSpan() const data = await pRetry(run, { retries: 2 }) const meta = await Promise.all([ tom.emit('*', data), tom.emit(eventNamespace(eventName), data), tom.emit(eventName, data) ]) time = time() const output = reduce( meta, (acc, obj) => ({ ...acc, ...toObject(obj) }), data ) if (!isEmpty(output)) { log.debug({ id: randomUUID(), ...omit(output, ['headers']), time }) } return output } catch (error) { printError({ log, error }) throw error } } }