| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 | 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 = Buffer.from(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 = Buffer.from(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;
 |