UNPKG

balena-cli

Version:

The official balena Command Line Interface

107 lines 4.16 kB
"use strict"; 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