UNPKG

serverless-spy

Version:

CDK-based library for writing elegant integration tests on AWS serverless architecture and an additional web console to monitor events in real time.

57 lines (56 loc) 1.9 kB
import { Readable } from "stream"; import { timing } from "./timing"; const MIN_WAIT_TIME = 1000; export async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) { const headers = request.headers ?? {}; const expect = headers["Expect"] || headers["expect"]; let timeoutId = -1; let sendBody = true; if (expect === "100-continue") { sendBody = await Promise.race([ new Promise((resolve) => { timeoutId = Number(timing.setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs))); }), new Promise((resolve) => { httpRequest.on("continue", () => { timing.clearTimeout(timeoutId); resolve(true); }); httpRequest.on("response", () => { timing.clearTimeout(timeoutId); resolve(false); }); httpRequest.on("error", () => { timing.clearTimeout(timeoutId); resolve(false); }); }), ]); } if (sendBody) { writeBody(httpRequest, request.body); } } function writeBody(httpRequest, body) { if (body instanceof Readable) { body.pipe(httpRequest); return; } if (body) { if (Buffer.isBuffer(body) || typeof body === "string") { httpRequest.end(body); return; } const uint8 = body; if (typeof uint8 === "object" && uint8.buffer && typeof uint8.byteOffset === "number" && typeof uint8.byteLength === "number") { httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength)); return; } httpRequest.end(Buffer.from(body)); return; } httpRequest.end(); }