mirror of
https://github.com/denoland/deno.git
synced 2025-08-04 02:48:24 +00:00
perf(ext/node): lazily listen to the abort signal of request object (#29071)
This commit is contained in:
parent
2221cf3e7c
commit
d1f7969570
1 changed files with 20 additions and 7 deletions
|
@ -130,15 +130,18 @@ function validateHost(host, name) {
|
|||
|
||||
const INVALID_PATH_REGEX = /[^\u0021-\u00ff]/;
|
||||
const kError = Symbol("kError");
|
||||
const kBindToAbortSignal = Symbol("kBindToAbortSignal");
|
||||
|
||||
class FakeSocket extends EventEmitter {
|
||||
/** Stores the underlying request for lazily binding to abort signal */
|
||||
#request: Request | undefined;
|
||||
constructor(
|
||||
opts: {
|
||||
encrypted?: boolean | undefined;
|
||||
remotePort?: number | undefined;
|
||||
remoteAddress?: string | undefined;
|
||||
reader?: ReadableStreamDefaultReader | undefined;
|
||||
signal?: AbortSignal | undefined;
|
||||
request?: Request;
|
||||
} = {},
|
||||
) {
|
||||
super();
|
||||
|
@ -148,8 +151,13 @@ class FakeSocket extends EventEmitter {
|
|||
this.reader = opts.reader;
|
||||
this.writable = true;
|
||||
this.readable = true;
|
||||
opts.signal?.addEventListener("abort", () => {
|
||||
this.emit("error", opts.signal?.reason ?? new Error("aborted"));
|
||||
this.#request = opts.request;
|
||||
}
|
||||
|
||||
[kBindToAbortSignal]() {
|
||||
const signal = this.#request?.signal;
|
||||
signal?.addEventListener("abort", () => {
|
||||
this.emit("error", signal.reason);
|
||||
this.emit("close");
|
||||
}, { once: true });
|
||||
}
|
||||
|
@ -1499,9 +1507,14 @@ export const ServerResponse = function (
|
|||
this._readable = readable;
|
||||
this._resolve = resolve;
|
||||
this.socket = socket;
|
||||
this.socket?.on("close", () => {
|
||||
if (!this.finished) {
|
||||
this.end();
|
||||
this.on("newListener", (event) => {
|
||||
if (event === "close") {
|
||||
this.socket?.[kBindToAbortSignal]();
|
||||
this.socket?.on("close", () => {
|
||||
if (!this.finished) {
|
||||
this.emit("close");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
this._header = "";
|
||||
|
@ -1936,7 +1949,7 @@ export class ServerImpl extends EventEmitter {
|
|||
remotePort: info.remoteAddr.port,
|
||||
encrypted: this._encrypted,
|
||||
reader: request.body?.getReader(),
|
||||
signal: request.signal,
|
||||
request,
|
||||
});
|
||||
|
||||
const req = new IncomingMessageForServer(socket);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue