visit.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. const useragent = require("useragent");
  2. const geoip = require("geoip-lite");
  3. const URL = require("url");
  4. const { getStatsLimit, removeWww } = require("../utils");
  5. const query = require("../queries");
  6. const browsersList = ["IE", "Firefox", "Chrome", "Opera", "Safari", "Edge"];
  7. const osList = ["Windows", "Mac OS", "Linux", "Android", "iOS"];
  8. function filterInBrowser(agent) {
  9. return function(item) {
  10. return agent.family.toLowerCase().includes(item.toLocaleLowerCase());
  11. }
  12. }
  13. function filterInOs(agent) {
  14. return function(item) {
  15. return agent.os.family.toLowerCase().includes(item.toLocaleLowerCase());
  16. }
  17. }
  18. module.exports = function({ data }) {
  19. const tasks = [];
  20. tasks.push(query.link.incrementVisit({ id: data.link.id }));
  21. // the following line is for backward compatibility
  22. // used to send the whole header to get the user agent
  23. const userAgent = data.userAgent || data.headers?.["user-agent"];
  24. const agent = useragent.parse(userAgent);
  25. const [browser = "Other"] = browsersList.filter(filterInBrowser(agent));
  26. const [os = "Other"] = osList.filter(filterInOs(agent));
  27. const referrer =
  28. data.referrer && removeWww(URL.parse(data.referrer).hostname);
  29. const location = geoip.lookup(data.ip);
  30. const country = location && location.country;
  31. tasks.push(
  32. query.visit.add({
  33. browser: browser.toLowerCase(),
  34. country: country || "Unknown",
  35. id: data.link.id,
  36. os: os.toLowerCase().replace(/\s/gi, ""),
  37. referrer: (referrer && referrer.replace(/\./gi, "[dot]")) || "Direct"
  38. })
  39. );
  40. return Promise.all(tasks);
  41. }