From 6b7fd39599ddd500cafc8736636764ea14e9ae9c Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Sat, 1 Apr 2023 12:18:40 +0200 Subject: [PATCH] Attempt to cleanly exit beacon node --- lodestar | 2 +- package.json | 5 +- .../src/chain/blocks/importBlock.ts | 6 +- .../beacon-node/src/chain/blocks/index.ts | 10 ++- .../src/chain/errors/blockError.ts | 9 ++ .../beacon-node/src/chain/prepareNextSlot.ts | 8 +- .../src/eth1/eth1DepositDataTracker.ts | 3 +- .../beacon-node/src/execution/engine/http.ts | 2 +- packages/beacon-node/src/node/nodejs.ts | 14 +++- packages/beacon-node/src/util/clock.ts | 7 +- packages/beacon-node/src/util/queue/errors.ts | 4 + packages/beacon-node/src/util/queue/index.ts | 2 +- packages/cli/bin/lodestar.js | 2 + packages/cli/package.json | 3 +- packages/cli/src/cmds/validator/handler.ts | 1 + packages/cli/src/util/process.ts | 1 + packages/reqresp/src/ReqResp.ts | 1 + patches/@chainsafe+threads+1.10.0.patch | 37 +++++++++ yarn.lock | 82 +++++++++++++++++-- 19 files changed, 175 insertions(+), 24 deletions(-) create mode 100644 patches/@chainsafe+threads+1.10.0.patch diff --git a/lodestar b/lodestar index 2101d94b77cb..1a1f89af9f3c 100755 --- a/lodestar +++ b/lodestar @@ -4,4 +4,4 @@ # # ./lodestar.sh beacon --network prater -node --trace-deprecation --max-old-space-size=4096 ./packages/cli/bin/lodestar.js "$@" \ No newline at end of file +node --trace-deprecation --max-old-space-size=4096 -r why-is-node-running/include ./packages/cli/bin/lodestar.js "$@" \ No newline at end of file diff --git a/package.json b/package.json index 7a67b2fe21fa..bda2003fb061 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "release:tag-rc": "node scripts/release/tag_rc.mjs", "release:tag-stable": "node scripts/release/tag_stable.mjs", "release:publish": "lerna publish from-package --yes --no-verify-access", - "check-readme": "lerna run check-readme" + "check-readme": "lerna run check-readme", + "postinstall": "patch-package" }, "devDependencies": { "@chainsafe/eslint-plugin-node": "^11.2.3", @@ -68,7 +69,9 @@ "node-gyp": "^9.3.1", "npm-run-all": "^4.1.5", "nyc": "^15.1.0", + "patch-package": "^6.5.1", "path-browserify": "^1.0.1", + "postinstall-postinstall": "^2.1.0", "prettier": "^2.8.7", "process": "^0.11.10", "resolve-typescript-plugin": "^2.0.1", diff --git a/packages/beacon-node/src/chain/blocks/importBlock.ts b/packages/beacon-node/src/chain/blocks/importBlock.ts index b06da6dfcdc5..1a13ecffeb30 100644 --- a/packages/beacon-node/src/chain/blocks/importBlock.ts +++ b/packages/beacon-node/src/chain/blocks/importBlock.ts @@ -10,9 +10,11 @@ import { } from "@lodestar/state-transition"; import {routes} from "@lodestar/api"; import {ForkChoiceError, ForkChoiceErrorCode, EpochDifference, AncestorStatus} from "@lodestar/fork-choice"; +import {isErrorAborted} from "@lodestar/utils"; import {ZERO_HASH_HEX} from "../../constants/index.js"; import {toCheckpointHex} from "../stateCache/index.js"; import {isOptimisticBlock} from "../../util/forkChoice.js"; +import {isQueueErrorAborted} from "../../util/queue/errors.js"; import {ChainEvent, ReorgEventData} from "../emitter.js"; import {REPROCESS_MIN_TIME_TO_NEXT_SLOT_SEC} from "../reprocess.js"; import {RegenCaller} from "../regen/interface.js"; @@ -317,7 +319,9 @@ export async function importBlock( finalizedBlockHash ) .catch((e) => { - this.logger.error("Error pushing notifyForkchoiceUpdate()", {headBlockHash, finalizedBlockHash}, e); + if (!isErrorAborted(e) && !isQueueErrorAborted(e)) { + this.logger.error("Error pushing notifyForkchoiceUpdate()", {headBlockHash, finalizedBlockHash}, e); + } }); } } diff --git a/packages/beacon-node/src/chain/blocks/index.ts b/packages/beacon-node/src/chain/blocks/index.ts index 60e3342385bb..161ff189bfeb 100644 --- a/packages/beacon-node/src/chain/blocks/index.ts +++ b/packages/beacon-node/src/chain/blocks/index.ts @@ -1,8 +1,8 @@ import {WithOptionalBytes, allForks} from "@lodestar/types"; -import {toHex} from "@lodestar/utils"; -import {JobItemQueue} from "../../util/queue/index.js"; +import {isErrorAborted, toHex} from "@lodestar/utils"; +import {JobItemQueue, isQueueErrorAborted} from "../../util/queue/index.js"; import {Metrics} from "../../metrics/metrics.js"; -import {BlockError, BlockErrorCode} from "../errors/index.js"; +import {BlockError, BlockErrorCode, isBlockErrorAborted} from "../errors/index.js"; import {BlockProcessOpts} from "../options.js"; import type {BeaconChain} from "../chain.js"; import {verifyBlocksInEpoch} from "./verifyBlock.js"; @@ -111,6 +111,10 @@ export async function processBlocks( await importBlock.call(this, fullyVerifiedBlock, opts); } } catch (e) { + if (isErrorAborted(e) || isQueueErrorAborted(e) || isBlockErrorAborted(e)) { + return; // Ignore + } + // above functions should only throw BlockError const err = getBlockError(e, blocks[0].block); diff --git a/packages/beacon-node/src/chain/errors/blockError.ts b/packages/beacon-node/src/chain/errors/blockError.ts index 21fee9dd5511..ede60fd84afc 100644 --- a/packages/beacon-node/src/chain/errors/blockError.ts +++ b/packages/beacon-node/src/chain/errors/blockError.ts @@ -3,6 +3,7 @@ import {LodestarError} from "@lodestar/utils"; import {toHexString} from "@chainsafe/ssz"; import {CachedBeaconStateAllForks} from "@lodestar/state-transition"; import {ExecutePayloadStatus} from "../../execution/engine/interface.js"; +import {QueueErrorCode} from "../../util/queue/errors.js"; import {GossipActionError} from "./gossipValidation.js"; export enum BlockErrorCode { @@ -116,6 +117,14 @@ export class BlockError extends LodestarError { } } +export function isBlockErrorAborted(e: unknown): e is BlockError { + return ( + e instanceof BlockError && + e.type.code === BlockErrorCode.EXECUTION_ENGINE_ERROR && + e.type.errorMessage === QueueErrorCode.QUEUE_ABORTED + ); +} + export function renderBlockErrorType(type: BlockErrorType): Record { switch (type.code) { case BlockErrorCode.PRESTATE_MISSING: diff --git a/packages/beacon-node/src/chain/prepareNextSlot.ts b/packages/beacon-node/src/chain/prepareNextSlot.ts index 1c7e63e75811..c6f25b1bfc1b 100644 --- a/packages/beacon-node/src/chain/prepareNextSlot.ts +++ b/packages/beacon-node/src/chain/prepareNextSlot.ts @@ -2,7 +2,7 @@ import {computeEpochAtSlot, isExecutionStateType, computeTimeAtSlot} from "@lode import {ChainForkConfig} from "@lodestar/config"; import {ForkSeq, SLOTS_PER_EPOCH, ForkExecution} from "@lodestar/params"; import {Slot} from "@lodestar/types"; -import {Logger, sleep, fromHex} from "@lodestar/utils"; +import {Logger, sleep, fromHex, isErrorAborted} from "@lodestar/utils"; import {routes} from "@lodestar/api"; import {GENESIS_SLOT, ZERO_HASH_HEX} from "../constants/constants.js"; import {Metrics} from "../metrics/index.js"; @@ -172,8 +172,10 @@ export class PrepareNextSlotScheduler { } } } catch (e) { - this.metrics?.precomputeNextEpochTransition.count.inc({result: "error"}, 1); - this.logger.error("Failed to run prepareForNextSlot", {nextEpoch, isEpochTransition, prepareSlot}, e as Error); + if (!isErrorAborted(e)) { + this.metrics?.precomputeNextEpochTransition.count.inc({result: "error"}, 1); + this.logger.error("Failed to run prepareForNextSlot", {nextEpoch, isEpochTransition, prepareSlot}, e as Error); + } } }; } diff --git a/packages/beacon-node/src/eth1/eth1DepositDataTracker.ts b/packages/beacon-node/src/eth1/eth1DepositDataTracker.ts index c5e8605e83cd..a7fc91fafb06 100644 --- a/packages/beacon-node/src/eth1/eth1DepositDataTracker.ts +++ b/packages/beacon-node/src/eth1/eth1DepositDataTracker.ts @@ -162,8 +162,7 @@ export class Eth1DepositDataTracker { private async runAutoUpdate(): Promise { let lastRunMs = 0; - // eslint-disable-next-line no-constant-condition - while (true) { + while (!this.signal.aborted) { lastRunMs = Date.now(); try { diff --git a/packages/beacon-node/src/execution/engine/http.ts b/packages/beacon-node/src/execution/engine/http.ts index 1fcd0514e1c5..6918204dd861 100644 --- a/packages/beacon-node/src/execution/engine/http.ts +++ b/packages/beacon-node/src/execution/engine/http.ts @@ -4,7 +4,7 @@ import {SLOTS_PER_EPOCH, ForkName, ForkSeq} from "@lodestar/params"; import {ErrorJsonRpcResponse, HttpRpcError} from "../../eth1/provider/jsonRpcHttpClient.js"; import {IJsonRpcHttpClient, ReqOpts} from "../../eth1/provider/jsonRpcHttpClient.js"; import {Metrics} from "../../metrics/index.js"; -import {JobItemQueue} from "../../util/queue/index.js"; +import {JobItemQueue, isQueueErrorAborted} from "../../util/queue/index.js"; import {EPOCHS_PER_BATCH} from "../../sync/constants.js"; import {numToQuantity} from "../../eth1/provider/utils.js"; import { diff --git a/packages/beacon-node/src/node/nodejs.ts b/packages/beacon-node/src/node/nodejs.ts index 7ea931dd8220..dff8fe515c0c 100644 --- a/packages/beacon-node/src/node/nodejs.ts +++ b/packages/beacon-node/src/node/nodejs.ts @@ -8,6 +8,7 @@ import {LoggerNode} from "@lodestar/logger/node"; import {Api, ServerApi} from "@lodestar/api"; import {BeaconStateAllForks} from "@lodestar/state-transition"; import {ProcessShutdownCallback} from "@lodestar/validator"; +import {sleep} from "@lodestar/utils"; import {IBeaconDb} from "../db/index.js"; import {Network, getReqRespHandlers} from "../network/index.js"; @@ -74,6 +75,12 @@ enum LoggerModule { sync = "sync", } +/** + * Short delay before closing db to give async operations sufficient time to finish + * and prevent "Database is not open" errors when shutting down beacon node. + */ +const DELAY_BEFORE_CLOSING_DB_MS = 1000; + /** * The main Beacon Node class. Contains various components for getting and processing data from the * Ethereum Consensus ecosystem as well as systems for getting beacon node metadata. @@ -309,6 +316,7 @@ export class BeaconNode { */ async close(): Promise { if (this.status === BeaconNodeStatus.started) { + console.time("close bn"); this.status = BeaconNodeStatus.closing; this.sync.close(); this.backfillSync?.close(); @@ -316,12 +324,14 @@ export class BeaconNode { if (this.metricsServer) await this.metricsServer.stop(); if (this.monitoring) this.monitoring.stop(); if (this.restApi) await this.restApi.close(); - await this.chain.persistToDisk(); await this.chain.close(); - await this.db.stop(); if (this.controller) this.controller.abort(); + await sleep(DELAY_BEFORE_CLOSING_DB_MS); + await this.db.stop(); this.status = BeaconNodeStatus.closed; + console.log("Beacon node closed!"); + console.timeEnd("close bn"); } } } diff --git a/packages/beacon-node/src/util/clock.ts b/packages/beacon-node/src/util/clock.ts index b7741790ab33..a330a0bb007e 100644 --- a/packages/beacon-node/src/util/clock.ts +++ b/packages/beacon-node/src/util/clock.ts @@ -189,8 +189,11 @@ export class Clock extends EventEmitter implements IClock { this.emit(ClockEvent.epoch, currentEpoch); } } - //recursively invoke onNextSlot - this.timeoutId = setTimeout(this.onNextSlot, this.msUntilNextSlot()); + + if (!this.signal.aborted) { + //recursively invoke onNextSlot + this.timeoutId = setTimeout(this.onNextSlot, this.msUntilNextSlot()); + } }; private msUntilNextSlot(): number { diff --git a/packages/beacon-node/src/util/queue/errors.ts b/packages/beacon-node/src/util/queue/errors.ts index d910f781a64c..edb0b3b87374 100644 --- a/packages/beacon-node/src/util/queue/errors.ts +++ b/packages/beacon-node/src/util/queue/errors.ts @@ -12,3 +12,7 @@ export class QueueError extends LodestarError { super(type); } } + +export function isQueueErrorAborted(e: unknown): e is QueueError { + return e instanceof QueueError && e.type.code === QueueErrorCode.QUEUE_ABORTED; +} diff --git a/packages/beacon-node/src/util/queue/index.ts b/packages/beacon-node/src/util/queue/index.ts index 5a375c73d4f4..b55979b1f5ba 100644 --- a/packages/beacon-node/src/util/queue/index.ts +++ b/packages/beacon-node/src/util/queue/index.ts @@ -1,4 +1,4 @@ export * from "./fnQueue.js"; export * from "./itemQueue.js"; export * from "./options.js"; -export {QueueError, QueueErrorCode} from "./errors.js"; +export {QueueError, QueueErrorCode, isQueueErrorAborted} from "./errors.js"; diff --git a/packages/cli/bin/lodestar.js b/packages/cli/bin/lodestar.js index cec441a610bf..8eac4ece2923 100755 --- a/packages/cli/bin/lodestar.js +++ b/packages/cli/bin/lodestar.js @@ -1,3 +1,5 @@ #!/usr/bin/env node await import("../lib/index.js"); + +console.log("Process ID", process.pid); diff --git a/packages/cli/package.json b/packages/cli/package.json index 9d778075c0ed..acf20c1b33b7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -100,6 +100,7 @@ "@types/inquirer": "^9.0.3", "@types/lodash": "^4.14.192", "@types/yargs": "^17.0.24", - "@types/debug": "^4.1.7" + "@types/debug": "^4.1.7", + "why-is-node-running": "^2.2.2" } } diff --git a/packages/cli/src/cmds/validator/handler.ts b/packages/cli/src/cmds/validator/handler.ts index 4b09afc687fe..543755ef7137 100644 --- a/packages/cli/src/cmds/validator/handler.ts +++ b/packages/cli/src/cmds/validator/handler.ts @@ -58,6 +58,7 @@ export async function validatorHandler(args: IValidatorCliArgs & GlobalArgs): Pr const onGracefulShutdownCbs: (() => Promise | void)[] = []; onGracefulShutdown(async () => { for (const cb of onGracefulShutdownCbs) await cb(); + console.log("Validator client closed!"); }, logger.info.bind(logger)); // Callback for validator to request forced exit, in case of doppelganger detection diff --git a/packages/cli/src/util/process.ts b/packages/cli/src/util/process.ts index cd040bdffb55..dff0c4997990 100644 --- a/packages/cli/src/util/process.ts +++ b/packages/cli/src/util/process.ts @@ -21,6 +21,7 @@ export function onGracefulShutdown( }); await cleanUpFunction(); + console.log("Clean up functions succeeded!"); }); } } diff --git a/packages/reqresp/src/ReqResp.ts b/packages/reqresp/src/ReqResp.ts index 267003fa7e50..3fa9a43c3200 100644 --- a/packages/reqresp/src/ReqResp.ts +++ b/packages/reqresp/src/ReqResp.ts @@ -143,6 +143,7 @@ export class ReqResp { } async stop(): Promise { + this.rateLimiter.stop(); this.controller.abort(); } diff --git a/patches/@chainsafe+threads+1.10.0.patch b/patches/@chainsafe+threads+1.10.0.patch new file mode 100644 index 000000000000..4c8b528655b1 --- /dev/null +++ b/patches/@chainsafe+threads+1.10.0.patch @@ -0,0 +1,37 @@ +diff --git a/node_modules/@chainsafe/threads/dist/master/implementation.node.js b/node_modules/@chainsafe/threads/dist/master/implementation.node.js +index e8a2cdb..64454e2 100644 +--- a/node_modules/@chainsafe/threads/dist/master/implementation.node.js ++++ b/node_modules/@chainsafe/threads/dist/master/implementation.node.js +@@ -138,14 +138,7 @@ function initWorkerThreadsWorker() { + this.off(eventName, listener); + } + } +- const terminateWorkersAndMaster = () => { +- // we should terminate all workers and then gracefully shutdown self process +- Promise.all(allWorkers.map(worker => worker.terminate())).then(() => process.exit(0), () => process.exit(1)); +- allWorkers = []; +- }; +- // Take care to not leave orphaned processes behind. See #147. +- process.on("SIGINT", () => terminateWorkersAndMaster()); +- process.on("SIGTERM", () => terminateWorkersAndMaster()); ++ + class BlobWorker extends Worker { + constructor(blob, options) { + super(Buffer.from(blob).toString("utf-8"), Object.assign(Object.assign({}, options), { fromSource: true })); +@@ -202,15 +195,7 @@ function initTinyWorker() { + return super.terminate(); + } + } +- const terminateWorkersAndMaster = () => { +- // we should terminate all workers and then gracefully shutdown self process +- Promise.all(allWorkers.map(worker => worker.terminate())).then(() => process.exit(0), () => process.exit(1)); +- allWorkers = []; +- }; +- // Take care to not leave orphaned processes behind +- // See +- process.on("SIGINT", () => terminateWorkersAndMaster()); +- process.on("SIGTERM", () => terminateWorkersAndMaster()); ++ + class BlobWorker extends Worker { + constructor(blob, options) { + super(Buffer.from(blob).toString("utf-8"), Object.assign(Object.assign({}, options), { fromSource: true })); diff --git a/yarn.lock b/yarn.lock index 0fe06c29c7a1..d34368606426 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7857,6 +7857,13 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -8001,7 +8008,7 @@ fs-constants@^1.0.0: resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@9.1.0, fs-extra@^9.1.0: +fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -9167,7 +9174,7 @@ is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-ci@2.0.0: +is-ci@2.0.0, is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== @@ -9461,7 +9468,7 @@ is-windows@^1.0.2: resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -10052,6 +10059,13 @@ kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kuler@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" @@ -10770,7 +10784,7 @@ micro-ftch@^0.3.1: resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== -micromatch@^4.0.0, micromatch@^4.0.4: +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -12047,6 +12061,14 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + open@^8.4.0: version "8.4.0" resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" @@ -12455,6 +12477,26 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +patch-package@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" + integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^1.10.2" + path-browserify@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" @@ -12648,6 +12690,11 @@ postcss-selector-parser@^6.0.10: cssesc "^3.0.0" util-deprecate "^1.0.2" +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + prebuild-install@5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz" @@ -13470,9 +13517,9 @@ rfdc@^1.2.0, rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.1: +rimraf@^2.6.1, rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" @@ -13819,6 +13866,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" @@ -13876,6 +13928,11 @@ slash@3.0.0, slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" @@ -14111,6 +14168,11 @@ stack-trace@0.0.x: resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -15803,6 +15865,14 @@ which@^3.0.0: dependencies: isexe "^2.0.0" +why-is-node-running@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" + integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + wide-align@^1.1.0, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz"