UNPKG

@aeternity/aepp-calldata

Version:
75 lines (58 loc) 1.81 kB
import * as RLPInt from '../utils/RLPInt.js' import FateTag from '../FateTag.js' import FateList from '../types/FateList.js' import BaseSerializer from './BaseSerializer.js' class ListSerializer extends BaseSerializer { serialize(list) { const serializedElements = list.items.map(e => { return this.globalSerializer.serialize(e) }).flat(Infinity) const len = list.items.length if (len < 16) { const prefix = (len << 4) | FateTag.SHORT_LIST return [ prefix, ...serializedElements ] } return [ FateTag.LONG_LIST, ...RLPInt.encode(len - 16), ...serializedElements ] } deserializeStream(data, typeInfo) { const buffer = new Uint8Array(data) const prefix = buffer[0] let len = 0n let rest = buffer.slice(1) if (prefix === FateTag.LONG_LIST) { [len, rest] = RLPInt.decode(buffer.slice(1)) len += 16n } if ((prefix & 0x0F) === FateTag.SHORT_LIST) { len = BigInt((prefix & 0xF0) >> 4) } let itemsType if (typeof typeInfo !== 'undefined') { itemsType = typeInfo.valuesType } let el const elements = [] for (let i = 0n; i < len; i++) { [el, rest] = this.globalSerializer.deserializeStream(rest, itemsType) elements.push(el) } if (len === 0n) { return [new FateList(), rest] } if (typeof typeInfo === 'undefined') { itemsType = elements[0].type } return [ new FateList(itemsType, elements), rest ] } } export default ListSerializer