import { is_array, as_func, o_defprop } from './builtins.jsy' export function bind_codec(codec) :: // For use with `codec_channel` of 'code/channel.jsy' // Also see plugins/standard/json_codec.jsy // and see plugins/cbor/cbor_codec.jsy as_func @ codec.encode as_func @ codec.decode const cache = new WeakMap() return @{} codec encode_pkt(pkt) :: let pkt_data = cache.get(pkt) if undefined === pkt_data :: let id_route, id_target, meta, body, on_sent if is_array(pkt) :: if 3 === pkt.length :: ([ id_route, id_target, body ] = pkt); else ([ id_route, id_target, meta, body ] = pkt); else :: ({ 0: id_route, 1: id_target, meta, body, on_sent } = pkt); pkt_data = codec.encode @# id_route, id_target, meta, body if on_sent :: if 'string' === typeof pkt_data :: // transform into a string object pkt_data = new String(pkt_data) o_defprop @ pkt_data, @{} on_sent: {value: on_sent} cache.set(pkt, pkt_data) return pkt_data decode_pkt(pkt_data) :: let pkt_vec = codec.decode(pkt_data) let [id_route, id_target, meta, body] = pkt_vec let pkt = {0: id_route, 1: id_target, meta, body} cache.set(pkt, pkt_data) return pkt