import dayjs from 'dayjs'; import relativeTimePlugin from 'dayjs/plugin/relativeTime'; import utcPlugin from 'dayjs/plugin/utc'; dayjs.extend(relativeTimePlugin); dayjs.extend(utcPlugin); const formatAsPath = path => { return path.join(' → '); }; const formatCommunities = comms => { const commsStr = comms.map(c => ` - ${c}`); return '\n' + commsStr.join('\n'); }; const formatBool = val => { let fmt = ''; if (val === true) { fmt = 'yes'; } else if (val === false) { fmt = 'no'; } return fmt; }; const formatTime = val => { const now = dayjs.utc(); const then = now.subtract(val, 'seconds'); const timestamp = then.toString().replace('GMT', 'UTC'); const relative = now.to(then, true); return `${relative} (${timestamp})`; }; export const tableToString = (target, data, config) => { try { const formatRpkiState = val => { const rpkiStateNames = [ config.web.text.rpki_invalid, config.web.text.rpki_valid, config.web.text.rpki_unknown, config.web.text.rpki_unverified, ]; return rpkiStateNames[val]; }; const tableFormatMap = { age: formatTime, active: formatBool, as_path: formatAsPath, communities: formatCommunities, rpki_state: formatRpkiState, }; let tableStringParts = [`Routes For: ${target}`, `Timestamp: ${data.timestamp} UTC`]; data.output.routes.map(route => { config.parsed_data_fields.map(field => { const [header, accessor, align] = field; if (align !== null) { let value = route[accessor]; const fmtFunc = tableFormatMap[accessor] ?? String; value = fmtFunc(value); if (accessor === 'prefix') { tableStringParts.push(` - ${header}: ${value}`); } else { tableStringParts.push(` - ${header}: ${value}`); } } }); }); return tableStringParts.join('\n'); } catch (err) { console.error(err); return `An error occurred while parsing the output: '${err.message}'`; } };