forked from Automattic/mongoose
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconnection_server.js
80 lines (74 loc) · 2.19 KB
/
connection_server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
'use strict';
const child_process = require('child_process');
const mkdirp = require('mkdirp');
const rimraf = require('rimraf');
// For starting/stopping mongod to test connections
// Adapted from mongodb-topology-manager:
// https://github.com/mongodb-js/mongodb-topology-manager/blob/master/lib/server.js
class Server {
constructor(binary, options) {
this.binary = binary;
this.port = options['port'] || 27017;
this.bind_ip = options['bind_ip'] || '127.0.0.1';
this.dbpath = options['dbpath'] || './data';
}
// Start server
start() {
const self = this;
return new Promise(function(resolve, reject) {
self.purge().then(function() {
// Spawn server process
self.server = child_process.spawn(self.binary,
['--port', self.port, '--bind_ip',
self.bind_ip, '--dbpath', self.dbpath]);
// Wait for ready
self.server.stdout.on('data', function(data) {
if (data.toString().includes('Waiting for connections')
|| data.toString().includes('waiting for connections')) {
self.server.stdout.removeAllListeners('data');
self.server.removeAllListeners('exit');
resolve();
}
});
// Error
self.server.on('exit', function(code) {
reject(code);
});
}).catch(function(err) {
reject(err);
});
});
}
// Stop server
stop() {
const self = this;
return new Promise(function(resolve) {
if (!self.server) {
resolve();
}
// Resolve on exit
self.server.on('exit', function(code) {
self.server.stdout.removeAllListeners('data');
self.server.removeAllListeners('exit');
self.server = null;
resolve(code);
});
// Kill
self.server.kill('SIGINT');
});
}
// Remove and recreate data directory
purge() {
const self = this;
return new Promise(function(resolve, reject) {
rimraf(self.dbpath, {}, function(err) {
if (err) reject(err);
mkdirp(self.dbpath, { recursive: true }, function(err) {
if (err) reject(err);
resolve();
});
});
});
}
}
module.exports = Server;