unmock-core
Version:
[][npmjs] [](https://circleci.com/gh/unmock/unmock-js) [](h
110 lines • 4.13 kB
JavaScript
;
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 });
const debug_1 = require("debug");
const readable = require("readable-stream");
const url = require("url");
const interfaces_1 = require("../interfaces");
const composite_1 = require("./deserializer/composite");
const form_1 = require("./deserializer/form");
const json_1 = require("./deserializer/json");
const composite_2 = require("./serializer/composite");
const form_2 = require("./serializer/form");
const json_2 = require("./serializer/json");
const CONTENT_TYPE_KEY = "content-type";
const MIME_JSON_TYPE = "application/json";
const debugLog = debug_1.default("unmock:node:serializer");
class BodySerializer extends readable.Transform {
static fromIncoming(incomingMessage) {
return __awaiter(this, void 0, void 0, function* () {
const serializer = new BodySerializer();
yield readable.pipeline(incomingMessage, serializer);
return serializer.body;
});
}
_transform(chunk, _, done) {
this.body = (this.body || "") + chunk.toString();
this.push(chunk);
done();
}
}
function extractVars(interceptedRequest) {
const headers = interceptedRequest.headers;
const hostWithPort = headers.host;
if (!hostWithPort) {
throw new Error("No host");
}
const host = hostWithPort.split(":")[0];
const { method: methodNode, url: requestUrl } = interceptedRequest;
if (!requestUrl) {
throw new Error("Missing request url.");
}
if (!methodNode) {
throw new Error("Missing method");
}
const { path, pathname, query } = url.parse(requestUrl, true);
if (!path) {
throw new Error("Could not parse path");
}
if (!pathname) {
throw new Error("Could not parse pathname");
}
const method = methodNode.toLowerCase();
if (!interfaces_1.isRESTMethod(method)) {
throw new Error(`Unknown REST method: ${method}`);
}
return {
headers,
host,
method,
path,
pathname,
query,
};
}
const hasContentTypeJson = (headers) => headers[CONTENT_TYPE_KEY] !== undefined &&
headers[CONTENT_TYPE_KEY].includes(MIME_JSON_TYPE);
const safelyParseJson = (body) => {
try {
return JSON.parse(body);
}
catch (err) {
debugLog(`Failed parsing body: ${body}`);
return body;
}
};
exports.serializeRequest = (interceptedRequest) => __awaiter(void 0, void 0, void 0, function* () {
const { headers, host, method, path, pathname, query } = extractVars(interceptedRequest);
const isEncrypted = interceptedRequest.connection.encrypted;
const protocol = isEncrypted ? "https" : "http";
const body = yield BodySerializer.fromIncoming(interceptedRequest);
const deserializedBody = body === undefined || !hasContentTypeJson(headers)
? body
: safelyParseJson(body);
const serializedRequest = {
body: deserializedBody,
headers,
host,
method,
path,
pathname,
protocol,
query,
};
return serializedRequest;
});
exports.CompositeDeserializer = composite_1.default;
exports.FormDeserializer = form_1.default;
exports.JSONDeserializer = json_1.default;
exports.CompositeSerializer = composite_2.default;
exports.FormSerializer = form_2.default;
exports.JSONSerializer = json_2.default;
//# sourceMappingURL=index.js.map