connect-sdk-nodejs
Version:
SDK to communicate with the Worldline Global Collect platform using the Worldline Connect Server API
177 lines • 8.16 kB
JavaScript
;
/* eslint-disable @typescript-eslint/no-non-null-assertion */
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.multipart = exports.json = void 0;
const _ = require("lodash");
const uuid = require("uuid");
const headers = require("../utils/headers");
const connection_1 = require("../utils/connection");
function prepareRequest(request, sdkContext, options, contentType) {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function* () {
const date = headers.date();
let path = request.modulePath;
if (request.paymentContext) {
let separator = "?";
for (const key in request.paymentContext) {
if (key !== "extraHeaders" && key !== "idempotence") {
if (Array.isArray(request.paymentContext[key])) {
for (const value of request.paymentContext[key]) {
path += `${separator + key}=${value}`;
separator = "&";
}
}
else {
path += `${separator + key}=${request.paymentContext[key]}`;
separator = "&";
}
}
}
}
const extraHeaders = [];
options.path = path;
options.method = request.method;
options.headers = options.headers || {};
options.headers["Date"] = date;
options.headers["Content-Type"] = contentType;
if ((_a = request.paymentContext) === null || _a === void 0 ? void 0 : _a.extraHeaders) {
for (const header of request.paymentContext.extraHeaders) {
options.headers[header.key] = _.trim(header.value.replace(/\r?\n[\\s&&[^\r\n]]*/g, " "));
extraHeaders.push(header);
}
}
// add idempotence header
if ((_b = request.paymentContext) === null || _b === void 0 ? void 0 : _b.idempotence) {
const idempotenceKey = request.paymentContext.idempotence.key;
const idempotenceHeader = {
key: "X-GCS-Idempotence-Key",
value: idempotenceKey
};
options.headers[idempotenceHeader.key] = idempotenceHeader.value;
extraHeaders.push(idempotenceHeader);
}
// add X-GCS-ServerMetaInfo
const serverMetaInfo = headers.serverMetaInfo(sdkContext);
options.headers[serverMetaInfo.key] = serverMetaInfo.value;
extraHeaders.push(serverMetaInfo);
const authorization = yield sdkContext.getAuthenticator().getAuthorization(request.method, contentType, date, extraHeaders, options.path);
options.headers.Authorization = authorization;
const proxy = sdkContext.getProxy();
if (proxy) {
options.path = `${options.protocol}//${options.host}:${options.port}${options.path}`;
options.host = proxy.host;
options.protocol = ((_c = proxy.scheme) !== null && _c !== void 0 ? _c : "http") + ":";
options.port = (_d = proxy.port) !== null && _d !== void 0 ? _d : 3128;
if (proxy.credentials) {
options.headers["Proxy-Authorization"] = "Basic " + Buffer.from(proxy.credentials).toString("base64");
}
}
const connectionOptions = sdkContext.getConnectionOptions();
if (connectionOptions === null || connectionOptions === void 0 ? void 0 : connectionOptions.agent) {
options.agent = connectionOptions.agent;
}
});
}
function handleResponse(response, paymentContext, expectBinaryResponse, resolve, reject) {
const idempotenceRequestTimestamp = response.headers["x-gcs-idempotence-request-timestamp"];
if (idempotenceRequestTimestamp && (paymentContext === null || paymentContext === void 0 ? void 0 : paymentContext.idempotence)) {
paymentContext.idempotence.requestTimestamp = idempotenceRequestTimestamp;
}
const statusCode = response.statusCode;
const isSuccess = statusCode >= 200 && statusCode < 300;
const contentType = response.headers["content-type"];
// Resolve to a binary response if a) the caller expects a binary response and the response is successful, or b) the response is actually binary
// Error JSON responses are still resolved as objects
if ((expectBinaryResponse && isSuccess) || headers.isBinaryContent(contentType)) {
// The response is actually either an SdkBinarySuccessResponse or (unlikely) an SdkBinaryErrorResponse
// Those are compatible with SdkSuccessResponse<Readable> and SdkErrorResponse<Readable> respectively but with an extra "file" property
resolve({
status: statusCode,
body: response,
isSuccess,
file: {
contentType,
contentLength: headers.contentLength(response.headers),
filename: headers.dispositionFilename(response.headers)
}
});
}
else {
let body = "";
response.setEncoding("utf8");
response.on("data", chunk => {
body += chunk;
});
response.on("end", () => {
try {
body = body ? JSON.parse(body) : null;
resolve({
status: statusCode,
body,
isSuccess
});
}
catch (e) {
const error = e;
error.status = statusCode;
error.body = body;
reject(error);
}
});
}
}
function createOptions(sdkContext) {
const endpoint = sdkContext.getEndpoint();
return {
host: endpoint.host,
port: endpoint.port,
protocol: endpoint.scheme + ":"
};
}
function json(request, sdkContext) {
return __awaiter(this, void 0, void 0, function* () {
const options = createOptions(sdkContext);
yield prepareRequest(request, sdkContext, options, "application/json");
return new Promise((resolve, reject) => {
(0, connection_1.sendJSON)(options, request.body, sdkContext, (error, response) => {
var _a;
if (error) {
reject(error);
}
else {
handleResponse(response, request.paymentContext, (_a = request.expectBinaryResponse) !== null && _a !== void 0 ? _a : false, resolve, reject);
}
});
});
});
}
exports.json = json;
function multipart(request, sdkContext) {
return __awaiter(this, void 0, void 0, function* () {
const options = createOptions(sdkContext);
const boundary = uuid.v4();
yield prepareRequest(request, sdkContext, options, "multipart/form-data; boundary=" + boundary);
return new Promise((resolve, reject) => {
(0, connection_1.sendMultipart)(options, request.body, boundary, sdkContext, (error, response) => {
var _a;
if (error) {
reject(error);
}
else {
handleResponse(response, request.paymentContext, (_a = request.expectBinaryResponse) !== null && _a !== void 0 ? _a : false, resolve, reject);
}
});
});
});
}
exports.multipart = multipart;
//# sourceMappingURL=communicator.js.map