export function parse_ipv4(value) { const D = parseInt(value.slice(0, 2), 16); const C = parseInt(value.slice(2, 4), 16); const B = parseInt(value.slice(4, 6), 16); const A = parseInt(value.slice(6, 8), 16); return `${A}.${B}.${C}.${D}`; } export function parse_socket_state(socket_state) { const ss_lines = socket_state.split('\n').map(line => line.trim()); const fields = ss_lines[0].split(/\s+/); const result = []; const field_parsers = { 'st': (value => parseInt(value, 16)), 'local_address': parse_ipv4, 'rem_address': parse_ipv4, }; for (const line of ss_lines.slice(1)) { const values = line.split(/\s+/); const v_iter = values[Symbol.iterator](); const pending = {}; for (const column of fields.slice(0, -1)) { pending[column] = v_iter.next().value; } pending[fields.at(-1)] = [...v_iter].join(' '); for (const [name, parser] of Object.entries(field_parsers)) { const local_value = pending[name]; if (local_value) { pending[name] = parser(local_value); } } result.push(pending); } return result; }