Skip to content

Commit 7012ddd

Browse files
chore: PR feedback
- rename json to EJSON in tool meta - move availableExports as getter prop - make SessionExportsManager return Promise<void>
1 parent f83cf14 commit 7012ddd

File tree

5 files changed

+27
-27
lines changed

5 files changed

+27
-27
lines changed

src/common/sessionExportsManager.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type SessionExportsManagerEvents = {
3232
};
3333

3434
export class SessionExportsManager extends EventEmitter<SessionExportsManagerEvents> {
35-
private availableExports: Record<Export["name"], Export> = {};
35+
private sessionExports: Record<Export["name"], Export> = {};
3636
private exportsCleanupInProgress: boolean = false;
3737
private exportsCleanupInterval: NodeJS.Timeout;
3838
private exportsDirectoryPath: string;
@@ -50,7 +50,13 @@ export class SessionExportsManager extends EventEmitter<SessionExportsManagerEve
5050
);
5151
}
5252

53-
public async close() {
53+
public get availableExports(): Export[] {
54+
return Object.values(this.sessionExports).filter(
55+
({ createdAt }) => !isExportExpired(createdAt, this.config.exportTimeoutMs)
56+
);
57+
}
58+
59+
public async close(): Promise<void> {
5460
try {
5561
clearInterval(this.exportsCleanupInterval);
5662
await fs.rm(this.exportsDirectoryPath, { force: true, recursive: true });
@@ -63,19 +69,13 @@ export class SessionExportsManager extends EventEmitter<SessionExportsManagerEve
6369
}
6470
}
6571

66-
public listAvailableExports(): Export[] {
67-
return Object.values(this.availableExports).filter(
68-
({ createdAt }) => !isExportExpired(createdAt, this.config.exportTimeoutMs)
69-
);
70-
}
71-
7272
public async readExport(exportName: string): Promise<{
7373
content: string;
7474
exportURI: string;
7575
}> {
7676
try {
7777
const exportNameWithExtension = validateExportName(exportName);
78-
const exportHandle = this.availableExports[exportNameWithExtension];
78+
const exportHandle = this.sessionExports[exportNameWithExtension];
7979
if (!exportHandle) {
8080
throw new Error("Requested export has either expired or does not exist!");
8181
}
@@ -149,7 +149,7 @@ export class SessionExportsManager extends EventEmitter<SessionExportsManagerEve
149149
} finally {
150150
void input.close();
151151
if (pipeSuccessful) {
152-
this.availableExports[exportNameWithExtension] = {
152+
this.sessionExports[exportNameWithExtension] = {
153153
name: exportNameWithExtension,
154154
createdAt: Date.now(),
155155
path: exportFilePath,
@@ -209,11 +209,11 @@ export class SessionExportsManager extends EventEmitter<SessionExportsManagerEve
209209
}
210210

211211
this.exportsCleanupInProgress = true;
212-
const exportsToBeConsidered = { ...this.availableExports };
212+
const exportsForCleanup = { ...this.sessionExports };
213213
try {
214-
for (const { path: exportPath, createdAt, uri, name } of Object.values(exportsToBeConsidered)) {
214+
for (const { path: exportPath, createdAt, uri, name } of Object.values(exportsForCleanup)) {
215215
if (isExportExpired(createdAt, this.config.exportTimeoutMs)) {
216-
delete this.availableExports[name];
216+
delete this.sessionExports[name];
217217
await this.silentlyRemoveExport(exportPath);
218218
this.emit("export-expired", uri);
219219
}

src/resources/common/exportedData.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,8 @@ export class ExportedData {
4747

4848
private listResourcesCallback: ListResourcesCallback = () => {
4949
try {
50-
const sessionExports = this.server.session.exportsManager.listAvailableExports();
5150
return {
52-
resources: sessionExports.map(({ name, uri }) => ({
51+
resources: this.server.session.exportsManager.availableExports.map(({ name, uri }) => ({
5352
name: name,
5453
description: this.exportNameToDescription(name),
5554
uri: uri,
@@ -70,8 +69,9 @@ export class ExportedData {
7069

7170
private autoCompleteExportName: CompleteResourceTemplateCallback = (value) => {
7271
try {
73-
const sessionExports = this.server.session.exportsManager.listAvailableExports();
74-
return sessionExports.filter(({ name }) => name.startsWith(value)).map(({ name }) => name);
72+
return this.server.session.exportsManager.availableExports
73+
.filter(({ name }) => name.startsWith(value))
74+
.map(({ name }) => name);
7575
} catch (error) {
7676
this.server.session.logger.error({
7777
id: LogId.exportedDataAutoCompleteError,

src/tools/mongodb/read/export.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import z from "zod";
77

88
export class ExportTool extends MongoDBToolBase {
99
public name = "export";
10-
protected description = "Export a collection data or query results in the specified json format.";
10+
protected description = "Export a collection data or query results in the specified EJSON format.";
1111
protected argsShape = {
1212
...DbOperationArgs,
1313
...FindArgs,
@@ -16,7 +16,7 @@ export class ExportTool extends MongoDBToolBase {
1616
.default("relaxed")
1717
.describe(
1818
[
19-
"The format to be used when exporting collection data as JSON with default being relaxed.",
19+
"The format to be used when exporting collection data as EJSON with default being relaxed.",
2020
"relaxed: A string format that emphasizes readability and interoperability at the expense of type preservation. That is, conversion from relaxed format to BSON can lose type information.",
2121
"canonical: A string format that emphasizes type preservation at the expense of readability and interoperability. That is, conversion from canonical to BSON will generally preserve type information except in certain specific cases.",
2222
].join("\n")

tests/integration/tools/mongodb/read/export.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ describeWithMongoDB("export tool", (integration) => {
3737
validateToolMetadata(
3838
integration,
3939
"export",
40-
"Export a collection data or query results in the specified json format.",
40+
"Export a collection data or query results in the specified EJSON format.",
4141
[
4242
...databaseCollectionParameters,
4343

@@ -50,7 +50,7 @@ describeWithMongoDB("export tool", (integration) => {
5050
{
5151
name: "jsonExportFormat",
5252
description: [
53-
"The format to be used when exporting collection data as JSON with default being relaxed.",
53+
"The format to be used when exporting collection data as EJSON with default being relaxed.",
5454
"relaxed: A string format that emphasizes readability and interoperability at the expense of type preservation. That is, conversion from relaxed format to BSON can lose type information.",
5555
"canonical: A string format that emphasizes type preservation at the expense of readability and interoperability. That is, conversion from canonical to BSON will generally preserve type information except in certain specific cases.",
5656
].join("\n"),

tests/unit/common/sessionExportsManager.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ describe("SessionExportsManager unit test", () => {
133133
});
134134

135135
// Updates available export
136-
const availableExports = manager.listAvailableExports();
136+
const availableExports = manager.availableExports;
137137
expect(availableExports).toHaveLength(1);
138138
expect(availableExports).toContainEqual(
139139
expect.objectContaining({
@@ -165,7 +165,7 @@ describe("SessionExportsManager unit test", () => {
165165

166166
const expectedExportName = exportName.endsWith(".json") ? exportName : `${exportName}.json`;
167167
// Updates available export
168-
const availableExports = manager.listAvailableExports();
168+
const availableExports = manager.availableExports;
169169
expect(availableExports).toHaveLength(1);
170170
expect(availableExports).toContainEqual(
171171
expect.objectContaining({
@@ -198,7 +198,7 @@ describe("SessionExportsManager unit test", () => {
198198

199199
const expectedExportName = exportName.endsWith(".json") ? exportName : `${exportName}.json`;
200200
// Updates available export
201-
const availableExports = manager.listAvailableExports();
201+
const availableExports = manager.availableExports;
202202
expect(availableExports).toHaveLength(1);
203203
expect(availableExports).toContainEqual(
204204
expect.objectContaining({
@@ -259,7 +259,7 @@ describe("SessionExportsManager unit test", () => {
259259
).rejects.toThrow("Could not transform the chunk!");
260260

261261
expect(emitSpy).not.toHaveBeenCalled();
262-
expect(manager.listAvailableExports()).toEqual([]);
262+
expect(manager.availableExports).toEqual([]);
263263
expect(await fileExists(exportPath)).toEqual(false);
264264
});
265265
});
@@ -298,15 +298,15 @@ describe("SessionExportsManager unit test", () => {
298298
jsonExportFormat: "relaxed",
299299
});
300300

301-
expect(manager.listAvailableExports()).toContainEqual(
301+
expect(manager.availableExports).toContainEqual(
302302
expect.objectContaining({
303303
name: exportName,
304304
uri: exportURI,
305305
})
306306
);
307307
expect(await fileExists(exportPath)).toEqual(true);
308308
await timeout(200);
309-
expect(manager.listAvailableExports()).toEqual([]);
309+
expect(manager.availableExports).toEqual([]);
310310
expect(await fileExists(exportPath)).toEqual(false);
311311
});
312312
});

0 commit comments

Comments
 (0)