amazon-pay-async
Version:
API wrapper for Amazon Pay using promises and defining types
62 lines (61 loc) • 1.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var crypto = require("crypto");
var URL = require("url");
function composeParams(params, label, composed) {
composed = safeObjectCast(composed);
params = safeObjectCast(params);
Object.keys(params).forEach(function (key) {
var value = params[key];
var newLabel = label ? label + "." + key : key;
if (isObject(value)) {
composeParams(value, newLabel, composed);
}
else {
composed[newLabel] = value;
}
});
return composed;
}
exports.composeParams = composeParams;
function isObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
}
exports.isObject = isObject;
function attachSignature(url, secret, params) {
params.SignatureMethod = 'HmacSHA256';
params.SignatureVersion = '2';
var sortedParams = Object.keys(params).sort(function (a, b) { return (a === b ? 0 : a < b ? -1 : 1); }).map(function (key) { return RFC3986Encode(key) + "=" + RFC3986Encode(params[key]); }).join('&');
var parsedUrl = URL.parse(url);
var hmac = crypto.createHmac('SHA256', secret);
var stringToSign = [
'POST',
parsedUrl.hostname,
(parsedUrl.pathname || '/'),
sortedParams,
].join('\n');
hmac.update(stringToSign);
params.Signature = hmac.digest('base64');
return params;
}
exports.attachSignature = attachSignature;
function safeJSONParse(data) {
var parsed;
try {
parsed = JSON.parse(data);
}
catch (e) {
parsed = data;
}
return parsed;
}
exports.safeJSONParse = safeJSONParse;
function safeObjectCast(obj) {
if (!isObject(obj)) {
return {};
}
return obj;
}
function RFC3986Encode(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { return "%" + c.charCodeAt(0).toString(16); });
}