Skip to content

Commit

Permalink
address comments
Browse files Browse the repository at this point in the history
  • Loading branch information
baileympearson committed Jul 26, 2024
1 parent a852a0e commit 9335280
Show file tree
Hide file tree
Showing 10 changed files with 87 additions and 90 deletions.
1 change: 0 additions & 1 deletion .evergreen/run-resource-management-smoke-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ echo "Building driver...finished."
echo "Node version: $(node -v)"
cd test/explicit-resource-management

pwd
npm i
npm t
mv xunit.xml ../..
25 changes: 22 additions & 3 deletions src/beta.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,23 @@
import * as contents from './index';
import { configureExplicitResourceManagement } from './resource_management';
import { type Document } from 'bson';

export = { ...contents, configureExplicitResourceManagement };
export * from './index';

/**
* @internal
*
* Since we don't bundle tslib helpers, we need to polyfill this method.
*
* This is used in the generated JS.
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function __exportStar(mod: Document) {
for (const key of Object.keys(mod)) {
exports[key] = void 0;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
return mod[key];
}
});
}
}
16 changes: 6 additions & 10 deletions src/change_stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { type InferIdType, TypedEventEmitter } from './mongo_types';
import type { AggregateOptions } from './operations/aggregate';
import type { CollationOptions, OperationParent } from './operations/command';
import type { ReadPreference } from './read_preference';
import { type AsyncDisposable } from './resource_management';
import { type AsyncDisposable, configureResourceManagement } from './resource_management';
import type { ServerSessionId } from './sessions';
import { filterOptions, getTopology, type MongoDBNamespace, squashError } from './utils';

Expand Down Expand Up @@ -553,6 +553,10 @@ export class ChangeStream<
{
/** @beta */
declare [Symbol.asyncDispose]: () => Promise<void>;
/** @internal */
async dispose() {
await this.close();
}

pipeline: Document[];
/**
Expand Down Expand Up @@ -994,12 +998,4 @@ export class ChangeStream<
}
}

Symbol.asyncDispose &&
Object.defineProperty(ChangeStream.prototype, Symbol.asyncDispose, {
value: async function asyncDispose(this: { close(): Promise<void> }) {
await this.close();
},
enumerable: false,
configurable: true,
writable: true
});
configureResourceManagement(ChangeStream.prototype);
16 changes: 6 additions & 10 deletions src/cursor/abstract_cursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { GetMoreOperation } from '../operations/get_more';
import { KillCursorsOperation } from '../operations/kill_cursors';
import { ReadConcern, type ReadConcernLike } from '../read_concern';
import { ReadPreference, type ReadPreferenceLike } from '../read_preference';
import { type AsyncDisposable } from '../resource_management';
import { type AsyncDisposable, configureResourceManagement } from '../resource_management';
import type { Server } from '../sdam/server';
import { ClientSession, maybeClearPinnedConnection } from '../sessions';
import { type MongoDBNamespace, squashError } from '../utils';
Expand Down Expand Up @@ -281,6 +281,10 @@ export abstract class AbstractCursor<

/** @beta */
declare [Symbol.asyncDispose]: () => Promise<void>;
/** @internal */
async dispose() {
await this.close();
}

/** Returns current buffered documents length */
bufferedCount(): number {
Expand Down Expand Up @@ -924,12 +928,4 @@ class ReadableCursorStream extends Readable {
}
}

Symbol.asyncDispose &&
Object.defineProperty(AbstractCursor.prototype, Symbol.asyncDispose, {
value: async function asyncDispose(this: { close(): Promise<void> }) {
await this.close();
},
enumerable: false,
configurable: true,
writable: true
});
configureResourceManagement(AbstractCursor.prototype);
3 changes: 2 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ export {
MongoUnexpectedServerResponseError,
MongoWriteConcernError
} from './error';
export { configureExplicitResourceManagement } from './resource_management';
export {
AbstractCursor,
// Actual driver classes exported
Expand Down Expand Up @@ -111,7 +112,6 @@ export { ReturnDocument } from './operations/find_and_modify';
export { ProfilingLevel } from './operations/set_profiling_level';
export { ReadConcernLevel } from './read_concern';
export { ReadPreferenceMode } from './read_preference';
export { AsyncDisposable } from './resource_management';
export { ServerType, TopologyType } from './sdam/common';

// Helper classes
Expand Down Expand Up @@ -521,6 +521,7 @@ export type {
ReadPreferenceLikeOptions,
ReadPreferenceOptions
} from './read_preference';
export type { AsyncDisposable } from './resource_management';
export type { ClusterTime, TimerQueue } from './sdam/common';
export type {
Monitor,
Expand Down
16 changes: 6 additions & 10 deletions src/mongo_client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import { executeOperation } from './operations/execute_operation';
import { RunAdminCommandOperation } from './operations/run_command';
import type { ReadConcern, ReadConcernLevel, ReadConcernLike } from './read_concern';
import { ReadPreference, type ReadPreferenceMode } from './read_preference';
import { type AsyncDisposable } from './resource_management';
import { type AsyncDisposable, configureResourceManagement } from './resource_management';
import type { ServerMonitoringMode } from './sdam/monitor';
import type { TagSet } from './sdam/server_description';
import { readPreferenceServerSelector } from './sdam/server_selection';
Expand Down Expand Up @@ -407,6 +407,10 @@ export class MongoClient extends TypedEventEmitter<MongoClientEvents> implements

/** @beta */
declare [Symbol.asyncDispose]: () => Promise<void>;
/** @internal */
async dispose() {
await this.close();
}

/** @internal */
private checkForNonGenuineHosts() {
Expand Down Expand Up @@ -762,15 +766,7 @@ export class MongoClient extends TypedEventEmitter<MongoClientEvents> implements
}
}

Symbol.asyncDispose &&
Object.defineProperty(MongoClient.prototype, Symbol.asyncDispose, {
value: async function asyncDispose(this: { close(): Promise<void> }) {
await this.close();
},
enumerable: false,
configurable: true,
writable: true
});
configureResourceManagement(MongoClient.prototype);

/**
* Parsed Mongo Client Options.
Expand Down
81 changes: 37 additions & 44 deletions src/resource_management.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,29 @@
import { ChangeStream } from './change_stream';
import { AbstractCursor } from './cursor/abstract_cursor';
import { MongoClient } from './mongo_client';
import { ClientSession } from './sessions';

/**
* @public
* @experimental
*/
export interface AsyncDisposable {
/** @beta */
[Symbol.asyncDispose]: () => Promise<void>;
[Symbol.asyncDispose](): Promise<void>;

/**
* @internal
*
* A method that wraps disposal semantics for a given resource in the class.
*/
dispose(): Promise<void>;
}

/** @internal */
export function configureResourceManagement(target: AsyncDisposable) {
Symbol.asyncDispose &&
Object.defineProperty(target, Symbol.asyncDispose, {
value: async function asyncDispose(this: AsyncDisposable) {
await this.dispose();
},
enumerable: false,
configurable: true,
writable: true
});
}

/**
Expand All @@ -35,43 +49,22 @@ export interface AsyncDisposable {
* ```
*/
export function configureExplicitResourceManagement() {
Symbol.asyncDispose &&
Object.defineProperty(MongoClient.prototype, Symbol.asyncDispose, {
value: async function asyncDispose(this: { close(): Promise<void> }) {
await this.close();
},
enumerable: false,
configurable: true,
writable: true
});
// We must import lazily here, because there's a circular dependency between the resource management
// file and each resources' file. We could move `configureResourceManagement` to a separate
// function, but keeping all resource-management related code together seemed preferable and I chose
// lazy requiring of resources instead.

Symbol.asyncDispose &&
Object.defineProperty(AbstractCursor.prototype, Symbol.asyncDispose, {
value: async function asyncDispose(this: { close(): Promise<void> }) {
await this.close();
},
enumerable: false,
configurable: true,
writable: true
});
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { MongoClient } = require('./mongo_client');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { ClientSession } = require('./sessions');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { AbstractCursor } = require('./cursor/abstract_cursor');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { ChangeStream } = require('./change_stream');

Symbol.asyncDispose &&
Object.defineProperty(ChangeStream.prototype, Symbol.asyncDispose, {
value: async function asyncDispose(this: { close(): Promise<void> }) {
await this.close();
},
enumerable: false,
configurable: true,
writable: true
});

Symbol.asyncDispose &&
Object.defineProperty(ClientSession.prototype, Symbol.asyncDispose, {
value: async function asyncDispose(this: { endSession(): Promise<void> }) {
await this.endSession();
},
enumerable: false,
configurable: true,
writable: true
});
configureResourceManagement(MongoClient.prototype);
configureResourceManagement(ClientSession.prototype);
configureResourceManagement(AbstractCursor.prototype);
configureResourceManagement(ChangeStream.prototype);
}
16 changes: 6 additions & 10 deletions src/sessions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { executeOperation } from './operations/execute_operation';
import { RunAdminCommandOperation } from './operations/run_command';
import { ReadConcernLevel } from './read_concern';
import { ReadPreference } from './read_preference';
import { type AsyncDisposable } from './resource_management';
import { type AsyncDisposable, configureResourceManagement } from './resource_management';
import { _advanceClusterTime, type ClusterTime, TopologyType } from './sdam/common';
import {
isTransactionCommand,
Expand Down Expand Up @@ -292,6 +292,10 @@ export class ClientSession
}
/** @beta */
declare [Symbol.asyncDispose]: () => Promise<void>;
/** @internal */
async dispose() {
await this.endSession({ force: true });
}

/**
* Advances the operationTime for a ClientSession.
Expand Down Expand Up @@ -490,15 +494,7 @@ export class ClientSession
}
}

Symbol.asyncDispose &&
Object.defineProperty(ClientSession.prototype, Symbol.asyncDispose, {
value: async function asyncDispose(this: { endSession(): Promise<void> }) {
await this.endSession();
},
enumerable: false,
configurable: true,
writable: true
});
configureResourceManagement(ClientSession.prototype);

const MAX_WITH_TRANSACTION_TIMEOUT = 120000;
const NON_DETERMINISTIC_WRITE_CONCERN_ERRORS = new Set([
Expand Down
1 change: 1 addition & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import type { CommandOperationOptions, OperationParent } from './operations/comm
import type { Hint, OperationOptions } from './operations/operation';
import { ReadConcern } from './read_concern';
import { ReadPreference } from './read_preference';
import type { AsyncDisposable } from './resource_management';
import { ServerType } from './sdam/common';
import type { Server } from './sdam/server';
import type { Topology } from './sdam/topology';
Expand Down
2 changes: 1 addition & 1 deletion test/unit/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ const EXPECTED_EXPORTS = [
'AbstractCursor',
'Admin',
'AggregationCursor',
'AsyncDisposable',
'AuthMechanism',
'AutoEncryptionLoggerLevel',
'BatchType',
Expand All @@ -32,6 +31,7 @@ const EXPECTED_EXPORTS = [
'ClientSession',
'Code',
'Collection',
'configureExplicitResourceManagement',
'CommandFailedEvent',
'CommandStartedEvent',
'CommandSucceededEvent',
Expand Down

0 comments on commit 9335280

Please sign in to comment.