Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
08cf9ac
refactor(NODE-3405): replace MongoDriverError where appropriate
andymina Jul 20, 2021
978e6af
test(NODE-3405): adjust tests to expect MongoStreamClosedError
andymina Jul 20, 2021
c735100
test(NODE-3405): fix gridfs tests to expect MongoStreamClosedError
andymina Jul 20, 2021
959cc54
style(NODE-3405): fix linter errors
andymina Jul 20, 2021
0b85ae2
refactor(NODE-3405): replace more MongoDriverError
andymina Jul 21, 2021
3ae8af9
test(NODE-3405): fix GridFS test waiting for the wrong error
andymina Jul 21, 2021
86e92d4
test(NODE-3405): fix tests waiting for outdated errors
andymina Jul 21, 2021
bf7a3d7
test(NODE-3405): fix ChangeStream test
andymina Jul 21, 2021
f7da7af
test(NODE-3405): fix ChangeStream test waiting for outdated error
andymina Jul 21, 2021
f69a770
style(NODE-3405): update TODO comments to point to correct tix
andymina Jul 22, 2021
1626d3f
style(NODE-3405): revert import order
andymina Jul 26, 2021
aa03372
refactor(NODE-3405): replace MongoDriverError with MongoRuntime children
andymina Jul 26, 2021
74116f7
style(NODE-3405): refine TODOs
andymina Jul 26, 2021
673aa1b
refactor(NODE-3405): add default msg to error classes
andymina Jul 26, 2021
5284124
refactor(NODE-3405): use MongoAPIError
andymina Jul 28, 2021
a638d0e
refactor(NODE-3405): use maybePromise in GridFS abort
andymina Aug 10, 2021
dda537a
refactor(NODE-3405): use maybePromise in GridFS abort
andymina Aug 10, 2021
3264b92
style(NODE-3405): add TODO comment to replace error
andymina Aug 10, 2021
3f0f768
refactor(NODE-3405): add default message for MongoExpiredSessionError
andymina Aug 10, 2021
79c4da1
refactor(NODE-3405): revert use MongoAPIError and tidy up errmsgs
andymina Aug 11, 2021
7c56f63
test(NODE-3405): fix test waiting for the wrong error
andymina Aug 12, 2021
47563f2
test(NODE-3405): fix Topology test waiting for an outdated error
andymina Aug 12, 2021
719b3bf
style(NODE-3405): fix spelling in TODO comments and update use of Mon…
andymina Aug 12, 2021
5332a67
style(NODE-3405): unify default param format in error constructors
andymina Aug 12, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 14 additions & 12 deletions src/change_stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import {
isResumableError,
MongoDriverError,
MongoAPIError,
MongoChangeStreamError
MongoChangeStreamError,
MongoRuntimeError
} from './error';
import { AggregateOperation, AggregateOptions } from './operations/aggregate';
import {
Expand Down Expand Up @@ -558,8 +559,9 @@ function setIsEmitter<TSchema>(changeStream: ChangeStream<TSchema>): void {

function setIsIterator<TSchema>(changeStream: ChangeStream<TSchema>): void {
if (changeStream[kMode] === 'emitter') {
// TODO(NODE-3485): Replace with MongoChangeStreamModeError
throw new MongoAPIError(
'ChangeStream cannot be used as an EventEmitter after being used as an iterator'
'ChangeStream cannot be used as an iterator after being used as an EventEmitter'
);
}
changeStream[kMode] = 'iterator';
Expand Down Expand Up @@ -683,15 +685,15 @@ function processNewChange<TSchema>(
callback?: Callback<ChangeStreamDocument<TSchema>>
) {
if (changeStream[kClosed]) {
// TODO(NODE-3405): Replace with MongoStreamClosedError
if (callback) callback(new MongoDriverError(CHANGESTREAM_CLOSED_ERROR));
// TODO(NODE-3485): Replace with MongoChangeStreamClosedError
if (callback) callback(new MongoAPIError(CHANGESTREAM_CLOSED_ERROR));
return;
}

// a null change means the cursor has been notified, implicitly closing the change stream
if (change == null) {
// TODO(NODE-3405): Replace with MongoStreamClosedError
return closeWithError(changeStream, new MongoDriverError(CHANGESTREAM_CLOSED_ERROR), callback);
// TODO(NODE-3485): Replace with MongoChangeStreamClosedError
return closeWithError(changeStream, new MongoRuntimeError(CHANGESTREAM_CLOSED_ERROR), callback);
}

if (change && !change._id) {
Expand Down Expand Up @@ -723,8 +725,8 @@ function processError<TSchema>(

// If the change stream has been closed explicitly, do not process error.
if (changeStream[kClosed]) {
// TODO(NODE-3405): Replace with MongoStreamClosedError
if (callback) callback(new MongoDriverError(CHANGESTREAM_CLOSED_ERROR));
// TODO(NODE-3485): Replace with MongoChangeStreamClosedError
if (callback) callback(new MongoAPIError(CHANGESTREAM_CLOSED_ERROR));
return;
}

Expand Down Expand Up @@ -784,8 +786,8 @@ function processError<TSchema>(
*/
function getCursor<T>(changeStream: ChangeStream<T>, callback: Callback<ChangeStreamCursor<T>>) {
if (changeStream[kClosed]) {
// TODO(NODE-3405): Replace with MongoStreamClosedError
callback(new MongoDriverError(CHANGESTREAM_CLOSED_ERROR));
// TODO(NODE-3485): Replace with MongoChangeStreamClosedError
callback(new MongoAPIError(CHANGESTREAM_CLOSED_ERROR));
return;
}

Expand All @@ -810,8 +812,8 @@ function processResumeQueue<TSchema>(changeStream: ChangeStream<TSchema>, err?:
const request = changeStream[kResumeQueue].pop();
if (!err) {
if (changeStream[kClosed]) {
// TODO(NODE-3405): Replace with MongoStreamClosedError
request(new MongoDriverError(CHANGESTREAM_CLOSED_ERROR));
// TODO(NODE-3485): Replace with MongoChangeStreamClosedError
request(new MongoAPIError(CHANGESTREAM_CLOSED_ERROR));
return;
}
if (!changeStream.cursor) {
Expand Down
2 changes: 1 addition & 1 deletion src/cmap/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ export class Query {

// Validate that we are not passing 0x00 in the collection name
if (ns.indexOf('\x00') !== -1) {
// TODO(NODE-3483): Replace with MongoCommandError
// TODO(NODE-3483): Use MongoNamespace static method
throw new MongoDriverError('Namespace cannot contain a null character');
}

Expand Down
10 changes: 8 additions & 2 deletions src/cmap/connection_pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@ import { Logger } from '../logger';
import { ConnectionPoolMetrics } from './metrics';
import { connect } from './connect';
import { eachAsync, makeCounter, Callback } from '../utils';
import { MongoDriverError, MongoError, MongoInvalidArgumentError } from '../error';
import {
MongoError,
MongoInvalidArgumentError,
MongoDriverError,
MongoRuntimeError
} from '../error';
import { PoolClosedError, WaitQueueTimeoutError } from './errors';
import {
ConnectionPoolCreatedEvent,
Expand Down Expand Up @@ -388,7 +393,8 @@ export class ConnectionPool extends TypedEventEmitter<ConnectionPoolEvents> {
clearTimeout(waitQueueMember.timer);
}
if (!waitQueueMember[kCancelled]) {
waitQueueMember.callback(new MongoDriverError('connection pool closed'));
// TODO(NODE-3483): Replace with MongoConnectionPoolClosedError
waitQueueMember.callback(new MongoRuntimeError('Connection pool closed'));
}
}
}
Expand Down
18 changes: 9 additions & 9 deletions src/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,8 +226,8 @@ export class MongoRuntimeError extends MongoDriverError {
* @category Error
*/
export class MongoBatchReExecutionError extends MongoAPIError {
constructor(message?: string) {
super(message || 'This batch has already been executed, create new batch to execute');
constructor(message = 'This batch has already been executed, create new batch to execute') {
super(message);
}

get name(): string {
Expand Down Expand Up @@ -294,7 +294,7 @@ export class MongoTransactionError extends MongoAPIError {
* @category Error
*/
export class MongoExpiredSessionError extends MongoAPIError {
constructor(message: string) {
constructor(message = 'Cannot use a session that has ended') {
super(message);
}

Expand Down Expand Up @@ -343,8 +343,8 @@ export class MongoChangeStreamError extends MongoRuntimeError {
* @category Error
*/
export class MongoTailableCursorError extends MongoAPIError {
constructor(message?: string) {
super(message || 'Tailable cursor does not support this operation');
constructor(message = 'Tailable cursor does not support this operation') {
super(message);
}

get name(): string {
Expand Down Expand Up @@ -392,8 +392,8 @@ export class MongoGridFSChunkError extends MongoRuntimeError {
* @category Error
*/
export class MongoCursorInUseError extends MongoAPIError {
constructor(message?: string) {
super(message || 'Cursor is already initialized');
constructor(message = 'Cursor is already initialized') {
super(message);
}

get name(): string {
Expand All @@ -409,7 +409,7 @@ export class MongoCursorInUseError extends MongoAPIError {
* @category Error
*/
export class MongoServerClosedError extends MongoAPIError {
constructor(message: string) {
constructor(message = 'Server is closed') {
super(message);
}

Expand Down Expand Up @@ -442,7 +442,7 @@ export class MongoCursorExhaustedError extends MongoAPIError {
* @category Error
*/
export class MongoTopologyClosedError extends MongoAPIError {
constructor(message: string) {
constructor(message = 'Topology is closed') {
super(message);
}

Expand Down
45 changes: 15 additions & 30 deletions src/gridfs/upload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,8 @@ import { Writable } from 'stream';
import type { Document } from '../bson';
import { ObjectId } from '../bson';
import type { Collection } from '../collection';
import {
AnyError,
MONGODB_ERROR_CODES,
MongoDriverError,
MongoError,
MongoGridFSStreamError
} from '../error';
import { PromiseProvider } from '../promise_provider';
import type { Callback } from '../utils';
import { AnyError, MONGODB_ERROR_CODES, MongoError, MongoAPIError } from '../error';
import { Callback, maybePromise } from '../utils';
import type { WriteConcernOptions } from '../write_concern';
import { WriteConcern } from './../write_concern';
import type { GridFSFile } from './download';
Expand Down Expand Up @@ -149,27 +142,19 @@ export class GridFSBucketWriteStream extends Writable {
abort(): Promise<void>;
abort(callback: Callback<void>): void;
abort(callback?: Callback<void>): Promise<void> | void {
const Promise = PromiseProvider.get();
let error: MongoGridFSStreamError;
if (this.state.streamEnd) {
// TODO(NODE-3405): Replace with MongoStreamClosedError
error = new MongoDriverError('Cannot abort a stream that has already completed');
if (typeof callback === 'function') {
return callback(error);
return maybePromise(callback, callback => {
if (this.state.streamEnd) {
// TODO(NODE-3485): Replace with MongoGridFSStreamClosed
return callback(new MongoAPIError('Cannot abort a stream that has already completed'));
}
return Promise.reject(error);
}
if (this.state.aborted) {
// TODO(NODE-3405): Replace with MongoStreamClosedError
error = new MongoDriverError('Cannot call abort() on a stream twice');
if (typeof callback === 'function') {
return callback(error);

if (this.state.aborted) {
// TODO(NODE-3485): Replace with MongoGridFSStreamClosed
return callback(new MongoAPIError('Cannot call abort() on a stream twice'));
}
return Promise.reject(error);
}
this.state.aborted = true;
this.chunks.deleteMany({ files_id: this.id }, error => {
if (typeof callback === 'function') callback(error);

this.state.aborted = true;
this.chunks.deleteMany({ files_id: this.id }, error => callback(error));
});
}

Expand Down Expand Up @@ -565,8 +550,8 @@ function writeRemnant(stream: GridFSBucketWriteStream, callback?: Callback): boo
function checkAborted(stream: GridFSBucketWriteStream, callback?: Callback<void>): boolean {
if (stream.state.aborted) {
if (typeof callback === 'function') {
// TODO(NODE-3405): Replace with MongoStreamClosedError
callback(new MongoDriverError('this stream has been aborted'));
// TODO(NODE-3485): Replace with MongoGridFSStreamClosedError
callback(new MongoAPIError('Stream has been aborted'));
}
return true;
}
Expand Down
7 changes: 6 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,12 @@ export {
MongoBatchReExecutionError,
MongoCursorExhaustedError,
MongoCursorInUseError,
MongoNotConnectedError
MongoNotConnectedError,
MongoExpiredSessionError,
MongoTransactionError,
MongoKerberosError,
MongoServerClosedError,
MongoTopologyClosedError
} from './error';
export { MongoBulkWriteError, BulkWriteOptions, AnyBulkWriteOperation } from './bulk/common';
export {
Expand Down
5 changes: 2 additions & 3 deletions src/operations/common_functions.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { MongoDriverError } from '../error';
import { MongoTopologyClosedError } from '../error';
import { Callback, getTopology } from '../utils';
import type { Document } from '../bson';
import type { Db } from '../db';
Expand Down Expand Up @@ -41,8 +41,7 @@ export function indexInformation(
const full = options.full == null ? false : options.full;

// Did the user destroy the topology
if (getTopology(db).isDestroyed())
return callback(new MongoDriverError('topology was destroyed'));
if (getTopology(db).isDestroyed()) return callback(new MongoTopologyClosedError());
// Process all the results from the index command and collection
function processResults(indexes: any) {
// Contains all the information
Expand Down
15 changes: 7 additions & 8 deletions src/operations/execute_operation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import {
MongoDriverError,
MongoNetworkError,
MongoCompatibilityError,
MongoServerError
MongoServerError,
MongoExpiredSessionError,
MongoTransactionError
} from '../error';
import { Aspect, AbstractOperation } from './operation';
import { maxWireVersion, maybePromise, Callback } from '../utils';
Expand Down Expand Up @@ -88,10 +90,9 @@ export function executeOperation<
owner = Symbol();
session = topology.startSession({ owner, explicit: false });
} else if (session.hasEnded) {
// TODO(NODE-3405): Change this out for MongoExpiredSessionError
return cb(new MongoDriverError('Use of expired sessions is not permitted'));
return cb(new MongoExpiredSessionError('Use of expired sessions is not permitted'));
} else if (session.snapshotEnabled && !topology.capabilities.supportsSnapshotReads) {
return cb(new MongoDriverError('Snapshot reads require MongoDB 5.0 or later'));
return cb(new MongoCompatibilityError('Snapshot reads require MongoDB 5.0 or later'));
}
} else if (session) {
// If the user passed an explicit session and we are still, after server selection,
Expand Down Expand Up @@ -132,8 +133,7 @@ function executeWithServerSelection(

if (inTransaction && !readPreference.equals(ReadPreference.primary)) {
callback(
// TODO(NODE-3405): Change this out for MongoTransactionError
new MongoDriverError(
new MongoTransactionError(
`Read preference in a transaction must be primary, not: ${readPreference.mode}`
)
);
Expand Down Expand Up @@ -218,8 +218,7 @@ function executeWithServerSelection(
session.inTransaction()
) {
callback(
// TODO(NODE-3405): Change this out for MongoTransactionError
new MongoDriverError(
new MongoTransactionError(
`Read preference in a transaction must be primary, not: ${readPreference.mode}`
)
);
Expand Down
13 changes: 6 additions & 7 deletions src/sdam/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ import {
isRetryableWriteError,
isNodeShuttingDownError,
isNetworkErrorBeforeHandshake,
MongoDriverError,
MongoCompatibilityError,
MongoInvalidArgumentError
MongoInvalidArgumentError,
MongoServerClosedError
} from '../error';
import {
Connection,
Expand Down Expand Up @@ -292,8 +292,7 @@ export class Server extends TypedEventEmitter<ServerEvents> {
}

if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) {
// TODO(NODE-3405): Change this out for MongoServerClosedError
callback(new MongoDriverError('Server is closed'));
callback(new MongoServerClosedError());
return;
}

Expand Down Expand Up @@ -351,7 +350,7 @@ export class Server extends TypedEventEmitter<ServerEvents> {
*/
query(ns: MongoDBNamespace, cmd: Document, options: QueryOptions, callback: Callback): void {
if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) {
callback(new MongoDriverError('server is closed'));
callback(new MongoServerClosedError());
return;
}

Expand Down Expand Up @@ -385,7 +384,7 @@ export class Server extends TypedEventEmitter<ServerEvents> {
callback: Callback<Document>
): void {
if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) {
callback(new MongoDriverError('server is closed'));
callback(new MongoServerClosedError());
return;
}

Expand Down Expand Up @@ -420,7 +419,7 @@ export class Server extends TypedEventEmitter<ServerEvents> {
): void {
if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) {
if (typeof callback === 'function') {
callback(new MongoDriverError('server is closed'));
callback(new MongoServerClosedError());
}

return;
Expand Down
14 changes: 8 additions & 6 deletions src/sdam/topology.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ import {
} from '../sessions';
import { SrvPoller, SrvPollingEvent } from './srv_polling';
import { CMAP_EVENTS, ConnectionPoolEvents } from '../cmap/connection_pool';
import { MongoServerSelectionError, MongoCompatibilityError, MongoDriverError } from '../error';
import {
MongoServerSelectionError,
MongoCompatibilityError,
MongoDriverError,
MongoTopologyClosedError
} from '../error';
import { readPreferenceServerSelector, ServerSelector } from './server_selection';
import {
makeStateMachine,
Expand Down Expand Up @@ -491,7 +496,7 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {

stateTransition(this, STATE_CLOSING);

drainWaitQueue(this[kWaitQueue], new MongoDriverError('Topology closed'));
drainWaitQueue(this[kWaitQueue], new MongoTopologyClosedError());
drainTimerQueue(this.s.connectionTimers);

if (this.s.srvPoller) {
Expand Down Expand Up @@ -979,10 +984,7 @@ function drainWaitQueue(queue: Denque<ServerSelectionRequest>, err?: MongoDriver

function processWaitQueue(topology: Topology) {
if (topology.s.state === STATE_CLOSED) {
drainWaitQueue(
topology[kWaitQueue],
new MongoDriverError('Topology is closed, please connect')
);
drainWaitQueue(topology[kWaitQueue], new MongoTopologyClosedError());
return;
}

Expand Down
Loading