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.
132 lines
3.2 KiB
132 lines
3.2 KiB
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;
|
|
|