Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. const Service = require("moleculer").Service;
  2. const DetectDetector = require('node-device-detector');
  3. const MemCache = require("../mixins/memcache");
  4. const crypto = require('crypto');
  5.  
  6. const DEVICE_TYPE = require('node-device-detector/parser/const/device-type');
  7.  
  8. /**
  9. * @typedef {Object} DetectCtxParams
  10. * @property {String} userAgent
  11. */
  12.  
  13. class DeviceDetectorService extends Service {
  14.  
  15. #cache = true;
  16. #detector;
  17.  
  18. constructor(broker) {
  19. super(broker);
  20.  
  21. this.parseServiceSchema({
  22. name: 'device-detector',
  23. mixins: [
  24. MemCache({})
  25. ],
  26. actions: {
  27. "detect": this.detectHandler,
  28. "detect-bot": this.detectBotHandler
  29. },
  30. created: this.serviceCreated,
  31. started: this.serviceStarted,
  32. stopped: this.serviceStopped,
  33. });
  34. }
  35.  
  36. /**
  37. * @param {DetectCtxParams} ctx.params
  38. * @returns {Promise<Object>}
  39. */
  40. async detectHandler(ctx) {
  41. const {userAgent} = ctx.params;
  42. let detectData = null;
  43. let cacheData = null;
  44. let keyCache = null;
  45.  
  46. if (this.#cache) {
  47. keyCache = crypto.createHash('md5').update(userAgent).digest('hex');
  48. cacheData = await this.memcache.getCache(keyCache);
  49.  
  50. if (cacheData) {
  51. detectData = cacheData;
  52. }
  53. }
  54.  
  55. if (!detectData) {
  56. let resultOs = this.#detector.parseOs(userAgent);
  57. let resultClient = this.#detector.parseClient(userAgent);
  58. let resultDeviceType = this.#detector.parseDeviceType(userAgent, resultOs, resultClient, {});
  59. detectData = Object.assign({os: resultOs}, {client: resultClient}, {device: resultDeviceType});
  60. }
  61.  
  62. if (this.#cache && !cacheData) {
  63. await this.memcache.setCache(keyCache, detectData, 3600);
  64. }
  65.  
  66. let mixData = this.detectType(userAgent, detectData);
  67.  
  68. return Object.assign({}, detectData, mixData);
  69. }
  70.  
  71. // public
  72.  
  73. /**
  74. * @param {DetectCtxParams} ctx.params
  75. * @returns {Promise<Object>}
  76. */
  77. detectBotHandler(ctx) {
  78. const {userAgent} = ctx.params;
  79. return this.#detector.parseBot(userAgent);
  80. }
  81.  
  82. // private
  83.  
  84. detectType(userAgent, detectData) {
  85. let isTabled = detectData.device && [DEVICE_TYPE.TABLET].indexOf(detectData.device.type) !== -1;
  86. let isMobile = detectData.device && [DEVICE_TYPE.SMARTPHONE, DEVICE_TYPE.FEATURE_PHONE].indexOf(detectData.device.type) !== -1;
  87. let isPhablet = detectData.device && [DEVICE_TYPE.PHABLET].indexOf(detectData.device.type) !== -1;
  88. let isIOS = detectData.os && detectData.os.family === 'iOS';
  89. let isIPhone = '';
  90. let isAndroid = detectData.os && detectData.os.family === 'Android';
  91. let isDesktop = !isTabled && !isMobile && !isPhablet;
  92. let isYaBrowser = /(Yandex.Browser|YaBrowser)/i.test(userAgent);
  93.  
  94. return {
  95. isDesktop: isDesktop,
  96. isTabled: isTabled,
  97. isMobile: isMobile,
  98. isPhablet: isPhablet,
  99. isIOS: isIOS,
  100. isIPhone: isIPhone,
  101. isAndroid: isAndroid,
  102. isYaBrowser: isYaBrowser
  103. };
  104. }
  105.  
  106.  
  107. serviceCreated() {
  108. this.#detector = new DetectDetector();
  109. }
  110.  
  111. serviceStarted() {
  112. }
  113.  
  114. serviceStopped() {
  115. }
  116.  
  117. }
  118.  
  119. module.exports = DeviceDetectorService;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement