Skip to content

Commit

Permalink
fix: logic
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-akait committed Jul 17, 2024
1 parent 21302d1 commit a8abd99
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 20 deletions.
38 changes: 27 additions & 11 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -333,22 +333,40 @@ function hapiWrapper() {
// @ts-ignore
server.decorate("server", "webpackDevMiddleware", devMiddleware);
// @ts-ignore
server.ext("onRequest", (request, h) =>
new Promise((resolve, reject) => {
server.ext("onRequest", (request, h) => new Promise((resolve, reject) => {
let isFinished = false;

/**
* @param {string | Buffer} [data]
*/
request.raw.res.send = (data) => {
isFinished = true;
request.raw.res.end(data);
};

/**
* @param {string | Buffer} [data]
*/
request.raw.res.finish = (data) => {
isFinished = true;
request.raw.res.end(data);
};

devMiddleware(request.raw.req, request.raw.res, (error) => {
if (error) {
reject(error);
return;
}

resolve(request);
if (!isFinished) {
resolve(request);
}
});
})
.then(() => h.continue)
.catch((error) => {
throw error;
}),
);
}));
},
};
}
Expand Down Expand Up @@ -392,6 +410,8 @@ function koaWrapper(compiler, options) {
ctx.status = statusCode;
};

res.getReadyReadableStreamState = () => "open";

try {
await new Promise(
/**
Expand All @@ -405,15 +425,13 @@ function koaWrapper(compiler, options) {
res.stream = (stream) => {
// eslint-disable-next-line no-param-reassign
ctx.body = stream;
resolve();
};
/**
* @param {string | Buffer} data data
*/
res.send = (data) => {
// eslint-disable-next-line no-param-reassign
ctx.body = data;
resolve();
};

/**
Expand All @@ -423,7 +441,6 @@ function koaWrapper(compiler, options) {
// eslint-disable-next-line no-param-reassign
ctx.status = status;
res.end(data);
resolve();
};

devMiddleware(req, res, (err) => {
Expand Down Expand Up @@ -546,6 +563,8 @@ function honoWrapper(compiler, options) {
// Do nothing, because we set it before
};

res.getReadyReadableStreamState = () => "readable";

/**
* @param {string | Buffer | ReadStream} [data]
*/
Expand Down Expand Up @@ -577,23 +596,20 @@ function honoWrapper(compiler, options) {
*/
res.stream = (stream) => {
responseHandler(stream);
resolve();
};

/**
* @param {string | Buffer} data data
*/
res.send = (data) => {
responseHandler(data);
resolve();
};

/**
* @param {string | Buffer} [data] data
*/
res.finish = (data) => {
responseHandler(data);
resolve();
};

devMiddleware(req, res, (err) => {
Expand Down
26 changes: 17 additions & 9 deletions src/middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const {
getOutgoing,
initState,
setState,
getReadyReadableStreamState,
} = require("./utils/compatibleAPI");
const ready = require("./utils/ready");
const parseTokenList = require("./utils/parseTokenList");
Expand Down Expand Up @@ -482,7 +483,7 @@ function wrapper(context) {
sendError(extra.errorCode, {
modifyResponseData: context.options.modifyResponseData,
});

await goNext();
return;
}

Expand Down Expand Up @@ -631,7 +632,7 @@ function wrapper(context) {
sendError(412, {
modifyResponseData: context.options.modifyResponseData,
});

await goNext();
return;
}

Expand All @@ -656,7 +657,7 @@ function wrapper(context) {
removeResponseHeader(res, "Content-Type");

finish(res);

await goNext();
return;
}
}
Expand Down Expand Up @@ -688,7 +689,7 @@ function wrapper(context) {
},
modifyResponseData: context.options.modifyResponseData,
});

await goNext();
return;
} else if (parsedRanges === -2) {
context.logger.error(
Expand Down Expand Up @@ -757,6 +758,7 @@ function wrapper(context) {
}

finish(res);
await goNext();
return;
}

Expand All @@ -771,6 +773,7 @@ function wrapper(context) {

if (!isPipeSupports) {
send(res, /** @type {Buffer} */ (bufferOrStream));
await goNext();
return;
}

Expand All @@ -784,11 +787,16 @@ function wrapper(context) {

// Error handling
/** @type {import("fs").ReadStream} */
(bufferOrStream).on("error", (error) => {
// clean up stream early
cleanup();
errorHandler(error);
});
(bufferOrStream)
.on("error", (error) => {
// clean up stream early
cleanup();
errorHandler(error);
goNext();
})
.on(getReadyReadableStreamState(res), () => {
goNext();
});

pipe(res, /** @type {ReadStream} */ (bufferOrStream));

Expand Down
16 changes: 16 additions & 0 deletions src/utils/compatibleAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
* @property {(data: any) => void} [stream]
* @property {() => any} [getOutgoing]
* @property {(name: string, value: any) => void} [setState]
* @property {() => "ready" | "open" | "readable"} [getReadyReadableStreamState]
*/

/**
Expand Down Expand Up @@ -281,6 +282,20 @@ function setState(res, name, value) {
(res.locals)[name] = value;
}

/**
* @template {ServerResponse & ExpectedServerResponse} Response
* @param {Response} res
* @returns {"ready" | "open" | "readable"}
*/
function getReadyReadableStreamState(res) {
// Pseudo API and Express API and Koa API
if (typeof res.getReadyReadableStreamState === "function") {
return res.getReadyReadableStreamState();
}

return "ready";
}

module.exports = {
setStatusCode,
getStatusCode,
Expand All @@ -298,4 +313,5 @@ module.exports = {
getOutgoing,
initState,
setState,
getReadyReadableStreamState,
};
12 changes: 12 additions & 0 deletions types/utils/compatibleAPI.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ export type ExpectedServerResponse = {
stream?: ((data: any) => void) | undefined;
getOutgoing?: (() => any) | undefined;
setState?: ((name: string, value: any) => void) | undefined;
getReadyReadableStreamState?:
| (() => "ready" | "open" | "readable")
| undefined;
};
/**
* @template {ServerResponse & ExpectedServerResponse} Response
Expand Down Expand Up @@ -62,6 +65,7 @@ export function getStatusCode<
* @property {(data: any) => void} [stream]
* @property {() => any} [getOutgoing]
* @property {(name: string, value: any) => void} [setState]
* @property {() => "ready" | "open" | "readable"} [getReadyReadableStreamState]
*/
/**
* @template {IncomingMessage & ExpectedIncomingMessage} Request
Expand Down Expand Up @@ -193,3 +197,11 @@ export function initState<
export function setState<
Response extends ServerResponse & ExpectedServerResponse,
>(res: Response, name: string, value: any): void;
/**
* @template {ServerResponse & ExpectedServerResponse} Response
* @param {Response} res
* @returns {"ready" | "open" | "readable"}
*/
export function getReadyReadableStreamState<
Response extends ServerResponse & ExpectedServerResponse,
>(res: Response): "ready" | "open" | "readable";

0 comments on commit a8abd99

Please sign in to comment.