react-native-kochava-measurement
Version:
A lightweight and easy to integrate SDK, providing first-class integration with Kochava’s installation attribution and analytics platform.
584 lines (583 loc) • 20.4 kB
JavaScript
"use strict";
/*
Authored by Brett Barinaga on 11/17/21.
Copyright (c) Kochava, Inc. All rights reserved.
*/
var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = this && this.__generator || function (thisArg, body) {
var _ = {
label: 0,
sent: function () {
if (t[0] & 1) throw t[1];
return t[1];
},
trys: [],
ops: []
},
f,
y,
t,
g;
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function () {
return this;
}), g;
function verb(n) {
return function (v) {
return step([n, v]);
};
}
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [0];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2]) _.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [6, e];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5) throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
import * as utils from "../utils/utils.js";
import { getUrlParameter } from "./browser.js";
import { setCookie, getCookie, deleteCookie } from "./cookies.js";
import { Log } from "../utils/log.js";
export var MAX_STORED_IDLINKS = 10;
export var PersistKey;
(function (PersistKey) {
PersistKey["LastKvinit"] = "com.kochava.tracker.LastKvinit";
PersistKey["EventQueue"] = "com.kochava.tracker.EventQueue";
PersistKey["IdLinkQueue"] = "com.kochava.tracker.IdLinkQueue";
PersistKey["DeviceId"] = "com.kochava.tracker.DeviceId";
PersistKey["InstallId"] = "com.kochava.tracker.InstallId";
PersistKey["FirstStartDate"] = "com.kochava.tracker.FirstStartDate";
PersistKey["InstallSentDate"] = "com.kochava.tracker.InstallSentDate";
PersistKey["KvinitSentDate"] = "com.kochava.tracker.KvinitSentDate";
PersistKey["SessionCount"] = "com.kochava.tracker.SessionCount";
PersistKey["IdentityLinks"] = "com.kochava.tracker.IdentityLinks";
PersistKey["OverrideAppId"] = "com.kochava.tracker.OverrideAppId";
PersistKey["OverrideDeviceId"] = "com.kochava.tracker.OverrideDeviceId";
PersistKey["LastInstall"] = "com.kochava.tracker.LastInstall";
PersistKey["InstallCount"] = "com.kochava.tracker.InstallCount";
PersistKey["OldKvid"] = "kv_id";
})(PersistKey || (PersistKey = {}));
var storedKeys = [PersistKey.LastKvinit, PersistKey.EventQueue, PersistKey.IdLinkQueue, PersistKey.DeviceId, PersistKey.InstallId, PersistKey.FirstStartDate, PersistKey.InstallSentDate, PersistKey.KvinitSentDate, PersistKey.SessionCount, PersistKey.IdentityLinks, PersistKey.OverrideAppId, PersistKey.OverrideDeviceId, PersistKey.LastInstall, PersistKey.InstallCount];
var storage;
export var configureStorage = function (adapter) {
storage = adapter;
};
export var checkInstallIdChange = function (inputId, useCookies) {
return __awaiter(void 0, void 0, void 0, function () {
var persistedInstallId;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, readAndUpdatePersistedValue(PersistKey.InstallId, useCookies)];
case 1:
persistedInstallId = _a.sent();
// if the input is empty, we don't need to change
if (!inputId) return [2 /*return*/, false];
// if the persistedId is empty, we will need to change
if (!persistedInstallId) {
updatePersistedValue(PersistKey.InstallId, inputId, useCookies);
return [2 /*return*/, true];
}
// if the inputId and persistedId are the same, we dont need to change
if (inputId === persistedInstallId) return [2 /*return*/, false];
// at this point both inputId and persistedInstallId exist and are not equal,
// so we must need to change
updatePersistedValue(PersistKey.InstallId, inputId, useCookies);
return [2 /*return*/, true];
}
});
});
};
export var addToPersistedEventQueue = function (job) {
return __awaiter(void 0, void 0, void 0, function () {
var persistedQueueStr, persistedQueue;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.getItem(PersistKey.EventQueue)];
case 1:
persistedQueueStr = _a.sent();
if (persistedQueueStr == null || persistedQueueStr == undefined || persistedQueueStr == '{}') persistedQueueStr = '[]';
persistedQueue = JSON.parse(persistedQueueStr) || [];
persistedQueue.push(job);
return [4 /*yield*/, storage.setItem(PersistKey.EventQueue, JSON.stringify(persistedQueue))];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
};
export var removeFromEventPersistedQueue = function (job) {
return __awaiter(void 0, void 0, void 0, function () {
var persistedQueueStr, persistedQueue, queueWithJobRemoved;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.getItem(PersistKey.EventQueue)];
case 1:
persistedQueueStr = _a.sent();
persistedQueue = JSON.parse(persistedQueueStr) || [];
queueWithJobRemoved = persistedQueue.filter(function (persistedJob) {
return persistedJob.id !== job.id;
});
return [4 /*yield*/, storage.setItem(PersistKey.EventQueue, JSON.stringify(queueWithJobRemoved))];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
};
export var updateOrAddPersistedIdLinkQueue = function (job) {
return __awaiter(void 0, void 0, void 0, function () {
var idLinkKey, persistedQueueStr, persistedQueue, updated, _i, persistedQueue_1, persistedJob, persistedKey;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
idLinkKey = Object.keys(job.idLink)[0];
return [4 /*yield*/, storage.getItem(PersistKey.IdLinkQueue)];
case 1:
persistedQueueStr = _a.sent();
persistedQueue = JSON.parse(persistedQueueStr) || [];
updated = false;
for (_i = 0, persistedQueue_1 = persistedQueue; _i < persistedQueue_1.length; _i++) {
persistedJob = persistedQueue_1[_i];
persistedKey = Object.keys(persistedJob.idLink)[0];
// if the key is already there, update it
if (idLinkKey === persistedKey) {
persistedJob.idLink[idLinkKey] = job.idLink[idLinkKey];
updated = true;
}
}
// if the key is new, add it
if (!updated) {
persistedQueue.push(job);
}
return [4 /*yield*/, storage.setItem(PersistKey.IdLinkQueue, JSON.stringify(persistedQueue))];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
};
export var removeFromIdLinkPersistedQueue = function (job) {
return __awaiter(void 0, void 0, void 0, function () {
var persistedQueueStr, persistedQueue, queueWithJobRemoved;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.getItem(PersistKey.IdLinkQueue)];
case 1:
persistedQueueStr = _a.sent();
persistedQueue = JSON.parse(persistedQueueStr) || [];
queueWithJobRemoved = persistedQueue.filter(function (persistedJob) {
return persistedJob.id !== job.id;
});
return [4 /*yield*/, storage.setItem(PersistKey.IdLinkQueue, JSON.stringify(queueWithJobRemoved))];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
};
export var addPersistedIdLinks = function (key, value, useCookies) {
return __awaiter(void 0, void 0, void 0, function () {
var persistedIdLinksStr, persistedIdLinks, storedSoFar;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.getItem(PersistKey.IdentityLinks)];
case 1:
persistedIdLinksStr = _a.sent();
persistedIdLinks = JSON.parse(persistedIdLinksStr) || {};
storedSoFar = Object.keys(persistedIdLinks);
if (storedSoFar.length > MAX_STORED_IDLINKS) {
Log.debug("Maximum stored idLinks reached, most recent idLink will not be stored.");
return [2 /*return*/];
}
persistedIdLinks[key] = value;
updatePersistedValue(PersistKey.IdentityLinks, JSON.stringify(persistedIdLinks), useCookies);
return [2 /*return*/];
}
});
});
};
export var checkDuplicateIdLink = function (key, value) {
return __awaiter(void 0, void 0, void 0, function () {
var persistedIdLinksStr, persistedIdLinks, persistedKey;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.getItem(PersistKey.IdentityLinks)];
case 1:
persistedIdLinksStr = _a.sent();
if (persistedIdLinksStr) {
persistedIdLinks = JSON.parse(persistedIdLinksStr) || {};
for (persistedKey in persistedIdLinks) {
if (key === persistedKey && persistedIdLinks[persistedKey] === value) {
return [2 /*return*/, true];
}
}
}
return [2 /*return*/, false];
}
});
});
};
export var getPersistedIdentityLinks = function () {
return __awaiter(void 0, void 0, void 0, function () {
var persistedIdLinksStr;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.getItem(PersistKey.IdentityLinks)];
case 1:
persistedIdLinksStr = _a.sent();
if (persistedIdLinksStr) {
return [2 /*return*/, JSON.parse(persistedIdLinksStr)];
}
return [2 /*return*/, undefined];
}
});
});
};
export var readAndUpdateUTM = function (appGuid, useCookies) {
return __awaiter(void 0, void 0, void 0, function () {
var storageName, urlValue, storageValue, cookieValue;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
storageName = appGuid + "_click";
urlValue = getUrlParameter("ko_click_id");
return [4 /*yield*/, storage.getItem(storageName)];
case 1:
storageValue = _a.sent();
cookieValue = "";
if (useCookies) cookieValue = getCookie(storageName);
if (!urlValue) return [3 /*break*/, 3];
return [4 /*yield*/, storage.setItem(storageName, urlValue)];
case 2:
_a.sent();
if (useCookies) setCookie(storageName, urlValue);
return [3 /*break*/, 4];
case 3:
if (storageValue) {
if (useCookies) setCookie(storageName, urlValue);
}
_a.label = 4;
case 4:
return [2 /*return*/, urlValue ? urlValue : storageValue ? storageValue : cookieValue ? cookieValue : ""];
}
});
});
};
export var readAndUpdatePersistedValue = function (key, useCookie) {
return __awaiter(void 0, void 0, void 0, function () {
var urlValue, storageValue, cookieValue;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
urlValue = getUrlParameter(key);
return [4 /*yield*/, storage.getItem(key)];
case 1:
storageValue = _a.sent();
cookieValue = "";
if (useCookie) cookieValue = getCookie(key);
if (!urlValue) return [3 /*break*/, 3];
return [4 /*yield*/, updatePersistedValue(key, urlValue, useCookie)];
case 2:
_a.sent();
return [3 /*break*/, 7];
case 3:
if (!storageValue) return [3 /*break*/, 5];
return [4 /*yield*/, updatePersistedValue(key, storageValue, useCookie)];
case 4:
_a.sent();
return [3 /*break*/, 7];
case 5:
if (!cookieValue) return [3 /*break*/, 7];
return [4 /*yield*/, updatePersistedValue(key, storageValue, useCookie)];
case 6:
_a.sent();
_a.label = 7;
case 7:
return [2 /*return*/, urlValue ? urlValue : storageValue ? storageValue : cookieValue ? cookieValue : ""];
}
});
});
};
export var updatePersistedValue = function (key, value, useCookie) {
return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.setItem(key, value)];
case 1:
_a.sent();
if (useCookie) setCookie(key, value);
return [2 /*return*/];
}
});
});
};
export var deletePersistedValue = function (item) {
return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.removeItem(item)];
case 1:
_a.sent();
deleteCookie(item);
return [2 /*return*/];
}
});
});
};
export var deleteAllPersisted = function () {
return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, Promise.all(storedKeys.map(function (item) {
return deletePersistedValue(item);
}))];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
export var readAndUpdateDeviceId = function (useCookie) {
return __awaiter(void 0, void 0, void 0, function () {
var storedDeviceId, kvId;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, readAndUpdatePersistedValue(PersistKey.DeviceId, useCookie)];
case 1:
storedDeviceId = _a.sent();
if (!storedDeviceId) {
kvId = "KB".concat(utils.getCurrTimeSec(), "T").concat(utils.uuidv4());
storedDeviceId = kvId.replace(/-/g, "");
}
return [4 /*yield*/, updatePersistedValue(PersistKey.DeviceId, storedDeviceId, useCookie)];
case 2:
_a.sent();
return [2 /*return*/, storedDeviceId];
}
});
});
};
export var readAndUpdateSessionCount = function (useCookie) {
return __awaiter(void 0, void 0, void 0, function () {
var storedSessionCount, sessionCount;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, readAndUpdatePersistedValue(PersistKey.SessionCount, useCookie)];
case 1:
storedSessionCount = _a.sent();
sessionCount = 1;
if (storedSessionCount) {
sessionCount = parseInt(storedSessionCount);
sessionCount++;
}
return [4 /*yield*/, updatePersistedValue(PersistKey.SessionCount, sessionCount.toString(), useCookie)];
case 2:
_a.sent();
return [2 /*return*/, sessionCount];
}
});
});
};
export var updateLastInstall = function (lastInstallObject, useCookie) {
return __awaiter(void 0, void 0, void 0, function () {
var lastInstallStr;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
lastInstallStr = JSON.stringify(lastInstallObject);
return [4 /*yield*/, storage.setItem(PersistKey.LastInstall, lastInstallStr)];
case 1:
_a.sent();
if (useCookie) setCookie(PersistKey.LastInstall, lastInstallStr);
return [2 /*return*/];
}
});
});
};
export var getLastInstall = function (useCookie) {
return __awaiter(void 0, void 0, void 0, function () {
var lastInstallStr, cookieValue;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.getItem(PersistKey.LastInstall)];
case 1:
lastInstallStr = _a.sent();
if (lastInstallStr) {
return [2 /*return*/, JSON.parse(lastInstallStr)];
} else if (useCookie) {
cookieValue = getCookie(PersistKey.LastInstall);
if (cookieValue) {
return [2 /*return*/, JSON.parse(cookieValue)];
}
}
return [2 /*return*/, undefined];
}
});
});
};
export var updateInstallCount = function (installCount, useCookie) {
return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [4 /*yield*/, storage.setItem(PersistKey.InstallCount, installCount.toString())];
case 1:
_a.sent();
if (useCookie) {
setCookie(PersistKey.InstallCount, installCount.toString());
}
return [2 /*return*/];
}
});
});
};
export var getItem = function (key) {
return __awaiter(void 0, void 0, void 0, function () {
var value, error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2,, 3]);
return [4 /*yield*/, storage.getItem(key)];
case 1:
value = _a.sent();
if (value) {
return [2 /*return*/, value];
} else {
return [2 /*return*/, null];
}
return [3 /*break*/, 3];
case 2:
error_1 = _a.sent();
Log.error("Error getting item ".concat(key, " from localStorage:"), error_1);
return [2 /*return*/, null];
case 3:
return [2 /*return*/];
}
});
});
};
export var setItem = function (key, value) {
return __awaiter(void 0, void 0, void 0, function () {
var error_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2,, 3]);
return [4 /*yield*/, storage.setItem(key, value)];
case 1:
_a.sent();
return [3 /*break*/, 3];
case 2:
error_2 = _a.sent();
Log.error("Error setting item ".concat(key, " in localStorage:"), error_2);
return [3 /*break*/, 3];
case 3:
return [2 /*return*/];
}
});
});
};
//# sourceMappingURL=persist.js.map