UNPKG

connect-sdk-nodejs

Version:

SDK to communicate with the Ingenico ePayments platform using the Ingenico Connect Server API

113 lines 3.99 kB
"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