UNPKG

int-cli

Version:

INT is the new generation of bottom-up created system of IoT and blockchain

286 lines (285 loc) 8.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const writer_1 = require("./lib/writer"); var writer_2 = require("./lib/writer"); exports.BufferWriter = writer_2.BufferWriter; var reader_1 = require("./lib/reader"); exports.BufferReader = reader_1.BufferReader; const error_code_1 = require("./error_code"); var error_code_2 = require("./error_code"); exports.ErrorCode = error_code_2.ErrorCode; const encoding_1 = require("./lib/encoding"); const digest = require("./lib/digest"); const bignumber_js_1 = require("bignumber.js"); const util_1 = require("util"); function MapToObject(input) { if (!(input instanceof Map)) { throw new Error('input MUST be a Map'); } let ret = {}; for (const [k, v] of input) { if (!util_1.isString(k)) { throw new Error('input Map`s key MUST be string'); } ret[k] = v; } return ret; } exports.MapToObject = MapToObject; function SetToArray(input) { if (!(input instanceof Set)) { throw new Error('input MUST be a Set'); } let ret = new Array(); for (const item of input) { ret.push(item); } return ret; } exports.SetToArray = SetToArray; function SetFromObject(input) { if (!util_1.isObject(input)) { throw new Error('input MUST be a Object'); } let ret = new Set(); input.forEach((v) => ret.add(v)); return ret; } exports.SetFromObject = SetFromObject; function MapFromObject(input) { if (!util_1.isObject(input)) { throw new Error('input MUST be a Object'); } let ret = new Map(); for (const k of Object.keys(input)) { ret.set(k, input[k]); } return ret; } exports.MapFromObject = MapFromObject; function deepCopy(o) { if (util_1.isUndefined(o) || util_1.isNull(o)) { return o; } else if (util_1.isNumber(o) || util_1.isBoolean(o)) { return o; } else if (util_1.isString(o)) { return o; } else if (o instanceof bignumber_js_1.BigNumber) { return new bignumber_js_1.BigNumber(o); } else if (util_1.isBuffer(o)) { return Buffer.from(o); } else if (util_1.isArray(o) || o instanceof Array) { let s = []; for (let e of o) { s.push(deepCopy(e)); } return s; } else if (o instanceof Map) { let s = new Map(); for (let k of o.keys()) { s.set(k, deepCopy(o.get(k))); } return s; } else if (util_1.isObject(o)) { let s = Object.create(null); for (let k of Object.keys(o)) { s[k] = deepCopy(o[k]); } return s; } else { throw new Error('not JSONable'); } } exports.deepCopy = deepCopy; function toEvalText(o) { if (util_1.isUndefined(o) || util_1.isNull(o)) { return JSON.stringify(o); } else if (util_1.isNumber(o) || util_1.isBoolean(o)) { return JSON.stringify(o); } else if (util_1.isString(o)) { return JSON.stringify(o); } else if (o instanceof bignumber_js_1.BigNumber) { return `new BigNumber('${o.toString()}')`; } else if (util_1.isBuffer(o)) { return `Buffer.from('${o.toString('hex')}', 'hex')`; } else if (util_1.isArray(o) || o instanceof Array) { let s = []; for (let e of o) { s.push(toEvalText(e)); } return `[${s.join(',')}]`; } else if (o instanceof Map) { throw new Error(`use MapToObject before toStringifiable`); } else if (o instanceof Set) { throw new Error(`use SetToArray before toStringifiable`); } else if (util_1.isObject(o)) { let s = []; for (let k of Object.keys(o)) { s.push(`'${k}':${toEvalText(o[k])}`); } return `{${s.join(',')}}`; } else { throw new Error('not JSONable'); } } exports.toEvalText = toEvalText; function toStringifiable(o, parsable = false) { if (util_1.isUndefined(o) || util_1.isNull(o)) { return o; } else if (util_1.isNumber(o) || util_1.isBoolean(o)) { return o; } else if (util_1.isString(o)) { return parsable ? 's' + o : o; } else if (o instanceof bignumber_js_1.BigNumber) { return parsable ? 'n' + o.toString() : o.toString(); } else if (util_1.isBuffer(o)) { return parsable ? 'b' + o.toString('hex') : o.toString('hex'); } else if (util_1.isArray(o) || o instanceof Array) { let s = []; for (let e of o) { s.push(toStringifiable(e, parsable)); } return s; } else if (o instanceof Map) { throw new Error(`use MapToObject before toStringifiable`); } else if (o instanceof Set) { throw new Error(`use SetToArray before toStringifiable`); } else if (util_1.isObject(o)) { let s = Object.create(null); for (let k of Object.keys(o)) { s[k] = toStringifiable(o[k], parsable); } return s; } else { throw new Error('not JSON able'); } } exports.toStringifiable = toStringifiable; function fromStringifiable(o) { // let value = JSON.parse(o); function __convertValue(v) { if (util_1.isString(v)) { if (v.charAt(0) === 's') { return v.substring(1); } else if (v.charAt(0) === 'b') { return Buffer.from(v.substring(1), 'hex'); } else if (v.charAt(0) === 'n') { return new bignumber_js_1.BigNumber(v.substring(1)); } else { throw new Error(`invalid parsable value ${v}`); } } else if (util_1.isArray(v) || v instanceof Array) { for (let i = 0; i < v.length; ++i) { v[i] = __convertValue(v[i]); } return v; } else if (util_1.isObject(v)) { for (let k of Object.keys(v)) { v[k] = __convertValue(v[k]); } return v; } else { return v; } } return __convertValue(o); } exports.fromStringifiable = fromStringifiable; function hasDecimals(o) { let s = o.toString(); if (s.indexOf('.') > -1) { if (s.indexOf('e') === -1) { return true; } else { let pointIndex = s.indexOf('.'); let eIndex = s.indexOf('e'); let str = s.substring(pointIndex + 1, eIndex); let n = s.substring(eIndex + 2); if (str.length > Number(n)) { return true; } } } return false; } exports.hasDecimals = hasDecimals; function encodeAddressAndNonce(address, nonce) { let bw = new writer_1.BufferWriter(); bw.writeVarString(address); bw.writeU32(nonce); return digest.hash256(bw.render()).toString('hex'); } exports.encodeAddressAndNonce = encodeAddressAndNonce; class SerializableWithHash { constructor() { this.m_hash = encoding_1.Encoding.NULL_HASH; } get hash() { return this.m_hash; } _encodeHashContent(writer) { return error_code_1.ErrorCode.RESULT_OK; } _decodeHashContent(reader) { return error_code_1.ErrorCode.RESULT_OK; } encode(writer) { // writer.writeHash(this.hash); return this._encodeHashContent(writer); } decode(reader) { // this.m_hash = reader.readHash('hex'); let err = this._decodeHashContent(reader); this.updateHash(); return err; } updateHash() { this.m_hash = this._genHash(); } _genHash() { let contentWriter = new writer_1.BufferWriter(); this._encodeHashContent(contentWriter); let content = contentWriter.render(); return digest.hash256(content).toString('hex'); } _verifyHash() { return this.hash === this._genHash(); } stringify() { return { hash: this.hash }; } } exports.SerializableWithHash = SerializableWithHash;