-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
119 lines (111 loc) · 4.07 KB
/
server.js
File metadata and controls
119 lines (111 loc) · 4.07 KB
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
"use strict";
const http = require("http");
const fs = require("fs");
const url = require("url");
const finalhandler = require("finalhandler");
const serveStatic = require("serve-static");
const { generateDockerfile, generateDockerComposeFile } = require("./src/generate_docker");
const serve = serveStatic("public");
const uuidv4 = require("uuid/v4");
const parser = require("ua-parser-js");
const rimraf = require("rimraf");
const ncp = require("ncp");
const { tmpdir,platform }= require("os");
const { exec } = require("pkg");
const { join } = require("path");
const { spawn } = require("child_process");
function writeDockerFile(views, connectors, path) {
return new Promise((resolve, reject) => {
const df = generateDockerfile(views, connectors);
fs.writeFile(join(path, "/DockerFile"), new Buffer(df), (error) => {
if (error) {
reject(error);
return;
}
resolve();
});
});
}
function writeDockerComposeFile(views, connectors, path) {
return new Promise((resolve, reject) => {
const df = generateDockerComposeFile(views, connectors);
fs.writeFile(join(path, "/docker-compose.yml"), new Buffer(df), (error) => {
if (error) {
reject(error);
return;
}
resolve();
});
});
}
function createInstaller(views, connectors, os) {
return new Promise((resolve, reject) => {
const folder = join(tmpdir(),uuidv4());
fs.mkdir(folder, () => {
const filename = "cimplex" + (os === "win" ? ".exe" : "");
const filepath = join(folder, filename);
ncp("installer", folder, (error) => {
if (error) {
reject(error);
return;
}
const visframeworkPath = join(folder, join("docker", "visframework"));
fs.mkdir(visframeworkPath, () => {
writeDockerComposeFile(views, connectors, join(folder, "docker")).then(() => {
return writeDockerFile(views, connectors, visframeworkPath).then(() => {
return exec([folder, "--targets", `node8-${os}-x64`, "--output", filepath]);
});
})
.then(() => {
fs.readFile(filepath, (error, file) => {
if (error) {
reject(error);
return;
}
rimraf(folder, (error) => {
if (error) {
reject(error);
return;
}
resolve(file)
});
});
})
.catch(error => reject(error));
});
});
});
});
}
const server = http.createServer((req, res) => {
const location = url.parse(req.url, true)
if (location.pathname !== "/generate") {
serve(req, res, finalhandler(req, res));
} else {
const views = location.query.views;
const connectors = location.query.connectors;
let os = null;
switch (parser(req.headers["user-agent"]).os.name) {
case "Mac OS":
os = "macos"
break;
case "Windows":
os = "win"
break;
}
createInstaller(views, connectors, os).then((installer) => {
const filename = "cimplex" + (os === "win" ? ".exe" : "");
res.writeHead(200, {
"content-type": "application/octet-stream",
"Content-Disposition": `attachment; filename="${filename}"`,
});
res.write(installer);
}).catch((error) => {
res.write(error)
}).then(() => {
res.end();
});
}
});
server.listen(9998);
console.log("server listening on 9998");