@kameleoon/javascript-sdk-core 3.6.1 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +375 -0
- package/CHANGELOG_INTERNAL.md +3 -0
- package/dist/cacheManager/cacheManager.js +1 -1
- package/dist/cacheManager/cacheManager.js.map +1 -1
- package/dist/cacheManager/index.js +1 -1
- package/dist/clientConfiguration/clientConfiguration.d.ts +2 -3
- package/dist/clientConfiguration/clientConfiguration.js +1 -1
- package/dist/clientConfiguration/clientConfiguration.js.map +1 -1
- package/dist/clientConfiguration/constants.js +1 -1
- package/dist/clientConfiguration/constants.js.map +1 -1
- package/dist/clientConfiguration/index.js +1 -1
- package/dist/clientConfiguration/types.d.ts +8 -9
- package/dist/clientConfiguration/types.js +1 -1
- package/dist/clientConfiguration/types.js.map +1 -1
- package/dist/clientSettings/clientSettings.js +1 -1
- package/dist/clientSettings/clientSettings.js.map +1 -1
- package/dist/clientSettings/index.js +1 -1
- package/dist/constants.d.ts +0 -8
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/eventSource/constants.js +1 -1
- package/dist/eventSource/constants.js.map +1 -1
- package/dist/eventSource/eventSource.d.ts +17 -0
- package/dist/eventSource/eventSource.js +2 -0
- package/dist/eventSource/eventSource.js.map +1 -0
- package/dist/eventSource/index.d.ts +2 -2
- package/dist/eventSource/index.js +1 -1
- package/dist/eventSource/index.js.map +1 -1
- package/dist/eventSource/types.d.ts +8 -19
- package/dist/eventSource/types.js.map +1 -1
- package/dist/hasher/hasher.js +1 -1
- package/dist/hasher/hasher.js.map +1 -1
- package/dist/hasher/index.js +1 -1
- package/dist/hasher/index.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kameleoonClient.d.ts +2 -207
- package/dist/kameleoonClient.js +1 -1
- package/dist/kameleoonClient.js.map +1 -1
- package/dist/kameleoonClientInterface.d.ts +199 -0
- package/dist/kameleoonClientInterface.js +2 -0
- package/dist/kameleoonClientInterface.js.map +1 -0
- package/dist/kameleoonData/applicationVersion.js +1 -1
- package/dist/kameleoonData/applicationVersion.js.map +1 -1
- package/dist/kameleoonData/browser.js +1 -1
- package/dist/kameleoonData/browser.js.map +1 -1
- package/dist/kameleoonData/constants.js +1 -1
- package/dist/kameleoonData/constants.js.map +1 -1
- package/dist/kameleoonData/conversion.js +1 -1
- package/dist/kameleoonData/conversion.js.map +1 -1
- package/dist/kameleoonData/cookie.js +1 -1
- package/dist/kameleoonData/cookie.js.map +1 -1
- package/dist/kameleoonData/customData.js +1 -1
- package/dist/kameleoonData/customData.js.map +1 -1
- package/dist/kameleoonData/dataManager.js +1 -1
- package/dist/kameleoonData/dataManager.js.map +1 -1
- package/dist/kameleoonData/dataProcessor.d.ts +2 -2
- package/dist/kameleoonData/dataProcessor.js +1 -1
- package/dist/kameleoonData/dataProcessor.js.map +1 -1
- package/dist/kameleoonData/device.js +1 -1
- package/dist/kameleoonData/device.js.map +1 -1
- package/dist/kameleoonData/geolocation.js +1 -1
- package/dist/kameleoonData/geolocation.js.map +1 -1
- package/dist/kameleoonData/helpers.js +1 -1
- package/dist/kameleoonData/helpers.js.map +1 -1
- package/dist/kameleoonData/index.js +1 -1
- package/dist/kameleoonData/operatingSystem.js +1 -1
- package/dist/kameleoonData/operatingSystem.js.map +1 -1
- package/dist/kameleoonData/pageView.js +1 -1
- package/dist/kameleoonData/pageView.js.map +1 -1
- package/dist/kameleoonData/types.d.ts +2 -2
- package/dist/kameleoonData/types.js +1 -1
- package/dist/kameleoonData/types.js.map +1 -1
- package/dist/kameleoonData/userAgent.js +1 -1
- package/dist/kameleoonData/userAgent.js.map +1 -1
- package/dist/kameleoonData/visitsData.js +1 -1
- package/dist/kameleoonData/visitsData.js.map +1 -1
- package/dist/kameleoonError/constants.d.ts +1 -1
- package/dist/kameleoonError/constants.js +1 -1
- package/dist/kameleoonError/constants.js.map +1 -1
- package/dist/kameleoonError/helpers.js.map +1 -1
- package/dist/kameleoonError/index.js +1 -1
- package/dist/kameleoonError/kameleoonError.js +1 -1
- package/dist/kameleoonError/kameleoonError.js.map +1 -1
- package/dist/kameleoonError/types.d.ts +1 -1
- package/dist/kameleoonError/types.js +1 -1
- package/dist/kameleoonError/types.js.map +1 -1
- package/dist/kameleoonUtils.js +1 -1
- package/dist/kameleoonUtils.js.map +1 -1
- package/dist/requester/constants.d.ts +1 -3
- package/dist/requester/constants.js +1 -1
- package/dist/requester/constants.js.map +1 -1
- package/dist/requester/index.d.ts +1 -1
- package/dist/requester/index.js +1 -1
- package/dist/requester/index.js.map +1 -1
- package/dist/requester/requester.d.ts +0 -3
- package/dist/requester/requester.js +1 -1
- package/dist/requester/requester.js.map +1 -1
- package/dist/requester/types.d.ts +11 -1
- package/dist/requester/types.js +1 -1
- package/dist/requester/types.js.map +1 -1
- package/dist/requester/urlProvider.d.ts +18 -0
- package/dist/requester/urlProvider.js +2 -0
- package/dist/requester/urlProvider.js.map +1 -0
- package/dist/storage/constants.js +1 -1
- package/dist/storage/constants.js.map +1 -1
- package/dist/storage/index.d.ts +2 -1
- package/dist/storage/index.js +1 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/storage.d.ts +13 -0
- package/dist/storage/storage.js +2 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/types.d.ts +15 -30
- package/dist/storage/types.js.map +1 -1
- package/dist/targeting/conditions/applicationVersion.js +1 -1
- package/dist/targeting/conditions/applicationVersion.js.map +1 -1
- package/dist/targeting/conditions/browser.js +1 -1
- package/dist/targeting/conditions/browser.js.map +1 -1
- package/dist/targeting/conditions/conditionFactory.js +1 -1
- package/dist/targeting/conditions/conditionFactory.js.map +1 -1
- package/dist/targeting/conditions/conversion.js +1 -1
- package/dist/targeting/conditions/conversion.js.map +1 -1
- package/dist/targeting/conditions/cookie.js +1 -1
- package/dist/targeting/conditions/cookie.js.map +1 -1
- package/dist/targeting/conditions/customData.js +1 -1
- package/dist/targeting/conditions/customData.js.map +1 -1
- package/dist/targeting/conditions/device.js +1 -1
- package/dist/targeting/conditions/device.js.map +1 -1
- package/dist/targeting/conditions/exclusiveCampaign.js +1 -1
- package/dist/targeting/conditions/exclusiveCampaign.js.map +1 -1
- package/dist/targeting/conditions/firstVisit.js +1 -1
- package/dist/targeting/conditions/firstVisit.js.map +1 -1
- package/dist/targeting/conditions/geolocation.js +1 -1
- package/dist/targeting/conditions/geolocation.js.map +1 -1
- package/dist/targeting/conditions/index.js +1 -1
- package/dist/targeting/conditions/lastVisit.js +1 -1
- package/dist/targeting/conditions/lastVisit.js.map +1 -1
- package/dist/targeting/conditions/newVisitor.js +1 -1
- package/dist/targeting/conditions/newVisitor.js.map +1 -1
- package/dist/targeting/conditions/operatingSystem.js +1 -1
- package/dist/targeting/conditions/operatingSystem.js.map +1 -1
- package/dist/targeting/conditions/pageTitle.js +1 -1
- package/dist/targeting/conditions/pageTitle.js.map +1 -1
- package/dist/targeting/conditions/pageUrl.js +1 -1
- package/dist/targeting/conditions/pageUrl.js.map +1 -1
- package/dist/targeting/conditions/previousPage.js +1 -1
- package/dist/targeting/conditions/previousPage.js.map +1 -1
- package/dist/targeting/conditions/sameDayVisits.js +1 -1
- package/dist/targeting/conditions/sameDayVisits.js.map +1 -1
- package/dist/targeting/conditions/sdkLanguage.js +1 -1
- package/dist/targeting/conditions/sdkLanguage.js.map +1 -1
- package/dist/targeting/conditions/segment.js +1 -1
- package/dist/targeting/conditions/segment.js.map +1 -1
- package/dist/targeting/conditions/targetFeatureFlag.js +1 -1
- package/dist/targeting/conditions/targetFeatureFlag.js.map +1 -1
- package/dist/targeting/conditions/visitedPages.js +1 -1
- package/dist/targeting/conditions/visitedPages.js.map +1 -1
- package/dist/targeting/conditions/visitorCode.js +1 -1
- package/dist/targeting/conditions/visitorCode.js.map +1 -1
- package/dist/targeting/conditions/visits.js +1 -1
- package/dist/targeting/conditions/visits.js.map +1 -1
- package/dist/targeting/index.js +1 -1
- package/dist/targeting/node.js +1 -1
- package/dist/targeting/node.js.map +1 -1
- package/dist/targeting/tree.js +1 -1
- package/dist/targeting/tree.js.map +1 -1
- package/dist/targeting/types.js +1 -1
- package/dist/targeting/types.js.map +1 -1
- package/dist/types.d.ts +14 -26
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/constants.js +1 -1
- package/dist/utilities/constants.js.map +1 -1
- package/dist/utilities/index.js +1 -1
- package/dist/utilities/types.d.ts +7 -7
- package/dist/utilities/types.js +1 -1
- package/dist/utilities/types.js.map +1 -1
- package/dist/utilities/utilities.js +1 -1
- package/dist/utilities/utilities.js.map +1 -1
- package/dist/variationConfiguration/index.js +1 -1
- package/dist/variationConfiguration/variationConfiguration.d.ts +3 -3
- package/dist/variationConfiguration/variationConfiguration.js +1 -1
- package/dist/variationConfiguration/variationConfiguration.js.map +1 -1
- package/dist/visitorCodeManager/constants.d.ts +3 -0
- package/dist/visitorCodeManager/constants.js +2 -0
- package/dist/visitorCodeManager/constants.js.map +1 -0
- package/dist/visitorCodeManager/index.d.ts +2 -0
- package/dist/visitorCodeManager/index.js +1 -1
- package/dist/visitorCodeManager/index.js.map +1 -1
- package/dist/visitorCodeManager/types.d.ts +7 -0
- package/dist/visitorCodeManager/types.js +2 -0
- package/dist/visitorCodeManager/types.js.map +1 -0
- package/dist/visitorCodeManager/visitorCodeManager.d.ts +11 -8
- package/dist/visitorCodeManager/visitorCodeManager.js +1 -1
- package/dist/visitorCodeManager/visitorCodeManager.js.map +1 -1
- package/package.json +5 -5
- package/dist/eventSource/externalEventSource.d.ts +0 -12
- package/dist/eventSource/externalEventSource.js +0 -2
- package/dist/eventSource/externalEventSource.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","names":["Utilities","a","_classCallCheck","_createClass","key","value","checkTargeting","segment","visitorCode","targetingData","experimentId","variationConfiguration","clientConfiguration","packageInfo","dataManager","conditionsData","firstLevel","length","Ok","Err","KameleoonError","KameleoonException","Initialization","variations","assignedVariationsResult","getStoredVariations","ok","data","targetingTree","getTree","trees","segments","ruleMap","hasTargetingType","TargetingType","SEGMENT","TARGET_FEATURE_FLAG","result","evaluate","variationData","sdkInfo","validateVisitorCode","VisitorCodeEmpty","VISITOR_CODE_MAX_LENGTH","VisitorCodeMaxLength","getDataUrl","b","updateUrl","url","shouldSendConversionData","type","KameleoonData","Conversion","isConsentProvided","nonce","UrlParameter","Nonce","getNonce","resultUrl","push","unsentData","getUnsentData","size","i","j","_createForOfIteratorHelper","values","s","n","done","item","Array","isArray","forEach","arrayItem","e","f","join","getVariationDataUrlAndSentExperimentIds","variationDataUrlList","sentExperimentIds","Set","isTargetedRule","UrlEventType","Experiment","Id","VariationId","variationId","add","variationDataUrl","experimentIds","from","apply","arguments","_asyncToGenerator","_regeneratorRuntime","mark","c","d","g","h","k","l","m","o","p","q","r","t","u","v","w","wrap","x","prev","next","featureFlagVariation","requester","isOfflineModeOn","offlineTrackingStorage","rule","userAgent","getUserAgent","dataUrl","resultVariationId","_slicedToArray","abrupt","isUnallocated","parameters","trackExperiment","sent","clearUnsentData","clearUnsentDataByKey","markUnsentDataAsSent","addItemToOfflineTracking","storage","isExperiment","stop","convertTimeUnit","time","timeUnit","timeMap","_defineProperty","TimeUnit","Minute","Milliseconds","Hour","Day","Week","Month","parseFeatureVariable","variable","VariableType","BOOLEAN","STRING","NUMBER","numberValue","Number","isNaN","NumberParse","JSON","jsonValue","parse","err","JSONParse","exhaustCheck","parseVisitorData","filters","currentVisit","previousVisits","browserFilter","browser","customDataFilter","customData","operatingSystemFilter","operatingSystem","conversionsFilter","conversions","deviceFilter","device","geolocationFilter","geolocation","experimentsFilter","experiments","pageViewFilter","pageViews","visits","_toConsumableArray","visitorData","resultData","PageView","_listFromVisits","Browser","_fromVisits","visit","experimentData","experimentEvents","y","experimentEvent","A","id","isSent","updateStoredVariations","Device","GeolocationData","CustomData","OperatingSystem","visitsData","collectedVisitsData","VisitsData","_fromRemoteVisits","parseRegExp","split","_","expression","flags","RegExp","storedData","storedTargetingData","userAgentData","UserAgent","isCustomData","dataItem","insertInOrderedListMutably","list","element","order","includes","index","findIndex","Order","Ascending","splice","updateCache","cacheManager","cacheData","getAliveItem","newCacheData","_objectSpread","expirationTime","Date","now","CACHE_ITEM_LIFETIME","Second","lifetime","getTrackingCode","trackingCache","resultString","updatedCacheData","Object","entries","concat","isMappingIdentifier","sendOfflineTracking","body","trackData","cleanup","onSuccess","randomNumber","hexLength","HEX_CHARACTERS","Math","floor","random","substring","compareSemVer","version","compareVersion","operator","versionResult","validateVersion","compareVersionResult","error","major","minor","patch","compareMajor","compareMinor","comparePatch","isMajorEqual","isMinorEqual","isPatchEqual","VersionMatchType","EQUAL","GREATER","LOWER","generateRandomString","characters","randomCharacterArray","readResult","read","requestParameters","successfulTimestamps","timestamp","params","_objectWithoutProperties","_excluded","t0","finish","deleteFromOfflineTracking","timestamps","newItem","getTime","newRequestParameters","writeResult","write","newParameters","filter","versionParts","map","parseInt","some","SemanticVersionParse","slice","exports"],"sources":["../../src/utilities/utilities.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport {\n KameleoonError,\n KameleoonException,\n exhaustCheck,\n} from 'src/kameleoonError';\nimport {\n FeatureVariableResultType,\n Milliseconds,\n TrackingCacheItemType,\n VariableType,\n} from 'src/types';\nimport { FeatureVariableType, JSONType } from 'src/clientConfiguration';\nimport {\n Browser,\n Conversion,\n CustomData,\n DataManager,\n Device,\n GeolocationData,\n KameleoonData,\n KameleoonDataType,\n OperatingSystem,\n PageView,\n VisitsData,\n} from 'src/kameleoonData';\nimport { CACHE_ITEM_LIFETIME } from 'src/constants';\nimport { CacheManager } from 'src/cacheManager';\nimport {\n TrackExperimentParamsType,\n TrackDataParamsType,\n VisitType,\n UrlParameter,\n UrlEventType,\n} from 'src/requester';\nimport { VersionMatchType, TargetingType } from 'src/targeting';\nimport { KameleoonVisitorDataType } from 'src/kameleoonData/types';\nimport { FeatureFlagVariationsType } from 'src/storage/types';\nimport { VISITOR_CODE_MAX_LENGTH, HEX_CHARACTERS } from './constants';\nimport {\n CheckTargetingParametersType,\n ManageCacheParametersType,\n TrackDataParametersType,\n TrackRuleParametersType,\n AddToOfflineTrackingParametersType,\n SendOfflineTrackingParametersType,\n DeleteFromOfflineTrackingParametersType,\n ParseVisitorDataParametersType,\n InsertInOrderedListParametersType,\n Order,\n TimeUnit,\n GetDataUrlParametersType,\n GetVariationDataUrlParametersType,\n ParseVisitorDataResultType,\n} from './types';\n\nexport class Utilities {\n static checkTargeting({\n segment,\n visitorCode,\n targetingData,\n experimentId,\n variationConfiguration,\n clientConfiguration,\n packageInfo,\n dataManager,\n }: CheckTargetingParametersType): Result<boolean, KameleoonError> {\n if (!segment || !segment.conditionsData.firstLevel.length) {\n return Ok(true);\n }\n\n if (!variationConfiguration) {\n return Err(new KameleoonError(KameleoonException.Initialization));\n }\n\n let variations: FeatureFlagVariationsType = {};\n\n const assignedVariationsResult =\n variationConfiguration.getStoredVariations(visitorCode);\n\n if (assignedVariationsResult.ok) {\n variations = assignedVariationsResult.data;\n }\n\n const targetingTree = dataManager.getTree(segment);\n\n let trees = undefined;\n let segments = undefined;\n let ruleMap = undefined;\n\n // --- Note ---\n // Only getting trees and segments targeting type\n if (targetingTree.hasTargetingType(TargetingType.SEGMENT)) {\n trees = dataManager.trees;\n segments = clientConfiguration.segments;\n }\n\n // --- Note ---\n // Only constructing rule map for targeting type\n if (targetingTree.hasTargetingType(TargetingType.TARGET_FEATURE_FLAG)) {\n ruleMap = clientConfiguration.ruleMap;\n }\n\n const result = targetingTree.evaluate({\n variationData: variations,\n sdkInfo: packageInfo,\n segments,\n ruleMap,\n trees,\n targetingData,\n experimentId,\n visitorCode,\n });\n\n return result;\n }\n\n static validateVisitorCode(\n visitorCode: string,\n ): Result<void, KameleoonError> {\n if (visitorCode.length === 0) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeEmpty));\n }\n\n if (visitorCode.length > VISITOR_CODE_MAX_LENGTH) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeMaxLength));\n }\n\n return Ok();\n }\n\n static getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n }: GetDataUrlParametersType): string {\n const unsentData = dataManager.getUnsentData(visitorCode);\n const resultUrl: string[] = [];\n\n if (!unsentData || !unsentData.size) {\n return '';\n }\n\n function updateUrl(data: KameleoonDataType): void {\n if (!data.url) {\n return;\n }\n\n const shouldSendAllData = isConsentProvided;\n const shouldSendConversionData =\n data.data.type === KameleoonData.Conversion;\n\n if (shouldSendAllData || shouldSendConversionData) {\n const nonce = !shouldSendConversionData\n ? UrlParameter.Nonce + Utilities.getNonce()\n : '';\n resultUrl.push(data.url + nonce + '\\n');\n }\n }\n\n for (const item of unsentData.values()) {\n if (Array.isArray(item)) {\n item.forEach((arrayItem) => updateUrl(arrayItem));\n } else {\n updateUrl(item);\n }\n }\n\n return resultUrl.join('');\n }\n\n static getVariationDataUrlAndSentExperimentIds({\n visitorCode,\n isConsentProvided,\n variationConfiguration,\n }: GetVariationDataUrlParametersType): [string, string[]] {\n const variationDataUrlList: string[] = [];\n const sentExperimentIds = new Set<string>();\n const unsentData = variationConfiguration.getUnsentData(visitorCode);\n\n if (unsentData.ok && unsentData.data.length) {\n unsentData.data.forEach((item) => {\n if (item.isTargetedRule || isConsentProvided) {\n variationDataUrlList.push(\n UrlEventType.Experiment +\n UrlParameter.Id +\n item.experimentId +\n UrlParameter.VariationId +\n item.variationId +\n UrlParameter.Nonce +\n Utilities.getNonce() +\n '\\n',\n );\n\n sentExperimentIds.add(String(item.experimentId));\n }\n });\n }\n\n const variationDataUrl = variationDataUrlList.join('');\n const experimentIds = Array.from(sentExperimentIds);\n\n return [variationDataUrl, experimentIds];\n }\n\n static async trackFeatureExperiment({\n featureFlagVariation,\n dataManager,\n visitorCode,\n requester,\n isOfflineModeOn,\n isConsentProvided,\n offlineTrackingStorage,\n variationConfiguration,\n }: TrackRuleParametersType): Promise<void> {\n const { variationId, rule } = featureFlagVariation;\n\n const userAgent = this.getUserAgent(visitorCode, dataManager);\n\n const dataUrl = this.getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n });\n\n const resultVariationId = variationId || 0;\n\n // --- Note ---\n // Experiment id is not needed for unallocated visitors\n // So we just use 0 as a fallback\n const experimentId = rule ? rule.experimentId : 0;\n\n const [variationDataUrl, sentExperimentIds] =\n this.getVariationDataUrlAndSentExperimentIds({\n visitorCode,\n isConsentProvided,\n variationConfiguration,\n });\n\n if (!isConsentProvided && !dataUrl && !rule) {\n return;\n }\n\n const isUnallocated = variationId === null;\n\n const parameters = {\n visitorCode,\n dataUrl,\n variationDataUrl,\n experimentId,\n variationId: resultVariationId,\n userAgent,\n isUnallocated,\n };\n\n const result = await requester.trackExperiment(parameters);\n\n if (result.ok) {\n if (!isConsentProvided) {\n dataManager.clearUnsentDataByKey(visitorCode, KameleoonData.Conversion);\n } else {\n dataManager.clearUnsentData(visitorCode);\n }\n\n sentExperimentIds.forEach((experimentId) => {\n variationConfiguration.markUnsentDataAsSent(visitorCode, experimentId);\n });\n }\n\n if (!result.ok && isOfflineModeOn) {\n this.addItemToOfflineTracking({\n item: parameters,\n storage: offlineTrackingStorage,\n isExperiment: true,\n });\n }\n }\n\n static convertTimeUnit(time: number, timeUnit: TimeUnit): number {\n const timeMap = {\n [TimeUnit.Minute]: Milliseconds.Minute,\n [TimeUnit.Hour]: Milliseconds.Hour,\n [TimeUnit.Day]: Milliseconds.Day,\n [TimeUnit.Week]: Milliseconds.Week,\n [TimeUnit.Month]: Milliseconds.Month,\n };\n\n return time / timeMap[timeUnit];\n }\n\n static parseFeatureVariable(\n variable: FeatureVariableType,\n ): Result<FeatureVariableResultType, KameleoonError> {\n const { key, type, value } = variable;\n\n switch (type) {\n case VariableType.BOOLEAN:\n return Ok({\n key,\n type,\n value: Boolean(value),\n });\n case VariableType.STRING:\n return Ok({\n key,\n type,\n value: String(value),\n });\n case VariableType.NUMBER:\n const numberValue = Number(value);\n\n if (Number.isNaN(numberValue)) {\n return Err(\n new KameleoonError(KameleoonException.NumberParse, String(value)),\n );\n }\n\n return Ok({\n key,\n type,\n value: numberValue,\n });\n case VariableType.JSON:\n try {\n const jsonValue: JSONType = JSON.parse(String(variable.value));\n\n return Ok({\n key,\n type,\n value: jsonValue,\n });\n } catch (err) {\n return Err(new KameleoonError(KameleoonException.JSONParse, err));\n }\n default:\n exhaustCheck(type);\n }\n }\n\n static parseVisitorData({\n data,\n filters,\n visitorCode,\n variationConfiguration,\n }: ParseVisitorDataParametersType): ParseVisitorDataResultType {\n const { currentVisit, previousVisits } = data;\n const {\n browser: browserFilter,\n customData: customDataFilter,\n operatingSystem: operatingSystemFilter,\n conversions: conversionsFilter,\n device: deviceFilter,\n geolocation: geolocationFilter,\n experiments: experimentsFilter,\n pageViews: pageViewFilter,\n } = filters;\n\n let visits: VisitType[] = [];\n\n if (currentVisit) {\n visits.push(currentVisit);\n }\n\n if (previousVisits) {\n visits.push(...previousVisits);\n }\n\n if (!visits) {\n return { visitorData: [] };\n }\n\n const resultData: KameleoonDataType[] = [];\n\n if (pageViewFilter) {\n const pageViews = PageView._listFromVisits(visits);\n\n if (pageViews.length) {\n resultData.push(...pageViews);\n }\n }\n\n // --- Browser ---\n if (browserFilter) {\n const browser = Browser._fromVisits(visits);\n\n if (browser) {\n resultData.push(browser);\n }\n }\n\n // --- Experiments ---\n if (experimentsFilter) {\n const experimentData: FeatureFlagVariationsType = {};\n\n // --- Note ---\n // Going backwards to get the latest experiment data\n for (let i = visits.length - 1; i >= 0; i--) {\n const visit = visits[i];\n\n if (!visit.experimentEvents) {\n continue;\n }\n\n for (const experimentEvent of visit.experimentEvents) {\n const { id, variationId } = experimentEvent.data;\n\n experimentData[id] = {\n variationId,\n isTargetedRule: false,\n isSent: false,\n };\n }\n }\n\n variationConfiguration.updateStoredVariations(\n visitorCode,\n experimentData,\n );\n }\n\n // --- Device ---\n if (deviceFilter) {\n const device = Device._fromVisits(visits);\n\n if (device) {\n resultData.push(device);\n }\n }\n\n // --- Geolocation ---\n if (geolocationFilter) {\n const geolocation = GeolocationData._fromVisits(visits);\n\n if (geolocation) {\n resultData.push(geolocation);\n }\n }\n\n // --- Custom data ---\n if (customDataFilter) {\n resultData.push(...CustomData._listFromVisits(visits));\n }\n\n // --- Operating system ---\n if (operatingSystemFilter) {\n const operatingSystem = OperatingSystem._fromVisits(visits);\n\n if (operatingSystem) {\n resultData.push(operatingSystem);\n }\n }\n\n // --- Conversions ---\n if (conversionsFilter) {\n resultData.push(...Conversion._listFromVisits(visits));\n }\n\n // --- Visits ---\n let visitsData: VisitsData | undefined;\n\n const collectedVisitsData = VisitsData._fromRemoteVisits(\n visits,\n Boolean(currentVisit),\n );\n\n if (collectedVisitsData) {\n visitsData = collectedVisitsData;\n }\n\n return { visitorData: resultData, visitsData };\n }\n\n static parseRegExp(value: string): RegExp {\n if (value[0] === '/') {\n const [_, expression, flags] = value.split('/');\n\n return new RegExp(expression, flags);\n }\n\n return new RegExp(value);\n }\n\n static getUserAgent(\n visitorCode: string,\n dataManager: DataManager,\n ): string | undefined {\n const storedData = dataManager.storedTargetingData;\n\n const targetingData: KameleoonVisitorDataType | undefined =\n storedData && storedData[visitorCode];\n\n if (targetingData) {\n const userAgentData = targetingData[KameleoonData.UserAgent];\n\n if (userAgentData) {\n return userAgentData.value;\n }\n }\n\n return undefined;\n }\n\n static isCustomData(dataItem: KameleoonDataType): dataItem is CustomData {\n return dataItem.data.type === KameleoonData.CustomData;\n }\n\n /**\n * Insert element in ordered list, if element already exists in list, does nothing\n * @param list - list to insert element\n * @param element - element to insert\n * @param order - order of list\n */\n static insertInOrderedListMutably({\n list,\n element,\n order,\n }: InsertInOrderedListParametersType): void {\n if (list.includes(element)) {\n return;\n }\n\n const index = list.findIndex((item) =>\n order === Order.Ascending ? item >= element : item <= element,\n );\n\n if (index === -1) {\n list.push(element);\n } else {\n list.splice(index, 0, element);\n }\n }\n\n static updateCache({\n cacheManager,\n visitorCode,\n experimentId,\n variationId,\n }: ManageCacheParametersType): void {\n const cacheData = cacheManager.getAliveItem(visitorCode);\n\n const newCacheData = cacheData ? { ...cacheData } : {};\n\n newCacheData[experimentId] = {\n variationId,\n expirationTime: Date.now() + CACHE_ITEM_LIFETIME * Milliseconds.Second,\n };\n\n cacheManager.add({\n key: visitorCode,\n data: newCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n }\n\n static getTrackingCode(\n trackingCache: CacheManager<TrackingCacheItemType>,\n visitorCode: string,\n ): string {\n let resultString = 'window.kameleoonQueue=window.kameleoonQueue||[];';\n\n const cacheData = trackingCache.getAliveItem(visitorCode);\n\n if (!cacheData) {\n return resultString;\n }\n\n const updatedCacheData: TrackingCacheItemType = {};\n\n Object.entries(cacheData).forEach(\n ([experimentId, { variationId, expirationTime }]) => {\n if (expirationTime > Date.now()) {\n resultString += `window.kameleoonQueue.push(['Experiments.assignVariation',${experimentId},${variationId}]);`;\n resultString += `window.kameleoonQueue.push(['Experiments.trigger',${experimentId},true]);`;\n\n updatedCacheData[Number(experimentId)] = {\n variationId,\n expirationTime,\n };\n }\n },\n );\n\n // --- Note ---\n // Cache is updated with only alive experiments\n trackingCache.add({\n key: visitorCode,\n data: updatedCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n\n return resultString;\n }\n\n static async trackData({\n visitorCode,\n dataManager,\n requester,\n isOfflineModeOn,\n offlineTrackingStorage,\n isConsentProvided,\n isMappingIdentifier,\n }: TrackDataParametersType): Promise<void> {\n await this.sendOfflineTracking({\n requester,\n storage: offlineTrackingStorage,\n });\n\n const dataUrl = this.getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n });\n\n if (!isConsentProvided && !dataUrl) {\n return;\n }\n\n const userAgent = this.getUserAgent(visitorCode, dataManager);\n\n const parameters: TrackDataParamsType = {\n visitorCode,\n body: dataUrl,\n userAgent,\n isMappingIdentifier,\n };\n\n const result = await requester.trackData(parameters);\n\n const cleanup = () =>\n isConsentProvided\n ? dataManager.clearUnsentData(visitorCode)\n : dataManager.clearUnsentDataByKey(\n visitorCode,\n KameleoonData.Conversion,\n );\n\n if (result.ok) {\n cleanup();\n }\n\n if (!result.ok && isOfflineModeOn) {\n this.addItemToOfflineTracking({\n item: parameters,\n storage: offlineTrackingStorage,\n isExperiment: false,\n onSuccess: cleanup,\n });\n }\n }\n\n static getNonce(): string {\n const hexLength = HEX_CHARACTERS.length;\n let nonce: string = '';\n\n for (let i = 0; i < hexLength; i++) {\n const randomNumber = Math.floor(Math.random() * hexLength);\n nonce += HEX_CHARACTERS.substring(randomNumber, randomNumber + 1);\n }\n\n return nonce;\n }\n\n static compareSemVer({\n version,\n compareVersion,\n operator,\n }: {\n version: string;\n compareVersion: string;\n operator: VersionMatchType;\n }): Result<boolean, KameleoonError> {\n const versionResult = this.validateVersion(version);\n const compareVersionResult = this.validateVersion(compareVersion);\n\n if (!versionResult.ok) {\n return Err(versionResult.error);\n }\n\n if (!compareVersionResult.ok) {\n return Err(compareVersionResult.error);\n }\n\n const [major, minor, patch] = versionResult.data;\n const [compareMajor, compareMinor, comparePatch] =\n compareVersionResult.data;\n\n const [isMajorEqual, isMinorEqual, isPatchEqual] = [\n major === compareMajor,\n minor === compareMinor,\n patch === comparePatch,\n ];\n\n switch (operator) {\n case VersionMatchType.EQUAL:\n return Ok(isMajorEqual && isMinorEqual && isPatchEqual);\n case VersionMatchType.GREATER:\n return Ok(\n major > compareMajor ||\n (isMajorEqual && minor > compareMinor) ||\n (isMajorEqual && isMinorEqual && patch > comparePatch),\n );\n case VersionMatchType.LOWER:\n return Ok(\n major < compareMajor ||\n (isMajorEqual && minor < compareMinor) ||\n (isMajorEqual && isMinorEqual && patch < comparePatch),\n );\n default:\n exhaustCheck(operator);\n }\n }\n\n static generateRandomString(length: number): string {\n const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\n const randomCharacterArray: string[] = [];\n\n if (length < 0) {\n return '';\n }\n\n for (let i = 0; i < length; i++) {\n randomCharacterArray.push(\n characters[Math.floor(Math.random() * characters.length)],\n );\n }\n\n return randomCharacterArray.join('');\n }\n\n static async sendOfflineTracking({\n requester,\n storage,\n }: SendOfflineTrackingParametersType) {\n const readResult = storage.read();\n\n if (readResult.ok && readResult.data.requestParameters) {\n const { requestParameters } = readResult.data;\n const successfulTimestamps: number[] = [];\n\n // --- Note ---\n // `for..of` + `await` is used to make sure that failed requests are sent one by one\n // without risk of getting the same timestamp at the server, which might happen, for example,\n // with `.forEach` or `.map` starting requests in async callbacks at the same time\n for (const parameters of requestParameters) {\n const { timestamp, isExperiment, ...params } = parameters;\n let result: Result<boolean, void>;\n\n if (isExperiment) {\n result = await requester.trackExperiment(\n params as TrackExperimentParamsType,\n );\n } else {\n result = await requester.trackData(params as TrackDataParamsType);\n }\n\n result.ok && result.data && successfulTimestamps.push(timestamp);\n }\n\n this.deleteFromOfflineTracking({\n storage,\n timestamps: successfulTimestamps,\n });\n }\n }\n\n private static addItemToOfflineTracking({\n item,\n isExperiment,\n storage,\n onSuccess,\n }: AddToOfflineTrackingParametersType): void {\n const readResult = storage.read();\n\n const data = readResult.ok ? readResult.data : {};\n\n const { requestParameters } = data;\n\n const newItem = {\n ...item,\n timestamp: new Date().getTime(),\n isExperiment,\n };\n\n const newRequestParameters = requestParameters\n ? [...requestParameters, newItem]\n : [newItem];\n\n const writeResult = storage.write({\n requestParameters: newRequestParameters,\n });\n\n if (writeResult.ok && onSuccess) {\n onSuccess();\n }\n }\n\n private static deleteFromOfflineTracking({\n timestamps,\n storage,\n }: DeleteFromOfflineTrackingParametersType): void {\n const readResult = storage.read();\n\n if (readResult.ok) {\n const { requestParameters } = readResult.data;\n\n const newParameters = requestParameters?.filter(\n (item) => !timestamps.includes(item.timestamp),\n );\n\n storage.write({ requestParameters: newParameters });\n }\n }\n\n private static validateVersion(\n version: string,\n ): Result<[number, number, number], KameleoonError> {\n const versionParts = version.split('.').map((x) => parseInt(x, 10));\n\n while (versionParts.length < 3) {\n versionParts.push(0);\n }\n\n if (versionParts.some((item) => isNaN(item))) {\n return Err(\n new KameleoonError(KameleoonException.SemanticVersionParse, version),\n );\n }\n\n return Ok(versionParts.slice(0, 3) as [number, number, number]);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utilities.js","names":["Utilities","checkTargeting","a","segment","visitorCode","targetingData","experimentId","variationConfiguration","clientConfiguration","packageInfo","dataManager","conditionsData","firstLevel","length","Ok","Err","KameleoonError","KameleoonException","Initialization","variations","assignedVariationsResult","getStoredVariations","ok","data","targetingTree","getTree","trees","segments","ruleMap","hasTargetingType","TargetingType","SEGMENT","TARGET_FEATURE_FLAG","result","evaluate","variationData","sdkInfo","validateVisitorCode","VisitorCodeEmpty","VISITOR_CODE_MAX_LENGTH","VisitorCodeMaxLength","getDataUrl","updateUrl","url","shouldSendConversionData","type","KameleoonData","Conversion","isConsentProvided","nonce","UrlParameter","Nonce","getNonce","resultUrl","push","unsentData","getUnsentData","size","item","values","Array","isArray","forEach","arrayItem","join","getVariationDataUrlAndSentExperimentIds","variationDataUrlList","sentExperimentIds","Set","isTargetedRule","UrlEventType","Experiment","Id","VariationId","variationId","add","variationDataUrl","experimentIds","from","trackFeatureExperiment","featureFlagVariation","requester","isOfflineModeOn","offlineTrackingStorage","rule","userAgent","getUserAgent","dataUrl","parameters","isUnallocated","trackExperiment","clearUnsentData","clearUnsentDataByKey","markUnsentDataAsSent","addItemToOfflineTracking","storage","isExperiment","convertTimeUnit","time","timeUnit","timeMap","TimeUnit","Minute","Milliseconds","Hour","Day","Week","Month","parseFeatureVariable","variable","key","value","VariableType","BOOLEAN","STRING","NUMBER","numberValue","Number","isNaN","NumberParse","JSON","jsonValue","parse","err","JSONParse","exhaustCheck","parseVisitorData","filters","currentVisit","previousVisits","browser","browserFilter","customData","customDataFilter","operatingSystem","operatingSystemFilter","conversions","conversionsFilter","device","deviceFilter","geolocation","geolocationFilter","experiments","experimentsFilter","pageViews","pageViewFilter","visits","resultData","PageView","_listFromVisits","Browser","_fromVisits","experimentData","i","visit","experimentEvents","experimentEvent","id","isSent","updateStoredVariations","Device","GeolocationData","CustomData","OperatingSystem","visitsData","collectedVisitsData","VisitsData","_fromRemoteVisits","visitorData","parseRegExp","_","expression","flags","split","RegExp","storedData","storedTargetingData","userAgentData","UserAgent","isCustomData","dataItem","insertInOrderedListMutably","list","element","order","includes","index","findIndex","Order","Ascending","splice","updateCache","cacheManager","cacheData","getAliveItem","newCacheData","_objectSpread","expirationTime","Date","now","CACHE_ITEM_LIFETIME","Second","lifetime","getTrackingCode","trackingCache","resultString","updatedCacheData","Object","entries","concat","trackData","isMappingIdentifier","sendOfflineTracking","body","cleanup","onSuccess","hexLength","HEX_CHARACTERS","randomNumber","Math","floor","random","substring","compareSemVer","version","compareVersion","operator","versionResult","validateVersion","compareVersionResult","error","major","minor","patch","compareMajor","compareMinor","comparePatch","isMajorEqual","isMinorEqual","isPatchEqual","VersionMatchType","EQUAL","GREATER","LOWER","generateRandomString","characters","randomCharacterArray","readResult","read","requestParameters","successfulTimestamps","timestamp","params","_objectWithoutProperties","_excluded","deleteFromOfflineTracking","timestamps","newItem","getTime","newRequestParameters","writeResult","write","newParameters","filter","versionParts","map","x","parseInt","some","SemanticVersionParse","slice","exports"],"sources":["../../src/utilities/utilities.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport {\n KameleoonError,\n KameleoonException,\n exhaustCheck,\n} from 'src/kameleoonError';\nimport {\n FeatureVariableResultType,\n Milliseconds,\n TrackingCacheItemType,\n VariableType,\n} from 'src/types';\nimport { FeatureVariableType, JSONType } from 'src/clientConfiguration';\nimport {\n Browser,\n Conversion,\n CustomData,\n DataManager,\n Device,\n GeolocationData,\n KameleoonData,\n KameleoonDataType,\n OperatingSystem,\n PageView,\n VisitsData,\n} from 'src/kameleoonData';\nimport { CACHE_ITEM_LIFETIME } from 'src/constants';\nimport { CacheManager } from 'src/cacheManager';\nimport {\n TrackExperimentParamsType,\n TrackDataParamsType,\n VisitType,\n UrlParameter,\n UrlEventType,\n} from 'src/requester';\nimport { VersionMatchType, TargetingType } from 'src/targeting';\nimport { KameleoonVisitorDataType } from 'src/kameleoonData/types';\nimport { FeatureFlagVariationsType } from 'src/storage/types';\nimport { VISITOR_CODE_MAX_LENGTH, HEX_CHARACTERS } from './constants';\nimport {\n CheckTargetingParametersType,\n ManageCacheParametersType,\n TrackDataParametersType,\n TrackRuleParametersType,\n AddToOfflineTrackingParametersType,\n SendOfflineTrackingParametersType,\n DeleteFromOfflineTrackingParametersType,\n ParseVisitorDataParametersType,\n InsertInOrderedListParametersType,\n Order,\n TimeUnit,\n GetDataUrlParametersType,\n GetVariationDataUrlParametersType,\n ParseVisitorDataResultType,\n} from './types';\n\nexport class Utilities {\n static checkTargeting({\n segment,\n visitorCode,\n targetingData,\n experimentId,\n variationConfiguration,\n clientConfiguration,\n packageInfo,\n dataManager,\n }: CheckTargetingParametersType): Result<boolean, KameleoonError> {\n if (!segment || !segment.conditionsData.firstLevel.length) {\n return Ok(true);\n }\n\n if (!variationConfiguration) {\n return Err(new KameleoonError(KameleoonException.Initialization));\n }\n\n let variations: FeatureFlagVariationsType = {};\n\n const assignedVariationsResult =\n variationConfiguration.getStoredVariations(visitorCode);\n\n if (assignedVariationsResult.ok) {\n variations = assignedVariationsResult.data;\n }\n\n const targetingTree = dataManager.getTree(segment);\n\n let trees = undefined;\n let segments = undefined;\n let ruleMap = undefined;\n\n // --- Note ---\n // Only getting trees and segments targeting type\n if (targetingTree.hasTargetingType(TargetingType.SEGMENT)) {\n trees = dataManager.trees;\n segments = clientConfiguration.segments;\n }\n\n // --- Note ---\n // Only constructing rule map for targeting type\n if (targetingTree.hasTargetingType(TargetingType.TARGET_FEATURE_FLAG)) {\n ruleMap = clientConfiguration.ruleMap;\n }\n\n const result = targetingTree.evaluate({\n variationData: variations,\n sdkInfo: packageInfo,\n segments,\n ruleMap,\n trees,\n targetingData,\n experimentId,\n visitorCode,\n });\n\n return result;\n }\n\n static validateVisitorCode(\n visitorCode: string,\n ): Result<void, KameleoonError> {\n if (visitorCode.length === 0) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeEmpty));\n }\n\n if (visitorCode.length > VISITOR_CODE_MAX_LENGTH) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeMaxLength));\n }\n\n return Ok();\n }\n\n static getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n }: GetDataUrlParametersType): string {\n const unsentData = dataManager.getUnsentData(visitorCode);\n const resultUrl: string[] = [];\n\n if (!unsentData || !unsentData.size) {\n return '';\n }\n\n function updateUrl(data: KameleoonDataType): void {\n if (!data.url) {\n return;\n }\n\n const shouldSendAllData = isConsentProvided;\n const shouldSendConversionData =\n data.data.type === KameleoonData.Conversion;\n\n if (shouldSendAllData || shouldSendConversionData) {\n const nonce = !shouldSendConversionData\n ? UrlParameter.Nonce + Utilities.getNonce()\n : '';\n resultUrl.push(data.url + nonce + '\\n');\n }\n }\n\n for (const item of unsentData.values()) {\n if (Array.isArray(item)) {\n item.forEach((arrayItem) => updateUrl(arrayItem));\n } else {\n updateUrl(item);\n }\n }\n\n return resultUrl.join('');\n }\n\n static getVariationDataUrlAndSentExperimentIds({\n visitorCode,\n isConsentProvided,\n variationConfiguration,\n }: GetVariationDataUrlParametersType): [string, string[]] {\n const variationDataUrlList: string[] = [];\n const sentExperimentIds = new Set<string>();\n const unsentData = variationConfiguration.getUnsentData(visitorCode);\n\n if (unsentData.ok && unsentData.data.length) {\n unsentData.data.forEach((item) => {\n if (item.isTargetedRule || isConsentProvided) {\n variationDataUrlList.push(\n UrlEventType.Experiment +\n UrlParameter.Id +\n item.experimentId +\n UrlParameter.VariationId +\n item.variationId +\n UrlParameter.Nonce +\n Utilities.getNonce() +\n '\\n',\n );\n\n sentExperimentIds.add(String(item.experimentId));\n }\n });\n }\n\n const variationDataUrl = variationDataUrlList.join('');\n const experimentIds = Array.from(sentExperimentIds);\n\n return [variationDataUrl, experimentIds];\n }\n\n static async trackFeatureExperiment({\n featureFlagVariation,\n dataManager,\n visitorCode,\n requester,\n isOfflineModeOn,\n isConsentProvided,\n offlineTrackingStorage,\n variationConfiguration,\n }: TrackRuleParametersType): Promise<void> {\n const { variationId, rule } = featureFlagVariation;\n\n const userAgent = this.getUserAgent(visitorCode, dataManager);\n\n const dataUrl = this.getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n });\n\n const resultVariationId = variationId || 0;\n\n // --- Note ---\n // Experiment id is not needed for unallocated visitors\n // So we just use 0 as a fallback\n const experimentId = rule ? rule.experimentId : 0;\n\n const [variationDataUrl, sentExperimentIds] =\n this.getVariationDataUrlAndSentExperimentIds({\n visitorCode,\n isConsentProvided,\n variationConfiguration,\n });\n\n if (!isConsentProvided && !dataUrl && !rule) {\n return;\n }\n\n const isUnallocated = variationId === null;\n\n const parameters = {\n visitorCode,\n dataUrl,\n variationDataUrl,\n experimentId,\n variationId: resultVariationId,\n userAgent,\n isUnallocated,\n };\n\n const result = await requester.trackExperiment(parameters);\n\n if (result.ok) {\n if (!isConsentProvided) {\n dataManager.clearUnsentDataByKey(visitorCode, KameleoonData.Conversion);\n } else {\n dataManager.clearUnsentData(visitorCode);\n }\n\n sentExperimentIds.forEach((experimentId) => {\n variationConfiguration.markUnsentDataAsSent(visitorCode, experimentId);\n });\n }\n\n if (!result.ok && isOfflineModeOn) {\n this.addItemToOfflineTracking({\n item: parameters,\n storage: offlineTrackingStorage,\n isExperiment: true,\n });\n }\n }\n\n static convertTimeUnit(time: number, timeUnit: TimeUnit): number {\n const timeMap = {\n [TimeUnit.Minute]: Milliseconds.Minute,\n [TimeUnit.Hour]: Milliseconds.Hour,\n [TimeUnit.Day]: Milliseconds.Day,\n [TimeUnit.Week]: Milliseconds.Week,\n [TimeUnit.Month]: Milliseconds.Month,\n };\n\n return time / timeMap[timeUnit];\n }\n\n static parseFeatureVariable(\n variable: FeatureVariableType,\n ): Result<FeatureVariableResultType, KameleoonError> {\n const { key, type, value } = variable;\n\n switch (type) {\n case VariableType.BOOLEAN:\n return Ok({\n key,\n type,\n value: Boolean(value),\n });\n case VariableType.STRING:\n return Ok({\n key,\n type,\n value: String(value),\n });\n case VariableType.NUMBER:\n const numberValue = Number(value);\n\n if (Number.isNaN(numberValue)) {\n return Err(\n new KameleoonError(KameleoonException.NumberParse, String(value)),\n );\n }\n\n return Ok({\n key,\n type,\n value: numberValue,\n });\n case VariableType.JSON:\n try {\n const jsonValue: JSONType = JSON.parse(String(variable.value));\n\n return Ok({\n key,\n type,\n value: jsonValue,\n });\n } catch (err) {\n return Err(new KameleoonError(KameleoonException.JSONParse, err));\n }\n default:\n exhaustCheck(type);\n }\n }\n\n static parseVisitorData({\n data,\n filters,\n visitorCode,\n variationConfiguration,\n }: ParseVisitorDataParametersType): ParseVisitorDataResultType {\n const { currentVisit, previousVisits } = data;\n const {\n browser: browserFilter,\n customData: customDataFilter,\n operatingSystem: operatingSystemFilter,\n conversions: conversionsFilter,\n device: deviceFilter,\n geolocation: geolocationFilter,\n experiments: experimentsFilter,\n pageViews: pageViewFilter,\n } = filters;\n\n let visits: VisitType[] = [];\n\n if (currentVisit) {\n visits.push(currentVisit);\n }\n\n if (previousVisits) {\n visits.push(...previousVisits);\n }\n\n if (!visits) {\n return { visitorData: [] };\n }\n\n const resultData: KameleoonDataType[] = [];\n\n if (pageViewFilter) {\n const pageViews = PageView._listFromVisits(visits);\n\n if (pageViews.length) {\n resultData.push(...pageViews);\n }\n }\n\n // --- Browser ---\n if (browserFilter) {\n const browser = Browser._fromVisits(visits);\n\n if (browser) {\n resultData.push(browser);\n }\n }\n\n // --- Experiments ---\n if (experimentsFilter) {\n const experimentData: FeatureFlagVariationsType = {};\n\n // --- Note ---\n // Going backwards to get the latest experiment data\n for (let i = visits.length - 1; i >= 0; i--) {\n const visit = visits[i];\n\n if (!visit.experimentEvents) {\n continue;\n }\n\n for (const experimentEvent of visit.experimentEvents) {\n const { id, variationId } = experimentEvent.data;\n\n experimentData[id] = {\n variationId,\n isTargetedRule: false,\n isSent: false,\n };\n }\n }\n\n variationConfiguration.updateStoredVariations(\n visitorCode,\n experimentData,\n );\n }\n\n // --- Device ---\n if (deviceFilter) {\n const device = Device._fromVisits(visits);\n\n if (device) {\n resultData.push(device);\n }\n }\n\n // --- Geolocation ---\n if (geolocationFilter) {\n const geolocation = GeolocationData._fromVisits(visits);\n\n if (geolocation) {\n resultData.push(geolocation);\n }\n }\n\n // --- Custom data ---\n if (customDataFilter) {\n resultData.push(...CustomData._listFromVisits(visits));\n }\n\n // --- Operating system ---\n if (operatingSystemFilter) {\n const operatingSystem = OperatingSystem._fromVisits(visits);\n\n if (operatingSystem) {\n resultData.push(operatingSystem);\n }\n }\n\n // --- Conversions ---\n if (conversionsFilter) {\n resultData.push(...Conversion._listFromVisits(visits));\n }\n\n // --- Visits ---\n let visitsData: VisitsData | undefined;\n\n const collectedVisitsData = VisitsData._fromRemoteVisits(\n visits,\n Boolean(currentVisit),\n );\n\n if (collectedVisitsData) {\n visitsData = collectedVisitsData;\n }\n\n return { visitorData: resultData, visitsData };\n }\n\n static parseRegExp(value: string): RegExp {\n if (value[0] === '/') {\n const [_, expression, flags] = value.split('/');\n\n return new RegExp(expression, flags);\n }\n\n return new RegExp(value);\n }\n\n static getUserAgent(\n visitorCode: string,\n dataManager: DataManager,\n ): string | undefined {\n const storedData = dataManager.storedTargetingData;\n\n const targetingData: KameleoonVisitorDataType | undefined =\n storedData && storedData[visitorCode];\n\n if (targetingData) {\n const userAgentData = targetingData[KameleoonData.UserAgent];\n\n if (userAgentData) {\n return userAgentData.value;\n }\n }\n\n return undefined;\n }\n\n static isCustomData(dataItem: KameleoonDataType): dataItem is CustomData {\n return dataItem.data.type === KameleoonData.CustomData;\n }\n\n /**\n * Insert element in ordered list, if element already exists in list, does nothing\n * @param list - list to insert element\n * @param element - element to insert\n * @param order - order of list\n */\n static insertInOrderedListMutably({\n list,\n element,\n order,\n }: InsertInOrderedListParametersType): void {\n if (list.includes(element)) {\n return;\n }\n\n const index = list.findIndex((item) =>\n order === Order.Ascending ? item >= element : item <= element,\n );\n\n if (index === -1) {\n list.push(element);\n } else {\n list.splice(index, 0, element);\n }\n }\n\n static updateCache({\n cacheManager,\n visitorCode,\n experimentId,\n variationId,\n }: ManageCacheParametersType): void {\n const cacheData = cacheManager.getAliveItem(visitorCode);\n\n const newCacheData = cacheData ? { ...cacheData } : {};\n\n newCacheData[experimentId] = {\n variationId,\n expirationTime: Date.now() + CACHE_ITEM_LIFETIME * Milliseconds.Second,\n };\n\n cacheManager.add({\n key: visitorCode,\n data: newCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n }\n\n static getTrackingCode(\n trackingCache: CacheManager<TrackingCacheItemType>,\n visitorCode: string,\n ): string {\n let resultString = 'window.kameleoonQueue=window.kameleoonQueue||[];';\n\n const cacheData = trackingCache.getAliveItem(visitorCode);\n\n if (!cacheData) {\n return resultString;\n }\n\n const updatedCacheData: TrackingCacheItemType = {};\n\n Object.entries(cacheData).forEach(\n ([experimentId, { variationId, expirationTime }]) => {\n if (expirationTime > Date.now()) {\n resultString += `window.kameleoonQueue.push(['Experiments.assignVariation',${experimentId},${variationId}]);`;\n resultString += `window.kameleoonQueue.push(['Experiments.trigger',${experimentId},true]);`;\n\n updatedCacheData[Number(experimentId)] = {\n variationId,\n expirationTime,\n };\n }\n },\n );\n\n // --- Note ---\n // Cache is updated with only alive experiments\n trackingCache.add({\n key: visitorCode,\n data: updatedCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n\n return resultString;\n }\n\n static async trackData({\n visitorCode,\n dataManager,\n requester,\n isOfflineModeOn,\n offlineTrackingStorage,\n isConsentProvided,\n isMappingIdentifier,\n }: TrackDataParametersType): Promise<void> {\n await this.sendOfflineTracking({\n requester,\n storage: offlineTrackingStorage,\n });\n\n const dataUrl = this.getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n });\n\n if (!isConsentProvided && !dataUrl) {\n return;\n }\n\n const userAgent = this.getUserAgent(visitorCode, dataManager);\n\n const parameters: TrackDataParamsType = {\n visitorCode,\n body: dataUrl,\n userAgent,\n isMappingIdentifier,\n };\n\n const result = await requester.trackData(parameters);\n\n const cleanup = () =>\n isConsentProvided\n ? dataManager.clearUnsentData(visitorCode)\n : dataManager.clearUnsentDataByKey(\n visitorCode,\n KameleoonData.Conversion,\n );\n\n if (result.ok) {\n cleanup();\n }\n\n if (!result.ok && isOfflineModeOn) {\n this.addItemToOfflineTracking({\n item: parameters,\n storage: offlineTrackingStorage,\n isExperiment: false,\n onSuccess: cleanup,\n });\n }\n }\n\n static getNonce(): string {\n const hexLength = HEX_CHARACTERS.length;\n let nonce: string = '';\n\n for (let i = 0; i < hexLength; i++) {\n const randomNumber = Math.floor(Math.random() * hexLength);\n nonce += HEX_CHARACTERS.substring(randomNumber, randomNumber + 1);\n }\n\n return nonce;\n }\n\n static compareSemVer({\n version,\n compareVersion,\n operator,\n }: {\n version: string;\n compareVersion: string;\n operator: VersionMatchType;\n }): Result<boolean, KameleoonError> {\n const versionResult = this.validateVersion(version);\n const compareVersionResult = this.validateVersion(compareVersion);\n\n if (!versionResult.ok) {\n return Err(versionResult.error);\n }\n\n if (!compareVersionResult.ok) {\n return Err(compareVersionResult.error);\n }\n\n const [major, minor, patch] = versionResult.data;\n const [compareMajor, compareMinor, comparePatch] =\n compareVersionResult.data;\n\n const [isMajorEqual, isMinorEqual, isPatchEqual] = [\n major === compareMajor,\n minor === compareMinor,\n patch === comparePatch,\n ];\n\n switch (operator) {\n case VersionMatchType.EQUAL:\n return Ok(isMajorEqual && isMinorEqual && isPatchEqual);\n case VersionMatchType.GREATER:\n return Ok(\n major > compareMajor ||\n (isMajorEqual && minor > compareMinor) ||\n (isMajorEqual && isMinorEqual && patch > comparePatch),\n );\n case VersionMatchType.LOWER:\n return Ok(\n major < compareMajor ||\n (isMajorEqual && minor < compareMinor) ||\n (isMajorEqual && isMinorEqual && patch < comparePatch),\n );\n default:\n exhaustCheck(operator);\n }\n }\n\n static generateRandomString(length: number): string {\n const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\n const randomCharacterArray: string[] = [];\n\n if (length < 0) {\n return '';\n }\n\n for (let i = 0; i < length; i++) {\n randomCharacterArray.push(\n characters[Math.floor(Math.random() * characters.length)],\n );\n }\n\n return randomCharacterArray.join('');\n }\n\n static async sendOfflineTracking({\n requester,\n storage,\n }: SendOfflineTrackingParametersType) {\n const readResult = storage.read();\n\n if (readResult.ok && readResult.data.requestParameters) {\n const { requestParameters } = readResult.data;\n const successfulTimestamps: number[] = [];\n\n // --- Note ---\n // `for..of` + `await` is used to make sure that failed requests are sent one by one\n // without risk of getting the same timestamp at the server, which might happen, for example,\n // with `.forEach` or `.map` starting requests in async callbacks at the same time\n for (const parameters of requestParameters) {\n const { timestamp, isExperiment, ...params } = parameters;\n let result: Result<boolean, void>;\n\n if (isExperiment) {\n result = await requester.trackExperiment(\n params as TrackExperimentParamsType,\n );\n } else {\n result = await requester.trackData(params as TrackDataParamsType);\n }\n\n result.ok && result.data && successfulTimestamps.push(timestamp);\n }\n\n this.deleteFromOfflineTracking({\n storage,\n timestamps: successfulTimestamps,\n });\n }\n }\n\n private static addItemToOfflineTracking({\n item,\n isExperiment,\n storage,\n onSuccess,\n }: AddToOfflineTrackingParametersType): void {\n const readResult = storage.read();\n\n const data = readResult.ok ? readResult.data : {};\n\n const { requestParameters } = data;\n\n const newItem = {\n ...item,\n timestamp: new Date().getTime(),\n isExperiment,\n };\n\n const newRequestParameters = requestParameters\n ? [...requestParameters, newItem]\n : [newItem];\n\n const writeResult = storage.write({\n requestParameters: newRequestParameters,\n });\n\n if (writeResult.ok && onSuccess) {\n onSuccess();\n }\n }\n\n private static deleteFromOfflineTracking({\n timestamps,\n storage,\n }: DeleteFromOfflineTrackingParametersType): void {\n const readResult = storage.read();\n\n if (readResult.ok) {\n const { requestParameters } = readResult.data;\n\n const newParameters = requestParameters?.filter(\n (item) => !timestamps.includes(item.timestamp),\n );\n\n storage.write({ requestParameters: newParameters });\n }\n }\n\n private static validateVersion(\n version: string,\n ): Result<[number, number, number], KameleoonError> {\n const versionParts = version.split('.').map((x) => parseInt(x, 10));\n\n while (versionParts.length < 3) {\n versionParts.push(0);\n }\n\n if (versionParts.some((item) => isNaN(item))) {\n return Err(\n new KameleoonError(KameleoonException.SemanticVersionParse, version),\n );\n }\n\n return Ok(versionParts.slice(0, 3) as [number, number, number]);\n }\n}\n"],"mappings":"4+DAwDO,KAAM,CAAAA,SAAU,CACrB,MAAO,CAAAC,cAAcA,CAAAC,CAAA,CAS6C,IAT5C,CACpBC,OAAO,CAAPA,CAAO,CACPC,WAAW,CAAXA,CAAW,CACXC,aAAa,CAAbA,CAAa,CACbC,YAAY,CAAZA,CAAY,CACZC,sBAAsB,CAAtBA,CAAsB,CACtBC,mBAAmB,CAAnBA,CAAmB,CACnBC,WAAW,CAAXA,CAAW,CACXC,WAAW,CAAXA,CAC4B,CAAC,CAAAR,CAAA,CAC7B,GAAI,CAACC,CAAO,EAAI,CAACA,CAAO,CAACQ,cAAc,CAACC,UAAU,CAACC,MAAM,CACvD,MAAO,GAAAC,SAAE,IAAK,CAAC,CAGjB,GAAI,CAACP,CAAsB,CACzB,MAAO,GAAAQ,UAAG,EAAC,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAACC,cAAc,CAAC,CAAC,CAGnE,GAAI,CAAAC,CAAqC,CAAG,CAAC,CAAC,CAE9C,KAAM,CAAAC,CAAwB,CAC5Bb,CAAsB,CAACc,mBAAmB,CAACjB,CAAW,CAAC,CAErDgB,CAAwB,CAACE,EAAE,GAC7BH,CAAU,CAAGC,CAAwB,CAACG,IAAI,EAG5C,KAAM,CAAAC,CAAa,CAAGd,CAAW,CAACe,OAAO,CAACtB,CAAO,CAAC,CAAC,GAE/C,CAAAuB,CAAiB,CACjBC,CAAoB,CACpBC,CAAmB,CAInBJ,CAAa,CAACK,gBAAgB,CAACC,wBAAa,CAACC,OAAO,CAAC,GACvDL,CAAK,CAAGhB,CAAW,CAACgB,KAAK,CACzBC,CAAQ,CAAGnB,CAAmB,CAACmB,QAAQ,EAKrCH,CAAa,CAACK,gBAAgB,CAACC,wBAAa,CAACE,mBAAmB,CAAC,GACnEJ,CAAO,CAAGpB,CAAmB,CAACoB,OAAO,EAGvC,KAAM,CAAAK,CAAM,CAAGT,CAAa,CAACU,QAAQ,CAAC,CACpCC,aAAa,CAAEhB,CAAU,CACzBiB,OAAO,CAAE3B,CAAW,CACpBkB,QAAQ,CAARA,CAAQ,CACRC,OAAO,CAAPA,CAAO,CACPF,KAAK,CAALA,CAAK,CACLrB,aAAa,CAAbA,CAAa,CACbC,YAAY,CAAZA,CAAY,CACZF,WAAW,CAAXA,CACF,CAAC,CAAC,CAEF,MAAO,CAAA6B,CACT,CAEA,MAAO,CAAAI,mBAAmBA,CACxBjC,CAAmB,CACW,OACH,EAAC,GAAxBA,CAAW,CAACS,MAAY,CACnB,GAAAE,UAAG,EAAC,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAACqB,gBAAgB,CAAC,CAAC,CAGjElC,CAAW,CAACS,MAAM,CAAG0B,mCAAuB,CACvC,GAAAxB,UAAG,EAAC,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAACuB,oBAAoB,CAAC,CAAC,CAGlE,GAAA1B,SAAE,EAAC,CACZ,CAEA,MAAO,CAAA2B,UAAUA,CAAAvC,CAAA,CAIoB,CAQnC,QAAS,CAAAwC,CAASA,CAACnB,CAAuB,CAAQ,CAChD,GAAI,CAACA,CAAI,CAACoB,GAAG,CACX,OACD,KAGK,CAAAC,CAAwB,CAC5BrB,CAAI,CAACA,IAAI,CAACsB,IAAI,GAAKC,4BAAa,CAACC,UAAU,CAE7C,GAJ0BC,CAAiB,EAIlBJ,CAAwB,CAAE,CACjD,KAAM,CAAAK,CAAK,CAAIL,CAAwB,CAEnC,EAAE,CADFM,uBAAY,CAACC,KAAK,CAAGnD,SAAS,CAACoD,QAAQ,CAAC,CACtC,CACNC,CAAS,CAACC,IAAI,CAAC/B,CAAI,CAACoB,GAAG,CAAGM,CAAK,CAAG,IAAI,CACxC,CACF,CAAC,GA3Be,CAChB7C,WAAW,CAAXA,CAAW,CACXM,WAAW,CAAXA,CAAW,CACXsC,iBAAiB,CAAjBA,CACwB,CAAC,CAAA9C,CAAA,MACnB,CAAAqD,CAAU,CAAG7C,CAAW,CAAC8C,aAAa,CAACpD,CAAW,CAAC,CACnDiD,CAAmB,CAAG,EAAE,CAE9B,GAAI,CAACE,CAAU,EAAI,CAACA,CAAU,CAACE,IAAI,CACjC,MAAO,EAAE,CAoBX,IAAK,KAAM,CAAAC,CAAI,GAAI,CAAAH,CAAU,CAACI,MAAM,CAAC,CAAC,CAChCC,KAAK,CAACC,OAAO,CAACH,CAAI,CAAC,CACrBA,CAAI,CAACI,OAAO,CAAEC,CAAS,EAAKrB,CAAS,CAACqB,CAAS,CAAC,CAAC,CAEjDrB,CAAS,CAACgB,CAAI,CAAC,CAInB,MAAO,CAAAL,CAAS,CAACW,IAAI,CAAC,EAAE,CAC1B,CAEA,MAAO,CAAAC,uCAAuCA,CAAA/D,CAAA,CAIY,IAJX,CAC7CE,WAAW,CAAXA,CAAW,CACX4C,iBAAiB,CAAjBA,CAAiB,CACjBzC,sBAAsB,CAAtBA,CACiC,CAAC,CAAAL,CAAA,MAC5B,CAAAgE,CAA8B,CAAG,EAAE,CACnCC,CAAiB,CAAG,GAAI,CAAAC,GAAa,CACrCb,CAAU,CAAGhD,CAAsB,CAACiD,aAAa,CAACpD,CAAW,CAAC,CAEhEmD,CAAU,CAACjC,EAAE,EAAIiC,CAAU,CAAChC,IAAI,CAACV,MAAM,EACzC0C,CAAU,CAAChC,IAAI,CAACuC,OAAO,CAAEJ,CAAI,EAAK,EAC5BA,CAAI,CAACW,cAAc,EAAIrB,CAAiB,IAC1CkB,CAAoB,CAACZ,IAAI,CACvBgB,uBAAY,CAACC,UAAU,CACrBrB,uBAAY,CAACsB,EAAE,CACfd,CAAI,CAACpD,YAAY,CACjB4C,uBAAY,CAACuB,WAAW,CACxBf,CAAI,CAACgB,WAAW,CAChBxB,uBAAY,CAACC,KAAK,CAClBnD,SAAS,CAACoD,QAAQ,CAAC,CAAC,CACpB,IACJ,CAAC,CAEDe,CAAiB,CAACQ,GAAG,CAAQjB,CAAI,CAACpD,YAAY,GAAC,CAAC,CAEpD,CAAC,CAAC,MAGE,CAAAsE,CAAgB,CAAGV,CAAoB,CAACF,IAAI,CAAC,EAAE,CAAC,CAChDa,CAAa,CAAGjB,KAAK,CAACkB,IAAI,CAACX,CAAiB,CAAC,CAEnD,MAAO,CAACS,CAAgB,CAAEC,CAAa,CACzC,CAEA,YAAa,CAAAE,sBAAsBA,CAAA7E,CAAA,CASQ,IATP,CAClC8E,oBAAoB,CAApBA,CAAoB,CACpBtE,WAAW,CAAXA,CAAW,CACXN,WAAW,CAAXA,CAAW,CACX6E,SAAS,CAATA,CAAS,CACTC,eAAe,CAAfA,CAAe,CACflC,iBAAiB,CAAjBA,CAAiB,CACjBmC,sBAAsB,CAAtBA,CAAsB,CACtB5E,sBAAsB,CAAtBA,CACuB,CAAC,CAAAL,CAAA,MAClB,CAAEwE,WAAW,CAAXA,CAAW,CAAEU,IAAI,CAAJA,CAAK,CAAC,CAAGJ,CAAoB,CAE5CK,CAAS,CAAG,IAAI,CAACC,YAAY,CAAClF,CAAW,CAAEM,CAAW,CAAC,CAEvD6E,CAAO,CAAG,IAAI,CAAC9C,UAAU,CAAC,CAC9BrC,WAAW,CAAXA,CAAW,CACXM,WAAW,CAAXA,CAAW,CACXsC,iBAAiB,CAAjBA,CACF,CAAC,CAAC,CAOI1C,CAAY,CAAG8E,CAAI,CAAGA,CAAI,CAAC9E,YAAY,CAAG,CAAC,CAE3C,CAACsE,CAAgB,CAAET,CAAiB,CAAC,CACzC,IAAI,CAACF,uCAAuC,CAAC,CAC3C7D,WAAW,CAAXA,CAAW,CACX4C,iBAAiB,CAAjBA,CAAiB,CACjBzC,sBAAsB,CAAtBA,CACF,CAAC,CAAC,CAEJ,GAAI,CAACyC,CAAiB,EAAI,CAACuC,CAAO,EAAI,CAACH,CAAI,CACzC,OACD,KAIK,CAAAI,CAAU,CAAG,CACjBpF,WAAW,CAAXA,CAAW,CACXmF,OAAO,CAAPA,CAAO,CACPX,gBAAgB,CAAhBA,CAAgB,CAChBtE,YAAY,CAAZA,CAAY,CACZoE,WAAW,CAzBaA,CAAW,EAAI,CAyBT,CAC9BW,SAAS,CAATA,CAAS,CACTI,aAAa,CATuB,IAAI,GAApBf,CAUtB,CAAC,CAEKzC,CAAM,CAAG,KAAM,CAAAgD,CAAS,CAACS,eAAe,CAACF,CAAU,CAAC,CAEtDvD,CAAM,CAACX,EAAE,GACN0B,CAAiB,CAGpBtC,CAAW,CAACiF,eAAe,CAACvF,CAAW,CAAC,CAFxCM,CAAW,CAACkF,oBAAoB,CAACxF,CAAW,CAAE0C,4BAAa,CAACC,UAAU,CAAC,CAKzEoB,CAAiB,CAACL,OAAO,CAAExD,CAAY,EAAK,CAC1CC,CAAsB,CAACsF,oBAAoB,CAACzF,CAAW,CAAEE,CAAY,CACvE,CAAC,CAAC,EAGA,CAAC2B,CAAM,CAACX,EAAE,EAAI4D,CAAe,EAC/B,IAAI,CAACY,wBAAwB,CAAC,CAC5BpC,IAAI,CAAE8B,CAAU,CAChBO,OAAO,CAAEZ,CAAsB,CAC/Ba,YAAY,GACd,CAAC,CAEL,CAEA,MAAO,CAAAC,eAAeA,CAACC,CAAY,CAAEC,CAAkB,CAAU,CAC/D,KAAM,CAAAC,CAAO,CAAG,CACd,CAACC,gBAAQ,CAACC,MAAM,EAAGC,mBAAY,CAACD,MAAM,CACtC,CAACD,gBAAQ,CAACG,IAAI,EAAGD,mBAAY,CAACC,IAAI,CAClC,CAACH,gBAAQ,CAACI,GAAG,EAAGF,mBAAY,CAACE,GAAG,CAChC,CAACJ,gBAAQ,CAACK,IAAI,EAAGH,mBAAY,CAACG,IAAI,CAClC,CAACL,gBAAQ,CAACM,KAAK,EAAGJ,mBAAY,CAACI,KACjC,CAAC,CAED,MAAO,CAAAT,CAAI,CAAGE,CAAO,CAACD,CAAQ,CAChC,CAEA,MAAO,CAAAS,oBAAoBA,CACzBC,CAA6B,CACsB,CACnD,KAAM,CAAEC,GAAG,CAAHA,CAAG,CAAEjE,IAAI,CAAJA,CAAI,CAAEkE,KAAK,CAALA,CAAM,CAAC,CAAGF,CAAQ,CAErC,OAAQhE,CAAI,EACV,IAAK,CAAAmE,mBAAY,CAACC,OAAO,CACvB,MAAO,GAAAnG,SAAE,EAAC,CACRgG,GAAG,CAAHA,CAAG,CACHjE,IAAI,CAAJA,CAAI,CACJkE,KAAK,GAAUA,CACjB,CAAC,CAAC,CACJ,IAAK,CAAAC,mBAAY,CAACE,MAAM,CACtB,MAAO,GAAApG,SAAE,EAAC,CACRgG,GAAG,CAAHA,CAAG,CACHjE,IAAI,CAAJA,CAAI,CACJkE,KAAK,CAASA,CAAK,GACrB,CAAC,CAAC,CACJ,IAAK,CAAAC,mBAAY,CAACG,MAAM,CACtB,KAAM,CAAAC,CAAW,EAAUL,CAAM,CAAC,MAE9B,CAAAM,MAAM,CAACC,KAAK,CAACF,CAAW,CAAC,CACpB,GAAArG,UAAG,EACR,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAACsG,WAAW,CAASR,CAAK,GAAC,CAClE,CAAC,CAGI,GAAAjG,SAAE,EAAC,CACRgG,GAAG,CAAHA,CAAG,CACHjE,IAAI,CAAJA,CAAI,CACJkE,KAAK,CAAEK,CACT,CAAC,CAAC,CACJ,IAAK,CAAAJ,mBAAY,CAACQ,IAAI,CACpB,GAAI,CACF,KAAM,CAAAC,CAAmB,CAAGD,IAAI,CAACE,KAAK,CAAQb,CAAQ,CAACE,KAAK,GAAC,CAAC,CAE9D,MAAO,GAAAjG,SAAE,EAAC,CACRgG,GAAG,CAAHA,CAAG,CACHjE,IAAI,CAAJA,CAAI,CACJkE,KAAK,CAAEU,CACT,CAAC,CACH,CAAE,MAAOE,CAAG,CAAE,CACZ,MAAO,GAAA5G,UAAG,EAAC,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAAC2G,SAAS,CAAED,CAAG,CAAC,CAClE,CACF,QACE,GAAAE,4BAAY,EAAChF,CAAI,CACrB,CACF,CAEA,MAAO,CAAAiF,gBAAgBA,CAAA5H,CAAA,CAKwC,IALvC,CACtBqB,IAAI,CAAJA,CAAI,CACJwG,OAAO,CAAPA,CAAO,CACP3H,WAAW,CAAXA,CAAW,CACXG,sBAAsB,CAAtBA,CAC8B,CAAC,CAAAL,CAAA,MACzB,CAAE8H,YAAY,CAAZA,CAAY,CAAEC,cAAc,CAAdA,CAAe,CAAC,CAAG1G,CAAI,CACvC,CACJ2G,OAAO,CAAEC,CAAa,CACtBC,UAAU,CAAEC,CAAgB,CAC5BC,eAAe,CAAEC,CAAqB,CACtCC,WAAW,CAAEC,CAAiB,CAC9BC,MAAM,CAAEC,CAAY,CACpBC,WAAW,CAAEC,CAAiB,CAC9BC,WAAW,CAAEC,CAAiB,CAC9BC,SAAS,CAAEC,CACb,CAAC,CAAGlB,CAAO,CAEX,GAAI,CAAAmB,CAAmB,CAAG,EAAE,CAExBlB,CAAY,EACdkB,CAAM,CAAC5F,IAAI,CAAC0E,CAAY,CAAC,CAGvBC,CAAc,EAChBiB,CAAM,CAAC5F,IAAI,CAAC,GAAG2E,CAAc,CAAC,CAOhC,KAAM,CAAAkB,CAA+B,CAAG,EAAE,CAE1C,GAAIF,CAAc,CAAE,CAClB,KAAM,CAAAD,CAAS,CAAGI,uBAAQ,CAACC,eAAe,CAACH,CAAM,CAAC,CAE9CF,CAAS,CAACnI,MAAM,EAClBsI,CAAU,CAAC7F,IAAI,CAAC,GAAG0F,CAAS,CAEhC,CAGA,GAAIb,CAAa,CAAE,CACjB,KAAM,CAAAD,CAAO,CAAGoB,sBAAO,CAACC,WAAW,CAACL,CAAM,CAAC,CAEvChB,CAAO,EACTiB,CAAU,CAAC7F,IAAI,CAAC4E,CAAO,CAE3B,CAGA,GAAIa,CAAiB,CAAE,CACrB,KAAM,CAAAS,CAAyC,CAAG,CAAC,CAAC,CAIpD,IAAK,GAAI,CAAAC,CAAC,CAAGP,CAAM,CAACrI,MAAM,CAAG,CAAC,CAAO,CAAC,EAAN4I,CAAM,CAAEA,CAAC,EAAE,CAAE,CAC3C,KAAM,CAAAC,CAAK,CAAGR,CAAM,CAACO,CAAC,CAAC,CAEvB,GAAKC,CAAK,CAACC,gBAAgB,CAI3B,IAAK,KAAM,CAAAC,CAAe,GAAI,CAAAF,CAAK,CAACC,gBAAgB,CAAE,CACpD,KAAM,CAAEE,EAAE,CAAFA,CAAE,CAAEnF,WAAW,CAAXA,CAAY,CAAC,CAAGkF,CAAe,CAACrI,IAAI,CAEhDiI,CAAc,CAACK,CAAE,CAAC,CAAG,CACnBnF,WAAW,CAAXA,CAAW,CACXL,cAAc,GAAO,CACrByF,MAAM,GACR,CACF,CACF,CAEAvJ,CAAsB,CAACwJ,sBAAsB,CAC3C3J,CAAW,CACXoJ,CACF,CACF,CAGA,GAAIb,CAAY,CAAE,CAChB,KAAM,CAAAD,CAAM,CAAGsB,qBAAM,CAACT,WAAW,CAACL,CAAM,CAAC,CAErCR,CAAM,EACRS,CAAU,CAAC7F,IAAI,CAACoF,CAAM,CAE1B,CAGA,GAAIG,CAAiB,CAAE,CACrB,KAAM,CAAAD,CAAW,CAAGqB,8BAAe,CAACV,WAAW,CAACL,CAAM,CAAC,CAEnDN,CAAW,EACbO,CAAU,CAAC7F,IAAI,CAACsF,CAAW,CAE/B,CAQA,GALIP,CAAgB,EAClBc,CAAU,CAAC7F,IAAI,CAAC,GAAG4G,yBAAU,CAACb,eAAe,CAACH,CAAM,CAAC,CAAC,CAIpDX,CAAqB,CAAE,CACzB,KAAM,CAAAD,CAAe,CAAG6B,8BAAe,CAACZ,WAAW,CAACL,CAAM,CAAC,CAEvDZ,CAAe,EACjBa,CAAU,CAAC7F,IAAI,CAACgF,CAAe,CAEnC,CAGIG,CAAiB,EACnBU,CAAU,CAAC7F,IAAI,CAAC,GAAGP,yBAAU,CAACsG,eAAe,CAACH,CAAM,CAAC,CAAC,CAIxD,GAAI,CAAAkB,CAAkC,CAEtC,KAAM,CAAAC,CAAmB,CAAGC,yBAAU,CAACC,iBAAiB,CACtDrB,CAAM,GACElB,CACV,CAAC,CAMD,MAJI,CAAAqC,CAAmB,GACrBD,CAAU,CAAGC,CAAmB,EAG3B,CAAEG,WAAW,CAAErB,CAAU,CAAEiB,UAAU,CAAVA,CAAW,CAC/C,CAEA,MAAO,CAAAK,WAAWA,CAAC1D,CAAa,CAAU,CACxC,GAAiB,GAAG,GAAhBA,CAAK,CAAC,CAAC,CAAS,CAAE,CACpB,KAAM,CAAC2D,CAAC,CAAEC,CAAU,CAAEC,CAAK,CAAC,CAAG7D,CAAK,CAAC8D,KAAK,CAAC,GAAG,CAAC,CAE/C,MAAO,IAAI,CAAAC,MAAM,CAACH,CAAU,CAAEC,CAAK,CACrC,CAEA,MAAO,IAAI,CAAAE,MAAM,CAAC/D,CAAK,CACzB,CAEA,MAAO,CAAAzB,YAAYA,CACjBlF,CAAmB,CACnBM,CAAwB,CACJ,MACd,CAAAqK,CAAU,CAAGrK,CAAW,CAACsK,mBAAmB,CAE5C3K,CAAmD,CACvD0K,CAAU,EAAIA,CAAU,CAAC3K,CAAW,CAAC,CAEvC,GAAIC,CAAa,CAAE,CACjB,KAAM,CAAA4K,CAAa,CAAG5K,CAAa,CAACyC,4BAAa,CAACoI,SAAS,CAAC,CAE5D,GAAID,CAAa,CACf,MAAO,CAAAA,CAAa,CAAClE,KAEzB,CAGF,CAEA,MAAO,CAAAoE,YAAYA,CAACC,CAA2B,CAA0B,CACvE,MAAO,CAAAA,CAAQ,CAAC7J,IAAI,CAACsB,IAAI,GAAKC,4BAAa,CAACoH,UAC9C,CAQA,MAAO,CAAAmB,0BAA0BA,CAAAnL,CAAA,CAIW,IAJV,CAChCoL,IAAI,CAAJA,CAAI,CACJC,OAAO,CAAPA,CAAO,CACPC,KAAK,CAALA,CACiC,CAAC,CAAAtL,CAAA,CAClC,IAAIoL,CAAI,CAACG,QAAQ,CAACF,CAAO,CAAC,EAI1B,KAAM,CAAAG,CAAK,CAAGJ,CAAI,CAACK,SAAS,CAAEjI,CAAI,EAChC8H,CAAK,GAAKI,aAAK,CAACC,SAAS,CAAGnI,CAAI,EAAI6H,CAAO,CAAG7H,CAAI,EAAI6H,CACxD,CAAC,CAEa,CAAC,CAAC,GAAZG,CAAY,CACdJ,CAAI,CAAChI,IAAI,CAACiI,CAAO,CAAC,CAElBD,CAAI,CAACQ,MAAM,CAACJ,CAAK,CAAE,CAAC,CAAEH,CAAO,CAAC,CAElC,CAEA,MAAO,CAAAQ,WAAWA,CAAA7L,CAAA,CAKkB,IALjB,CACjB8L,YAAY,CAAZA,CAAY,CACZ5L,WAAW,CAAXA,CAAW,CACXE,YAAY,CAAZA,CAAY,CACZoE,WAAW,CAAXA,CACyB,CAAC,CAAAxE,CAAA,MACpB,CAAA+L,CAAS,CAAGD,CAAY,CAACE,YAAY,CAAC9L,CAAW,CAAC,CAElD+L,CAAY,CAAGF,CAAS,CAAAG,aAAA,IAAQH,CAAS,EAAK,CAAC,CAAC,CAEtDE,CAAY,CAAC7L,CAAY,CAAC,CAAG,CAC3BoE,WAAW,CAAXA,CAAW,CACX2H,cAAc,CAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,CAAGC,8BAAmB,CAAGjG,mBAAY,CAACkG,MAClE,CAAC,CAEDT,CAAY,CAACrH,GAAG,CAAC,CACfmC,GAAG,CAAE1G,CAAW,CAChBmB,IAAI,CAAE4K,CAAY,CAClBO,QAAQ,CAAEF,8BACZ,CAAC,CACH,CAEA,MAAO,CAAAG,eAAeA,CACpBC,CAAkD,CAClDxM,CAAmB,CACX,CACR,GAAI,CAAAyM,CAAY,CAAG,kDAAkD,CAErE,KAAM,CAAAZ,CAAS,CAAGW,CAAa,CAACV,YAAY,CAAC9L,CAAW,CAAC,CAEzD,GAAI,CAAC6L,CAAS,CACZ,MAAO,CAAAY,CAAY,CAGrB,KAAM,CAAAC,CAAuC,CAAG,CAAC,CAAC,CAwBlD,MAtBA,CAAAC,MAAM,CAACC,OAAO,CAACf,CAAS,CAAC,CAACnI,OAAO,CAC/B5D,CAAA,EAAqD,IAApD,CAACI,CAAY,CAAE,CAAEoE,WAAW,CAAXA,CAAW,CAAE2H,cAAc,CAAdA,CAAe,CAAC,CAAC,CAAAnM,CAAA,CAC1CmM,CAAc,CAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,GAC7BM,CAAY,+DAAAI,MAAA,CAAiE3M,CAAY,MAAA2M,MAAA,CAAIvI,CAAW,OAAK,CAC7GmI,CAAY,uDAAAI,MAAA,CAAyD3M,CAAY,YAAU,CAE3FwM,CAAgB,EAAQxM,CAAY,CAAE,CAAG,CACvCoE,WAAW,CAAXA,CAAW,CACX2H,cAAc,CAAdA,CACF,CAAC,CAEL,CACF,CAAC,CAIDO,CAAa,CAACjI,GAAG,CAAC,CAChBmC,GAAG,CAAE1G,CAAW,CAChBmB,IAAI,CAAEuL,CAAgB,CACtBJ,QAAQ,CAAEF,8BACZ,CAAC,CAAC,CAEKK,CACT,CAEA,YAAa,CAAAK,SAASA,CAAAhN,CAAA,CAQqB,IARpB,CACrBE,WAAW,CAAXA,CAAW,CACXM,WAAW,CAAXA,CAAW,CACXuE,SAAS,CAATA,CAAS,CACTC,eAAe,CAAfA,CAAe,CACfC,sBAAsB,CAAtBA,CAAsB,CACtBnC,iBAAiB,CAAjBA,CAAiB,CACjBmK,mBAAmB,CAAnBA,CACuB,CAAC,CAAAjN,CAAA,CACxB,KAAM,KAAI,CAACkN,mBAAmB,CAAC,CAC7BnI,SAAS,CAATA,CAAS,CACTc,OAAO,CAAEZ,CACX,CAAC,CAAC,CAEF,KAAM,CAAAI,CAAO,CAAG,IAAI,CAAC9C,UAAU,CAAC,CAC9BrC,WAAW,CAAXA,CAAW,CACXM,WAAW,CAAXA,CAAW,CACXsC,iBAAiB,CAAjBA,CACF,CAAC,CAAC,CAEF,GAAI,CAACA,CAAiB,EAAI,CAACuC,CAAO,CAChC,OACD,KAEK,CAAAF,CAAS,CAAG,IAAI,CAACC,YAAY,CAAClF,CAAW,CAAEM,CAAW,CAAC,CAEvD8E,CAA+B,CAAG,CACtCpF,WAAW,CAAXA,CAAW,CACXiN,IAAI,CAAE9H,CAAO,CACbF,SAAS,CAATA,CAAS,CACT8H,mBAAmB,CAAnBA,CACF,CAAC,CAEKlL,CAAM,CAAG,KAAM,CAAAgD,CAAS,CAACiI,SAAS,CAAC1H,CAAU,CAAC,CAE9C8H,CAAO,CAAGA,CAAA,GACdtK,CAAiB,CACbtC,CAAW,CAACiF,eAAe,CAACvF,CAAW,CAAC,CACxCM,CAAW,CAACkF,oBAAoB,CAC9BxF,CAAW,CACX0C,4BAAa,CAACC,UAChB,CAAC,CAEHd,CAAM,CAACX,EAAE,EACXgM,CAAO,CAAC,CAAC,CAGP,CAACrL,CAAM,CAACX,EAAE,EAAI4D,CAAe,EAC/B,IAAI,CAACY,wBAAwB,CAAC,CAC5BpC,IAAI,CAAE8B,CAAU,CAChBO,OAAO,CAAEZ,CAAsB,CAC/Ba,YAAY,GAAO,CACnBuH,SAAS,CAAED,CACb,CAAC,CAEL,CAEA,MAAO,CAAAlK,QAAQA,CAAA,CAAW,CACxB,KAAM,CAAAoK,CAAS,CAAGC,0BAAc,CAAC5M,MAAM,CACvC,GAAI,CAAAoC,CAAa,CAAG,EAAE,CAEtB,IAAK,GAAI,CAAAwG,CAAC,CAAG,CAAC,CAAEA,CAAC,CAAG+D,CAAS,CAAE/D,CAAC,EAAE,CAAE,CAClC,KAAM,CAAAiE,CAAY,CAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,CAAGL,CAAS,CAAC,CAC1DvK,CAAK,EAAIwK,0BAAc,CAACK,SAAS,CAACJ,CAAY,CAAEA,CAAY,CAAG,CAAC,CAClE,CAEA,MAAO,CAAAzK,CACT,CAEA,MAAO,CAAA8K,aAAaA,CAAA7N,CAAA,CAQgB,IARf,CACnB8N,OAAO,CAAPA,CAAO,CACPC,cAAc,CAAdA,CAAc,CACdC,QAAQ,CAARA,CAKF,CAAC,CAAAhO,CAAA,MACO,CAAAiO,CAAa,CAAG,IAAI,CAACC,eAAe,CAACJ,CAAO,CAAC,CAC7CK,CAAoB,CAAG,IAAI,CAACD,eAAe,CAACH,CAAc,CAAC,CAEjE,GAAI,CAACE,CAAa,CAAC7M,EAAE,CACnB,MAAO,GAAAP,UAAG,EAACoN,CAAa,CAACG,KAAK,CAAC,CAGjC,GAAI,CAACD,CAAoB,CAAC/M,EAAE,CAC1B,MAAO,GAAAP,UAAG,EAACsN,CAAoB,CAACC,KAAK,CAAC,CACvC,KAEK,CAACC,CAAK,CAAEC,CAAK,CAAEC,CAAK,CAAC,CAAGN,CAAa,CAAC5M,IAAI,CAC1C,CAACmN,CAAY,CAAEC,CAAY,CAAEC,CAAY,CAAC,CAC9CP,CAAoB,CAAC9M,IAAI,CAErB,CAACsN,CAAY,CAAEC,CAAY,CAAEC,CAAY,CAAC,CAAG,CACjDR,CAAK,GAAKG,CAAY,CACtBF,CAAK,GAAKG,CAAY,CACtBF,CAAK,GAAKG,CAAY,CACvB,CAED,OAAQV,CAAQ,EACd,IAAK,CAAAc,2BAAgB,CAACC,KAAK,CACzB,MAAO,GAAAnO,SAAE,EAAC+N,CAAY,EAAIC,CAAY,EAAIC,CAAY,CAAC,CACzD,IAAK,CAAAC,2BAAgB,CAACE,OAAO,CAC3B,MAAO,GAAApO,SAAE,EACPyN,CAAK,CAAGG,CAAY,EACjBG,CAAY,EAAIL,CAAK,CAAGG,CAAa,EACrCE,CAAY,EAAIC,CAAY,EAAIL,CAAK,CAAGG,CAC7C,CAAC,CACH,IAAK,CAAAI,2BAAgB,CAACG,KAAK,CACzB,MAAO,GAAArO,SAAE,EACPyN,CAAK,CAAGG,CAAY,EACjBG,CAAY,EAAIL,CAAK,CAAGG,CAAa,EACrCE,CAAY,EAAIC,CAAY,EAAIL,CAAK,CAAGG,CAC7C,CAAC,CACH,QACE,GAAA/G,4BAAY,EAACqG,CAAQ,CACzB,CACF,CAEA,MAAO,CAAAkB,oBAAoBA,CAACvO,CAAc,CAAU,MAC5C,CAAAwO,CAAU,CAAG,sCAAsC,CACnDC,CAA8B,CAAG,EAAE,CAEzC,GAAa,CAAC,CAAVzO,CAAU,CACZ,MAAO,EAAE,CAGX,IAAK,GAAI,CAAA4I,CAAC,CAAG,CAAC,CAAEA,CAAC,CAAG5I,CAAM,CAAE4I,CAAC,EAAE,CAC7B6F,CAAoB,CAAChM,IAAI,CACvB+L,CAAU,CAAC1B,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,CAAGwB,CAAU,CAACxO,MAAM,CAAC,CAC1D,CAAC,CAGH,MAAO,CAAAyO,CAAoB,CAACtL,IAAI,CAAC,EAAE,CACrC,CAEA,YAAa,CAAAoJ,mBAAmBA,CAAAlN,CAAA,CAGM,IAHL,CAC/B+E,SAAS,CAATA,CAAS,CACTc,OAAO,CAAPA,CACiC,CAAC,CAAA7F,CAAA,CAClC,KAAM,CAAAqP,CAAU,CAAGxJ,CAAO,CAACyJ,IAAI,CAAC,CAAC,CAEjC,GAAID,CAAU,CAACjO,EAAE,EAAIiO,CAAU,CAAChO,IAAI,CAACkO,iBAAiB,CAAE,MAChD,CAAEA,iBAAiB,CAAjBA,CAAkB,CAAC,CAAGF,CAAU,CAAChO,IAAI,CACvCmO,CAA8B,CAAG,EAAE,CAMzC,IAAK,KAAM,CAAAlK,CAAU,GAAI,CAAAiK,CAAiB,CAAE,CAC1C,KAAM,CAAEE,SAAS,CAATA,CAAS,CAAE3J,YAAY,CAAZA,CAAwB,CAAC,CAAGR,CAAU,CAArBoK,CAAM,CAAAC,wBAAA,CAAKrK,CAAU,CAAAsK,SAAA,EACzD,GAAI,CAAA7N,CAA6B,CAG/BA,CAAM,CADJ+D,CAAY,CACL,KAAM,CAAAf,CAAS,CAACS,eAAe,CACtCkK,CACF,CAAC,CAEQ,KAAM,CAAA3K,CAAS,CAACiI,SAAS,CAAC0C,CAA6B,CAAC,CAGnE3N,CAAM,CAACX,EAAE,EAAIW,CAAM,CAACV,IAAI,EAAImO,CAAoB,CAACpM,IAAI,CAACqM,CAAS,CACjE,CAEA,IAAI,CAACI,yBAAyB,CAAC,CAC7BhK,OAAO,CAAPA,CAAO,CACPiK,UAAU,CAAEN,CACd,CAAC,CACH,CACF,CAEA,MAAe,CAAA5J,wBAAwBA,CAAA5F,CAAA,CAKM,IALL,CACtCwD,IAAI,CAAJA,CAAI,CACJsC,YAAY,CAAZA,CAAY,CACZD,OAAO,CAAPA,CAAO,CACPwH,SAAS,CAATA,CACkC,CAAC,CAAArN,CAAA,MAC7B,CAAAqP,CAAU,CAAGxJ,CAAO,CAACyJ,IAAI,CAAC,CAAC,CAE3BjO,CAAI,CAAGgO,CAAU,CAACjO,EAAE,CAAGiO,CAAU,CAAChO,IAAI,CAAG,CAAC,CAAC,CAE3C,CAAEkO,iBAAiB,CAAjBA,CAAkB,CAAC,CAAGlO,CAAI,CAE5B0O,CAAO,CAAA7D,aAAA,CAAAA,aAAA,IACR1I,CAAI,MACPiM,SAAS,CAAE,GAAI,CAAArD,IAAI,CAAC,CAAC,CAAC4D,OAAO,CAAC,CAAC,CAC/BlK,YAAY,CAAZA,CAAY,EACb,CAEKmK,CAAoB,CAAGV,CAAiB,CAC1C,CAAC,GAAGA,CAAiB,CAAEQ,CAAO,CAAC,CAC/B,CAACA,CAAO,CAAC,CAEPG,CAAW,CAAGrK,CAAO,CAACsK,KAAK,CAAC,CAChCZ,iBAAiB,CAAEU,CACrB,CAAC,CAAC,CAEEC,CAAW,CAAC9O,EAAE,EAAIiM,CAAS,EAC7BA,CAAS,CAAC,CAEd,CAEA,MAAe,CAAAwC,yBAAyBA,CAAA7P,CAAA,CAGU,IAHT,CACvC8P,UAAU,CAAVA,CAAU,CACVjK,OAAO,CAAPA,CACuC,CAAC,CAAA7F,CAAA,CACxC,KAAM,CAAAqP,CAAU,CAAGxJ,CAAO,CAACyJ,IAAI,CAAC,CAAC,CAEjC,GAAID,CAAU,CAACjO,EAAE,CAAE,MACX,CAAEmO,iBAAiB,CAAjBA,CAAkB,CAAC,CAAGF,CAAU,CAAChO,IAAI,CAEvC+O,CAAa,QAAGb,CAAiB,WAAjBA,CAAiB,QAAjBA,CAAiB,CAAEc,MAAM,CAC5C7M,CAAI,EAAK,CAACsM,CAAU,CAACvE,QAAQ,CAAC/H,CAAI,CAACiM,SAAS,CAC/C,CAAC,CAED5J,CAAO,CAACsK,KAAK,CAAC,CAAEZ,iBAAiB,CAAEa,CAAc,CAAC,CACpD,CACF,CAEA,MAAe,CAAAlC,eAAeA,CAC5BJ,CAAe,CACmC,CAClD,KAAM,CAAAwC,CAAY,CAAGxC,CAAO,CAACnD,KAAK,CAAC,GAAG,CAAC,CAAC4F,GAAG,CAAEC,CAAC,EAAKC,QAAQ,CAACD,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,KAEvC,CAAC,CAAvBF,CAAY,CAAC3P,MAAU,EAC5B2P,CAAY,CAAClN,IAAI,CAAC,CAAC,CAAC,CAAC,MAGnB,CAAAkN,CAAY,CAACI,IAAI,CAAElN,CAAI,EAAK4D,KAAK,CAAC5D,CAAI,CAAC,CAAC,CACnC,GAAA3C,UAAG,EACR,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAAC4P,oBAAoB,CAAE7C,CAAO,CACrE,CAAC,CAGI,GAAAlN,SAAE,EAAC0P,CAAY,CAACM,KAAK,CAAC,CAAC,CAAE,CAAC,CAA6B,CAChE,CACF,CAACC,OAAA,CAAA/Q,SAAA,CAAAA,SAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"FeatureFlagVariationType",{enumerable:!0,get:function
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"FeatureFlagVariationType",{enumerable:!0,get:function(){return _types.FeatureFlagVariationType}}),Object.defineProperty(exports,"VariationConfiguration",{enumerable:!0,get:function(){return _variationConfiguration.VariationConfiguration}});var _variationConfiguration=require("./variationConfiguration"),_types=require("./types");
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Result } from 'ts-res';
|
|
2
2
|
import { KameleoonError } from '../kameleoonError';
|
|
3
|
-
import {
|
|
3
|
+
import { VariationDataType } from '../storage';
|
|
4
4
|
import { FeatureFlagVariationType, GetVariationParametersType, UnsentVariationDataType } from './types';
|
|
5
|
-
import { FeatureFlagVariationsType } from '../storage/types';
|
|
5
|
+
import { FeatureFlagVariationsType, IStorage } from '../storage/types';
|
|
6
6
|
interface IVariationConfiguration {
|
|
7
7
|
/**
|
|
8
8
|
* @method getStoredVariations - obtains campaigns with according variations that are *already assigned* and *stored* in the `variationStorage`.
|
|
@@ -27,7 +27,7 @@ interface IVariationConfiguration {
|
|
|
27
27
|
}
|
|
28
28
|
export declare class VariationConfiguration implements IVariationConfiguration {
|
|
29
29
|
private storage;
|
|
30
|
-
constructor(externalStorage:
|
|
30
|
+
constructor(externalStorage: IStorage<VariationDataType>);
|
|
31
31
|
markUnsentDataAsSent(visitorCode: string, experimentId: string): Result<void, KameleoonError>;
|
|
32
32
|
getUnsentData(visitorCode: string): Result<UnsentVariationDataType[], KameleoonError>;
|
|
33
33
|
getStoredVariations(visitorCode: string): Result<FeatureFlagVariationsType, KameleoonError>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.VariationConfiguration=void 0;var _tsRes=require("ts-res"),_hasher=require("../hasher"),_kameleoonError=require("../kameleoonError"),_utilities=require("../utilities"),_types=require("../clientConfiguration/types")
|
|
1
|
+
"use strict";const _excluded=["exposition"];Object.defineProperty(exports,"__esModule",{value:!0}),exports.VariationConfiguration=void 0;var _tsRes=require("ts-res"),_hasher=require("../hasher"),_kameleoonError=require("../kameleoonError"),_utilities=require("../utilities"),_types=require("../clientConfiguration/types");function _objectWithoutProperties(a,b){if(null==a)return{};var c,d,e=_objectWithoutPropertiesLoose(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],0<=b.indexOf(c)||Object.prototype.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function _objectWithoutPropertiesLoose(a,b){if(null==a)return{};var c,d,e={},f=Object.keys(a);for(d=0;d<f.length;d++)c=f[d],0<=b.indexOf(c)||(e[c]=a[c]);return e}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return b=_toPropertyKey(b),b in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class VariationConfiguration{constructor(a){_defineProperty(this,"storage",void 0),this.storage=a}markUnsentDataAsSent(a,b){const c=this.storage.read();if(!c.ok&&c.error.type===_kameleoonError.KameleoonException.StorageParse)return c;let d=c.ok?c.data:{};return d[a]||(d[a]={}),d[a][b]=_objectSpread(_objectSpread({},d[a][b]),{},{isSent:!0}),this.storage.write(d)}getUnsentData(a){const b=this.storage.read();if(!b.ok&&b.error.type===_kameleoonError.KameleoonException.StorageParse)return b;const c=b.ok?b.data:{},d=c[a],e=[];if(d)for(const[a,b]of Object.entries(d))b.isSent||e.push({experimentId:+a,variationId:b.variationId,isTargetedRule:b.isTargetedRule});return(0,_tsRes.Ok)(e)}getStoredVariations(a){const b=this.storage.read();if(!b.ok)return b;const c=b.data[a];return c?(0,_tsRes.Ok)(c):(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.StorageRead,a))}getVariation(a){let{visitorCode:b,visitorIdentifier:c,featureFlag:d,targetingData:e,packageInfo:f,clientConfiguration:g,dataManager:h,withAssignment:i=!1}=a;const j=_utilities.Utilities.validateVisitorCode(b);if(!j.ok)return(0,_tsRes.Err)(j.error);const{rules:k,featureKey:l,id:m,defaultVariationKey:n}=d;for(const d of k){const{segment:a,experimentId:j,id:k,exposition:o,respoolTime:p,variationByExposition:q}=d,r=_utilities.Utilities.checkTargeting({segment:a,visitorCode:b,experimentId:j,targetingData:e,packageInfo:f,clientConfiguration:g,dataManager:h,variationConfiguration:this});if(!r.ok)return r;if(!r.data)continue;const s=_hasher.Hasher.getHashDouble({visitorIdentifier:c,respoolTime:p,id:k+""});if(s<=o){let a=0;const e=_hasher.Hasher.getHashDouble({visitorIdentifier:c,respoolTime:p,id:j+""});for(const c of q)if(a+=c.exposition,e<=a){i&&this.updateStoredVariations(b,{[j]:{variationId:c.variationId,isTargetedRule:d.type===_types.RuleType.TARGETED_DELIVERY,isSent:!1}});const{exposition:a}=c,e=_objectWithoutProperties(c,_excluded);return(0,_tsRes.Ok)(_objectSpread(_objectSpread({},e),{},{rule:d,featureFlagId:m,featureKey:l,experimentId:j,isTargetedRule:d.type===_types.RuleType.TARGETED_DELIVERY}))}}if(d.type===_types.RuleType.TARGETED_DELIVERY)return(0,_tsRes.Ok)({featureKey:l,featureFlagId:m,experimentId:null,variationKey:n,variationId:null,rule:null,isTargetedRule:!0})}return(0,_tsRes.Ok)({featureKey:l,featureFlagId:m,experimentId:null,variationKey:n,variationId:null,rule:null,isTargetedRule:!1})}updateStoredVariations(a,b){const c=this.storage.read();if(!c.ok&&c.error.type===_kameleoonError.KameleoonException.StorageParse)return c;let d=c.ok?c.data:{};return d[a]?d[a]=_objectSpread(_objectSpread({},d[a]),b):d=_objectSpread(_objectSpread({},d),{},{[a]:_objectSpread({},b)}),this.storage.write(d)}}exports.VariationConfiguration=VariationConfiguration;
|
|
2
2
|
//# sourceMappingURL=variationConfiguration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variationConfiguration.js","names":["VariationConfiguration","a","externalStorage","_classCallCheck","_defineProperty","storage","_createClass","key","value","markUnsentDataAsSent","visitorCode","experimentId","result","read","ok","error","type","KameleoonException","StorageParse","updatedVariationData","data","_objectSpread","isSent","write","getUnsentData","featureExperiment","unsentData","f","g","Object","entries","length","h","_slicedToArray","variationData","push","variationId","isTargetedRule","Ok","getStoredVariations","featureFlagVariations","Err","KameleoonError","StorageRead","getVariation","visitorIdentifier","featureFlag","targetingData","packageInfo","clientConfiguration","dataManager","i","withAssignment","validateResult","Utilities","validateVisitorCode","k","rules","featureKey","featureFlagId","id","defaultVariationKey","p","_createForOfIteratorHelper","s","n","done","rule","segment","exposition","respoolTime","variationByExposition","targetingResult","checkTargeting","variationConfiguration","ruleHash","Hasher","getHashDouble","z","totalDeviation","variationHash","C","variation","updateStoredVariations","RuleType","TARGETED_DELIVERY","restParameters","_objectWithoutProperties","_excluded","e","variationKey","exports"],"sources":["../../src/variationConfiguration/variationConfiguration.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { Hasher } from 'src/hasher';\nimport { KameleoonError, KameleoonException } from 'src/kameleoonError';\nimport { IExternalStorage, VariationDataType } from 'src/storage';\nimport { Utilities } from 'src/utilities';\nimport { RuleType } from 'src/clientConfiguration/types';\nimport {\n FeatureFlagVariationType,\n GetVariationParametersType,\n UnsentVariationDataType,\n} from './types';\nimport { FeatureFlagVariationsType } from 'src/storage/types';\n\ninterface IVariationConfiguration {\n /**\n * @method getStoredVariations - obtains campaigns with according variations that are *already assigned* and *stored* in the `variationStorage`.\n */\n getStoredVariations(\n visitorCode: string,\n ): Result<FeatureFlagVariationsType, KameleoonError>;\n /**\n * @method updateStoredVariations - updates stored variations for the visitor\n */\n updateStoredVariations: (\n visitorCode: string,\n variationData: FeatureFlagVariationsType,\n ) => void;\n /**\n * @method getVariation - obtains variation for the rule of the feature flag which is both targeted and has a variation, if no such rule was found, returns empty rule with default `variationKey`, given an option `withAssignment` of `true` will also assign a new variation and save it in the storage\n */\n getVariation: (\n params: GetVariationParametersType,\n ) => Result<FeatureFlagVariationType, KameleoonError>;\n /**\n * @method getUnsentData - obtains the list of unsent variations\n */\n getUnsentData: (\n visitorCode: string,\n ) => Result<UnsentVariationDataType[], KameleoonError>;\n /**\n * @method markUnsentDataAsSent - marks the passed expriment variation as sent\n */\n markUnsentDataAsSent: (\n visitorCode: string,\n experimentId: string,\n ) => Result<void, KameleoonError>;\n}\n\nexport class VariationConfiguration implements IVariationConfiguration {\n private storage: IExternalStorage<VariationDataType>;\n\n constructor(externalStorage: IExternalStorage<VariationDataType>) {\n this.storage = externalStorage;\n }\n\n public markUnsentDataAsSent(\n visitorCode: string,\n experimentId: string,\n ): Result<void, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n let updatedVariationData: VariationDataType = result.ok ? result.data : {};\n\n if (!updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode] = {};\n }\n\n updatedVariationData[visitorCode][experimentId] = {\n ...updatedVariationData[visitorCode][experimentId],\n isSent: true,\n };\n\n return this.storage.write(updatedVariationData);\n }\n\n public getUnsentData(\n visitorCode: string,\n ): Result<UnsentVariationDataType[], KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n const updatedVariationData: VariationDataType = result.ok\n ? result.data\n : {};\n\n const featureExperiment = updatedVariationData[visitorCode];\n\n const unsentData: UnsentVariationDataType[] = [];\n\n if (featureExperiment) {\n for (const [experimentId, variationData] of Object.entries(\n featureExperiment,\n )) {\n if (!variationData.isSent) {\n unsentData.push({\n experimentId: Number(experimentId),\n variationId: variationData.variationId,\n isTargetedRule: variationData.isTargetedRule,\n });\n }\n }\n }\n\n return Ok(unsentData);\n }\n\n public getStoredVariations(\n visitorCode: string,\n ): Result<FeatureFlagVariationsType, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n return result;\n }\n\n const featureFlagVariations = result.data[visitorCode];\n\n if (!featureFlagVariations) {\n return Err(\n new KameleoonError(KameleoonException.StorageRead, visitorCode),\n );\n }\n\n return Ok(featureFlagVariations);\n }\n\n public getVariation({\n visitorCode,\n visitorIdentifier,\n featureFlag,\n targetingData,\n packageInfo,\n clientConfiguration,\n dataManager,\n withAssignment = false,\n }: GetVariationParametersType): Result<\n FeatureFlagVariationType,\n KameleoonError\n > {\n const validateResult = Utilities.validateVisitorCode(visitorCode);\n\n if (!validateResult.ok) {\n return Err(validateResult.error);\n }\n\n const {\n rules,\n featureKey,\n id: featureFlagId,\n defaultVariationKey,\n } = featureFlag;\n\n for (const rule of rules) {\n const {\n segment,\n experimentId,\n id,\n exposition,\n respoolTime,\n variationByExposition,\n } = rule;\n\n // --- Check targeting ---\n const targetingResult = Utilities.checkTargeting({\n segment,\n visitorCode,\n experimentId,\n targetingData,\n packageInfo,\n clientConfiguration,\n dataManager,\n variationConfiguration: this,\n });\n\n if (!targetingResult.ok) {\n return targetingResult;\n }\n\n if (!targetingResult.data) {\n continue;\n }\n\n // --- Note ---\n // Calculate new variation (and assign it if `withAssignment` is `true`)\n // First the the exposed rule is calculated and then the variation inside of it\n const ruleHash = Hasher.getHashDouble({\n visitorIdentifier,\n respoolTime,\n id: String(id),\n });\n\n if (ruleHash <= exposition) {\n let totalDeviation = 0;\n\n const variationHash = Hasher.getHashDouble({\n visitorIdentifier,\n respoolTime,\n id: String(experimentId),\n });\n\n for (const variation of variationByExposition) {\n totalDeviation += variation.exposition;\n\n if (variationHash <= totalDeviation) {\n if (withAssignment) {\n this.updateStoredVariations(visitorCode, {\n [experimentId]: {\n variationId: variation.variationId,\n isTargetedRule: rule.type === RuleType.TARGETED_DELIVERY,\n isSent: false,\n },\n });\n }\n\n const { exposition, ...restParameters } = variation;\n\n return Ok({\n ...restParameters,\n rule,\n featureFlagId,\n featureKey,\n experimentId,\n isTargetedRule: rule.type === RuleType.TARGETED_DELIVERY,\n });\n }\n }\n }\n\n if (rule.type === RuleType.TARGETED_DELIVERY) {\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n isTargetedRule: true,\n });\n }\n }\n\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n isTargetedRule: false,\n });\n }\n\n public updateStoredVariations(\n visitorCode: string,\n variationData: FeatureFlagVariationsType,\n ): Result<void, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n let updatedVariationData: VariationDataType = result.ok ? result.data : {};\n\n if (updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode] = {\n ...updatedVariationData[visitorCode],\n ...variationData,\n };\n } else {\n updatedVariationData = {\n ...updatedVariationData,\n [visitorCode]: {\n ...variationData,\n },\n };\n }\n\n return this.storage.write(updatedVariationData);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"variationConfiguration.js","names":["VariationConfiguration","constructor","externalStorage","_defineProperty","storage","markUnsentDataAsSent","visitorCode","experimentId","result","read","ok","error","type","KameleoonException","StorageParse","updatedVariationData","data","_objectSpread","isSent","write","getUnsentData","featureExperiment","unsentData","variationData","Object","entries","push","variationId","isTargetedRule","Ok","getStoredVariations","featureFlagVariations","Err","KameleoonError","StorageRead","getVariation","a","visitorIdentifier","featureFlag","targetingData","packageInfo","clientConfiguration","dataManager","withAssignment","validateResult","Utilities","validateVisitorCode","rules","featureKey","id","featureFlagId","defaultVariationKey","rule","segment","exposition","respoolTime","variationByExposition","targetingResult","checkTargeting","variationConfiguration","ruleHash","Hasher","getHashDouble","totalDeviation","variationHash","variation","updateStoredVariations","RuleType","TARGETED_DELIVERY","restParameters","_objectWithoutProperties","_excluded","variationKey","exports"],"sources":["../../src/variationConfiguration/variationConfiguration.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { Hasher } from 'src/hasher';\nimport { KameleoonError, KameleoonException } from 'src/kameleoonError';\nimport { VariationDataType } from 'src/storage';\nimport { Utilities } from 'src/utilities';\nimport { RuleType } from 'src/clientConfiguration/types';\nimport {\n FeatureFlagVariationType,\n GetVariationParametersType,\n UnsentVariationDataType,\n} from './types';\nimport { FeatureFlagVariationsType, IStorage } from 'src/storage/types';\n\ninterface IVariationConfiguration {\n /**\n * @method getStoredVariations - obtains campaigns with according variations that are *already assigned* and *stored* in the `variationStorage`.\n */\n getStoredVariations(\n visitorCode: string,\n ): Result<FeatureFlagVariationsType, KameleoonError>;\n /**\n * @method updateStoredVariations - updates stored variations for the visitor\n */\n updateStoredVariations: (\n visitorCode: string,\n variationData: FeatureFlagVariationsType,\n ) => void;\n /**\n * @method getVariation - obtains variation for the rule of the feature flag which is both targeted and has a variation, if no such rule was found, returns empty rule with default `variationKey`, given an option `withAssignment` of `true` will also assign a new variation and save it in the storage\n */\n getVariation: (\n params: GetVariationParametersType,\n ) => Result<FeatureFlagVariationType, KameleoonError>;\n /**\n * @method getUnsentData - obtains the list of unsent variations\n */\n getUnsentData: (\n visitorCode: string,\n ) => Result<UnsentVariationDataType[], KameleoonError>;\n /**\n * @method markUnsentDataAsSent - marks the passed expriment variation as sent\n */\n markUnsentDataAsSent: (\n visitorCode: string,\n experimentId: string,\n ) => Result<void, KameleoonError>;\n}\n\nexport class VariationConfiguration implements IVariationConfiguration {\n private storage: IStorage<VariationDataType>;\n\n constructor(externalStorage: IStorage<VariationDataType>) {\n this.storage = externalStorage;\n }\n\n public markUnsentDataAsSent(\n visitorCode: string,\n experimentId: string,\n ): Result<void, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n let updatedVariationData: VariationDataType = result.ok ? result.data : {};\n\n if (!updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode] = {};\n }\n\n updatedVariationData[visitorCode][experimentId] = {\n ...updatedVariationData[visitorCode][experimentId],\n isSent: true,\n };\n\n return this.storage.write(updatedVariationData);\n }\n\n public getUnsentData(\n visitorCode: string,\n ): Result<UnsentVariationDataType[], KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n const updatedVariationData: VariationDataType = result.ok\n ? result.data\n : {};\n\n const featureExperiment = updatedVariationData[visitorCode];\n\n const unsentData: UnsentVariationDataType[] = [];\n\n if (featureExperiment) {\n for (const [experimentId, variationData] of Object.entries(\n featureExperiment,\n )) {\n if (!variationData.isSent) {\n unsentData.push({\n experimentId: Number(experimentId),\n variationId: variationData.variationId,\n isTargetedRule: variationData.isTargetedRule,\n });\n }\n }\n }\n\n return Ok(unsentData);\n }\n\n public getStoredVariations(\n visitorCode: string,\n ): Result<FeatureFlagVariationsType, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n return result;\n }\n\n const featureFlagVariations = result.data[visitorCode];\n\n if (!featureFlagVariations) {\n return Err(\n new KameleoonError(KameleoonException.StorageRead, visitorCode),\n );\n }\n\n return Ok(featureFlagVariations);\n }\n\n public getVariation({\n visitorCode,\n visitorIdentifier,\n featureFlag,\n targetingData,\n packageInfo,\n clientConfiguration,\n dataManager,\n withAssignment = false,\n }: GetVariationParametersType): Result<\n FeatureFlagVariationType,\n KameleoonError\n > {\n const validateResult = Utilities.validateVisitorCode(visitorCode);\n\n if (!validateResult.ok) {\n return Err(validateResult.error);\n }\n\n const {\n rules,\n featureKey,\n id: featureFlagId,\n defaultVariationKey,\n } = featureFlag;\n\n for (const rule of rules) {\n const {\n segment,\n experimentId,\n id,\n exposition,\n respoolTime,\n variationByExposition,\n } = rule;\n\n // --- Check targeting ---\n const targetingResult = Utilities.checkTargeting({\n segment,\n visitorCode,\n experimentId,\n targetingData,\n packageInfo,\n clientConfiguration,\n dataManager,\n variationConfiguration: this,\n });\n\n if (!targetingResult.ok) {\n return targetingResult;\n }\n\n if (!targetingResult.data) {\n continue;\n }\n\n // --- Note ---\n // Calculate new variation (and assign it if `withAssignment` is `true`)\n // First the the exposed rule is calculated and then the variation inside of it\n const ruleHash = Hasher.getHashDouble({\n visitorIdentifier,\n respoolTime,\n id: String(id),\n });\n\n if (ruleHash <= exposition) {\n let totalDeviation = 0;\n\n const variationHash = Hasher.getHashDouble({\n visitorIdentifier,\n respoolTime,\n id: String(experimentId),\n });\n\n for (const variation of variationByExposition) {\n totalDeviation += variation.exposition;\n\n if (variationHash <= totalDeviation) {\n if (withAssignment) {\n this.updateStoredVariations(visitorCode, {\n [experimentId]: {\n variationId: variation.variationId,\n isTargetedRule: rule.type === RuleType.TARGETED_DELIVERY,\n isSent: false,\n },\n });\n }\n\n const { exposition, ...restParameters } = variation;\n\n return Ok({\n ...restParameters,\n rule,\n featureFlagId,\n featureKey,\n experimentId,\n isTargetedRule: rule.type === RuleType.TARGETED_DELIVERY,\n });\n }\n }\n }\n\n if (rule.type === RuleType.TARGETED_DELIVERY) {\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n isTargetedRule: true,\n });\n }\n }\n\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n isTargetedRule: false,\n });\n }\n\n public updateStoredVariations(\n visitorCode: string,\n variationData: FeatureFlagVariationsType,\n ): Result<void, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n let updatedVariationData: VariationDataType = result.ok ? result.data : {};\n\n if (updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode] = {\n ...updatedVariationData[visitorCode],\n ...variationData,\n };\n } else {\n updatedVariationData = {\n ...updatedVariationData,\n [visitorCode]: {\n ...variationData,\n },\n };\n }\n\n return this.storage.write(updatedVariationData);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ZERO_MAX_AGE=exports.PATH=exports.DEFAULT_MAX_AGE=void 0;const DEFAULT_MAX_AGE=exports.DEFAULT_MAX_AGE=31536000,ZERO_MAX_AGE=exports.ZERO_MAX_AGE=0,PATH=exports.PATH="/";
|
|
2
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","names":["DEFAULT_MAX_AGE","exports","ZERO_MAX_AGE","PATH"],"sources":["../../src/visitorCodeManager/constants.ts"],"sourcesContent":["export const DEFAULT_MAX_AGE = 60 * 60 * 24 * 365;\nexport const ZERO_MAX_AGE = 0;\nexport const PATH = '/';\n"],"mappings":"0IAAa,CAAAA,eAAe,CAAAC,OAAA,CAAAD,eAAA,SAAqB,CACpCE,YAAY,CAAAD,OAAA,CAAAC,YAAA,CAAG,CAAC,CAChBC,IAAI,CAAAF,OAAA,CAAAE,IAAA,CAAG,GAAG"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var _visitorCodeManager=require("./visitorCodeManager");Object.defineProperty(exports,"__esModule",{value:!0})
|
|
1
|
+
"use strict";var _exportNames={VisitorCodeManager:!0};var _types=require("./types");var _constants=require("./constants");var _visitorCodeManager=require("./visitorCodeManager");Object.defineProperty(exports,"__esModule",{value:!0});Object.defineProperty(exports,"VisitorCodeManager",{enumerable:!0,get:function(){return _visitorCodeManager.VisitorCodeManager}});Object.keys(_types).forEach(function(a){"default"===a||"__esModule"===a||Object.prototype.hasOwnProperty.call(_exportNames,a)||a in exports&&exports[a]===_types[a]||Object.defineProperty(exports,a,{enumerable:!0,get:function(){return _types[a]}})});Object.keys(_constants).forEach(function(a){"default"===a||"__esModule"===a||Object.prototype.hasOwnProperty.call(_exportNames,a)||a in exports&&exports[a]===_constants[a]||Object.defineProperty(exports,a,{enumerable:!0,get:function(){return _constants[a]}})});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["
|
|
1
|
+
{"version":3,"file":"index.js","names":["_types","require","_constants","_visitorCodeManager","Object","defineProperty","exports","value","enumerable","get","VisitorCodeManager","keys","forEach","a","prototype","hasOwnProperty","call","_exportNames"],"sources":["../../src/visitorCodeManager/index.ts"],"sourcesContent":["export * from './types';\nexport * from './constants';\nexport { VisitorCodeManager } from './visitorCodeManager';\n"],"mappings":"sDAAA,IAAAA,MAAA,CAAAC,OAAA,YACA,IAAAC,UAAA,CAAAD,OAAA,gBACA,IAAAE,mBAAA,CAAAF,OAAA,yBAA0DG,MAAA,CAAAC,cAAA,CAAAC,OAAA,eAAAC,KAAA,MAAAH,MAAA,CAAAC,cAAA,CAAAC,OAAA,uBAAAE,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAN,mBAAA,CAAAO,kBAAA,IAAAN,MAAA,CAAAO,IAAA,CAAAX,MAAA,EAAAY,OAAA,UAAAC,CAAA,cAAAA,CAAA,iBAAAA,CAAA,EAAAT,MAAA,CAAAU,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,CAAAJ,CAAA,GAAAA,CAAA,IAAAP,OAAA,EAAAA,OAAA,CAAAO,CAAA,IAAAb,MAAA,CAAAa,CAAA,GAAAT,MAAA,CAAAC,cAAA,CAAAC,OAAA,CAAAO,CAAA,EAAAL,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAT,MAAA,CAAAa,CAAA,OAAAT,MAAA,CAAAO,IAAA,CAAAT,UAAA,EAAAU,OAAA,UAAAC,CAAA,cAAAA,CAAA,iBAAAA,CAAA,EAAAT,MAAA,CAAAU,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,CAAAJ,CAAA,GAAAA,CAAA,IAAAP,OAAA,EAAAA,OAAA,CAAAO,CAAA,IAAAX,UAAA,CAAAW,CAAA,GAAAT,MAAA,CAAAC,cAAA,CAAAC,OAAA,CAAAO,CAAA,EAAAL,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAP,UAAA,CAAAW,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SetDataCallbackParametersType } from '../types';
|
|
2
|
+
export interface IVisitorCodeManager {
|
|
3
|
+
consentRequired: boolean;
|
|
4
|
+
getVisitorCode(defaultVisitorCode?: string): string;
|
|
5
|
+
getData: (key: string) => string | null;
|
|
6
|
+
setData: (params: SetDataCallbackParametersType) => void;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../src/visitorCodeManager/types.ts"],"sourcesContent":["import { SetDataCallbackParametersType } from 'src/types';\n\nexport interface IVisitorCodeManager {\n consentRequired: boolean;\n getVisitorCode(defaultVisitorCode?: string): string;\n getData: (key: string) => string | null;\n setData: (params: SetDataCallbackParametersType) => void;\n}\n"],"mappings":""}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { SetDataCallbackParametersType } from '../types';
|
|
2
|
+
import { IVisitorCodeManager } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* VisitorCodeManager - a class which manages visitor codes using cookies, offering functions to generate, retrieve,
|
|
5
5
|
* and handle these codes while considering user consent.
|
|
6
6
|
**/
|
|
7
|
-
export declare class VisitorCodeManager {
|
|
7
|
+
export declare class VisitorCodeManager implements IVisitorCodeManager {
|
|
8
8
|
private isConsentRequired;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
private setDataCallback?;
|
|
10
|
+
private getDataCallback?;
|
|
11
|
+
set consentRequired(isRequired: boolean);
|
|
12
|
+
get consentRequired(): boolean;
|
|
13
|
+
set getData(callback: () => string);
|
|
14
|
+
set setData(callback: (params: SetDataCallbackParametersType) => void);
|
|
15
|
+
get setData(): (params: SetDataCallbackParametersType) => void;
|
|
16
|
+
getVisitorCode(defaultVisitorCode?: string): string;
|
|
14
17
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.VisitorCodeManager=void 0;var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.VisitorCodeManager=void 0;var _constants=require("../constants"),_storage=require("../storage"),_utilities=require("../utilities"),_constants2=require("./constants");function _defineProperty(a,b,c){return b=_toPropertyKey(b),b in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class VisitorCodeManager{constructor(){_defineProperty(this,"isConsentRequired",!1),_defineProperty(this,"setDataCallback",void 0),_defineProperty(this,"getDataCallback",void 0)}set consentRequired(a){this.isConsentRequired=a}get consentRequired(){return this.isConsentRequired}set getData(a){this.getDataCallback=a}set setData(a){this.setDataCallback=a}get setData(){if(this.setDataCallback)return this.setDataCallback;throw new Error("Missing setDataCallback!")}getVisitorCode(a){if(this.getDataCallback&&this.setDataCallback){const b=this.getDataCallback(_storage.KameleoonStorageKey.VisitorCode);if(b)return b;let c=a;return c?_utilities.Utilities.validateVisitorCode(c).throw():c=_utilities.Utilities.generateRandomString(_constants.VISITOR_CODE_LENGTH),this.isConsentRequired||this.setDataCallback({visitorCode:c,key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_constants2.DEFAULT_MAX_AGE,path:_constants2.PATH}),c}throw new Error("Missing getDataCallback && setDataCallback callbacks in getVisitorCode!")}}exports.VisitorCodeManager=VisitorCodeManager;
|
|
2
2
|
//# sourceMappingURL=visitorCodeManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitorCodeManager.js","names":["VisitorCodeManager","
|
|
1
|
+
{"version":3,"file":"visitorCodeManager.js","names":["VisitorCodeManager","constructor","_defineProperty","consentRequired","isRequired","isConsentRequired","getData","callback","getDataCallback","setData","setDataCallback","Error","getVisitorCode","defaultVisitorCode","existingVisitorCode","KameleoonStorageKey","VisitorCode","visitorCode","Utilities","validateVisitorCode","throw","generateRandomString","VISITOR_CODE_LENGTH","key","maxAge","DEFAULT_MAX_AGE","path","PATH","exports"],"sources":["../../src/visitorCodeManager/visitorCodeManager.ts"],"sourcesContent":["import { VISITOR_CODE_LENGTH } from 'src/constants';\nimport { KameleoonStorageKey } from 'src/storage';\nimport { Utilities } from 'src/utilities';\nimport { SetDataCallbackParametersType } from 'src/types';\nimport { IVisitorCodeManager } from './types';\nimport { DEFAULT_MAX_AGE, PATH } from './constants';\n\n/**\n * VisitorCodeManager - a class which manages visitor codes using cookies, offering functions to generate, retrieve,\n * and handle these codes while considering user consent.\n **/\nexport class VisitorCodeManager implements IVisitorCodeManager {\n private isConsentRequired: boolean = false;\n private setDataCallback?: (params: SetDataCallbackParametersType) => void;\n private getDataCallback?: (key: string) => string | null;\n\n set consentRequired(isRequired: boolean) {\n this.isConsentRequired = isRequired;\n }\n\n get consentRequired(): boolean {\n return this.isConsentRequired;\n }\n\n set getData(callback: () => string) {\n this.getDataCallback = callback;\n }\n\n set setData(callback: (params: SetDataCallbackParametersType) => void) {\n this.setDataCallback = callback;\n }\n\n get setData(): (params: SetDataCallbackParametersType) => void {\n if (this.setDataCallback) {\n return this.setDataCallback;\n }\n\n throw new Error('Missing setDataCallback!');\n }\n\n public getVisitorCode(defaultVisitorCode?: string): string {\n if (this.getDataCallback && this.setDataCallback) {\n const existingVisitorCode = this.getDataCallback(\n KameleoonStorageKey.VisitorCode,\n );\n\n if (existingVisitorCode) {\n return existingVisitorCode;\n }\n\n let visitorCode = defaultVisitorCode;\n\n if (visitorCode) {\n Utilities.validateVisitorCode(visitorCode).throw();\n } else {\n visitorCode = Utilities.generateRandomString(VISITOR_CODE_LENGTH);\n }\n\n if (!this.isConsentRequired) {\n this.setDataCallback({\n visitorCode,\n key: KameleoonStorageKey.VisitorCode,\n maxAge: DEFAULT_MAX_AGE,\n path: PATH,\n });\n }\n\n return visitorCode;\n }\n\n throw new Error(\n 'Missing getDataCallback && setDataCallback callbacks in getVisitorCode!',\n );\n }\n}\n"],"mappings":"qvBAWO,KAAM,CAAAA,kBAAkD,CAAAC,YAAA,EAAAC,eAAA,8BAAAA,eAAA,gCAAAA,eAAA,gCAK7D,GAAI,CAAAC,eAAeA,CAACC,CAAmB,CAAE,CACvC,IAAI,CAACC,iBAAiB,CAAGD,CAC3B,CAEA,GAAI,CAAAD,eAAeA,CAAA,CAAY,CAC7B,MAAO,KAAI,CAACE,iBACd,CAEA,GAAI,CAAAC,OAAOA,CAACC,CAAsB,CAAE,CAClC,IAAI,CAACC,eAAe,CAAGD,CACzB,CAEA,GAAI,CAAAE,OAAOA,CAACF,CAAyD,CAAE,CACrE,IAAI,CAACG,eAAe,CAAGH,CACzB,CAEA,GAAI,CAAAE,OAAOA,CAAA,CAAoD,CAC7D,GAAI,IAAI,CAACC,eAAe,CACtB,MAAO,KAAI,CAACA,eAAe,CAG7B,KAAM,IAAI,CAAAC,KAAK,CAAC,0BAA0B,CAC5C,CAEOC,cAAcA,CAACC,CAA2B,CAAU,CACzD,GAAI,IAAI,CAACL,eAAe,EAAI,IAAI,CAACE,eAAe,CAAE,CAChD,KAAM,CAAAI,CAAmB,CAAG,IAAI,CAACN,eAAe,CAC9CO,4BAAmB,CAACC,WACtB,CAAC,CAED,GAAIF,CAAmB,CACrB,MAAO,CAAAA,CAAmB,CAG5B,GAAI,CAAAG,CAAW,CAAGJ,CAAkB,CAiBpC,MAfI,CAAAI,CAAW,CACbC,oBAAS,CAACC,mBAAmB,CAACF,CAAW,CAAC,CAACG,KAAK,CAAC,CAAC,CAElDH,CAAW,CAAGC,oBAAS,CAACG,oBAAoB,CAACC,8BAAmB,CAAC,CAG9D,IAAI,CAACjB,iBAAiB,EACzB,IAAI,CAACK,eAAe,CAAC,CACnBO,WAAW,CAAXA,CAAW,CACXM,GAAG,CAAER,4BAAmB,CAACC,WAAW,CACpCQ,MAAM,CAAEC,2BAAe,CACvBC,IAAI,CAAEC,gBACR,CAAC,CAAC,CAGGV,CACT,CAEA,KAAM,IAAI,CAAAN,KAAK,CACb,yEACF,CACF,CACF,CAACiB,OAAA,CAAA5B,kBAAA,CAAAA,kBAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kameleoon/javascript-sdk-core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "Kameleoon JS SDK Core",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
"build": "npm run clean && npm run build:types && npm run build:js",
|
|
14
14
|
"build:types": "tsc --emitDeclarationOnly && tsc-alias",
|
|
15
15
|
"build:js": "babel src --out-dir dist --extensions \".ts,.tsx\" --source-maps true",
|
|
16
|
-
"deploy": "
|
|
16
|
+
"deploy": "/bin/bash ../../scripts/deploy.sh javascript-sdk-core",
|
|
17
17
|
"deploy-nexus": "/bin/bash ../../scripts/deploy_nexus.sh javascript-sdk-core",
|
|
18
|
-
"update-
|
|
19
|
-
"
|
|
20
|
-
"test": "
|
|
18
|
+
"update-changelog": "/bin/bash ../../scripts/update_changelog.sh javascript-sdk-core",
|
|
19
|
+
"symlink": "yarn link",
|
|
20
|
+
"test": "jest",
|
|
21
21
|
"test:watch": "jest --watch",
|
|
22
22
|
"test:coverage": "jest --coverage"
|
|
23
23
|
},
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { IExternalEventSourceConstructor } from './types';
|
|
2
|
-
export interface IEventSource {
|
|
3
|
-
open: (onEvent: (timestamp: number) => void) => void;
|
|
4
|
-
close: () => void;
|
|
5
|
-
}
|
|
6
|
-
export declare class ExternalEventSource implements IEventSource {
|
|
7
|
-
private eventSource;
|
|
8
|
-
private siteCode;
|
|
9
|
-
constructor(siteCode: string, externalEventSource: IExternalEventSourceConstructor);
|
|
10
|
-
open(onEvent: (timestamp: number) => void): void;
|
|
11
|
-
close(): void;
|
|
12
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ExternalEventSource=void 0;var _requester=require("../requester"),_constants=require("../requester/constants"),_constants2=require("./constants");function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function _defineProperties(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,_toPropertyKey(c.key),c)}function _createClass(a,b,c){return b&&_defineProperties(a.prototype,b),c&&_defineProperties(a,c),Object.defineProperty(a,"prototype",{writable:!1}),a}function _defineProperty(a,b,c){return b=_toPropertyKey(b),b in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"===_typeof(b)?b:b+""}function _toPrimitive(a,b){if("object"!==_typeof(a)||null===a)return a;var c=a[Symbol.toPrimitive];if(c!==void 0){var d=c.call(a,b||"default");if("object"!==_typeof(d))return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}var ExternalEventSource=function(){function a(b,c){_classCallCheck(this,a),_defineProperty(this,"eventSource",void 0),_defineProperty(this,"siteCode",void 0);var d=_requester.URL.SERVER_SENT_EVENTS+_constants.UrlQuery.Sse+b,e=c.initialize(d);this.eventSource=e,this.siteCode=b}return _createClass(a,[{key:"open",value:function open(a){this.eventSource.open({onEvent:a,siteCode:this.siteCode,eventType:_constants2.REAL_TIME_EVENT})}},{key:"close",value:function close(){this.eventSource.close()}}]),a}();exports.ExternalEventSource=ExternalEventSource;
|
|
2
|
-
//# sourceMappingURL=externalEventSource.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"externalEventSource.js","names":["ExternalEventSource","a","siteCode","externalEventSource","_classCallCheck","_defineProperty","url","URL","SERVER_SENT_EVENTS","UrlQuery","Sse","eventSource","initialize","_createClass","key","value","open","onEvent","eventType","REAL_TIME_EVENT","close","exports"],"sources":["../../src/eventSource/externalEventSource.ts"],"sourcesContent":["import { URL } from 'src/requester';\nimport { UrlQuery } from 'src/requester/constants';\nimport { REAL_TIME_EVENT } from './constants';\nimport { IExternalEventSource, IExternalEventSourceConstructor } from './types';\n\nexport interface IEventSource {\n open: (onEvent: (timestamp: number) => void) => void;\n close: () => void;\n}\n\nexport class ExternalEventSource implements IEventSource {\n private eventSource: IExternalEventSource;\n private siteCode: string;\n\n constructor(\n siteCode: string,\n externalEventSource: IExternalEventSourceConstructor,\n ) {\n const url = URL.SERVER_SENT_EVENTS + UrlQuery.Sse + siteCode;\n const eventSource = externalEventSource.initialize(url);\n\n this.eventSource = eventSource;\n this.siteCode = siteCode;\n }\n\n public open(onEvent: (timestamp: number) => void): void {\n this.eventSource.open({\n onEvent,\n siteCode: this.siteCode,\n eventType: REAL_TIME_EVENT,\n });\n }\n\n public close(): void {\n this.eventSource.close();\n }\n}\n"],"mappings":"08CAUa,CAAAA,mBAAmB,YAI9B,SAAAC,EACEC,CAAgB,CAChBC,CAAoD,CACpD,CAAAC,eAAA,MAAAH,CAAA,EAAAI,eAAA,4BAAAA,eAAA,4BACM,CAAAC,CAAG,CAAGC,cAAG,CAACC,kBAAkB,CAAGC,mBAAQ,CAACC,GAAG,CAAGR,CAAQ,CACtDS,CAAW,CAAGR,CAAmB,CAACS,UAAU,CAACN,CAAG,CAAC,CAEvD,IAAI,CAACK,WAAW,CAAGA,CAAW,CAC9B,IAAI,CAACT,QAAQ,CAAGA,CAClB,CAAC,OAAAW,YAAA,CAAAZ,CAAA,GAAAa,GAAA,QAAAC,KAAA,CAED,SAAAC,KAAYC,CAAoC,CAAQ,CACtD,IAAI,CAACN,WAAW,CAACK,IAAI,CAAC,CACpBC,OAAO,CAAPA,CAAO,CACPf,QAAQ,CAAE,IAAI,CAACA,QAAQ,CACvBgB,SAAS,CAAEC,2BACb,CAAC,CACH,CAAC,GAAAL,GAAA,SAAAC,KAAA,CAED,SAAAK,MAAA,CAAqB,CACnB,IAAI,CAACT,WAAW,CAACS,KAAK,EACxB,CAAC,IAAAnB,CAAA,IAAAoB,OAAA,CAAArB,mBAAA,CAAAA,mBAAA"}
|