diff --git a/.eslintrc.js b/.eslintrc.js index 10578855d2d2..4fb1a39aee30 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -117,6 +117,8 @@ module.exports = { quotes: ["error", "double"], semi: "off", "no-restricted-imports": ["error", {patterns: ["../lib/*", "@chainsafe/*/lib/*"]}], + // Force to add names to all functions to ease CPU profiling + "func-names": ["error", "always"], // Prevents accidentally pushing a commit with .only in Mocha tests "no-only-tests/no-only-tests": "error", @@ -127,6 +129,7 @@ module.exports = { rules: { "import/no-extraneous-dependencies": "off", "@typescript-eslint/no-explicit-any": "off", + "func-names": "off", }, }, { diff --git a/packages/api/src/client/events.ts b/packages/api/src/client/events.ts index f677c6c3e37b..ce7bb854850a 100644 --- a/packages/api/src/client/events.ts +++ b/packages/api/src/client/events.ts @@ -28,7 +28,7 @@ export function getClient(_config: IChainForkConfig, baseUrl: string): Api { // EventSource will try to reconnect always on all errors // `eventSource.onerror` events are informative but don't indicate the EventSource closed // The only way to abort the connection from the client is via eventSource.close() - eventSource.onerror = function (err) { + eventSource.onerror = function onerror(err) { const errEs = (err as unknown) as EventSourceError; // Consider 400 and 500 status errors unrecoverable, close the eventsource if (errEs.status === 400) { diff --git a/packages/api/src/utils/urlFormat.ts b/packages/api/src/utils/urlFormat.ts index 7481bff97aa3..bbd48d835120 100644 --- a/packages/api/src/utils/urlFormat.ts +++ b/packages/api/src/utils/urlFormat.ts @@ -65,7 +65,7 @@ export function compileRouteUrlFormater(path: string): (arg: Args) => string { } }); - return function (args: Args) { + return function urlFormater(args: Args) { // Don't use .map() or .join(), it's x3 slower let s = ""; for (const fn of fns) s += fn(args); diff --git a/packages/beacon-state-transition/src/allForks/util/cachedBeaconState.ts b/packages/beacon-state-transition/src/allForks/util/cachedBeaconState.ts index 740f827e0d7a..c8fae559bd68 100644 --- a/packages/beacon-state-transition/src/allForks/util/cachedBeaconState.ts +++ b/packages/beacon-state-transition/src/allForks/util/cachedBeaconState.ts @@ -34,6 +34,7 @@ import { import {getNextSyncCommittee} from "../../altair/epoch/sync_committee"; import {ssz} from "@chainsafe/lodestar-types"; import {CachedInactivityScoreList, CachedInactivityScoreListProxyHandler} from "./cachedInactivityScoreList"; +import {newFilledArray} from "../../util"; /** * `BeaconState` with various caches @@ -79,12 +80,8 @@ export function createCachedBeaconState( }; currIndexedSyncCommittee = emptyIndexedSyncCommittee; nextIndexedSyncCommittee = emptyIndexedSyncCommittee; - cachedPreviousParticipation = MutableVector.from( - Array.from({length: cachedValidators.length}, () => emptyParticipationStatus) - ); - cachedCurrentParticipation = MutableVector.from( - Array.from({length: cachedValidators.length}, () => emptyParticipationStatus) - ); + cachedPreviousParticipation = MutableVector.from(newFilledArray(cachedValidators.length, emptyParticipationStatus)); + cachedCurrentParticipation = MutableVector.from(newFilledArray(cachedValidators.length, emptyParticipationStatus)); cachedInactivityScores = MutableVector.empty(); } else { const {pubkey2index} = epochCtx; diff --git a/packages/cli/src/util/file.ts b/packages/cli/src/util/file.ts index c71844434e69..2c6f2e9ca7d2 100644 --- a/packages/cli/src/util/file.ts +++ b/packages/cli/src/util/file.ts @@ -11,7 +11,7 @@ export const yamlSchema = new Schema({ implicit: [ new Type("tag:yaml.org,2002:str", { kind: "scalar", - construct: function (data) { + construct: function construct(data) { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return data !== null ? data : ""; }, diff --git a/packages/cli/src/util/process.ts b/packages/cli/src/util/process.ts index 39d1d9741458..cd040bdffb55 100644 --- a/packages/cli/src/util/process.ts +++ b/packages/cli/src/util/process.ts @@ -12,10 +12,10 @@ export function onGracefulShutdown( logFn: (msg: string) => void = console.log ): void { for (const signal of exitSignals) { - process.once(signal, async () => { + process.once(signal, async function onSignal() { logFn("Stopping gracefully, use Ctrl+C again to force process exit"); - process.on(signal, () => { + process.on(signal, function onSecondSignal() { logFn("Forcing process exit"); process.exit(1); }); diff --git a/packages/lodestar/src/network/gossip/validation/index.ts b/packages/lodestar/src/network/gossip/validation/index.ts index f16c885d876b..cbe7d523a928 100644 --- a/packages/lodestar/src/network/gossip/validation/index.ts +++ b/packages/lodestar/src/network/gossip/validation/index.ts @@ -60,7 +60,7 @@ function getGossipValidatorFn( const {config, logger, metrics, uncompressCache, gossipTopicCache} = modules; const getGossipObjectAcceptMetadata = getGossipAcceptMetadataByType[type] as GetGossipAcceptMetadataFn; - return async function (topicStr, gossipMsg) { + return async function gossipValidatorFn(topicStr, gossipMsg) { try { const topic = gossipTopicCache.getTopic(topicStr); const encoding = topic.encoding ?? DEFAULT_ENCODING; diff --git a/packages/lodestar/src/network/gossip/validation/queue.ts b/packages/lodestar/src/network/gossip/validation/queue.ts index cab21de08c6a..d2b1335e84b4 100644 --- a/packages/lodestar/src/network/gossip/validation/queue.ts +++ b/packages/lodestar/src/network/gossip/validation/queue.ts @@ -52,7 +52,7 @@ export function wrapWithQueue( : undefined ); - return async function (topicStr, gossipMsg) { + return async function gossipValidatorFnWithQueue(topicStr, gossipMsg) { await jobQueue.push(async () => gossipValidatorFn(topicStr, gossipMsg)); }; } diff --git a/packages/lodestar/src/network/network.ts b/packages/lodestar/src/network/network.ts index 9a15e13db911..1e2c4aee1713 100644 --- a/packages/lodestar/src/network/network.ts +++ b/packages/lodestar/src/network/network.ts @@ -120,7 +120,7 @@ export class Network implements INetwork { ); this.chain.emitter.on(ChainEvent.clockEpoch, this.onEpoch); - modules.signal.addEventListener("abort", () => this.close(), {once: true}); + modules.signal.addEventListener("abort", this.close.bind(this), {once: true}); } /** Destroy this instance. Can only be called once. */ diff --git a/packages/lodestar/src/network/peers/peerManager.ts b/packages/lodestar/src/network/peers/peerManager.ts index 3e72aef6ddff..2a175f8f1728 100644 --- a/packages/lodestar/src/network/peers/peerManager.ts +++ b/packages/lodestar/src/network/peers/peerManager.ts @@ -119,8 +119,8 @@ export class PeerManager { // On start-up will connected to existing peers in libp2p.peerStore, same as autoDial behaviour this.heartbeat(); this.intervals = [ - setInterval(() => this.pingAndStatusTimeouts(), CHECK_PING_STATUS_INTERVAL), - setInterval(() => this.heartbeat(), HEARTBEAT_INTERVAL_MS), + setInterval(this.pingAndStatusTimeouts.bind(this), CHECK_PING_STATUS_INTERVAL), + setInterval(this.heartbeat.bind(this), HEARTBEAT_INTERVAL_MS), ]; } diff --git a/packages/lodestar/src/network/reqresp/encoders/requestDecode.ts b/packages/lodestar/src/network/reqresp/encoders/requestDecode.ts index dc62d56c97ad..68f6fb238f34 100644 --- a/packages/lodestar/src/network/reqresp/encoders/requestDecode.ts +++ b/packages/lodestar/src/network/reqresp/encoders/requestDecode.ts @@ -12,7 +12,7 @@ import {readEncodedPayload} from "../encodingStrategies"; export function requestDecode( protocol: Pick ): (source: AsyncIterable) => Promise { - return async function (source) { + return async function requestDecodeSink(source) { const type = getRequestSzzTypeByMethod(protocol.method); if (!type) { // method has no body diff --git a/packages/lodestar/src/network/reqresp/encoders/responseDecode.ts b/packages/lodestar/src/network/reqresp/encoders/responseDecode.ts index 0c09d8855d5d..be791fd5a621 100644 --- a/packages/lodestar/src/network/reqresp/encoders/responseDecode.ts +++ b/packages/lodestar/src/network/reqresp/encoders/responseDecode.ts @@ -33,7 +33,7 @@ export function responseDecode( forkDigestContext: IForkDigestContext, protocol: Protocol ): (source: AsyncIterable) => AsyncGenerator { - return async function* (source) { + return async function* responseDecodeSink(source) { const deserializeToTree = deserializeToTreeByMethod[protocol.method]; const contextBytesType = contextBytesTypeByProtocol(protocol); const bufferedSource = new BufferedSource(source as AsyncGenerator); diff --git a/packages/lodestar/src/network/reqresp/encoders/responseEncode.ts b/packages/lodestar/src/network/reqresp/encoders/responseEncode.ts index 11ee85a2febc..526317c26bb5 100644 --- a/packages/lodestar/src/network/reqresp/encoders/responseEncode.ts +++ b/packages/lodestar/src/network/reqresp/encoders/responseEncode.ts @@ -31,7 +31,7 @@ export function responseEncodeSuccess( ): (source: AsyncIterable) => AsyncIterable { const contextBytesType = contextBytesTypeByProtocol(protocol); - return async function* (source) { + return async function* responseEncodeSuccessTransform(source) { for await (const chunk of source) { // yield Buffer.from([RespStatus.SUCCESS]); diff --git a/packages/lodestar/src/network/reqresp/request/responseTimeoutsHandler.ts b/packages/lodestar/src/network/reqresp/request/responseTimeoutsHandler.ts index 219af205eb9c..22080feb005f 100644 --- a/packages/lodestar/src/network/reqresp/request/responseTimeoutsHandler.ts +++ b/packages/lodestar/src/network/reqresp/request/responseTimeoutsHandler.ts @@ -20,7 +20,7 @@ export function responseTimeoutsHandler( responseDecoder: (source: AsyncIterable) => AsyncGenerator, options?: Partial ): (source: AsyncIterable) => AsyncGenerator { - return async function* (source) { + return async function* responseTimeoutsHandlerTransform(source) { const {TTFB_TIMEOUT, RESP_TIMEOUT} = {...timeoutOptions, ...options}; const ttfbTimeoutController = new AbortController(); diff --git a/packages/lodestar/src/network/reqresp/response/index.ts b/packages/lodestar/src/network/reqresp/response/index.ts index effb87a4623b..615afeda82cc 100644 --- a/packages/lodestar/src/network/reqresp/response/index.ts +++ b/packages/lodestar/src/network/reqresp/response/index.ts @@ -56,7 +56,7 @@ export async function handleRequest( // Yields success chunks and error chunks in the same generator // This syntax allows to recycle stream.sink to send success and error chunks without returning // in case request whose body is a List fails at chunk_i > 0, without breaking out of the for..await..of - (async function* () { + (async function* requestHandlerSource() { try { const requestBody = await withTimeout( () => pipe(stream.source, requestDecode(protocol)), diff --git a/packages/lodestar/src/network/reqresp/utils/onChunk.ts b/packages/lodestar/src/network/reqresp/utils/onChunk.ts index b3d8a1e77b78..4ca4a2ceed94 100644 --- a/packages/lodestar/src/network/reqresp/utils/onChunk.ts +++ b/packages/lodestar/src/network/reqresp/utils/onChunk.ts @@ -3,7 +3,7 @@ * Useful for logging, or cancelling timeouts */ export function onChunk(callback: (chunk: T) => void): (source: AsyncIterable) => AsyncIterable { - return async function* (source) { + return async function* onChunkTransform(source) { for await (const chunk of source) { callback(chunk); yield chunk; diff --git a/packages/lodestar/src/util/io.ts b/packages/lodestar/src/util/io.ts deleted file mode 100644 index 46a06bae5489..000000000000 --- a/packages/lodestar/src/util/io.ts +++ /dev/null @@ -1,25 +0,0 @@ -import readline from "readline"; - -interface IHiddenReadlineInterface extends readline.Interface { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - output?: {write: (arg0: string) => void}; - // eslint-disable-next-line @typescript-eslint/naming-convention - _writeToOutput?(stringToWrite: string): void; -} - -export function promptPassword(passwordPrompt: string): Promise { - const rl: IHiddenReadlineInterface = readline.createInterface({input: process.stdin, output: process.stdout}); - - // eslint-disable-next-line @typescript-eslint/naming-convention - rl._writeToOutput = function _writeToOutput(stringToWrite: string): void { - if (stringToWrite === passwordPrompt || stringToWrite.match(/\n/g)) rl.output?.write(stringToWrite); - else rl.output?.write("*"); - }; - - return new Promise((resolve): void => { - rl.question(passwordPrompt, function (password: string): void { - rl.close(); - resolve(password); - }); - }); -} diff --git a/packages/lodestar/test/utils/network.ts b/packages/lodestar/test/utils/network.ts index e725dd5c8dc4..9dab7b1758d4 100644 --- a/packages/lodestar/test/utils/network.ts +++ b/packages/lodestar/test/utils/network.ts @@ -40,14 +40,14 @@ export async function disconnect(network: Network, peer: PeerId): Promise export function onPeerConnect(network: Network): Promise { return new Promise((resolve) => // eslint-disable-next-line @typescript-eslint/no-unsafe-return - network["libp2p"].connectionManager.on(Libp2pEvent.peerConnect, () => resolve()) + network["libp2p"].connectionManager.on(Libp2pEvent.peerConnect, resolve) ); } export function onPeerDisconnect(network: Network): Promise { return new Promise((resolve) => // eslint-disable-next-line @typescript-eslint/no-unsafe-return - network["libp2p"].connectionManager.on(Libp2pEvent.peerDisconnect, () => resolve()) + network["libp2p"].connectionManager.on(Libp2pEvent.peerDisconnect, resolve) ); } diff --git a/packages/spec-test-util/src/multi.ts b/packages/spec-test-util/src/multi.ts index 7d3c2f77c36c..cc0a657ba078 100644 --- a/packages/spec-test-util/src/multi.ts +++ b/packages/spec-test-util/src/multi.ts @@ -1,8 +1,15 @@ -/* eslint-disable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any,@typescript-eslint/no-unused-vars */ -import {writeFile} from "fs"; import {expect} from "chai"; import {loadYamlFile} from "./util"; +/* eslint-disable + @typescript-eslint/no-unsafe-call, + @typescript-eslint/no-unsafe-member-access, + @typescript-eslint/no-unsafe-return, + @typescript-eslint/no-unsafe-assignment, + @typescript-eslint/no-explicit-any, + @typescript-eslint/no-unused-vars, + func-names */ + export interface IBaseCase { description: string; } @@ -23,8 +30,6 @@ interface TestSpec { testCases: TestCase[]; } -const env = process.env; - /** * Run yaml Eth2.0 bulk spec tests (m) for a certain function * Compares actual vs expected for all test cases diff --git a/packages/spec-test-util/src/single.ts b/packages/spec-test-util/src/single.ts index 0c9bf932bd12..f3cede7b66f7 100644 --- a/packages/spec-test-util/src/single.ts +++ b/packages/spec-test-util/src/single.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-explicit-any */ import {expect} from "chai"; import {readdirSync, readFileSync, existsSync} from "fs"; import {basename, join, parse} from "path"; @@ -6,6 +5,13 @@ import {Type, CompositeType} from "@chainsafe/ssz"; import {uncompress} from "snappyjs"; import {isDirectory, loadYamlFile} from "./util"; +/* eslint-disable + @typescript-eslint/no-unsafe-assignment, + @typescript-eslint/no-unsafe-member-access, + @typescript-eslint/no-unsafe-return, + @typescript-eslint/no-explicit-any, + func-names */ + export enum InputType { SSZ = "ssz", SSZ_SNAPPY = "ssz_snappy", diff --git a/packages/utils/src/yaml/int.ts b/packages/utils/src/yaml/int.ts index 72f02e7e43a9..d36806ea9953 100644 --- a/packages/utils/src/yaml/int.ts +++ b/packages/utils/src/yaml/int.ts @@ -165,22 +165,22 @@ export const intType = new Type("tag:yaml.org,2002:int", { represent: { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - binary: function (obj: number) { + binary: function binary(obj: number) { return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1); }, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - octal: function (obj: number) { + octal: function octal(obj: number) { return obj >= 0 ? "0" + obj.toString(8) : "-0" + obj.toString(8).slice(1); }, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - decimal: function (obj: number) { + decimal: function decimal(obj: number) { return obj.toString(10); }, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - hexadecimal: function (obj: number) { + hexadecimal: function hexadecimal(obj: number) { return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1); }, },