@aeternity/aepp-calldata
Version:
Aeternity data serialization library
47 lines (45 loc) • 1.68 kB
JavaScript
;
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;