Skip to content

Commit 84eb2bf

Browse files
vladimyragnivade
authored andcommitted
Promisify methods without extra wrappers (#199)
1 parent c608fe8 commit 84eb2bf

File tree

6 files changed

+206
-318
lines changed

6 files changed

+206
-318
lines changed

lib/cache.js

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,32 @@ const index = require('./index');
99

1010
const CACHE_FOLDER = path.join(config.get().cache, 'cache');
1111

12-
exports.lastUpdated = (done) => {
13-
fs.stat(CACHE_FOLDER, done);
12+
exports.lastUpdated = () => {
13+
return fs.stat(CACHE_FOLDER);
1414
};
1515

16-
exports.getPage = (page, done) => {
16+
exports.getPage = (page) => {
1717
let preferredPlatform = platform.getPreferredPlatformFolder();
18-
index.findPlatform(page, preferredPlatform)
18+
return index.findPlatform(page, preferredPlatform)
1919
.then((folder) => {
20-
if (folder) {
21-
let filePath = path.join(CACHE_FOLDER, 'pages', folder, page + '.md');
22-
fs.readFile(filePath, 'utf8', done);
23-
} else {
24-
done(null, null);
20+
if (!folder) {
21+
return;
2522
}
23+
let filePath = path.join(CACHE_FOLDER, 'pages', folder, page + '.md');
24+
return fs.readFile(filePath, 'utf8');
2625
})
2726
.catch((err) => {
2827
console.error(err);
29-
done(null, null);
3028
});
3129
};
3230

33-
exports.clear = (done) => {
34-
fs.remove(CACHE_FOLDER, done);
31+
exports.clear = () => {
32+
return fs.remove(CACHE_FOLDER);
3533
};
3634

37-
exports.update = (done) => {
35+
exports.update = () => {
3836
// Downloading fresh copy
39-
fs.ensureDir(CACHE_FOLDER)
37+
return fs.ensureDir(CACHE_FOLDER)
4038
.then(() => {
4139
return remote.download();
4240
})
@@ -45,11 +43,5 @@ exports.update = (done) => {
4543
})
4644
.then(() => {
4745
return index.rebuildPagesIndex();
48-
})
49-
.then(() => {
50-
return done();
51-
})
52-
.catch((err) => {
53-
return done(err);
5446
});
5547
};

lib/index.js

Lines changed: 48 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,22 @@ const pagesPath = path.join(config.get().cache, 'cache/pages');
1111
const shortIndexFile = path.join(pagesPath, 'shortIndex.json');
1212

1313
function findPlatform(page, preferredPlatform) {
14-
return new Promise((resolve, reject) => {
15-
// Load the index
16-
getShortIndex()
17-
.then((idx) => {
18-
// First, check whether page is in the index
19-
if (! (page in idx)) {
20-
return resolve(null);
21-
}
22-
// Get the platforms
23-
let platforms = idx[page];
24-
if (platforms.indexOf(preferredPlatform) >= 0) {
25-
return resolve(preferredPlatform);
26-
} else if (platforms.indexOf('common') >= 0) {
27-
return resolve('common');
28-
}
29-
return resolve(null);
30-
})
31-
.catch((err) => {
32-
return reject(err);
33-
});
34-
});
14+
// Load the index
15+
return getShortIndex()
16+
.then((idx) => {
17+
// First, check whether page is in the index
18+
if (! (page in idx)) {
19+
return null;
20+
}
21+
// Get the platforms
22+
let platforms = idx[page];
23+
if (platforms.indexOf(preferredPlatform) >= 0) {
24+
return preferredPlatform;
25+
} else if (platforms.indexOf('common') >= 0) {
26+
return 'common';
27+
}
28+
return null;
29+
});
3530
}
3631

3732
// hasPage is always called after the index is created,
@@ -46,41 +41,30 @@ function hasPage(page) {
4641

4742
// Return all commands available in the local cache.
4843
function commands() {
49-
return new Promise((resolve, reject) => {
50-
getShortIndex()
51-
.then((idx) => {
52-
return resolve(Object.keys(idx).sort());
53-
})
54-
.catch((err) => {
55-
return reject(err);
56-
});
44+
return getShortIndex().then((idx) => {
45+
return Object.keys(idx).sort();
5746
});
5847
}
5948

6049
// Return all commands for a given platform.
6150
// P.S. - The platform 'common' is always included.
6251
function commandsFor(platform) {
63-
return new Promise((resolve, reject) => {
64-
getShortIndex()
65-
.then((idx) => {
66-
let commands = Object.keys(idx)
67-
.filter((cmd) => {
68-
return idx[cmd].indexOf(platform) !== -1 || idx[cmd].indexOf('common') !== -1;
69-
})
70-
.sort();
71-
resolve(commands);
72-
})
73-
.catch((err) => {
74-
return reject(err);
75-
});
76-
});
52+
return getShortIndex()
53+
.then((idx) => {
54+
let commands = Object.keys(idx)
55+
.filter((cmd) => {
56+
return idx[cmd].indexOf(platform) !== -1 || idx[cmd].indexOf('common') !== -1;
57+
})
58+
.sort();
59+
return commands;
60+
});
7761
}
7862

7963
// Delete the index file.
8064
function clearPagesIndex() {
8165
return fs.unlink(shortIndexFile)
8266
.then(() => {
83-
clearRuntimeIndex();
67+
return clearRuntimeIndex();
8468
})
8569
.catch((err) => {
8670
// If the file is not present, then it is already unlinked and our job is done.
@@ -97,69 +81,39 @@ function clearRuntimeIndex() {
9781
}
9882

9983
function rebuildPagesIndex() {
100-
return new Promise((resolve, reject) => {
101-
clearPagesIndex()
102-
.then(() => {
103-
return getShortIndex();
104-
})
105-
.then(() => {
106-
resolve();
107-
})
108-
.catch((err) => {
109-
reject(err);
110-
});
84+
return clearPagesIndex().then(() => {
85+
return getShortIndex();
11186
});
11287
}
11388

11489
// If the variable is not set, read the file and set it.
11590
// Else, just return the variable.
11691
function getShortIndex() {
117-
return new Promise((resolve, reject) => {
118-
if (shortIndex) {
119-
resolve(shortIndex);
120-
} else {
121-
readShortPagesIndex()
122-
.then((idx) => {
123-
resolve(idx);
124-
})
125-
.catch((err) => {
126-
reject(err);
127-
});
128-
}
129-
});
92+
if (shortIndex) {
93+
return Promise.resolve(shortIndex);
94+
}
95+
return readShortPagesIndex();
13096
}
13197

13298
// Read the index file, and load it into memory.
13399
// If the file does not exist, create the data structure, write the file,
134100
// and load it into memory.
135101
function readShortPagesIndex() {
136-
return new Promise((resolve, reject) => {
137-
fs.readFile(shortIndexFile, 'utf8')
138-
.then((idx) => {
139-
// File is present, so just parse
140-
// and set the shortIndex variable,
141-
// then resolve the value.
142-
idx = JSON.parse(idx);
143-
shortIndex = idx;
144-
return resolve(idx);
145-
})
146-
.catch(() => {
147-
// File is not present; we need to create the index.
148-
let idx = buildShortPagesIndex();
149-
if (Object.keys(idx).length > 0) {
150-
fs.writeFile(shortIndexFile, JSON.stringify(idx))
151-
.then(() => {
152-
shortIndex = idx;
153-
return resolve(idx);
154-
})
155-
.catch((err) => {
156-
reject(err);
157-
});
158-
} else {
159-
return resolve(idx);
160-
}
102+
return fs.readJson(shortIndexFile)
103+
.catch(() => {
104+
// File is not present; we need to create the index.
105+
let idx = buildShortPagesIndex();
106+
if (Object.keys(idx).length <= 0) {
107+
return idx;
108+
}
109+
return fs.writeJson(shortIndexFile, idx).then(() => {
110+
return idx;
161111
});
162-
});
112+
})
113+
.then((idx) => {
114+
shortIndex = idx;
115+
return shortIndex;
116+
});
163117
}
164118

165119
function buildShortPagesIndex() {

lib/remote.js

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,43 +8,39 @@ const config = require('./config');
88
// Downloads the zip file from github and extracts it to /tmp/tldr
99
exports.download = () => {
1010
let request = require('request');
11-
let unzip = require('unzip2');
11+
let unzip = require('unzip2');
1212
let url = config.get().repository;
1313
let target = path.join(os.tmpdir(), 'tldr');
1414

1515
// Empty the tmp dir
16-
return new Promise((resolve, reject) => {
17-
fs.emptyDir(target)
18-
.then(() => {
19-
// Creating the extractor
20-
let extractor = unzip.Extract({path: target});
21-
extractor.on('error', () => {
22-
reject(new Error('Cannot update from ' + url));
23-
});
24-
extractor.on('close', () => {
25-
resolve(target);
26-
});
16+
return fs.emptyDir(target)
17+
.then(() => {
18+
// Creating the extractor
19+
let extractor = unzip.Extract({ path: target });
2720

28-
// Setting the proxy if set by config
29-
if (config.get().proxy) {
30-
request = request.defaults({
31-
'proxy':config.proxy
32-
});
33-
}
21+
// Setting the proxy if set by config
22+
if (config.get().proxy) {
23+
request = request.defaults({ proxy: config.proxy });
24+
}
3425

35-
// Creating the request and passing the extractor
36-
let req = request.get({
37-
url: url,
38-
headers: {'User-Agent' : 'tldr-node-client'}
39-
});
26+
// Creating the request and passing the extractor
27+
let req = request.get({
28+
url: url,
29+
headers: { 'User-Agent' : 'tldr-node-client' }
30+
});
4031

32+
req.pipe(extractor);
33+
34+
return new Promise((resolve, reject) => {
4135
req.on('error', (err) => {
4236
reject(err);
4337
});
44-
req.pipe(extractor);
45-
})
46-
.catch((err) => {
47-
reject(err);
38+
extractor.on('error', () => {
39+
reject(new Error('Cannot update from ' + url));
40+
});
41+
extractor.on('close', () => {
42+
resolve(target);
43+
});
4844
});
49-
});
45+
});
5046
};

0 commit comments

Comments
 (0)