balena-cli
Version:
The official balena Command Line Interface
107 lines • 4.16 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getServiceColourFn = void 0;
exports.connectAndDisplayDeviceLogs = connectAndDisplayDeviceLogs;
exports.displayBuildLog = displayBuildLog;
exports.displayLogObject = displayLogObject;
const ColorHash = require("color-hash");
const _ = require("lodash");
const lazy_1 = require("../lazy");
const errors_1 = require("../../errors");
class DeviceConnectionLostError extends errors_1.ExpectedError {
constructor(msg) {
super(msg || DeviceConnectionLostError.defaultMsg);
}
}
DeviceConnectionLostError.defaultMsg = 'Connection to device lost';
async function displayDeviceLogs(logs, logger, system, filterServices) {
const { addSIGINTHandler } = await Promise.resolve().then(() => require('../helpers'));
const { parse: ndjsonParse } = await Promise.resolve().then(() => require('ndjson'));
let gotSignal = false;
const handleSignal = () => {
gotSignal = true;
logs.emit('close');
};
addSIGINTHandler(handleSignal);
process.once('SIGTERM', handleSignal);
try {
await new Promise((_resolve, reject) => {
const jsonStream = ndjsonParse();
jsonStream.on('data', (log) => {
displayLogObject(log, logger, system, filterServices);
});
jsonStream.on('error', (e) => {
logger.logWarn(`Error parsing NDJSON log chunk: ${e}`);
});
logs.once('error', handleError);
logs.once('end', handleError);
logs.pipe(jsonStream);
function handleError(error) {
logger.logWarn(DeviceConnectionLostError.defaultMsg);
if (gotSignal) {
reject(new errors_1.SIGINTError('Log streaming aborted on SIGINT signal'));
}
else {
const msg = typeof error === 'string' ? error : error === null || error === void 0 ? void 0 : error.message;
reject(new DeviceConnectionLostError(msg));
}
}
});
}
finally {
process.removeListener('SIGINT', handleSignal);
process.removeListener('SIGTERM', handleSignal);
}
}
async function connectAndDisplayDeviceLogs({ deviceApi, logger, system, filterServices, maxAttempts = 3, }) {
async function connectAndDisplay() {
const logStream = await deviceApi.getLogStream();
return displayDeviceLogs(logStream, logger, system, filterServices);
}
const { retry } = await Promise.resolve().then(() => require('../../utils/helpers'));
try {
await retry({
func: connectAndDisplay,
maxAttempts,
label: 'Streaming logs',
});
}
catch (err) {
if (err instanceof DeviceConnectionLostError) {
err.message = `Max retry count (${maxAttempts - 1}) exceeded while attempting to reconnect to the device`;
}
throw err;
}
}
function displayBuildLog(log, logger) {
const toPrint = `${(0, exports.getServiceColourFn)(log.serviceName)(`[${log.serviceName}]`)} ${log.message}`;
logger.logBuild(toPrint);
}
function displayLogObject(obj, logger, system, filterServices) {
const d = obj.timestamp != null ? new Date(obj.timestamp) : new Date();
let toPrint = `[${d.toISOString()}]`;
if (obj.serviceName != null) {
if (filterServices) {
if (!_.includes(filterServices, obj.serviceName)) {
return;
}
}
else if (system) {
return;
}
const colourFn = (0, exports.getServiceColourFn)(obj.serviceName);
toPrint += ` ${colourFn(`[${obj.serviceName}]`)}`;
}
else if (filterServices != null && !system) {
return;
}
toPrint += ` ${obj.message}`;
logger.logLogs(toPrint);
}
exports.getServiceColourFn = _.memoize(_getServiceColourFn);
const colorHash = new ColorHash();
function _getServiceColourFn(serviceName) {
const [r, g, b] = colorHash.rgb(serviceName);
return (0, lazy_1.getChalk)().rgb(r, g, b);
}
//# sourceMappingURL=logs.js.map
;