|
1 | | -import fs from "fs/promises"; |
2 | | -import config from "./config.js"; |
3 | 1 | import { OauthDeviceCode, OAuthToken } from "./common/atlas/apiClient.js"; |
| 2 | +import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver"; |
| 3 | +import { AsyncEntry } from "@napi-rs/keyring"; |
| 4 | +import logger from "./logger.js"; |
| 5 | +import { mongoLogId } from "mongodb-log-writer"; |
| 6 | + |
| 7 | +const entry = new AsyncEntry("mongodb-mcp", "credentials"); |
4 | 8 |
|
5 | 9 | export interface State { |
6 | | - auth: { |
7 | | - status: "not_auth" | "requested" | "issued"; |
8 | | - code?: OauthDeviceCode; |
9 | | - token?: OAuthToken; |
| 10 | + persistent: { |
| 11 | + auth: { |
| 12 | + status: "not_auth" | "requested" | "issued"; |
| 13 | + code?: OauthDeviceCode; |
| 14 | + token?: OAuthToken; |
| 15 | + }; |
| 16 | + connectionString?: string; |
| 17 | + }; |
| 18 | + session: { |
| 19 | + serviceProvider?: NodeDriverServiceProvider; |
10 | 20 | }; |
11 | | - connectionString?: string; |
12 | 21 | } |
13 | 22 |
|
| 23 | +const defaultState: State = { |
| 24 | + persistent: { |
| 25 | + auth: { |
| 26 | + status: "not_auth", |
| 27 | + }, |
| 28 | + }, |
| 29 | + session: {}, |
| 30 | +}; |
| 31 | + |
14 | 32 | export async function saveState(state: State): Promise<void> { |
15 | | - await fs.writeFile(config.stateFile, JSON.stringify(state), { encoding: "utf-8" }); |
| 33 | + await entry.setPassword(JSON.stringify(state.persistent)); |
16 | 34 | } |
17 | 35 |
|
18 | 36 | export async function loadState(): Promise<State> { |
19 | 37 | try { |
20 | | - const data = await fs.readFile(config.stateFile, "utf-8"); |
21 | | - return JSON.parse(data) as State; |
22 | | - } catch (err: unknown) { |
23 | | - if (err && typeof err === "object" && "code" in err && err.code === "ENOENT") { |
24 | | - return { |
25 | | - auth: { |
26 | | - status: "not_auth", |
27 | | - }, |
28 | | - }; |
| 38 | + const data = await entry.getPassword(); |
| 39 | + if (!data) { |
| 40 | + return defaultState; |
29 | 41 | } |
30 | 42 |
|
31 | | - throw err; |
| 43 | + return { |
| 44 | + persistent: JSON.parse(data), |
| 45 | + session: {}, |
| 46 | + }; |
| 47 | + } catch (err: unknown) { |
| 48 | + logger.error(mongoLogId(1_000_007), "state", `Failed to load state: ${err}`); |
| 49 | + return defaultState; |
32 | 50 | } |
33 | 51 | } |
0 commit comments