-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathapp.js
126 lines (119 loc) · 4.7 KB
/
app.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
118
119
120
121
122
123
124
125
126
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const fs = require('fs');
const mkdirp = require('mkdirp');
const uuid = require('uuid/v1');
const archiver = require('archiver');
const request = require('request');
const app = express();
const port = process.env.PORT || 3000;
app.set('port', port);
app.use(bodyParser.json({ limit: '100mb' }));
app.use(bodyParser.urlencoded({ extended: true }));
app.use('/node_modules', express.static(path.join(__dirname, 'node_modules')));
app.use('/dist', express.static(path.join(__dirname, 'dist')));
app.use('/demos', express.static(path.join(__dirname, 'demos')));
app.use('/temp', express.static(path.join(__dirname, 'temp')));
if (app.get('env') === 'development') {
app.use('/build', express.static(path.join(__dirname, 'build')));
app.use('/demos-dev', express.static(path.join(__dirname, 'demos-dev')));
}
app.post('/api/savetodisk', (req, res) => {
const dirname = `${__dirname.replace(/\\/g, '/')}/temp/${uuid()}`;
const directory = dirname + (req.query.directory ? `/${req.query.directory}` : '');
const processingTime = !isNaN(parseInt(req.query.processingtime) ? parseInt(req.query.processingtime) : 30) * 1000;
const finalizeTime = Date.now() + processingTime;
try {
mkdirp.sync(directory);
const compression = req.query.compression === 'tar' ? 'tar' : 'zip';
const archive = archiver(compression, { zlib: { level: 9 } });
const zipname = `${dirname}/${req.query.appname || 'androme'}.${compression}`;
const output = fs.createWriteStream(zipname);
let delayed = 0;
output.on('close', () => {
delayed = -1;
console.log(`WRITE: ${zipname} (${archive.pointer()} bytes)`);
res.json({
directory: dirname,
zipname,
bytes: archive.pointer()
});
});
archive.pipe(output);
function finalize() {
if (delayed !== -1 && (delayed === 0 || Date.now() >= finalizeTime)) {
delayed = -1;
archive.finalize();
}
}
let fileerror = '';
try {
for (const file of req.body) {
const pathname = `${directory}/${file.pathname}`;
const filename = `${pathname}/${file.filename}`;
fileerror = filename;
mkdirp.sync(pathname);
const data = { name: `${(req.query.directory ? `${req.query.directory}/` : '') + file.pathname}/${file.filename}` };
if (file.content && file.content.trim() !== '') {
delayed++;
fs.writeFile(filename, file.content, (err) => {
if (delayed !== -1) {
if (!err) {
archive.file(filename, data);
}
delayed--;
finalize();
}
});
}
else if (file.uri) {
delayed++;
const stream = fs.createWriteStream(filename);
stream.on('finish', () => {
if (delayed !== -1) {
archive.file(filename, data);
delayed--;
finalize();
}
});
request(file.uri).on('response', (response) => {
if (response.statusCode !== 200) {
if (delayed !== -1) {
delayed--;
finalize();
}
}
})
.on('error', () => {
if (delayed !== -1) {
delayed--;
finalize();
}
})
.pipe(stream);
}
}
setTimeout(finalize, processingTime);
}
catch (err) {
res.json({ application: `FILE: ${fileerror}`, system: err });
}
}
catch (err) {
res.json({ application: `DIRECTORY: ${directory}`, system: err });
}
});
app.get('/api/downloadtobrowser', (req, res) => {
if (req.query.filename && req.query.filename.trim() !== '') {
res.sendFile(req.query.filename, (err) => {
if (err) {
console.log(`ERROR: ${err}`);
}
});
}
else {
res.json(null);
}
});
app.listen(port, () => console.log(`Express server listening on port ${port}`));