import * as uuidv4 from 'uuid/v4' import * as crypto from 'crypto-browserify' export const VISITOR_ID = 'vstr_id' export const DEVICE_ID = 'tracker_device_id' export const SESSION_STAMP = 'tracker_session_stamp' import { addMonthToDate } from './helpers' export const generateValueFor = name => { switch (name) { case VISITOR_ID: return crypto.randomBytes(16).toString('base64') case SESSION_STAMP: return Number(new Date().getTime()) case DEVICE_ID: return `w_${uuidv4()}` default: return uuidv4() } } export const getExpirationFor = name => { switch (name) { case VISITOR_ID: return addMonthToDate(13) case DEVICE_ID: return addMonthToDate(1) default: return null } } /** * Split hostname to get domain, subdomain, and extension * @param {String} hostname * @return {Object} */ const splitHostname = hostname => { if (!hostname.includes('.')) { return { domain: hostname } } const regexParse = new RegExp('([a-z-0-9]{2,63}).([a-z.]{2,6})$') const [, domain, extension] = regexParse.exec(hostname) return { domain, extension, subdomain: hostname.replace(`${domain}.${extension}`, '').slice(0, -1), } } /** * Test hostname to know if it's an IP address * @param {String} hostname * @return {Boolean} */ const isIpAddress = (hostname: string): boolean => { const regexIpAddress = new RegExp( '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$', ) return regexIpAddress.test(hostname) } /** * Test hostname to know if it's a private IP address * @see https://stackoverflow.com/questions/2814002/private-ip-address-identifier-in-regular-expression * @param {String} hostname * @return {Boolean} */ const isPrivateIpAddress = (hostname: string): boolean => { const privateIpRegexp = new RegExp('(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)') return isIpAddress(hostname) && privateIpRegexp.test(hostname) } export const getCookieDomain = hostname => { if (hostname === 'localhost' || hostname === '127.0.0.1' || isPrivateIpAddress(hostname)) { return 'localhost' } const { domain, extension } = splitHostname(hostname) if (extension) { return `.${domain}.${extension}` } return domain }