simplyblock
Version:
Signing and Request package for Simply Block API Gateway
104 lines (80 loc) • 2.4 kB
JavaScript
const Crypto = require("crypto")
const request = require('request')
const fs = require("fs")
/**
* @class SimplySign
* @augments privateKey - Token Private Key
* @augments publicKey - Token Public Key
*/
function SimplySign(privateKey, publicKey){
this.privateKey = privateKey
this.publicKey = publicKey
this.data = null
this.signedData = null
}
/**
* Generate Signature
* @augments data - Request Data
*/
SimplySign.prototype.GenerateSignature = function(data){
// Convert to String
this.data = JSON.stringify(data)
// Replace values
this.data = this.data.replace(":", ": ")
this.data = this.data.replace(/"/g, '\'');
// Genearte Signed Data
this.signedData = Crypto.createHmac('sha384', this.privateKey).update(this.data).digest('hex')
return this.signedData
}
/**
* Generate Signature
* @augments data - Request Data
* @augments uri - Request URI
* @augments files - if any => {}
*/
SimplySign.prototype.GatewayRequest = async function(uri, data, files=null){
return new Promise((resolve, reject) => {
// Generate Data
var signedData = this.GenerateSignature(data)
if (files != null){
// Read Files
Object.keys(files).forEach(function(key) {
files[key] = fs.createReadStream(files[key])
});
// Create Request Data
var requestData = Object.assign(data, files)
requestData["signed_data"] = signedData
requestData["public_key"] = this.publicKey
// Create Options
var options = {
uri: uri,
method: 'POST',
formData: requestData
};
}else{
// Create Request Data
var requestData = {
'public_key': this.publicKey,
'signed_data': signedData,
'data': data
}
// Create Options
var options = {
uri: uri,
method: 'POST',
json: requestData
};
}
// Request
request(options, function (error, response, body) {
if (error) {
reject(error)
}else{
resolve({response, body})
}
});
})
}
module.exports = {
SimplySign
}