@axerunners/axecore-lib
Version:
A pure and powerful JavaScript Axe library.
222 lines (187 loc) • 7.21 kB
JavaScript
/* eslint-disable */
// TODO: Remove previous line and work through linting issues at next edit
var utils = require('../../util/js');
var constants = require('../../constants');
var Preconditions = require('../../util/preconditions');
var BufferUtil = require('../../util/buffer');
var BufferWriter = require('../../encoding/bufferwriter');
var BufferReader = require('../../encoding/bufferreader');
var PrivateKey = require('../../privatekey');
var AbstractPayload = require('./abstractpayload');
var isHexString = utils.isHexaString;
var CURRENT_PAYLOAD_VERSION = 1;
var PUBKEY_ID_SIZE = constants.PUBKEY_ID_SIZE;
/**
* @typedef {Object} BlockchainUserPayloadJSON
* @property {number} version - payload version
* @property {Buffer} pubKeyId
* @property {string} userName
* @property {string} [payloadSig]
* @property {string} [payloadSigSize]
*/
/**
* @class SubTxRegisterPayload
* @property {number} version - payload version
* @property {Buffer} pubKeyId
* @property {string} userName
* @property {string} [payloadSig]
* @property {string} [payloadSigSize]
*/
function SubTxRegisterPayload() {
AbstractPayload.call(this);
this.version = CURRENT_PAYLOAD_VERSION;
}
SubTxRegisterPayload.prototype = Object.create(AbstractPayload.prototype);
SubTxRegisterPayload.prototype.constructor = AbstractPayload;
/* Static methods */
/**
* Serialize blockchain user payload
* @param {BlockchainUserPayloadJSON} blockchainUserPayload
* @return {Buffer} serialized payload
*/
SubTxRegisterPayload.serializeJSONToBuffer = function (blockchainUserPayload) {
SubTxRegisterPayload.validatePayloadJSON(blockchainUserPayload);
var payloadBufferWriter = new BufferWriter();
var userNameBuffer = Buffer.from(blockchainUserPayload.userName, 'utf8');
payloadBufferWriter
.writeUInt16LE(blockchainUserPayload.version)
.writeVarintNum(userNameBuffer.length)
.write(userNameBuffer)
.write(blockchainUserPayload.pubKeyId);
if (blockchainUserPayload.payloadSig) {
var signatureBuf = Buffer.from(blockchainUserPayload.payloadSig, 'hex');
payloadBufferWriter.writeVarintNum(signatureBuf.length);
payloadBufferWriter.write(signatureBuf);
} else {
payloadBufferWriter.writeVarintNum(constants.EMPTY_SIGNATURE_SIZE);
}
return payloadBufferWriter.toBuffer();
};
/**
* Parse raw blockchain user payload
* @param {Buffer} rawPayload
* @return {SubTxRegisterPayload}
*/
SubTxRegisterPayload.fromBuffer = function fromBuffer(rawPayload) {
var payloadBufferReader = new BufferReader(rawPayload);
var blockchainUserPayload = new SubTxRegisterPayload();
var signatureSize = 0;
blockchainUserPayload.version = payloadBufferReader.readUInt16LE();
var usernameLen = payloadBufferReader.readVarintNum();
blockchainUserPayload.userName = payloadBufferReader.read(usernameLen).toString();
blockchainUserPayload.pubKeyId = payloadBufferReader.read(PUBKEY_ID_SIZE);
if (!payloadBufferReader.finished()) {
signatureSize = payloadBufferReader.readVarintNum();
}
if (signatureSize > 0) {
blockchainUserPayload.payloadSigSize = signatureSize;
blockchainUserPayload.payloadSig = payloadBufferReader.read(signatureSize).toString('hex');
}
SubTxRegisterPayload.validatePayloadJSON(blockchainUserPayload.toJSON());
return blockchainUserPayload;
};
/**
* Create new instance of payload from JSON
* @param {string|BlockchainUserPayloadJSON} payloadJson
* @return {SubTxRegisterPayload}
*/
SubTxRegisterPayload.fromJSON = function fromJSON(payloadJson) {
SubTxRegisterPayload.validatePayloadJSON(payloadJson);
var payload = new SubTxRegisterPayload();
payload.version = payloadJson.version;
payload.setUserName(payloadJson.userName);
payload.setPubKeyId(payloadJson.pubKeyId);
if (payloadJson.payloadSig) {
payload.payloadSig = payloadJson.payloadSig;
}
if (payloadJson.payloadSigSize) {
payload.payloadSigSize = payloadJson.payloadSigSize;
}
return payload;
};
/**
* Validate payload
* @param {BlockchainUserPayloadJSON} blockchainUserPayload
* @return {boolean}
*/
SubTxRegisterPayload.validatePayloadJSON = function (blockchainUserPayload) {
if (!blockchainUserPayload) {
throw new Error('No Payload specified');
}
Preconditions.checkArgumentType(blockchainUserPayload.version, 'number', 'version');
Preconditions.checkArgument(BufferUtil.isBuffer(blockchainUserPayload.pubKeyId), 'expect pubKeyId to be a Buffer but got ' + typeof blockchainUserPayload.pubKeyId);
Preconditions.checkArgument(blockchainUserPayload.pubKeyId.length === constants.PUBKEY_ID_SIZE, 'Invalid pubKeyId size');
Preconditions.checkArgumentType(blockchainUserPayload.userName, 'string', 'userName');
Preconditions.checkArgument(blockchainUserPayload.userName.length > 1, 'userName is too short');
if (blockchainUserPayload.payloadSig) {
Preconditions.checkArgument(isHexString(blockchainUserPayload.payloadSig), 'expect payloadSig to be a hex string but got ' + typeof blockchainUserPayload.payloadSig);
Preconditions.checkArgument(blockchainUserPayload.payloadSig.length === constants.COMPACT_SIGNATURE_SIZE * 2, 'Invalid payloadSig size');
}
};
/**
* @private
* @param {string|PrivateKey} privateKey
* @return {Buffer}
*/
SubTxRegisterPayload.convertPrivateKeyToPubKeyId = function(privateKey) {
if (typeof privateKey === 'string') {
privateKey = new PrivateKey(privateKey);
}
return privateKey.toPublicKey()._getID();
};
/* Instance methods */
/**
* @param {string} userName
* @return {SubTxRegisterPayload}
*/
SubTxRegisterPayload.prototype.setUserName = function setUserName(userName) {
this.userName = userName;
return this;
};
/**
* @param {Buffer} pubKeyId
* @return {SubTxRegisterPayload}
*/
SubTxRegisterPayload.prototype.setPubKeyId = function(pubKeyId) {
this.pubKeyId = BufferUtil.copy(pubKeyId);
return this;
};
/**
* Extracts and sets pubKeyId from private key
* @param {string|PrivateKey} privateKey
* @return {SubTxRegisterPayload}
*/
SubTxRegisterPayload.prototype.setPubKeyIdFromPrivateKey = function (privateKey) {
this.setPubKeyId(SubTxRegisterPayload.convertPrivateKeyToPubKeyId(privateKey));
return this;
};
/**
* Serializes payload to JSON
* @param [options]
* @param {boolean} options.skipSignature - skip signature part. Needed for creating new signature
* @return {BlockchainUserPayloadJSON}
*/
SubTxRegisterPayload.prototype.toJSON = function toJSON(options) {
var skipSignature = options && options.skipSignature;
var payloadJSON = {
version: this.version,
userName: this.userName,
pubKeyId: this.pubKeyId,
};
if (!skipSignature) {
payloadJSON.payloadSig = this.payloadSig;
payloadJSON.payloadSigSize = this.payloadSigSize;
}
SubTxRegisterPayload.validatePayloadJSON(payloadJSON);
return payloadJSON;
};
/**
* Serialize payload to buffer
* @param [options]
* @param {boolean} options.skipSignature - skip signature part. Needed for creating new signature
* @return {Buffer}
*/
SubTxRegisterPayload.prototype.toBuffer = function toBuffer(options) {
return SubTxRegisterPayload.serializeJSONToBuffer(this.toJSON(options));
};
module.exports = SubTxRegisterPayload;