node-ejs-renderer/node_modules/webpack-dev-middleware/dist/utils/compatibleAPI.js
2024-06-09 13:55:01 -04:00

103 lines
2.6 KiB
JavaScript

"use strict";
/** @typedef {import("../index.js").IncomingMessage} IncomingMessage */
/** @typedef {import("../index.js").ServerResponse} ServerResponse */
/**
* @typedef {Object} ExpectedResponse
* @property {(status: number) => void} [status]
* @property {(data: any) => void} [send]
* @property {(data: any) => void} [pipeInto]
*/
/**
* @template {ServerResponse & ExpectedResponse} Response
* @param {Response} res
* @param {number} code
*/
function setStatusCode(res, code) {
// Pseudo API
if (typeof res.status === "function") {
res.status(code);
return;
}
// Node.js API
// eslint-disable-next-line no-param-reassign
res.statusCode = code;
}
/**
* @template {ServerResponse} Response
* @param {Response & ExpectedResponse} res
* @param {import("fs").ReadStream} bufferOrStream
*/
function pipe(res, bufferOrStream) {
// Pseudo API and Koa API
if (typeof ( /** @type {Response & ExpectedResponse} */res.pipeInto) === "function") {
// Writable stream into Readable stream
res.pipeInto(bufferOrStream);
return;
}
// Node.js API and Express API and Hapi API
bufferOrStream.pipe(res);
}
/**
* @template {IncomingMessage} Request
* @template {ServerResponse} Response
* @param {Response & ExpectedResponse} res
* @param {string | Buffer} bufferOrStream
*/
function send(res, bufferOrStream) {
// Pseudo API and Express API and Koa API
if (typeof res.send === "function") {
res.send(bufferOrStream);
return;
}
res.end(bufferOrStream);
}
/**
* @param {string} filename
* @param {import("../index").OutputFileSystem} outputFileSystem
* @param {number} start
* @param {number} end
* @returns {{ bufferOrStream: (Buffer | import("fs").ReadStream), byteLength: number }}
*/
function createReadStreamOrReadFileSync(filename, outputFileSystem, start, end) {
/** @type {string | Buffer | import("fs").ReadStream} */
let bufferOrStream;
/** @type {number} */
let byteLength;
// Stream logic
const isFsSupportsStream = typeof outputFileSystem.createReadStream === "function";
if (isFsSupportsStream) {
bufferOrStream = /** @type {import("fs").createReadStream} */
outputFileSystem.createReadStream(filename, {
start,
end
});
// Handle files with zero bytes
byteLength = end === 0 ? 0 : end - start + 1;
} else {
bufferOrStream = /** @type {import("fs").readFileSync} */
outputFileSystem.readFileSync(filename);
({
byteLength
} = bufferOrStream);
}
return {
bufferOrStream,
byteLength
};
}
module.exports = {
setStatusCode,
send,
pipe,
createReadStreamOrReadFileSync
};