/
storageManager.js
117 lines (110 loc) · 3.38 KB
/
storageManager.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
113
114
115
116
117
import { join } from 'node:path';
import { promisify } from 'node:util';
import {
rmdir as _rmdir,
mkdir as _mkdir,
lstat as _lstat,
readdir as _readdir,
unlink as _unlink,
writeFile as _writeFile
} from 'node:fs';
import { copy } from 'fs-extra/esm';
import intel from 'intel';
import { pathToFolder } from './pathToFolder.js';
const log = intel.getLogger('sitespeedio.storageManager');
const mkdir = promisify(_mkdir);
const readdir = promisify(_readdir);
const lstat = promisify(_lstat);
const unlink = promisify(_unlink);
const rmdir = promisify(_rmdir);
const writeFile = promisify(_writeFile);
function write(dirPath, filename, data) {
return writeFile(join(dirPath, filename), data);
}
function isValidDirectoryName(name) {
return name !== undefined && name !== '';
}
export function storageManager(baseDir, storagePathPrefix, options) {
return {
rootPathFromUrl(url, alias) {
return pathToFolder(url, options, alias)
.split('/')
.filter(element => isValidDirectoryName(element))
.map(() => '..')
.join('/')
.concat('/');
},
createDirectory(...subDirectories) {
const pathSegments = [baseDir, ...subDirectories].filter(element =>
isValidDirectoryName(element)
);
const dirPath = join.apply(undefined, pathSegments);
return mkdir(dirPath, { recursive: true }).then(() => dirPath);
},
writeData(data, filename) {
return this.createDirectory('data').then(dir =>
write(dir, filename, data)
);
},
writeDataToDir(data, filename, dir) {
return write(dir, filename, data);
},
writeHtml(html, filename) {
return this.createDirectory().then(dir => write(dir, filename, html));
},
getBaseDir() {
return baseDir;
},
getFullPathToURLDir(url, alias) {
return join(baseDir, pathToFolder(url, options, alias));
},
getStoragePrefix() {
return storagePathPrefix;
},
copyToResultDir(filename) {
return this.createDirectory().then(dir => copy(filename, dir));
},
copyFileToDir(filename, dir) {
return copy(filename, dir);
},
// TODO is missing alias
removeDataForUrl(url) {
const dirName = join(baseDir, pathToFolder(url, options));
const removeDir = async dir => {
try {
const files = await readdir(dir);
await Promise.all(
files.map(async file => {
try {
const p = join(dir, file);
const stat = await lstat(p);
await (stat.isDirectory() ? removeDir(p) : unlink(p));
} catch (error) {
log.error('Could not remove file:' + file, error);
}
})
);
await rmdir(dir);
} catch (error) {
log.error('Could not remove dir:' + dir, error);
}
};
return removeDir(dirName);
},
createDirForUrl(url, subDir, alias) {
return this.createDirectory(pathToFolder(url, options, alias), subDir);
},
writeDataForUrl(data, filename, url, subDir, alias) {
return this.createDirectory(
pathToFolder(url, options, alias),
'data',
subDir
).then(dir => write(dir, filename, data));
},
writeHtmlForUrl(html, filename, url, alias) {
return this.createDirForUrl(url, undefined, alias).then(dir =>
write(dir, filename, html)
);
}
};
}