From 93761cecb034ef9d180c427447512b94b4777d95 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Wed, 11 Dec 2024 16:48:33 -0500 Subject: [PATCH] fix(cli-repl): improve debuggability of `mongosh not initialized yet` errors These errors have historically been very hard to debug, so adding stack traces unconditionally will hopefully improve this situation in the long term. --- packages/cli-repl/src/mongosh-repl.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/cli-repl/src/mongosh-repl.ts b/packages/cli-repl/src/mongosh-repl.ts index 8903db2ab..27813995d 100644 --- a/packages/cli-repl/src/mongosh-repl.ts +++ b/packages/cli-repl/src/mongosh-repl.ts @@ -126,6 +126,7 @@ type Mutable = { */ class MongoshNodeRepl implements EvaluationListener { _runtimeState: MongoshRuntimeState | null; + closeTrace?: string; input: Readable; lineByLineInput: LineByLineInput; output: Writable; @@ -1028,7 +1029,13 @@ class MongoshNodeRepl implements EvaluationListener { */ runtimeState(): MongoshRuntimeState { if (this._runtimeState === null) { - throw new MongoshInternalError('Mongosh not initialized yet'); + // This error can be really hard to debug, so we always attach stack traces + // from both when .close() was called and when + throw new MongoshInternalError( + `mongosh not initialized yet\nCurrentTrace: ${ + new Error().stack + }\nClose trace: ${this.closeTrace}\n` + ); } return this._runtimeState; } @@ -1043,6 +1050,7 @@ class MongoshNodeRepl implements EvaluationListener { const rs = this._runtimeState; if (rs) { this._runtimeState = null; + this.closeTrace = new Error().stack; rs.repl?.close(); await rs.instanceState.close(true); await new Promise((resolve) => this.output.write('', resolve));