fast-je
@fast-je
Пишу на php.

Как сделать сеттер который создает идентификатор только в том случае, если его нет?

Код весь можно посмотреть здесь https://github.com/samyk/evercookie/blob/master/js...
var self = this;
    this._ec = {};
    if (_ec_hsts){
        if(opts.hsts_domains.length <= 8){
            // TODO: warn on some more prominent place ?
            console.log('HSTS cookie with '+opts.hsts_domains.length+' can only save values up to ' + Math.pow(2, opts.hsts_domains.length) - 1);
        }
        this.hsts_cookie = HSTS_Cookie(opts.hsts_domains);
    }

    this.get = function (name, cb, dont_reset) {
      self._evercookie(name, cb, undefined, undefined, dont_reset);
    };

    this.set = function (name, value) {
      self._evercookie(name, function () {}, value);
    };

    this._evercookie = function (name, cb, value, i, dont_reset) {
      if (self._evercookie === undefined) {
        self = this;
      }
      if (i === undefined) {
        i = 0;
      }
      // first run
      if (i === 0) {      
        if (opts.db) {
          self.evercookie_database_storage(name, value);
        }
        if (opts.idb) {
          self.evercookie_indexdb_storage(name, value);
        }
        if (opts.pngCookieName) {
          self.evercookie_png(name, value);
        }
        if (opts.etagCookieName) {
          self.evercookie_etag(name, value);
        }
        if (opts.cacheCookieName) {
          self.evercookie_cache(name, value);
        }
        if (opts.lso) {
          self.evercookie_lso(name, value);
        }
        if (opts.silverlight) {
          self.evercookie_silverlight(name, value);
        }
        if (opts.authPath) {
          self.evercookie_auth(name, value);
        }
        if (opts.java && _ec_java) {
          self.evercookie_java(name, value);
        }
        
        self._ec.userData      = self.evercookie_userdata(name, value);
        self._ec.cookieData    = self.evercookie_cookie(name, value);
        self._ec.localData     = self.evercookie_local_storage(name, value);
        self._ec.globalData    = self.evercookie_global_storage(name, value);
        self._ec.sessionData   = self.evercookie_session_storage(name, value);
        self._ec.windowData    = self.evercookie_window(name, value);
        
        if (_ec_history) {
          self._ec.historyData = self.evercookie_history(name, value);
        }
        if (_ec_hsts) {
            self._ec.hstsData = undefined;
            if( value === undefined ){
                self.hsts_cookie.get_hsts_as_int(function(int_val){
                    self._ec.hstsData = int_val;
                });
            }else{
                self.hsts_cookie.set_hsts_as_int(value, function(val){
                    self._ec.hstsData = self.hsts_cookie.bools_to_int(val);
                });
            }
        }
      }

      // when writing data, we need to make sure lso and silverlight object is there
      if (value !== undefined) {
        if ((typeof _global_lso === "undefined" ||
          typeof _global_isolated === "undefined" ||
          self._ec.hstsData === undefined ||
          self.hsts_cookie.is_working()) &&
          i++ < _ec_tests) {
          setTimeout(function () {
            self._evercookie(name, cb, value, i, dont_reset);
          }, 300);
        }
      }

      // when reading data, we need to wait for swf, db, silverlight, java and png
      else
      {
        if (
          (
            // we support local db and haven't read data in yet
            (opts.db && window.openDatabase && typeof self._ec.dbData === "undefined") ||
            (opts.idb && idb() && (typeof self._ec.idbData === "undefined" || self._ec.idbData === "")) ||
            (opts.lso && typeof _global_lso === "undefined") ||
            (opts.etagCookieName && typeof self._ec.etagData === "undefined") ||
            (opts.cacheCookieName && typeof self._ec.cacheData === "undefined") ||
            (opts.java && typeof self._ec.javaData === "undefined") ||
            (opts.hsts && (self._ec.hstsData === undefined || self.hsts_cookie.is_working())) || 
            (opts.pngCookieName && document.createElement("canvas").getContext && (typeof self._ec.pngData === "undefined" || self._ec.pngData === "")) ||
            (opts.silverlight && typeof _global_isolated === "undefined")
          ) &&
          i++ < _ec_tests
        )
        {
          setTimeout(function () {
            self._evercookie(name, cb, value, i, dont_reset);
          }, 300);
        }

        // we hit our max wait time or got all our data
        else
        {
          // get just the piece of data we need from swf
          self._ec.lsoData = self.getFromStr(name, _global_lso);
          _global_lso = undefined;

          // get just the piece of data we need from silverlight
          self._ec.slData = self.getFromStr(name, _global_isolated);
          _global_isolated = undefined;

          var tmpec = self._ec,
            candidates = [],
            bestnum = 0,
            candidate,
            item;
          self._ec = {};

          // figure out which is the best candidate
          for (item in tmpec) {
            if (tmpec[item] && tmpec[item] !== "null" && tmpec[item] !== "undefined") {
              candidates[tmpec[item]] = candidates[tmpec[item]] === undefined ? 1 : candidates[tmpec[item]] + 1;
            }
          }

          for (item in candidates) {
            if (candidates[item] > bestnum) {
              bestnum = candidates[item];
              candidate = item;
            }
          }

          this.working = false;
          // reset cookie everywhere
          if (candidate !== undefined && (dont_reset === undefined || dont_reset !== 1)) {
            self.set(name, candidate);
          }
          if (typeof cb === "function") {
            cb(candidate, tmpec);
          }
        }
      }
    };

Этот код из библиотеки файла evercookie.js

var ec = new evercookie();
      ec.set("uuid", createUUID());

      function createUUID(){
          var dt = new Date().getTime();
          var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
              var r = (dt + Math.random()*16)%16 | 0;
              dt = Math.floor(dt/16);
              return (c=='x' ? r :(r&0x3|0x8)).toString(16);
          });
          return uuid;
      }

      function getCookie(value)
      {
		  if(typeof value === 'undefined' || value === null) {
              ec.set("uuid", createUUID());
		  }
		  console.log(value);
      }

      ec.get("uuid", getCookie);

Вот так я вызываю функцию и создаю идентификатор uuid и генерирую случайное значение.
getCookie выполняет задачу, что если такого идентификатора нет, то мы создаем.
Но проблема сейчас в другом, если я вызову через консоль ec.set("uuid", createUUID()); то тогда uuid будет переопределен, я изменил вот так сеттер.

this.set = function (name, value) {
        var v = value;
        var n = name;
        self._evercookie(n, function (value) {
            if(typeof value === 'undefined' || value === null) {
                self._evercookie(n, function () {}, v);
            }
        }, undefined, undefined, undefined);
      // self._evercookie(name, function () {}, value, 1, 1);
    };

Он там чет работал, может это уже и не тот вариант который был.
Мне надо сделать так, при вызове сеттра, проверяет существует ли такой индентификатор, если существует тогда его не изменять, если не существует, то создать.

Какие есть идеи ?
Как еще можно отправить данные идентификатора на сервер, где php.
  • Вопрос задан
  • 160 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы