connect-sdk-nodejs
Version:
SDK to communicate with the Ingenico ePayments platform using the Ingenico Connect Server API
113 lines • 3.99 kB
JavaScript
"use strict";
const crypto = require("crypto");
const _ = require("lodash");
/**
* @param {Array} gcsHeaders Collection of headers that need to be sorted; only headers that start with X-GCS will be returned
*/
function getSortedHeadersForContext(gcsHeaders) {
let headers = "";
if (gcsHeaders) {
let sortedXGCSHeaders = [];
_.forEach(gcsHeaders, header => {
if (header.key.toUpperCase().indexOf("X-GCS") === 0) {
// add this header
sortedXGCSHeaders.push(header);
}
});
sortedXGCSHeaders = sortedXGCSHeaders.sort((a, b) => {
a.key = a.key.toUpperCase();
b.key = b.key.toUpperCase();
if (a.key < b.key) {
return -1;
}
else if (a.key > b.key) {
return 1;
}
else {
return 0;
}
});
_.forEach(sortedXGCSHeaders, header => {
headers += header.key.toLowerCase() + ":" + header.value + "\n";
});
}
return headers;
}
class SdkContextImpl {
notSetError(name) {
throw new Error(name + " has not been set");
}
setContext(context) {
this.context = context;
}
getContext() {
return this.context || this.notSetError("context");
}
getSignature(method, contentType, date, gcsHeaders, path) {
const headers = getSortedHeadersForContext(gcsHeaders);
return crypto
.createHmac("SHA256", this.getContext().secretApiKey)
.update(method + "\n" + contentType + "\n" + date + "\n" + headers + path + "\n")
.digest("base64");
}
setLogger(logger) {
this.logger = logger;
}
getLogger() {
return this.logger || this.notSetError("logger");
}
setEnableLogging(isLoggingEnabled) {
this.enableLogging = isLoggingEnabled;
}
setIdempotenceRequestTimestamp(ts) {
this.idempotenceRequestTimestamp = ts;
}
getIdempotenceRequestTimestamp() {
return this.idempotenceRequestTimestamp;
}
setIntegrator(integrator) {
if (this.integrator) {
if (this.isLoggingEnabled()) {
this.getLogger()("error", "integrator has already been set and cannot be overwritten");
}
throw new Error("integrator has already been set and cannot be overwritten");
}
if (!integrator) {
if (this.isLoggingEnabled()) {
this.getLogger()("error", "integrator is required");
}
throw new Error("integrator is required");
}
this.integrator = integrator;
}
getIntegrator() {
return this.integrator || this.notSetError("integrator");
}
setShoppingCartExtension(shoppingCartExtension) {
if (this.shoppingCartExtension) {
if (this.isLoggingEnabled()) {
this.getLogger()("error", "shoppingCartExtension has already been set and cannot be overwritten");
}
throw new Error("shoppingCartExtension has already been set and cannot be overwritten");
}
if (shoppingCartExtension) {
if (shoppingCartExtension.creator && shoppingCartExtension.name && shoppingCartExtension.version) {
this.shoppingCartExtension = shoppingCartExtension;
}
else {
if (this.isLoggingEnabled()) {
this.getLogger()("warn", "shoppingCartExtension is missing a required property (creator / name / version). Your shoppingCartExtension: " + JSON.stringify(shoppingCartExtension));
}
}
}
}
getShoppingCartExtension() {
return this.shoppingCartExtension;
}
isLoggingEnabled() {
return this.enableLogging || false;
}
}
const sdkContext = new SdkContextImpl();
module.exports = sdkContext;
//# sourceMappingURL=context.js.map