103 lines
2.6 KiB
JavaScript
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
|
|
}; |