mongodb-runner 4.10.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoCluster = void 0;
4
+ const mongoserver_1 = require("./mongoserver");
5
+ const mongodb_downloader_1 = require("@mongodb-js/mongodb-downloader");
6
+ const mongodb_1 = require("mongodb");
7
+ const util_1 = require("./util");
8
+ class MongoCluster {
9
+ constructor() {
10
+ this.topology = 'standalone';
11
+ this.servers = [];
12
+ this.shards = [];
13
+ }
14
+ serialize() {
15
+ return {
16
+ topology: this.topology,
17
+ replSetName: this.replSetName,
18
+ servers: this.servers.map((srv) => srv.serialize()),
19
+ shards: this.shards.map((shard) => shard.serialize()),
20
+ };
21
+ }
22
+ static async deserialize(serialized) {
23
+ const cluster = new MongoCluster();
24
+ cluster.topology = serialized.topology;
25
+ cluster.replSetName = serialized.replSetName;
26
+ cluster.servers = await Promise.all(serialized.servers.map((srv) => mongoserver_1.MongoServer.deserialize(srv)));
27
+ cluster.shards = await Promise.all(serialized.shards.map((shard) => MongoCluster.deserialize(shard)));
28
+ return cluster;
29
+ }
30
+ get hostport() {
31
+ return this.servers.map((srv) => srv.hostport).join(',');
32
+ }
33
+ get connectionString() {
34
+ return `mongodb://${this.hostport}/${this.replSetName ? `?replicaSet=${this.replSetName}` : ''}`;
35
+ }
36
+ get serverVersion() {
37
+ return this.servers[0].serverVersion;
38
+ }
39
+ get serverVariant() {
40
+ return this.servers[0].serverVariant;
41
+ }
42
+ static async start({ ...options }) {
43
+ var _a, _b, _c;
44
+ const cluster = new MongoCluster();
45
+ cluster.topology = options.topology;
46
+ if (!options.binDir) {
47
+ options.binDir = await (0, mongodb_downloader_1.downloadMongoDb)(options.tmpDir, options.version, options.downloadOptions);
48
+ }
49
+ if (options.topology === 'standalone') {
50
+ cluster.servers.push(await mongoserver_1.MongoServer.start({
51
+ ...options,
52
+ binary: 'mongod',
53
+ }));
54
+ }
55
+ else if (options.topology === 'replset') {
56
+ const { secondaries = 2, arbiters = 0 } = options;
57
+ const args = [...((_a = options.args) !== null && _a !== void 0 ? _a : [])];
58
+ let replSetName;
59
+ if (!args.includes('--replSet')) {
60
+ replSetName = `replSet-${(0, util_1.uuid)()}`;
61
+ args.push('--replSet', replSetName);
62
+ }
63
+ else {
64
+ replSetName = args[args.indexOf('--replSet') + 1];
65
+ }
66
+ const primaryArgs = [...args];
67
+ (0, util_1.debug)('Starting primary', primaryArgs);
68
+ const primary = await mongoserver_1.MongoServer.start({
69
+ ...options,
70
+ args: primaryArgs,
71
+ binary: 'mongod',
72
+ });
73
+ cluster.servers.push(primary);
74
+ if (args.includes('--port')) {
75
+ args.splice(args.indexOf('--port') + 1, 1, '0');
76
+ }
77
+ (0, util_1.debug)('Starting secondaries and arbiters', {
78
+ secondaries,
79
+ arbiters,
80
+ args,
81
+ });
82
+ cluster.servers.push(...(await Promise.all((0, util_1.range)(secondaries + arbiters).map(() => mongoserver_1.MongoServer.start({
83
+ ...options,
84
+ args,
85
+ binary: 'mongod',
86
+ })))));
87
+ await primary.withClient(async (client) => {
88
+ (0, util_1.debug)('Running rs.initiate');
89
+ const rsConf = {
90
+ _id: replSetName,
91
+ configsvr: args.includes('--configsvr'),
92
+ members: cluster.servers.map((srv, i) => {
93
+ return {
94
+ _id: i,
95
+ host: srv.hostport,
96
+ arbiterOnly: i > 1 + secondaries,
97
+ priority: i === 0 ? 1 : 0,
98
+ };
99
+ }),
100
+ };
101
+ await client.db('admin').command({
102
+ replSetInitiate: rsConf,
103
+ });
104
+ for (let i = 0; i < 60; i++) {
105
+ const status = await client.db('admin').command({
106
+ replSetGetStatus: 1,
107
+ });
108
+ if (status.members.some((member) => member.stateStr === 'PRIMARY')) {
109
+ (0, util_1.debug)('rs.status indicated primary for replset', status.set);
110
+ cluster.replSetName = status.set;
111
+ break;
112
+ }
113
+ (0, util_1.debug)('rs.status did not include primary, waiting...');
114
+ await (0, util_1.sleep)(1000);
115
+ }
116
+ });
117
+ }
118
+ else if (options.topology === 'sharded') {
119
+ const { shards = 3 } = options;
120
+ const shardArgs = [...((_b = options.args) !== null && _b !== void 0 ? _b : [])];
121
+ if (shardArgs.includes('--port')) {
122
+ shardArgs.splice(shardArgs.indexOf('--port') + 1, 1, '0');
123
+ }
124
+ (0, util_1.debug)('starting config server and shard servers', shardArgs);
125
+ const [configsvr, ...shardsvrs] = await Promise.all((0, util_1.range)(shards + 1).map((i) => MongoCluster.start({
126
+ ...options,
127
+ args: [...shardArgs, i > 0 ? '--shardsvr' : '--configsvr'],
128
+ topology: 'replset',
129
+ })));
130
+ cluster.shards.push(configsvr, ...shardsvrs);
131
+ (0, util_1.debug)('starting mongos');
132
+ const mongos = await mongoserver_1.MongoServer.start({
133
+ ...options,
134
+ binary: 'mongos',
135
+ args: [
136
+ ...((_c = options.args) !== null && _c !== void 0 ? _c : []),
137
+ '--configdb',
138
+ `${configsvr.replSetName}/${configsvr.hostport}`,
139
+ ],
140
+ });
141
+ cluster.servers.push(mongos);
142
+ await mongos.withClient(async (client) => {
143
+ for (const shard of shardsvrs) {
144
+ const shardSpec = `${shard.replSetName}/${shard.hostport}`;
145
+ (0, util_1.debug)('adding shard', shardSpec);
146
+ await client.db('admin').command({
147
+ addShard: shardSpec,
148
+ });
149
+ }
150
+ (0, util_1.debug)('added shards');
151
+ });
152
+ }
153
+ return cluster;
154
+ }
155
+ async close() {
156
+ await Promise.all([...this.servers, ...this.shards].map((closable) => closable.close()));
157
+ this.servers = [];
158
+ this.shards = [];
159
+ }
160
+ async withClient(fn) {
161
+ const client = await mongodb_1.MongoClient.connect(this.connectionString);
162
+ try {
163
+ return await fn(client);
164
+ }
165
+ finally {
166
+ await client.close(true);
167
+ }
168
+ }
169
+ ref() {
170
+ for (const child of [...this.servers, ...this.shards])
171
+ child.ref();
172
+ }
173
+ unref() {
174
+ for (const child of [...this.servers, ...this.shards])
175
+ child.unref();
176
+ }
177
+ }
178
+ exports.MongoCluster = MongoCluster;
179
+ //# sourceMappingURL=mongocluster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongocluster.js","sourceRoot":"","sources":["../src/mongocluster.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import type { Readable } from 'stream';
3
+ export declare function createLogEntryIterator(stdout: Readable): AsyncIterable<LogEntry>;
4
+ export declare type LogEntry = {
5
+ timestamp: string;
6
+ severity: string;
7
+ component: string;
8
+ context: string;
9
+ message: string;
10
+ id: number | undefined;
11
+ attr: any;
12
+ };
13
+ export declare function parseAnyLogEntry(line: string): LogEntry;
14
+ export declare function isFailureToSetupListener(entry: LogEntry): boolean;
15
+ export declare function filterLogStreamForPort(input: Readable): Promise<{
16
+ port: number;
17
+ }>;
18
+ //# sourceMappingURL=mongologreader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongologreader.d.ts","sourceRoot":"","sources":["../src/mongologreader.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIvC,wBAAuB,sBAAsB,CAC3C,MAAM,EAAE,QAAQ,GACf,aAAa,CAAC,QAAQ,CAAC,CAYzB;AAGD,oBAAY,QAAQ,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAyBF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAevD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAKjE;AA0CD,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB3B"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filterLogStreamForPort = exports.isFailureToSetupListener = exports.parseAnyLogEntry = exports.createLogEntryIterator = void 0;
4
+ const stream_1 = require("stream");
5
+ const readline_1 = require("readline");
6
+ async function* createLogEntryIterator(stdout) {
7
+ for await (const line of (0, readline_1.createInterface)({ input: stdout })) {
8
+ if (!line.trim()) {
9
+ continue;
10
+ }
11
+ try {
12
+ const logEntry = parseAnyLogEntry(line);
13
+ yield logEntry;
14
+ }
15
+ catch (error) {
16
+ break;
17
+ }
18
+ }
19
+ }
20
+ exports.createLogEntryIterator = createLogEntryIterator;
21
+ function parseOldLogEntry(line) {
22
+ const re = /^(?<timestamp>\S*) *(?<severity>\S*) *(?<component>\S*) *\[(?<context>[^\]]+)\]\s*(?<message>.*)$/;
23
+ const match = re.exec(line.trim());
24
+ if (!match) {
25
+ throw new Error(`Could not parse line ${JSON.stringify(line)}`);
26
+ }
27
+ return match.groups;
28
+ }
29
+ function parseAnyLogEntry(line) {
30
+ var _a;
31
+ try {
32
+ const newFormat = JSON.parse(line);
33
+ return {
34
+ id: newFormat.id,
35
+ timestamp: (_a = newFormat.t) === null || _a === void 0 ? void 0 : _a.$date,
36
+ severity: newFormat.s,
37
+ component: newFormat.c,
38
+ context: newFormat.ctx,
39
+ message: newFormat.msg,
40
+ attr: newFormat.attr,
41
+ };
42
+ }
43
+ catch (_b) {
44
+ return parseOldLogEntry(line);
45
+ }
46
+ }
47
+ exports.parseAnyLogEntry = parseAnyLogEntry;
48
+ function isFailureToSetupListener(entry) {
49
+ return (entry.id === 22856 ||
50
+ entry.message.includes('Failed to set up listener'));
51
+ }
52
+ exports.isFailureToSetupListener = isFailureToSetupListener;
53
+ function getPortFromLogEntry(logEntry) {
54
+ var _a, _b;
55
+ let match;
56
+ if (logEntry.id === 23016) {
57
+ return logEntry.attr.port;
58
+ }
59
+ if (logEntry.id === undefined &&
60
+ (match = /^waiting for connections on port (?<port>\d+)$/i.exec(logEntry.message))) {
61
+ return +((_b = (_a = match.groups) === null || _a === void 0 ? void 0 : _a.port) !== null && _b !== void 0 ? _b : '0');
62
+ }
63
+ if (isFailureToSetupListener(logEntry)) {
64
+ throw new Error(`Failed to setup listener (${logEntry.message} ${JSON.stringify(logEntry.attr)})`);
65
+ }
66
+ return -1;
67
+ }
68
+ async function filterLogStreamForPort(input) {
69
+ let port = -1;
70
+ const inputDuplicate = input.pipe(new stream_1.PassThrough({ objectMode: true }));
71
+ try {
72
+ for await (const logEntry of inputDuplicate) {
73
+ if (logEntry.component !== 'NETWORK' ||
74
+ !['initandlisten', 'listener'].includes(logEntry.context)) {
75
+ continue;
76
+ }
77
+ port = getPortFromLogEntry(logEntry);
78
+ if (port !== -1) {
79
+ break;
80
+ }
81
+ }
82
+ }
83
+ finally {
84
+ input.unpipe(inputDuplicate);
85
+ }
86
+ return { port };
87
+ }
88
+ exports.filterLogStreamForPort = filterLogStreamForPort;
89
+ //# sourceMappingURL=mongologreader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongologreader.js","sourceRoot":"","sources":["../src/mongologreader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { MongoClient } from 'mongodb';
2
+ export interface MongoServerOptions {
3
+ binDir?: string;
4
+ binary: string;
5
+ tmpDir: string;
6
+ logDir?: string;
7
+ args?: string[];
8
+ docker?: string;
9
+ }
10
+ export declare class MongoServer {
11
+ private buildInfo?;
12
+ private childProcess?;
13
+ private pid?;
14
+ private port?;
15
+ private dbPath?;
16
+ private closing;
17
+ private constructor();
18
+ serialize(): unknown;
19
+ static deserialize(serialized: any): Promise<MongoServer>;
20
+ get hostport(): string;
21
+ get serverVersion(): string;
22
+ get serverVariant(): 'enterprise' | 'community';
23
+ static start({ ...options }: MongoServerOptions): Promise<MongoServer>;
24
+ static _start({ ...options }: MongoServerOptions): Promise<MongoServer>;
25
+ close(): Promise<void>;
26
+ private _populateBuildInfo;
27
+ withClient<Fn extends (client: MongoClient) => any>(fn: Fn): Promise<ReturnType<Fn>>;
28
+ ref(): void;
29
+ unref(): void;
30
+ }
31
+ //# sourceMappingURL=mongoserver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoserver.d.ts","sourceRoot":"","sources":["../src/mongoserver.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAKtC,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,GAAG,CAAC,CAAS;IACrB,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;IAIP,SAAS,IAAI,OAAO;WAQP,WAAW,CAAC,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC;IAU/D,IAAI,QAAQ,IAAI,MAAM,CAKrB;IAGD,IAAI,aAAa,IAAI,MAAM,CAK1B;IACD,IAAI,aAAa,IAAI,YAAY,GAAG,WAAW,CAO9C;WAEY,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;WAiC/D,MAAM,CAAC,EAClB,GAAG,OAAO,EACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAqHtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBd,kBAAkB;IAO1B,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,WAAW,KAAK,GAAG,EACtD,EAAE,EAAE,EAAE,GACL,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAW1B,GAAG,IAAI,IAAI;IAMX,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MongoServer = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const fs_1 = require("fs");
9
+ const mongologreader_1 = require("./mongologreader");
10
+ const stream_1 = require("stream");
11
+ const mongodb_1 = require("mongodb");
12
+ const path_1 = __importDefault(require("path"));
13
+ const events_1 = require("events");
14
+ const util_1 = require("./util");
15
+ class MongoServer {
16
+ constructor() {
17
+ this.closing = false;
18
+ }
19
+ serialize() {
20
+ return {
21
+ pid: this.pid,
22
+ port: this.port,
23
+ dbPath: this.dbPath,
24
+ };
25
+ }
26
+ static async deserialize(serialized) {
27
+ const srv = new MongoServer();
28
+ srv.pid = serialized.pid;
29
+ srv.port = serialized.port;
30
+ srv.dbPath = serialized.dbPath;
31
+ await srv._populateBuildInfo();
32
+ return srv;
33
+ }
34
+ get hostport() {
35
+ if (this.port === undefined) {
36
+ throw new Error('Cannot get host/port for closed server');
37
+ }
38
+ return `127.0.0.1:${this.port}`;
39
+ }
40
+ get serverVersion() {
41
+ if (!this.buildInfo) {
42
+ throw new Error('Cannot get version for closed server');
43
+ }
44
+ return this.buildInfo.version;
45
+ }
46
+ get serverVariant() {
47
+ var _a, _b;
48
+ if (!this.buildInfo) {
49
+ throw new Error('Cannot get version for closed server');
50
+ }
51
+ return ((_b = (_a = this.buildInfo.modules) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, 'enterprise'))
52
+ ? 'enterprise'
53
+ : 'community';
54
+ }
55
+ static async start({ ...options }) {
56
+ var _a, _b;
57
+ if (options.binary === 'mongos' && !((_a = options.args) === null || _a === void 0 ? void 0 : _a.includes('--port'))) {
58
+ const minPort = 1025;
59
+ const maxPort = 49151;
60
+ let port = Math.floor(Math.random() * (maxPort - minPort) + minPort);
61
+ while (true) {
62
+ try {
63
+ (0, util_1.debug)('Trying to spawn mongos on port', port);
64
+ return await this._start({
65
+ ...options,
66
+ args: [...((_b = options.args) !== null && _b !== void 0 ? _b : []), '--port', String(port)],
67
+ });
68
+ }
69
+ catch (err) {
70
+ if (err.errorLogEntries.some(mongologreader_1.isFailureToSetupListener)) {
71
+ if (port === maxPort)
72
+ port = minPort;
73
+ else
74
+ port++;
75
+ continue;
76
+ }
77
+ throw err;
78
+ }
79
+ }
80
+ }
81
+ return await this._start(options);
82
+ }
83
+ static async _start({ ...options }) {
84
+ var _a, _b, _c, _d;
85
+ const srv = new MongoServer();
86
+ if (!options.docker) {
87
+ const dbPath = path_1.default.join(options.tmpDir, `db-${(0, util_1.uuid)()}`);
88
+ await fs_1.promises.mkdir(dbPath, { recursive: true });
89
+ srv.dbPath = dbPath;
90
+ }
91
+ const commandline = [];
92
+ if (options.docker) {
93
+ commandline.push('docker', 'run', '--network=host');
94
+ if (options.binDir) {
95
+ commandline.push(`--volume=${options.binDir}:/runner-bin:ro`);
96
+ }
97
+ commandline.push(options.docker);
98
+ if (options.binDir) {
99
+ commandline.push(`/runner-bin/${options.binary}`);
100
+ }
101
+ else {
102
+ commandline.push(options.binary);
103
+ }
104
+ }
105
+ else if (options.binDir) {
106
+ commandline.push(path_1.default.join(options.binDir, options.binary));
107
+ }
108
+ else {
109
+ commandline.push(options.binary);
110
+ }
111
+ commandline.push(...((_a = options.args) !== null && _a !== void 0 ? _a : []));
112
+ if (!((_b = options.args) === null || _b === void 0 ? void 0 : _b.includes('--port')))
113
+ commandline.push('--port', '0');
114
+ if (!((_c = options.args) === null || _c === void 0 ? void 0 : _c.includes('--dbpath')) && options.binary === 'mongod')
115
+ commandline.push('--dbpath', options.docker ? '/tmp' : srv.dbPath);
116
+ if (!((_d = options.args) === null || _d === void 0 ? void 0 : _d.includes('--unixSocketPrefix')) &&
117
+ process.platform !== 'win32')
118
+ commandline.push('--nounixsocket');
119
+ (0, util_1.debug)('starting server', commandline);
120
+ const [executable, ...args] = commandline;
121
+ const proc = (0, child_process_1.spawn)(executable, args, {
122
+ stdio: ['inherit', 'pipe', 'pipe'],
123
+ cwd: options.tmpDir,
124
+ detached: true,
125
+ });
126
+ await (0, events_1.once)(proc, 'spawn');
127
+ srv.childProcess = proc;
128
+ srv.pid = proc.pid;
129
+ const { stdout, stderr } = proc;
130
+ stdout.setEncoding('utf8');
131
+ stderr.setEncoding('utf8');
132
+ if (options.logDir) {
133
+ const outFile = path_1.default.join(options.logDir, `${options.binary}-${String(proc.pid)}-${new Date()
134
+ .toISOString()
135
+ .replace(/[^-_a-zA-Z0-9.]/g, '')}.log`);
136
+ await fs_1.promises.mkdir(options.logDir, { recursive: true });
137
+ const outStream = (0, fs_1.createWriteStream)(outFile);
138
+ await (0, events_1.once)(outStream, 'open');
139
+ stdout.pipe(outStream, { end: false });
140
+ stderr.pipe(outStream, { end: false });
141
+ Promise.all([(0, events_1.once)(stdout, 'end'), (0, events_1.once)(stderr, 'end')]).then(() => outStream.end(), () => {
142
+ });
143
+ }
144
+ else {
145
+ stderr.on('data', (chunk) => (0, util_1.debug)('server stderr', chunk));
146
+ stderr.resume();
147
+ stdout.resume();
148
+ }
149
+ const errorLogEntries = [];
150
+ try {
151
+ const logEntryStream = stream_1.Readable.from((0, mongologreader_1.createLogEntryIterator)(stdout));
152
+ logEntryStream.on('data', (entry) => {
153
+ if (!srv.closing && ['E', 'F'].includes(entry.severity)) {
154
+ errorLogEntries.push(entry);
155
+ (0, util_1.debug)('mongodb server output', entry);
156
+ }
157
+ });
158
+ const { port } = await (0, mongologreader_1.filterLogStreamForPort)(logEntryStream);
159
+ (0, util_1.debug)('server listening on port', port);
160
+ if (port === -1) {
161
+ let message = 'Server log output did not include port or socket';
162
+ if (errorLogEntries.length > 0) {
163
+ const format = (entry) => `${entry.message} ${JSON.stringify(entry.attr)}`;
164
+ message = `Server failed to start: ${errorLogEntries
165
+ .map(format)
166
+ .join(', ')} from ${commandline.join(' ')})`;
167
+ }
168
+ const err = new Error(message);
169
+ err.errorLogEntries = errorLogEntries;
170
+ throw err;
171
+ }
172
+ logEntryStream.resume();
173
+ srv.port = port;
174
+ await srv._populateBuildInfo();
175
+ }
176
+ catch (err) {
177
+ await srv.close();
178
+ throw err;
179
+ }
180
+ return srv;
181
+ }
182
+ async close() {
183
+ this.closing = true;
184
+ if (this.childProcess) {
185
+ (0, util_1.debug)('closing running process', this.childProcess.pid);
186
+ if (this.childProcess.exitCode === null) {
187
+ this.childProcess.kill('SIGKILL');
188
+ await (0, events_1.once)(this.childProcess, 'exit');
189
+ }
190
+ (0, util_1.debug)('stopped running process');
191
+ this.childProcess = undefined;
192
+ }
193
+ else if (this.pid !== undefined) {
194
+ (0, util_1.debug)('closing externally started process', this.pid);
195
+ process.kill(this.pid, 'SIGKILL');
196
+ }
197
+ try {
198
+ if (this.dbPath)
199
+ await fs_1.promises.rm(this.dbPath, { recursive: true });
200
+ }
201
+ catch (err) {
202
+ (0, util_1.debug)('failed to remove dbPath', err);
203
+ }
204
+ this.buildInfo = undefined;
205
+ this.port = undefined;
206
+ this.dbPath = undefined;
207
+ }
208
+ async _populateBuildInfo() {
209
+ this.buildInfo = await this.withClient(async (client) => await client.db('admin').command({ buildInfo: 1 }));
210
+ (0, util_1.debug)('got server build info', this.serverVersion, this.serverVariant);
211
+ }
212
+ async withClient(fn) {
213
+ const client = await mongodb_1.MongoClient.connect(`mongodb://${this.hostport}/?directConnection=true`);
214
+ try {
215
+ return await fn(client);
216
+ }
217
+ finally {
218
+ await client.close(true);
219
+ }
220
+ }
221
+ ref() {
222
+ var _a, _b, _c, _d, _e;
223
+ (_a = this.childProcess) === null || _a === void 0 ? void 0 : _a.ref();
224
+ (_c = (_b = this.childProcess) === null || _b === void 0 ? void 0 : _b.stdout) === null || _c === void 0 ? void 0 : _c.ref();
225
+ (_e = (_d = this.childProcess) === null || _d === void 0 ? void 0 : _d.stderr) === null || _e === void 0 ? void 0 : _e.ref();
226
+ }
227
+ unref() {
228
+ var _a, _b, _c, _d, _e;
229
+ (_a = this.childProcess) === null || _a === void 0 ? void 0 : _a.unref();
230
+ (_c = (_b = this.childProcess) === null || _b === void 0 ? void 0 : _b.stdout) === null || _c === void 0 ? void 0 : _c.unref();
231
+ (_e = (_d = this.childProcess) === null || _d === void 0 ? void 0 : _d.stderr) === null || _e === void 0 ? void 0 : _e.unref();
232
+ }
233
+ }
234
+ exports.MongoServer = MongoServer;
235
+ //# sourceMappingURL=mongoserver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoserver.js","sourceRoot":"","sources":["../src/mongoserver.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import createDebug from 'debug';
2
+ export declare const debug: createDebug.Debugger;
3
+ export declare const uuid: () => string;
4
+ export declare const sleep: (ms: number) => Promise<void>;
5
+ export declare const range: (n: number) => number[];
6
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,eAAO,MAAM,KAAK,sBAAgC,CAAC;AACnD,eAAO,MAAM,IAAI,cAA0C,CAAC;AAC5D,eAAO,MAAM,KAAK,OAAQ,MAAM,KAAG,QAAQ,IAAI,CACR,CAAC;AACxC,eAAO,MAAM,KAAK,MAAO,MAAM,KAAG,MAAM,EAA0B,CAAC"}
package/dist/util.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.range = exports.sleep = exports.uuid = exports.debug = void 0;
7
+ const mongodb_1 = require("mongodb");
8
+ const debug_1 = __importDefault(require("debug"));
9
+ exports.debug = (0, debug_1.default)('mongodb-runner');
10
+ const uuid = () => new mongodb_1.BSON.UUID().toHexString(true);
11
+ exports.uuid = uuid;
12
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
13
+ exports.sleep = sleep;
14
+ const range = (n) => [...Array(n).keys()];
15
+ exports.range = range;
16
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;;;;AAAA,qCAA+B;AAC/B,kDAAgC;AAEnB,QAAA,KAAK,GAAG,IAAA,eAAW,EAAC,gBAAgB,CAAC,CAAC;AAC5C,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,cAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAA/C,QAAA,IAAI,QAA2C;AACrD,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CACjD,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAD3B,QAAA,KAAK,SACsB;AACjC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAY,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAAtD,QAAA,KAAK,SAAiD"}