You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

220 lines
5.0 KiB

6 years ago
var http = require("http");
var fs = require("fs");
var path = require("path");
var config = require("./config");
var svg = publicFile(config.defaults.public.svg);
var indexPage = publicFile(config.defaults.indexPage);
//var css = publicFile(config.defaults.public.css);
var header = staticFile(config.defaults.components.header);
var footer = staticFile(config.defaults.components.footer);
var zlib = require("zlib");
/**
* @param {UI} ui
* @returns {*}
*/
function startServer(ui) {
var connect = ui.bs.utils.connect;
var serveStatic = ui.bs.utils.serveStatic;
/**
* Create a connect server
*/
var app = connect();
var socketJs = getSocketJs(ui);
var jsFilename = "/" + md5(socketJs, 10) + ".js";
//var cssFilename = "/" + md5(css, 10) + ".css";
/**
* Create a single big file with all deps
*/
//app.use(serveFile(jsFilename, "js", socketJs));
app.use(serveFile(config.defaults.socketJs, "js", socketJs));
// also serve for convenience/testing
app.use(serveFile(config.defaults.pagesConfig, "js", ui.pagesConfig));
//
app.use(serveFile(config.defaults.clientJs, "js", ui.clientJs));
/**
* Add any markup from plugins/hooks/templates
*/
insertPageMarkupFromHooks(
app,
ui.pages,
indexPage
.replace("%pageMarkup%", ui.pageMarkup)
.replace("%templates%", ui.templates)
.replace("%svg%", svg)
.replace("%header%", header)
.replace(/%footer%/g, footer)
);
/**
* gzip css
*/
//app.use(serveFile(cssFilename, "css", css));
app.use(serveStatic(path.join(__dirname, "../public")));
/**
* all public dir as static
*/
app.use(serveStatic(publicDir("")));
/**
* History API fallback
*/
app.use(require("connect-history-api-fallback"));
/**
* Development use
*/
app.use("/node_modules", serveStatic(packageDir("node_modules")));
/**
* Return the server.
*/
return {
server: http.createServer(app),
app: app
};
}
/**
* @param app
* @param pages
* @param markup
*/
function insertPageMarkupFromHooks(app, pages, markup) {
var cached;
app.use(function (req, res, next) {
if (req.url === "/" || pages[req.url.slice(1)]) {
res.writeHead(200, {"Content-Type": "text/html", "Content-Encoding": "gzip"});
if (!cached) {
var buf = new Buffer(markup, "utf-8");
zlib.gzip(buf, function (_, result) {
cached = result;
res.end(result);
});
} else {
res.end(cached);
}
} else {
next();
}
});
}
/**
* Serve Gzipped files & cache them
* @param app
* @param all
*/
var gzipCache = {};
function serveFile(path, type, string) {
var typemap = {
js: "application/javascript",
css: "text/css"
};
return function (req, res, next) {
if (req.url !== path) {
return next();
}
res.writeHead(200, {
"Content-Type": typemap[type],
"Content-Encoding": "gzip",
"Cache-Control": "no-cache, no-store, must-revalidate",
"Expires": 0,
"Pragma": "no-cache"
});
if (gzipCache[path]) {
return res.end(gzipCache[path]);
}
var buf = new Buffer(string, "utf-8");
zlib.gzip(buf, function (_, result) {
gzipCache[path] = result;
res.end(result);
});
};
}
/**
* @param cp
* @returns {string}
*/
function getSocketJs (cp) {
return [
cp.bs.getExternalSocketConnector({namespace: "/browser-sync-cp"})
].join(";");
}
///**
// * @returns {*}
// * @param filepath
// */
//function fileContent (filepath) {
// return fs.readFileSync(require.resolve(filepath), "utf8");
//}
/**
* @param src
* @param length
*/
function md5(src, length) {
var crypto = require("crypto");
var hash = crypto.createHash("md5").update(src, "utf8").digest("hex");
return hash.slice(0, length);
}
/**
* CWD directory helper for static dir
* @param {string} filepath
* @returns {string}
*/
function publicDir (filepath) {
return path.join(__dirname, "/../public" + filepath) || "";
}
/**
* @param {string} filepath
* @returns {string|string}
*/
function staticDir (filepath) {
return path.join(__dirname, "/../static" + filepath) || "";
}
/**
* @param {string} filepath
* @returns {*}
*/
function publicFile(filepath) {
return fs.readFileSync(publicDir(filepath), "utf-8");
}
/**
* @param filepath
* @returns {*}
*/
function staticFile(filepath) {
return fs.readFileSync(staticDir(filepath), "utf-8");
}
/**
* @param {string} filepath
* @returns {string}
*/
function packageDir (filepath) {
return path.join(__dirname, "/../" + filepath);
}
module.exports = startServer;