Bones/node_modules/browser-sync-ui/lib/plugins/history/history.js
SOUTHERNCO\x2mjbyrn 7efe7605b8 Template Upload
2017-05-17 13:45:25 -04:00

133 lines
3.2 KiB
JavaScript

var url = require("url");
var Immutable = require("immutable");
module.exports.init = function (ui, bs) {
var validUrls = Immutable.OrderedSet();
var methods = {
/**
* Send the url list to UI
* @param urls
*/
sendUpdatedUrls: function (urls) {
ui.socket.emit("ui:history:update", decorateUrls(urls));
},
/**
* Only send to UI if list changed
* @param current
* @param temp
*/
sendUpdatedIfChanged: function (current, temp) {
if (!Immutable.is(current, temp)) {
validUrls = temp;
methods.sendUpdatedUrls(validUrls);
}
},
/**
* Send all clients to a URL - this is a proxy
* in case we need to limit/check anything.
* @param data
*/
sendToUrl: function (data) {
var parsed = url.parse(data.path);
data.override = true;
data.path = parsed.path;
data.url = parsed.href;
ui.clients.emit("browser:location", data);
},
/**
* Add a new path
* @param data
*/
addPath: function (data) {
var temp = addPath(validUrls, url.parse(data.href), bs.options.get("mode"));
methods.sendUpdatedIfChanged(validUrls, temp, ui.socket);
},
/**
* Remove a path
* @param data
*/
removePath: function (data) {
var temp = removePath(validUrls, data.path);
methods.sendUpdatedIfChanged(validUrls, temp, ui.socket);
},
/**
* Get the current list
*/
getVisited: function () {
ui.socket.emit("ui:receive:visited", decorateUrls(validUrls));
}
};
ui.clients.on("connection", function (client) {
client.on("ui:history:connected", methods.addPath);
});
ui.socket.on("connection", function (uiClient) {
/**
* Send urls on first connection
*/
uiClient.on("ui:get:visited", methods.getVisited);
methods.sendUpdatedUrls(validUrls);
});
ui.listen("history", {
"sendAllTo": methods.sendToUrl,
"remove": methods.removePath,
"clear": function () {
validUrls = Immutable.OrderedSet([]);
methods.sendUpdatedUrls(validUrls);
}
});
return methods;
};
/**
* @param {Immutable.Set} urls
* @returns {Array}
*/
function decorateUrls (urls) {
var count = 0;
return urls.map(function (value) {
count += 1;
return {
path: value,
key: count
};
}).toJS().reverse();
}
/**
* If snippet mode, add the full URL
* if server/proxy, add JUST the path
* @param immSet
* @param urlObj
* @param mode
* @returns {Set}
*/
function addPath(immSet, urlObj, mode) {
return immSet.add(
mode === "snippet"
? urlObj.href
: urlObj.path
);
}
module.exports.addPath = addPath;
/**
* @param immSet
* @param urlPath
* @returns {*}
*/
function removePath(immSet, urlPath) {
return immSet.remove(url.parse(urlPath).path);
}
module.exports.removePath = removePath;