UNPKG

o2-client

Version:

Light Client for O2 Blockchain

596 lines (481 loc) 14.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Decimal = exports.Timespec = exports.Bool = exports.String = exports.Float64 = exports.Float32 = exports.Uint64 = exports.Uint32 = exports.Uint16 = exports.Uint8 = exports.Int64 = exports.Int32 = exports.Int16 = exports.Int8 = undefined; 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; }; }(); var _bigInteger = require('big-integer'); var _bigInteger2 = _interopRequireDefault(_bigInteger); var _ieee = require('ieee754'); var ieee754 = _interopRequireWildcard(_ieee); var _validate = require('./validate'); var validate = _interopRequireWildcard(_validate); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var MIN_INT8 = -128; var MAX_INT8 = 127; var MIN_INT16 = -32768; var MAX_INT16 = 32767; var MIN_INT32 = -2147483648; var MAX_INT32 = 2147483647; var MIN_INT64 = '-9223372036854775808'; var MAX_INT64 = '9223372036854775807'; var MAX_UINT8 = 255; var MAX_UINT16 = 65535; var MAX_UINT32 = 4294967295; var MAX_UINT64 = '18446744073709551615'; var MAX_DECIMAL = '79228162514264337593543950336'; /** * Insert number into array as as little-endian * @param {number|bigInt} number * @param {Array} buffer * @param {number} from * @param {number} size * @returns {boolean} */ function insertIntegerToByteArray(number, buffer, from, size) { var value = (0, _bigInteger2.default)(number); // convert a number-like object into a big integer for (var pos = 0; pos < size; pos++) { var divmod = value.divmod(256); buffer[from + pos] = divmod.remainder.value; value = divmod.quotient; } return buffer; } /** * Insert IEEE754 floating point number into array as as little-endian * @param {number} number * @param {Array} buffer * @param {number} from * @param {number} mLen - mantissa length * @param {number} nBytes - number of bytes * @returns {boolean} */ function insertFloatToByteArray(number, buffer, from, mLen, nBytes) { ieee754.write(buffer, number, from, true, mLen, nBytes); return buffer; } /** * @param {string} str * @param {Array} buffer * @param {number} from */ function insertStringToByteArray(str, buffer, from) { for (var i = 0; i < str.length; i++) { var c = str.charCodeAt(i); if (c < 128) { buffer[from++] = c; } else if (c < 2048) { buffer[from++] = c >> 6 | 192; buffer[from++] = c & 63 | 128; } else if ((c & 0xFC00) === 0xD800 && i + 1 < str.length && (str.charCodeAt(i + 1) & 0xFC00) === 0xDC00) { // surrogate pair c = 0x10000 + ((c & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF); buffer[from++] = c >> 18 | 240; buffer[from++] = c >> 12 & 63 | 128; buffer[from++] = c >> 6 & 63 | 128; buffer[from++] = c & 63 | 128; } else { buffer[from++] = c >> 12 | 224; buffer[from++] = c >> 6 & 63 | 128; buffer[from++] = c & 63 | 128; } } } var Int8 = exports.Int8 = function () { function Int8() { _classCallCheck(this, Int8); } _createClass(Int8, null, [{ key: 'size', value: function size() { return 1; } /** * @param {number} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateInteger(value, MIN_INT8, MAX_INT8, from, this.size())) { throw new TypeError('Int8 of wrong type is passed: ' + value); } if (value < 0) { value = MAX_UINT8 + value + 1; } return insertIntegerToByteArray(value, buffer, from, this.size()); } }]); return Int8; }(); var Int16 = exports.Int16 = function () { function Int16() { _classCallCheck(this, Int16); } _createClass(Int16, null, [{ key: 'size', value: function size() { return 2; } /** * @param {number} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateInteger(value, MIN_INT16, MAX_INT16, from, this.size())) { throw new TypeError('Int16 of wrong type is passed: ' + value); } if (value < 0) { value = MAX_UINT16 + value + 1; } return insertIntegerToByteArray(value, buffer, from, this.size()); } }]); return Int16; }(); var Int32 = exports.Int32 = function () { function Int32() { _classCallCheck(this, Int32); } _createClass(Int32, null, [{ key: 'size', value: function size() { return 4; } /** * @param {number} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateInteger(value, MIN_INT32, MAX_INT32, from, this.size())) { throw new TypeError('Int32 of wrong type is passed: ' + value); } if (value < 0) { value = MAX_UINT32 + value + 1; } return insertIntegerToByteArray(value, buffer, from, this.size()); } }]); return Int32; }(); var Int64 = exports.Int64 = function () { function Int64() { _classCallCheck(this, Int64); } _createClass(Int64, null, [{ key: 'size', value: function size() { return 8; } /** * @param {number|string} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateBigInteger(value, MIN_INT64, MAX_INT64, from, this.size())) { throw new TypeError('Int64 of wrong type is passed: ' + value); } var val = (0, _bigInteger2.default)(value); if (val.isNegative()) { val = (0, _bigInteger2.default)(MAX_UINT64).plus(1).plus(val); } return insertIntegerToByteArray(val, buffer, from, this.size()); } }]); return Int64; }(); var Uint8 = exports.Uint8 = function () { function Uint8() { _classCallCheck(this, Uint8); } _createClass(Uint8, null, [{ key: 'size', value: function size() { return 1; } /** * @param {number} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateInteger(value, 0, MAX_UINT8, from, this.size())) { throw new TypeError('Uint8 of wrong type is passed: ' + value); } return insertIntegerToByteArray(value, buffer, from, this.size()); } }]); return Uint8; }(); var Uint16 = exports.Uint16 = function () { function Uint16() { _classCallCheck(this, Uint16); } _createClass(Uint16, null, [{ key: 'size', value: function size() { return 2; } /** * @param {number} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateInteger(value, 0, MAX_UINT16, from, this.size())) { throw new TypeError('Uint16 of wrong type is passed: ' + value); } return insertIntegerToByteArray(value, buffer, from, this.size()); } }]); return Uint16; }(); var Uint32 = exports.Uint32 = function () { function Uint32() { _classCallCheck(this, Uint32); } _createClass(Uint32, null, [{ key: 'size', value: function size() { return 4; } /** * @param {number} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateInteger(value, 0, MAX_UINT32, from, this.size())) { throw new TypeError('Uint32 of wrong type is passed: ' + value); } return insertIntegerToByteArray(value, buffer, from, this.size()); } }]); return Uint32; }(); var Uint64 = exports.Uint64 = function () { function Uint64() { _classCallCheck(this, Uint64); } _createClass(Uint64, null, [{ key: 'size', value: function size() { return 8; } /** * @param {number|string} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateBigInteger(value, 0, MAX_UINT64, from, this.size())) { throw new TypeError('Uint64 of wrong type is passed: ' + value); } var val = (0, _bigInteger2.default)(value); return insertIntegerToByteArray(val, buffer, from, this.size()); } }]); return Uint64; }(); var Float32 = exports.Float32 = function () { function Float32() { _classCallCheck(this, Float32); } _createClass(Float32, null, [{ key: 'size', value: function size() { return 4; } /** * @param {string} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateFloat(value, from, this.size())) { throw new TypeError('Float32 of wrong type is passed: ' + value); } return insertFloatToByteArray(value, buffer, from, 23, this.size()); } }]); return Float32; }(); var Float64 = exports.Float64 = function () { function Float64() { _classCallCheck(this, Float64); } _createClass(Float64, null, [{ key: 'size', value: function size() { return 8; } /** * @param {string} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (!validate.validateFloat(value, from, this.size())) { throw new TypeError('Float64 of wrong type is passed: ' + value); } return insertFloatToByteArray(value, buffer, from, 52, this.size()); } }]); return Float64; }(); var String = exports.String = function () { function String() { _classCallCheck(this, String); } _createClass(String, null, [{ key: 'size', value: function size() { return 8; } /** * @param {string} string * @param {Array} buffer * @param {number} from * @param {number} relativeFromIndex * @returns {Array} */ }, { key: 'serialize', value: function serialize(string, buffer, from, relativeFromIndex) { if (typeof string !== 'string') { throw new TypeError('Wrong data type is passed as String. String is required'); } var bufferLength = buffer.length; Uint32.serialize(relativeFromIndex, buffer, from); // index where string content starts in buffer insertStringToByteArray(string, buffer, bufferLength); // string content Uint32.serialize(buffer.length - bufferLength, buffer, from + 4); // string length return buffer; } }]); return String; }(); var Bool = exports.Bool = function () { function Bool() { _classCallCheck(this, Bool); } _createClass(Bool, null, [{ key: 'size', value: function size() { return 1; } /** * @param {boolean} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (typeof value !== 'boolean') { throw new TypeError('Wrong data type is passed as Boolean. Boolean is required'); } return insertIntegerToByteArray(value ? 1 : 0, buffer, from, this.size()); } }]); return Bool; }(); var Timespec = exports.Timespec = function () { function Timespec() { _classCallCheck(this, Timespec); } _createClass(Timespec, null, [{ key: 'size', value: function size() { return 8; } /** * @param {number|string} nanoseconds * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(nanoseconds, buffer, from) { if (!validate.validateBigInteger(nanoseconds, 0, MAX_UINT64, from, this.size())) { throw new TypeError('Timespec of wrong type is passed: ' + nanoseconds); } var val = (0, _bigInteger2.default)(nanoseconds); return insertIntegerToByteArray(val, buffer, from, this.size()); } }]); return Timespec; }(); var Decimal = exports.Decimal = function () { function Decimal() { _classCallCheck(this, Decimal); } _createClass(Decimal, null, [{ key: 'size', value: function size() { return 12; } /** * @param {number|string} value * @param {Array} buffer * @param {number} from * @returns {Array} */ }, { key: 'serialize', value: function serialize(value, buffer, from) { if (typeof value !== 'string') { throw new TypeError('Wrong data type is passed as String. String is required'); } var pointIndex = value.indexOf('.'); buffer[from + 2] = pointIndex > -1 ? value.length - 1 - pointIndex : 0; if (pointIndex > -1) { value = value.replace('.', ''); } var val = (0, _bigInteger2.default)(value); buffer[from + 3] = val.gt(0) ? 0 : 128; from += 4; val = val.abs(); if (val.gt(MAX_DECIMAL)) { throw new TypeError('Decimal value is out of range'); } return insertIntegerToByteArray(val, buffer, from, this.size()); } }]); return Decimal; }();