history.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. var url = require("url");
  2. var Immutable = require("immutable");
  3. module.exports.init = function (ui, bs) {
  4. var validUrls = Immutable.OrderedSet();
  5. var methods = {
  6. /**
  7. * Send the url list to UI
  8. * @param urls
  9. */
  10. sendUpdatedUrls: function (urls) {
  11. ui.socket.emit("ui:history:update", decorateUrls(urls));
  12. },
  13. /**
  14. * Only send to UI if list changed
  15. * @param current
  16. * @param temp
  17. */
  18. sendUpdatedIfChanged: function (current, temp) {
  19. if (!Immutable.is(current, temp)) {
  20. validUrls = temp;
  21. methods.sendUpdatedUrls(validUrls);
  22. }
  23. },
  24. /**
  25. * Send all clients to a URL - this is a proxy
  26. * in case we need to limit/check anything.
  27. * @param data
  28. */
  29. sendToUrl: function (data) {
  30. var parsed = url.parse(data.path);
  31. data.override = true;
  32. data.path = parsed.path;
  33. data.url = parsed.href;
  34. ui.clients.emit("browser:location", data);
  35. },
  36. /**
  37. * Add a new path
  38. * @param data
  39. */
  40. addPath: function (data) {
  41. var temp = addPath(validUrls, url.parse(data.href), bs.options.get("mode"));
  42. methods.sendUpdatedIfChanged(validUrls, temp, ui.socket);
  43. },
  44. /**
  45. * Remove a path
  46. * @param data
  47. */
  48. removePath: function (data) {
  49. var temp = removePath(validUrls, data.path);
  50. methods.sendUpdatedIfChanged(validUrls, temp, ui.socket);
  51. },
  52. /**
  53. * Get the current list
  54. */
  55. getVisited: function () {
  56. ui.socket.emit("ui:receive:visited", decorateUrls(validUrls));
  57. }
  58. };
  59. ui.clients.on("connection", function (client) {
  60. client.on("ui:history:connected", methods.addPath);
  61. });
  62. ui.socket.on("connection", function (uiClient) {
  63. /**
  64. * Send urls on first connection
  65. */
  66. uiClient.on("ui:get:visited", methods.getVisited);
  67. methods.sendUpdatedUrls(validUrls);
  68. });
  69. ui.listen("history", {
  70. "sendAllTo": methods.sendToUrl,
  71. "remove": methods.removePath,
  72. "clear": function () {
  73. validUrls = Immutable.OrderedSet([]);
  74. methods.sendUpdatedUrls(validUrls);
  75. }
  76. });
  77. return methods;
  78. };
  79. /**
  80. * @param {Immutable.Set} urls
  81. * @returns {Array}
  82. */
  83. function decorateUrls (urls) {
  84. var count = 0;
  85. return urls.map(function (value) {
  86. count += 1;
  87. return {
  88. path: value,
  89. key: count
  90. };
  91. }).toJS().reverse();
  92. }
  93. /**
  94. * If snippet mode, add the full URL
  95. * if server/proxy, add JUST the path
  96. * @param immSet
  97. * @param urlObj
  98. * @param mode
  99. * @returns {Set}
  100. */
  101. function addPath(immSet, urlObj, mode) {
  102. return immSet.add(
  103. mode === "snippet"
  104. ? urlObj.href
  105. : urlObj.path
  106. );
  107. }
  108. module.exports.addPath = addPath;
  109. /**
  110. * @param immSet
  111. * @param urlPath
  112. * @returns {*}
  113. */
  114. function removePath(immSet, urlPath) {
  115. return immSet.remove(url.parse(urlPath).path);
  116. }
  117. module.exports.removePath = removePath;