@n1k1t/mock-server
Version:
Powerful util to setup mocks over HTTP APIs
82 lines • 3.76 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractHttpIncommingContext = exports.serializePayload = exports.parsePayload = exports.extractPayloadType = void 0;
const http_1 = require("http");
const querystring_1 = require("querystring");
const fast_xml_parser_1 = require("fast-xml-parser");
const url_1 = require("url");
const body_parser_1 = __importDefault(require("body-parser"));
const lodash_1 = __importDefault(require("lodash"));
const utils_1 = require("../../../utils");
const xmlParser = new fast_xml_parser_1.XMLParser({
ignoreAttributes: false,
});
const xmlBuilder = new fast_xml_parser_1.XMLBuilder({
ignoreAttributes: false,
});
const parseQuerySearch = (queryString) => Object.entries((0, querystring_1.parse)(queryString)).reduce((acc, [key, value]) => {
const valueAsJson = lodash_1.default.flatten([value]).map(arrValue => {
const parsingArrayValueAsJsonResult = (0, utils_1.parseJsonSafe)(arrValue ?? '');
return parsingArrayValueAsJsonResult.status === 'OK' ? parsingArrayValueAsJsonResult.result : arrValue;
});
return lodash_1.default.set(acc, key, valueAsJson?.length === 1 ? valueAsJson[0] : valueAsJson);
}, {});
const extractPayloadType = (headers) => {
const contentTypeKey = Object.keys(headers).find((key) => key.toLowerCase() === 'content-type');
const contextType = lodash_1.default.flatten([lodash_1.default.get(headers, contentTypeKey ?? '', '')]).join(',').toLowerCase();
if (contextType.includes('application/json')) {
return 'json';
}
if (contextType.includes('/xml')) {
return 'xml';
}
return null;
};
exports.extractPayloadType = extractPayloadType;
const parsePayload = (type, payload) => {
if (type === 'json') {
const parsed = (0, utils_1.parseJsonSafe)(payload.toString());
return parsed.status === 'OK' ? parsed.result : undefined;
}
if (type === 'xml') {
return xmlParser.parse(payload) ?? undefined;
}
return undefined;
};
exports.parsePayload = parsePayload;
const serializePayload = (type, payload) => {
if (type === 'json') {
return Buffer.from(JSON.stringify(payload));
}
if (type === 'xml') {
return Buffer.from(xmlBuilder.build(payload ?? {}));
}
return undefined;
};
exports.serializePayload = serializePayload;
const extractHttpIncommingContext = async (request) => {
const { pathname, query: rawQuery } = (0, url_1.parse)(request.url ?? '');
const type = (0, exports.extractPayloadType)(request.headers) ?? 'plain';
const query = parseQuerySearch(rawQuery ?? '');
const headers = Object
.entries(request.headers)
.map(([name, values]) => [name.toLowerCase(), lodash_1.default.flatten([values]).map((value) => String(value)).sort().join(',')])
.reduce((acc, [name, value]) => lodash_1.default.set(acc, name, value), {});
const dataRaw = await new Promise((resolve, reject) => body_parser_1.default.raw({ limit: '10mb', type: '*/*' })(request, new http_1.ServerResponse(request), (error) => error
? reject(error)
: resolve(Buffer.isBuffer(lodash_1.default.get(request, 'body')) ? lodash_1.default.get(request, 'body') : null)));
return {
type,
method: String(request.method ?? 'GET').toUpperCase(),
path: pathname ?? '/',
headers,
query,
data: dataRaw ? (0, exports.parsePayload)(type, dataRaw) : undefined,
dataRaw: dataRaw ?? undefined,
};
};
exports.extractHttpIncommingContext = extractHttpIncommingContext;
//# sourceMappingURL=utils.js.map