@kameleoon/javascript-sdk-core 2.0.0 → 2.1.0

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.
Files changed (62) hide show
  1. package/dist/cacheManager/cacheManager.d.ts +38 -0
  2. package/dist/cacheManager/cacheManager.js +74 -0
  3. package/dist/cacheManager/cacheManager.js.map +1 -0
  4. package/dist/cacheManager/index.d.ts +2 -0
  5. package/dist/cacheManager/index.js +20 -0
  6. package/dist/cacheManager/index.js.map +1 -0
  7. package/dist/cacheManager/types.d.ts +14 -0
  8. package/dist/cacheManager/types.js +6 -0
  9. package/dist/cacheManager/types.js.map +1 -0
  10. package/dist/campaignConfiguration/campaignConfiguration.d.ts +1 -1
  11. package/dist/campaignConfiguration/campaignConfiguration.js +15 -10
  12. package/dist/campaignConfiguration/campaignConfiguration.js.map +1 -1
  13. package/dist/campaignConfiguration/constants.d.ts +3 -3
  14. package/dist/campaignConfiguration/constants.js +3 -3
  15. package/dist/campaignConfiguration/constants.js.map +1 -1
  16. package/dist/campaignConfiguration/index.d.ts +1 -0
  17. package/dist/campaignConfiguration/index.js +7 -0
  18. package/dist/campaignConfiguration/index.js.map +1 -1
  19. package/dist/campaignConfiguration/types.d.ts +4 -1
  20. package/dist/campaignConfiguration/types.js.map +1 -1
  21. package/dist/constants.d.ts +11 -0
  22. package/dist/constants.js +16 -1
  23. package/dist/constants.js.map +1 -1
  24. package/dist/hasher/hasher.d.ts +1 -1
  25. package/dist/hasher/hasher.js +7 -7
  26. package/dist/hasher/hasher.js.map +1 -1
  27. package/dist/hasher/types.d.ts +1 -1
  28. package/dist/hasher/types.js.map +1 -1
  29. package/dist/index.d.ts +2 -1
  30. package/dist/index.js +12 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/kameleoonClient.d.ts +16 -3
  33. package/dist/kameleoonClient.js +50 -3
  34. package/dist/kameleoonClient.js.map +1 -1
  35. package/dist/kameleoonError/constants.d.ts +1 -1
  36. package/dist/kameleoonError/constants.js +1 -1
  37. package/dist/kameleoonError/constants.js.map +1 -1
  38. package/dist/kameleoonError/kameleoonError.d.ts +1 -1
  39. package/dist/kameleoonError/kameleoonError.js +1 -1
  40. package/dist/kameleoonError/kameleoonError.js.map +1 -1
  41. package/dist/kameleoonError/types.d.ts +1 -1
  42. package/dist/kameleoonError/types.js +1 -1
  43. package/dist/kameleoonError/types.js.map +1 -1
  44. package/dist/requester/requester.js +3 -13
  45. package/dist/requester/requester.js.map +1 -1
  46. package/dist/types.d.ts +19 -2
  47. package/dist/types.js +9 -1
  48. package/dist/types.js.map +1 -1
  49. package/dist/utilities/types.d.ts +8 -0
  50. package/dist/utilities/types.js.map +1 -1
  51. package/dist/utilities/utilities.d.ts +5 -2
  52. package/dist/utilities/utilities.js +54 -0
  53. package/dist/utilities/utilities.js.map +1 -1
  54. package/dist/variationConfiguration/types.d.ts +1 -1
  55. package/dist/variationConfiguration/types.js.map +1 -1
  56. package/dist/variationConfiguration/variationConfiguration.d.ts +0 -1
  57. package/dist/variationConfiguration/variationConfiguration.js +70 -79
  58. package/dist/variationConfiguration/variationConfiguration.js.map +1 -1
  59. package/package.json +1 -1
  60. package/dist/hasher/constants.d.ts +0 -1
  61. package/dist/hasher/constants.js +0 -9
  62. package/dist/hasher/constants.js.map +0 -1
@@ -10,13 +10,11 @@ var _variation = require("./variation");
10
10
  var _kameleoonError = require("../kameleoonError");
11
11
  var _utilities = require("../utilities");
12
12
  var _types = require("../campaignConfiguration/types");
13
- var _constants = require("../constants");
14
- const _excluded = ["exposition"],
15
- _excluded2 = ["exposition"];
16
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
17
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
13
+ const _excluded = ["exposition"];
18
14
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
19
15
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
16
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
17
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
20
18
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
21
19
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
22
20
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
@@ -73,7 +71,9 @@ class VariationConfiguration {
73
71
  const {
74
72
  segment,
75
73
  experimentId,
74
+ id,
76
75
  exposition,
76
+ respoolTime,
77
77
  variationByExposition
78
78
  } = rule;
79
79
 
@@ -92,41 +92,24 @@ class VariationConfiguration {
92
92
  continue;
93
93
  }
94
94
 
95
- // --- Check if there was already rule variation assigned ---
96
- const variationResult = this.getAssignedRuleVariation(visitorCode, rule);
97
-
98
95
  // --- Note ---
99
- // We don't handle `variationResult` error here, because it can only
100
- // return internal `DataInconsistency` exception meaning that we should just
101
- // continue execution thus re-allocating variation
102
- if (variationResult.ok && variationResult.data.variationId !== null) {
103
- return (0, _tsRes.Ok)(_objectSpread(_objectSpread({}, variationResult.data), {}, {
104
- featureFlagId,
105
- featureKey,
106
- rule
107
- }));
108
- }
109
-
110
- // --- Calculate new variation (and assign if `withAssignment` is `true`) ---
111
- const hashDouble = _hasher.Hasher.obtainFeatureFlagHashDouble({
112
- visitorCode,
113
- campaignId: String(featureFlagId)
114
- });
115
- const reShuffledHashDouble = _hasher.Hasher.obtainFeatureFlagHashDouble({
96
+ // Calculate new variation (and assign it if `withAssignment` is `true`)
97
+ // First the the exposed rule is calculated and then the variation inside of it
98
+ const ruleHash = _hasher.Hasher.obtainFeatureFlagHashDouble({
116
99
  visitorCode,
117
- campaignId: String(featureFlagId),
118
- reShuffle: true
100
+ respoolTime,
101
+ campaignId: String(id)
119
102
  });
120
-
121
- // --- Note ---
122
- // - Double check with different `hashDouble` is performed here in order
123
- // to first check rule's exposition for allocation and then inner `variationByExposition`
124
- // - If `hashDouble` would be same then some of the variations could have never been reached
125
- if (hashDouble < exposition) {
103
+ if (ruleHash < exposition) {
126
104
  let totalDeviation = 0;
105
+ const variationHash = _hasher.Hasher.obtainFeatureFlagHashDouble({
106
+ visitorCode,
107
+ respoolTime,
108
+ campaignId: String(experimentId)
109
+ });
127
110
  for (const variation of variationByExposition) {
128
111
  totalDeviation += variation.exposition;
129
- if (reShuffledHashDouble <= totalDeviation) {
112
+ if (variationHash <= totalDeviation) {
130
113
  // --- Note ---
131
114
  // For the `RuleType.EXPERIMENTATION` variation assignment must happen without
132
115
  // calculating experiment deviation
@@ -146,25 +129,20 @@ class VariationConfiguration {
146
129
  return (0, _tsRes.Ok)(_objectSpread(_objectSpread({}, restParameters), {}, {
147
130
  rule,
148
131
  featureFlagId,
149
- featureKey
132
+ featureKey,
133
+ experimentId
150
134
  }));
151
135
  }
152
136
  }
153
137
  }
154
- if (rule.type === _types.RuleType.EXPERIMENTATION) {
155
- return (0, _tsRes.Ok)({
156
- variationKey: _constants.OFF_VARIATION_KEY,
157
- variationId: null,
158
- featureFlagId,
159
- featureKey,
160
- rule
161
- });
138
+ if (rule.type === _types.RuleType.TARGETED_DELIVERY) {
139
+ break;
162
140
  }
163
- break;
164
141
  }
165
142
  return (0, _tsRes.Ok)({
166
143
  featureKey,
167
144
  featureFlagId,
145
+ experimentId: null,
168
146
  variationKey: defaultVariationKey,
169
147
  variationId: null,
170
148
  rule: null
@@ -249,42 +227,55 @@ class VariationConfiguration {
249
227
  }
250
228
  return this.storage.write(updatedVariationData);
251
229
  }
252
- getAssignedRuleVariation(visitorCode, rule) {
253
- const emptyVariation = {
254
- variationId: null,
255
- variationKey: ''
256
- };
257
- const {
258
- experimentId,
259
- variationByExposition
260
- } = rule;
261
- const variationsResult = this.getAssignedVariations(visitorCode);
262
230
 
263
- // --- Note ---
264
- // If there is an error, we just want to skip seeking
265
- // for variation in the storage, not throw an error
266
- if (!variationsResult.ok) {
267
- return (0, _tsRes.Ok)(emptyVariation);
268
- }
269
- const variations = variationsResult.data;
270
- if (experimentId && typeof variations[experimentId].variationId !== undefined) {
271
- const id = variations[experimentId].variationId;
272
- const featureFlagVariation = variationByExposition.find(item => item.variationId == id);
273
- if (!featureFlagVariation) {
274
- // --- Note ---
275
- // This error is not described for public methods as
276
- // it serves internal purpose of checking whether
277
- // the persistent variation has been updated and should be re-allocated
278
- return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.DataInconsistency));
279
- }
280
- const {
281
- exposition
282
- } = featureFlagVariation,
283
- restParameters = _objectWithoutProperties(featureFlagVariation, _excluded2);
284
- return (0, _tsRes.Ok)(_objectSpread({}, restParameters));
285
- }
286
- return (0, _tsRes.Ok)(emptyVariation);
287
- }
231
+ // --- TODO: commented out in case of future logic rework ---
232
+ // --- Mind: `variationId` could cause the `undefined` issue ---
233
+ // --- Reference: https://development.kameleoon.net/sdk/javascript-sdk-packages/-/merge_requests/89 ---
234
+ // private getAssignedRuleVariation(
235
+ // visitorCode: string,
236
+ // rule: RuleItemType,
237
+ // ): Result<GetAssignedRuleVariationResultType, KameleoonError> {
238
+ // const emptyVariation: Omit<VariationByExpositionType, 'exposition'> = {
239
+ // variationId: null,
240
+ // variationKey: '',
241
+ // };
242
+ // const { experimentId, variationByExposition } = rule;
243
+
244
+ // const variationsResult = this.getAssignedVariations(visitorCode);
245
+
246
+ // // --- Note ---
247
+ // // If there is an error, we just want to skip seeking
248
+ // // for variation in the storage, not throw an error
249
+ // if (!variationsResult.ok) {
250
+ // return Ok(emptyVariation);
251
+ // }
252
+
253
+ // const variations = variationsResult.data;
254
+
255
+ // if (
256
+ // experimentId &&
257
+ // typeof variations[experimentId].variationId !== undefined
258
+ // ) {
259
+ // const id = variations[experimentId].variationId;
260
+ // const featureFlagVariation = variationByExposition.find(
261
+ // (item) => item.variationId == id,
262
+ // );
263
+
264
+ // if (!featureFlagVariation) {
265
+ // // --- Note ---
266
+ // // This error is not described for public methods as
267
+ // // it serves internal purpose of checking whether
268
+ // // the persistent variation has been updated and should be re-allocated
269
+ // return Err(new KameleoonError(KameleoonException.DataInconsistency));
270
+ // }
271
+
272
+ // const { exposition, ...restParameters } = featureFlagVariation;
273
+
274
+ // return Ok({ ...restParameters });
275
+ // }
276
+
277
+ // return Ok(emptyVariation);
278
+ // }
288
279
  }
289
280
  exports.VariationConfiguration = VariationConfiguration;
290
281
  //# sourceMappingURL=variationConfiguration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"variationConfiguration.js","names":["_tsRes","require","_hasher","_variation","_kameleoonError","_utilities","_types","_constants","_excluded","_excluded2","_objectWithoutProperties","source","excluded","target","_objectWithoutPropertiesLoose","key","i","Object","getOwnPropertySymbols","sourceSymbolKeys","length","indexOf","prototype","propertyIsEnumerable","call","sourceKeys","keys","ownKeys","object","enumerableOnly","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","TypeError","Number","VariationConfiguration","constructor","experiments","externalStorage","visitorCode","experimentId","associatedVariation","storage","read","and","data","experiment","find","id","Err","KameleoonError","KameleoonException","ExperimentConfigurationNotFound","variation","Variation","isValid","respoolTime","Ok","assignVariation","getAssignedVariations","result","ok","StorageRead","getFeatureFlagVariation","featureFlag","targetingData","withAssignment","validateResult","Utilities","validateVisitorCode","error","rules","featureKey","featureFlagId","defaultVariationKey","rule","segment","exposition","variationByExposition","targetingResult","checkTargeting","variationConfiguration","variationResult","getAssignedRuleVariation","variationId","hashDouble","Hasher","obtainFeatureFlagHashDouble","campaignId","reShuffledHashDouble","reShuffle","totalDeviation","type","RuleType","EXPERIMENTATION","updateStorageData","restParameters","variationKey","OFF_VARIATION_KEY","getExperimentVariation","deviations","obtainExperimentHashDouble","isUnallocated","resultVariationId","deviation","NotAllocated","StorageParse","updatedVariationData","updatedVariation","assignmentDate","Date","toString","write","emptyVariation","variationsResult","variations","featureFlagVariation","item","DataInconsistency","exports"],"sources":["../../src/variationConfiguration/variationConfiguration.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { ExperimentItemType } from '../campaignConfiguration';\nimport { Hasher } from '../hasher';\nimport { Variation } from './variation';\nimport { KameleoonError, KameleoonException } from '../kameleoonError';\nimport {\n IStorage,\n VariationDataType,\n ExperimentVariationsType,\n} from '../storage';\nimport {\n FeatureFlagVariationType,\n GetFeatureFlagVariationParametersType,\n GetAssignedRuleVariationResultType,\n VariationType,\n UpdateStorageParamsType,\n} from './types';\nimport { Utilities } from '../utilities';\nimport {\n RuleItemType,\n RuleType,\n VariationByExpositionType,\n} from '../campaignConfiguration/types';\nimport { OFF_VARIATION_KEY } from '../constants';\n\ninterface IVariationConfiguration {\n /**\n * @method getAssociatedVariationId - gets the id of a variation assigned to a visitor with `visitorCode` from the storage. If the visitor doesn't have associated variation yet, assigns a new one, stores it and returns it's id.\n */\n getAssociatedVariationId: (\n visitorCode: string,\n experimentId: number,\n ) => Result<number, KameleoonError>;\n /**\n * @method getAssignedVariations - obtains experiments with according variations that are *already assigned* and *stored* in the `variationStorage`. If `getAssociatedVariationId` had not been called before, there will be no variations to get.\n */\n getAssignedVariations(\n visitorCode: string,\n ): Result<ExperimentVariationsType, KameleoonError>;\n /**\n * @method getFeatureFlagVariation - 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 getFeatureFlagVariation: (\n params: GetFeatureFlagVariationParametersType,\n ) => Result<FeatureFlagVariationType, KameleoonError>;\n /**\n * @method getExperimentVariation - obtains variation for the experiment by calculating the variation for the visitor *without assigning* it to a visitor\n */\n getExperimentVariation: (\n visitorCode: string,\n experiment: ExperimentItemType,\n ) => Result<number, KameleoonError>;\n}\n\nexport class VariationConfiguration implements IVariationConfiguration {\n private experiments: ExperimentItemType[];\n private storage: IStorage<VariationDataType>;\n\n constructor(\n experiments: ExperimentItemType[],\n externalStorage: IStorage<VariationDataType>,\n ) {\n this.experiments = experiments;\n this.storage = externalStorage;\n }\n\n public getAssociatedVariationId = (\n visitorCode: string,\n experimentId: number,\n ): Result<number, KameleoonError> => {\n let associatedVariation: VariationType | undefined;\n\n this.storage.read().and((data) => {\n associatedVariation = data?.[visitorCode]?.[experimentId];\n });\n\n const experiment = this.experiments.find(\n (experiment) => experiment.id === String(experimentId),\n );\n\n if (!experiment) {\n return Err(\n new KameleoonError(\n KameleoonException.ExperimentConfigurationNotFound,\n experimentId,\n visitorCode,\n ),\n );\n }\n\n const variation = new Variation(associatedVariation);\n\n if (variation.isValid(experiment?.respoolTime)) {\n return Ok(variation.id);\n }\n\n return this.assignVariation(visitorCode, experiment);\n };\n\n public getAssignedVariations(\n visitorCode: string,\n ): Result<ExperimentVariationsType, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n return result;\n }\n\n const experiments = result.data[visitorCode];\n\n if (!experiments) {\n return Err(\n new KameleoonError(KameleoonException.StorageRead, visitorCode),\n );\n }\n\n return Ok(experiments);\n }\n\n public getFeatureFlagVariation({\n visitorCode,\n featureFlag,\n targetingData,\n withAssignment = false,\n }: GetFeatureFlagVariationParametersType): 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 { segment, experimentId, exposition, variationByExposition } = rule;\n\n // --- Check targeting ---\n const targetingResult = Utilities.checkTargeting({\n segment,\n visitorCode,\n experimentId,\n targetingData,\n variationConfiguration: this,\n });\n\n if (!targetingResult.ok) {\n return targetingResult;\n }\n\n if (!targetingResult.data) {\n continue;\n }\n\n // --- Check if there was already rule variation assigned ---\n const variationResult = this.getAssignedRuleVariation(visitorCode, rule);\n\n // --- Note ---\n // We don't handle `variationResult` error here, because it can only\n // return internal `DataInconsistency` exception meaning that we should just\n // continue execution thus re-allocating variation\n if (variationResult.ok && variationResult.data.variationId !== null) {\n return Ok({\n ...variationResult.data,\n featureFlagId,\n featureKey,\n rule,\n });\n }\n\n // --- Calculate new variation (and assign if `withAssignment` is `true`) ---\n const hashDouble = Hasher.obtainFeatureFlagHashDouble({\n visitorCode,\n campaignId: String(featureFlagId),\n });\n const reShuffledHashDouble = Hasher.obtainFeatureFlagHashDouble({\n visitorCode,\n campaignId: String(featureFlagId),\n reShuffle: true,\n });\n\n // --- Note ---\n // - Double check with different `hashDouble` is performed here in order\n // to first check rule's exposition for allocation and then inner `variationByExposition`\n // - If `hashDouble` would be same then some of the variations could have never been reached\n if (hashDouble < exposition) {\n let totalDeviation = 0;\n\n for (const variation of variationByExposition) {\n totalDeviation += variation.exposition;\n\n if (reShuffledHashDouble <= totalDeviation) {\n // --- Note ---\n // For the `RuleType.EXPERIMENTATION` variation assignment must happen without\n // calculating experiment deviation\n if (rule.type === RuleType.EXPERIMENTATION && withAssignment) {\n this.updateStorageData({\n visitorCode,\n experimentId: String(experimentId),\n // --- Note ---\n // For `RuleType.EXPERIMENTATION` `variationId` can not be null\n variationId: variation.variationId as number,\n });\n }\n\n const { exposition, ...restParameters } = variation;\n\n return Ok({ ...restParameters, rule, featureFlagId, featureKey });\n }\n }\n }\n\n if (rule.type === RuleType.EXPERIMENTATION) {\n return Ok({\n variationKey: OFF_VARIATION_KEY,\n variationId: null,\n featureFlagId,\n featureKey,\n rule,\n });\n }\n\n break;\n }\n\n return Ok({\n featureKey,\n featureFlagId,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n });\n }\n\n public getExperimentVariation(\n visitorCode: string,\n experiment: ExperimentItemType,\n ): Result<number, KameleoonError> {\n const { id, respoolTime, deviations } = experiment;\n\n const hashDouble = Hasher.obtainExperimentHashDouble({\n visitorCode,\n campaignId: id,\n respoolTime,\n });\n\n let isUnallocated = true;\n let totalDeviation = 0;\n let resultVariationId = 0;\n\n for (const deviation of deviations) {\n totalDeviation += deviation.value;\n\n if (totalDeviation >= hashDouble) {\n // --- Note ---\n // If sum of all variations is less than 1 (100%), then there is a chance\n // user will end up outside of any variation\n isUnallocated = false;\n // --- Note ---\n // 'origin' is the default `variationId`, it must return id of 0\n if (deviation.variationId !== 'origin') {\n resultVariationId = Number(deviation.variationId);\n }\n\n break;\n }\n }\n\n if (isUnallocated) {\n return Err(\n new KameleoonError(KameleoonException.NotAllocated, visitorCode),\n );\n }\n\n return Ok(resultVariationId);\n }\n\n private assignVariation(\n visitorCode: string,\n experiment: ExperimentItemType,\n ): Result<number, KameleoonError> {\n const variationResult = this.getExperimentVariation(\n visitorCode,\n experiment,\n );\n\n if (!variationResult.ok) {\n return variationResult;\n }\n\n const result = this.updateStorageData({\n visitorCode,\n experimentId: experiment.id,\n variationId: variationResult.data,\n });\n\n if (!result.ok) {\n return result;\n }\n\n return Ok(variationResult.data);\n }\n\n private updateStorageData({\n visitorCode,\n experimentId,\n variationId,\n }: UpdateStorageParamsType): 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 const updatedVariationData: VariationDataType = result.ok\n ? result.data\n : {};\n\n const updatedVariation = {\n variationId,\n assignmentDate: new Date().toString(),\n };\n\n if (updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode][experimentId] = updatedVariation;\n } else {\n updatedVariationData[visitorCode] = {\n [experimentId]: updatedVariation,\n };\n }\n\n return this.storage.write(updatedVariationData);\n }\n\n private getAssignedRuleVariation(\n visitorCode: string,\n rule: RuleItemType,\n ): Result<GetAssignedRuleVariationResultType, KameleoonError> {\n const emptyVariation: Omit<VariationByExpositionType, 'exposition'> = {\n variationId: null,\n variationKey: '',\n };\n const { experimentId, variationByExposition } = rule;\n\n const variationsResult = this.getAssignedVariations(visitorCode);\n\n // --- Note ---\n // If there is an error, we just want to skip seeking\n // for variation in the storage, not throw an error\n if (!variationsResult.ok) {\n return Ok(emptyVariation);\n }\n\n const variations = variationsResult.data;\n\n if (\n experimentId &&\n typeof variations[experimentId].variationId !== undefined\n ) {\n const id = variations[experimentId].variationId;\n const featureFlagVariation = variationByExposition.find(\n (item) => item.variationId == id,\n );\n\n if (!featureFlagVariation) {\n // --- Note ---\n // This error is not described for public methods as\n // it serves internal purpose of checking whether\n // the persistent variation has been updated and should be re-allocated\n return Err(new KameleoonError(KameleoonException.DataInconsistency));\n }\n\n const { exposition, ...restParameters } = featureFlagVariation;\n\n return Ok({ ...restParameters });\n }\n\n return Ok(emptyVariation);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"variationConfiguration.js","names":["_tsRes","require","_hasher","_variation","_kameleoonError","_utilities","_types","_excluded","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","sourceSymbolKeys","indexOf","prototype","propertyIsEnumerable","call","sourceKeys","obj","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","TypeError","Number","VariationConfiguration","constructor","experiments","externalStorage","visitorCode","experimentId","associatedVariation","storage","read","and","data","experiment","find","id","Err","KameleoonError","KameleoonException","ExperimentConfigurationNotFound","variation","Variation","isValid","respoolTime","Ok","assignVariation","getAssignedVariations","result","ok","StorageRead","getFeatureFlagVariation","featureFlag","targetingData","withAssignment","validateResult","Utilities","validateVisitorCode","error","rules","featureKey","featureFlagId","defaultVariationKey","rule","segment","exposition","variationByExposition","targetingResult","checkTargeting","variationConfiguration","ruleHash","Hasher","obtainFeatureFlagHashDouble","campaignId","totalDeviation","variationHash","type","RuleType","EXPERIMENTATION","updateStorageData","variationId","restParameters","TARGETED_DELIVERY","variationKey","getExperimentVariation","deviations","hashDouble","obtainExperimentHashDouble","isUnallocated","resultVariationId","deviation","NotAllocated","variationResult","StorageParse","updatedVariationData","updatedVariation","assignmentDate","Date","toString","write","exports"],"sources":["../../src/variationConfiguration/variationConfiguration.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { ExperimentItemType } from '../campaignConfiguration';\nimport { Hasher } from '../hasher';\nimport { Variation } from './variation';\nimport { KameleoonError, KameleoonException } from '../kameleoonError';\nimport {\n IStorage,\n VariationDataType,\n ExperimentVariationsType,\n} from '../storage';\nimport {\n FeatureFlagVariationType,\n GetFeatureFlagVariationParametersType,\n VariationType,\n UpdateStorageParamsType,\n} from './types';\nimport { Utilities } from '../utilities';\nimport { RuleType } from '../campaignConfiguration/types';\n\ninterface IVariationConfiguration {\n /**\n * @method getAssociatedVariationId - gets the id of a variation assigned to a visitor with `visitorCode` from the storage. If the visitor doesn't have associated variation yet, assigns a new one, stores it and returns it's id.\n */\n getAssociatedVariationId: (\n visitorCode: string,\n experimentId: number,\n ) => Result<number, KameleoonError>;\n /**\n * @method getAssignedVariations - obtains experiments with according variations that are *already assigned* and *stored* in the `variationStorage`. If `getAssociatedVariationId` had not been called before, there will be no variations to get.\n */\n getAssignedVariations(\n visitorCode: string,\n ): Result<ExperimentVariationsType, KameleoonError>;\n /**\n * @method getFeatureFlagVariation - 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 getFeatureFlagVariation: (\n params: GetFeatureFlagVariationParametersType,\n ) => Result<FeatureFlagVariationType, KameleoonError>;\n /**\n * @method getExperimentVariation - obtains variation for the experiment by calculating the variation for the visitor *without assigning* it to a visitor\n */\n getExperimentVariation: (\n visitorCode: string,\n experiment: ExperimentItemType,\n ) => Result<number, KameleoonError>;\n}\n\nexport class VariationConfiguration implements IVariationConfiguration {\n private experiments: ExperimentItemType[];\n private storage: IStorage<VariationDataType>;\n\n constructor(\n experiments: ExperimentItemType[],\n externalStorage: IStorage<VariationDataType>,\n ) {\n this.experiments = experiments;\n this.storage = externalStorage;\n }\n\n public getAssociatedVariationId = (\n visitorCode: string,\n experimentId: number,\n ): Result<number, KameleoonError> => {\n let associatedVariation: VariationType | undefined;\n\n this.storage.read().and((data) => {\n associatedVariation = data?.[visitorCode]?.[experimentId];\n });\n\n const experiment = this.experiments.find(\n (experiment) => experiment.id === String(experimentId),\n );\n\n if (!experiment) {\n return Err(\n new KameleoonError(\n KameleoonException.ExperimentConfigurationNotFound,\n experimentId,\n visitorCode,\n ),\n );\n }\n\n const variation = new Variation(associatedVariation);\n\n if (variation.isValid(experiment?.respoolTime)) {\n return Ok(variation.id);\n }\n\n return this.assignVariation(visitorCode, experiment);\n };\n\n public getAssignedVariations(\n visitorCode: string,\n ): Result<ExperimentVariationsType, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n return result;\n }\n\n const experiments = result.data[visitorCode];\n\n if (!experiments) {\n return Err(\n new KameleoonError(KameleoonException.StorageRead, visitorCode),\n );\n }\n\n return Ok(experiments);\n }\n\n public getFeatureFlagVariation({\n visitorCode,\n featureFlag,\n targetingData,\n withAssignment = false,\n }: GetFeatureFlagVariationParametersType): 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 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.obtainFeatureFlagHashDouble({\n visitorCode,\n respoolTime,\n campaignId: String(id),\n });\n\n if (ruleHash < exposition) {\n let totalDeviation = 0;\n\n const variationHash = Hasher.obtainFeatureFlagHashDouble({\n visitorCode,\n respoolTime,\n campaignId: String(experimentId),\n });\n\n for (const variation of variationByExposition) {\n totalDeviation += variation.exposition;\n\n if (variationHash <= totalDeviation) {\n // --- Note ---\n // For the `RuleType.EXPERIMENTATION` variation assignment must happen without\n // calculating experiment deviation\n if (rule.type === RuleType.EXPERIMENTATION && withAssignment) {\n this.updateStorageData({\n visitorCode,\n experimentId: String(experimentId),\n // --- Note ---\n // For `RuleType.EXPERIMENTATION` `variationId` can not be null\n variationId: variation.variationId as number,\n });\n }\n\n const { exposition, ...restParameters } = variation;\n\n return Ok({\n ...restParameters,\n rule,\n featureFlagId,\n featureKey,\n experimentId,\n });\n }\n }\n }\n\n if (rule.type === RuleType.TARGETED_DELIVERY) {\n break;\n }\n }\n\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n });\n }\n\n public getExperimentVariation(\n visitorCode: string,\n experiment: ExperimentItemType,\n ): Result<number, KameleoonError> {\n const { id, respoolTime, deviations } = experiment;\n\n const hashDouble = Hasher.obtainExperimentHashDouble({\n visitorCode,\n campaignId: id,\n respoolTime,\n });\n\n let isUnallocated = true;\n let totalDeviation = 0;\n let resultVariationId = 0;\n\n for (const deviation of deviations) {\n totalDeviation += deviation.value;\n\n if (totalDeviation >= hashDouble) {\n // --- Note ---\n // If sum of all variations is less than 1 (100%), then there is a chance\n // user will end up outside of any variation\n isUnallocated = false;\n // --- Note ---\n // 'origin' is the default `variationId`, it must return id of 0\n if (deviation.variationId !== 'origin') {\n resultVariationId = Number(deviation.variationId);\n }\n\n break;\n }\n }\n\n if (isUnallocated) {\n return Err(\n new KameleoonError(KameleoonException.NotAllocated, visitorCode),\n );\n }\n\n return Ok(resultVariationId);\n }\n\n private assignVariation(\n visitorCode: string,\n experiment: ExperimentItemType,\n ): Result<number, KameleoonError> {\n const variationResult = this.getExperimentVariation(\n visitorCode,\n experiment,\n );\n\n if (!variationResult.ok) {\n return variationResult;\n }\n\n const result = this.updateStorageData({\n visitorCode,\n experimentId: experiment.id,\n variationId: variationResult.data,\n });\n\n if (!result.ok) {\n return result;\n }\n\n return Ok(variationResult.data);\n }\n\n private updateStorageData({\n visitorCode,\n experimentId,\n variationId,\n }: UpdateStorageParamsType): 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 const updatedVariationData: VariationDataType = result.ok\n ? result.data\n : {};\n\n const updatedVariation = {\n variationId,\n assignmentDate: new Date().toString(),\n };\n\n if (updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode][experimentId] = updatedVariation;\n } else {\n updatedVariationData[visitorCode] = {\n [experimentId]: updatedVariation,\n };\n }\n\n return this.storage.write(updatedVariationData);\n }\n\n // --- TODO: commented out in case of future logic rework ---\n // --- Mind: `variationId` could cause the `undefined` issue ---\n // --- Reference: https://development.kameleoon.net/sdk/javascript-sdk-packages/-/merge_requests/89 ---\n // private getAssignedRuleVariation(\n // visitorCode: string,\n // rule: RuleItemType,\n // ): Result<GetAssignedRuleVariationResultType, KameleoonError> {\n // const emptyVariation: Omit<VariationByExpositionType, 'exposition'> = {\n // variationId: null,\n // variationKey: '',\n // };\n // const { experimentId, variationByExposition } = rule;\n\n // const variationsResult = this.getAssignedVariations(visitorCode);\n\n // // --- Note ---\n // // If there is an error, we just want to skip seeking\n // // for variation in the storage, not throw an error\n // if (!variationsResult.ok) {\n // return Ok(emptyVariation);\n // }\n\n // const variations = variationsResult.data;\n\n // if (\n // experimentId &&\n // typeof variations[experimentId].variationId !== undefined\n // ) {\n // const id = variations[experimentId].variationId;\n // const featureFlagVariation = variationByExposition.find(\n // (item) => item.variationId == id,\n // );\n\n // if (!featureFlagVariation) {\n // // --- Note ---\n // // This error is not described for public methods as\n // // it serves internal purpose of checking whether\n // // the persistent variation has been updated and should be re-allocated\n // return Err(new KameleoonError(KameleoonException.DataInconsistency));\n // }\n\n // const { exposition, ...restParameters } = featureFlagVariation;\n\n // return Ok({ ...restParameters });\n // }\n\n // return Ok(emptyVariation);\n // }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kameleoon/javascript-sdk-core",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Kameleoon JS SDK Core",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1 +0,0 @@
1
- export declare const RESHUFFLE_SUFFIX = "variation";
@@ -1,9 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.RESHUFFLE_SUFFIX = void 0;
7
- const RESHUFFLE_SUFFIX = 'variation';
8
- exports.RESHUFFLE_SUFFIX = RESHUFFLE_SUFFIX;
9
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","names":["RESHUFFLE_SUFFIX","exports"],"sources":["../../src/hasher/constants.ts"],"sourcesContent":["export const RESHUFFLE_SUFFIX = 'variation';\n"],"mappings":";;;;;;AAAO,MAAMA,gBAAgB,GAAG,WAAW;AAACC,OAAA,CAAAD,gBAAA,GAAAA,gBAAA"}