@braze/web-sdk
Version:
Braze SDK for web sites and other JS platforms.
445 lines (444 loc) • 12 kB
JavaScript
import ue from "../models/braze-event.js";
import _t from "../models/identifier.js";
import {
isArray as D,
keys as C,
validateValueIsFromEnum as ta,
values as Pt,
} from "../util/code-utils.js";
import { logger as E, EventTypes as m } from "../../shared-lib/index.js";
import { User } from "../User/index.js";
import ro from "../util/browser-detector.js";
import { getErrorMessage as si } from "../util/error-utils.js";
export const STORAGE_KEYS = {
iu: {
su: "ab.storage.userId",
Jh: "ab.storage.deviceId",
Nl: "ab.storage.sessionId",
},
ct: {
ec: "ab.test",
tE: "ab.storage.events",
eE: "ab.storage.attributes",
sE: "ab.storage.attributes.anonymous_user",
Qa: "ab.storage.device",
au: "ab.storage.sdk_metadata",
du: "ab.storage.session_id_for_cached_metadata",
In: "ab.storage.pushToken",
rE: "ab.storage.cardImpressions",
hl: "ab.storage.serverConfig",
oE: "ab.storage.triggers",
nE: "ab.storage.triggers.ts",
Hl: "ab.storage.messagingSessionStart",
Ps: "ab.storage.cc",
Gs: "ab.storage.ccLastFullSync",
Hs: "ab.storage.ccLastCardUpdated",
Pu: "ab.storage.globalRateLimitCurrentTokenCount",
Hu: "ab.storage.dynamicRateLimitCurrentTokenCount",
Et: "ab.storage.ccClicks",
Pt: "ab.storage.ccImpressions",
Lt: "ab.storage.ccDismissals",
aE: "ab.storage.lastDisplayedTriggerTimesById",
iE: "ab.storage.lastDisplayedTriggerTime",
EE: "ab.storage.triggerFireInstancesById",
jh: "ab.storage.signature",
lE: "ab.storage.brazeSyncRetryCount",
Qs: "ab.storage.sdkVersion",
Ie: "ab.storage.ff",
qe: "ab.storage.ffImpressions",
Ae: "ab.storage.ffLastRefreshAt",
Me: "ab.storage.ff.sessionId",
SE: "ab.storage.lastReqToEndpoint",
_E: "ab.storage.requestAttempts",
Nr: "ab.storage.deferredIam",
Lu: "ab.storage.lastSdkReq",
uE: "ab.storage.alias",
ut: "ab.storage.banners",
It: "ab.storage.banners.impressions",
gt: "ab.storage.banners.sessionId",
},
ie: "ab.optOut",
};
export default class ee {
constructor(t, e) {
(this.cE = t), (this.TE = e), (this.cE = t), (this.TE = e);
}
Da(t) {
const e = C(STORAGE_KEYS.iu),
s = new ee.ne(t);
for (const t of e) s.remove(STORAGE_KEYS.iu[t]);
}
uu(t, e) {
let s = null;
null != e && e instanceof _t && (s = e.dt()), this.cE.store(t, s);
}
hE(t) {
const e = this.tu(t);
null != e && ((e.ql = new Date().valueOf()), this.uu(t, e));
}
tu(t) {
const e = this.cE.br(t),
s = ((t) => {
let e;
try {
e = JSON.parse(t);
} catch (t) {
e = null;
}
return e;
})(e);
let r;
if (s) (r = _t.qn(s) || null), r && this.uu(t, r);
else {
const s = _t.AE(e);
(r = _t.qn(s) || null), s !== e && r && this.uu(t, r);
}
return r;
}
Fl(t) {
this.cE.remove(t);
}
Ua() {
const t = C(STORAGE_KEYS.iu);
let e;
for (const s of t)
(e = this.tu(STORAGE_KEYS.iu[s])),
null != e && this.uu(STORAGE_KEYS.iu[s], e);
}
Eo(t) {
let e;
if (null == t || 0 === t.length) return !1;
e = D(t) ? t : [t];
let s = this.TE.br(STORAGE_KEYS.ct.tE);
(null != s && D(s)) || (s = []);
for (let t = 0; t < e.length; t++) s.push(e[t].dt());
return this.TE.store(STORAGE_KEYS.ct.tE, s);
}
yl(t) {
return null != t && this.Eo([t]);
}
RE() {
let t = this.TE.br(STORAGE_KEYS.ct.tE);
this.TE.remove(STORAGE_KEYS.ct.tE), null == t && (t = []);
const e = [];
let s = !1,
r = null;
if (D(t))
for (let s = 0; s < t.length; s++)
ue.gE(t[s]) ? e.push(ue.qn(t[s])) : (r = s);
else s = !0;
if (s || null != r) {
let o = "Stored events could not be deserialized as Events";
s &&
(o += ", was " + Object.prototype.toString.call(t) + " not an array"),
null != r &&
(o += ", value at index " + r + " does not look like an event"),
(o +=
", serialized values were of type " +
typeof t +
": " +
JSON.stringify(t)),
e.push(new ue(null, m.pu, new Date().valueOf(), null, { e: o }));
}
return e;
}
ft(t, e) {
return (
!!ta(
STORAGE_KEYS.ct,
t,
"StorageManager cannot store object.",
"STORAGE_KEYS.OBJECTS",
) && this.TE.store(t, e)
);
}
lt(t) {
return (
!!ta(
STORAGE_KEYS.ct,
t,
"StorageManager cannot retrieve object.",
"STORAGE_KEYS.OBJECTS",
) && this.TE.br(t)
);
}
Nt(t) {
return (
!!ta(
STORAGE_KEYS.ct,
t,
"StorageManager cannot remove object.",
"STORAGE_KEYS.OBJECTS",
) && (this.TE.remove(t), !0)
);
}
clearData() {
const t = C(STORAGE_KEYS.iu),
e = C(STORAGE_KEYS.ct);
for (let e = 0; e < t.length; e++) {
const s = t[e];
this.cE.remove(STORAGE_KEYS.iu[s]);
}
for (let t = 0; t < e.length; t++) {
const s = e[t];
this.TE.remove(STORAGE_KEYS.ct[s]);
}
}
OE(t) {
return t || STORAGE_KEYS.ct.sE;
}
ku(t) {
let e = this.TE.br(STORAGE_KEYS.ct.eE);
null == e && (e = {});
const s = this.OE(t[User.Jn]),
r = e[s];
for (const o in t)
o !== User.Jn &&
(null == e[s] || (r && null == r[o])) &&
this.mu(t[User.Jn], o, t[o]);
}
mu(t, e, s) {
let r = this.TE.br(STORAGE_KEYS.ct.eE);
null == r && (r = {});
const o = this.OE(t);
let n = r[o];
if (
(null == n && ((n = {}), null != t && (n[User.Jn] = t)), e === User.lu)
) {
null == n[e] && (n[e] = {});
for (const t in s) n[e][t] = s[t];
} else n[e] = s;
return (r[o] = n), this.TE.store(STORAGE_KEYS.ct.eE, r);
}
IE() {
const t = this.TE.br(STORAGE_KEYS.ct.eE);
this.TE.remove(STORAGE_KEYS.ct.eE);
const e = [];
for (const s in t) null != t[s] && e.push(t[s]);
return e;
}
ru(t) {
const e = this.TE.br(STORAGE_KEYS.ct.eE);
if (null != e) {
const s = this.OE(null),
r = e[s];
null != r &&
((e[s] = void 0),
this.TE.store(STORAGE_KEYS.ct.eE, e),
(r[User.Jn] = t),
this.ku(r));
}
const s = this.tu(STORAGE_KEYS.iu.Nl);
let r = null;
null != s && (r = s.eu);
const o = this.RE();
if (null != o)
for (let e = 0; e < o.length; e++) {
const s = o[e];
null == s.userId && s.sessionId == r && (s.userId = t), this.yl(s);
}
}
dE() {
return this.TE.fE;
}
}
(ee.rc = class {
constructor(t) {
(this.sn = t), (this.sn = t), (this.fE = ro.bE() ? 3 : 10);
}
mE(t) {
return t + "." + this.sn;
}
store(t, e) {
const s = { v: e };
try {
return localStorage.setItem(this.mE(t), JSON.stringify(s)), !0;
} catch (t) {
return E.info("Storage failure: " + si(t)), !1;
}
}
br(t) {
try {
let e = null;
const s = localStorage.getItem(this.mE(t));
return null != s && (e = JSON.parse(s)), null == e ? null : e.v;
} catch (t) {
return E.info("Storage retrieval failure: " + si(t)), null;
}
}
remove(t) {
try {
localStorage.removeItem(this.mE(t));
} catch (t) {
return E.info("Storage removal failure: " + si(t)), !1;
}
}
}),
(ee.ac = class {
constructor() {
(this.KE = {}), (this.YE = 5242880), (this.fE = 3);
}
store(t, e) {
const s = { value: e },
r = this.NE(e);
return r > this.YE
? (E.info(
"Storage failure: object is ≈" +
r +
" bytes which is greater than the max of " +
this.YE,
),
!1)
: ((this.KE[t] = s), !0);
}
NE(t) {
const e = [],
s = [t];
let r = 0;
for (; s.length; ) {
const t = s.pop();
if ("boolean" == typeof t) r += 4;
else if ("string" == typeof t) r += 2 * t.length;
else if ("number" == typeof t) r += 8;
else if ("object" == typeof t && -1 === e.indexOf(t)) {
let r, o;
e.push(t);
for (const e in t) (o = t), (r = e), s.push(o[r]);
}
}
return r;
}
br(t) {
const e = this.KE[t];
return null == e ? null : e.value;
}
remove(t) {
this.KE[t] = null;
}
}),
(ee.ne = class {
constructor(t, e) {
(this.sn = t),
(this.GE = e),
(this.sn = t),
(this.CE = this.DE()),
(this.ME = 576e3),
(this.GE = !!e);
}
mE(t) {
return null != this.sn ? t + "." + this.sn : t;
}
DE() {
let t = 0,
e = document.location.hostname;
const s = e.split("."),
r = "ab._gd";
for (; t < s.length - 1 && -1 === document.cookie.indexOf(r + "=" + r); )
t++,
(e = "." + s.slice(-1 - t).join(".")),
(document.cookie = r + "=" + r + ";domain=" + e + ";");
return (
(document.cookie =
r + "=;expires=" + new Date(0).toUTCString() + ";domain=" + e + ";"),
e
);
}
se() {
const t = new Date();
return t.setTime(t.getTime() + 60 * this.ME * 1e3), t.getFullYear();
}
pE() {
const t = Pt(STORAGE_KEYS.iu),
e = document.cookie.split(";");
for (let s = 0; s < e.length; s++) {
let r = e[s];
for (; " " === r.charAt(0); ) r = r.substring(1);
let o = !1;
for (let e = 0; e < t.length; e++)
if (0 === r.indexOf(t[e])) {
o = !0;
break;
}
if (o) {
const t = r.split("=")[0];
-1 === t.indexOf("." + this.sn) && this.vE(t);
}
}
}
store(t, e) {
this.pE();
const s = new Date();
s.setTime(s.getTime() + 60 * this.ME * 1e3);
const r = "expires=" + s.toUTCString(),
o = "domain=" + this.CE;
let n;
n = this.GE ? e : encodeURIComponent(e);
const a = this.mE(t) + "=" + n + ";" + r + ";" + o + ";path=/";
return a.length >= 4093
? (E.info(
"Storage failure: string is " +
a.length +
" chars which is too large to store as a cookie.",
),
!1)
: ((document.cookie = a), !0);
}
br(t) {
const e = [],
s = this.mE(t) + "=",
r = document.cookie.split(";");
for (let o = 0; o < r.length; o++) {
let n = r[o];
for (; " " === n.charAt(0); ) n = n.substring(1);
if (0 === n.indexOf(s))
try {
let t;
(t = this.GE
? n.substring(s.length, n.length)
: decodeURIComponent(n.substring(s.length, n.length))),
e.push(t);
} catch (e) {
return (
E.info("Storage retrieval failure: " + si(e)),
this.remove(t),
null
);
}
}
return e.length > 0 ? e[e.length - 1] : null;
}
remove(t) {
this.vE(this.mE(t));
}
vE(t) {
const e = t + "=;expires=" + new Date(0).toUTCString();
(document.cookie = e), (document.cookie = e + ";path=/");
const s = e + ";domain=" + this.CE;
(document.cookie = s), (document.cookie = s + ";path=/");
}
}),
(ee.tc = class {
constructor(t, e, s) {
(this.sn = t),
(this.UE = []),
e && this.UE.push(new ee.ne(t)),
s && this.UE.push(new ee.rc(t)),
this.UE.push(new ee.ac());
}
store(t, e) {
let s = !0;
for (let r = 0; r < this.UE.length; r++) s = this.UE[r].store(t, e) && s;
return s;
}
br(t) {
for (let e = 0; e < this.UE.length; e++) {
const s = this.UE[e].br(t);
if (null != s) return s;
}
return null;
}
remove(t) {
new ee.ne(this.sn).remove(t);
for (let e = 0; e < this.UE.length; e++) this.UE[e].remove(t);
}
});