const clsHooked = require('cls-hooked'); var NAMESPACE = ''; const {v4: uuid} = require('uuid'); module.exports = { init(ns) { return clsHooked.createNamespace(NAMESPACE = ns); }, getRequestId() { if(!NAMESPACE) throw new Error('Namespace has not been inited'); return clsHooked.getNamespace(NAMESPACE)?.get('requestId'); }, getMetadata() { if(!NAMESPACE) throw new Error('Namespace has not been inited'); return clsHooked.getNamespace(NAMESPACE)?.get('metadata'); }, assignRequestId(namespace, func, extraMetadata, incomingRequestId = uuid()) { namespace.bind(async () => { namespace.set('requestId', incomingRequestId); if(extraMetadata) { namespace.set('metadata', extraMetadata) } await func(); })(); }, attachContext(contextNamespace) { return (req, res, next) => { const ns = this.init(contextNamespace); this.assignRequestId(ns, next, null, req.headers['x-requestid']); } }, }