@adyen/api-library
Version:
The Adyen API Library for NodeJS enables you to work with Adyen APIs.
185 lines • 6.42 kB
JavaScript
;
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2026 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.toBase64 = exports.toJson = exports.fromKeyValuePairs = exports.fromBase64 = exports.parse = void 0;
const saleToAcquirerData_1 = require("./saleToAcquirerData");
const RECURRING_PROCESSING_MODELS = Object.values(saleToAcquirerData_1.RecurringProcessingModel);
/**
* Parses and serializes {@link SaleToAcquirerData} objects from/to their wire formats.
*
* Supports two formats:
* - Base64-encoded JSON: a JSON object encoded as a Base64 string.
* - Key-value pairs: form-encoded pairs using `&` as separator
* (e.g. `shopperEmail=foo@bar.com&tenderOption=AskGratuity`).
*/
/**
* Parses a raw `SaleToAcquirerData` string, auto-detecting the format.
*
* - If the string is valid Base64 and decodes to a JSON object, it is parsed as JSON.
* - Otherwise it is parsed as form-encoded key-value pairs.
*
* @param raw The raw `SaleToAcquirerData` string.
* @returns Parsed {@link SaleToAcquirerData}.
*/
function parse(raw) {
const decoded = tryDecodeBase64Json(raw);
if (decoded !== null) {
return decoded;
}
return fromKeyValuePairs(raw);
}
exports.parse = parse;
/**
* Decodes a Base64-encoded JSON string into a {@link SaleToAcquirerData} object.
*
* @param base64 Base64-encoded JSON string.
* @returns Decoded {@link SaleToAcquirerData}.
*/
function fromBase64(base64) {
try {
const json = Buffer.from(base64, "base64").toString("utf8");
return JSON.parse(json);
}
catch (e) {
throw new Error(`Failed to deserialize SaleToAcquirerData: ${e.message}`);
}
}
exports.fromBase64 = fromBase64;
/**
* Parses a form-encoded key-value pair string (e.g.
* `shopperEmail=foo@bar.com&tenderOption=AskGratuity`) into a {@link SaleToAcquirerData} object.
* Metadata fields use dotted notation: `metadata.key=value`.
*
* @param keyValuePairs Form-encoded key-value string using `&` as separator.
* @returns Parsed {@link SaleToAcquirerData}.
*/
function fromKeyValuePairs(keyValuePairs) {
const data = {};
const metadata = {};
const additionalData = {};
const params = new URLSearchParams(keyValuePairs);
for (const [key, value] of params) {
if (!key) {
continue;
}
if (key.startsWith("metadata.")) {
const subKey = key.substring("metadata.".length);
if (subKey) {
metadata[subKey] = value;
}
continue;
}
switch (key) {
case "shopperEmail":
data.shopperEmail = value;
break;
case "shopperReference":
data.shopperReference = value;
break;
case "shopperStatement":
data.shopperStatement = value;
break;
case "recurringContract":
data.recurringContract = value;
break;
case "recurringDetailName":
data.recurringDetailName = value;
break;
case "recurringTokenService":
data.recurringTokenService = value;
break;
case "recurringProcessingModel":
data.recurringProcessingModel = RECURRING_PROCESSING_MODELS.includes(value)
? value
: undefined;
break;
case "store":
data.store = value;
break;
case "merchantAccount":
data.merchantAccount = value;
break;
case "currency":
data.currency = value;
break;
case "tenderOption":
data.tenderOption = value;
break;
case "authorisationType":
data.authorisationType = value;
break;
case "ssc":
data.ssc = value;
break;
case "redemptionType":
data.redemptionType = value;
break;
default:
additionalData[key] = value;
break;
}
}
if (Object.keys(metadata).length > 0) {
data.metadata = metadata;
}
if (Object.keys(additionalData).length > 0) {
data.additionalData = additionalData;
}
return data;
}
exports.fromKeyValuePairs = fromKeyValuePairs;
/**
* Serializes a {@link SaleToAcquirerData} object to a JSON string.
*
* @param data The object to serialize.
* @returns JSON string representation.
*/
function toJson(data) {
return JSON.stringify(data);
}
exports.toJson = toJson;
/**
* Encodes a {@link SaleToAcquirerData} object to a Base64-encoded JSON string.
*
* @param data The object to encode.
* @returns Base64-encoded JSON representation.
*/
function toBase64(data) {
return Buffer.from(toJson(data), "utf8").toString("base64");
}
exports.toBase64 = toBase64;
/**
* Attempts to decode a Base64-encoded JSON object. Returns null when the input is not
* valid Base64 or does not decode to a JSON object.
*/
function tryDecodeBase64Json(raw) {
try {
const sanitized = raw.replace(/\s/g, "");
const decoded = Buffer.from(sanitized, "base64").toString("utf8");
if (decoded.trim().startsWith("{")) {
return JSON.parse(decoded);
}
return null;
}
catch (_a) {
return null;
}
}
//# sourceMappingURL=saleToAcquirerDataParser.js.map