This repository has been archived by the owner on Dec 20, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 50
/
mongod-helper.ts
108 lines (83 loc) · 3.15 KB
/
mongod-helper.ts
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { MongoBins } from './mongo-bins';
import { IMongoDBDownloadOptions } from 'mongodb-download';
const Debug: any = require('debug');
const COMMAND: string = "mongod";
export class MongodHelper {
mongoBin: MongoBins;
debug: any;
private resolveLink: (response: boolean) => void = () => { };
private rejectLink: (response: string) => void = () => { };
constructor(commandArguments: string[] = [], downloadOptions?: Partial<IMongoDBDownloadOptions>) {
if (downloadOptions) {
this.mongoBin = new MongoBins(COMMAND, commandArguments, {}, downloadOptions);
} else {
this.mongoBin = new MongoBins(COMMAND, commandArguments);
}
this.debug = Debug(`mongodb-prebuilt-MongodHelper`);
}
run(): Promise<boolean> {
return new Promise<boolean>((resolve, reject) => {
this.resolveLink = resolve;
this.rejectLink = reject;
this.mongoBin.run().then(() => {
this.mongoBin.childProcess.stderr.on('data', (data) => this.stderrHandler(data));
this.mongoBin.childProcess.stdout.on('data', (data) => this.stdoutHandler(data));
this.mongoBin.childProcess.on('close', (code) => this.closeHandler(code));
})
})
}
stop(): void {
this.mongoBin.childProcess.kill('SIGINT')
}
kill(): void {
this.mongoBin.childProcess.kill('SIGTERM')
}
closeHandler(code: number): void {
this.debug(`mongod close: ${code}`);
}
stderrHandler(message: string | Buffer): void {
this.debug(`mongod stderr: ${message}`);
}
stdoutHandler(message: string | Buffer): void {
this.debug(`mongod stdout: ${message}`);
let log: string = message.toString();
let mongodStartExpression: RegExp = this.getMongodStartedExpression();
let mongodAlreadyRunningExpression: RegExp = this.getMongodAlreadyRunningExpression();
let mongodPermissionDeniedExpression: RegExp = this.getMongodPermissionDeniedExpression();
let mongodDataDirNotFounddExpression: RegExp = this.getMongodDataDirNotFounddExpression();
let mongodShutdownMessageExpression: RegExp = this.getMongodShutdownMessageExpression();
if (mongodStartExpression.test(log)) {
this.resolveLink(true);
}
if (mongodAlreadyRunningExpression.test(log)) {
return this.rejectLink('already running');
}
if (mongodAlreadyRunningExpression.test(log)) {
return this.rejectLink('already running');
}
if (mongodPermissionDeniedExpression.test(log)) {
return this.rejectLink('permission denied');
}
if (mongodDataDirNotFounddExpression.test(log)) {
return this.rejectLink('Data directory not found');
}
if (mongodShutdownMessageExpression.test(log)) {
return this.rejectLink('Mongod shutting down');
}
}
getMongodStartedExpression(): RegExp {
return /waiting for connections on port/i;
}
getMongodAlreadyRunningExpression(): RegExp {
return /mongod instance already running/i;
}
getMongodPermissionDeniedExpression(): RegExp {
return /permission denied/i;
}
getMongodDataDirNotFounddExpression(): RegExp {
return /Data directory .*? not found/i;
}
getMongodShutdownMessageExpression(): RegExp {
return /shutting down with code/i;
}
}