@riddance/host
Version:
92 lines • 15.7 kB
JavaScript
import { EventCollector } from './events.js';
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();
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const logTransport = loggers.length === 1 ? loggers[0] : 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 emitter = new EventCollector(eventTransport, logger, clientInfo, timeout, outerController.signal);
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) => {
emitter.emit({ topic, type, subject, id: messageId }, data);
},
eventBarrier: () => emitter.flush(),
onSuccess: (fn) => successHandlers.push(fn),
};
const timeoutHandle = setTimeout(() => {
logger.error('Timeout.', undefined, undefined);
innerController.abort();
// eslint-disable-next-line no-void
void logger.flush();
// eslint-disable-next-line no-void
void emitter.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())),
flush: async () => {
clearTimeout(timeoutHandle);
await emitter.flush();
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBNkN6QyxNQUFNLGNBQWM7SUFDUCxXQUFXLENBQWdCO0lBQzNCLFdBQVcsQ0FBUTtJQUU1QixZQUFZLFVBQTBCO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFBO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUE7SUFDOUYsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFtQixFQUFFLE1BQW1CO1FBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0YsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU07UUFDVixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBNkIsQ0FBQTtJQUM1RCxDQUFDO0NBQ0o7QUFPRCxNQUFNLFVBQVUsYUFBYSxDQUN6QixVQUFzQixFQUN0QixPQUF1QixFQUN2QixjQUE4QixFQUM5QixRQUEyQyxFQUMzQyxlQUFnQyxFQUNoQyxNQUEwQixFQUMxQixJQUFlLEVBQ2YsV0FBeUIsRUFDekIsR0FBZ0I7SUFPaEIsTUFBTSxPQUFPLEdBQ1QsQ0FBQyxRQUFRLENBQUMsR0FBRztRQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFBO0lBQ3ZELE1BQU0sZUFBZSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUE7SUFDN0Msb0VBQW9FO0lBQ3BFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FDckIsWUFBWSxFQUNaLE1BQU0sRUFBRSxlQUFlLEVBQ3ZCLGVBQWUsQ0FBQyxNQUFNLENBQ3pCLENBQUMsY0FBYyxDQUFDO1FBQ2IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO1FBQ25DLE1BQU0sRUFBRTtZQUNKLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUN2QixFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxVQUFVO1lBQzNCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztTQUNsQztLQUNKLENBQUMsQ0FBQTtJQUNGLFlBQVksR0FBRyxNQUFNLENBQUE7SUFDckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQzlCLGNBQWMsRUFDZCxNQUFNLEVBQ04sVUFBVSxFQUNWLE9BQU8sRUFDUCxlQUFlLENBQUMsTUFBTSxDQUN6QixDQUFBO0lBQ0QsTUFBTSxlQUFlLEdBQW1DLEVBQUUsQ0FBQTtJQUMxRCxNQUFNLEdBQUcsR0FBRztRQUNSLEdBQUcsRUFBRSxXQUFXLElBQUssT0FBTyxDQUFDLEdBQW1CO1FBQ2hELE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTTtRQUM5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUM5QixXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7UUFDbkMsTUFBTSxFQUFFO1lBQ0osRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQ3ZCLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUN2QixJQUFJLEVBQUUsVUFBVSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1NBQ2xDO1FBQ0QsSUFBSSxFQUFFLElBQUk7WUFDTixDQUFDLENBQUM7Z0JBQ0ksV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTthQUMxQjtZQUNILENBQUMsQ0FBQyxTQUFTO1FBQ2YsSUFBSSxFQUFFLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxPQUFlLEVBQUUsSUFBVyxFQUFFLFNBQWtCLEVBQUUsRUFBRTtZQUNwRixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQy9ELENBQUM7UUFDRCxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtRQUNuQyxTQUFTLEVBQUUsQ0FBQyxFQUE4QixFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztLQUMxRSxDQUFBO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDOUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3ZCLG1DQUFtQztRQUNuQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNuQixtQ0FBbUM7UUFDbkMsS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDeEIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ1gsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNyRCxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDM0IsQ0FBQyxFQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQTtJQUNwQixPQUFPO1FBQ0gsR0FBRyxFQUFFLE1BQU07UUFDWCxPQUFPLEVBQUUsR0FBRztRQUNaLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNELEtBQUssRUFBRSxLQUFLLElBQUksRUFBRTtZQUNkLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUMzQixNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUNyQixNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUNwQixZQUFZLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDN0IsQ0FBQztLQUNKLENBQUE7QUFDTCxDQUFDO0FBRUQsSUFBSSxZQUFnQyxDQUFBO0FBRXBDLE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDbEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDOUQsQ0FBQyxDQUFDLENBQUE7QUFDRixPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxFQUFFO0lBQ3RDLFlBQVksRUFBRSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0FBQ2xFLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udGV4dCwgRW52aXJvbm1lbnQsIEpzb24sIExvZ2dlciB9IGZyb20gJy4uL2NvbnRleHQuanMnXG5pbXBvcnQgeyBFdmVudENvbGxlY3RvciB9IGZyb20gJy4vZXZlbnRzLmpzJ1xuaW1wb3J0IHsgbWFrZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2luZy5qcydcbmltcG9ydCB7IEZ1bGxDb25maWd1cmF0aW9uLCBNZXRhZGF0YSB9IGZyb20gJy4vcmVnaXN0cnkuanMnXG5cbmV4cG9ydCB0eXBlIENsaWVudEluZm8gPSB7XG4gICAgcmVhZG9ubHkgb3BlcmF0aW9uSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBjbGllbnRJZD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IGNsaWVudElwPzogc3RyaW5nXG4gICAgcmVhZG9ubHkgY2xpZW50UG9ydD86IG51bWJlclxuICAgIHJlYWRvbmx5IHVzZXJBZ2VudD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBFdmVudE1ldGFkYXRhID0ge1xuICAgIHRvcGljOiBzdHJpbmdcbiAgICB0eXBlOiBzdHJpbmdcbiAgICBzdWJqZWN0OiBzdHJpbmdcbiAgICBpZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBCdWZmZXJlZEV2ZW50ID0ge1xuICAgIGV2ZW50VGltZTogRGF0ZVxuICAgIG1ldGE6IE9taXQ8RXZlbnRNZXRhZGF0YSwgJ3RvcGljJz5cbiAgICBpZHM6IENsaWVudEluZm9cbiAgICBqc29uPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEV2ZW50VHJhbnNwb3J0ID0ge1xuICAgIHJlYWRvbmx5IHB1Ymxpc2hSYXRlOiBudW1iZXJcbiAgICBzZW5kRXZlbnRzKHRvcGljOiBzdHJpbmcsIGV2ZW50czogQnVmZmVyZWRFdmVudFtdLCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICd0cmFjZScgfCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdmYXRhbCdcblxuZXhwb3J0IHR5cGUgTG9nRW50cnkgPSB7XG4gICAgcmVhZG9ubHkgbGV2ZWw6IExvZ0xldmVsXG4gICAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXJcbiAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcbiAgICByZWFkb25seSBlcnJvcjogdW5rbm93blxuICAgIHJlYWRvbmx5IGpzb246IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBMb2dUcmFuc3BvcnQgPSB7XG4gICAgcmVhZG9ubHkgcHVibGlzaFJhdGU/OiBudW1iZXJcbiAgICBzZW5kRW50cmllcyhlbnRyaWVzOiBMb2dFbnRyeVtdLCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZFxufVxuXG5jbGFzcyBMb2dNdWx0aWNhc3RlciBpbXBsZW1lbnRzIExvZ1RyYW5zcG9ydCB7XG4gICAgcmVhZG9ubHkgI3RyYW5zcG9ydHM6IExvZ1RyYW5zcG9ydFtdXG4gICAgcmVhZG9ubHkgcHVibGlzaFJhdGU6IG51bWJlclxuXG4gICAgY29uc3RydWN0b3IodHJhbnNwb3J0czogTG9nVHJhbnNwb3J0W10pIHtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0cyA9IHRyYW5zcG9ydHNcbiAgICAgICAgdGhpcy5wdWJsaXNoUmF0ZSA9IHRyYW5zcG9ydHMubWFwKHQgPT4gdC5wdWJsaXNoUmF0ZSkuc29ydCgpWzBdID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gICAgfVxuXG4gICAgc2VuZEVudHJpZXMoZW50cmllczogTG9nRW50cnlbXSwgc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMuI3RyYW5zcG9ydHMubWFwKHQgPT4gdC5zZW5kRW50cmllcyhlbnRyaWVzLCBzaWduYWwpKS5maWx0ZXIocCA9PiAhIXApXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykgYXMgdW5rbm93biBhcyBQcm9taXNlPHZvaWQ+XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBSb290TG9nZ2VyID0ge1xuICAgIGVucmljaFJlc2VydmVkKGZpZWxkczogb2JqZWN0KTogUm9vdExvZ2dlclxuICAgIGZsdXNoKCk6IFByb21pc2U8dm9pZD5cbn0gJiBMb2dnZXJcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoXG4gICAgY2xpZW50SW5mbzogQ2xpZW50SW5mbyxcbiAgICBsb2dnZXJzOiBMb2dUcmFuc3BvcnRbXSxcbiAgICBldmVudFRyYW5zcG9ydDogRXZlbnRUcmFuc3BvcnQsXG4gICAgdGltZW91dHM6IHsgZGVmYXVsdDogbnVtYmVyOyBjYXA/OiBudW1iZXIgfSxcbiAgICBvdXRlckNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgICBjb25maWc/OiBGdWxsQ29uZmlndXJhdGlvbixcbiAgICBtZXRhPzogTWV0YWRhdGEsXG4gICAgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudCxcbiAgICBub3c/OiAoKSA9PiBEYXRlLFxuKToge1xuICAgIGxvZzogUm9vdExvZ2dlclxuICAgIGNvbnRleHQ6IE9taXQ8Q29udGV4dCwgJ2xvZyc+XG4gICAgc3VjY2VzczogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuICAgIGZsdXNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59IHtcbiAgICBjb25zdCB0aW1lb3V0ID1cbiAgICAgICAgKHRpbWVvdXRzLmNhcFxuICAgICAgICAgICAgPyBNYXRoLm1pbihjb25maWc/LnRpbWVvdXQgPz8gdGltZW91dHMuZGVmYXVsdCwgdGltZW91dHMuY2FwKVxuICAgICAgICAgICAgOiAoY29uZmlnPy50aW1lb3V0ID8/IHRpbWVvdXRzLmRlZmF1bHQpKSAqIDEwMDBcbiAgICBjb25zdCBpbm5lckNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIGNvbnN0IGxvZ1RyYW5zcG9ydCA9IGxvZ2dlcnMubGVuZ3RoID09PSAxID8gbG9nZ2Vyc1swXSEgOiBuZXcgTG9nTXVsdGljYXN0ZXIobG9nZ2VycylcbiAgICBjb25zdCBsb2dnZXIgPSBtYWtlTG9nZ2VyKFxuICAgICAgICBsb2dUcmFuc3BvcnQsXG4gICAgICAgIGNvbmZpZz8ubWluaW11bUxvZ0xldmVsLFxuICAgICAgICBvdXRlckNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICkuZW5yaWNoUmVzZXJ2ZWQoe1xuICAgICAgICBvcGVyYXRpb25JZDogY2xpZW50SW5mby5vcGVyYXRpb25JZCxcbiAgICAgICAgY2xpZW50OiB7XG4gICAgICAgICAgICBpZDogY2xpZW50SW5mby5jbGllbnRJZCxcbiAgICAgICAgICAgIGlwOiBjbGllbnRJbmZvLmNsaWVudElwLFxuICAgICAgICAgICAgcG9ydDogY2xpZW50SW5mby5jbGllbnRQb3J0LFxuICAgICAgICAgICAgdXNlckFnZW50OiBjbGllbnRJbmZvLnVzZXJBZ2VudCxcbiAgICAgICAgfSxcbiAgICB9KVxuICAgIGdsb2JhbExvZ2dlciA9IGxvZ2dlclxuICAgIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRXZlbnRDb2xsZWN0b3IoXG4gICAgICAgIGV2ZW50VHJhbnNwb3J0LFxuICAgICAgICBsb2dnZXIsXG4gICAgICAgIGNsaWVudEluZm8sXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIG91dGVyQ29udHJvbGxlci5zaWduYWwsXG4gICAgKVxuICAgIGNvbnN0IHN1Y2Nlc3NIYW5kbGVyczogKCgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKVtdID0gW11cbiAgICBjb25zdCBjdHggPSB7XG4gICAgICAgIGVudjogZW52aXJvbm1lbnQgPz8gKHByb2Nlc3MuZW52IGFzIEVudmlyb25tZW50KSxcbiAgICAgICAgc2lnbmFsOiBpbm5lckNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBub3c6IG5vdyA/PyAoKCkgPT4gbmV3IERhdGUoKSksXG4gICAgICAgIG9wZXJhdGlvbklkOiBjbGllbnRJbmZvLm9wZXJhdGlvbklkLFxuICAgICAgICBjbGllbnQ6IHtcbiAgICAgICAgICAgIGlkOiBjbGllbnRJbmZvLmNsaWVudElkLFxuICAgICAgICAgICAgaXA6IGNsaWVudEluZm8uY2xpZW50SXAsXG4gICAgICAgICAgICBwb3J0OiBjbGllbnRJbmZvLmNsaWVudFBvcnQsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6IGNsaWVudEluZm8udXNlckFnZW50LFxuICAgICAgICB9LFxuICAgICAgICBtZXRhOiBtZXRhXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lOiBtZXRhLnBhY2thZ2VOYW1lLFxuICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IG1ldGEuZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICByZXZpc2lvbjogbWV0YS5yZXZpc2lvbixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVtaXQ6ICh0b3BpYzogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIHN1YmplY3Q6IHN0cmluZywgZGF0YT86IEpzb24sIG1lc3NhZ2VJZD86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgZW1pdHRlci5lbWl0KHsgdG9waWMsIHR5cGUsIHN1YmplY3QsIGlkOiBtZXNzYWdlSWQgfSwgZGF0YSlcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRCYXJyaWVyOiAoKSA9PiBlbWl0dGVyLmZsdXNoKCksXG4gICAgICAgIG9uU3VjY2VzczogKGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCkgPT4gc3VjY2Vzc0hhbmRsZXJzLnB1c2goZm4pLFxuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignVGltZW91dC4nLCB1bmRlZmluZWQsIHVuZGVmaW5lZClcbiAgICAgICAgaW5uZXJDb250cm9sbGVyLmFib3J0KClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZvaWRcbiAgICAgICAgdm9pZCBsb2dnZXIuZmx1c2goKVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZFxuICAgICAgICB2b2lkIGVtaXR0ZXIuZmx1c2goKVxuICAgIH0sIHRpbWVvdXQpXG4gICAgY29uc3QgZmx1c2hIYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdBYm9ydGluZyBmbHVzaC4nLCB1bmRlZmluZWQsIHVuZGVmaW5lZClcbiAgICAgICAgb3V0ZXJDb250cm9sbGVyLmFib3J0KClcbiAgICB9LCB0aW1lb3V0ICsgMTVfMDAwKVxuICAgIHJldHVybiB7XG4gICAgICAgIGxvZzogbG9nZ2VyLFxuICAgICAgICBjb250ZXh0OiBjdHgsXG4gICAgICAgIHN1Y2Nlc3M6ICgpID0+IFByb21pc2UuYWxsKHN1Y2Nlc3NIYW5kbGVycy5tYXAoZm4gPT4gZm4oKSkpLFxuICAgICAgICBmbHVzaDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpXG4gICAgICAgICAgICBhd2FpdCBlbWl0dGVyLmZsdXNoKClcbiAgICAgICAgICAgIGF3YWl0IGxvZ2dlci5mbHVzaCgpXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZmx1c2hIYW5kbGUpXG4gICAgICAgIH0sXG4gICAgfVxufVxuXG5sZXQgZ2xvYmFsTG9nZ2VyOiBMb2dnZXIgfCB1bmRlZmluZWRcblxucHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBlcnIgPT4ge1xuICAgIGdsb2JhbExvZ2dlcj8uZmF0YWwoJ1VuY2F1Z2h0IGV4Y2VwdGlvbi4nLCBlcnIsIHVuZGVmaW5lZClcbn0pXG5wcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCByZWFzb24gPT4ge1xuICAgIGdsb2JhbExvZ2dlcj8uZmF0YWwoJ1VuaGFuZGxlZCByZWplY3Rpb24uJywgcmVhc29uLCB1bmRlZmluZWQpXG59KVxuIl19