UNPKG

connect-sdk-nodejs

Version:

SDK to communicate with the Worldline Global Collect platform using the Worldline Connect Server API

177 lines 8.16 kB
"use strict"; /* 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