Skip to content

Commit

Permalink
fix: abort and headers already sent errors for the rest api (#5722)
Browse files Browse the repository at this point in the history
* Fix the validator abort error

* Fix abort error

* Update the request handling for headers

* Update the request handling for headers

* Improve the check on the error

* Fix prittier error

* Revert the changes for the validator handler

* Revert the changes for the validator handler
  • Loading branch information
nazarhussain authored Jul 14, 2023
1 parent fbe9beb commit 96820d7
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 3 deletions.
11 changes: 10 additions & 1 deletion packages/api/src/beacon/server/events.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {ChainForkConfig} from "@lodestar/config";
import {ErrorAborted} from "@lodestar/utils";
import {Api, ReqTypes, routesData, getEventSerdes} from "../routes/events.js";
import {ServerRoutes} from "../../utils/server/index.js";
import {ServerApi} from "../../interfaces.js";
Expand Down Expand Up @@ -36,6 +37,9 @@ export function getRoutes(config: ChainForkConfig, api: ServerApi<Api>): ServerR
await new Promise<void>((resolve, reject) => {
void api.eventstream(req.query.topics, controller.signal, (event) => {
try {
// If the request is already aborted, we don't need to send any more events.
if (req.raw.destroyed) return;

const data = eventSerdes.toJson(event);
res.raw.write(serializeSSEEvent({event: event.type, data}));
} catch (e) {
Expand All @@ -49,7 +53,12 @@ export function getRoutes(config: ChainForkConfig, api: ServerApi<Api>): ServerR
// The client may disconnect and we need to clean the subscriptions.
req.raw.once("close", () => resolve());
req.raw.once("end", () => resolve());
req.raw.once("error", (err) => reject(err));
req.raw.once("error", (err) => {
if ((err as unknown as {code: string}).code === "ECONNRESET") {
return reject(new ErrorAborted());
}
return reject(err);
});
});

// api.eventstream will never stop, so no need to ever call `res.raw.end();`
Expand Down
4 changes: 2 additions & 2 deletions packages/cli/src/cmds/validator/signers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ export async function getSignersFromArgs(
const needle = showProgress({
total: keystoreDefinitions.length,
frequencyMs: KEYSTORE_IMPORT_PROGRESS_MS,
signal: signal,
signal,
progress: ({ratePerSec, percentage, current, total}) => {
logger.info(
`${percentage.toFixed(0)}% of keystores imported. current=${current} total=${total} rate=${(
Expand Down Expand Up @@ -119,7 +119,7 @@ export async function getSignersFromArgs(
const needle = showProgress({
total: keystoreDefinitions.length,
frequencyMs: KEYSTORE_IMPORT_PROGRESS_MS,
signal: signal,
signal,
progress: ({ratePerSec, percentage, current, total}) => {
logger.info(
`${percentage.toFixed(0)}% of local keystores imported. current=${current} total=${total} rate=${(
Expand Down

0 comments on commit 96820d7

Please sign in to comment.