UNPKG

@aeternity/aepp-calldata

Version:
47 lines (45 loc) 1.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ChainObject = _interopRequireDefault(require("./ChainObject.cjs")); var _ChainObjectTemplates = _interopRequireDefault(require("./ChainObjectTemplates.cjs")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } class ChainObjectEncoder { /** * @param {FieldsEncoder} fieldsEncoder */ constructor(fieldsEncoder) { this.fieldsEncoder = fieldsEncoder; } encode(object) { const { name, vsn } = object; const template = _ChainObjectTemplates.default[name.toUpperCase()][vsn]; if (template === undefined) { throw new Error(`Unsupported template version "${vsn}" for object type "${name}"`); } const encoded = this.fieldsEncoder.encodeFields(object, template); return new Uint8Array(encoded.flatMap(e => [...e])); } // Decoding a fixed size object // alternative compared to fields based decoding above // works based on object field sizes used to split on fields decode(name, data) { // version field is 4 bytes and should be always first // note that it may exists other objects with different version size? const { vsn } = this.fieldsEncoder.decodeFields([data.slice(0, 4)], { vsn: 'uint_32' }); const template = _ChainObjectTemplates.default[name.toUpperCase()][vsn]; const binaryFields = this.fieldsEncoder.splitFields(data, template); const fields = this.fieldsEncoder.decodeFields(binaryFields, template); return new _ChainObject.default(name, fields); } } var _default = exports.default = ChainObjectEncoder;