{"version":3,"file":"Scripts/trackingWorker.js","mappings":"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","sources":["webpack://pf.web.ucf.sdk/./src/workers/tracking/helpers/http.ts","webpack://pf.web.ucf.sdk/./src/workers/tracking/helpers/logger.ts","webpack://pf.web.ucf.sdk/./src/workers/tracking/helpers/utils.ts","webpack://pf.web.ucf.sdk/./src/workers/tracking/models/index.ts","webpack://pf.web.ucf.sdk/./src/workers/tracking/handle-message.ts","webpack://pf.web.ucf.sdk/./src/workers/tracking/tracking.worker.ts","webpack://pf.web.ucf.sdk/./src/workers/tracking/parse-logs.ts"],"sourcesContent":["const makeRequest = (method: \"GET\" | \"POST\", url: string, {headers, params = \"\"}: {headers?: Record, params?: Record | string} = {}): Promise => {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(method, url);\r\n\r\n xhr.addEventListener(\"load\", () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve(xhr.response);\r\n } else {\r\n reject({\r\n status: xhr.status,\r\n statusText: xhr.statusText\r\n });\r\n }\r\n });\r\n\r\n xhr.addEventListener(\"error\", () =>\r\n reject({\r\n status: xhr.status,\r\n statusText: xhr.statusText\r\n })\r\n );\r\n\r\n if (headers) {\r\n Object.keys(headers).forEach( (key) => {\r\n xhr.setRequestHeader(key, headers[key]);\r\n });\r\n }\r\n\r\n if (params && typeof params === 'object') {\r\n params = Object.keys(params).map(key => {\r\n return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);\r\n }).join('&');\r\n }\r\n\r\n xhr.send(params as string);\r\n });\r\n}\r\nexport class Http {\r\n public static get(url: string): Promise {\r\n return makeRequest(\"GET\", url);\r\n }\r\n\r\n public static post(url: string, params: string): Promise {\r\n return makeRequest(\"POST\", url, {params});\r\n }\r\n}\r\n","const commonStyle = 'padding: 0 5px;margin-right: 2px;';\r\nconst headingStyleFactory = (backgroundColor) => commonStyle + `border: 1px solid ${backgroundColor};background: ${backgroundColor};color: white;`\r\nconst messageStyle = commonStyle + '';\r\n\r\nenum LogLevel {\r\n info = \"INFO\",\r\n warn = \"WARN\",\r\n debug = \"DEBUG\",\r\n error = \"ERROR\"\r\n}\r\n\r\nconst logStyles = {\r\n [LogLevel.info]: commonStyle + 'background #efe; color: green;border: 1px dashed #ccc;',\r\n [LogLevel.warn]: commonStyle + 'background #efe; color: orange;border: 1px dashed #ccc;',\r\n [LogLevel.debug]: commonStyle + 'background #efe; color: blue;border: 1px dashed #ccc;',\r\n [LogLevel.error]: commonStyle + 'background #efe; color: red;border: 1px dashed #ccc;'\r\n}\r\n\r\nexport class Logger {\r\n public static logLevel: LogLevel;\r\n private readonly _prefixes: string;\r\n private readonly _styles: string[];\r\n\r\n private constructor(prefixMessage: string, ...styles: string[]) {\r\n this._prefixes = prefixMessage;\r\n this._styles = styles;\r\n }\r\n\r\n static createInstance(serviceName, color = \"green\") {\r\n const headingStyle = headingStyleFactory(color);\r\n return new Logger(`%c${serviceName}`,headingStyle);\r\n }\r\n\r\n withPrefix(prefix: string, color = \"green\") {\r\n const headingStyle = headingStyleFactory(color);\r\n return new Logger(`${this._prefixes}%c${prefix}`, ...this._styles, headingStyle);\r\n }\r\n\r\n info(message, ...args) {\r\n this.log(LogLevel.info, message, ...args);\r\n }\r\n\r\n\r\n warn(message, ...args) {\r\n this.log(LogLevel.warn, message, ...args);\r\n }\r\n\r\n debug(message, ...args) {\r\n this.log(LogLevel.debug, message, ...args);\r\n\r\n }\r\n\r\n error(message, ...args: any) {\r\n this.log(LogLevel.error, message, ...args);\r\n }\r\n\r\n log(level: LogLevel, message: string, ...args: any) {\r\n console.log(`${this._prefixes}%c${level}%c${message}`, ...this._styles, logStyles[level], messageStyle, ...args.map(arg => ({ data: arg })));\r\n }\r\n}\r\n","import { IInitObject, ITrackingEvent } from '../models';\r\n\r\nexport const lerp = (min, max, amount, minDiff = 0.0001) => {\r\n const diff = max - min;\r\n if (Math.abs(diff) < minDiff) return max;\r\n return min + diff * amount;\r\n};\r\n\r\nexport const messageIsEvent = (data: unknown): data is ITrackingEvent => {\r\n return (\r\n !isUndefined(data) &&\r\n isObject(data) &&\r\n !isUndefined((data as ITrackingEvent).type) &&\r\n isString((data as ITrackingEvent).type) &&\r\n !isUndefined((data as ITrackingEvent).data)\r\n );\r\n};\r\n\r\nexport const dataIsInitObject = (data: unknown): data is IInitObject => {\r\n return (\r\n !isUndefined(data) &&\r\n isObject(data) &&\r\n !isUndefined((data as IInitObject).clickStreamURL) &&\r\n isString((data as IInitObject).clickStreamURL) &&\r\n !isUndefined((data as IInitObject).appID) &&\r\n isString((data as IInitObject).appID) &&\r\n !isUndefined((data as IInitObject).productPackageID)\r\n );\r\n};\r\n\r\nexport const isUndefined = (data: unknown): data is undefined => {\r\n return !(data != null);\r\n};\r\n\r\nexport const isObject = (data: unknown): data is object => {\r\n return typeof data === 'object';\r\n};\r\n\r\nexport const isString = (data: unknown): data is string => {\r\n return typeof data === 'string';\r\n};\r\n","import { Logger } from '../helpers';\r\n\r\nexport interface ILog {\r\n eventHeader: any;\r\n eventData: any;\r\n retryCount: number;\r\n}\r\n\r\nexport enum TrackingEventTypes {\r\n init = 'init',\r\n log = 'log',\r\n}\r\n\r\nexport interface ITrackingEvent {\r\n type: TrackingEventTypes;\r\n data: T;\r\n}\r\n\r\nexport interface IInitObject {\r\n appID: string;\r\n productPackageID: number;\r\n clickStreamURL: string;\r\n}\r\n\r\nexport interface WorkerScope extends Window {\r\n mainLogger: Logger;\r\n logLogger: Logger;\r\n initLogger: Logger;\r\n logs: ILog[];\r\n initObject: IInitObject;\r\n timeout: any;\r\n ranOnce: boolean;\r\n}\r\n","import { ILog, TrackingEventTypes, WorkerScope } from \"./models\";\r\nimport { dataIsInitObject, isObject, isUndefined, messageIsEvent } from \"./helpers\";\r\n\r\nexport const handleMessageBuilder = (worker: WorkerScope) => (message: MessageEvent) => {\r\n const event = message.data;\r\n if (messageIsEvent(event)) {\r\n switch (event.type) {\r\n case TrackingEventTypes.init:\r\n // Start\r\n if (isUndefined(worker.initObject)) {\r\n if (dataIsInitObject(event.data)) {\r\n worker.initObject = event.data;\r\n // Success\r\n } else {\r\n worker.initLogger.error('Failed - click stream URL must be a string');\r\n\r\n }\r\n } else {\r\n // warn, already initialized\r\n worker.initLogger.warn('Already initialized');\r\n }\r\n break;\r\n case TrackingEventTypes.log:\r\n if (isObject(event.data)) {\r\n // Add log to queue\r\n worker.logs.push({ ...event.data, retryCount: 0 } as ILog);\r\n } else {\r\n worker.logLogger.warn('Log data should be an object', worker.initObject);\r\n\r\n }\r\n break;\r\n default:\r\n // log unsupported\r\n worker.mainLogger.warn('Unsupported event type', event);\r\n break;\r\n }\r\n } else {\r\n worker.mainLogger.warn('Unknown event format, please use {type: string, data: any}', event);\r\n }\r\n}\r\n","import { Logger } from \"./helpers\";\r\nimport { WorkerScope } from \"./models\";\r\nimport { handleMessageBuilder } from \"./handle-message\";\r\nimport { parseLogsBuilder } from \"./parse-logs\";\r\n\r\nconst worker = self as unknown as WorkerScope;\r\nworker.mainLogger = Logger.createInstance('Tracking Web Worker', '#f58231');\r\nworker.initLogger = worker.mainLogger.withPrefix('Init', '#469990');\r\nworker.logLogger = worker.mainLogger.withPrefix('Log', '#42d4f4');\r\nworker.logs = [];\r\nworker.ranOnce = false;\r\n\r\nconst handleMessage = handleMessageBuilder(worker);\r\nconst parseLogs = parseLogsBuilder(worker);\r\nworker.addEventListener(\"message\", handleMessage);\r\n\r\nparseLogs();\r\n","import {Http, isUndefined, lerp} from \"./helpers\";\r\nimport {WorkerScope} from \"./models\";\r\n\r\nexport const parseLogsBuilder = (worker: WorkerScope) => {\r\n const parseLogs = async () => {\r\n if(!isUndefined(worker.initObject)) {\r\n let delayTime = 1;\r\n if (worker.logs.length) {\r\n clearTimeout(worker.timeout);\r\n const log = worker.logs.shift()!;\r\n try {\r\n await Http.post(worker.initObject.clickStreamURL, JSON.stringify(log));\r\n } catch(err) {\r\n if (err.status == 429 || (err.status >= 500 && err.status < 510)) {\r\n worker.logLogger.warn('3rd party call failed', worker.initObject, log, err);\r\n delayTime = Math.floor(lerp(100, 1000, Math.random()));\r\n if (log.retryCount < 3) {\r\n log.retryCount++;\r\n worker.logs.push(log);\r\n } else {\r\n worker.logLogger.error('3rd party call failed after 3 retries, removing from queue', worker.initObject, log, err);\r\n }\r\n } else {\r\n worker.logLogger.error('3rd party call failed - unhandled status code', worker.initObject, log, err);\r\n }\r\n }\r\n } else {\r\n delayTime = 50;\r\n }\r\n worker.timeout = setTimeout(parseLogs, delayTime);\r\n } else {\r\n // Log missing clickStreamURL\r\n if (!worker.ranOnce) {\r\n worker.logLogger.warn('No click stream URL, please send init event that contains an init object');\r\n worker.ranOnce = true;\r\n }\r\n clearTimeout(worker.timeout);\r\n setTimeout(parseLogs, 100);\r\n }\r\n }\r\n return parseLogs;\r\n}\r\n"],"names":["makeRequest","method","url","headers","params","Promise","resolve","reject","xhr","XMLHttpRequest","open","addEventListener","status","response","statusText","Object","keys","forEach","key","setRequestHeader","map","encodeURIComponent","join","send","Http","get","post","commonStyle","headingStyleFactory","backgroundColor","messageStyle","LogLevel","logStyles","info","warn","debug","error","Logger","prefixMessage","styles","this","_prefixes","_styles","createInstance","serviceName","color","headingStyle","withPrefix","prefix","message","args","log","level","console","arg","data","isUndefined","isObject","isString","TrackingEventTypes","worker","self","mainLogger","initLogger","logLogger","logs","ranOnce","handleMessage","event","type","init","initObject","clickStreamURL","appID","productPackageID","dataIsInitObject","push","retryCount","handleMessageBuilder","parseLogs","async","clearTimeout","timeout","setTimeout","delayTime","length","shift","JSON","stringify","err","Math","floor","min","max","amount","minDiff","diff","abs","lerp","random","parseLogsBuilder"],"sourceRoot":""}