Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const Service = require("moleculer").Service;
- const DetectDetector = require('node-device-detector');
- const MemCache = require("../mixins/memcache");
- const crypto = require('crypto');
- const DEVICE_TYPE = require('node-device-detector/parser/const/device-type');
- /**
- * @typedef {Object} DetectCtxParams
- * @property {String} userAgent
- */
- class DeviceDetectorService extends Service {
- #cache = true;
- #detector;
- constructor(broker) {
- super(broker);
- this.parseServiceSchema({
- name: 'device-detector',
- mixins: [
- MemCache({})
- ],
- actions: {
- "detect": this.detectHandler,
- "detect-bot": this.detectBotHandler
- },
- created: this.serviceCreated,
- started: this.serviceStarted,
- stopped: this.serviceStopped,
- });
- }
- /**
- * @param {DetectCtxParams} ctx.params
- * @returns {Promise<Object>}
- */
- async detectHandler(ctx) {
- const {userAgent} = ctx.params;
- let detectData = null;
- let cacheData = null;
- let keyCache = null;
- if (this.#cache) {
- keyCache = crypto.createHash('md5').update(userAgent).digest('hex');
- cacheData = await this.memcache.getCache(keyCache);
- if (cacheData) {
- detectData = cacheData;
- }
- }
- if (!detectData) {
- let resultOs = this.#detector.parseOs(userAgent);
- let resultClient = this.#detector.parseClient(userAgent);
- let resultDeviceType = this.#detector.parseDeviceType(userAgent, resultOs, resultClient, {});
- detectData = Object.assign({os: resultOs}, {client: resultClient}, {device: resultDeviceType});
- }
- if (this.#cache && !cacheData) {
- await this.memcache.setCache(keyCache, detectData, 3600);
- }
- let mixData = this.detectType(userAgent, detectData);
- return Object.assign({}, detectData, mixData);
- }
- // public
- /**
- * @param {DetectCtxParams} ctx.params
- * @returns {Promise<Object>}
- */
- detectBotHandler(ctx) {
- const {userAgent} = ctx.params;
- return this.#detector.parseBot(userAgent);
- }
- // private
- detectType(userAgent, detectData) {
- let isTabled = detectData.device && [DEVICE_TYPE.TABLET].indexOf(detectData.device.type) !== -1;
- let isMobile = detectData.device && [DEVICE_TYPE.SMARTPHONE, DEVICE_TYPE.FEATURE_PHONE].indexOf(detectData.device.type) !== -1;
- let isPhablet = detectData.device && [DEVICE_TYPE.PHABLET].indexOf(detectData.device.type) !== -1;
- let isIOS = detectData.os && detectData.os.family === 'iOS';
- let isIPhone = '';
- let isAndroid = detectData.os && detectData.os.family === 'Android';
- let isDesktop = !isTabled && !isMobile && !isPhablet;
- let isYaBrowser = /(Yandex.Browser|YaBrowser)/i.test(userAgent);
- return {
- isDesktop: isDesktop,
- isTabled: isTabled,
- isMobile: isMobile,
- isPhablet: isPhablet,
- isIOS: isIOS,
- isIPhone: isIPhone,
- isAndroid: isAndroid,
- isYaBrowser: isYaBrowser
- };
- }
- serviceCreated() {
- this.#detector = new DetectDetector();
- }
- serviceStarted() {
- }
- serviceStopped() {
- }
- }
- module.exports = DeviceDetectorService;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement