-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
112 lines (86 loc) · 3.27 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
105
106
107
108
109
110
111
112
const fs = require('fs');
const path = require('path');
const { spawn } = require('child_process');
const osrmLibPath = path.dirname(require.resolve('osrm'));
const osrmBindingPath = path.join(osrmLibPath, 'binding');
const osrmProfilesPath = path.join(osrmLibPath, '..', 'profiles');
const osrmExctract = path.join(osrmBindingPath, 'osrm-extract');
const osrmContract = path.join(osrmBindingPath, 'osrm-contract');
const osrmDatastore = path.join(osrmBindingPath, 'osrm-datastore');
const replaceExtension = (filePath, newExtension) => {
const baseFileName = path.basename(filePath);
const newFileName = baseFileName.split('.')[0] + newExtension;
return path.join(path.dirname(filePath), newFileName);
};
const getProfileNames = () =>
new Promise((resolve, reject) =>
fs.readdir(osrmProfilesPath, (error, fileNames) => {
if (error) {
reject(error);
}
const profileNames = fileNames
.filter(fileName => path.extname(fileName) === '.lua')
.map(fileName => path.basename(fileName, '.lua'));
resolve(profileNames);
})
);
const extract = (extractPath, profileName, options = {}) =>
new Promise((resolve, reject) => {
const { stdoutStream, stderrStream } = options;
const extractProfile = path.join(osrmProfilesPath, `${profileName}.lua`);
const graphPath = replaceExtension(extractPath, '.osrm');
const extractProcess = spawn(osrmExctract, ['-p', extractProfile, extractPath]);
if (stdoutStream) {
extractProcess.stdout.on('data', data => stdoutStream.write(data));
}
if (stderrStream) {
extractProcess.stderr.on('data', data => stderrStream.write(data));
}
extractProcess.on('close', exitCode => {
if (exitCode === 0) {
return resolve(graphPath);
}
return reject(
new Error(`OSRM failed to extract graph from ${extractPath} with exit code ${exitCode}`)
);
});
});
const contract = (graphPath, options = {}) =>
new Promise((resolve, reject) => {
const { stdoutStream, stderrStream } = options;
const contractProcess = spawn(osrmContract, [graphPath]);
if (stdoutStream) {
contractProcess.stdout.on('data', data => stdoutStream.write(data));
}
if (stderrStream) {
contractProcess.stderr.on('data', data => stderrStream.write(data));
}
contractProcess.on('close', exitCode => {
if (exitCode === 0) {
return resolve(graphPath);
}
return reject(
new Error(`OSRM failed to contract graph from ${graphPath} with exit code ${exitCode}`)
);
});
});
const datastore = (graphPath, options = {}) =>
new Promise((resolve, reject) => {
const { stdoutStream, stderrStream } = options;
const datastoreProcess = spawn(osrmDatastore, [graphPath]);
if (stdoutStream) {
datastoreProcess.stdout.on('data', data => stdoutStream.write(data));
}
if (stderrStream) {
datastoreProcess.stderr.on('data', data => stderrStream.write(data));
}
datastoreProcess.on('close', exitCode => {
if (exitCode === 0) {
return resolve(graphPath);
}
return reject(
new Error(`OSRM failed to process datastore on ${graphPath} with exit code ${exitCode}`)
);
});
});
module.exports = { getProfileNames, extract, contract, datastore };