135 lines
3.4 KiB
JavaScript
135 lines
3.4 KiB
JavaScript
"use strict";
|
|
|
|
var filePath = require("path");
|
|
var serveIndex = require("serve-index");
|
|
var serveStatic = require("serve-static");
|
|
var _ = require("lodash");
|
|
var snippetUtils = require("./../snippet").utils;
|
|
|
|
module.exports = {
|
|
/**
|
|
* The middleware that can emit location change events.
|
|
* @param {Object} io
|
|
* @param {Object} options
|
|
* @returns {Function}
|
|
*/
|
|
navigateCallback: function (io, options) {
|
|
|
|
var disabled = false;
|
|
var navigating = false;
|
|
var canNavigate = this.canNavigate;
|
|
|
|
return function (req, res, next) {
|
|
|
|
if (canNavigate(req, options, io)) {
|
|
|
|
var clients = io.sockets.clients();
|
|
|
|
if (clients.length && !disabled && !navigating) {
|
|
|
|
navigating = true;
|
|
disabled = true;
|
|
|
|
io.sockets.emit("location", {
|
|
url: req.url
|
|
});
|
|
|
|
var timer = setTimeout(function () {
|
|
|
|
disabled = false;
|
|
navigating = false;
|
|
clearInterval(timer);
|
|
|
|
}, 300);
|
|
}
|
|
}
|
|
if (typeof next === "function") {
|
|
next();
|
|
}
|
|
};
|
|
},
|
|
/**
|
|
* All the conditions that determine if we should emit
|
|
* a location:change event
|
|
* @param {Object} req
|
|
* @param {Object} options
|
|
* @returns {Boolean}
|
|
*/
|
|
canNavigate: function (req, options) {
|
|
|
|
var headers = req.headers || {};
|
|
|
|
if (req.method !== "GET") {
|
|
return false;
|
|
}
|
|
|
|
if (headers["x-requested-with"] !== undefined && headers["x-requested-with"] === "XMLHttpRequest") {
|
|
return false;
|
|
}
|
|
|
|
if (!options || !options.ghostMode || !options.ghostMode.location) {
|
|
return false;
|
|
}
|
|
|
|
if (snippetUtils.isExcluded(req.url, options.excludedFileTypes)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
},
|
|
/**
|
|
* @param app
|
|
* @param middleware
|
|
* @returns {*}
|
|
*/
|
|
addMiddleware: function (app, middleware) {
|
|
|
|
if (Array.isArray(middleware)) {
|
|
middleware.forEach(function (item) {
|
|
app.use(item);
|
|
});
|
|
} else if (typeof middleware === "function") {
|
|
app.use(middleware);
|
|
}
|
|
|
|
return app;
|
|
},
|
|
/**
|
|
* @param app
|
|
* @param base
|
|
* @param index
|
|
*/
|
|
addBaseDir: function (app, base, index) {
|
|
if (Array.isArray(base)) {
|
|
base.forEach(function (item) {
|
|
app.use(serveStatic(filePath.resolve(item), {index: index}));
|
|
});
|
|
} else {
|
|
if ("string" === typeof base) {
|
|
app.use(serveStatic(filePath.resolve(base), {index: index}));
|
|
}
|
|
}
|
|
},
|
|
/**
|
|
* @param app
|
|
* @param base
|
|
*/
|
|
addDirectory: function (app, base) {
|
|
if (Array.isArray(base)) {
|
|
base = base[0];
|
|
}
|
|
app.use(serveIndex(filePath.resolve(base), {icons:true}));
|
|
},
|
|
/**
|
|
* @param app
|
|
* @param {Object} routes
|
|
*/
|
|
addRoutes: function (app, routes) {
|
|
Object.keys(routes).forEach(function (key) {
|
|
if (_.isString(key) && _.isString(routes[key])) {
|
|
app.use(key, serveStatic(filePath.resolve(routes[key])));
|
|
}
|
|
});
|
|
}
|
|
};
|