{add, always, applySpec, both, converge, identity, ifElse, invoker, length, lte, pipe, slice} = require 'ramda'
buffer_to = require './buffer_to'
get_data_size = buffer_to.int16(4)
get_field_name = pipe(slice(0, 4), buffer_to.ascii)
get_full_field_size = pipe(get_data_size, add(6))
has_name_and_size = pipe length, lte(6)
slice_from_buffer = invoker(2, 'slice')
get_main_values = applySpec
bytes: get_full_field_size
name: get_field_name
value: converge(slice_from_buffer, [always(6), get_full_field_size, identity])
First ensure that there are 6 bytes (to get the size bytes) then calculate and check the full size.
has_byte_length = both(
pipe(length, lte(6)),
converge(lte, [get_full_field_size, length]),
)
module.exports = ifElse(has_byte_length, get_main_values, always({bytes: 0}))