'use strict'; /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ var CryptoJS = CryptoJS || function(h, s) { var f = {}, g = f.lib = {}, q = function() {}, m = g.Base = { extend: function(a) { q.prototype = this; var c = new q; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function() { c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function() { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function() {}, mixIn: function(a) { for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function() { return this.init.prototype.extend(this) } }, r = g.WordArray = m.extend({ init: function(a, c) { a = this.words = a || []; this.sigBytes = c != s ? c : 4 * a.length }, toString: function(a) { return (a || k).stringify(this) }, concat: function(a) { var c = this.words, d = a.words, b = this.sigBytes; a = a.sigBytes; this.clamp(); if (b % 4) for (var e = 0; e < a; e++) c[b + e >>> 2] |= (d[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 8 * ((b + e) % 4); else if (65535 < d.length) for (e = 0; e < a; e += 4) c[b + e >>> 2] = d[e >>> 2]; else c.push.apply(c, d); this.sigBytes += a; return this }, clamp: function() { var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4); a.length = h.ceil(c / 4) }, clone: function() { var a = m.clone.call(this); a.words = this.words.slice(0); return a }, random: function(a) { for (var c = [], d = 0; d < a; d += 4) c.push(4294967296 * h.random() | 0); return new r.init(c, a) } }), l = f.enc = {}, k = l.Hex = { stringify: function(a) { var c = a.words; a = a.sigBytes; for (var d = [], b = 0; b < a; b++) { var e = c[b >>> 2] >>> 24 - 8 * (b % 4) & 255; d.push((e >>> 4).toString(16)); d.push((e & 15).toString(16)) } return d.join("") }, parse: function(a) { for (var c = a.length, d = [], b = 0; b < c; b += 2) d[b >>> 3] |= parseInt(a.substr(b, 2), 16) << 24 - 4 * (b % 8); return new r.init(d, c / 2) } }, n = l.Latin1 = { stringify: function(a) { var c = a.words; a = a.sigBytes; for (var d = [], b = 0; b < a; b++) d.push(String.fromCharCode(c[b >>> 2] >>> 24 - 8 * (b % 4) & 255)); return d.join("") }, parse: function(a) { for (var c = a.length, d = [], b = 0; b < c; b++) d[b >>> 2] |= (a.charCodeAt(b) & 255) << 24 - 8 * (b % 4); return new r.init(d, c) } }, j = l.Utf8 = { stringify: function(a) { try { return decodeURIComponent(escape(n.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function(a) { return n.parse(unescape(encodeURIComponent(a))) } }, u = g.BufferedBlockAlgorithm = m.extend({ reset: function() { this._data = new r.init; this._nDataBytes = 0 }, _append: function(a) { "string" == typeof a && (a = j.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function(a) { var c = this._data, d = c.words, b = c.sigBytes, e = this.blockSize, f = b / (4 * e), f = a ? h.ceil(f) : h.max((f | 0) - this._minBufferSize, 0); a = f * e; b = h.min(4 * a, b); if (a) { for (var g = 0; g < a; g += e) this._doProcessBlock(d, g); g = d.splice(0, a); c.sigBytes -= b } return new r.init(g, b) }, clone: function() { var a = m.clone.call(this); a._data = this._data.clone(); return a }, _minBufferSize: 0 }); g.Hasher = u.extend({ cfg: m.extend(), init: function(a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function() { u.reset.call(this); this._doReset() }, update: function(a) { this._append(a); this._process(); return this }, finalize: function(a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function(a) { return function(c, d) { return (new a.init(d)).finalize(c) } }, _createHmacHelper: function(a) { return function(c, d) { return (new t.HMAC.init(a, d)).finalize(c) } } }); var t = f.algo = {}; return f }(Math); (function(h) { for (var s = CryptoJS, f = s.lib, g = f.WordArray, q = f.Hasher, f = s.algo, m = [], r = [], l = function(a) { return 4294967296 * (a - (a | 0)) | 0 }, k = 2, n = 0; 64 > n;) { var j; a: { j = k; for (var u = h.sqrt(j), t = 2; t <= u; t++) if (!(j % t)) { j = !1; break a } j = !0 } j && (8 > n && (m[n] = l(h.pow(k, 0.5))), r[n] = l(h.pow(k, 1 / 3)), n++); k++ } var a = [], f = f.SHA256 = q.extend({ _doReset: function() { this._hash = new g.init(m.slice(0)) }, _doProcessBlock: function(c, d) { for (var b = this._hash.words, e = b[0], f = b[1], g = b[2], j = b[3], h = b[4], m = b[5], n = b[6], q = b[7], p = 0; 64 > p; p++) { if (16 > p) a[p] = c[d + p] | 0; else { var k = a[p - 15], l = a[p - 2]; a[p] = ((k << 25 | k >>> 7) ^ (k << 14 | k >>> 18) ^ k >>> 3) + a[p - 7] + ((l << 15 | l >>> 17) ^ (l << 13 | l >>> 19) ^ l >>> 10) + a[p - 16] } k = q + ((h << 26 | h >>> 6) ^ (h << 21 | h >>> 11) ^ (h << 7 | h >>> 25)) + (h & m ^ ~h & n) + r[p] + a[p]; l = ((e << 30 | e >>> 2) ^ (e << 19 | e >>> 13) ^ (e << 10 | e >>> 22)) + (e & f ^ e & g ^ f & g); q = n; n = m; m = h; h = j + k | 0; j = g; g = f; f = e; e = k + l | 0 } b[0] = b[0] + e | 0; b[1] = b[1] + f | 0; b[2] = b[2] + g | 0; b[3] = b[3] + j | 0; b[4] = b[4] + h | 0; b[5] = b[5] + m | 0; b[6] = b[6] + n | 0; b[7] = b[7] + q | 0 }, _doFinalize: function() { var a = this._data, d = a.words, b = 8 * this._nDataBytes, e = 8 * a.sigBytes; d[e >>> 5] |= 128 << 24 - e % 32; d[(e + 64 >>> 9 << 4) + 14] = h.floor(b / 4294967296); d[(e + 64 >>> 9 << 4) + 15] = b; a.sigBytes = 4 * d.length; this._process(); return this._hash }, clone: function() { var a = q.clone.call(this); a._hash = this._hash.clone(); return a } }); s.SHA256 = q._createHelper(f); s.HmacSHA256 = q._createHmacHelper(f) })(Math); (function() { var h = CryptoJS, s = h.enc.Utf8; h.algo.HMAC = h.lib.Base.extend({ init: function(f, g) { f = this._hasher = new f.init; "string" == typeof g && (g = s.parse(g)); var h = f.blockSize, m = 4 * h; g.sigBytes > m && (g = f.finalize(g)); g.clamp(); for (var r = this._oKey = g.clone(), l = this._iKey = g.clone(), k = r.words, n = l.words, j = 0; j < h; j++) k[j] ^= 1549556828, n[j] ^= 909522486; r.sigBytes = l.sigBytes = m; this.reset() }, reset: function() { var f = this._hasher; f.reset(); f.update(this._iKey) }, update: function(f) { this._hasher.update(f); return this }, finalize: function(f) { var g = this._hasher; f = g.finalize(f); g.reset(); return g.finalize(this._oKey.clone().concat(f)) } }) })(); /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ (function() { var h = CryptoJS, j = h.lib.WordArray; h.enc.Base64 = { stringify: function(b) { var e = b.words, f = b.sigBytes, c = this._map; b.clamp(); b = []; for (var a = 0; a < f; a += 3) for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63)); if (e = c.charAt(64)) for (; b.length % 4;) b.push(e); return b.join("") }, parse: function(b) { var e = b.length, f = this._map, c = f.charAt(64); c && (c = b.indexOf(c), -1 != c && (e = c)); for (var c = [], a = 0, d = 0; d < e; d++) if (d % 4) { var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4), h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4); c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4); a++ } return j.create(c, a) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } })(); var gameanalytics; (function (gameanalytics) { var EGAErrorSeverity; (function (EGAErrorSeverity) { EGAErrorSeverity[EGAErrorSeverity["Undefined"] = 0] = "Undefined"; EGAErrorSeverity[EGAErrorSeverity["Debug"] = 1] = "Debug"; EGAErrorSeverity[EGAErrorSeverity["Info"] = 2] = "Info"; EGAErrorSeverity[EGAErrorSeverity["Warning"] = 3] = "Warning"; EGAErrorSeverity[EGAErrorSeverity["Error"] = 4] = "Error"; EGAErrorSeverity[EGAErrorSeverity["Critical"] = 5] = "Critical"; })(EGAErrorSeverity = gameanalytics.EGAErrorSeverity || (gameanalytics.EGAErrorSeverity = {})); var EGAProgressionStatus; (function (EGAProgressionStatus) { EGAProgressionStatus[EGAProgressionStatus["Undefined"] = 0] = "Undefined"; EGAProgressionStatus[EGAProgressionStatus["Start"] = 1] = "Start"; EGAProgressionStatus[EGAProgressionStatus["Complete"] = 2] = "Complete"; EGAProgressionStatus[EGAProgressionStatus["Fail"] = 3] = "Fail"; })(EGAProgressionStatus = gameanalytics.EGAProgressionStatus || (gameanalytics.EGAProgressionStatus = {})); var EGAResourceFlowType; (function (EGAResourceFlowType) { EGAResourceFlowType[EGAResourceFlowType["Undefined"] = 0] = "Undefined"; EGAResourceFlowType[EGAResourceFlowType["Source"] = 1] = "Source"; EGAResourceFlowType[EGAResourceFlowType["Sink"] = 2] = "Sink"; })(EGAResourceFlowType = gameanalytics.EGAResourceFlowType || (gameanalytics.EGAResourceFlowType = {})); var EGAAdAction; (function (EGAAdAction) { EGAAdAction[EGAAdAction["Undefined"] = 0] = "Undefined"; EGAAdAction[EGAAdAction["Clicked"] = 1] = "Clicked"; EGAAdAction[EGAAdAction["Show"] = 2] = "Show"; EGAAdAction[EGAAdAction["FailedShow"] = 3] = "FailedShow"; EGAAdAction[EGAAdAction["RewardReceived"] = 4] = "RewardReceived"; })(EGAAdAction = gameanalytics.EGAAdAction || (gameanalytics.EGAAdAction = {})); var EGAAdError; (function (EGAAdError) { EGAAdError[EGAAdError["Undefined"] = 0] = "Undefined"; EGAAdError[EGAAdError["Unknown"] = 1] = "Unknown"; EGAAdError[EGAAdError["Offline"] = 2] = "Offline"; EGAAdError[EGAAdError["NoFill"] = 3] = "NoFill"; EGAAdError[EGAAdError["InternalError"] = 4] = "InternalError"; EGAAdError[EGAAdError["InvalidRequest"] = 5] = "InvalidRequest"; EGAAdError[EGAAdError["UnableToPrecache"] = 6] = "UnableToPrecache"; })(EGAAdError = gameanalytics.EGAAdError || (gameanalytics.EGAAdError = {})); var EGAAdType; (function (EGAAdType) { EGAAdType[EGAAdType["Undefined"] = 0] = "Undefined"; EGAAdType[EGAAdType["Video"] = 1] = "Video"; EGAAdType[EGAAdType["RewardedVideo"] = 2] = "RewardedVideo"; EGAAdType[EGAAdType["Playable"] = 3] = "Playable"; EGAAdType[EGAAdType["Interstitial"] = 4] = "Interstitial"; EGAAdType[EGAAdType["OfferWall"] = 5] = "OfferWall"; EGAAdType[EGAAdType["Banner"] = 6] = "Banner"; })(EGAAdType = gameanalytics.EGAAdType || (gameanalytics.EGAAdType = {})); var http; (function (http) { var EGAHTTPApiResponse; (function (EGAHTTPApiResponse) { EGAHTTPApiResponse[EGAHTTPApiResponse["NoResponse"] = 0] = "NoResponse"; EGAHTTPApiResponse[EGAHTTPApiResponse["BadResponse"] = 1] = "BadResponse"; EGAHTTPApiResponse[EGAHTTPApiResponse["RequestTimeout"] = 2] = "RequestTimeout"; EGAHTTPApiResponse[EGAHTTPApiResponse["JsonEncodeFailed"] = 3] = "JsonEncodeFailed"; EGAHTTPApiResponse[EGAHTTPApiResponse["JsonDecodeFailed"] = 4] = "JsonDecodeFailed"; EGAHTTPApiResponse[EGAHTTPApiResponse["InternalServerError"] = 5] = "InternalServerError"; EGAHTTPApiResponse[EGAHTTPApiResponse["BadRequest"] = 6] = "BadRequest"; EGAHTTPApiResponse[EGAHTTPApiResponse["Unauthorized"] = 7] = "Unauthorized"; EGAHTTPApiResponse[EGAHTTPApiResponse["UnknownResponseCode"] = 8] = "UnknownResponseCode"; EGAHTTPApiResponse[EGAHTTPApiResponse["Ok"] = 9] = "Ok"; EGAHTTPApiResponse[EGAHTTPApiResponse["Created"] = 10] = "Created"; })(EGAHTTPApiResponse = http.EGAHTTPApiResponse || (http.EGAHTTPApiResponse = {})); })(http = gameanalytics.http || (gameanalytics.http = {})); var events; (function (events) { var EGASdkErrorCategory; (function (EGASdkErrorCategory) { EGASdkErrorCategory[EGASdkErrorCategory["Undefined"] = 0] = "Undefined"; EGASdkErrorCategory[EGASdkErrorCategory["EventValidation"] = 1] = "EventValidation"; EGASdkErrorCategory[EGASdkErrorCategory["Database"] = 2] = "Database"; EGASdkErrorCategory[EGASdkErrorCategory["Init"] = 3] = "Init"; EGASdkErrorCategory[EGASdkErrorCategory["Http"] = 4] = "Http"; EGASdkErrorCategory[EGASdkErrorCategory["Json"] = 5] = "Json"; })(EGASdkErrorCategory = events.EGASdkErrorCategory || (events.EGASdkErrorCategory = {})); var EGASdkErrorArea; (function (EGASdkErrorArea) { EGASdkErrorArea[EGASdkErrorArea["Undefined"] = 0] = "Undefined"; EGASdkErrorArea[EGASdkErrorArea["BusinessEvent"] = 1] = "BusinessEvent"; EGASdkErrorArea[EGASdkErrorArea["ResourceEvent"] = 2] = "ResourceEvent"; EGASdkErrorArea[EGASdkErrorArea["ProgressionEvent"] = 3] = "ProgressionEvent"; EGASdkErrorArea[EGASdkErrorArea["DesignEvent"] = 4] = "DesignEvent"; EGASdkErrorArea[EGASdkErrorArea["ErrorEvent"] = 5] = "ErrorEvent"; EGASdkErrorArea[EGASdkErrorArea["InitHttp"] = 9] = "InitHttp"; EGASdkErrorArea[EGASdkErrorArea["EventsHttp"] = 10] = "EventsHttp"; EGASdkErrorArea[EGASdkErrorArea["ProcessEvents"] = 11] = "ProcessEvents"; EGASdkErrorArea[EGASdkErrorArea["AddEventsToStore"] = 12] = "AddEventsToStore"; EGASdkErrorArea[EGASdkErrorArea["AdEvent"] = 20] = "AdEvent"; })(EGASdkErrorArea = events.EGASdkErrorArea || (events.EGASdkErrorArea = {})); var EGASdkErrorAction; (function (EGASdkErrorAction) { EGASdkErrorAction[EGASdkErrorAction["Undefined"] = 0] = "Undefined"; EGASdkErrorAction[EGASdkErrorAction["InvalidCurrency"] = 1] = "InvalidCurrency"; EGASdkErrorAction[EGASdkErrorAction["InvalidShortString"] = 2] = "InvalidShortString"; EGASdkErrorAction[EGASdkErrorAction["InvalidEventPartLength"] = 3] = "InvalidEventPartLength"; EGASdkErrorAction[EGASdkErrorAction["InvalidEventPartCharacters"] = 4] = "InvalidEventPartCharacters"; EGASdkErrorAction[EGASdkErrorAction["InvalidStore"] = 5] = "InvalidStore"; EGASdkErrorAction[EGASdkErrorAction["InvalidFlowType"] = 6] = "InvalidFlowType"; EGASdkErrorAction[EGASdkErrorAction["StringEmptyOrNull"] = 7] = "StringEmptyOrNull"; EGASdkErrorAction[EGASdkErrorAction["NotFoundInAvailableCurrencies"] = 8] = "NotFoundInAvailableCurrencies"; EGASdkErrorAction[EGASdkErrorAction["InvalidAmount"] = 9] = "InvalidAmount"; EGASdkErrorAction[EGASdkErrorAction["NotFoundInAvailableItemTypes"] = 10] = "NotFoundInAvailableItemTypes"; EGASdkErrorAction[EGASdkErrorAction["WrongProgressionOrder"] = 11] = "WrongProgressionOrder"; EGASdkErrorAction[EGASdkErrorAction["InvalidEventIdLength"] = 12] = "InvalidEventIdLength"; EGASdkErrorAction[EGASdkErrorAction["InvalidEventIdCharacters"] = 13] = "InvalidEventIdCharacters"; EGASdkErrorAction[EGASdkErrorAction["InvalidProgressionStatus"] = 15] = "InvalidProgressionStatus"; EGASdkErrorAction[EGASdkErrorAction["InvalidSeverity"] = 16] = "InvalidSeverity"; EGASdkErrorAction[EGASdkErrorAction["InvalidLongString"] = 17] = "InvalidLongString"; EGASdkErrorAction[EGASdkErrorAction["DatabaseTooLarge"] = 18] = "DatabaseTooLarge"; EGASdkErrorAction[EGASdkErrorAction["DatabaseOpenOrCreate"] = 19] = "DatabaseOpenOrCreate"; EGASdkErrorAction[EGASdkErrorAction["JsonError"] = 25] = "JsonError"; EGASdkErrorAction[EGASdkErrorAction["FailHttpJsonDecode"] = 29] = "FailHttpJsonDecode"; EGASdkErrorAction[EGASdkErrorAction["FailHttpJsonEncode"] = 30] = "FailHttpJsonEncode"; EGASdkErrorAction[EGASdkErrorAction["InvalidAdAction"] = 31] = "InvalidAdAction"; EGASdkErrorAction[EGASdkErrorAction["InvalidAdType"] = 32] = "InvalidAdType"; EGASdkErrorAction[EGASdkErrorAction["InvalidString"] = 33] = "InvalidString"; })(EGASdkErrorAction = events.EGASdkErrorAction || (events.EGASdkErrorAction = {})); var EGASdkErrorParameter; (function (EGASdkErrorParameter) { EGASdkErrorParameter[EGASdkErrorParameter["Undefined"] = 0] = "Undefined"; EGASdkErrorParameter[EGASdkErrorParameter["Currency"] = 1] = "Currency"; EGASdkErrorParameter[EGASdkErrorParameter["CartType"] = 2] = "CartType"; EGASdkErrorParameter[EGASdkErrorParameter["ItemType"] = 3] = "ItemType"; EGASdkErrorParameter[EGASdkErrorParameter["ItemId"] = 4] = "ItemId"; EGASdkErrorParameter[EGASdkErrorParameter["Store"] = 5] = "Store"; EGASdkErrorParameter[EGASdkErrorParameter["FlowType"] = 6] = "FlowType"; EGASdkErrorParameter[EGASdkErrorParameter["Amount"] = 7] = "Amount"; EGASdkErrorParameter[EGASdkErrorParameter["Progression01"] = 8] = "Progression01"; EGASdkErrorParameter[EGASdkErrorParameter["Progression02"] = 9] = "Progression02"; EGASdkErrorParameter[EGASdkErrorParameter["Progression03"] = 10] = "Progression03"; EGASdkErrorParameter[EGASdkErrorParameter["EventId"] = 11] = "EventId"; EGASdkErrorParameter[EGASdkErrorParameter["ProgressionStatus"] = 12] = "ProgressionStatus"; EGASdkErrorParameter[EGASdkErrorParameter["Severity"] = 13] = "Severity"; EGASdkErrorParameter[EGASdkErrorParameter["Message"] = 14] = "Message"; EGASdkErrorParameter[EGASdkErrorParameter["AdAction"] = 15] = "AdAction"; EGASdkErrorParameter[EGASdkErrorParameter["AdType"] = 16] = "AdType"; EGASdkErrorParameter[EGASdkErrorParameter["AdSdkName"] = 17] = "AdSdkName"; EGASdkErrorParameter[EGASdkErrorParameter["AdPlacement"] = 18] = "AdPlacement"; })(EGASdkErrorParameter = events.EGASdkErrorParameter || (events.EGASdkErrorParameter = {})); })(events = gameanalytics.events || (gameanalytics.events = {})); })(gameanalytics || (gameanalytics = {})); var public_enums; (function (public_enums) { var EGAErrorSeverity; (function (EGAErrorSeverity) { EGAErrorSeverity[EGAErrorSeverity["Undefined"] = 0] = "Undefined"; EGAErrorSeverity[EGAErrorSeverity["Debug"] = 1] = "Debug"; EGAErrorSeverity[EGAErrorSeverity["Info"] = 2] = "Info"; EGAErrorSeverity[EGAErrorSeverity["Warning"] = 3] = "Warning"; EGAErrorSeverity[EGAErrorSeverity["Error"] = 4] = "Error"; EGAErrorSeverity[EGAErrorSeverity["Critical"] = 5] = "Critical"; })(EGAErrorSeverity = public_enums.EGAErrorSeverity || (public_enums.EGAErrorSeverity = {})); var EGAProgressionStatus; (function (EGAProgressionStatus) { EGAProgressionStatus[EGAProgressionStatus["Undefined"] = 0] = "Undefined"; EGAProgressionStatus[EGAProgressionStatus["Start"] = 1] = "Start"; EGAProgressionStatus[EGAProgressionStatus["Complete"] = 2] = "Complete"; EGAProgressionStatus[EGAProgressionStatus["Fail"] = 3] = "Fail"; })(EGAProgressionStatus = public_enums.EGAProgressionStatus || (public_enums.EGAProgressionStatus = {})); var EGAResourceFlowType; (function (EGAResourceFlowType) { EGAResourceFlowType[EGAResourceFlowType["Undefined"] = 0] = "Undefined"; EGAResourceFlowType[EGAResourceFlowType["Source"] = 1] = "Source"; EGAResourceFlowType[EGAResourceFlowType["Sink"] = 2] = "Sink"; })(EGAResourceFlowType = public_enums.EGAResourceFlowType || (public_enums.EGAResourceFlowType = {})); var EGAAdAction; (function (EGAAdAction) { EGAAdAction[EGAAdAction["Undefined"] = 0] = "Undefined"; EGAAdAction[EGAAdAction["Clicked"] = 1] = "Clicked"; EGAAdAction[EGAAdAction["Show"] = 2] = "Show"; EGAAdAction[EGAAdAction["FailedShow"] = 3] = "FailedShow"; EGAAdAction[EGAAdAction["RewardReceived"] = 4] = "RewardReceived"; })(EGAAdAction = public_enums.EGAAdAction || (public_enums.EGAAdAction = {})); var EGAAdError; (function (EGAAdError) { EGAAdError[EGAAdError["Undefined"] = 0] = "Undefined"; EGAAdError[EGAAdError["Unknown"] = 1] = "Unknown"; EGAAdError[EGAAdError["Offline"] = 2] = "Offline"; EGAAdError[EGAAdError["NoFill"] = 3] = "NoFill"; EGAAdError[EGAAdError["InternalError"] = 4] = "InternalError"; EGAAdError[EGAAdError["InvalidRequest"] = 5] = "InvalidRequest"; EGAAdError[EGAAdError["UnableToPrecache"] = 6] = "UnableToPrecache"; })(EGAAdError = public_enums.EGAAdError || (public_enums.EGAAdError = {})); var EGAAdType; (function (EGAAdType) { EGAAdType[EGAAdType["Undefined"] = 0] = "Undefined"; EGAAdType[EGAAdType["Video"] = 1] = "Video"; EGAAdType[EGAAdType["RewardedVideo"] = 2] = "RewardedVideo"; EGAAdType[EGAAdType["Playable"] = 3] = "Playable"; EGAAdType[EGAAdType["Interstitial"] = 4] = "Interstitial"; EGAAdType[EGAAdType["OfferWall"] = 5] = "OfferWall"; EGAAdType[EGAAdType["Banner"] = 6] = "Banner"; })(EGAAdType = public_enums.EGAAdType || (public_enums.EGAAdType = {})); })(public_enums || (public_enums = {})); var gameanalytics; (function (gameanalytics) { var logging; (function (logging) { var EGALoggerMessageType; (function (EGALoggerMessageType) { EGALoggerMessageType[EGALoggerMessageType["Error"] = 0] = "Error"; EGALoggerMessageType[EGALoggerMessageType["Warning"] = 1] = "Warning"; EGALoggerMessageType[EGALoggerMessageType["Info"] = 2] = "Info"; EGALoggerMessageType[EGALoggerMessageType["Debug"] = 3] = "Debug"; })(EGALoggerMessageType || (EGALoggerMessageType = {})); var GALogger = (function () { function GALogger() { GALogger.debugEnabled = false; } GALogger.setInfoLog = function (value) { GALogger.instance.infoLogEnabled = value; }; GALogger.setVerboseLog = function (value) { GALogger.instance.infoLogVerboseEnabled = value; }; GALogger.i = function (format) { if (!GALogger.instance.infoLogEnabled) { return; } var message = "Info/" + GALogger.Tag + ": " + format; GALogger.instance.sendNotificationMessage(message, EGALoggerMessageType.Info); }; GALogger.w = function (format) { var message = "Warning/" + GALogger.Tag + ": " + format; GALogger.instance.sendNotificationMessage(message, EGALoggerMessageType.Warning); }; GALogger.e = function (format) { var message = "Error/" + GALogger.Tag + ": " + format; GALogger.instance.sendNotificationMessage(message, EGALoggerMessageType.Error); }; GALogger.ii = function (format) { if (!GALogger.instance.infoLogVerboseEnabled) { return; } var message = "Verbose/" + GALogger.Tag + ": " + format; GALogger.instance.sendNotificationMessage(message, EGALoggerMessageType.Info); }; GALogger.d = function (format) { if (!GALogger.debugEnabled) { return; } var message = "Debug/" + GALogger.Tag + ": " + format; GALogger.instance.sendNotificationMessage(message, EGALoggerMessageType.Debug); }; GALogger.prototype.sendNotificationMessage = function (message, type) { switch (type) { case EGALoggerMessageType.Error: { console.error(message); } break; case EGALoggerMessageType.Warning: { console.warn(message); } break; case EGALoggerMessageType.Debug: { if (typeof console.debug === "function") { console.debug(message); } else { console.log(message); } } break; case EGALoggerMessageType.Info: { console.log(message); } break; } }; GALogger.instance = new GALogger(); GALogger.Tag = "GameAnalytics"; return GALogger; }()); logging.GALogger = GALogger; })(logging = gameanalytics.logging || (gameanalytics.logging = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var utilities; (function (utilities) { var GALogger = gameanalytics.logging.GALogger; var GAUtilities = (function () { function GAUtilities() { } GAUtilities.getHmac = function (key, data) { var encryptedMessage = CryptoJS.HmacSHA256(data, key); return CryptoJS.enc.Base64.stringify(encryptedMessage); }; GAUtilities.stringMatch = function (s, pattern) { if (!s || !pattern) { return false; } return pattern.test(s); }; GAUtilities.joinStringArray = function (v, delimiter) { var result = ""; for (var i = 0, il = v.length; i < il; i++) { if (i > 0) { result += delimiter; } result += v[i]; } return result; }; GAUtilities.stringArrayContainsString = function (array, search) { if (array.length === 0) { return false; } for (var s in array) { if (array[s] === search) { return true; } } return false; }; GAUtilities.encode64 = function (input) { input = encodeURI(input); var output = ""; var chr1, chr2, chr3 = 0; var enc1, enc2, enc3, enc4 = 0; var i = 0; do { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + GAUtilities.keyStr.charAt(enc1) + GAUtilities.keyStr.charAt(enc2) + GAUtilities.keyStr.charAt(enc3) + GAUtilities.keyStr.charAt(enc4); chr1 = chr2 = chr3 = 0; enc1 = enc2 = enc3 = enc4 = 0; } while (i < input.length); return output; }; GAUtilities.decode64 = function (input) { var output = ""; var chr1, chr2, chr3 = 0; var enc1, enc2, enc3, enc4 = 0; var i = 0; var base64test = /[^A-Za-z0-9\+\/\=]/g; if (base64test.exec(input)) { GALogger.w("There were invalid base64 characters in the input text. Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='. Expect errors in decoding."); } input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); do { enc1 = GAUtilities.keyStr.indexOf(input.charAt(i++)); enc2 = GAUtilities.keyStr.indexOf(input.charAt(i++)); enc3 = GAUtilities.keyStr.indexOf(input.charAt(i++)); enc4 = GAUtilities.keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } chr1 = chr2 = chr3 = 0; enc1 = enc2 = enc3 = enc4 = 0; } while (i < input.length); return decodeURI(output); }; GAUtilities.timeIntervalSince1970 = function () { var date = new Date(); return Math.round(date.getTime() / 1000); }; GAUtilities.createGuid = function () { return ("10000000-1000-4000-8000-100000000000").replace(/[018]/g, function (c) { return (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16); }); }; GAUtilities.keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; return GAUtilities; }()); utilities.GAUtilities = GAUtilities; })(utilities = gameanalytics.utilities || (gameanalytics.utilities = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var validators; (function (validators) { var GALogger = gameanalytics.logging.GALogger; var GAUtilities = gameanalytics.utilities.GAUtilities; var EGASdkErrorCategory = gameanalytics.events.EGASdkErrorCategory; var EGASdkErrorArea = gameanalytics.events.EGASdkErrorArea; var EGASdkErrorAction = gameanalytics.events.EGASdkErrorAction; var EGASdkErrorParameter = gameanalytics.events.EGASdkErrorParameter; var ValidationResult = (function () { function ValidationResult(category, area, action, parameter, reason) { this.category = category; this.area = area; this.action = action; this.parameter = parameter; this.reason = reason; } return ValidationResult; }()); validators.ValidationResult = ValidationResult; var GAValidator = (function () { function GAValidator() { } GAValidator.validateBusinessEvent = function (currency, amount, cartType, itemType, itemId) { if (!GAValidator.validateCurrency(currency)) { GALogger.w("Validation fail - business event - currency: Cannot be (null) and need to be A-Z, 3 characters and in the standard at openexchangerates.org. Failed currency: " + currency); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.BusinessEvent, EGASdkErrorAction.InvalidCurrency, EGASdkErrorParameter.Currency, currency); } if (amount < 0) { GALogger.w("Validation fail - business event - amount. Cannot be less than 0. Failed amount: " + amount); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.BusinessEvent, EGASdkErrorAction.InvalidAmount, EGASdkErrorParameter.Amount, amount + ""); } if (!GAValidator.validateShortString(cartType, true)) { GALogger.w("Validation fail - business event - cartType. Cannot be above 32 length. String: " + cartType); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.BusinessEvent, EGASdkErrorAction.InvalidShortString, EGASdkErrorParameter.CartType, cartType); } if (!GAValidator.validateEventPartLength(itemType, false)) { GALogger.w("Validation fail - business event - itemType: Cannot be (null), empty or above 64 characters. String: " + itemType); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.BusinessEvent, EGASdkErrorAction.InvalidEventPartLength, EGASdkErrorParameter.ItemType, itemType); } if (!GAValidator.validateEventPartCharacters(itemType)) { GALogger.w("Validation fail - business event - itemType: Cannot contain other characters than A-z, 0-9, -_., ()!?. String: " + itemType); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.BusinessEvent, EGASdkErrorAction.InvalidEventPartCharacters, EGASdkErrorParameter.ItemType, itemType); } if (!GAValidator.validateEventPartLength(itemId, false)) { GALogger.w("Validation fail - business event - itemId. Cannot be (null), empty or above 64 characters. String: " + itemId); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.BusinessEvent, EGASdkErrorAction.InvalidEventPartLength, EGASdkErrorParameter.ItemId, itemId); } if (!GAValidator.validateEventPartCharacters(itemId)) { GALogger.w("Validation fail - business event - itemId: Cannot contain other characters than A-z, 0-9, -_., ()!?. String: " + itemId); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.BusinessEvent, EGASdkErrorAction.InvalidEventPartCharacters, EGASdkErrorParameter.ItemId, itemId); } return null; }; GAValidator.validateResourceEvent = function (flowType, currency, amount, itemType, itemId, availableCurrencies, availableItemTypes) { if (flowType == gameanalytics.EGAResourceFlowType.Undefined) { GALogger.w("Validation fail - resource event - flowType: Invalid flow type."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.InvalidFlowType, EGASdkErrorParameter.FlowType, ""); } if (!currency) { GALogger.w("Validation fail - resource event - currency: Cannot be (null)"); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.StringEmptyOrNull, EGASdkErrorParameter.Currency, ""); } if (!GAUtilities.stringArrayContainsString(availableCurrencies, currency)) { GALogger.w("Validation fail - resource event - currency: Not found in list of pre-defined available resource currencies. String: " + currency); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.NotFoundInAvailableCurrencies, EGASdkErrorParameter.Currency, currency); } if (!(amount > 0)) { GALogger.w("Validation fail - resource event - amount: Float amount cannot be 0 or negative. Value: " + amount); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.InvalidAmount, EGASdkErrorParameter.Amount, amount + ""); } if (!itemType) { GALogger.w("Validation fail - resource event - itemType: Cannot be (null)"); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.StringEmptyOrNull, EGASdkErrorParameter.ItemType, ""); } if (!GAValidator.validateEventPartLength(itemType, false)) { GALogger.w("Validation fail - resource event - itemType: Cannot be (null), empty or above 64 characters. String: " + itemType); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.InvalidEventPartLength, EGASdkErrorParameter.ItemType, itemType); } if (!GAValidator.validateEventPartCharacters(itemType)) { GALogger.w("Validation fail - resource event - itemType: Cannot contain other characters than A-z, 0-9, -_., ()!?. String: " + itemType); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.InvalidEventPartCharacters, EGASdkErrorParameter.ItemType, itemType); } if (!GAUtilities.stringArrayContainsString(availableItemTypes, itemType)) { GALogger.w("Validation fail - resource event - itemType: Not found in list of pre-defined available resource itemTypes. String: " + itemType); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.NotFoundInAvailableItemTypes, EGASdkErrorParameter.ItemType, itemType); } if (!GAValidator.validateEventPartLength(itemId, false)) { GALogger.w("Validation fail - resource event - itemId: Cannot be (null), empty or above 64 characters. String: " + itemId); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.InvalidEventPartLength, EGASdkErrorParameter.ItemId, itemId); } if (!GAValidator.validateEventPartCharacters(itemId)) { GALogger.w("Validation fail - resource event - itemId: Cannot contain other characters than A-z, 0-9, -_., ()!?. String: " + itemId); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ResourceEvent, EGASdkErrorAction.InvalidEventPartCharacters, EGASdkErrorParameter.ItemId, itemId); } return null; }; GAValidator.validateProgressionEvent = function (progressionStatus, progression01, progression02, progression03) { if (progressionStatus == gameanalytics.EGAProgressionStatus.Undefined) { GALogger.w("Validation fail - progression event: Invalid progression status."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.InvalidProgressionStatus, EGASdkErrorParameter.ProgressionStatus, ""); } if (progression03 && !(progression02 || !progression01)) { GALogger.w("Validation fail - progression event: 03 found but 01+02 are invalid. Progression must be set as either 01, 01+02 or 01+02+03."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.WrongProgressionOrder, EGASdkErrorParameter.Undefined, progression01 + ":" + progression02 + ":" + progression03); } else if (progression02 && !progression01) { GALogger.w("Validation fail - progression event: 02 found but not 01. Progression must be set as either 01, 01+02 or 01+02+03"); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.WrongProgressionOrder, EGASdkErrorParameter.Undefined, progression01 + ":" + progression02 + ":" + progression03); } else if (!progression01) { GALogger.w("Validation fail - progression event: progression01 not valid. Progressions must be set as either 01, 01+02 or 01+02+03"); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.WrongProgressionOrder, EGASdkErrorParameter.Undefined, (progression01 ? progression01 : "") + ":" + (progression02 ? progression02 : "") + ":" + (progression03 ? progression03 : "")); } if (!GAValidator.validateEventPartLength(progression01, false)) { GALogger.w("Validation fail - progression event - progression01: Cannot be (null), empty or above 64 characters. String: " + progression01); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.InvalidEventPartLength, EGASdkErrorParameter.Progression01, progression01); } if (!GAValidator.validateEventPartCharacters(progression01)) { GALogger.w("Validation fail - progression event - progression01: Cannot contain other characters than A-z, 0-9, -_., ()!?. String: " + progression01); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.InvalidEventPartCharacters, EGASdkErrorParameter.Progression01, progression01); } if (progression02) { if (!GAValidator.validateEventPartLength(progression02, true)) { GALogger.w("Validation fail - progression event - progression02: Cannot be empty or above 64 characters. String: " + progression02); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.InvalidEventPartLength, EGASdkErrorParameter.Progression02, progression02); } if (!GAValidator.validateEventPartCharacters(progression02)) { GALogger.w("Validation fail - progression event - progression02: Cannot contain other characters than A-z, 0-9, -_., ()!?. String: " + progression02); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.InvalidEventPartCharacters, EGASdkErrorParameter.Progression02, progression02); } } if (progression03) { if (!GAValidator.validateEventPartLength(progression03, true)) { GALogger.w("Validation fail - progression event - progression03: Cannot be empty or above 64 characters. String: " + progression03); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.InvalidEventPartLength, EGASdkErrorParameter.Progression03, progression03); } if (!GAValidator.validateEventPartCharacters(progression03)) { GALogger.w("Validation fail - progression event - progression03: Cannot contain other characters than A-z, 0-9, -_., ()!?. String: " + progression03); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ProgressionEvent, EGASdkErrorAction.InvalidEventPartCharacters, EGASdkErrorParameter.Progression03, progression03); } } return null; }; GAValidator.validateDesignEvent = function (eventId) { if (!GAValidator.validateEventIdLength(eventId)) { GALogger.w("Validation fail - design event - eventId: Cannot be (null) or empty. Only 5 event parts allowed seperated by :. Each part need to be 64 characters or less. String: " + eventId); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.DesignEvent, EGASdkErrorAction.InvalidEventIdLength, EGASdkErrorParameter.EventId, eventId); } if (!GAValidator.validateEventIdCharacters(eventId)) { GALogger.w("Validation fail - design event - eventId: Non valid characters. Only allowed A-z, 0-9, -_., ()!?. String: " + eventId); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.DesignEvent, EGASdkErrorAction.InvalidEventIdCharacters, EGASdkErrorParameter.EventId, eventId); } return null; }; GAValidator.validateErrorEvent = function (severity, message) { if (severity == gameanalytics.EGAErrorSeverity.Undefined) { GALogger.w("Validation fail - error event - severity: Severity was unsupported value."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ErrorEvent, EGASdkErrorAction.InvalidSeverity, EGASdkErrorParameter.Severity, ""); } if (!GAValidator.validateLongString(message, true)) { GALogger.w("Validation fail - error event - message: Message cannot be above 8192 characters."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.ErrorEvent, EGASdkErrorAction.InvalidLongString, EGASdkErrorParameter.Message, message); } return null; }; GAValidator.validateAdEvent = function (adAction, adType, adSdkName, adPlacement) { if (adAction == gameanalytics.EGAAdAction.Undefined) { GALogger.w("Validation fail - error event - severity: Severity was unsupported value."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.AdEvent, EGASdkErrorAction.InvalidAdAction, EGASdkErrorParameter.AdAction, ""); } if (adType == gameanalytics.EGAAdType.Undefined) { GALogger.w("Validation fail - ad event - adType: Ad type was unsupported value."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.AdEvent, EGASdkErrorAction.InvalidAdType, EGASdkErrorParameter.AdType, ""); } if (!GAValidator.validateShortString(adSdkName, false)) { GALogger.w("Validation fail - ad event - message: Ad SDK name cannot be above 32 characters."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.AdEvent, EGASdkErrorAction.InvalidShortString, EGASdkErrorParameter.AdSdkName, adSdkName); } if (!GAValidator.validateString(adPlacement, false)) { GALogger.w("Validation fail - ad event - message: Ad placement cannot be above 64 characters."); return new ValidationResult(EGASdkErrorCategory.EventValidation, EGASdkErrorArea.AdEvent, EGASdkErrorAction.InvalidString, EGASdkErrorParameter.AdPlacement, adPlacement); } return null; }; GAValidator.validateSdkErrorEvent = function (gameKey, gameSecret, category, area, action) { if (!GAValidator.validateKeys(gameKey, gameSecret)) { return false; } if (category === EGASdkErrorCategory.Undefined) { GALogger.w("Validation fail - sdk error event - type: Category was unsupported value."); return false; } if (area === EGASdkErrorArea.Undefined) { GALogger.w("Validation fail - sdk error event - type: Area was unsupported value."); return false; } if (action === EGASdkErrorAction.Undefined) { GALogger.w("Validation fail - sdk error event - type: Action was unsupported value."); return false; } return true; }; GAValidator.validateKeys = function (gameKey, gameSecret) { if (GAUtilities.stringMatch(gameKey, /^[A-z0-9]{32}$/)) { if (GAUtilities.stringMatch(gameSecret, /^[A-z0-9]{40}$/)) { return true; } } return false; }; GAValidator.validateCurrency = function (currency) { if (!currency) { return false; } if (!GAUtilities.stringMatch(currency, /^[A-Z]{3}$/)) { return false; } return true; }; GAValidator.validateEventPartLength = function (eventPart, allowNull) { if (allowNull && !eventPart) { return true; } if (!eventPart) { return false; } if (eventPart.length > 64) { return false; } return true; }; GAValidator.validateEventPartCharacters = function (eventPart) { if (!GAUtilities.stringMatch(eventPart, /^[A-Za-z0-9\s\-_\.\(\)\!\?]{1,64}$/)) { return false; } return true; }; GAValidator.validateEventIdLength = function (eventId) { if (!eventId) { return false; } if (!GAUtilities.stringMatch(eventId, /^[^:]{1,64}(?::[^:]{1,64}){0,4}$/)) { return false; } return true; }; GAValidator.validateEventIdCharacters = function (eventId) { if (!eventId) { return false; } if (!GAUtilities.stringMatch(eventId, /^[A-Za-z0-9\s\-_\.\(\)\!\?]{1,64}(:[A-Za-z0-9\s\-_\.\(\)\!\?]{1,64}){0,4}$/)) { return false; } return true; }; GAValidator.validateAndCleanInitRequestResponse = function (initResponse, configsCreated) { if (initResponse == null) { GALogger.w("validateInitRequestResponse failed - no response dictionary."); return null; } var validatedDict = {}; try { var serverTsNumber = initResponse["server_ts"]; if (serverTsNumber > 0) { validatedDict["server_ts"] = serverTsNumber; } else { GALogger.w("validateInitRequestResponse failed - invalid value in 'server_ts' field."); return null; } } catch (e) { GALogger.w("validateInitRequestResponse failed - invalid type in 'server_ts' field. type=" + typeof initResponse["server_ts"] + ", value=" + initResponse["server_ts"] + ", " + e); return null; } if (configsCreated) { try { var configurations = initResponse["configs"]; validatedDict["configs"] = configurations; } catch (e) { GALogger.w("validateInitRequestResponse failed - invalid type in 'configs' field. type=" + typeof initResponse["configs"] + ", value=" + initResponse["configs"] + ", " + e); return null; } try { var configs_hash = initResponse["configs_hash"]; validatedDict["configs_hash"] = configs_hash; } catch (e) { GALogger.w("validateInitRequestResponse failed - invalid type in 'configs_hash' field. type=" + typeof initResponse["configs_hash"] + ", value=" + initResponse["configs_hash"] + ", " + e); return null; } try { var ab_id = initResponse["ab_id"]; validatedDict["ab_id"] = ab_id; } catch (e) { GALogger.w("validateInitRequestResponse failed - invalid type in 'ab_id' field. type=" + typeof initResponse["ab_id"] + ", value=" + initResponse["ab_id"] + ", " + e); return null; } try { var ab_variant_id = initResponse["ab_variant_id"]; validatedDict["ab_variant_id"] = ab_variant_id; } catch (e) { GALogger.w("validateInitRequestResponse failed - invalid type in 'ab_variant_id' field. type=" + typeof initResponse["ab_variant_id"] + ", value=" + initResponse["ab_variant_id"] + ", " + e); return null; } } return validatedDict; }; GAValidator.validateBuild = function (build) { if (!GAValidator.validateShortString(build, false)) { return false; } return true; }; GAValidator.validateSdkWrapperVersion = function (wrapperVersion) { if (!GAUtilities.stringMatch(wrapperVersion, /^(unity|unreal|gamemaker|cocos2d|construct|defold|godot|flutter) [0-9]{0,5}(\.[0-9]{0,5}){0,2}$/)) { return false; } return true; }; GAValidator.validateEngineVersion = function (engineVersion) { if (!engineVersion || !GAUtilities.stringMatch(engineVersion, /^(unity|unreal|gamemaker|cocos2d|construct|defold|godot) [0-9]{0,5}(\.[0-9]{0,5}){0,2}$/)) { return false; } return true; }; GAValidator.validateUserId = function (uId) { if (!GAValidator.validateString(uId, false)) { GALogger.w("Validation fail - user id: id cannot be (null), empty or above 64 characters."); return false; } return true; }; GAValidator.validateShortString = function (shortString, canBeEmpty) { if (canBeEmpty && !shortString) { return true; } if (!shortString || shortString.length > 32) { return false; } return true; }; GAValidator.validateString = function (s, canBeEmpty) { if (canBeEmpty && !s) { return true; } if (!s || s.length > 64) { return false; } return true; }; GAValidator.validateLongString = function (longString, canBeEmpty) { if (canBeEmpty && !longString) { return true; } if (!longString || longString.length > 8192) { return false; } return true; }; GAValidator.validateConnectionType = function (connectionType) { return GAUtilities.stringMatch(connectionType, /^(wwan|wifi|lan|offline)$/); }; GAValidator.validateCustomDimensions = function (customDimensions) { return GAValidator.validateArrayOfStrings(20, 32, false, "custom dimensions", customDimensions); }; GAValidator.validateResourceCurrencies = function (resourceCurrencies) { if (!GAValidator.validateArrayOfStrings(20, 64, false, "resource currencies", resourceCurrencies)) { return false; } for (var i = 0; i < resourceCurrencies.length; ++i) { if (!GAUtilities.stringMatch(resourceCurrencies[i], /^[A-Za-z]+$/)) { GALogger.w("resource currencies validation failed: a resource currency can only be A-Z, a-z. String was: " + resourceCurrencies[i]); return false; } } return true; }; GAValidator.validateResourceItemTypes = function (resourceItemTypes) { if (!GAValidator.validateArrayOfStrings(20, 32, false, "resource item types", resourceItemTypes)) { return false; } for (var i = 0; i < resourceItemTypes.length; ++i) { if (!GAValidator.validateEventPartCharacters(resourceItemTypes[i])) { GALogger.w("resource item types validation failed: a resource item type cannot contain other characters than A-z, 0-9, -_., ()!?. String was: " + resourceItemTypes[i]); return false; } } return true; }; GAValidator.validateDimension01 = function (dimension01, availableDimensions) { if (!dimension01) { return true; } if (!GAUtilities.stringArrayContainsString(availableDimensions, dimension01)) { return false; } return true; }; GAValidator.validateDimension02 = function (dimension02, availableDimensions) { if (!dimension02) { return true; } if (!GAUtilities.stringArrayContainsString(availableDimensions, dimension02)) { return false; } return true; }; GAValidator.validateDimension03 = function (dimension03, availableDimensions) { if (!dimension03) { return true; } if (!GAUtilities.stringArrayContainsString(availableDimensions, dimension03)) { return false; } return true; }; GAValidator.validateArrayOfStrings = function (maxCount, maxStringLength, allowNoValues, logTag, arrayOfStrings) { var arrayTag = logTag; if (!arrayTag) { arrayTag = "Array"; } if (!arrayOfStrings) { GALogger.w(arrayTag + " validation failed: array cannot be null. "); return false; } if (allowNoValues == false && arrayOfStrings.length == 0) { GALogger.w(arrayTag + " validation failed: array cannot be empty. "); return false; } if (maxCount > 0 && arrayOfStrings.length > maxCount) { GALogger.w(arrayTag + " validation failed: array cannot exceed " + maxCount + " values. It has " + arrayOfStrings.length + " values."); return false; } for (var i = 0; i < arrayOfStrings.length; ++i) { var stringLength = !arrayOfStrings[i] ? 0 : arrayOfStrings[i].length; if (stringLength === 0) { GALogger.w(arrayTag + " validation failed: contained an empty string. Array=" + JSON.stringify(arrayOfStrings)); return false; } if (maxStringLength > 0 && stringLength > maxStringLength) { GALogger.w(arrayTag + " validation failed: a string exceeded max allowed length (which is: " + maxStringLength + "). String was: " + arrayOfStrings[i]); return false; } } return true; }; GAValidator.validateClientTs = function (clientTs) { if (clientTs < (0) || clientTs > (99999999999)) { return false; } return true; }; return GAValidator; }()); validators.GAValidator = GAValidator; })(validators = gameanalytics.validators || (gameanalytics.validators = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var device; (function (device) { var NameValueVersion = (function () { function NameValueVersion(name, value, version) { this.name = name; this.value = value; this.version = version; } return NameValueVersion; }()); device.NameValueVersion = NameValueVersion; var NameVersion = (function () { function NameVersion(name, version) { this.name = name; this.version = version; } return NameVersion; }()); device.NameVersion = NameVersion; var GADevice = (function () { function GADevice() { } GADevice.touch = function () { }; GADevice.getRelevantSdkVersion = function () { if (GADevice.sdkGameEngineVersion) { return GADevice.sdkGameEngineVersion; } return GADevice.sdkWrapperVersion; }; GADevice.getConnectionType = function () { return GADevice.connectionType; }; GADevice.updateConnectionType = function () { if (navigator.onLine) { if (GADevice.buildPlatform === "ios" || GADevice.buildPlatform === "android") { GADevice.connectionType = "wwan"; } else { GADevice.connectionType = "lan"; } } else { GADevice.connectionType = "offline"; } }; GADevice.getOSVersionString = function () { return GADevice.buildPlatform + " " + GADevice.osVersionPair.version; }; GADevice.runtimePlatformToString = function () { return GADevice.osVersionPair.name; }; GADevice.getBrowserVersionString = function () { var ua = navigator.userAgent; var tem; var M = ua.match(/(opera|chrome|safari|firefox|ubrowser|msie|trident|fbav(?=\/))\/?\s*(\d+)/i) || []; if (M.length == 0) { if (GADevice.buildPlatform === "ios") { return "webkit_" + GADevice.osVersion; } } if (/trident/i.test(M[1])) { tem = /\brv[ :]+(\d+)/g.exec(ua) || []; return 'IE ' + (tem[1] || ''); } if (M[1] === 'Chrome') { tem = ua.match(/\b(OPR|Edge|UBrowser)\/(\d+)/); if (tem != null) { return tem.slice(1).join(' ').replace('OPR', 'Opera').replace('UBrowser', 'UC').toLowerCase(); } } if (M[1] && M[1].toLowerCase() === 'fbav') { M[1] = "facebook"; if (M[2]) { return "facebook " + M[2]; } } var MString = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?']; if ((tem = ua.match(/version\/(\d+)/i)) != null) { MString.splice(1, 1, tem[1]); } return MString.join(' ').toLowerCase(); }; GADevice.getDeviceModel = function () { var result = "unknown"; return result; }; GADevice.getDeviceManufacturer = function () { var result = "unknown"; return result; }; GADevice.matchItem = function (agent, data) { var result = new NameVersion("unknown", "0.0.0"); var i = 0; var j = 0; var regex; var regexv; var match; var matches; var mathcesResult; var version; for (i = 0; i < data.length; i += 1) { regex = new RegExp(data[i].value, 'i'); match = regex.test(agent); if (match) { regexv = new RegExp(data[i].version + '[- /:;]([\\d._]+)', 'i'); matches = agent.match(regexv); version = ''; if (matches) { if (matches[1]) { mathcesResult = matches[1]; } } if (mathcesResult) { var matchesArray = mathcesResult.split(/[._]+/); for (j = 0; j < Math.min(matchesArray.length, 3); j += 1) { version += matchesArray[j] + (j < Math.min(matchesArray.length, 3) - 1 ? '.' : ''); } } else { version = '0.0.0'; } result.name = data[i].name; result.version = version; return result; } } return result; }; GADevice.sdkWrapperVersion = "javascript 4.4.5"; GADevice.osVersionPair = GADevice.matchItem([ navigator.platform, navigator.userAgent, navigator.appVersion, navigator.vendor ].join(' '), [ new NameValueVersion("windows_phone", "Windows Phone", "OS"), new NameValueVersion("windows", "Win", "NT"), new NameValueVersion("ios", "iPhone", "OS"), new NameValueVersion("ios", "iPad", "OS"), new NameValueVersion("ios", "iPod", "OS"), new NameValueVersion("android", "Android", "Android"), new NameValueVersion("blackBerry", "BlackBerry", "/"), new NameValueVersion("mac_osx", "Mac", "OS X"), new NameValueVersion("tizen", "Tizen", "Tizen"), new NameValueVersion("linux", "Linux", "rv"), new NameValueVersion("kai_os", "KAIOS", "KAIOS") ]); GADevice.buildPlatform = GADevice.runtimePlatformToString(); GADevice.deviceModel = GADevice.getDeviceModel(); GADevice.deviceManufacturer = GADevice.getDeviceManufacturer(); GADevice.osVersion = GADevice.getOSVersionString(); GADevice.browserVersion = GADevice.getBrowserVersionString(); return GADevice; }()); device.GADevice = GADevice; })(device = gameanalytics.device || (gameanalytics.device = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var threading; (function (threading) { var TimedBlock = (function () { function TimedBlock(deadline) { this.deadline = deadline; this.ignore = false; this.async = false; this.running = false; this.id = ++TimedBlock.idCounter; } TimedBlock.idCounter = 0; return TimedBlock; }()); threading.TimedBlock = TimedBlock; })(threading = gameanalytics.threading || (gameanalytics.threading = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var threading; (function (threading) { var PriorityQueue = (function () { function PriorityQueue(priorityComparer) { this.comparer = priorityComparer; this._subQueues = {}; this._sortedKeys = []; } PriorityQueue.prototype.enqueue = function (priority, item) { if (this._sortedKeys.indexOf(priority) === -1) { this.addQueueOfPriority(priority); } this._subQueues[priority].push(item); }; PriorityQueue.prototype.addQueueOfPriority = function (priority) { var _this = this; this._sortedKeys.push(priority); this._sortedKeys.sort(function (x, y) { return _this.comparer.compare(x, y); }); this._subQueues[priority] = []; }; PriorityQueue.prototype.peek = function () { if (this.hasItems()) { return this._subQueues[this._sortedKeys[0]][0]; } else { throw new Error("The queue is empty"); } }; PriorityQueue.prototype.hasItems = function () { return this._sortedKeys.length > 0; }; PriorityQueue.prototype.dequeue = function () { if (this.hasItems()) { return this.dequeueFromHighPriorityQueue(); } else { throw new Error("The queue is empty"); } }; PriorityQueue.prototype.dequeueFromHighPriorityQueue = function () { var firstKey = this._sortedKeys[0]; var nextItem = this._subQueues[firstKey].shift(); if (this._subQueues[firstKey].length === 0) { this._sortedKeys.shift(); delete this._subQueues[firstKey]; } return nextItem; }; return PriorityQueue; }()); threading.PriorityQueue = PriorityQueue; })(threading = gameanalytics.threading || (gameanalytics.threading = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var store; (function (store_1) { var GALogger = gameanalytics.logging.GALogger; var EGAStoreArgsOperator; (function (EGAStoreArgsOperator) { EGAStoreArgsOperator[EGAStoreArgsOperator["Equal"] = 0] = "Equal"; EGAStoreArgsOperator[EGAStoreArgsOperator["LessOrEqual"] = 1] = "LessOrEqual"; EGAStoreArgsOperator[EGAStoreArgsOperator["NotEqual"] = 2] = "NotEqual"; })(EGAStoreArgsOperator = store_1.EGAStoreArgsOperator || (store_1.EGAStoreArgsOperator = {})); var EGAStore; (function (EGAStore) { EGAStore[EGAStore["Events"] = 0] = "Events"; EGAStore[EGAStore["Sessions"] = 1] = "Sessions"; EGAStore[EGAStore["Progression"] = 2] = "Progression"; })(EGAStore = store_1.EGAStore || (store_1.EGAStore = {})); var GAStore = (function () { function GAStore() { this.eventsStore = []; this.sessionsStore = []; this.progressionStore = []; this.storeItems = {}; try { if (typeof localStorage === 'object') { localStorage.setItem('testingLocalStorage', 'yes'); localStorage.removeItem('testingLocalStorage'); GAStore.storageAvailable = true; } else { GAStore.storageAvailable = false; } } catch (e) { } } GAStore.isStorageAvailable = function () { return GAStore.storageAvailable; }; GAStore.isStoreTooLargeForEvents = function () { return GAStore.instance.eventsStore.length + GAStore.instance.sessionsStore.length > GAStore.MaxNumberOfEntries; }; GAStore.select = function (store, args, sort, maxCount) { if (args === void 0) { args = []; } if (sort === void 0) { sort = false; } if (maxCount === void 0) { maxCount = 0; } var currentStore = GAStore.getStore(store); if (!currentStore) { return null; } var result = []; for (var i = 0; i < currentStore.length; ++i) { var entry = currentStore[i]; var add = true; for (var j = 0; j < args.length; ++j) { var argsEntry = args[j]; if (entry[argsEntry[0]]) { switch (argsEntry[1]) { case EGAStoreArgsOperator.Equal: { add = entry[argsEntry[0]] == argsEntry[2]; } break; case EGAStoreArgsOperator.LessOrEqual: { add = entry[argsEntry[0]] <= argsEntry[2]; } break; case EGAStoreArgsOperator.NotEqual: { add = entry[argsEntry[0]] != argsEntry[2]; } break; default: { add = false; } break; } } else { add = false; } if (!add) { break; } } if (add) { result.push(entry); } } if (sort) { result.sort(function (a, b) { return a["client_ts"] - b["client_ts"]; }); } if (maxCount > 0 && result.length > maxCount) { result = result.slice(0, maxCount + 1); } return result; }; GAStore.update = function (store, setArgs, whereArgs) { if (whereArgs === void 0) { whereArgs = []; } var currentStore = GAStore.getStore(store); if (!currentStore) { return false; } for (var i = 0; i < currentStore.length; ++i) { var entry = currentStore[i]; var update = true; for (var j = 0; j < whereArgs.length; ++j) { var argsEntry = whereArgs[j]; if (entry[argsEntry[0]]) { switch (argsEntry[1]) { case EGAStoreArgsOperator.Equal: { update = entry[argsEntry[0]] == argsEntry[2]; } break; case EGAStoreArgsOperator.LessOrEqual: { update = entry[argsEntry[0]] <= argsEntry[2]; } break; case EGAStoreArgsOperator.NotEqual: { update = entry[argsEntry[0]] != argsEntry[2]; } break; default: { update = false; } break; } } else { update = false; } if (!update) { break; } } if (update) { for (var j = 0; j < setArgs.length; ++j) { var setArgsEntry = setArgs[j]; entry[setArgsEntry[0]] = setArgsEntry[1]; } } } return true; }; GAStore["delete"] = function (store, args) { var currentStore = GAStore.getStore(store); if (!currentStore) { return; } for (var i = 0; i < currentStore.length; ++i) { var entry = currentStore[i]; var del = true; for (var j = 0; j < args.length; ++j) { var argsEntry = args[j]; if (entry[argsEntry[0]]) { switch (argsEntry[1]) { case EGAStoreArgsOperator.Equal: { del = entry[argsEntry[0]] == argsEntry[2]; } break; case EGAStoreArgsOperator.LessOrEqual: { del = entry[argsEntry[0]] <= argsEntry[2]; } break; case EGAStoreArgsOperator.NotEqual: { del = entry[argsEntry[0]] != argsEntry[2]; } break; default: { del = false; } break; } } else { del = false; } if (!del) { break; } } if (del) { currentStore.splice(i, 1); --i; } } }; GAStore.insert = function (store, newEntry, replace, replaceKey) { if (replace === void 0) { replace = false; } if (replaceKey === void 0) { replaceKey = null; } var currentStore = GAStore.getStore(store); if (!currentStore) { return; } if (replace) { if (!replaceKey) { return; } var replaced = false; for (var i = 0; i < currentStore.length; ++i) { var entry = currentStore[i]; if (entry[replaceKey] == newEntry[replaceKey]) { for (var s in newEntry) { entry[s] = newEntry[s]; } replaced = true; break; } } if (!replaced) { currentStore.push(newEntry); } } else { currentStore.push(newEntry); } }; GAStore.save = function (gameKey) { if (!GAStore.isStorageAvailable()) { GALogger.w("Storage is not available, cannot save."); return; } localStorage.setItem(GAStore.StringFormat(GAStore.KeyFormat, gameKey, GAStore.EventsStoreKey), JSON.stringify(GAStore.instance.eventsStore)); localStorage.setItem(GAStore.StringFormat(GAStore.KeyFormat, gameKey, GAStore.SessionsStoreKey), JSON.stringify(GAStore.instance.sessionsStore)); localStorage.setItem(GAStore.StringFormat(GAStore.KeyFormat, gameKey, GAStore.ProgressionStoreKey), JSON.stringify(GAStore.instance.progressionStore)); localStorage.setItem(GAStore.StringFormat(GAStore.KeyFormat, gameKey, GAStore.ItemsStoreKey), JSON.stringify(GAStore.instance.storeItems)); }; GAStore.load = function (gameKey) { if (!GAStore.isStorageAvailable()) { GALogger.w("Storage is not available, cannot load."); return; } try { GAStore.instance.eventsStore = JSON.parse(localStorage.getItem(GAStore.StringFormat(GAStore.KeyFormat, gameKey, GAStore.EventsStoreKey))); if (!GAStore.instance.eventsStore) { GAStore.instance.eventsStore = []; } } catch (e) { GALogger.w("Load failed for 'events' store. Using empty store."); GAStore.instance.eventsStore = []; } try { GAStore.instance.sessionsStore = JSON.parse(localStorage.getItem(GAStore.StringFormat(GAStore.KeyFormat, gameKey, GAStore.SessionsStoreKey))); if (!GAStore.instance.sessionsStore) { GAStore.instance.sessionsStore = []; } } catch (e) { GALogger.w("Load failed for 'sessions' store. Using empty store."); GAStore.instance.sessionsStore = []; } try { GAStore.instance.progressionStore = JSON.parse(localStorage.getItem(GAStore.StringFormat(GAStore.KeyFormat, gameKey, GAStore.ProgressionStoreKey))); if (!GAStore.instance.progressionStore) { GAStore.instance.progressionStore = []; } } catch (e) { GALogger.w("Load failed for 'progression' store. Using empty store."); GAStore.instance.progressionStore = []; } try { GAStore.instance.storeItems = JSON.parse(localStorage.getItem(GAStore.StringFormat(GAStore.KeyFormat, gameKey, GAStore.ItemsStoreKey))); if (!GAStore.instance.storeItems) { GAStore.instance.storeItems = {}; } } catch (e) { GALogger.w("Load failed for 'items' store. Using empty store."); GAStore.instance.progressionStore = []; } }; GAStore.setItem = function (gameKey, key, value) { var keyWithPrefix = GAStore.StringFormat(GAStore.KeyFormat, gameKey, key); if (!value) { if (keyWithPrefix in GAStore.instance.storeItems) { delete GAStore.instance.storeItems[keyWithPrefix]; } } else { GAStore.instance.storeItems[keyWithPrefix] = value; } }; GAStore.getItem = function (gameKey, key) { var keyWithPrefix = GAStore.StringFormat(GAStore.KeyFormat, gameKey, key); if (keyWithPrefix in GAStore.instance.storeItems) { return GAStore.instance.storeItems[keyWithPrefix]; } else { return null; } }; GAStore.getStore = function (store) { switch (store) { case EGAStore.Events: { return GAStore.instance.eventsStore; } case EGAStore.Sessions: { return GAStore.instance.sessionsStore; } case EGAStore.Progression: { return GAStore.instance.progressionStore; } default: { GALogger.w("GAStore.getStore(): Cannot find store: " + store); return null; } } }; GAStore.instance = new GAStore(); GAStore.MaxNumberOfEntries = 2000; GAStore.StringFormat = function (str) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } return str.replace(/{(\d+)}/g, function (_, index) { return args[index] || ''; }); }; GAStore.KeyFormat = "GA::{0}::{1}"; GAStore.EventsStoreKey = "ga_event"; GAStore.SessionsStoreKey = "ga_session"; GAStore.ProgressionStoreKey = "ga_progression"; GAStore.ItemsStoreKey = "ga_items"; return GAStore; }()); store_1.GAStore = GAStore; })(store = gameanalytics.store || (gameanalytics.store = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var state; (function (state) { var GAValidator = gameanalytics.validators.GAValidator; var GAUtilities = gameanalytics.utilities.GAUtilities; var GALogger = gameanalytics.logging.GALogger; var GAStore = gameanalytics.store.GAStore; var GADevice = gameanalytics.device.GADevice; var EGAStore = gameanalytics.store.EGAStore; var EGAStoreArgsOperator = gameanalytics.store.EGAStoreArgsOperator; var GAState = (function () { function GAState() { this.availableCustomDimensions01 = []; this.availableCustomDimensions02 = []; this.availableCustomDimensions03 = []; this.currentGlobalCustomEventFields = {}; this.availableResourceCurrencies = []; this.availableResourceItemTypes = []; this.configurations = {}; this.remoteConfigsListeners = []; this.beforeUnloadListeners = []; this.sdkConfigDefault = {}; this.sdkConfig = {}; this.progressionTries = {}; this._isEventSubmissionEnabled = true; this.isUnloading = false; } GAState.setUserId = function (userId) { GAState.instance.userId = userId; GAState.cacheIdentifier(); }; GAState.getIdentifier = function () { return GAState.instance.identifier; }; GAState.isInitialized = function () { return GAState.instance.initialized; }; GAState.setInitialized = function (value) { GAState.instance.initialized = value; }; GAState.getSessionStart = function () { return GAState.instance.sessionStart; }; GAState.getSessionNum = function () { return GAState.instance.sessionNum; }; GAState.getTransactionNum = function () { return GAState.instance.transactionNum; }; GAState.getSessionId = function () { return GAState.instance.sessionId; }; GAState.getCurrentCustomDimension01 = function () { return GAState.instance.currentCustomDimension01; }; GAState.getCurrentCustomDimension02 = function () { return GAState.instance.currentCustomDimension02; }; GAState.getCurrentCustomDimension03 = function () { return GAState.instance.currentCustomDimension03; }; GAState.getGameKey = function () { return GAState.instance.gameKey; }; GAState.getGameSecret = function () { return GAState.instance.gameSecret; }; GAState.getAvailableCustomDimensions01 = function () { return GAState.instance.availableCustomDimensions01; }; GAState.setAvailableCustomDimensions01 = function (value) { if (!GAValidator.validateCustomDimensions(value)) { return; } GAState.instance.availableCustomDimensions01 = value; GAState.validateAndFixCurrentDimensions(); GALogger.i("Set available custom01 dimension values: (" + GAUtilities.joinStringArray(value, ", ") + ")"); }; GAState.getAvailableCustomDimensions02 = function () { return GAState.instance.availableCustomDimensions02; }; GAState.setAvailableCustomDimensions02 = function (value) { if (!GAValidator.validateCustomDimensions(value)) { return; } GAState.instance.availableCustomDimensions02 = value; GAState.validateAndFixCurrentDimensions(); GALogger.i("Set available custom02 dimension values: (" + GAUtilities.joinStringArray(value, ", ") + ")"); }; GAState.getAvailableCustomDimensions03 = function () { return GAState.instance.availableCustomDimensions03; }; GAState.setAvailableCustomDimensions03 = function (value) { if (!GAValidator.validateCustomDimensions(value)) { return; } GAState.instance.availableCustomDimensions03 = value; GAState.validateAndFixCurrentDimensions(); GALogger.i("Set available custom03 dimension values: (" + GAUtilities.joinStringArray(value, ", ") + ")"); }; GAState.getAvailableResourceCurrencies = function () { return GAState.instance.availableResourceCurrencies; }; GAState.setAvailableResourceCurrencies = function (value) { if (!GAValidator.validateResourceCurrencies(value)) { return; } GAState.instance.availableResourceCurrencies = value; GALogger.i("Set available resource currencies: (" + GAUtilities.joinStringArray(value, ", ") + ")"); }; GAState.getAvailableResourceItemTypes = function () { return GAState.instance.availableResourceItemTypes; }; GAState.setAvailableResourceItemTypes = function (value) { if (!GAValidator.validateResourceItemTypes(value)) { return; } GAState.instance.availableResourceItemTypes = value; GALogger.i("Set available resource item types: (" + GAUtilities.joinStringArray(value, ", ") + ")"); }; GAState.getBuild = function () { return GAState.instance.build; }; GAState.setBuild = function (value) { GAState.instance.build = value; GALogger.i("Set build version: " + value); }; GAState.getUseManualSessionHandling = function () { return GAState.instance.useManualSessionHandling; }; GAState.isEventSubmissionEnabled = function () { return GAState.instance._isEventSubmissionEnabled; }; GAState.getABTestingId = function () { return GAState.instance.abId; }; GAState.getABTestingVariantId = function () { return GAState.instance.abVariantId; }; GAState.prototype.setDefaultId = function (value) { this.defaultUserId = !value ? "" : value; GAState.cacheIdentifier(); }; GAState.getDefaultId = function () { return GAState.instance.defaultUserId; }; GAState.getSdkConfig = function () { { var first; var count = 0; for (var json in GAState.instance.sdkConfig) { if (count === 0) { first = json; } ++count; } if (first && count > 0) { return GAState.instance.sdkConfig; } } { var first; var count = 0; for (var json in GAState.instance.sdkConfigCached) { if (count === 0) { first = json; } ++count; } if (first && count > 0) { return GAState.instance.sdkConfigCached; } } return GAState.instance.sdkConfigDefault; }; GAState.isEnabled = function () { if (!GAState.instance.initAuthorized) { return false; } else { return true; } }; GAState.setCustomDimension01 = function (dimension) { GAState.instance.currentCustomDimension01 = dimension; GAStore.setItem(GAState.getGameKey(), GAState.Dimension01Key, dimension); GALogger.i("Set custom01 dimension value: " + dimension); }; GAState.setCustomDimension02 = function (dimension) { GAState.instance.currentCustomDimension02 = dimension; GAStore.setItem(GAState.getGameKey(), GAState.Dimension02Key, dimension); GALogger.i("Set custom02 dimension value: " + dimension); }; GAState.setCustomDimension03 = function (dimension) { GAState.instance.currentCustomDimension03 = dimension; GAStore.setItem(GAState.getGameKey(), GAState.Dimension03Key, dimension); GALogger.i("Set custom03 dimension value: " + dimension); }; GAState.incrementSessionNum = function () { var sessionNumInt = GAState.getSessionNum() + 1; GAState.instance.sessionNum = sessionNumInt; }; GAState.incrementTransactionNum = function () { var transactionNumInt = GAState.getTransactionNum() + 1; GAState.instance.transactionNum = transactionNumInt; }; GAState.incrementProgressionTries = function (progression) { var tries = GAState.getProgressionTries(progression) + 1; GAState.instance.progressionTries[progression] = tries; var values = {}; values["progression"] = progression; values["tries"] = tries; GAStore.insert(EGAStore.Progression, values, true, "progression"); }; GAState.getProgressionTries = function (progression) { if (progression in GAState.instance.progressionTries) { return GAState.instance.progressionTries[progression]; } else { return 0; } }; GAState.clearProgressionTries = function (progression) { if (progression in GAState.instance.progressionTries) { delete GAState.instance.progressionTries[progression]; } var parms = []; parms.push(["progression", EGAStoreArgsOperator.Equal, progression]); GAStore["delete"](EGAStore.Progression, parms); }; GAState.setKeys = function (gameKey, gameSecret) { GAState.instance.gameKey = gameKey; GAState.instance.gameSecret = gameSecret; }; GAState.setManualSessionHandling = function (flag) { GAState.instance.useManualSessionHandling = flag; GALogger.i("Use manual session handling: " + flag); }; GAState.setEnabledEventSubmission = function (flag) { GAState.instance._isEventSubmissionEnabled = flag; }; GAState.getEventAnnotations = function () { var annotations = {}; annotations["v"] = 2; annotations["event_uuid"] = GAUtilities.createGuid(); annotations["user_id"] = GAState.instance.identifier; annotations["client_ts"] = GAState.getClientTsAdjusted(); annotations["sdk_version"] = GADevice.getRelevantSdkVersion(); annotations["os_version"] = GADevice.osVersion; annotations["manufacturer"] = GADevice.deviceManufacturer; annotations["device"] = GADevice.deviceModel; annotations["browser_version"] = GADevice.browserVersion; annotations["platform"] = GADevice.buildPlatform; annotations["session_id"] = GAState.instance.sessionId; annotations[GAState.SessionNumKey] = GAState.instance.sessionNum; var connection_type = GADevice.getConnectionType(); if (GAValidator.validateConnectionType(connection_type)) { annotations["connection_type"] = connection_type; } if (GADevice.gameEngineVersion) { annotations["engine_version"] = GADevice.gameEngineVersion; } if (GAState.instance.configurations) { var count = 0; for (var _ in GAState.instance.configurations) { count++; break; } if (count > 0) { annotations["configurations"] = GAState.instance.configurations; } } if (GAState.instance.abId) { annotations["ab_id"] = GAState.instance.abId; } if (GAState.instance.abVariantId) { annotations["ab_variant_id"] = GAState.instance.abVariantId; } if (GAState.instance.build) { annotations["build"] = GAState.instance.build; } return annotations; }; GAState.getSdkErrorEventAnnotations = function () { var annotations = {}; annotations["v"] = 2; annotations["event_uuid"] = GAUtilities.createGuid(); annotations["category"] = GAState.CategorySdkError; annotations["sdk_version"] = GADevice.getRelevantSdkVersion(); annotations["os_version"] = GADevice.osVersion; annotations["manufacturer"] = GADevice.deviceManufacturer; annotations["device"] = GADevice.deviceModel; annotations["platform"] = GADevice.buildPlatform; var connection_type = GADevice.getConnectionType(); if (GAValidator.validateConnectionType(connection_type)) { annotations["connection_type"] = connection_type; } if (GADevice.gameEngineVersion) { annotations["engine_version"] = GADevice.gameEngineVersion; } return annotations; }; GAState.getInitAnnotations = function () { var initAnnotations = {}; if (!GAState.getIdentifier()) { GAState.cacheIdentifier(); } GAStore.setItem(GAState.getGameKey(), GAState.LastUsedIdentifierKey, GAState.getIdentifier()); initAnnotations["user_id"] = GAState.getIdentifier(); initAnnotations["sdk_version"] = GADevice.getRelevantSdkVersion(); initAnnotations["os_version"] = GADevice.osVersion; initAnnotations["platform"] = GADevice.buildPlatform; if (GAState.getBuild()) { initAnnotations["build"] = GAState.getBuild(); } else { initAnnotations["build"] = null; } initAnnotations["session_num"] = GAState.getSessionNum(); initAnnotations["random_salt"] = GAState.getSessionNum(); return initAnnotations; }; GAState.getClientTsAdjusted = function () { var clientTs = GAUtilities.timeIntervalSince1970(); var clientTsAdjustedInteger = clientTs + GAState.instance.clientServerTimeOffset; if (GAValidator.validateClientTs(clientTsAdjustedInteger)) { return clientTsAdjustedInteger; } else { return clientTs; } }; GAState.sessionIsStarted = function () { return GAState.instance.sessionStart != 0; }; GAState.cacheIdentifier = function () { if (GAState.instance.userId) { GAState.instance.identifier = GAState.instance.userId; } else if (GAState.instance.defaultUserId) { GAState.instance.identifier = GAState.instance.defaultUserId; } }; GAState.ensurePersistedStates = function () { if (GAStore.isStorageAvailable()) { GAStore.load(GAState.getGameKey()); } var instance = GAState.instance; instance.setDefaultId(GAStore.getItem(GAState.getGameKey(), GAState.DefaultUserIdKey) != null ? GAStore.getItem(GAState.getGameKey(), GAState.DefaultUserIdKey) : GAUtilities.createGuid()); instance.sessionNum = GAStore.getItem(GAState.getGameKey(), GAState.SessionNumKey) != null ? Number(GAStore.getItem(GAState.getGameKey(), GAState.SessionNumKey)) : 0.0; instance.transactionNum = GAStore.getItem(GAState.getGameKey(), GAState.TransactionNumKey) != null ? Number(GAStore.getItem(GAState.getGameKey(), GAState.TransactionNumKey)) : 0.0; if (instance.currentCustomDimension01) { GAStore.setItem(GAState.getGameKey(), GAState.Dimension01Key, instance.currentCustomDimension01); } else { instance.currentCustomDimension01 = GAStore.getItem(GAState.getGameKey(), GAState.Dimension01Key) != null ? GAStore.getItem(GAState.getGameKey(), GAState.Dimension01Key) : ""; if (instance.currentCustomDimension01) { } } if (instance.currentCustomDimension02) { GAStore.setItem(GAState.getGameKey(), GAState.Dimension02Key, instance.currentCustomDimension02); } else { instance.currentCustomDimension02 = GAStore.getItem(GAState.getGameKey(), GAState.Dimension02Key) != null ? GAStore.getItem(GAState.getGameKey(), GAState.Dimension02Key) : ""; if (instance.currentCustomDimension02) { } } if (instance.currentCustomDimension03) { GAStore.setItem(GAState.getGameKey(), GAState.Dimension03Key, instance.currentCustomDimension03); } else { instance.currentCustomDimension03 = GAStore.getItem(GAState.getGameKey(), GAState.Dimension03Key) != null ? GAStore.getItem(GAState.getGameKey(), GAState.Dimension03Key) : ""; if (instance.currentCustomDimension03) { } } var sdkConfigCachedString = GAStore.getItem(GAState.getGameKey(), GAState.SdkConfigCachedKey) != null ? GAStore.getItem(GAState.getGameKey(), GAState.SdkConfigCachedKey) : ""; if (sdkConfigCachedString) { var sdkConfigCached = JSON.parse(GAUtilities.decode64(sdkConfigCachedString)); if (sdkConfigCached) { var lastUsedIdentifier = GAStore.getItem(GAState.getGameKey(), GAState.LastUsedIdentifierKey); if (lastUsedIdentifier != null && lastUsedIdentifier != GAState.getIdentifier()) { GALogger.w("New identifier spotted compared to last one used, clearing cached configs hash!!"); if (sdkConfigCached["configs_hash"]) { delete sdkConfigCached["configs_hash"]; } } instance.sdkConfigCached = sdkConfigCached; } } { var currentSdkConfig = GAState.getSdkConfig(); instance.configsHash = currentSdkConfig["configs_hash"] ? currentSdkConfig["configs_hash"] : ""; instance.abId = currentSdkConfig["ab_id"] ? currentSdkConfig["ab_id"] : ""; instance.abVariantId = currentSdkConfig["ab_variant_id"] ? currentSdkConfig["ab_variant_id"] : ""; } var results_ga_progression = GAStore.select(EGAStore.Progression); if (results_ga_progression) { for (var i = 0; i < results_ga_progression.length; ++i) { var result = results_ga_progression[i]; if (result) { instance.progressionTries[result["progression"]] = result["tries"]; } } } }; GAState.calculateServerTimeOffset = function (serverTs) { var clientTs = GAUtilities.timeIntervalSince1970(); return serverTs - clientTs; }; GAState.formatString = function (s, args) { var formatted = s; for (var i = 0; i < args.length; i++) { var regexp = new RegExp('\\{' + i + '\\}', 'gi'); formatted = formatted.replace(regexp, arguments[i]); } return formatted; }; GAState.validateAndCleanCustomFields = function (fields, errorCallback) { if (errorCallback === void 0) { errorCallback = null; } var result = {}; if (fields) { var count = 0; for (var key in fields) { var value = fields[key]; if (!key || !value) { var baseMessage = "validateAndCleanCustomFields: entry with key={0}, value={1} has been omitted because its key or value is null"; var message = GAState.formatString(baseMessage, [key, value]); GALogger.w(message); if (errorCallback) { errorCallback(baseMessage, message); } } else if (count < GAState.MAX_CUSTOM_FIELDS_COUNT) { var regex = new RegExp("^[a-zA-Z0-9_]{1," + GAState.MAX_CUSTOM_FIELDS_KEY_LENGTH + "}$"); if (GAUtilities.stringMatch(key, regex)) { var type = typeof value; if (type === "string" || value instanceof String) { var valueAsString = value; if (valueAsString.length <= GAState.MAX_CUSTOM_FIELDS_VALUE_STRING_LENGTH && valueAsString.length > 0) { result[key] = valueAsString; ++count; } else { var baseMessage = "validateAndCleanCustomFields: entry with key={0}, value={1} has been omitted because its value is an empty string or exceeds the max number of characters (" + GAState.MAX_CUSTOM_FIELDS_VALUE_STRING_LENGTH + ")"; var message = GAState.formatString(baseMessage, [key, value]); GALogger.w(message); if (errorCallback) { errorCallback(baseMessage, message); } } } else if (type === "number" || value instanceof Number) { var valueAsNumber = value; result[key] = valueAsNumber; ++count; } else { var baseMessage = "validateAndCleanCustomFields: entry with key={0}, value={1} has been omitted because its value is not a string or number"; var message = GAState.formatString(baseMessage, [key, value]); GALogger.w(message); if (errorCallback) { errorCallback(baseMessage, message); } } } else { var baseMessage = "validateAndCleanCustomFields: entry with key={0}, value={1} has been omitted because its key contains illegal character, is empty or exceeds the max number of characters (" + GAState.MAX_CUSTOM_FIELDS_KEY_LENGTH + ")"; var message = GAState.formatString(baseMessage, [key, value]); GALogger.w(message); if (errorCallback) { errorCallback(baseMessage, message); } } } else { var baseMessage = "validateAndCleanCustomFields: entry with key={0}, value={1} has been omitted because it exceeds the max number of custom fields (" + GAState.MAX_CUSTOM_FIELDS_COUNT + ")"; var message = GAState.formatString(baseMessage, [key, value]); GALogger.w(message); if (errorCallback) { errorCallback(baseMessage, message); } } } } return result; }; GAState.validateAndFixCurrentDimensions = function () { if (!GAValidator.validateDimension01(GAState.getCurrentCustomDimension01(), GAState.getAvailableCustomDimensions01())) { GAState.setCustomDimension01(""); } if (!GAValidator.validateDimension02(GAState.getCurrentCustomDimension02(), GAState.getAvailableCustomDimensions02())) { GAState.setCustomDimension02(""); } if (!GAValidator.validateDimension03(GAState.getCurrentCustomDimension03(), GAState.getAvailableCustomDimensions03())) { GAState.setCustomDimension03(""); } }; GAState.getConfigurationStringValue = function (key, defaultValue) { if (GAState.instance.configurations[key]) { return GAState.instance.configurations[key].toString(); } else { return defaultValue; } }; GAState.isRemoteConfigsReady = function () { return GAState.instance.remoteConfigsIsReady; }; GAState.addRemoteConfigsListener = function (listener) { if (GAState.instance.remoteConfigsListeners.indexOf(listener) < 0) { GAState.instance.remoteConfigsListeners.push(listener); } }; GAState.removeRemoteConfigsListener = function (listener) { var index = GAState.instance.remoteConfigsListeners.indexOf(listener); if (index > -1) { GAState.instance.remoteConfigsListeners.splice(index, 1); } }; GAState.getRemoteConfigsContentAsString = function () { return JSON.stringify(GAState.instance.configurations); }; GAState.populateConfigurations = function (sdkConfig) { var configurations = sdkConfig["configs"]; if (configurations) { GAState.instance.configurations = {}; for (var i = 0; i < configurations.length; ++i) { var configuration = configurations[i]; if (configuration) { var key = configuration["key"]; var value = configuration["value"]; var start_ts = configuration["start_ts"] ? configuration["start_ts"] : Number.MIN_VALUE; var end_ts = configuration["end_ts"] ? configuration["end_ts"] : Number.MAX_VALUE; var client_ts_adjusted = GAState.getClientTsAdjusted(); if (key && value && client_ts_adjusted > start_ts && client_ts_adjusted < end_ts) { GAState.instance.configurations[key] = value; } } } } GAState.instance.remoteConfigsIsReady = true; var listeners = GAState.instance.remoteConfigsListeners; for (var i = 0; i < listeners.length; ++i) { if (listeners[i]) { listeners[i].onRemoteConfigsUpdated(); } } }; GAState.addOnBeforeUnloadListener = function (listener) { if (GAState.instance.beforeUnloadListeners.indexOf(listener) < 0) { GAState.instance.beforeUnloadListeners.push(listener); } }; GAState.removeOnBeforeUnloadListener = function (listener) { var index = GAState.instance.beforeUnloadListeners.indexOf(listener); if (index > -1) { GAState.instance.beforeUnloadListeners.splice(index, 1); } }; GAState.notifyBeforeUnloadListeners = function () { var listeners = GAState.instance.beforeUnloadListeners; for (var i = 0; i < listeners.length; ++i) { if (listeners[i]) { listeners[i].onBeforeUnload(); } } }; GAState.CategorySdkError = "sdk_error"; GAState.MAX_CUSTOM_FIELDS_COUNT = 50; GAState.MAX_CUSTOM_FIELDS_KEY_LENGTH = 64; GAState.MAX_CUSTOM_FIELDS_VALUE_STRING_LENGTH = 256; GAState.instance = new GAState(); GAState.DefaultUserIdKey = "default_user_id"; GAState.SessionNumKey = "session_num"; GAState.TransactionNumKey = "transaction_num"; GAState.Dimension01Key = "dimension01"; GAState.Dimension02Key = "dimension02"; GAState.Dimension03Key = "dimension03"; GAState.SdkConfigCachedKey = "sdk_config_cached"; GAState.LastUsedIdentifierKey = "last_used_identifier"; return GAState; }()); state.GAState = GAState; })(state = gameanalytics.state || (gameanalytics.state = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var tasks; (function (tasks) { var GAUtilities = gameanalytics.utilities.GAUtilities; var GALogger = gameanalytics.logging.GALogger; var SdkErrorTask = (function () { function SdkErrorTask() { } SdkErrorTask.execute = function (url, type, payloadData, secretKey) { var now = new Date(); if (!SdkErrorTask.timestampMap[type]) { SdkErrorTask.timestampMap[type] = now; } if (!SdkErrorTask.countMap[type]) { SdkErrorTask.countMap[type] = 0; } var diff = now.getTime() - SdkErrorTask.timestampMap[type].getTime(); var diffSeconds = diff / 1000; if (diffSeconds >= 3600) { SdkErrorTask.timestampMap[type] = now; SdkErrorTask.countMap[type] = 0; } if (SdkErrorTask.countMap[type] >= SdkErrorTask.MaxCount) { return; } var hashHmac = GAUtilities.getHmac(secretKey, payloadData); var request = new XMLHttpRequest(); request.onreadystatechange = function () { if (request.readyState === 4) { if (!request.responseText) { return; } if (request.status != 200) { GALogger.w("sdk error failed. response code not 200. status code: " + request.status + ", description: " + request.statusText + ", body: " + request.responseText); return; } else { SdkErrorTask.countMap[type] = SdkErrorTask.countMap[type] + 1; } } }; request.open("POST", url, true); request.setRequestHeader("Content-Type", "application/json"); request.setRequestHeader("Authorization", hashHmac); try { request.send(payloadData); } catch (e) { console.error(e); } }; SdkErrorTask.MaxCount = 10; SdkErrorTask.countMap = {}; SdkErrorTask.timestampMap = {}; return SdkErrorTask; }()); tasks.SdkErrorTask = SdkErrorTask; })(tasks = gameanalytics.tasks || (gameanalytics.tasks = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var http; (function (http) { var GAState = gameanalytics.state.GAState; var GALogger = gameanalytics.logging.GALogger; var GAUtilities = gameanalytics.utilities.GAUtilities; var GAValidator = gameanalytics.validators.GAValidator; var SdkErrorTask = gameanalytics.tasks.SdkErrorTask; var EGASdkErrorCategory = gameanalytics.events.EGASdkErrorCategory; var EGASdkErrorArea = gameanalytics.events.EGASdkErrorArea; var EGASdkErrorAction = gameanalytics.events.EGASdkErrorAction; var EGASdkErrorParameter = gameanalytics.events.EGASdkErrorParameter; var GAHTTPApi = (function () { function GAHTTPApi() { this.protocol = "https"; this.hostName = "api.gameanalytics.com"; this.version = "v2"; this.remoteConfigsVersion = "v1"; this.baseUrl = this.protocol + "://" + this.hostName + "/" + this.version; this.remoteConfigsBaseUrl = this.protocol + "://" + this.hostName + "/remote_configs/" + this.remoteConfigsVersion; this.initializeUrlPath = "init"; this.eventsUrlPath = "events"; this.useGzip = false; } GAHTTPApi.prototype.requestInit = function (configsHash, callback) { var gameKey = GAState.getGameKey(); var url = this.remoteConfigsBaseUrl + "/" + this.initializeUrlPath + "?game_key=" + gameKey + "&interval_seconds=0&configs_hash=" + configsHash; var initAnnotations = GAState.getInitAnnotations(); var JSONstring = JSON.stringify(initAnnotations); if (!JSONstring) { callback(http.EGAHTTPApiResponse.JsonEncodeFailed, null); return; } var payloadData = this.createPayloadData(JSONstring, this.useGzip); var extraArgs = []; extraArgs.push(JSONstring); GAHTTPApi.sendRequest(url, payloadData, extraArgs, this.useGzip, GAHTTPApi.initRequestCallback, callback); }; GAHTTPApi.prototype.sendEventsInArray = function (eventArray, requestId, callback) { if (eventArray.length == 0) { return; } var gameKey = GAState.getGameKey(); var url = this.baseUrl + "/" + gameKey + "/" + this.eventsUrlPath; var JSONstring = JSON.stringify(eventArray); if (!JSONstring) { callback(http.EGAHTTPApiResponse.JsonEncodeFailed, null, requestId, eventArray.length); return; } var payloadData = this.createPayloadData(JSONstring, this.useGzip); var extraArgs = []; extraArgs.push(JSONstring); extraArgs.push(requestId); extraArgs.push(eventArray.length.toString()); GAHTTPApi.sendRequest(url, payloadData, extraArgs, this.useGzip, GAHTTPApi.sendEventInArrayRequestCallback, callback); }; GAHTTPApi.prototype.sendSdkErrorEvent = function (category, area, action, parameter, reason, gameKey, secretKey) { if (!GAState.isEventSubmissionEnabled()) { return; } if (!GAValidator.validateSdkErrorEvent(gameKey, secretKey, category, area, action)) { return; } var url = this.baseUrl + "/" + gameKey + "/" + this.eventsUrlPath; var payloadJSONString = ""; var errorType = ""; var json = GAState.getSdkErrorEventAnnotations(); var categoryString = GAHTTPApi.sdkErrorCategoryString(category); json["error_category"] = categoryString; errorType += categoryString; var areaString = GAHTTPApi.sdkErrorAreaString(area); json["error_area"] = areaString; errorType += ":" + areaString; var actionString = GAHTTPApi.sdkErrorActionString(action); json["error_action"] = actionString; var parameterString = GAHTTPApi.sdkErrorParameterString(parameter); if (parameterString.length > 0) { json["error_parameter"] = parameterString; } if (reason.length > 0) { var reasonTrimmed = reason; if (reason.length > GAHTTPApi.MAX_ERROR_MESSAGE_LENGTH) { var reasonTrimmed = reason.substring(0, GAHTTPApi.MAX_ERROR_MESSAGE_LENGTH); } json["reason"] = reasonTrimmed; } var eventArray = []; eventArray.push(json); payloadJSONString = JSON.stringify(eventArray); if (!payloadJSONString) { GALogger.w("sendSdkErrorEvent: JSON encoding failed."); return; } SdkErrorTask.execute(url, errorType, payloadJSONString, secretKey); }; GAHTTPApi.sendEventInArrayRequestCallback = function (request, url, callback, extra) { if (extra === void 0) { extra = null; } var authorization = extra[0]; var JSONstring = extra[1]; var requestId = extra[2]; var eventCount = parseInt(extra[3]); var body = ""; var responseCode = 0; body = request.responseText; responseCode = request.status; var requestResponseEnum = GAHTTPApi.instance.processRequestResponse(responseCode, request.statusText, body, "Events"); if (requestResponseEnum != http.EGAHTTPApiResponse.Ok && requestResponseEnum != http.EGAHTTPApiResponse.Created && requestResponseEnum != http.EGAHTTPApiResponse.BadRequest) { callback(requestResponseEnum, null, requestId, eventCount); return; } var requestJsonDict = body ? JSON.parse(body) : {}; if (requestJsonDict == null) { callback(http.EGAHTTPApiResponse.JsonDecodeFailed, null, requestId, eventCount); GAHTTPApi.instance.sendSdkErrorEvent(EGASdkErrorCategory.Http, EGASdkErrorArea.EventsHttp, EGASdkErrorAction.FailHttpJsonDecode, EGASdkErrorParameter.Undefined, body, GAState.getGameKey(), GAState.getGameSecret()); return; } if (requestResponseEnum == http.EGAHTTPApiResponse.BadRequest) { } callback(requestResponseEnum, requestJsonDict, requestId, eventCount); }; GAHTTPApi.sendRequest = function (url, payloadData, extraArgs, gzip, callback, callback2) { var request = new XMLHttpRequest(); var key = GAState.getGameSecret(); var authorization = GAUtilities.getHmac(key, payloadData); var args = []; args.push(authorization); for (var s in extraArgs) { args.push(extraArgs[s]); } request.onreadystatechange = function () { if (request.readyState === 4) { callback(request, url, callback2, args); } }; request.open("POST", url, true); request.setRequestHeader("Content-Type", "application/json"); request.setRequestHeader("Authorization", authorization); if (gzip) { throw new Error("gzip not supported"); } try { request.send(payloadData); } catch (e) { console.error(e.stack); } }; GAHTTPApi.initRequestCallback = function (request, url, callback, extra) { if (extra === void 0) { extra = null; } var authorization = extra[0]; var JSONstring = extra[1]; var body = ""; var responseCode = 0; body = request.responseText; responseCode = request.status; var requestJsonDict = body ? JSON.parse(body) : {}; var requestResponseEnum = GAHTTPApi.instance.processRequestResponse(responseCode, request.statusText, body, "Init"); if (requestResponseEnum != http.EGAHTTPApiResponse.Ok && requestResponseEnum != http.EGAHTTPApiResponse.Created && requestResponseEnum != http.EGAHTTPApiResponse.BadRequest) { callback(requestResponseEnum, null, "", 0); return; } if (requestJsonDict == null) { callback(http.EGAHTTPApiResponse.JsonDecodeFailed, null, "", 0); GAHTTPApi.instance.sendSdkErrorEvent(EGASdkErrorCategory.Http, EGASdkErrorArea.InitHttp, EGASdkErrorAction.FailHttpJsonDecode, EGASdkErrorParameter.Undefined, body, GAState.getGameKey(), GAState.getGameSecret()); return; } if (requestResponseEnum === http.EGAHTTPApiResponse.BadRequest) { callback(requestResponseEnum, null, "", 0); return; } var validatedInitValues = GAValidator.validateAndCleanInitRequestResponse(requestJsonDict, requestResponseEnum === http.EGAHTTPApiResponse.Created); if (!validatedInitValues) { callback(http.EGAHTTPApiResponse.BadResponse, null, "", 0); return; } callback(requestResponseEnum, validatedInitValues, "", 0); }; GAHTTPApi.prototype.createPayloadData = function (payload, gzip) { var payloadData; if (gzip) { throw new Error("gzip not supported"); } else { payloadData = payload; } return payloadData; }; GAHTTPApi.prototype.processRequestResponse = function (responseCode, responseMessage, body, requestId) { if (!body) { return http.EGAHTTPApiResponse.NoResponse; } if (responseCode === 200) { return http.EGAHTTPApiResponse.Ok; } if (responseCode === 201) { return http.EGAHTTPApiResponse.Created; } if (responseCode === 0 || responseCode === 401) { return http.EGAHTTPApiResponse.Unauthorized; } if (responseCode === 400) { return http.EGAHTTPApiResponse.BadRequest; } if (responseCode === 500) { return http.EGAHTTPApiResponse.InternalServerError; } return http.EGAHTTPApiResponse.UnknownResponseCode; }; GAHTTPApi.sdkErrorCategoryString = function (value) { switch (value) { case EGASdkErrorCategory.EventValidation: return "event_validation"; case EGASdkErrorCategory.Database: return "db"; case EGASdkErrorCategory.Init: return "init"; case EGASdkErrorCategory.Http: return "http"; case EGASdkErrorCategory.Json: return "json"; default: break; } return ""; }; GAHTTPApi.sdkErrorAreaString = function (value) { switch (value) { case EGASdkErrorArea.BusinessEvent: return "business"; case EGASdkErrorArea.ResourceEvent: return "resource"; case EGASdkErrorArea.ProgressionEvent: return "progression"; case EGASdkErrorArea.DesignEvent: return "design"; case EGASdkErrorArea.ErrorEvent: return "error"; case EGASdkErrorArea.InitHttp: return "init_http"; case EGASdkErrorArea.EventsHttp: return "events_http"; case EGASdkErrorArea.ProcessEvents: return "process_events"; case EGASdkErrorArea.AddEventsToStore: return "add_events_to_store"; default: break; } return ""; }; GAHTTPApi.sdkErrorActionString = function (value) { switch (value) { case EGASdkErrorAction.InvalidCurrency: return "invalid_currency"; case EGASdkErrorAction.InvalidShortString: return "invalid_short_string"; case EGASdkErrorAction.InvalidEventPartLength: return "invalid_event_part_length"; case EGASdkErrorAction.InvalidEventPartCharacters: return "invalid_event_part_characters"; case EGASdkErrorAction.InvalidStore: return "invalid_store"; case EGASdkErrorAction.InvalidFlowType: return "invalid_flow_type"; case EGASdkErrorAction.StringEmptyOrNull: return "string_empty_or_null"; case EGASdkErrorAction.NotFoundInAvailableCurrencies: return "not_found_in_available_currencies"; case EGASdkErrorAction.InvalidAmount: return "invalid_amount"; case EGASdkErrorAction.NotFoundInAvailableItemTypes: return "not_found_in_available_item_types"; case EGASdkErrorAction.WrongProgressionOrder: return "wrong_progression_order"; case EGASdkErrorAction.InvalidEventIdLength: return "invalid_event_id_length"; case EGASdkErrorAction.InvalidEventIdCharacters: return "invalid_event_id_characters"; case EGASdkErrorAction.InvalidProgressionStatus: return "invalid_progression_status"; case EGASdkErrorAction.InvalidSeverity: return "invalid_severity"; case EGASdkErrorAction.InvalidLongString: return "invalid_long_string"; case EGASdkErrorAction.DatabaseTooLarge: return "db_too_large"; case EGASdkErrorAction.DatabaseOpenOrCreate: return "db_open_or_create"; case EGASdkErrorAction.JsonError: return "json_error"; case EGASdkErrorAction.FailHttpJsonDecode: return "fail_http_json_decode"; case EGASdkErrorAction.FailHttpJsonEncode: return "fail_http_json_encode"; default: break; } return ""; }; GAHTTPApi.sdkErrorParameterString = function (value) { switch (value) { case EGASdkErrorParameter.Currency: return "currency"; case EGASdkErrorParameter.CartType: return "cart_type"; case EGASdkErrorParameter.ItemType: return "item_type"; case EGASdkErrorParameter.ItemId: return "item_id"; case EGASdkErrorParameter.Store: return "store"; case EGASdkErrorParameter.FlowType: return "flow_type"; case EGASdkErrorParameter.Amount: return "amount"; case EGASdkErrorParameter.Progression01: return "progression01"; case EGASdkErrorParameter.Progression02: return "progression02"; case EGASdkErrorParameter.Progression03: return "progression03"; case EGASdkErrorParameter.EventId: return "event_id"; case EGASdkErrorParameter.ProgressionStatus: return "progression_status"; case EGASdkErrorParameter.Severity: return "severity"; case EGASdkErrorParameter.Message: return "message"; default: break; } return ""; }; GAHTTPApi.instance = new GAHTTPApi(); GAHTTPApi.MAX_ERROR_MESSAGE_LENGTH = 256; return GAHTTPApi; }()); http.GAHTTPApi = GAHTTPApi; })(http = gameanalytics.http || (gameanalytics.http = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var events; (function (events_1) { var GAStore = gameanalytics.store.GAStore; var EGAStore = gameanalytics.store.EGAStore; var EGAStoreArgsOperator = gameanalytics.store.EGAStoreArgsOperator; var GAState = gameanalytics.state.GAState; var GALogger = gameanalytics.logging.GALogger; var GAUtilities = gameanalytics.utilities.GAUtilities; var EGAHTTPApiResponse = gameanalytics.http.EGAHTTPApiResponse; var GAHTTPApi = gameanalytics.http.GAHTTPApi; var GAValidator = gameanalytics.validators.GAValidator; var GAEvents = (function () { function GAEvents() { } GAEvents.customEventFieldsErrorCallback = function (baseMessage, message) { if (!GAState.isEventSubmissionEnabled()) { return; } var now = new Date(); if (!GAEvents.timestampMap[baseMessage]) { GAEvents.timestampMap[baseMessage] = now; } if (!GAEvents.countMap[baseMessage]) { GAEvents.countMap[baseMessage] = 0; } var diff = now.getTime() - GAEvents.timestampMap[baseMessage].getTime(); var diffSeconds = diff / 1000; if (diffSeconds >= 3600) { GAEvents.timestampMap[baseMessage] = now; GAEvents.countMap[baseMessage] = 0; } if (GAEvents.countMap[baseMessage] >= GAEvents.MAX_ERROR_COUNT) { return; } gameanalytics.threading.GAThreading.performTaskOnGAThread(function () { GAEvents.addErrorEvent(gameanalytics.EGAErrorSeverity.Warning, message, null, true); GAEvents.countMap[baseMessage] = GAEvents.countMap[baseMessage] + 1; }); }; GAEvents.addSessionStartEvent = function () { if (!GAState.isEventSubmissionEnabled()) { return; } var eventDict = {}; eventDict["category"] = GAEvents.CategorySessionStart; GAState.incrementSessionNum(); GAStore.setItem(GAState.getGameKey(), GAState.SessionNumKey, GAState.getSessionNum().toString()); GAEvents.addDimensionsToEvent(eventDict); var fieldsToUse = GAState.instance.currentGlobalCustomEventFields; GAEvents.addCustomFieldsToEvent(eventDict, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); GAEvents.addEventToStore(eventDict); GALogger.i("Add SESSION START event"); GAEvents.processEvents(GAEvents.CategorySessionStart, false); }; GAEvents.addSessionEndEvent = function () { if (!GAState.isEventSubmissionEnabled()) { return; } var session_start_ts = GAState.getSessionStart(); var client_ts_adjusted = GAState.getClientTsAdjusted(); var sessionLength = client_ts_adjusted - session_start_ts; if (sessionLength < 0) { GALogger.w("Session length was calculated to be less then 0. Should not be possible. Resetting to 0."); sessionLength = 0; } var eventDict = {}; eventDict["category"] = GAEvents.CategorySessionEnd; eventDict["length"] = sessionLength; GAEvents.addDimensionsToEvent(eventDict); var fieldsToUse = GAState.instance.currentGlobalCustomEventFields; GAEvents.addCustomFieldsToEvent(eventDict, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); GAEvents.addEventToStore(eventDict); GALogger.i("Add SESSION END event."); GAEvents.processEvents("", false); }; GAEvents.addBusinessEvent = function (currency, amount, itemType, itemId, cartType, fields, mergeFields) { if (cartType === void 0) { cartType = null; } if (!GAState.isEventSubmissionEnabled()) { return; } var validationResult = GAValidator.validateBusinessEvent(currency, amount, cartType, itemType, itemId); if (validationResult != null) { GAHTTPApi.instance.sendSdkErrorEvent(validationResult.category, validationResult.area, validationResult.action, validationResult.parameter, validationResult.reason, GAState.getGameKey(), GAState.getGameSecret()); return; } var eventDict = {}; GAState.incrementTransactionNum(); GAStore.setItem(GAState.getGameKey(), GAState.TransactionNumKey, GAState.getTransactionNum().toString()); eventDict["event_id"] = itemType + ":" + itemId; eventDict["category"] = GAEvents.CategoryBusiness; eventDict["currency"] = currency; eventDict["amount"] = amount; eventDict[GAState.TransactionNumKey] = GAState.getTransactionNum(); if (cartType) { eventDict["cart_type"] = cartType; } GAEvents.addDimensionsToEvent(eventDict); var fieldsToUse = {}; if (fields && Object.keys(fields).length > 0) { for (var key in fields) { fieldsToUse[key] = fields[key]; } } else { for (var key in GAState.instance.currentGlobalCustomEventFields) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } if (mergeFields && fields && Object.keys(fields).length > 0) { for (var key in GAState.instance.currentGlobalCustomEventFields) { if (!fieldsToUse[key]) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } } GAEvents.addCustomFieldsToEvent(eventDict, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); GALogger.i("Add BUSINESS event: {currency:" + currency + ", amount:" + amount + ", itemType:" + itemType + ", itemId:" + itemId + ", cartType:" + cartType + "}"); GAEvents.addEventToStore(eventDict); }; GAEvents.addResourceEvent = function (flowType, currency, amount, itemType, itemId, fields, mergeFields) { if (!GAState.isEventSubmissionEnabled()) { return; } var validationResult = GAValidator.validateResourceEvent(flowType, currency, amount, itemType, itemId, GAState.getAvailableResourceCurrencies(), GAState.getAvailableResourceItemTypes()); if (validationResult != null) { GAHTTPApi.instance.sendSdkErrorEvent(validationResult.category, validationResult.area, validationResult.action, validationResult.parameter, validationResult.reason, GAState.getGameKey(), GAState.getGameSecret()); return; } if (flowType === gameanalytics.EGAResourceFlowType.Sink) { amount *= -1; } var eventDict = {}; var flowTypeString = GAEvents.resourceFlowTypeToString(flowType); eventDict["event_id"] = flowTypeString + ":" + currency + ":" + itemType + ":" + itemId; eventDict["category"] = GAEvents.CategoryResource; eventDict["amount"] = amount; GAEvents.addDimensionsToEvent(eventDict); var fieldsToUse = {}; if (fields && Object.keys(fields).length > 0) { for (var key in fields) { fieldsToUse[key] = fields[key]; } } else { for (var key in GAState.instance.currentGlobalCustomEventFields) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } if (mergeFields && fields && Object.keys(fields).length > 0) { for (var key in GAState.instance.currentGlobalCustomEventFields) { if (!fieldsToUse[key]) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } } GAEvents.addCustomFieldsToEvent(eventDict, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); GALogger.i("Add RESOURCE event: {currency:" + currency + ", amount:" + amount + ", itemType:" + itemType + ", itemId:" + itemId + "}"); GAEvents.addEventToStore(eventDict); }; GAEvents.addProgressionEvent = function (progressionStatus, progression01, progression02, progression03, score, sendScore, fields, mergeFields) { if (!GAState.isEventSubmissionEnabled()) { return; } var progressionStatusString = GAEvents.progressionStatusToString(progressionStatus); var validationResult = GAValidator.validateProgressionEvent(progressionStatus, progression01, progression02, progression03); if (validationResult != null) { GAHTTPApi.instance.sendSdkErrorEvent(validationResult.category, validationResult.area, validationResult.action, validationResult.parameter, validationResult.reason, GAState.getGameKey(), GAState.getGameSecret()); return; } var eventDict = {}; var progressionIdentifier; if (!progression02) { progressionIdentifier = progression01; } else if (!progression03) { progressionIdentifier = progression01 + ":" + progression02; } else { progressionIdentifier = progression01 + ":" + progression02 + ":" + progression03; } eventDict["category"] = GAEvents.CategoryProgression; eventDict["event_id"] = progressionStatusString + ":" + progressionIdentifier; var attempt_num = 0; if (sendScore && progressionStatus != gameanalytics.EGAProgressionStatus.Start) { eventDict["score"] = Math.round(score); } if (progressionStatus === gameanalytics.EGAProgressionStatus.Fail) { GAState.incrementProgressionTries(progressionIdentifier); } if (progressionStatus === gameanalytics.EGAProgressionStatus.Complete) { GAState.incrementProgressionTries(progressionIdentifier); attempt_num = GAState.getProgressionTries(progressionIdentifier); eventDict["attempt_num"] = attempt_num; GAState.clearProgressionTries(progressionIdentifier); } GAEvents.addDimensionsToEvent(eventDict); var fieldsToUse = {}; if (fields && Object.keys(fields).length > 0) { for (var key in fields) { fieldsToUse[key] = fields[key]; } } else { for (var key in GAState.instance.currentGlobalCustomEventFields) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } if (mergeFields && fields && Object.keys(fields).length > 0) { for (var key in GAState.instance.currentGlobalCustomEventFields) { if (!fieldsToUse[key]) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } } GAEvents.addCustomFieldsToEvent(eventDict, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); GALogger.i("Add PROGRESSION event: {status:" + progressionStatusString + ", progression01:" + progression01 + ", progression02:" + progression02 + ", progression03:" + progression03 + ", score:" + score + ", attempt:" + attempt_num + "}"); GAEvents.addEventToStore(eventDict); }; GAEvents.addDesignEvent = function (eventId, value, sendValue, fields, mergeFields) { if (!GAState.isEventSubmissionEnabled()) { return; } var validationResult = GAValidator.validateDesignEvent(eventId); if (validationResult != null) { GAHTTPApi.instance.sendSdkErrorEvent(validationResult.category, validationResult.area, validationResult.action, validationResult.parameter, validationResult.reason, GAState.getGameKey(), GAState.getGameSecret()); return; } var eventData = {}; eventData["category"] = GAEvents.CategoryDesign; eventData["event_id"] = eventId; if (sendValue) { eventData["value"] = value; } GAEvents.addDimensionsToEvent(eventData); var fieldsToUse = {}; if (fields && Object.keys(fields).length > 0) { for (var key in fields) { fieldsToUse[key] = fields[key]; } } else { for (var key in GAState.instance.currentGlobalCustomEventFields) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } if (mergeFields && fields && Object.keys(fields).length > 0) { for (var key in GAState.instance.currentGlobalCustomEventFields) { if (!fieldsToUse[key]) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } } GAEvents.addCustomFieldsToEvent(eventData, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); GALogger.i("Add DESIGN event: {eventId:" + eventId + ", value:" + value + "}"); GAEvents.addEventToStore(eventData); }; GAEvents.addErrorEvent = function (severity, message, fields, mergeFields, skipAddingFields) { if (skipAddingFields === void 0) { skipAddingFields = false; } if (!GAState.isEventSubmissionEnabled()) { return; } var severityString = GAEvents.errorSeverityToString(severity); var validationResult = GAValidator.validateErrorEvent(severity, message); if (validationResult != null) { GAHTTPApi.instance.sendSdkErrorEvent(validationResult.category, validationResult.area, validationResult.action, validationResult.parameter, validationResult.reason, GAState.getGameKey(), GAState.getGameSecret()); return; } var eventData = {}; eventData["category"] = GAEvents.CategoryError; eventData["severity"] = severityString; eventData["message"] = message; GAEvents.addDimensionsToEvent(eventData); if (!skipAddingFields) { var fieldsToUse = {}; if (fields && Object.keys(fields).length > 0) { for (var key in fields) { fieldsToUse[key] = fields[key]; } } else { for (var key in GAState.instance.currentGlobalCustomEventFields) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } if (mergeFields && fields && Object.keys(fields).length > 0) { for (var key in GAState.instance.currentGlobalCustomEventFields) { if (!fieldsToUse[key]) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } } GAEvents.addCustomFieldsToEvent(eventData, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); } GALogger.i("Add ERROR event: {severity:" + severityString + ", message:" + message + "}"); GAEvents.addEventToStore(eventData); }; GAEvents.addAdEvent = function (adAction, adType, adSdkName, adPlacement, noAdReason, duration, sendDuration, fields, mergeFields) { if (!GAState.isEventSubmissionEnabled()) { return; } var adActionString = GAEvents.adActionToString(adAction); var adTypeString = GAEvents.adTypeToString(adType); var noAdReasonString = GAEvents.adErrorToString(noAdReason); var validationResult = GAValidator.validateAdEvent(adAction, adType, adSdkName, adPlacement); if (validationResult != null) { GAHTTPApi.instance.sendSdkErrorEvent(validationResult.category, validationResult.area, validationResult.action, validationResult.parameter, validationResult.reason, GAState.getGameKey(), GAState.getGameSecret()); return; } var eventData = {}; eventData["category"] = GAEvents.CategoryAds; eventData["ad_sdk_name"] = adSdkName; eventData["ad_placement"] = adPlacement; eventData["ad_type"] = adTypeString; eventData["ad_action"] = adActionString; if (adAction == gameanalytics.EGAAdAction.FailedShow && noAdReasonString.length > 0) { eventData["ad_fail_show_reason"] = noAdReasonString; } if (sendDuration && (adType == gameanalytics.EGAAdType.RewardedVideo || adType == gameanalytics.EGAAdType.Video)) { eventData["ad_duration"] = duration; } GAEvents.addDimensionsToEvent(eventData); var fieldsToUse = {}; if (fields && Object.keys(fields).length > 0) { for (var key in fields) { fieldsToUse[key] = fields[key]; } } else { for (var key in GAState.instance.currentGlobalCustomEventFields) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } if (mergeFields && fields && Object.keys(fields).length > 0) { for (var key in GAState.instance.currentGlobalCustomEventFields) { if (!fieldsToUse[key]) { fieldsToUse[key] = GAState.instance.currentGlobalCustomEventFields[key]; } } } GAEvents.addCustomFieldsToEvent(eventData, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); GALogger.i("Add AD event: {ad_sdk_name:" + adSdkName + ", ad_placement:" + adPlacement + ", ad_type:" + adTypeString + ", ad_action:" + adActionString + ((adAction == gameanalytics.EGAAdAction.FailedShow && noAdReasonString.length > 0) ? (", ad_fail_show_reason:" + noAdReasonString) : "") + ((sendDuration && (adType == gameanalytics.EGAAdType.RewardedVideo || adType == gameanalytics.EGAAdType.Video)) ? (", ad_duration:" + duration) : "") + "}"); GAEvents.addEventToStore(eventData); }; GAEvents.processEvents = function (category, performCleanUp) { if (!GAState.isEventSubmissionEnabled()) { return; } try { var requestIdentifier = GAUtilities.createGuid(); if (performCleanUp) { GAEvents.cleanupEvents(); GAEvents.fixMissingSessionEndEvents(); } var selectArgs = []; selectArgs.push(["status", EGAStoreArgsOperator.Equal, "new"]); var updateWhereArgs = []; updateWhereArgs.push(["status", EGAStoreArgsOperator.Equal, "new"]); if (category) { selectArgs.push(["category", EGAStoreArgsOperator.Equal, category]); updateWhereArgs.push(["category", EGAStoreArgsOperator.Equal, category]); } var updateSetArgs = []; updateSetArgs.push(["status", requestIdentifier]); var events = GAStore.select(EGAStore.Events, selectArgs); if (!events || events.length == 0) { GALogger.i("Event queue: No events to send"); GAEvents.updateSessionStore(); return; } if (events.length > GAEvents.MaxEventCount) { events = GAStore.select(EGAStore.Events, selectArgs, true, GAEvents.MaxEventCount); if (!events) { return; } var lastItem = events[events.length - 1]; var lastTimestamp = lastItem["client_ts"]; selectArgs.push(["client_ts", EGAStoreArgsOperator.LessOrEqual, lastTimestamp]); events = GAStore.select(EGAStore.Events, selectArgs); if (!events) { return; } updateWhereArgs.push(["client_ts", EGAStoreArgsOperator.LessOrEqual, lastTimestamp]); } GALogger.i("Event queue: Sending " + events.length + " events."); if (!GAStore.update(EGAStore.Events, updateSetArgs, updateWhereArgs)) { return; } var payloadArray = []; for (var i = 0; i < events.length; ++i) { var ev = events[i]; var eventDict = JSON.parse(GAUtilities.decode64(ev["event"])); if (eventDict.length != 0) { var clientTs = eventDict["client_ts"]; if (clientTs && !GAValidator.validateClientTs(clientTs)) { delete eventDict["client_ts"]; } payloadArray.push(eventDict); } } GAHTTPApi.instance.sendEventsInArray(payloadArray, requestIdentifier, GAEvents.processEventsCallback); } catch (e) { GALogger.e("Error during ProcessEvents(): " + e.stack); GAHTTPApi.instance.sendSdkErrorEvent(events_1.EGASdkErrorCategory.Json, events_1.EGASdkErrorArea.ProcessEvents, events_1.EGASdkErrorAction.JsonError, events_1.EGASdkErrorParameter.Undefined, e.stack, GAState.getGameKey(), GAState.getGameSecret()); } }; GAEvents.processEventsCallback = function (responseEnum, dataDict, requestId, eventCount) { var requestIdWhereArgs = []; requestIdWhereArgs.push(["status", EGAStoreArgsOperator.Equal, requestId]); if (responseEnum === EGAHTTPApiResponse.Ok) { GAStore["delete"](EGAStore.Events, requestIdWhereArgs); GALogger.i("Event queue: " + eventCount + " events sent."); } else { if (responseEnum === EGAHTTPApiResponse.NoResponse) { var setArgs = []; setArgs.push(["status", "new"]); GALogger.w("Event queue: Failed to send events to collector - Retrying next time"); GAStore.update(EGAStore.Events, setArgs, requestIdWhereArgs); } else { if (dataDict) { var json; var count = 0; for (var j in dataDict) { if (count == 0) { json = dataDict[j]; } ++count; } if (responseEnum === EGAHTTPApiResponse.BadRequest && json.constructor === Array) { GALogger.w("Event queue: " + eventCount + " events sent. " + count + " events failed GA server validation."); } else { GALogger.w("Event queue: Failed to send events."); } } else { GALogger.w("Event queue: Failed to send events."); } GAStore["delete"](EGAStore.Events, requestIdWhereArgs); } } }; GAEvents.cleanupEvents = function () { GAStore.update(EGAStore.Events, [["status", "new"]]); }; GAEvents.fixMissingSessionEndEvents = function () { if (!GAState.isEventSubmissionEnabled()) { return; } var args = []; args.push(["session_id", EGAStoreArgsOperator.NotEqual, GAState.getSessionId()]); var sessions = GAStore.select(EGAStore.Sessions, args); if (!sessions || sessions.length == 0) { return; } GALogger.i(sessions.length + " session(s) located with missing session_end event."); for (var i = 0; i < sessions.length; ++i) { var sessionEndEvent = JSON.parse(GAUtilities.decode64(sessions[i]["event"])); var event_ts = sessionEndEvent["client_ts"]; var start_ts = sessions[i]["timestamp"]; var length = event_ts - start_ts; length = Math.max(0, length); sessionEndEvent["category"] = GAEvents.CategorySessionEnd; sessionEndEvent["length"] = length; GAEvents.addEventToStore(sessionEndEvent); } }; GAEvents.addEventToStore = function (eventData) { if (!GAState.isEventSubmissionEnabled()) { return; } if (!GAState.isInitialized()) { GALogger.w("Could not add event: SDK is not initialized"); return; } try { if (GAStore.isStoreTooLargeForEvents() && !GAUtilities.stringMatch(eventData["category"], /^(user|session_end|business)$/)) { GALogger.w("Database too large. Event has been blocked."); GAHTTPApi.instance.sendSdkErrorEvent(events_1.EGASdkErrorCategory.Database, events_1.EGASdkErrorArea.AddEventsToStore, events_1.EGASdkErrorAction.DatabaseTooLarge, events_1.EGASdkErrorParameter.Undefined, "", GAState.getGameKey(), GAState.getGameSecret()); return; } var ev = GAState.getEventAnnotations(); for (var e in eventData) { ev[e] = eventData[e]; } var json = JSON.stringify(ev); GALogger.ii("Event added to queue: " + json); var values = {}; values["status"] = "new"; values["category"] = ev["category"]; values["session_id"] = ev["session_id"]; values["client_ts"] = ev["client_ts"]; values["event"] = GAUtilities.encode64(JSON.stringify(ev)); GAStore.insert(EGAStore.Events, values); if (eventData["category"] == GAEvents.CategorySessionEnd) { GAStore["delete"](EGAStore.Sessions, [["session_id", EGAStoreArgsOperator.Equal, ev["session_id"]]]); } else { GAEvents.updateSessionStore(); } if (GAStore.isStorageAvailable()) { GAStore.save(GAState.getGameKey()); } } catch (e) { GALogger.e("addEventToStore: error"); GALogger.e(e.stack); GAHTTPApi.instance.sendSdkErrorEvent(events_1.EGASdkErrorCategory.Database, events_1.EGASdkErrorArea.AddEventsToStore, events_1.EGASdkErrorAction.DatabaseTooLarge, events_1.EGASdkErrorParameter.Undefined, e.stack, GAState.getGameKey(), GAState.getGameSecret()); } }; GAEvents.updateSessionStore = function () { if (GAState.sessionIsStarted()) { var values = {}; values["session_id"] = GAState.instance.sessionId; values["timestamp"] = GAState.getSessionStart(); var ev = GAState.getEventAnnotations(); GAEvents.addDimensionsToEvent(ev); var fieldsToUse = GAState.instance.currentGlobalCustomEventFields; GAEvents.addCustomFieldsToEvent(ev, GAState.validateAndCleanCustomFields(fieldsToUse, GAEvents.customEventFieldsErrorCallback)); values["event"] = GAUtilities.encode64(JSON.stringify(ev)); GAStore.insert(EGAStore.Sessions, values, true, "session_id"); if (GAStore.isStorageAvailable()) { GAStore.save(GAState.getGameKey()); } } }; GAEvents.addDimensionsToEvent = function (eventData) { if (!eventData) { return; } if (GAState.getCurrentCustomDimension01()) { eventData["custom_01"] = GAState.getCurrentCustomDimension01(); } if (GAState.getCurrentCustomDimension02()) { eventData["custom_02"] = GAState.getCurrentCustomDimension02(); } if (GAState.getCurrentCustomDimension03()) { eventData["custom_03"] = GAState.getCurrentCustomDimension03(); } }; GAEvents.addCustomFieldsToEvent = function (eventData, fields) { if (!eventData) { return; } if (fields && Object.keys(fields).length > 0) { eventData["custom_fields"] = fields; } }; GAEvents.resourceFlowTypeToString = function (value) { if (value == gameanalytics.EGAResourceFlowType.Source || value == gameanalytics.EGAResourceFlowType[gameanalytics.EGAResourceFlowType.Source]) { return "Source"; } else if (value == gameanalytics.EGAResourceFlowType.Sink || value == gameanalytics.EGAResourceFlowType[gameanalytics.EGAResourceFlowType.Sink]) { return "Sink"; } else { return ""; } }; GAEvents.progressionStatusToString = function (value) { if (value == gameanalytics.EGAProgressionStatus.Start || value == gameanalytics.EGAProgressionStatus[gameanalytics.EGAProgressionStatus.Start]) { return "Start"; } else if (value == gameanalytics.EGAProgressionStatus.Complete || value == gameanalytics.EGAProgressionStatus[gameanalytics.EGAProgressionStatus.Complete]) { return "Complete"; } else if (value == gameanalytics.EGAProgressionStatus.Fail || value == gameanalytics.EGAProgressionStatus[gameanalytics.EGAProgressionStatus.Fail]) { return "Fail"; } else { return ""; } }; GAEvents.errorSeverityToString = function (value) { if (value == gameanalytics.EGAErrorSeverity.Debug || value == gameanalytics.EGAErrorSeverity[gameanalytics.EGAErrorSeverity.Debug]) { return "debug"; } else if (value == gameanalytics.EGAErrorSeverity.Info || value == gameanalytics.EGAErrorSeverity[gameanalytics.EGAErrorSeverity.Info]) { return "info"; } else if (value == gameanalytics.EGAErrorSeverity.Warning || value == gameanalytics.EGAErrorSeverity[gameanalytics.EGAErrorSeverity.Warning]) { return "warning"; } else if (value == gameanalytics.EGAErrorSeverity.Error || value == gameanalytics.EGAErrorSeverity[gameanalytics.EGAErrorSeverity.Error]) { return "error"; } else if (value == gameanalytics.EGAErrorSeverity.Critical || value == gameanalytics.EGAErrorSeverity[gameanalytics.EGAErrorSeverity.Critical]) { return "critical"; } else { return ""; } }; GAEvents.adActionToString = function (value) { if (value == gameanalytics.EGAAdAction.Clicked || value == gameanalytics.EGAAdAction[gameanalytics.EGAAdAction.Clicked]) { return "clicked"; } else if (value == gameanalytics.EGAAdAction.Show || value == gameanalytics.EGAAdAction[gameanalytics.EGAAdAction.Show]) { return "show"; } else if (value == gameanalytics.EGAAdAction.FailedShow || value == gameanalytics.EGAAdAction[gameanalytics.EGAAdAction.FailedShow]) { return "failed_show"; } else if (value == gameanalytics.EGAAdAction.RewardReceived || value == gameanalytics.EGAAdAction[gameanalytics.EGAAdAction.RewardReceived]) { return "reward_received"; } else { return ""; } }; GAEvents.adErrorToString = function (value) { if (value == gameanalytics.EGAAdError.Unknown || value == gameanalytics.EGAAdError[gameanalytics.EGAAdError.Unknown]) { return "unknown"; } else if (value == gameanalytics.EGAAdError.Offline || value == gameanalytics.EGAAdError[gameanalytics.EGAAdError.Offline]) { return "offline"; } else if (value == gameanalytics.EGAAdError.NoFill || value == gameanalytics.EGAAdError[gameanalytics.EGAAdError.NoFill]) { return "no_fill"; } else if (value == gameanalytics.EGAAdError.InternalError || value == gameanalytics.EGAAdError[gameanalytics.EGAAdError.InternalError]) { return "internal_error"; } else if (value == gameanalytics.EGAAdError.InvalidRequest || value == gameanalytics.EGAAdError[gameanalytics.EGAAdError.InvalidRequest]) { return "invalid_request"; } else if (value == gameanalytics.EGAAdError.UnableToPrecache || value == gameanalytics.EGAAdError[gameanalytics.EGAAdError.UnableToPrecache]) { return "unable_to_precache"; } else { return ""; } }; GAEvents.adTypeToString = function (value) { if (value == gameanalytics.EGAAdType.Video || value == gameanalytics.EGAAdType[gameanalytics.EGAAdType.Video]) { return "video"; } else if (value == gameanalytics.EGAAdType.RewardedVideo || value == gameanalytics.EGAAdError[gameanalytics.EGAAdType.RewardedVideo]) { return "rewarded_video"; } else if (value == gameanalytics.EGAAdType.Playable || value == gameanalytics.EGAAdError[gameanalytics.EGAAdType.Playable]) { return "playable"; } else if (value == gameanalytics.EGAAdType.Interstitial || value == gameanalytics.EGAAdError[gameanalytics.EGAAdType.Interstitial]) { return "interstitial"; } else if (value == gameanalytics.EGAAdType.OfferWall || value == gameanalytics.EGAAdError[gameanalytics.EGAAdType.OfferWall]) { return "offer_wall"; } else if (value == gameanalytics.EGAAdType.Banner || value == gameanalytics.EGAAdError[gameanalytics.EGAAdType.Banner]) { return "banner"; } else { return ""; } }; GAEvents.CategorySessionStart = "user"; GAEvents.CategorySessionEnd = "session_end"; GAEvents.CategoryDesign = "design"; GAEvents.CategoryBusiness = "business"; GAEvents.CategoryProgression = "progression"; GAEvents.CategoryResource = "resource"; GAEvents.CategoryError = "error"; GAEvents.CategoryAds = "ads"; GAEvents.MaxEventCount = 500; GAEvents.MAX_ERROR_COUNT = 10; GAEvents.countMap = {}; GAEvents.timestampMap = {}; return GAEvents; }()); events_1.GAEvents = GAEvents; })(events = gameanalytics.events || (gameanalytics.events = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var threading; (function (threading) { var GALogger = gameanalytics.logging.GALogger; var GAState = gameanalytics.state.GAState; var GAEvents = gameanalytics.events.GAEvents; var GAThreading = (function () { function GAThreading() { this.blocks = new threading.PriorityQueue({ compare: function (x, y) { return x - y; } }); this.id2TimedBlockMap = {}; GAThreading.startThread(); } GAThreading.createTimedBlock = function (delayInSeconds) { if (delayInSeconds === void 0) { delayInSeconds = 0; } var time = new Date(); time.setSeconds(time.getSeconds() + delayInSeconds); var timedBlock = new threading.TimedBlock(time); return timedBlock; }; GAThreading.performTaskOnGAThread = function (taskBlock, delayInSeconds) { if (delayInSeconds === void 0) { delayInSeconds = 0; } var time = new Date(); time.setSeconds(time.getSeconds() + delayInSeconds); var timedBlock = new threading.TimedBlock(time); timedBlock.block = taskBlock; GAThreading.instance.id2TimedBlockMap[timedBlock.id] = timedBlock; GAThreading.instance.addTimedBlock(timedBlock); }; GAThreading.performTimedBlockOnGAThread = function (timedBlock) { GAThreading.instance.id2TimedBlockMap[timedBlock.id] = timedBlock; GAThreading.instance.addTimedBlock(timedBlock); }; GAThreading.scheduleTimer = function (interval, callback) { var time = new Date(); time.setSeconds(time.getSeconds() + interval); var timedBlock = new threading.TimedBlock(time); timedBlock.block = callback; GAThreading.instance.id2TimedBlockMap[timedBlock.id] = timedBlock; GAThreading.instance.addTimedBlock(timedBlock); return timedBlock.id; }; GAThreading.getTimedBlockById = function (blockIdentifier) { if (blockIdentifier in GAThreading.instance.id2TimedBlockMap) { return GAThreading.instance.id2TimedBlockMap[blockIdentifier]; } else { return null; } }; GAThreading.ensureEventQueueIsRunning = function () { GAThreading.instance.keepRunning = true; if (!GAThreading.instance.isRunning) { GAThreading.instance.isRunning = true; GAThreading.scheduleTimer(GAThreading.ProcessEventsIntervalInSeconds, GAThreading.processEventQueue); } }; GAThreading.endSessionAndStopQueue = function () { if (GAState.isInitialized()) { GALogger.i("Ending session."); GAThreading.stopEventQueue(); if (GAState.isEnabled() && GAState.sessionIsStarted()) { GAEvents.addSessionEndEvent(); GAState.instance.sessionStart = 0; } } }; GAThreading.stopEventQueue = function () { GAThreading.instance.keepRunning = false; }; GAThreading.ignoreTimer = function (blockIdentifier) { if (blockIdentifier in GAThreading.instance.id2TimedBlockMap) { GAThreading.instance.id2TimedBlockMap[blockIdentifier].ignore = true; } }; GAThreading.setEventProcessInterval = function (interval) { if (interval > 0) { GAThreading.ProcessEventsIntervalInSeconds = interval; } }; GAThreading.prototype.addTimedBlock = function (timedBlock) { this.blocks.enqueue(timedBlock.deadline.getTime(), timedBlock); }; GAThreading.run = function () { clearTimeout(GAThreading.runTimeoutId); try { var timedBlock; while ((timedBlock = GAThreading.getNextBlock())) { if (!timedBlock.ignore) { if (timedBlock.async) { if (!timedBlock.running) { timedBlock.running = true; timedBlock.block(); break; } } else { timedBlock.block(); } } } GAThreading.runTimeoutId = setTimeout(GAThreading.run, GAThreading.ThreadWaitTimeInMs); return; } catch (e) { GALogger.e("Error on GA thread"); GALogger.e(e.stack); } }; GAThreading.startThread = function () { GAThreading.runTimeoutId = setTimeout(GAThreading.run, 0); }; GAThreading.getNextBlock = function () { var now = new Date(); if (GAThreading.instance.blocks.hasItems() && GAThreading.instance.blocks.peek().deadline.getTime() <= now.getTime()) { if (GAThreading.instance.blocks.peek().async) { if (GAThreading.instance.blocks.peek().running) { return GAThreading.instance.blocks.peek(); } else { return GAThreading.instance.blocks.dequeue(); } } else { return GAThreading.instance.blocks.dequeue(); } } return null; }; GAThreading.processEventQueue = function () { GAEvents.processEvents("", true); if (GAThreading.instance.keepRunning) { GAThreading.scheduleTimer(GAThreading.ProcessEventsIntervalInSeconds, GAThreading.processEventQueue); } else { GAThreading.instance.isRunning = false; } }; GAThreading.instance = new GAThreading(); GAThreading.ThreadWaitTimeInMs = 1000; GAThreading.ProcessEventsIntervalInSeconds = 8.0; return GAThreading; }()); threading.GAThreading = GAThreading; })(threading = gameanalytics.threading || (gameanalytics.threading = {})); })(gameanalytics || (gameanalytics = {})); var gameanalytics; (function (gameanalytics) { var GAThreading = gameanalytics.threading.GAThreading; var GALogger = gameanalytics.logging.GALogger; var GAStore = gameanalytics.store.GAStore; var GAState = gameanalytics.state.GAState; var GAHTTPApi = gameanalytics.http.GAHTTPApi; var GADevice = gameanalytics.device.GADevice; var GAValidator = gameanalytics.validators.GAValidator; var EGAHTTPApiResponse = gameanalytics.http.EGAHTTPApiResponse; var GAUtilities = gameanalytics.utilities.GAUtilities; var GAEvents = gameanalytics.events.GAEvents; var GameAnalytics = (function () { function GameAnalytics() { } GameAnalytics.getGlobalObject = function () { if (typeof globalThis !== 'undefined') { return globalThis; } if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return undefined; }; GameAnalytics.init = function () { GADevice.touch(); GameAnalytics.methodMap['configureAvailableCustomDimensions01'] = GameAnalytics.configureAvailableCustomDimensions01; GameAnalytics.methodMap['configureAvailableCustomDimensions02'] = GameAnalytics.configureAvailableCustomDimensions02; GameAnalytics.methodMap['configureAvailableCustomDimensions03'] = GameAnalytics.configureAvailableCustomDimensions03; GameAnalytics.methodMap['configureAvailableResourceCurrencies'] = GameAnalytics.configureAvailableResourceCurrencies; GameAnalytics.methodMap['configureAvailableResourceItemTypes'] = GameAnalytics.configureAvailableResourceItemTypes; GameAnalytics.methodMap['configureBuild'] = GameAnalytics.configureBuild; GameAnalytics.methodMap['configureSdkGameEngineVersion'] = GameAnalytics.configureSdkGameEngineVersion; GameAnalytics.methodMap['configureGameEngineVersion'] = GameAnalytics.configureGameEngineVersion; GameAnalytics.methodMap['configureUserId'] = GameAnalytics.configureUserId; GameAnalytics.methodMap['initialize'] = GameAnalytics.initialize; GameAnalytics.methodMap['addBusinessEvent'] = GameAnalytics.addBusinessEvent; GameAnalytics.methodMap['addResourceEvent'] = GameAnalytics.addResourceEvent; GameAnalytics.methodMap['addProgressionEvent'] = GameAnalytics.addProgressionEvent; GameAnalytics.methodMap['addDesignEvent'] = GameAnalytics.addDesignEvent; GameAnalytics.methodMap['addErrorEvent'] = GameAnalytics.addErrorEvent; GameAnalytics.methodMap['addAdEvent'] = GameAnalytics.addAdEvent; GameAnalytics.methodMap['setEnabledInfoLog'] = GameAnalytics.setEnabledInfoLog; GameAnalytics.methodMap['setEnabledVerboseLog'] = GameAnalytics.setEnabledVerboseLog; GameAnalytics.methodMap['setEnabledManualSessionHandling'] = GameAnalytics.setEnabledManualSessionHandling; GameAnalytics.methodMap['setEnabledEventSubmission'] = GameAnalytics.setEnabledEventSubmission; GameAnalytics.methodMap['setCustomDimension01'] = GameAnalytics.setCustomDimension01; GameAnalytics.methodMap['setCustomDimension02'] = GameAnalytics.setCustomDimension02; GameAnalytics.methodMap['setCustomDimension03'] = GameAnalytics.setCustomDimension03; GameAnalytics.methodMap['setGlobalCustomEventFields'] = GameAnalytics.setGlobalCustomEventFields; GameAnalytics.methodMap['setEventProcessInterval'] = GameAnalytics.setEventProcessInterval; GameAnalytics.methodMap['startSession'] = GameAnalytics.startSession; GameAnalytics.methodMap['endSession'] = GameAnalytics.endSession; GameAnalytics.methodMap['onStop'] = GameAnalytics.onStop; GameAnalytics.methodMap['onResume'] = GameAnalytics.onResume; GameAnalytics.methodMap['addRemoteConfigsListener'] = GameAnalytics.addRemoteConfigsListener; GameAnalytics.methodMap['removeRemoteConfigsListener'] = GameAnalytics.removeRemoteConfigsListener; GameAnalytics.methodMap['getRemoteConfigsValueAsString'] = GameAnalytics.getRemoteConfigsValueAsString; GameAnalytics.methodMap['isRemoteConfigsReady'] = GameAnalytics.isRemoteConfigsReady; GameAnalytics.methodMap['getRemoteConfigsContentAsString'] = GameAnalytics.getRemoteConfigsContentAsString; GameAnalytics.methodMap['addOnBeforeUnloadListener'] = GameAnalytics.addOnBeforeUnloadListener; GameAnalytics.methodMap['removeOnBeforeUnloadListener'] = GameAnalytics.removeOnBeforeUnloadListener; if (typeof GameAnalytics.getGlobalObject() !== 'undefined' && typeof GameAnalytics.getGlobalObject()['GameAnalytics'] !== 'undefined' && typeof GameAnalytics.getGlobalObject()['GameAnalytics']['q'] !== 'undefined') { var q = GameAnalytics.getGlobalObject()['GameAnalytics']['q']; for (var i in q) { GameAnalytics.gaCommand.apply(null, q[i]); } } window.addEventListener("beforeunload", function (e) { console.log('addEventListener unload'); GAState.instance.isUnloading = true; GAState.notifyBeforeUnloadListeners(); GAThreading.endSessionAndStopQueue(); GAState.instance.isUnloading = false; }); }; GameAnalytics.gaCommand = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (args.length > 0) { if (args[0] in gameanalytics.GameAnalytics.methodMap) { if (args.length > 1) { gameanalytics.GameAnalytics.methodMap[args[0]].apply(null, Array.prototype.slice.call(args, 1)); } else { gameanalytics.GameAnalytics.methodMap[args[0]](); } } } }; GameAnalytics.configureAvailableCustomDimensions01 = function (customDimensions) { if (customDimensions === void 0) { customDimensions = []; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { GALogger.w("Available custom dimensions must be set before SDK is initialized"); return; } GAState.setAvailableCustomDimensions01(customDimensions); }); }; GameAnalytics.configureAvailableCustomDimensions02 = function (customDimensions) { if (customDimensions === void 0) { customDimensions = []; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { GALogger.w("Available custom dimensions must be set before SDK is initialized"); return; } GAState.setAvailableCustomDimensions02(customDimensions); }); }; GameAnalytics.configureAvailableCustomDimensions03 = function (customDimensions) { if (customDimensions === void 0) { customDimensions = []; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { GALogger.w("Available custom dimensions must be set before SDK is initialized"); return; } GAState.setAvailableCustomDimensions03(customDimensions); }); }; GameAnalytics.configureAvailableResourceCurrencies = function (resourceCurrencies) { if (resourceCurrencies === void 0) { resourceCurrencies = []; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { GALogger.w("Available resource currencies must be set before SDK is initialized"); return; } GAState.setAvailableResourceCurrencies(resourceCurrencies); }); }; GameAnalytics.configureAvailableResourceItemTypes = function (resourceItemTypes) { if (resourceItemTypes === void 0) { resourceItemTypes = []; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { GALogger.w("Available resource item types must be set before SDK is initialized"); return; } GAState.setAvailableResourceItemTypes(resourceItemTypes); }); }; GameAnalytics.configureBuild = function (build) { if (build === void 0) { build = ""; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { GALogger.w("Build version must be set before SDK is initialized."); return; } if (!GAValidator.validateBuild(build)) { GALogger.i("Validation fail - configure build: Cannot be null, empty or above 32 length. String: " + build); return; } GAState.setBuild(build); }); }; GameAnalytics.configureSdkGameEngineVersion = function (sdkGameEngineVersion) { if (sdkGameEngineVersion === void 0) { sdkGameEngineVersion = ""; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { return; } if (!GAValidator.validateSdkWrapperVersion(sdkGameEngineVersion)) { GALogger.i("Validation fail - configure sdk version: Sdk version not supported. String: " + sdkGameEngineVersion); return; } GADevice.sdkGameEngineVersion = sdkGameEngineVersion; }); }; GameAnalytics.configureGameEngineVersion = function (gameEngineVersion) { if (gameEngineVersion === void 0) { gameEngineVersion = ""; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { return; } if (!GAValidator.validateEngineVersion(gameEngineVersion)) { GALogger.i("Validation fail - configure game engine version: Game engine version not supported. String: " + gameEngineVersion); return; } GADevice.gameEngineVersion = gameEngineVersion; }); }; GameAnalytics.configureUserId = function (uId) { if (uId === void 0) { uId = ""; } GAThreading.performTaskOnGAThread(function () { if (GameAnalytics.isSdkReady(true, false)) { GALogger.w("A custom user id must be set before SDK is initialized."); return; } if (!GAValidator.validateUserId(uId)) { GALogger.i("Validation fail - configure user_id: Cannot be null, empty or above 64 length. Will use default user_id method. Used string: " + uId); return; } GAState.setUserId(uId); }); }; GameAnalytics.initialize = function (gameKey, gameSecret) { if (gameKey === void 0) { gameKey = ""; } if (gameSecret === void 0) { gameSecret = ""; } GADevice.updateConnectionType(); var timedBlock = GAThreading.createTimedBlock(); timedBlock.async = true; GameAnalytics.initTimedBlockId = timedBlock.id; timedBlock.block = function () { if (GameAnalytics.isSdkReady(true, false)) { GALogger.w("SDK already initialized. Can only be called once."); return; } if (!GAValidator.validateKeys(gameKey, gameSecret)) { GALogger.w("SDK failed initialize. Game key or secret key is invalid. Can only contain characters A-z 0-9, gameKey is 32 length, gameSecret is 40 length. Failed keys - gameKey: " + gameKey + ", secretKey: " + gameSecret); return; } GAState.setKeys(gameKey, gameSecret); GameAnalytics.internalInitialize(); }; GAThreading.performTimedBlockOnGAThread(timedBlock); }; GameAnalytics.addBusinessEvent = function (currency, amount, itemType, itemId, cartType, customFields, mergeFields) { if (currency === void 0) { currency = ""; } if (amount === void 0) { amount = 0; } if (itemType === void 0) { itemType = ""; } if (itemId === void 0) { itemId = ""; } if (cartType === void 0) { cartType = ""; } if (customFields === void 0) { customFields = {}; } if (mergeFields === void 0) { mergeFields = false; } GADevice.updateConnectionType(); if (!GAState.instance.isUnloading) { GAThreading.performTaskOnGAThread(function () { if (!GameAnalytics.isSdkReady(true, true, "Could not add business event")) { return; } GAEvents.addBusinessEvent(currency, amount, itemType, itemId, cartType, customFields, mergeFields); }); } else { if (!GameAnalytics.isSdkReady(true, true, "Could not add business event")) { return; } GAEvents.addBusinessEvent(currency, amount, itemType, itemId, cartType, customFields, mergeFields); } }; GameAnalytics.addResourceEvent = function (flowType, currency, amount, itemType, itemId, customFields, mergeFields) { if (flowType === void 0) { flowType = gameanalytics.EGAResourceFlowType.Undefined; } if (currency === void 0) { currency = ""; } if (amount === void 0) { amount = 0; } if (itemType === void 0) { itemType = ""; } if (itemId === void 0) { itemId = ""; } if (customFields === void 0) { customFields = {}; } if (mergeFields === void 0) { mergeFields = false; } GADevice.updateConnectionType(); if (!GAState.instance.isUnloading) { GAThreading.performTaskOnGAThread(function () { if (!GameAnalytics.isSdkReady(true, true, "Could not add resource event")) { return; } GAEvents.addResourceEvent(flowType, currency, amount, itemType, itemId, customFields, mergeFields); }); } else { if (!GameAnalytics.isSdkReady(true, true, "Could not add resource event")) { return; } GAEvents.addResourceEvent(flowType, currency, amount, itemType, itemId, customFields, mergeFields); } }; GameAnalytics.addProgressionEvent = function (progressionStatus, progression01, progression02, progression03, score, customFields, mergeFields) { if (progressionStatus === void 0) { progressionStatus = gameanalytics.EGAProgressionStatus.Undefined; } if (progression01 === void 0) { progression01 = ""; } if (progression02 === void 0) { progression02 = ""; } if (progression03 === void 0) { progression03 = ""; } if (customFields === void 0) { customFields = {}; } if (mergeFields === void 0) { mergeFields = false; } GADevice.updateConnectionType(); if (!GAState.instance.isUnloading) { GAThreading.performTaskOnGAThread(function () { if (!GameAnalytics.isSdkReady(true, true, "Could not add progression event")) { return; } var sendScore = typeof score === "number"; GAEvents.addProgressionEvent(progressionStatus, progression01, progression02, progression03, sendScore ? score : 0, sendScore, customFields, mergeFields); }); } else { if (!GameAnalytics.isSdkReady(true, true, "Could not add progression event")) { return; } var sendScore = typeof score === "number"; GAEvents.addProgressionEvent(progressionStatus, progression01, progression02, progression03, sendScore ? score : 0, sendScore, customFields, mergeFields); } }; GameAnalytics.addDesignEvent = function (eventId, value, customFields, mergeFields) { if (customFields === void 0) { customFields = {}; } if (mergeFields === void 0) { mergeFields = false; } GADevice.updateConnectionType(); if (!GAState.instance.isUnloading) { GAThreading.performTaskOnGAThread(function () { if (!GameAnalytics.isSdkReady(true, true, "Could not add design event")) { return; } var sendValue = typeof value === "number"; GAEvents.addDesignEvent(eventId, sendValue ? value : 0, sendValue, customFields, mergeFields); }); } else { if (!GameAnalytics.isSdkReady(true, true, "Could not add design event")) { return; } var sendValue = typeof value === "number"; GAEvents.addDesignEvent(eventId, sendValue ? value : 0, sendValue, customFields, mergeFields); } }; GameAnalytics.addErrorEvent = function (severity, message, customFields, mergeFields) { if (severity === void 0) { severity = gameanalytics.EGAErrorSeverity.Undefined; } if (message === void 0) { message = ""; } if (customFields === void 0) { customFields = {}; } if (mergeFields === void 0) { mergeFields = false; } GADevice.updateConnectionType(); if (!GAState.instance.isUnloading) { GAThreading.performTaskOnGAThread(function () { if (!GameAnalytics.isSdkReady(true, true, "Could not add error event")) { return; } GAEvents.addErrorEvent(severity, message, customFields, mergeFields); }); } else { if (!GameAnalytics.isSdkReady(true, true, "Could not add error event")) { return; } GAEvents.addErrorEvent(severity, message, customFields, mergeFields); } }; GameAnalytics.addAdEventWithNoAdReason = function (adAction, adType, adSdkName, adPlacement, noAdReason, customFields, mergeFields) { if (adAction === void 0) { adAction = gameanalytics.EGAAdAction.Undefined; } if (adType === void 0) { adType = gameanalytics.EGAAdType.Undefined; } if (adSdkName === void 0) { adSdkName = ""; } if (adPlacement === void 0) { adPlacement = ""; } if (noAdReason === void 0) { noAdReason = gameanalytics.EGAAdError.Undefined; } if (customFields === void 0) { customFields = {}; } if (mergeFields === void 0) { mergeFields = false; } GADevice.updateConnectionType(); if (!GAState.instance.isUnloading) { GAThreading.performTaskOnGAThread(function () { if (!GameAnalytics.isSdkReady(true, true, "Could not add ad event")) { return; } GAEvents.addAdEvent(adAction, adType, adSdkName, adPlacement, noAdReason, 0, false, customFields, mergeFields); }); } else { if (!GameAnalytics.isSdkReady(true, true, "Could not add ad event")) { return; } GAEvents.addAdEvent(adAction, adType, adSdkName, adPlacement, noAdReason, 0, false, customFields, mergeFields); } }; GameAnalytics.addAdEventWithDuration = function (adAction, adType, adSdkName, adPlacement, duration, customFields, mergeFields) { if (adAction === void 0) { adAction = gameanalytics.EGAAdAction.Undefined; } if (adType === void 0) { adType = gameanalytics.EGAAdType.Undefined; } if (adSdkName === void 0) { adSdkName = ""; } if (adPlacement === void 0) { adPlacement = ""; } if (duration === void 0) { duration = 0; } if (customFields === void 0) { customFields = {}; } if (mergeFields === void 0) { mergeFields = false; } GADevice.updateConnectionType(); if (!GAState.instance.isUnloading) { GAThreading.performTaskOnGAThread(function () { if (!GameAnalytics.isSdkReady(true, true, "Could not add ad event")) { return; } GAEvents.addAdEvent(adAction, adType, adSdkName, adPlacement, gameanalytics.EGAAdError.Undefined, duration, true, customFields, mergeFields); }); } else { if (!GameAnalytics.isSdkReady(true, true, "Could not add ad event")) { return; } GAEvents.addAdEvent(adAction, adType, adSdkName, adPlacement, gameanalytics.EGAAdError.Undefined, duration, true, customFields, mergeFields); } }; GameAnalytics.addAdEvent = function (adAction, adType, adSdkName, adPlacement, customFields, mergeFields) { if (adAction === void 0) { adAction = gameanalytics.EGAAdAction.Undefined; } if (adType === void 0) { adType = gameanalytics.EGAAdType.Undefined; } if (adSdkName === void 0) { adSdkName = ""; } if (adPlacement === void 0) { adPlacement = ""; } if (customFields === void 0) { customFields = {}; } if (mergeFields === void 0) { mergeFields = false; } GADevice.updateConnectionType(); if (!GAState.instance.isUnloading) { GAThreading.performTaskOnGAThread(function () { if (!GameAnalytics.isSdkReady(true, true, "Could not add ad event")) { return; } GAEvents.addAdEvent(adAction, adType, adSdkName, adPlacement, gameanalytics.EGAAdError.Undefined, 0, false, customFields, mergeFields); }); } else { if (!GameAnalytics.isSdkReady(true, true, "Could not add ad event")) { return; } GAEvents.addAdEvent(adAction, adType, adSdkName, adPlacement, gameanalytics.EGAAdError.Undefined, 0, false, customFields, mergeFields); } }; GameAnalytics.setEnabledInfoLog = function (flag) { if (flag === void 0) { flag = false; } GAThreading.performTaskOnGAThread(function () { if (flag) { GALogger.setInfoLog(flag); GALogger.i("Info logging enabled"); } else { GALogger.i("Info logging disabled"); GALogger.setInfoLog(flag); } }); }; GameAnalytics.setEnabledVerboseLog = function (flag) { if (flag === void 0) { flag = false; } GAThreading.performTaskOnGAThread(function () { if (flag) { GALogger.setVerboseLog(flag); GALogger.i("Verbose logging enabled"); } else { GALogger.i("Verbose logging disabled"); GALogger.setVerboseLog(flag); } }); }; GameAnalytics.setEnabledManualSessionHandling = function (flag) { if (flag === void 0) { flag = false; } GAThreading.performTaskOnGAThread(function () { GAState.setManualSessionHandling(flag); }); }; GameAnalytics.setEnabledEventSubmission = function (flag) { if (flag === void 0) { flag = false; } GAThreading.performTaskOnGAThread(function () { if (flag) { GAState.setEnabledEventSubmission(flag); GALogger.i("Event submission enabled"); } else { GALogger.i("Event submission disabled"); GAState.setEnabledEventSubmission(flag); } }); }; GameAnalytics.setCustomDimension01 = function (dimension) { if (dimension === void 0) { dimension = ""; } GAThreading.performTaskOnGAThread(function () { if (!GAValidator.validateDimension01(dimension, GAState.getAvailableCustomDimensions01())) { GALogger.w("Could not set custom01 dimension value to '" + dimension + "'. Value not found in available custom01 dimension values"); return; } GAState.setCustomDimension01(dimension); }); }; GameAnalytics.setCustomDimension02 = function (dimension) { if (dimension === void 0) { dimension = ""; } GAThreading.performTaskOnGAThread(function () { if (!GAValidator.validateDimension02(dimension, GAState.getAvailableCustomDimensions02())) { GALogger.w("Could not set custom02 dimension value to '" + dimension + "'. Value not found in available custom02 dimension values"); return; } GAState.setCustomDimension02(dimension); }); }; GameAnalytics.setCustomDimension03 = function (dimension) { if (dimension === void 0) { dimension = ""; } GAThreading.performTaskOnGAThread(function () { if (!GAValidator.validateDimension03(dimension, GAState.getAvailableCustomDimensions03())) { GALogger.w("Could not set custom03 dimension value to '" + dimension + "'. Value not found in available custom03 dimension values"); return; } GAState.setCustomDimension03(dimension); }); }; GameAnalytics.setGlobalCustomEventFields = function (customFields) { if (customFields === void 0) { customFields = {}; } GAThreading.performTaskOnGAThread(function () { GALogger.i("Set global custom event fields: " + JSON.stringify(customFields)); GAState.instance.currentGlobalCustomEventFields = customFields; }); }; GameAnalytics.setEventProcessInterval = function (intervalInSeconds) { GAThreading.performTaskOnGAThread(function () { GAThreading.setEventProcessInterval(intervalInSeconds); }); }; GameAnalytics.startSession = function () { { if (!GAState.isInitialized()) { return; } var timedBlock = GAThreading.createTimedBlock(); timedBlock.async = true; GameAnalytics.initTimedBlockId = timedBlock.id; timedBlock.block = function () { if (GAState.isEnabled() && GAState.sessionIsStarted()) { GAThreading.endSessionAndStopQueue(); } GameAnalytics.resumeSessionAndStartQueue(); }; GAThreading.performTimedBlockOnGAThread(timedBlock); } }; GameAnalytics.endSession = function () { { GameAnalytics.onStop(); } }; GameAnalytics.onStop = function () { GAThreading.performTaskOnGAThread(function () { try { GAThreading.endSessionAndStopQueue(); } catch (Exception) { } }); }; GameAnalytics.onResume = function () { var timedBlock = GAThreading.createTimedBlock(); timedBlock.async = true; GameAnalytics.initTimedBlockId = timedBlock.id; timedBlock.block = function () { GameAnalytics.resumeSessionAndStartQueue(); }; GAThreading.performTimedBlockOnGAThread(timedBlock); }; GameAnalytics.getRemoteConfigsValueAsString = function (key, defaultValue) { if (defaultValue === void 0) { defaultValue = null; } return GAState.getConfigurationStringValue(key, defaultValue); }; GameAnalytics.isRemoteConfigsReady = function () { return GAState.isRemoteConfigsReady(); }; GameAnalytics.addRemoteConfigsListener = function (listener) { GAState.addRemoteConfigsListener(listener); }; GameAnalytics.removeRemoteConfigsListener = function (listener) { GAState.removeRemoteConfigsListener(listener); }; GameAnalytics.getRemoteConfigsContentAsString = function () { return GAState.getRemoteConfigsContentAsString(); }; GameAnalytics.getABTestingId = function () { return GAState.getABTestingId(); }; GameAnalytics.getABTestingVariantId = function () { return GAState.getABTestingVariantId(); }; GameAnalytics.addOnBeforeUnloadListener = function (listener) { GAState.addOnBeforeUnloadListener(listener); }; GameAnalytics.removeOnBeforeUnloadListener = function (listener) { GAState.removeOnBeforeUnloadListener(listener); }; GameAnalytics.internalInitialize = function () { GAState.ensurePersistedStates(); GAStore.setItem(GAState.getGameKey(), GAState.DefaultUserIdKey, GAState.getDefaultId()); GAState.setInitialized(true); GameAnalytics.newSession(); if (GAState.isEnabled()) { GAThreading.ensureEventQueueIsRunning(); } }; GameAnalytics.newSession = function () { GALogger.i("Starting a new session."); GAState.validateAndFixCurrentDimensions(); GAHTTPApi.instance.requestInit(GAState.instance.configsHash, GameAnalytics.startNewSessionCallback); }; GameAnalytics.startNewSessionCallback = function (initResponse, initResponseDict) { if ((initResponse === EGAHTTPApiResponse.Ok || initResponse === EGAHTTPApiResponse.Created) && initResponseDict) { var timeOffsetSeconds = 0; if (initResponseDict["server_ts"]) { var serverTs = initResponseDict["server_ts"]; timeOffsetSeconds = GAState.calculateServerTimeOffset(serverTs); } initResponseDict["time_offset"] = timeOffsetSeconds; if (initResponse != EGAHTTPApiResponse.Created) { var currentSdkConfig = GAState.getSdkConfig(); if (currentSdkConfig["configs"]) { initResponseDict["configs"] = currentSdkConfig["configs"]; } if (currentSdkConfig["configs_hash"]) { initResponseDict["configs_hash"] = currentSdkConfig["configs_hash"]; } if (currentSdkConfig["ab_id"]) { initResponseDict["ab_id"] = currentSdkConfig["ab_id"]; } if (currentSdkConfig["ab_variant_id"]) { initResponseDict["ab_variant_id"] = currentSdkConfig["ab_variant_id"]; } } GAState.instance.configsHash = initResponseDict["configs_hash"] ? initResponseDict["configs_hash"] : ""; GAState.instance.abId = initResponseDict["ab_id"] ? initResponseDict["ab_id"] : ""; GAState.instance.abVariantId = initResponseDict["ab_variant_id"] ? initResponseDict["ab_variant_id"] : ""; GAStore.setItem(GAState.getGameKey(), GAState.SdkConfigCachedKey, GAUtilities.encode64(JSON.stringify(initResponseDict))); GAState.instance.sdkConfigCached = initResponseDict; GAState.instance.sdkConfig = initResponseDict; GAState.instance.initAuthorized = true; } else if (initResponse == EGAHTTPApiResponse.Unauthorized) { GALogger.w("Initialize SDK failed - Unauthorized"); GAState.instance.initAuthorized = false; } else { if (initResponse === EGAHTTPApiResponse.NoResponse || initResponse === EGAHTTPApiResponse.RequestTimeout) { GALogger.i("Init call (session start) failed - no response. Could be offline or timeout."); } else if (initResponse === EGAHTTPApiResponse.BadResponse || initResponse === EGAHTTPApiResponse.JsonEncodeFailed || initResponse === EGAHTTPApiResponse.JsonDecodeFailed) { GALogger.i("Init call (session start) failed - bad response. Could be bad response from proxy or GA servers."); } else if (initResponse === EGAHTTPApiResponse.BadRequest || initResponse === EGAHTTPApiResponse.UnknownResponseCode) { GALogger.i("Init call (session start) failed - bad request or unknown response."); } if (GAState.instance.sdkConfig == null) { if (GAState.instance.sdkConfigCached != null) { GALogger.i("Init call (session start) failed - using cached init values."); GAState.instance.sdkConfig = GAState.instance.sdkConfigCached; } else { GALogger.i("Init call (session start) failed - using default init values."); GAState.instance.sdkConfig = GAState.instance.sdkConfigDefault; } } else { GALogger.i("Init call (session start) failed - using cached init values."); } GAState.instance.initAuthorized = true; } GAState.instance.clientServerTimeOffset = GAState.getSdkConfig()["time_offset"] ? GAState.getSdkConfig()["time_offset"] : 0; GAState.populateConfigurations(GAState.getSdkConfig()); if (!GAState.isEnabled()) { GALogger.w("Could not start session: SDK is disabled."); GAThreading.stopEventQueue(); return; } else { GAThreading.ensureEventQueueIsRunning(); } var newSessionId = GAUtilities.createGuid(); GAState.instance.sessionId = newSessionId; GAState.instance.sessionStart = GAState.getClientTsAdjusted(); GAEvents.addSessionStartEvent(); var timedBlock = GAThreading.getTimedBlockById(GameAnalytics.initTimedBlockId); if (timedBlock != null) { timedBlock.running = false; } GameAnalytics.initTimedBlockId = -1; }; GameAnalytics.resumeSessionAndStartQueue = function () { if (!GAState.isInitialized()) { return; } GALogger.i("Resuming session."); if (!GAState.sessionIsStarted()) { GameAnalytics.newSession(); } }; GameAnalytics.isSdkReady = function (needsInitialized, warn, message) { if (warn === void 0) { warn = true; } if (message === void 0) { message = ""; } if (message) { message = message + ": "; } if (needsInitialized && !GAState.isInitialized()) { if (warn) { GALogger.w(message + "SDK is not initialized"); } return false; } if (needsInitialized && !GAState.isEnabled()) { if (warn) { GALogger.w(message + "SDK is disabled"); } return false; } if (needsInitialized && !GAState.sessionIsStarted()) { if (warn) { GALogger.w(message + "Session has not started yet"); } return false; } return true; }; GameAnalytics.initTimedBlockId = -1; GameAnalytics.methodMap = {}; return GameAnalytics; }()); gameanalytics.GameAnalytics = GameAnalytics; })(gameanalytics || (gameanalytics = {})); gameanalytics.GameAnalytics.init(); var GameAnalytics = gameanalytics.GameAnalytics.gaCommand; globalThis.gameanalytics = gameanalytics;