@riddance/host
Version:
83 lines • 14.6 kB
JavaScript
import { makeLogger } from './logging.js';
class LogMulticaster {
#transports;
publishRate;
constructor(transports) {
this.#transports = transports;
this.publishRate = transports.map(t => t.publishRate).sort()[0] ?? Number.MAX_SAFE_INTEGER;
}
sendEntries(entries, signal) {
const promises = this.#transports.map(t => t.sendEntries(entries, signal)).filter(p => !!p);
if (promises.length === 0) {
return;
}
return Promise.all(promises);
}
}
export function createContext(clientInfo, loggers, eventTransport, timeouts, outerController, config, meta, environment, now) {
const timeout = (timeouts.cap
? Math.min(config?.timeout ?? timeouts.default, timeouts.cap)
: (config?.timeout ?? timeouts.default)) * 1000;
const innerController = new AbortController();
const logTransport = (loggers.length === 1 ? loggers[0] : undefined) ?? new LogMulticaster(loggers);
const logger = makeLogger(logTransport, config?.minimumLogLevel, outerController.signal).enrichReserved({
operationId: clientInfo.operationId,
client: {
id: clientInfo.clientId,
ip: clientInfo.clientIp,
port: clientInfo.clientPort,
userAgent: clientInfo.userAgent,
},
});
globalLogger = logger;
const successHandlers = [];
const ctx = {
env: (environment ?? process.env),
signal: innerController.signal,
now: now ?? (() => new Date()),
operationId: clientInfo.operationId,
client: {
id: clientInfo.clientId,
ip: clientInfo.clientIp,
port: clientInfo.clientPort,
userAgent: clientInfo.userAgent,
},
meta: meta
? {
packageName: meta.packageName,
fileName: meta.fileName,
revision: meta.revision,
}
: undefined,
emit: (topic, type, subject, data, messageId) => eventTransport.sendEvent(topic, type, subject, data, messageId, outerController.signal),
onSuccess: (fn) => successHandlers.push(fn),
};
const timeoutHandle = setTimeout(() => {
logger.error('Timeout.', undefined, undefined);
innerController.abort();
// eslint-disable-next-line no-void
void logger.flush();
}, timeout);
const flushHandle = setTimeout(() => {
logger.error('Aborting flush.', undefined, undefined);
outerController.abort();
}, timeout + 15_000);
return {
log: logger,
context: ctx,
success: () => Promise.all(successHandlers.map(fn => fn()).filter(r => !!r)),
flush: async () => {
clearTimeout(timeoutHandle);
await logger.flush();
clearTimeout(flushHandle);
},
};
}
let globalLogger;
process.on('uncaughtException', err => {
globalLogger?.fatal('Uncaught exception.', err, undefined);
});
process.on('unhandledRejection', reason => {
globalLogger?.fatal('Unhandled rejection.', reason, undefined);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQXFDekMsTUFBTSxjQUFjO0lBQ1AsV0FBVyxDQUFnQjtJQUMzQixXQUFXLENBQVE7SUFFNUIsWUFBWSxVQUEwQjtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQTtRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFBO0lBQzlGLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBbUIsRUFBRSxNQUFtQjtRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNGLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFNO1FBQ1YsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQTZCLENBQUE7SUFDNUQsQ0FBQztDQUNKO0FBT0QsTUFBTSxVQUFVLGFBQWEsQ0FDekIsVUFBc0IsRUFDdEIsT0FBdUIsRUFDdkIsY0FBOEIsRUFDOUIsUUFBMkMsRUFDM0MsZUFBZ0MsRUFDaEMsTUFBMEIsRUFDMUIsSUFBZSxFQUNmLFdBQWtDLEVBQ2xDLEdBQWdCO0lBT2hCLE1BQU0sT0FBTyxHQUNULENBQUMsUUFBUSxDQUFDLEdBQUc7UUFD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QUUsQ0FBQTtJQUMzQixDQUFDLEVBQUUsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFBO0lBQ3BCLE9BQU87UUFDSCxHQUFHLEVBQUUsTUFBTTtRQUNYLE9BQU8sRUFBRSxHQUFHO1FBQ1osT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRTtZQUNkLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUMzQixNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUNwQixZQUFZLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDN0IsQ0FBQztLQUNKLENBQUE7QUFDTCxDQUFDO0FBRUQsSUFBSSxZQUFnQyxDQUFBO0FBRXBDLE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDbEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDOUQsQ0FBQyxDQUFDLENBQUE7QUFDRixPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxFQUFFO0lBQ3RDLFlBQVksRUFBRSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0FBQ2xFLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udGV4dCwgRW52aXJvbm1lbnQsIEpzb24sIExvZ2dlciwgdHlwZSBKc29uU2FmZU9iamVjdCB9IGZyb20gJy4uL2NvbnRleHQuanMnXG5pbXBvcnQgeyBtYWtlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnaW5nLmpzJ1xuaW1wb3J0IHR5cGUgeyBGdWxsQ29uZmlndXJhdGlvbiwgTWV0YWRhdGEgfSBmcm9tICcuL21ldGEuanMnXG5cbmV4cG9ydCB0eXBlIENsaWVudEluZm8gPSB7XG4gICAgcmVhZG9ubHkgb3BlcmF0aW9uSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBjbGllbnRJZD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IGNsaWVudElwPzogc3RyaW5nXG4gICAgcmVhZG9ubHkgY2xpZW50UG9ydD86IG51bWJlclxuICAgIHJlYWRvbmx5IHVzZXJBZ2VudD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBFdmVudFRyYW5zcG9ydCA9IHtcbiAgICBzZW5kRXZlbnQoXG4gICAgICAgIHRvcGljOiBzdHJpbmcsXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgc3ViamVjdDogc3RyaW5nLFxuICAgICAgICBkYXRhOiBKc29uU2FmZU9iamVjdCB8IHVuZGVmaW5lZCxcbiAgICAgICAgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICAgKTogUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICd0cmFjZScgfCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdmYXRhbCdcblxuZXhwb3J0IHR5cGUgTG9nRW50cnkgPSB7XG4gICAgcmVhZG9ubHkgbGV2ZWw6IExvZ0xldmVsXG4gICAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXJcbiAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcbiAgICByZWFkb25seSBlcnJvcjogdW5rbm93blxuICAgIHJlYWRvbmx5IGpzb246IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBMb2dUcmFuc3BvcnQgPSB7XG4gICAgcmVhZG9ubHkgcHVibGlzaFJhdGU/OiBudW1iZXJcbiAgICBzZW5kRW50cmllcyhlbnRyaWVzOiBMb2dFbnRyeVtdLCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZCB8IHZvaWRcbn1cblxuY2xhc3MgTG9nTXVsdGljYXN0ZXIgaW1wbGVtZW50cyBMb2dUcmFuc3BvcnQge1xuICAgIHJlYWRvbmx5ICN0cmFuc3BvcnRzOiBMb2dUcmFuc3BvcnRbXVxuICAgIHJlYWRvbmx5IHB1Ymxpc2hSYXRlOiBudW1iZXJcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zcG9ydHM6IExvZ1RyYW5zcG9ydFtdKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydHMgPSB0cmFuc3BvcnRzXG4gICAgICAgIHRoaXMucHVibGlzaFJhdGUgPSB0cmFuc3BvcnRzLm1hcCh0ID0+IHQucHVibGlzaFJhdGUpLnNvcnQoKVswXSA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgIH1cblxuICAgIHNlbmRFbnRyaWVzKGVudHJpZXM6IExvZ0VudHJ5W10sIHNpZ25hbDogQWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLiN0cmFuc3BvcnRzLm1hcCh0ID0+IHQuc2VuZEVudHJpZXMoZW50cmllcywgc2lnbmFsKSkuZmlsdGVyKHAgPT4gISFwKVxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpIGFzIHVua25vd24gYXMgUHJvbWlzZTx2b2lkPlxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgUm9vdExvZ2dlciA9IHtcbiAgICBlbnJpY2hSZXNlcnZlZChmaWVsZHM6IG9iamVjdCk6IFJvb3RMb2dnZXJcbiAgICBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+XG59ICYgTG9nZ2VyXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0KFxuICAgIGNsaWVudEluZm86IENsaWVudEluZm8sXG4gICAgbG9nZ2VyczogTG9nVHJhbnNwb3J0W10sXG4gICAgZXZlbnRUcmFuc3BvcnQ6IEV2ZW50VHJhbnNwb3J0LFxuICAgIHRpbWVvdXRzOiB7IGRlZmF1bHQ6IG51bWJlcjsgY2FwPzogbnVtYmVyIH0sXG4gICAgb3V0ZXJDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4gICAgY29uZmlnPzogRnVsbENvbmZpZ3VyYXRpb24sXG4gICAgbWV0YT86IE1ldGFkYXRhLFxuICAgIGVudmlyb25tZW50PzogUGFydGlhbDxFbnZpcm9ubWVudD4sXG4gICAgbm93PzogKCkgPT4gRGF0ZSxcbik6IHtcbiAgICBsb2c6IFJvb3RMb2dnZXJcbiAgICBjb250ZXh0OiBPbWl0PENvbnRleHQsICdsb2cnPlxuICAgIHN1Y2Nlc3M6ICgpID0+IFByb21pc2U8dW5rbm93bj5cbiAgICBmbHVzaDogKCkgPT4gUHJvbWlzZTx2b2lkPlxufSB7XG4gICAgY29uc3QgdGltZW91dCA9XG4gICAgICAgICh0aW1lb3V0cy5jYXBcbiAgICAgICAgICAgID8gTWF0aC5taW4oY29uZmlnPy50aW1lb3V0ID8/IHRpbWVvdXRzLmRlZmF1bHQsIHRpbWVvdXRzLmNhcClcbiAgICAgICAgICAgIDogKGNvbmZpZz8udGltZW91dCA/PyB0aW1lb3V0cy5kZWZhdWx0KSkgKiAxMDAwXG4gICAgY29uc3QgaW5uZXJDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG5cbiAgICBjb25zdCBsb2dUcmFuc3BvcnQgPVxuICAgICAgICAobG9nZ2Vycy5sZW5ndGggPT09IDEgPyBsb2dnZXJzWzBdIDogdW5kZWZpbmVkKSA/PyBuZXcgTG9nTXVsdGljYXN0ZXIobG9nZ2VycylcbiAgICBjb25zdCBsb2dnZXIgPSBtYWtlTG9nZ2VyKFxuICAgICAgICBsb2dUcmFuc3BvcnQsXG4gICAgICAgIGNvbmZpZz8ubWluaW11bUxvZ0xldmVsLFxuICAgICAgICBvdXRlckNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICkuZW5yaWNoUmVzZXJ2ZWQoe1xuICAgICAgICBvcGVyYXRpb25JZDogY2xpZW50SW5mby5vcGVyYXRpb25JZCxcbiAgICAgICAgY2xpZW50OiB7XG4gICAgICAgICAgICBpZDogY2xpZW50SW5mby5jbGllbnRJZCxcbiAgICAgICAgICAgIGlwOiBjbGllbnRJbmZvLmNsaWVudElwLFxuICAgICAgICAgICAgcG9ydDogY2xpZW50SW5mby5jbGllbnRQb3J0LFxuICAgICAgICAgICAgdXNlckFnZW50OiBjbGllbnRJbmZvLnVzZXJBZ2VudCxcbiAgICAgICAgfSxcbiAgICB9KVxuICAgIGdsb2JhbExvZ2dlciA9IGxvZ2dlclxuICAgIGNvbnN0IHN1Y2Nlc3NIYW5kbGVyczogKCgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKVtdID0gW11cbiAgICBjb25zdCBjdHggPSB7XG4gICAgICAgIGVudjogKGVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52KSBhcyBFbnZpcm9ubWVudCxcbiAgICAgICAgc2lnbmFsOiBpbm5lckNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBub3c6IG5vdyA/PyAoKCkgPT4gbmV3IERhdGUoKSksXG4gICAgICAgIG9wZXJhdGlvbklkOiBjbGllbnRJbmZvLm9wZXJhdGlvbklkLFxuICAgICAgICBjbGllbnQ6IHtcbiAgICAgICAgICAgIGlkOiBjbGllbnRJbmZvLmNsaWVudElkLFxuICAgICAgICAgICAgaXA6IGNsaWVudEluZm8uY2xpZW50SXAsXG4gICAgICAgICAgICBwb3J0OiBjbGllbnRJbmZvLmNsaWVudFBvcnQsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6IGNsaWVudEluZm8udXNlckFnZW50LFxuICAgICAgICB9LFxuICAgICAgICBtZXRhOiBtZXRhXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lOiBtZXRhLnBhY2thZ2VOYW1lLFxuICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IG1ldGEuZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICByZXZpc2lvbjogbWV0YS5yZXZpc2lvbixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVtaXQ6IChcbiAgICAgICAgICAgIHRvcGljOiBzdHJpbmcsXG4gICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICBzdWJqZWN0OiBzdHJpbmcsXG4gICAgICAgICAgICBkYXRhPzoge1xuICAgICAgICAgICAgICAgIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IEpzb25cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlSWQ/OiBzdHJpbmcsXG4gICAgICAgICkgPT5cbiAgICAgICAgICAgIGV2ZW50VHJhbnNwb3J0LnNlbmRFdmVudCh0b3BpYywgdHlwZSwgc3ViamVjdCwgZGF0YSwgbWVzc2FnZUlkLCBvdXRlckNvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgb25TdWNjZXNzOiAoZm46ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKSA9PiBzdWNjZXNzSGFuZGxlcnMucHVzaChmbiksXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdUaW1lb3V0LicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKVxuICAgICAgICBpbm5lckNvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZFxuICAgICAgICB2b2lkIGxvZ2dlci5mbHVzaCgpXG4gICAgfSwgdGltZW91dClcbiAgICBjb25zdCBmbHVzaEhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0Fib3J0aW5nIGZsdXNoLicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKVxuICAgICAgICBvdXRlckNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIH0sIHRpbWVvdXQgKyAxNV8wMDApXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9nOiBsb2dnZXIsXG4gICAgICAgIGNvbnRleHQ6IGN0eCxcbiAgICAgICAgc3VjY2VzczogKCkgPT4gUHJvbWlzZS5hbGwoc3VjY2Vzc0hhbmRsZXJzLm1hcChmbiA9PiBmbigpKS5maWx0ZXIociA9PiAhIXIpKSxcbiAgICAgICAgZmx1c2g6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKVxuICAgICAgICAgICAgYXdhaXQgbG9nZ2VyLmZsdXNoKClcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChmbHVzaEhhbmRsZSlcbiAgICAgICAgfSxcbiAgICB9XG59XG5cbmxldCBnbG9iYWxMb2dnZXI6IExvZ2dlciB8IHVuZGVmaW5lZFxuXG5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGVyciA9PiB7XG4gICAgZ2xvYmFsTG9nZ2VyPy5mYXRhbCgnVW5jYXVnaHQgZXhjZXB0aW9uLicsIGVyciwgdW5kZWZpbmVkKVxufSlcbnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIHJlYXNvbiA9PiB7XG4gICAgZ2xvYmFsTG9nZ2VyPy5mYXRhbCgnVW5oYW5kbGVkIHJlamVjdGlvbi4nLCByZWFzb24sIHVuZGVmaW5lZClcbn0pXG4iXX0=