Skip to content

Commit 09d92e7

Browse files
authored
fix: bad auth error (#178)
1 parent 6ee5634 commit 09d92e7

File tree

4 files changed

+42
-13
lines changed

4 files changed

+42
-13
lines changed

src/logger.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const LogId = {
1212

1313
atlasCheckCredentials: mongoLogId(1_001_001),
1414
atlasDeleteDatabaseUserFailure: mongoLogId(1_001_002),
15+
atlasConnectFailure: mongoLogId(1_001_003),
1516

1617
telemetryDisabled: mongoLogId(1_002_001),
1718
telemetryEmitFailure: mongoLogId(1_002_002),

src/session.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,25 +69,24 @@ export class Session extends EventEmitter<{
6969
this.emit("disconnect");
7070
return;
7171
}
72-
try {
73-
await this.apiClient.deleteDatabaseUser({
72+
void this.apiClient
73+
.deleteDatabaseUser({
7474
params: {
7575
path: {
7676
groupId: this.connectedAtlasCluster.projectId,
7777
username: this.connectedAtlasCluster.username,
7878
databaseName: "admin",
7979
},
8080
},
81+
})
82+
.catch((err: unknown) => {
83+
const error = err instanceof Error ? err : new Error(String(err));
84+
logger.error(
85+
LogId.atlasDeleteDatabaseUserFailure,
86+
"atlas-connect-cluster",
87+
`Error deleting previous database user: ${error.message}`
88+
);
8189
});
82-
} catch (err: unknown) {
83-
const error = err instanceof Error ? err : new Error(String(err));
84-
85-
logger.error(
86-
LogId.atlasDeleteDatabaseUserFailure,
87-
"atlas-connect-cluster",
88-
`Error deleting previous database user: ${error.message}`
89-
);
90-
}
9190
this.connectedAtlasCluster = undefined;
9291

9392
this.emit("disconnect");

src/tools/atlas/metadata/connectCluster.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { AtlasToolBase } from "../atlasTool.js";
44
import { ToolArgs, OperationType } from "../../tool.js";
55
import { randomBytes } from "crypto";
66
import { promisify } from "util";
7+
import logger, { LogId } from "../../../logger.js";
78

89
const EXPIRY_MS = 1000 * 60 * 60 * 12; // 12 hours
910

@@ -15,6 +16,10 @@ async function generateSecurePassword(): Promise<string> {
1516
return pass;
1617
}
1718

19+
function sleep(ms: number): Promise<void> {
20+
return new Promise((resolve) => setTimeout(resolve, ms));
21+
}
22+
1823
export class ConnectClusterTool extends AtlasToolBase {
1924
protected name = "atlas-connect-cluster";
2025
protected description = "Connect to MongoDB Atlas cluster";
@@ -100,7 +105,31 @@ export class ConnectClusterTool extends AtlasToolBase {
100105
cn.searchParams.set("authSource", "admin");
101106
const connectionString = cn.toString();
102107

103-
await this.session.connectToMongoDB(connectionString, this.config.connectOptions);
108+
let lastError: Error | undefined = undefined;
109+
110+
for (let i = 0; i < 20; i++) {
111+
try {
112+
await this.session.connectToMongoDB(connectionString, this.config.connectOptions);
113+
lastError = undefined;
114+
break;
115+
} catch (err: unknown) {
116+
const error = err instanceof Error ? err : new Error(String(err));
117+
118+
lastError = error;
119+
120+
logger.debug(
121+
LogId.atlasConnectFailure,
122+
"atlas-connect-cluster",
123+
`error connecting to cluster: ${error.message}`
124+
);
125+
126+
await sleep(500); // wait for 500ms before retrying
127+
}
128+
}
129+
130+
if (lastError) {
131+
throw lastError;
132+
}
104133

105134
return {
106135
content: [

src/tools/tool.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ export abstract class ToolBase {
126126
{
127127
type: "text",
128128
text: `Error running ${this.name}: ${error instanceof Error ? error.message : String(error)}`,
129-
isError: true,
130129
},
131130
],
131+
isError: true,
132132
};
133133
}
134134

0 commit comments

Comments
 (0)