UNPKG

@braze/web-sdk

Version:

Braze SDK for web sites and other JS platforms.

445 lines (444 loc) 12 kB
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 N, EventTypes as d } 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", Qh: "ab.storage.deviceId", Nu: "ab.storage.sessionId", }, gt: { ec: "ab.test", tE: "ab.storage.events", eE: "ab.storage.attributes", sE: "ab.storage.attributes.anonymous_user", Za: "ab.storage.device", rl: "ab.storage.sdk_metadata", ol: "ab.storage.session_id_for_cached_metadata", Vn: "ab.storage.pushToken", rE: "ab.storage.cardImpressions", gu: "ab.storage.serverConfig", oE: "ab.storage.triggers", nE: "ab.storage.triggers.ts", Hu: "ab.storage.messagingSessionStart", Xs: "ab.storage.cc", Hs: "ab.storage.ccLastFullSync", Is: "ab.storage.ccLastCardUpdated", Ll: "ab.storage.globalRateLimitCurrentTokenCount", Kl: "ab.storage.dynamicRateLimitCurrentTokenCount", Kt: "ab.storage.ccClicks", Xt: "ab.storage.ccImpressions", Qt: "ab.storage.ccDismissals", aE: "ab.storage.lastDisplayedTriggerTimesById", iE: "ab.storage.lastDisplayedTriggerTime", EE: "ab.storage.triggerFireInstancesById", xh: "ab.storage.signature", lE: "ab.storage.brazeSyncRetryCount", Vs: "ab.storage.sdkVersion", Xe: "ab.storage.ff", Ge: "ab.storage.ffImpressions", Ze: "ab.storage.ffLastRefreshAt", Ve: "ab.storage.ff.sessionId", SE: "ab.storage.lastReqToEndpoint", _E: "ab.storage.requestAttempts", Fr: "ab.storage.deferredIam", zl: "ab.storage.lastSdkReq", uE: "ab.storage.alias", vt: "ab.storage.banners", Nt: "ab.storage.banners.impressions", yt: "ab.storage.banners.sessionId", }, me: "ab.optOut", }; export default class ee { constructor(t, e) { (this.cE = t), (this.TE = e), (this.cE = t), (this.TE = e); } Va(t) { const e = C(STORAGE_KEYS.iu), s = new ee.se(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.bt()), this.cE.store(t, s); } hE(t) { const e = this.tu(t); null != e && ((e.qu = new Date().valueOf()), this.uu(t, e)); } tu(t) { const e = this.cE.pr(t), s = ((t) => { let e; try { e = JSON.parse(t); } catch (t) { e = null; } return e; })(e); let r; if (s) (r = _t.zn(s) || null), r && this.uu(t, r); else { const s = _t.AE(e); (r = _t.zn(s) || null), s !== e && r && this.uu(t, r); } return r; } Ku(t) { this.cE.remove(t); } Fa() { 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); } Wo(t) { let e; if (null == t || 0 === t.length) return !1; e = D(t) ? t : [t]; let s = this.TE.pr(STORAGE_KEYS.gt.tE); (null != s && D(s)) || (s = []); for (let t = 0; t < e.length; t++) s.push(e[t].bt()); return this.TE.store(STORAGE_KEYS.gt.tE, s); } Au(t) { return null != t && this.Wo([t]); } RE() { let t = this.TE.pr(STORAGE_KEYS.gt.tE); this.TE.remove(STORAGE_KEYS.gt.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.zn(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, d.ul, new Date().valueOf(), null, { e: o })); } return e; } Bt(t, e) { return ( !!ta( STORAGE_KEYS.gt, t, "StorageManager cannot store object.", "STORAGE_KEYS.OBJECTS", ) && this.TE.store(t, e) ); } ft(t) { return ( !!ta( STORAGE_KEYS.gt, t, "StorageManager cannot retrieve object.", "STORAGE_KEYS.OBJECTS", ) && this.TE.pr(t) ); } Ut(t) { return ( !!ta( STORAGE_KEYS.gt, t, "StorageManager cannot remove object.", "STORAGE_KEYS.OBJECTS", ) && (this.TE.remove(t), !0) ); } clearData() { const t = C(STORAGE_KEYS.iu), e = C(STORAGE_KEYS.gt); 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.gt[s]); } } OE(t) { return t || STORAGE_KEYS.gt.sE; } bl(t) { let e = this.TE.pr(STORAGE_KEYS.gt.eE); null == e && (e = {}); const s = this.OE(t[User.Qn]), r = e[s]; for (const o in t) o !== User.Qn && (null == e[s] || (r && null == r[o])) && this.mu(t[User.Qn], o, t[o]); } mu(t, e, s) { let r = this.TE.pr(STORAGE_KEYS.gt.eE); null == r && (r = {}); const o = this.OE(t); let n = r[o]; if ( (null == n && ((n = {}), null != t && (n[User.Qn] = 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.gt.eE, r); } IE() { const t = this.TE.pr(STORAGE_KEYS.gt.eE); this.TE.remove(STORAGE_KEYS.gt.eE); const e = []; for (const s in t) null != t[s] && e.push(t[s]); return e; } ru(t) { const e = this.TE.pr(STORAGE_KEYS.gt.eE); if (null != e) { const s = this.OE(null), r = e[s]; null != r && ((e[s] = void 0), this.TE.store(STORAGE_KEYS.gt.eE, e), (r[User.Qn] = t), this.bl(r)); } const s = this.tu(STORAGE_KEYS.iu.Nu); 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.Au(s); } } dE() { return this.TE.fE; } } (ee.rc = class { constructor(t) { (this.on = t), (this.on = t), (this.fE = ro.bE() ? 3 : 10); } mE(t) { return t + "." + this.on; } store(t, e) { const s = { v: e }; try { return localStorage.setItem(this.mE(t), JSON.stringify(s)), !0; } catch (t) { return N.info("Storage failure: " + si(t)), !1; } } pr(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 N.info("Storage retrieval failure: " + si(t)), null; } } remove(t) { try { localStorage.removeItem(this.mE(t)); } catch (t) { return N.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 ? (N.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; } pr(t) { const e = this.KE[t]; return null == e ? null : e.value; } remove(t) { this.KE[t] = null; } }), (ee.se = class { constructor(t, e) { (this.on = t), (this.GE = e), (this.on = t), (this.CE = this.DE()), (this.ME = 576e3), (this.GE = !!e); } mE(t) { return null != this.on ? t + "." + this.on : 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 ); } le() { 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.on) && 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 ? (N.info( "Storage failure: string is " + a.length + " chars which is too large to store as a cookie.", ), !1) : ((document.cookie = a), !0); } pr(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 ( N.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.on = t), (this.UE = []), e && this.UE.push(new ee.se(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; } pr(t) { for (let e = 0; e < this.UE.length; e++) { const s = this.UE[e].pr(t); if (null != s) return s; } return null; } remove(t) { new ee.se(this.on).remove(t); for (let e = 0; e < this.UE.length; e++) this.UE[e].remove(t); } });