-
Notifications
You must be signed in to change notification settings - Fork 1
/
Storage.js
63 lines (48 loc) · 1.3 KB
/
Storage.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
import fs from 'react-native-fs';
import md5 from 'blueimp-md5';
const singleton = Symbol();
const singletonEnforcer = Symbol();
export default class Storage {
constructor(enforcer) {
if (enforcer !== singletonEnforcer) {
throw new Error('Cannot construct an object of Storage');
}
this.hashFunction = md5;
this.setCacheDirectory('images');
}
static get singleton() {
if (!this[singleton]) {
this[singleton] = new Storage(singletonEnforcer);
}
return this[singleton];
}
setCacheDirectory(directory) {
this.cacheDirectory = directory;
this.createCacheDirectory();
}
getCacheDirectory() {
return `${fs.DocumentDirectoryPath}/${this.cacheDirectory}`;
}
createCacheDirectory() {
fs.mkdir(this.getCacheDirectory());
}
setHashFunction(hashFunction) {
this.hashFunction = hashFunction;
}
hashUrl(url) {
return this.hashFunction(url);
}
getFilePath(url) {
return `${this.getCacheDirectory()}/${this.hashUrl(url)}`;
}
download(url) {
return fs.downloadFile(url, this.getFilePath(url));
}
load(url) {
const filePath = this.getFilePath(url);
return fs
.exists(filePath)
.then(exists => exists ? filePath : this.download(url).then(() => filePath));
}
}
export const storage = Storage.singleton;