Код весь можно посмотреть здесь
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.