UNPKG

@segment/analytics.js-core

Version:

The hassle-free way to integrate analytics into any web application.

225 lines (224 loc) 5.78 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); /* * Module dependencies. */ var clone = require('./utils/clone'); var cookie = require('./cookie'); var debug = require('debug')('analytics:entity'); var defaults = require('@ndhoule/defaults'); var extend = require('@ndhoule/extend'); var memory = require('./memory'); var store = require('./store'); var isodateTraverse = require('@segment/isodate-traverse'); /** * Expose `Entity` */ module.exports = Entity; /** * Initialize new `Entity` with `options`. */ function Entity(options) { this.options(options); this.initialize(); } /** * Initialize picks the storage. * * Checks to see if cookies can be set * otherwise fallsback to localStorage. */ Entity.prototype.initialize = function () { cookie.set('ajs:cookies', true); // cookies are enabled. if (cookie.get('ajs:cookies')) { cookie.remove('ajs:cookies'); this._storage = cookie; return; } // localStorage is enabled. if (store.enabled) { this._storage = store; return; } // fallback to memory storage. debug('warning using memory store both cookies and localStorage are disabled'); this._storage = memory; }; /** * Get the storage. */ Entity.prototype.storage = function () { return this._storage; }; /** * Get or set storage `options`. */ Entity.prototype.options = function (options) { if (arguments.length === 0) return this._options; this._options = defaults(options || {}, this.defaults || {}); }; /** * Get or set the entity's `id`. */ Entity.prototype.id = function (id) { switch (arguments.length) { case 0: return this._getId(); case 1: return this._setId(id); default: // No default case } }; /** * Get the entity's id. */ Entity.prototype._getId = function () { if (!this._options.persist) { return this._id === undefined ? null : this._id; } // Check cookies. var cookieId = this._getIdFromCookie(); if (cookieId) { return cookieId; } // Check localStorage. var lsId = this._getIdFromLocalStorage(); if (lsId) { // Copy the id to cookies so we can read it directly from cookies next time. this._setIdInCookies(lsId); return lsId; } return null; }; /** * Get the entity's id from cookies. */ // FIXME `options.cookie` is an optional field, so `this._options.cookie.key` // can thrown an exception. Entity.prototype._getIdFromCookie = function () { return this.storage().get(this._options.cookie.key); }; /** * Get the entity's id from cookies. */ Entity.prototype._getIdFromLocalStorage = function () { if (!this._options.localStorageFallbackDisabled) { return store.get(this._options.cookie.key); } return null; }; /** * Set the entity's `id`. */ Entity.prototype._setId = function (id) { if (this._options.persist) { this._setIdInCookies(id); this._setIdInLocalStorage(id); } else { this._id = id; } }; /** * Set the entity's `id` in cookies. */ Entity.prototype._setIdInCookies = function (id) { this.storage().set(this._options.cookie.key, id); }; /** * Set the entity's `id` in local storage. */ Entity.prototype._setIdInLocalStorage = function (id) { if (!this._options.localStorageFallbackDisabled) { store.set(this._options.cookie.key, id); } }; /** * Get or set the entity's `traits`. * * BACKWARDS COMPATIBILITY: aliased to `properties` */ Entity.prototype.properties = Entity.prototype.traits = function (traits) { switch (arguments.length) { case 0: return this._getTraits(); case 1: return this._setTraits(traits); default: // No default case } }; /** * Get the entity's traits. Always convert ISO date strings into real dates, * since they aren't parsed back from local storage. */ Entity.prototype._getTraits = function () { var ret = this._options.persist ? store.get(this._options.localStorage.key) : this._traits; return ret ? isodateTraverse(clone(ret)) : {}; }; /** * Set the entity's `traits`. */ Entity.prototype._setTraits = function (traits) { traits = traits || {}; if (this._options.persist) { store.set(this._options.localStorage.key, traits); } else { this._traits = traits; } }; /** * Identify the entity with an `id` and `traits`. If we it's the same entity, * extend the existing `traits` instead of overwriting. */ Entity.prototype.identify = function (id, traits) { traits = traits || {}; var current = this.id(); if (current === null || current === id) traits = extend(this.traits(), traits); if (id) this.id(id); this.debug('identify %o, %o', id, traits); this.traits(traits); this.save(); }; /** * Save the entity to local storage and the cookie. */ Entity.prototype.save = function () { if (!this._options.persist) return false; this._setId(this.id()); this._setTraits(this.traits()); return true; }; /** * Log the entity out, reseting `id` and `traits` to defaults. */ Entity.prototype.logout = function () { this.id(null); this.traits({}); this.storage().remove(this._options.cookie.key); store.remove(this._options.cookie.key); store.remove(this._options.localStorage.key); }; /** * Reset all entity state, logging out and returning options to defaults. */ Entity.prototype.reset = function () { this.logout(); this.options({}); }; /** * Load saved entity `id` or `traits` from storage. */ Entity.prototype.load = function () { this.id(this.id()); this.traits(this.traits()); };