@vizydrop/correlation-id
Version:
Vizydrop correlation id helper based on async hooks
55 lines (44 loc) • 1.55 kB
JavaScript
/*********************************************************************
* © Copyright IBM Corp. 2025
*********************************************************************/
const cls = require('cls-hooked');
const uuid = require('uuid');
function validateOptions(opts = {}) {
if (opts.generateDefaultId && typeof opts.generateDefaultId !== 'function') {
throw new Error('generateDefaultId must be a function');
}
if (opts.namespaceName && typeof opts.namespaceName !== 'string') {
throw new Error('namespaceName must be a string');
}
}
module.exports = function correlator(opts = {}) {
validateOptions(opts);
const store = cls.createNamespace(opts.namespaceName || 'correlation-id-namespace');
function generateDefaultId() {
return opts.generateDefaultId ? opts.generateDefaultId() : uuid.v4();
}
const CORRELATION_ID_KEY = 'correlation-id';
function withId(id, fn) {
store.run(() => {
store.set(CORRELATION_ID_KEY, id || generateDefaultId());
fn();
});
}
function getId() {
return store.get(CORRELATION_ID_KEY);
}
function withIdAndReturn(id, fn) {
return store.runAndReturn(() => {
store.set(CORRELATION_ID_KEY, id || generateDefaultId());
return fn();
});
}
return {
withIdAndReturn,
withId,
getId,
bindEmitter: store.bindEmitter.bind(store),
bind: store.bind.bind(store),
generateId: generateDefaultId,
};
};