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 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); } });