hive-js-dev
Version:
Steem.js the JavaScript API for Steem blockchain
211 lines (184 loc) • 8.41 kB
JavaScript
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var ByteBuffer = require('bytebuffer');
var EC = require('./error_with_cause');
var HEX_DUMP = process.env.npm_config__graphene_serializer_hex_dump;
var Serializer = function () {
function Serializer(operation_name, types) {
_classCallCheck(this, Serializer);
this.operation_name = operation_name;
this.types = types;
if (this.types) this.keys = Object.keys(this.types);
Serializer.printDebug = true;
}
_createClass(Serializer, [{
key: 'fromByteBuffer',
value: function fromByteBuffer(b) {
var object = {};
var field = null;
try {
var iterable = this.keys;
for (var i = 0, field; i < iterable.length; i++) {
field = iterable[i];
var type = this.types[field];
try {
if (HEX_DUMP) {
if (type.operation_name) {
console.error(type.operation_name);
} else {
var o1 = b.offset;
type.fromByteBuffer(b);
var o2 = b.offset;
b.offset = o1;
//b.reset()
var _b = b.copy(o1, o2);
console.error(this.operation_name + '.' + field + '\t', _b.toHex());
}
}
object[field] = type.fromByteBuffer(b);
} catch (e) {
if (Serializer.printDebug) {
console.error('Error reading ' + this.operation_name + '.' + field + ' in data:');
b.printDebug();
}
throw e;
}
}
} catch (error) {
EC.throw(this.operation_name + '.' + field, error);
}
return object;
}
}, {
key: 'appendByteBuffer',
value: function appendByteBuffer(b, object) {
var field = null;
try {
var iterable = this.keys;
for (var i = 0, field; i < iterable.length; i++) {
field = iterable[i];
var type = this.types[field];
type.appendByteBuffer(b, object[field]);
}
} catch (error) {
try {
EC.throw(this.operation_name + '.' + field + " = " + JSON.stringify(object[field]), error);
} catch (e) {
// circular ref
EC.throw(this.operation_name + '.' + field + " = " + object[field], error);
}
}
return;
}
}, {
key: 'fromObject',
value: function fromObject(serialized_object) {
var result = {};
var field = null;
try {
var iterable = this.keys;
for (var i = 0, field; i < iterable.length; i++) {
field = iterable[i];
var type = this.types[field];
var value = serialized_object[field];
//DEBUG value = value.resolve if value.resolve
//DEBUG console.log('... value',field,value)
var object = type.fromObject(value);
result[field] = object;
}
} catch (error) {
EC.throw(this.operation_name + '.' + field, error);
}
return result;
}
/**
@arg {boolean} [debug.use_default = false] - more template friendly
@arg {boolean} [debug.annotate = false] - add user-friendly information
*/
}, {
key: 'toObject',
value: function toObject() {
var serialized_object = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { use_default: false, annotate: false };
var result = {};
var field = null;
try {
if (!this.types) return result;
var iterable = this.keys;
for (var i = 0, field; i < iterable.length; i++) {
field = iterable[i];
var type = this.types[field];
var object = type.toObject(typeof serialized_object !== "undefined" && serialized_object !== null ? serialized_object[field] : undefined, debug);
result[field] = object;
if (HEX_DUMP) {
var b = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN);
var has_value = typeof serialized_object !== "undefined" && serialized_object !== null;
if (has_value) {
var value = serialized_object[field];
if (value) type.appendByteBuffer(b, value);
}
b = b.copy(0, b.offset);
console.error(this.operation_name + '.' + field, b.toHex());
}
}
} catch (error) {
EC.throw(this.operation_name + '.' + field, error);
}
return result;
}
/** Sort by the first element in a operation */
}, {
key: 'compare',
value: function compare(a, b) {
var first_key = this.keys[0];
var first_type = this.types[first_key];
var valA = a[first_key];
var valB = b[first_key];
if (first_type.compare) return first_type.compare(valA, valB);
if (typeof valA === "number" && typeof valB === "number") return valA - valB;
var encoding = void 0;
if (Buffer.isBuffer(valA) && Buffer.isBuffer(valB)) {
// A binary string compare does not work. If localeCompare is well supported that could replace HEX. Performanance is very good so comparing HEX works.
encoding = "hex";
}
var strA = valA.toString(encoding);
var strB = valB.toString(encoding);
return strA > strB ? 1 : strA < strB ? -1 : 0;
}
// <helper_functions>
}, {
key: 'fromHex',
value: function fromHex(hex) {
var b = ByteBuffer.fromHex(hex, ByteBuffer.LITTLE_ENDIAN);
return this.fromByteBuffer(b);
}
}, {
key: 'fromBuffer',
value: function fromBuffer(buffer) {
var b = ByteBuffer.fromBinary(buffer.toString("binary"), ByteBuffer.LITTLE_ENDIAN);
return this.fromByteBuffer(b);
}
}, {
key: 'toHex',
value: function toHex(object) {
// return this.toBuffer(object).toString("hex")
var b = this.toByteBuffer(object);
return b.toHex();
}
}, {
key: 'toByteBuffer',
value: function toByteBuffer(object) {
var b = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN);
this.appendByteBuffer(b, object);
return b.copy(0, b.offset);
}
}, {
key: 'toBuffer',
value: function toBuffer(object) {
return new Buffer(this.toByteBuffer(object).toBinary(), 'binary');
}
}]);
return Serializer;
}();
module.exports = Serializer;