UNPKG

unmock-core

Version:

[![npm](https://img.shields.io/npm/v/unmock-core.svg)][npmjs] [![CircleCI](https://circleci.com/gh/unmock/unmock-js.svg?style=svg)](https://circleci.com/gh/unmock/unmock-js) [![codecov](https://codecov.io/gh/unmock/unmock-js/branch/dev/graph/badge.svg)](h

110 lines 4.13 kB
"use strict"; 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