Skip to content

Commit 0d0558b

Browse files
committed
feat(NODE-4520): add wrappers async driver APIs
1 parent 17dbe5b commit 0d0558b

16 files changed

+1381
-3
lines changed

.mocharc.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
"$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/mocharc.json",
33
"extension": ["js", "ts"],
44
"recursive": true,
5-
"failZero": false,
5+
"failZero": true,
66
"sort": true,
77
"color": true,
88
"require": [
99
"source-map-support/register",
10-
"ts-node/register"
10+
"ts-node/register",
11+
"test/hooks/addons.js"
1112
]
1213
}

src/index.js

+77-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,79 @@
11
'use strict';
22

3-
throw new Error('Work In Progress - Not intended for use at this time');
3+
const mongodb = require('mongodb');
4+
5+
const { makeLegacyMongoClient } = require('./legacy_wrappers/mongo_client');
6+
const { makeLegacyDb } = require('./legacy_wrappers/db');
7+
const { makeLegacyCollection } = require('./legacy_wrappers/collection');
8+
const { makeLegacyAdmin } = require('./legacy_wrappers/admin');
9+
const {
10+
makeLegacyAggregationCursor,
11+
makeLegacyFindCursor,
12+
makeLegacyListCollectionsCursor,
13+
makeLegacyListIndexesCursor
14+
} = require('./legacy_wrappers/cursors');
15+
const {
16+
makeLegacyGridFSBucket,
17+
makeLegacyGridFSBucketWriteStream
18+
} = require('./legacy_wrappers/gridfs');
19+
const { makeLegacyChangeStream } = require('./legacy_wrappers/change_stream');
20+
const { makeLegacyClientSession } = require('./legacy_wrappers/session');
21+
const {
22+
makeLegacyUnorderedBulkOperation,
23+
makeLegacyOrderedBulkOperation
24+
} = require('./legacy_wrappers/bulk');
25+
26+
/** @type {import('..')} */
27+
module.exports = Object.create(null);
28+
Object.defineProperty(module.exports, '__esModule', { value: true });
29+
30+
const classesWithAsyncAPIs = new Map([
31+
['Admin', makeLegacyAdmin],
32+
['FindCursor', makeLegacyFindCursor],
33+
['ListCollectionsCursor', makeLegacyListCollectionsCursor],
34+
['ListIndexesCursor', makeLegacyListIndexesCursor],
35+
['AggregationCursor', makeLegacyAggregationCursor],
36+
['ChangeStream', makeLegacyChangeStream],
37+
['Collection', makeLegacyCollection],
38+
['Db', makeLegacyDb],
39+
['GridFSBucket', makeLegacyGridFSBucket],
40+
['ClientSession', makeLegacyClientSession],
41+
['MongoClient', makeLegacyMongoClient],
42+
43+
// Need to be exported top-level still
44+
['ClientSession', makeLegacyClientSession],
45+
['GridFSBucketWriteStream', makeLegacyGridFSBucketWriteStream],
46+
['OrderedBulkOperation', makeLegacyOrderedBulkOperation],
47+
['UnorderedBulkOperation', makeLegacyUnorderedBulkOperation]
48+
]);
49+
50+
const TODO_SPECIAL_IMPORTS = new Map([
51+
['ClientSession', '/lib/sessions'],
52+
['GridFSBucketWriteStream', '/lib/gridfs/upload'],
53+
['OrderedBulkOperation', '/lib/bulk/ordered'],
54+
['UnorderedBulkOperation', '/lib/bulk/unordered']
55+
]);
56+
57+
for (const [missingTopLevelClassName, location] of TODO_SPECIAL_IMPORTS) {
58+
mongodb[missingTopLevelClassName] = require(`mongodb${location}`)[missingTopLevelClassName];
59+
}
60+
61+
for (const [mongodbExportName, mongodbExportValue] of Object.entries(mongodb)) {
62+
let makeLegacyClass = classesWithAsyncAPIs.get(mongodbExportName);
63+
if (makeLegacyClass != null) {
64+
const patchedClass = makeLegacyClass(mongodbExportValue);
65+
Object.defineProperty(module.exports, mongodbExportName, {
66+
enumerable: true,
67+
get: function () {
68+
return patchedClass;
69+
}
70+
});
71+
} else {
72+
Object.defineProperty(module.exports, mongodbExportName, {
73+
enumerable: true,
74+
get: function () {
75+
return mongodbExportValue;
76+
}
77+
});
78+
}
79+
}

src/legacy_wrappers/admin.js

+136
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
'use strict';
2+
3+
const { toLegacy, maybeCallback } = require('../utils');
4+
5+
module.exports = Object.create(null);
6+
Object.defineProperty(module.exports, '__esModule', { value: true });
7+
8+
module.exports.makeLegacyAdmin = function (baseClass) {
9+
class LegacyAdmin extends baseClass {
10+
addUser(username, password, options, callback) {
11+
callback =
12+
typeof callback === 'function'
13+
? callback
14+
: typeof options === 'function'
15+
? options
16+
: typeof password === 'function'
17+
? password
18+
: undefined;
19+
options =
20+
typeof options !== 'function'
21+
? options
22+
: typeof password !== 'function'
23+
? password
24+
: undefined;
25+
return maybeCallback(super.addUser(username, password, options), callback);
26+
}
27+
28+
buildInfo(options, callback) {
29+
callback =
30+
typeof callback === 'function'
31+
? callback
32+
: typeof options === 'function'
33+
? options
34+
: undefined;
35+
options = typeof options !== 'function' ? options : undefined;
36+
return maybeCallback(super.buildInfo(options), callback);
37+
}
38+
39+
command(command, options, callback) {
40+
callback =
41+
typeof callback === 'function'
42+
? callback
43+
: typeof options === 'function'
44+
? options
45+
: undefined;
46+
options = typeof options !== 'function' ? options : undefined;
47+
return maybeCallback(super.command(command, options), callback);
48+
}
49+
50+
listDatabases(options, callback) {
51+
callback =
52+
typeof callback === 'function'
53+
? callback
54+
: typeof options === 'function'
55+
? options
56+
: undefined;
57+
options = typeof options !== 'function' ? options : undefined;
58+
return maybeCallback(super.listDatabases(options), callback);
59+
}
60+
61+
ping(options, callback) {
62+
callback =
63+
typeof callback === 'function'
64+
? callback
65+
: typeof options === 'function'
66+
? options
67+
: undefined;
68+
options = typeof options !== 'function' ? options : undefined;
69+
return maybeCallback(super.ping(options), callback);
70+
}
71+
72+
removeUser(username, options, callback) {
73+
callback =
74+
typeof callback === 'function'
75+
? callback
76+
: typeof options === 'function'
77+
? options
78+
: undefined;
79+
options = typeof options !== 'function' ? options : undefined;
80+
return maybeCallback(super.removeUser(username, options), callback);
81+
}
82+
83+
replSetGetStatus(options, callback) {
84+
callback =
85+
typeof callback === 'function'
86+
? callback
87+
: typeof options === 'function'
88+
? options
89+
: undefined;
90+
options = typeof options !== 'function' ? options : undefined;
91+
return maybeCallback(super.replSetGetStatus(options), callback);
92+
}
93+
94+
serverInfo(options, callback) {
95+
callback =
96+
typeof callback === 'function'
97+
? callback
98+
: typeof options === 'function'
99+
? options
100+
: undefined;
101+
options = typeof options !== 'function' ? options : undefined;
102+
return maybeCallback(super.serverInfo(options), callback);
103+
}
104+
105+
serverStatus(options, callback) {
106+
callback =
107+
typeof callback === 'function'
108+
? callback
109+
: typeof options === 'function'
110+
? options
111+
: undefined;
112+
options = typeof options !== 'function' ? options : undefined;
113+
return maybeCallback(super.serverStatus(options), callback);
114+
}
115+
116+
validateCollection(name, options, callback) {
117+
callback =
118+
typeof callback === 'function'
119+
? callback
120+
: typeof options === 'function'
121+
? options
122+
: undefined;
123+
options = typeof options !== 'function' ? options : undefined;
124+
return maybeCallback(super.validateCollection(name, options), callback);
125+
}
126+
}
127+
128+
Object.defineProperty(baseClass.prototype, toLegacy, {
129+
enumerable: false,
130+
value: function () {
131+
return Object.setPrototypeOf(this, LegacyAdmin.prototype);
132+
}
133+
});
134+
135+
return LegacyAdmin;
136+
};

src/legacy_wrappers/bulk.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
'use strict';
2+
3+
const { maybeCallback } = require('../utils');
4+
5+
module.exports = Object.create(null);
6+
Object.defineProperty(module.exports, '__esModule', { value: true });
7+
8+
module.exports.makeLegacyOrderedBulkOperation = function (baseClass) {
9+
return class LegacyOrderedBulkOperation extends baseClass {
10+
execute(options, callback) {
11+
callback =
12+
typeof callback === 'function'
13+
? callback
14+
: typeof options === 'function'
15+
? options
16+
: undefined;
17+
options = typeof options !== 'function' ? options : undefined;
18+
return maybeCallback(super.execute(options), callback);
19+
}
20+
};
21+
};
22+
23+
module.exports.makeLegacyUnorderedBulkOperation = function (baseClass) {
24+
return class LegacyUnorderedBulkOperation extends baseClass {
25+
execute(options, callback) {
26+
callback =
27+
typeof callback === 'function'
28+
? callback
29+
: typeof options === 'function'
30+
? options
31+
: undefined;
32+
options = typeof options !== 'function' ? options : undefined;
33+
return maybeCallback(super.execute(options), callback);
34+
}
35+
};
36+
};

src/legacy_wrappers/change_stream.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict';
2+
3+
const { toLegacy, maybeCallback } = require('../utils');
4+
5+
module.exports = Object.create(null);
6+
Object.defineProperty(module.exports, '__esModule', { value: true });
7+
8+
module.exports.makeLegacyChangeStream = function (baseClass) {
9+
class LegacyChangeStream extends baseClass {
10+
close(callback) {
11+
return maybeCallback(super.close(), callback);
12+
}
13+
hasNext(callback) {
14+
return maybeCallback(super.hasNext(), callback);
15+
}
16+
next(callback) {
17+
return maybeCallback(super.next(), callback);
18+
}
19+
tryNext(callback) {
20+
return maybeCallback(super.tryNext(), callback);
21+
}
22+
}
23+
24+
Object.defineProperty(baseClass.prototype, toLegacy, {
25+
enumerable: false,
26+
value: function () {
27+
return Object.setPrototypeOf(this, LegacyChangeStream.prototype);
28+
}
29+
});
30+
31+
return LegacyChangeStream;
32+
};

0 commit comments

Comments
 (0)