UNPKG

@braze/web-sdk

Version:

Braze SDK for web sites and other JS platforms.

447 lines (446 loc) 12.1 kB
import ue from "../models/braze-event.js"; import _t from "../models/identifier.js"; import { isArray as z, 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", Oa: "ab.storage.deviceId", Ql: "ab.storage.sessionId", }, ct: { lc: "ab.test", tE: "ab.storage.events", eE: "ab.storage.attributes", sE: "ab.storage.attributes.anonymous_user", ac: "ab.storage.device", ku: "ab.storage.sdk_metadata", wu: "ab.storage.session_id_for_cached_metadata", Wo: "ab.storage.pushToken", rE: "ab.storage.cardImpressions", jl: "ab.storage.serverConfig", oE: "ab.storage.triggers", nE: "ab.storage.triggers.ts", Vl: "ab.storage.messagingSessionStart", Ps: "ab.storage.cc", Gs: "ab.storage.ccLastFullSync", Hs: "ab.storage.ccLastCardUpdated", ol: "ab.storage.globalRateLimitCurrentTokenCount", ul: "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", xh: "ab.storage.signature", lE: "ab.storage.brazeSyncRetryCount", Qs: "ab.storage.sdkVersion", Se: "ab.storage.ff", Ne: "ab.storage.ffImpressions", Ee: "ab.storage.ffLastRefreshAt", Xe: "ab.storage.ff.sessionId", SE: "ab.storage.lastReqToEndpoint", _E: "ab.storage.requestAttempts", yn: "ab.storage.deferredIam", tl: "ab.storage.lastSdkReq", uE: "ab.storage.alias", ut: "ab.storage.banners", It: "ab.storage.banners.impressions", gt: "ab.storage.banners.sessionId", qi: "ab.storage.dust.mite", zi: "ab.storage.dust.host", }, ie: "ab.optOut", }; export default class ee { constructor(t, e) { (this.cE = t), (this.TE = e), (this.cE = t), (this.TE = e); } Xa(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.Zl = new Date().valueOf()), this.uu(t, e)); } tu(t) { const e = this.cE.jr(t), s = ((t) => { let e; try { e = JSON.parse(t); } catch (t) { e = null; } return e; })(e); let r; if (s) (r = _t.Vo(s) || null), r && this.uu(t, r); else { const s = _t.AE(e); (r = _t.Vo(s) || null), s !== e && r && this.uu(t, r); } return r; } im(t) { this.cE.remove(t); } Za() { 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); } Go(t) { let e; if (null == t || 0 === t.length) return !1; e = z(t) ? t : [t]; let s = this.TE.jr(STORAGE_KEYS.ct.tE); (null != s && z(s)) || (s = []); for (let t = 0; t < e.length; t++) s.push(e[t].dt()); return this.TE.store(STORAGE_KEYS.ct.tE, s); } $l(t) { return null != t && this.Go([t]); } RE() { let t = this.TE.jr(STORAGE_KEYS.ct.tE); this.TE.remove(STORAGE_KEYS.ct.tE), null == t && (t = []); const e = []; let s = !1, r = null; if (z(t)) for (let s = 0; s < t.length; s++) ue.gE(t[s]) ? e.push(ue.Vo(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.ju, 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.jr(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; } Pu(t) { let e = this.TE.jr(STORAGE_KEYS.ct.eE); null == e && (e = {}); const s = this.OE(t[User.Uu]), r = e[s]; for (const o in t) o !== User.Uu && (null == e[s] || (r && null == r[o])) && this.mu(t[User.Uu], o, t[o]); } mu(t, e, s) { let r = this.TE.jr(STORAGE_KEYS.ct.eE); null == r && (r = {}); const o = this.OE(t); let n = r[o]; if ( (null == n && ((n = {}), null != t && (n[User.Uu] = 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.jr(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.jr(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.Uu] = t), this.Pu(r)); } const s = this.tu(STORAGE_KEYS.iu.Ql); 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.$l(s); } } dE() { return this.TE.bE; } } (ee.dc = class { constructor(t) { (this.Pn = t), (this.Pn = t), (this.bE = ro.fE() ? 3 : 10); } mE(t) { return t + "." + this.Pn; } 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; } } jr(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.mc = class { constructor() { (this.KE = {}), (this.YE = 5242880), (this.bE = 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; } jr(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.Pn = t), (this.GE = e), (this.Pn = t), (this.DE = this.CE()), (this.ME = 576e3), (this.GE = !!e); } mE(t) { return null != this.Pn ? t + "." + this.Pn : t; } CE() { 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.Pn) && 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.DE; 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); } jr(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.DE; (document.cookie = s), (document.cookie = s + ";path=/"); } }), (ee.uc = class { constructor(t, e, s) { (this.Pn = t), (this.UE = []), e && this.UE.push(new ee.ne(t)), s && this.UE.push(new ee.dc(t)), this.UE.push(new ee.mc()); } 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; } jr(t) { for (let e = 0; e < this.UE.length; e++) { const s = this.UE[e].jr(t); if (null != s) return s; } return null; } remove(t) { new ee.ne(this.Pn).remove(t); for (let e = 0; e < this.UE.length; e++) this.UE[e].remove(t); } });