forked from dahjelle/spawn-pouchdb-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
104 lines (86 loc) · 2.98 KB
/
index.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
module.exports = spawnPouchdbServer
var fs = require('fs')
var http = require('http')
var async = require('async')
var relative = require('require-relative')
var spawn = require('cross-spawn')
var tmp = require('tmp')
var assureConfigFile = require('./lib/assure-config-file')
var assureDatabaseDir = require('./lib/assure-database-dir')
var getDefaults = require('./lib/get-defaults')
function spawnPouchdbServer (options, callback) {
if (typeof options === 'function') {
callback = options
options = {}
}
options = getDefaults(options)
async.waterfall([
assureDatabaseDir.bind(null, options),
assureConfigFile.bind(null, options)
], function (error) {
if (error) return callback(error)
var relativePouchDbBinPath = 'pouchdb-server/bin/pouchdb-server'
var pouchDbBinPath
try {
pouchDbBinPath = relative.resolve(relativePouchDbBinPath, process.cwd())
} catch (error) {
if (error.code === 'MODULE_NOT_FOUND') {
pouchDbBinPath = require.resolve(relativePouchDbBinPath)
} else {
return callback(error)
}
}
var pouchDbServerArgs = ['--config', options.config.file]
if (options.backend === false) {
pouchDbServerArgs.push('--in-memory')
} else {
if (options.backend.name) {
pouchDbServerArgs.push('--level-backend', options.backend.name)
}
if (options.backend.location) {
pouchDbServerArgs.push('--level-prefix', options.backend.location)
}
}
if (options.verbose) console.log('starting pouchdb-server %s', pouchDbServerArgs.join(' '))
var startlog = tmp.tmpNameSync()
var pouchDbServer = spawn(pouchDbBinPath, pouchDbServerArgs, {
stdio: ['ignore', fs.openSync(startlog, 'w+'), process.stderr]
})
var timeout = setTimeout(function () {
callback(new Error('Timeout: PouchDB did not start after ' + options.timeout + 'ms.'))
}, options.timeout)
var testForServerUp = setInterval(pingServer, 100)
var serverUp
function pingServer () {
var port = options.config.httpd.port
var req = http.get('http://localhost:' + port, function () {
if (options.verbose) {
console.log('pouchdb-server up')
}
if (!serverUp) {
callback(null, pouchDbServer)
}
serverUp = true
clearTimeout(timeout)
clearInterval(testForServerUp)
})
req.on('error', function (err) { if (err) { return } })
}
pouchDbServer.backend = options.backend
pouchDbServer.config = options.config
var killMainProcessOnExit = true
pouchDbServer.stop = function (callback) {
killMainProcessOnExit = false
pouchDbServer.on('exit', callback)
pouchDbServer.kill()
}
// Stop main process when PouchDB Server dies.
pouchDbServer.on('exit', function (code) {
if (killMainProcessOnExit) process.exit(code)
})
// Kill PouchDB server when main process dies
process.on('exit', function (code) {
pouchDbServer.kill()
})
})
}