@aeternity/aepp-calldata
Version:
Aeternity data serialization library
91 lines (79 loc) • 3.24 kB
JavaScript
import Serializer from './Serializer.js'
import ApiEncoder from './ApiEncoder.js'
import CanonicalMapper from './Mapper/CanonicalMapper.js'
import ExternalDataFactory from './ExternalDataFactory.js'
class ContractByteArrayEncoder {
constructor() {
/** @type {Serializer} */
this._serializer = new Serializer()
/** @type {ApiEncoder} */
this._apiEncoder = new ApiEncoder()
/** @type {ExternalDataFactory} */
this._externalDataFactory = new ExternalDataFactory()
/** @type {CanonicalMapper} */
this._canonicalMapper = new CanonicalMapper()
}
/**
* Encode FATE data to contract bytearray.
*
* @example
* const encoded = encoder.encode(FateTypeString(), "whoolymoly")
* console.log(`Encoded data: ${encoded}`)
* // Outputs:
* // Encoded data: cb_KXdob29seW1vbHlGazSE
*
* @param {object} type - Data as Javascript data structures. See README.md
* @param {Array} data - Data as Javascript data structures. See README.md
* @returns {string} Encoded contract byte array
*/
encode(type, value) {
const data = this._externalDataFactory.create(type, value)
const serialized = this._serializer.serialize(data)
const binData = new Uint8Array(serialized.flat(Infinity))
return this._apiEncoder.encode('contract_bytearray', binData)
}
/**
* Decodes arbitrary contract bytearray data.
*
* Note that:
* - Variants are not annotated with constructor names
* - Record keys are lost
* - Any custom type information is lost
* - STL type information is lost: i.e. Chain, AENS, Set, BLS12_381
*
* @example
* const decoded = encoder.decode('cb_KXdob29seW1vbHlGazSE')
* console.log(`Decoded data: ${decoded}`)
* // Outputs:
* // Decoded data: whoolymoly
*
* @param {string} data - Contract bytearray data in a canonical format.
* @returns {boolean|string|BigInt|Array|Map|Object}
* Decoded value as Javascript data structures. See README.md
*/
decode(data) {
const binData = this._apiEncoder.decodeWithType(data, 'contract_bytearray')
const deserialized = this._serializer.deserialize(binData)
return this._canonicalMapper.toCanonical(deserialized)
}
/**
* Decodes arbitrary contract bytearray data with type information.
*
* @example
* const decoded = encoder.decodeWithType('cb_KXdob29seW1vbHlGazSE', FateTypeString())
* console.log(`Decoded data: ${decoded}`)
* // Outputs:
* // Decoded data: whoolymoly
*
* @param {string} data - Contract bytearray data in a canonical format.
* @param {object} type - Data as Javascript data structures. See README.md
* @returns {boolean|string|BigInt|Array|Map|Object}
* Decoded value as Javascript data structures. See README.md
*/
decodeWithType(data, type) {
const binData = this._apiEncoder.decodeWithType(data, 'contract_bytearray')
const deserialized = this._serializer.deserializeWithType(binData, type)
return this._canonicalMapper.toCanonical(deserialized)
}
}
export default ContractByteArrayEncoder