Skip to content

Commit 6680b9f

Browse files
committed
remove options type from AbstractOperation
1 parent 58b0b0d commit 6680b9f

File tree

11 files changed

+50
-54
lines changed

11 files changed

+50
-54
lines changed

src/operations/bulk_write.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import type {
1010
import type { Server } from '../sdam/server';
1111

1212
/** @internal */
13-
export class BulkWriteOperation extends AbstractOperation<BulkWriteOptions, BulkWriteResult> {
13+
export class BulkWriteOperation extends AbstractOperation<BulkWriteResult> {
14+
options: BulkWriteOptions;
1415
collection: Collection;
1516
operations: AnyBulkWriteOperation[];
1617

@@ -20,7 +21,7 @@ export class BulkWriteOperation extends AbstractOperation<BulkWriteOptions, Bulk
2021
options: BulkWriteOptions
2122
) {
2223
super(options);
23-
24+
this.options = options;
2425
this.collection = collection;
2526
this.operations = operations;
2627
}

src/operations/collections.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ export interface CollectionsOptions extends OperationOptions {
1212
}
1313

1414
/** @internal */
15-
export class CollectionsOperation extends AbstractOperation<CollectionsOptions, Collection[]> {
15+
export class CollectionsOperation extends AbstractOperation<Collection[]> {
16+
options: CollectionsOptions;
1617
db: Db;
1718

1819
constructor(db: Db, options: CollectionsOptions) {
1920
super(options);
20-
21+
this.options = options;
2122
this.db = db;
2223
}
2324

src/operations/delete.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import type { Callback, MongoDBNamespace } from '../utils';
66
import type { Document } from '../bson';
77
import type { Server } from '../sdam/server';
88
import type { Collection } from '../collection';
9-
import type { WriteCommandOptions } from '../cmap/wire_protocol/write_command';
109
import type { Connection } from '../cmap/connection';
10+
import type { WriteCommandOptions } from '../cmap/wire_protocol/write_command';
1111

1212
/** @public */
1313
export interface DeleteOptions extends CommandOperationOptions {
@@ -28,11 +28,13 @@ export interface DeleteResult {
2828
}
2929

3030
/** @internal */
31-
export class DeleteOperation extends AbstractOperation<DeleteOptions, Document> {
31+
export class DeleteOperation extends AbstractOperation<Document> {
32+
options: DeleteOptions;
3233
operations: Document[];
3334

3435
constructor(ns: MongoDBNamespace, ops: Document[], options: DeleteOptions) {
3536
super(options);
37+
this.options = options;
3638
this.ns = ns;
3739
this.operations = ops;
3840
}

src/operations/execute_operation.ts

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ReadPreference } from '../read_preference';
22
import { MongoError, isRetryableError, AnyError } from '../error';
3-
import { Aspect, AbstractOperation, OperationOptions } from './operation';
3+
import { Aspect, AbstractOperation } from './operation';
44
import { maxWireVersion, maybePromise, Callback } from '../utils';
55
import { ServerType } from '../sdam/common';
66
import type { Server } from '../sdam/server';
@@ -12,13 +12,7 @@ const MMAPv1_RETRY_WRITES_ERROR_CODE = 20;
1212
const MMAPv1_RETRY_WRITES_ERROR_MESSAGE =
1313
'This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string.';
1414

15-
type ResultTypeFromOperation<TOperation> = TOperation extends AbstractOperation<
16-
OperationOptions,
17-
infer K
18-
>
19-
? K
20-
: never;
21-
type OptionsFromOperation<TOperation> = TOperation extends AbstractOperation<infer K, unknown>
15+
type ResultTypeFromOperation<TOperation> = TOperation extends AbstractOperation<infer K>
2216
? K
2317
: never;
2418

@@ -48,23 +42,19 @@ export interface ExecutionResult {
4842
* @param callback - The command result callback
4943
*/
5044
export function executeOperation<
51-
T extends AbstractOperation<TOptions, TResult>,
52-
TOptions = OptionsFromOperation<T>,
45+
T extends AbstractOperation<TResult>,
5346
TResult = ResultTypeFromOperation<T>
5447
>(topology: Topology, operation: T): Promise<TResult>;
5548
export function executeOperation<
56-
T extends AbstractOperation<TOptions, TResult>,
57-
TOptions = OptionsFromOperation<T>,
49+
T extends AbstractOperation<TResult>,
5850
TResult = ResultTypeFromOperation<T>
5951
>(topology: Topology, operation: T, callback: Callback<TResult>): void;
6052
export function executeOperation<
61-
T extends AbstractOperation<TOptions, TResult>,
62-
TOptions = OptionsFromOperation<T>,
53+
T extends AbstractOperation<TResult>,
6354
TResult = ResultTypeFromOperation<T>
6455
>(topology: Topology, operation: T, callback?: Callback<TResult>): Promise<TResult> | void;
6556
export function executeOperation<
66-
T extends AbstractOperation<TOptions, TResult>,
67-
TOptions = OptionsFromOperation<T>,
57+
T extends AbstractOperation<TResult>,
6858
TResult = ResultTypeFromOperation<T>
6959
>(topology: Topology, operation: T, callback?: Callback<TResult>): Promise<TResult> | void {
7060
if (!(operation instanceof AbstractOperation)) {
@@ -79,7 +69,7 @@ export function executeOperation<
7969
return;
8070
}
8171

82-
executeOperation<T, TOptions, TResult>(topology, operation, cb);
72+
executeOperation<T, TResult>(topology, operation, cb);
8373
});
8474
});
8575
}

src/operations/indexes.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,13 @@ function makeIndexSpec(indexSpec: IndexSpecification, options: any): IndexDescri
126126
}
127127

128128
/** @internal */
129-
export class IndexesOperation extends AbstractOperation<IndexInformationOptions, Document> {
129+
export class IndexesOperation extends AbstractOperation<Document> {
130+
options: IndexInformationOptions;
130131
collection: Collection;
131132

132133
constructor(collection: Collection, options: IndexInformationOptions) {
133134
super(options);
134-
135+
this.options = options;
135136
this.collection = collection;
136137
}
137138

@@ -401,7 +402,8 @@ export class ListIndexesCursor extends AbstractCursor {
401402
}
402403

403404
/** @internal */
404-
export class IndexExistsOperation extends AbstractOperation<IndexInformationOptions, boolean> {
405+
export class IndexExistsOperation extends AbstractOperation<boolean> {
406+
options: IndexInformationOptions;
405407
collection: Collection;
406408
indexes: string | string[];
407409

@@ -411,7 +413,7 @@ export class IndexExistsOperation extends AbstractOperation<IndexInformationOpti
411413
options: IndexInformationOptions
412414
) {
413415
super(options);
414-
416+
this.options = options;
415417
this.collection = collection;
416418
this.indexes = indexes;
417419
}
@@ -440,13 +442,14 @@ export class IndexExistsOperation extends AbstractOperation<IndexInformationOpti
440442
}
441443

442444
/** @internal */
443-
export class IndexInformationOperation extends AbstractOperation<IndexInformationOptions, Document> {
445+
export class IndexInformationOperation extends AbstractOperation<Document> {
446+
options: IndexInformationOptions;
444447
db: Db;
445448
name: string;
446449

447450
constructor(db: Db, name: string, options?: IndexInformationOptions) {
448451
super(options);
449-
452+
this.options = options || {};
450453
this.db = db;
451454
this.name = name;
452455
}

src/operations/insert.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ import type { BulkWriteOptions } from '../bulk/common';
1212
import type { WriteConcernOptions } from '../write_concern';
1313

1414
/** @internal */
15-
export class InsertOperation extends AbstractOperation<BulkWriteOptions, Document> {
15+
export class InsertOperation extends AbstractOperation<Document> {
16+
options: BulkWriteOptions;
1617
operations: Document[];
1718

1819
constructor(ns: MongoDBNamespace, ops: Document[], options: BulkWriteOptions) {
1920
super(options);
21+
this.options = options;
2022
this.ns = ns;
2123
this.operations = ops;
2224
}

src/operations/insert_many.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ export interface InsertManyResult {
2121
}
2222

2323
/** @internal */
24-
export class InsertManyOperation extends AbstractOperation<BulkWriteOptions, InsertManyResult> {
24+
export class InsertManyOperation extends AbstractOperation<InsertManyResult> {
25+
options: BulkWriteOptions;
2526
collection: Collection;
2627
docs: Document[];
2728

2829
constructor(collection: Collection, docs: Document[], options: BulkWriteOptions) {
2930
super(options);
30-
31+
this.options = options;
3132
this.collection = collection;
3233
this.docs = docs;
3334
}

src/operations/is_capped.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import type { Server } from '../sdam/server';
55
import { MongoError } from '..';
66

77
/** @internal */
8-
export class IsCappedOperation extends AbstractOperation<OperationOptions, boolean> {
8+
export class IsCappedOperation extends AbstractOperation<boolean> {
9+
options: OperationOptions;
910
collection: Collection;
1011

1112
constructor(collection: Collection, options: OperationOptions) {
1213
super(options);
14+
this.options = options;
1315
this.collection = collection;
1416
}
1517

src/operations/operation.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,16 @@ export interface OperationOptions extends BSONSerializeOptions {
2828
readPreference?: ReadPreferenceLike;
2929
}
3030

31+
const kSession = Symbol('session');
32+
3133
/**
3234
* This class acts as a parent class for any operation and is responsible for setting this.options,
3335
* as well as setting and getting a session.
3436
* Additionally, this class implements `hasAspect`, which determines whether an operation has
3537
* a specific aspect.
3638
* @internal
3739
*/
38-
export abstract class AbstractOperation<
39-
T extends OperationOptions = OperationOptions,
40-
TResult = Document
41-
> {
42-
options: T;
40+
export abstract class AbstractOperation<T = Document> {
4341
ns!: MongoDBNamespace;
4442
cmd!: Document;
4543
readPreference: ReadPreference;
@@ -49,21 +47,18 @@ export abstract class AbstractOperation<
4947
// BSON serialization options
5048
bsonOptions?: BSONSerializeOptions;
5149

52-
constructor(options: T = {} as T) {
53-
this.options = Object.assign({}, options);
50+
[kSession]: ClientSession;
5451

52+
constructor(options: OperationOptions = {}) {
5553
this.readPreference = this.hasAspect(Aspect.WRITE_OPERATION)
5654
? ReadPreference.primary
5755
: ReadPreference.fromOptions(options) ?? ReadPreference.primary;
58-
// TODO: A lot of our code depends on having the read preference in the options. This should
59-
// go away, but also requires massive test rewrites.
60-
this.options.readPreference = this.readPreference;
6156

6257
// Pull the BSON serialize options from the already-resolved options
6358
this.bsonOptions = resolveBSONOptions(options);
6459
}
6560

66-
abstract execute(server: Server, callback: Callback<TResult>): void;
61+
abstract execute(server: Server, callback: Callback<T>): void;
6762

6863
hasAspect(aspect: symbol): boolean {
6964
const ctor = this.constructor as OperationConstructor;
@@ -75,19 +70,15 @@ export abstract class AbstractOperation<
7570
}
7671

7772
set session(session: ClientSession) {
78-
Object.assign(this.options, { session });
73+
this[kSession] = session;
7974
}
8075

8176
get session(): ClientSession {
82-
// NOTE: Using the bang operator here because we know there is always a
83-
// session, explicit or implicit. We should disambiguate the session
84-
// from the options and set it as an explicit field
85-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
86-
return this.options.session!;
77+
return this[kSession];
8778
}
8879

8980
clearSession(): void {
90-
delete this.options.session;
81+
// this[kSession] = undefined;
9182
}
9283

9384
get canRetryRead(): boolean {

src/operations/options_operation.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import type { Collection } from '../collection';
66
import type { Server } from '../sdam/server';
77

88
/** @internal */
9-
export class OptionsOperation extends AbstractOperation<OperationOptions, Document> {
9+
export class OptionsOperation extends AbstractOperation<Document> {
10+
options: OperationOptions;
1011
collection: Collection;
1112

1213
constructor(collection: Collection, options: OperationOptions) {
1314
super(options);
14-
15+
this.options = options;
1516
this.collection = collection;
1617
}
1718

src/operations/update.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ export interface UpdateResult {
4141
}
4242

4343
/** @internal */
44-
export class UpdateOperation extends AbstractOperation<UpdateOptions, Document> {
44+
export class UpdateOperation extends AbstractOperation<Document> {
45+
options: UpdateOptions;
4546
operations: Document[];
4647

4748
constructor(ns: MongoDBNamespace, ops: Document[], options: UpdateOptions) {
4849
super(options);
50+
this.options = options;
4951
this.ns = ns;
5052
this.operations = ops;
5153
}

0 commit comments

Comments
 (0)