bluzelle-binary-codec
Version:
bluzelle binary codec
125 lines (107 loc) • 4.22 kB
JavaScript
var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var assert = require('assert');
var _ = require('lodash');var _require =
require('./../utils/bytes-utils'),parseBytes = _require.parseBytes,serializeUIntN = _require.serializeUIntN;
var makeClass = require('./../utils/make-class');
var enums = require('./definitions.json');
function transformWith(func, obj) {
return _.transform(obj, func);
}
function biMap(obj, valueKey) {
return _.transform(obj, function (result, value, key) {
result[key] = value;
result[value[valueKey]] = value;
});
}
var EnumType = makeClass({
EnumType: function EnumType(definition) {
_.assign(this, definition);
// At minimum
assert(this.bytes instanceof Uint8Array);
assert(typeof this.ordinal === 'number');
assert(typeof this.name === 'string');
},
toString: function toString() {
return this.name;
},
toJSON: function toJSON() {
return this.name;
},
toBytesSink: function toBytesSink(sink) {
sink.put(this.bytes);
},
statics: {
ordinalByteWidth: 1,
fromParser: function fromParser(parser) {
return this.from(parser.readUIntN(this.ordinalByteWidth));
},
from: function from(val) {
var ret = val instanceof this ? val : this[val];
if (!ret) {
throw new Error(
val + ' is not a valid name or ordinal for ' + this.enumName);
}
return ret;
},
valuesByName: function valuesByName() {var _this = this;
return _.transform(this.initVals, function (result, ordinal, name) {
var bytes = serializeUIntN(ordinal, _this.ordinalByteWidth);
var type = new _this({ name: name, ordinal: ordinal, bytes: bytes });
result[name] = type;
});
},
init: function init() {
var mapped = this.valuesByName();
_.assign(this, biMap(mapped, 'ordinal'));
this.values = _.values(mapped);
return this;
} } });
function makeEnum(name, definition) {
return makeClass({
inherits: EnumType,
statics: _.assign(definition, { enumName: name }) });
}
function makeEnums(to, definition, name) {
to[name] = makeEnum(name, definition);
}
var Enums = transformWith(makeEnums, {
Type: {
initVals: enums.TYPES },
LedgerEntryType: {
initVals: enums.LEDGER_ENTRY_TYPES, ordinalByteWidth: 2 },
TransactionType: {
initVals: enums.TRANSACTION_TYPES, ordinalByteWidth: 2 },
TransactionResult: {
initVals: enums.TRANSACTION_RESULTS, ordinalByteWidth: 1 } });
Enums.Field = makeClass({
inherits: EnumType,
statics: {
enumName: 'Field',
initVals: enums.FIELDS,
valuesByName: function valuesByName() {var _this2 = this;
var fields = _.map(this.initVals, function (_ref) {var _ref2 = _slicedToArray(_ref, 2),name = _ref2[0],definition = _ref2[1];
var type = Enums.Type[definition.type];
var bytes = _this2.header(type.ordinal, definition.nth);
var ordinal = type.ordinal << 16 | definition.nth;
var extra = { ordinal: ordinal, name: name, type: type, bytes: bytes };
return new _this2(_.assign(definition, extra));
});
return _.keyBy(fields, 'name');
},
header: function header(type, nth) {
var name = nth;
var header = [];
var push = header.push.bind(header);
if (type < 16) {
if (name < 16) {
push(type << 4 | name);
} else {
push(type << 4, name);
}
} else if (name < 16) {
push(name, type);
} else {
push(0, type, name);
}
return parseBytes(header, Uint8Array);
} } });
module.exports = Enums;
;