@kameleoon/javascript-sdk-core 1.1.1 → 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 (157) 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 +2 -1
  11. package/dist/campaignConfiguration/campaignConfiguration.js +243 -196
  12. package/dist/campaignConfiguration/campaignConfiguration.js.map +1 -1
  13. package/dist/campaignConfiguration/constants.d.ts +3 -3
  14. package/dist/campaignConfiguration/constants.js +22 -16
  15. package/dist/campaignConfiguration/constants.js.map +1 -1
  16. package/dist/campaignConfiguration/index.d.ts +1 -0
  17. package/dist/campaignConfiguration/index.js +85 -6
  18. package/dist/campaignConfiguration/index.js.map +1 -1
  19. package/dist/campaignConfiguration/types.d.ts +7 -3
  20. package/dist/campaignConfiguration/types.js +53 -45
  21. package/dist/campaignConfiguration/types.js.map +1 -1
  22. package/dist/clientSettings/clientSettings.d.ts +1 -1
  23. package/dist/clientSettings/clientSettings.js +28 -21
  24. package/dist/clientSettings/clientSettings.js.map +1 -1
  25. package/dist/clientSettings/index.js +18 -4
  26. package/dist/clientSettings/index.js.map +1 -1
  27. package/dist/clientSettings/types.d.ts +1 -1
  28. package/dist/clientSettings/types.js +4 -1
  29. package/dist/clientSettings/types.js.map +1 -1
  30. package/dist/constants.d.ts +11 -0
  31. package/dist/constants.js +37 -14
  32. package/dist/constants.js.map +1 -1
  33. package/dist/eventSource/constants.js +6 -2
  34. package/dist/eventSource/constants.js.map +1 -1
  35. package/dist/eventSource/externalEventSource.js +28 -20
  36. package/dist/eventSource/externalEventSource.js.map +1 -1
  37. package/dist/eventSource/index.js +49 -6
  38. package/dist/eventSource/index.js.map +1 -1
  39. package/dist/eventSource/types.d.ts +1 -1
  40. package/dist/eventSource/types.js +4 -1
  41. package/dist/eventSource/types.js.map +1 -1
  42. package/dist/hasher/hasher.d.ts +1 -1
  43. package/dist/hasher/hasher.js +37 -26
  44. package/dist/hasher/hasher.js.map +1 -1
  45. package/dist/hasher/index.js +11 -4
  46. package/dist/hasher/index.js.map +1 -1
  47. package/dist/hasher/types.d.ts +1 -1
  48. package/dist/hasher/types.js +4 -1
  49. package/dist/hasher/types.js.map +1 -1
  50. package/dist/index.d.ts +4 -2
  51. package/dist/index.js +309 -28
  52. package/dist/index.js.map +1 -1
  53. package/dist/kameleoonClient.d.ts +32 -19
  54. package/dist/kameleoonClient.js +353 -235
  55. package/dist/kameleoonClient.js.map +1 -1
  56. package/dist/kameleoonData/browser.js +37 -32
  57. package/dist/kameleoonData/browser.js.map +1 -1
  58. package/dist/kameleoonData/constants.js +6 -2
  59. package/dist/kameleoonData/constants.js.map +1 -1
  60. package/dist/kameleoonData/conversion.js +47 -40
  61. package/dist/kameleoonData/conversion.js.map +1 -1
  62. package/dist/kameleoonData/customData.js +62 -58
  63. package/dist/kameleoonData/customData.js.map +1 -1
  64. package/dist/kameleoonData/device.js +37 -32
  65. package/dist/kameleoonData/device.js.map +1 -1
  66. package/dist/kameleoonData/index.js +101 -18
  67. package/dist/kameleoonData/index.js.map +1 -1
  68. package/dist/kameleoonData/nonce.js +25 -13
  69. package/dist/kameleoonData/nonce.js.map +1 -1
  70. package/dist/kameleoonData/pageView.js +52 -44
  71. package/dist/kameleoonData/pageView.js.map +1 -1
  72. package/dist/kameleoonData/types.js +41 -26
  73. package/dist/kameleoonData/types.js.map +1 -1
  74. package/dist/kameleoonData/userAgent.js +33 -24
  75. package/dist/kameleoonData/userAgent.js.map +1 -1
  76. package/dist/kameleoonError/constants.d.ts +1 -1
  77. package/dist/kameleoonError/constants.js +25 -21
  78. package/dist/kameleoonError/constants.js.map +1 -1
  79. package/dist/kameleoonError/helpers.js +6 -4
  80. package/dist/kameleoonError/helpers.js.map +1 -1
  81. package/dist/kameleoonError/index.js +25 -8
  82. package/dist/kameleoonError/index.js.map +1 -1
  83. package/dist/kameleoonError/kameleoonError.d.ts +1 -1
  84. package/dist/kameleoonError/kameleoonError.js +64 -53
  85. package/dist/kameleoonError/kameleoonError.js.map +1 -1
  86. package/dist/kameleoonError/types.d.ts +1 -1
  87. package/dist/kameleoonError/types.js +26 -22
  88. package/dist/kameleoonError/types.js.map +1 -1
  89. package/dist/kameleoonUtils.js +34 -33
  90. package/dist/kameleoonUtils.js.map +1 -1
  91. package/dist/requester/constants.d.ts +6 -7
  92. package/dist/requester/constants.js +58 -45
  93. package/dist/requester/constants.js.map +1 -1
  94. package/dist/requester/index.d.ts +2 -2
  95. package/dist/requester/index.js +67 -8
  96. package/dist/requester/index.js.map +1 -1
  97. package/dist/requester/requester.d.ts +7 -7
  98. package/dist/requester/requester.js +90 -113
  99. package/dist/requester/requester.js.map +1 -1
  100. package/dist/requester/types.d.ts +38 -10
  101. package/dist/requester/types.js +14 -36
  102. package/dist/requester/types.js.map +1 -1
  103. package/dist/storage/constants.js +11 -7
  104. package/dist/storage/constants.js.map +1 -1
  105. package/dist/storage/externalStorage.js +33 -26
  106. package/dist/storage/externalStorage.js.map +1 -1
  107. package/dist/storage/index.js +55 -6
  108. package/dist/storage/index.js.map +1 -1
  109. package/dist/storage/types.js +4 -1
  110. package/dist/storage/types.js.map +1 -1
  111. package/dist/targeting/conditions/conditionFactory.js +24 -19
  112. package/dist/targeting/conditions/conditionFactory.js.map +1 -1
  113. package/dist/targeting/conditions/customDataCondition.js +99 -88
  114. package/dist/targeting/conditions/customDataCondition.js.map +1 -1
  115. package/dist/targeting/conditions/exclusiveExperimentCondition.js +27 -15
  116. package/dist/targeting/conditions/exclusiveExperimentCondition.js.map +1 -1
  117. package/dist/targeting/conditions/index.js +45 -10
  118. package/dist/targeting/conditions/index.js.map +1 -1
  119. package/dist/targeting/conditions/targetExperimentCondition.js +54 -32
  120. package/dist/targeting/conditions/targetExperimentCondition.js.map +1 -1
  121. package/dist/targeting/conditions/types.js +4 -1
  122. package/dist/targeting/conditions/types.js.map +1 -1
  123. package/dist/targeting/index.js +79 -13
  124. package/dist/targeting/index.js.map +1 -1
  125. package/dist/targeting/targetingNode.js +41 -33
  126. package/dist/targeting/targetingNode.js.map +1 -1
  127. package/dist/targeting/targetingTree.js +125 -104
  128. package/dist/targeting/targetingTree.js.map +1 -1
  129. package/dist/targeting/types.js +99 -91
  130. package/dist/targeting/types.js.map +1 -1
  131. package/dist/types.d.ts +34 -2
  132. package/dist/types.js +58 -21
  133. package/dist/types.js.map +1 -1
  134. package/dist/utilities/constants.js +6 -2
  135. package/dist/utilities/constants.js.map +1 -1
  136. package/dist/utilities/index.js +11 -4
  137. package/dist/utilities/index.js.map +1 -1
  138. package/dist/utilities/types.d.ts +9 -1
  139. package/dist/utilities/types.js +4 -1
  140. package/dist/utilities/types.js.map +1 -1
  141. package/dist/utilities/utilities.d.ts +6 -3
  142. package/dist/utilities/utilities.js +171 -105
  143. package/dist/utilities/utilities.js.map +1 -1
  144. package/dist/variationConfiguration/index.js +24 -4
  145. package/dist/variationConfiguration/index.js.map +1 -1
  146. package/dist/variationConfiguration/types.d.ts +1 -1
  147. package/dist/variationConfiguration/types.js +4 -1
  148. package/dist/variationConfiguration/types.js.map +1 -1
  149. package/dist/variationConfiguration/variation.js +35 -28
  150. package/dist/variationConfiguration/variation.js.map +1 -1
  151. package/dist/variationConfiguration/variationConfiguration.d.ts +5 -6
  152. package/dist/variationConfiguration/variationConfiguration.js +263 -230
  153. package/dist/variationConfiguration/variationConfiguration.js.map +1 -1
  154. package/package.json +6 -4
  155. package/dist/hasher/constants.d.ts +0 -1
  156. package/dist/hasher/constants.js +0 -5
  157. package/dist/hasher/constants.js.map +0 -1
@@ -1,248 +1,281 @@
1
1
  "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
14
6
  exports.VariationConfiguration = void 0;
15
- const ts_res_1 = require("ts-res");
16
- const hasher_1 = require("../hasher");
17
- const variation_1 = require("./variation");
18
- const kameleoonError_1 = require("../kameleoonError");
19
- const utilities_1 = require("../utilities");
20
- const types_1 = require("../campaignConfiguration/types");
21
- const constants_1 = require("../constants");
7
+ var _tsRes = require("ts-res");
8
+ var _hasher = require("../hasher");
9
+ var _variation = require("./variation");
10
+ var _kameleoonError = require("../kameleoonError");
11
+ var _utilities = require("../utilities");
12
+ var _types = require("../campaignConfiguration/types");
13
+ const _excluded = ["exposition"];
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; }
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; }
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; }
19
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
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); }
22
21
  class VariationConfiguration {
23
- constructor(experiments, externalStorage) {
24
- this.getAssociatedVariationId = (visitorCode, experimentId) => {
25
- let associatedVariation;
26
- this.storage.read().and((data) => {
27
- var _a;
28
- associatedVariation = (_a = data === null || data === void 0 ? void 0 : data[visitorCode]) === null || _a === void 0 ? void 0 : _a[experimentId];
29
- });
30
- const experiment = this.experiments.find((experiment) => experiment.id === String(experimentId));
31
- if (!experiment) {
32
- return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.ExperimentConfigurationNotFound, experimentId, visitorCode));
33
- }
34
- const variation = new variation_1.Variation(associatedVariation);
35
- if (variation.isValid(experiment === null || experiment === void 0 ? void 0 : experiment.respoolTime)) {
36
- return (0, ts_res_1.Ok)(variation.id);
37
- }
38
- return this.assignVariation(visitorCode, experiment);
39
- };
40
- this.experiments = experiments;
41
- this.storage = externalStorage;
22
+ constructor(experiments, externalStorage) {
23
+ _defineProperty(this, "experiments", void 0);
24
+ _defineProperty(this, "storage", void 0);
25
+ _defineProperty(this, "getAssociatedVariationId", (visitorCode, experimentId) => {
26
+ let associatedVariation;
27
+ this.storage.read().and(data => {
28
+ associatedVariation = data?.[visitorCode]?.[experimentId];
29
+ });
30
+ const experiment = this.experiments.find(experiment => experiment.id === String(experimentId));
31
+ if (!experiment) {
32
+ return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.ExperimentConfigurationNotFound, experimentId, visitorCode));
33
+ }
34
+ const variation = new _variation.Variation(associatedVariation);
35
+ if (variation.isValid(experiment?.respoolTime)) {
36
+ return (0, _tsRes.Ok)(variation.id);
37
+ }
38
+ return this.assignVariation(visitorCode, experiment);
39
+ });
40
+ this.experiments = experiments;
41
+ this.storage = externalStorage;
42
+ }
43
+ getAssignedVariations(visitorCode) {
44
+ const result = this.storage.read();
45
+ if (!result.ok) {
46
+ return result;
42
47
  }
43
- getAssignedVariations(visitorCode) {
44
- const result = this.storage.read();
45
- if (!result.ok) {
46
- return result;
47
- }
48
- const experiments = result.data[visitorCode];
49
- if (!experiments) {
50
- return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.StorageRead, visitorCode));
51
- }
52
- return (0, ts_res_1.Ok)(experiments);
48
+ const experiments = result.data[visitorCode];
49
+ if (!experiments) {
50
+ return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.StorageRead, visitorCode));
53
51
  }
54
- getFeatureFlagVariation({ visitorCode, featureFlag, targetingData, withAssignment = false, }) {
55
- const validateResult = utilities_1.Utilities.validateVisitorCode(visitorCode);
56
- if (!validateResult.ok) {
57
- return (0, ts_res_1.Err)(validateResult.error);
58
- }
59
- const { rules, featureKey, id: featureFlagId, defaultVariationKey, } = featureFlag;
60
- for (const rule of rules) {
61
- const { segment, experimentId, exposition, variationByExposition } = rule;
62
- // --- Check targeting ---
63
- const targetingResult = utilities_1.Utilities.checkTargeting({
64
- segment,
65
- visitorCode,
66
- experimentId,
67
- targetingData,
68
- variationConfiguration: this,
69
- });
70
- if (!targetingResult.ok) {
71
- return targetingResult;
72
- }
73
- if (!targetingResult.data) {
74
- continue;
75
- }
76
- // --- Check if there was already rule variation assigned ---
77
- const variationResult = this.getAssignedRuleVariation(visitorCode, rule);
78
- // --- Note ---
79
- // We don't handle `variationResult` error here, because it can only
80
- // return internal `DataInconsistency` exception meaning that we should just
81
- // continue execution thus re-allocating variation
82
- if (variationResult.ok && variationResult.data.variationId !== null) {
83
- return (0, ts_res_1.Ok)(Object.assign(Object.assign({}, variationResult.data), { featureFlagId,
84
- featureKey,
85
- rule }));
86
- }
87
- // --- Calculate new variation (and assign if `withAssignment` is `true`) ---
88
- const hashDouble = hasher_1.Hasher.obtainFeatureFlagHashDouble({
89
- visitorCode,
90
- campaignId: String(featureFlagId),
91
- });
92
- const reShuffledHashDouble = hasher_1.Hasher.obtainFeatureFlagHashDouble({
93
- visitorCode,
94
- campaignId: String(featureFlagId),
95
- reShuffle: true,
96
- });
97
- // --- Note ---
98
- // - Double check with different `hashDouble` is performed here in order
99
- // to first check rule's exposition for allocation and then inner `variationByExposition`
100
- // - If `hashDouble` would be same then some of the variations couldn't have never been reached
101
- if (hashDouble < exposition) {
102
- let totalDeviation = 0;
103
- for (const variation of variationByExposition) {
104
- totalDeviation += variation.exposition;
105
- if (reShuffledHashDouble <= totalDeviation) {
106
- // --- Note ---
107
- // For the `RuleType.EXPERIMENTATION` variation assignment must happen without
108
- // calculating experiment deviation
109
- if (rule.type === types_1.RuleType.EXPERIMENTATION && withAssignment) {
110
- this.updateStorageData({
111
- visitorCode,
112
- experimentId: String(experimentId),
113
- // --- Note ---
114
- // For `RuleType.EXPERIMENTATION` `variationId` can not be null
115
- variationId: variation.variationId,
116
- });
117
- }
118
- const { exposition } = variation, restParameters = __rest(variation, ["exposition"]);
119
- return (0, ts_res_1.Ok)(Object.assign(Object.assign({}, restParameters), { rule, featureFlagId, featureKey }));
120
- }
121
- }
122
- }
123
- if (rule.type === types_1.RuleType.EXPERIMENTATION) {
124
- return (0, ts_res_1.Ok)({
125
- variationKey: constants_1.OFF_VARIATION_KEY,
126
- variationId: null,
127
- featureFlagId,
128
- featureKey,
129
- rule,
130
- });
131
- }
132
- break;
133
- }
134
- return (0, ts_res_1.Ok)({
135
- featureKey,
136
- featureFlagId,
137
- variationKey: defaultVariationKey,
138
- variationId: null,
139
- rule: null,
140
- });
52
+ return (0, _tsRes.Ok)(experiments);
53
+ }
54
+ getFeatureFlagVariation({
55
+ visitorCode,
56
+ featureFlag,
57
+ targetingData,
58
+ withAssignment = false
59
+ }) {
60
+ const validateResult = _utilities.Utilities.validateVisitorCode(visitorCode);
61
+ if (!validateResult.ok) {
62
+ return (0, _tsRes.Err)(validateResult.error);
141
63
  }
142
- getExperimentVariation(visitorCode, experiment) {
143
- const { id, respoolTime, deviations } = experiment;
144
- const hashDouble = hasher_1.Hasher.obtainExperimentHashDouble({
145
- visitorCode,
146
- campaignId: id,
147
- respoolTime,
148
- });
149
- let isUnallocated = true;
64
+ const {
65
+ rules,
66
+ featureKey,
67
+ id: featureFlagId,
68
+ defaultVariationKey
69
+ } = featureFlag;
70
+ for (const rule of rules) {
71
+ const {
72
+ segment,
73
+ experimentId,
74
+ id,
75
+ exposition,
76
+ respoolTime,
77
+ variationByExposition
78
+ } = rule;
79
+
80
+ // --- Check targeting ---
81
+ const targetingResult = _utilities.Utilities.checkTargeting({
82
+ segment,
83
+ visitorCode,
84
+ experimentId,
85
+ targetingData,
86
+ variationConfiguration: this
87
+ });
88
+ if (!targetingResult.ok) {
89
+ return targetingResult;
90
+ }
91
+ if (!targetingResult.data) {
92
+ continue;
93
+ }
94
+
95
+ // --- Note ---
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({
99
+ visitorCode,
100
+ respoolTime,
101
+ campaignId: String(id)
102
+ });
103
+ if (ruleHash < exposition) {
150
104
  let totalDeviation = 0;
151
- let resultVariationId = 0;
152
- for (const deviation of deviations) {
153
- totalDeviation += deviation.value;
154
- if (totalDeviation >= hashDouble) {
155
- // --- Note ---
156
- // If sum of all variations is less than 1 (100%), then there is a chance
157
- // user will end up outside of any variation
158
- isUnallocated = false;
159
- // --- Note ---
160
- // 'origin' is the default `variationId`, it must return id of 0
161
- if (deviation.variationId !== 'origin') {
162
- resultVariationId = Number(deviation.variationId);
163
- }
164
- break;
165
- }
166
- }
167
- if (isUnallocated) {
168
- return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.NotAllocated, visitorCode));
169
- }
170
- return (0, ts_res_1.Ok)(resultVariationId);
171
- }
172
- assignVariation(visitorCode, experiment) {
173
- const variationResult = this.getExperimentVariation(visitorCode, experiment);
174
- if (!variationResult.ok) {
175
- return variationResult;
176
- }
177
- const result = this.updateStorageData({
178
- visitorCode,
179
- experimentId: experiment.id,
180
- variationId: variationResult.data,
105
+ const variationHash = _hasher.Hasher.obtainFeatureFlagHashDouble({
106
+ visitorCode,
107
+ respoolTime,
108
+ campaignId: String(experimentId)
181
109
  });
182
- if (!result.ok) {
183
- return result;
184
- }
185
- return (0, ts_res_1.Ok)(variationResult.data);
186
- }
187
- updateStorageData({ visitorCode, experimentId, variationId, }) {
188
- const result = this.storage.read();
189
- if (!result.ok) {
110
+ for (const variation of variationByExposition) {
111
+ totalDeviation += variation.exposition;
112
+ if (variationHash <= totalDeviation) {
190
113
  // --- Note ---
191
- // If there is a parsing error we return error
192
- // But if there is `LocalStorageRead` error it means that
193
- // data was read successfully and it's empty, which is not problem
194
- // cause that might be initial `read`
195
- if (result.error.type === kameleoonError_1.KameleoonException.StorageParse) {
196
- return result;
114
+ // For the `RuleType.EXPERIMENTATION` variation assignment must happen without
115
+ // calculating experiment deviation
116
+ if (rule.type === _types.RuleType.EXPERIMENTATION && withAssignment) {
117
+ this.updateStorageData({
118
+ visitorCode,
119
+ experimentId: String(experimentId),
120
+ // --- Note ---
121
+ // For `RuleType.EXPERIMENTATION` `variationId` can not be null
122
+ variationId: variation.variationId
123
+ });
197
124
  }
125
+ const {
126
+ exposition
127
+ } = variation,
128
+ restParameters = _objectWithoutProperties(variation, _excluded);
129
+ return (0, _tsRes.Ok)(_objectSpread(_objectSpread({}, restParameters), {}, {
130
+ rule,
131
+ featureFlagId,
132
+ featureKey,
133
+ experimentId
134
+ }));
135
+ }
198
136
  }
199
- const updatedVariationData = result.ok
200
- ? result.data
201
- : {};
202
- const updatedVariation = {
203
- variationId,
204
- assignmentDate: new Date().toString(),
205
- };
206
- if (updatedVariationData[visitorCode]) {
207
- updatedVariationData[visitorCode][experimentId] = updatedVariation;
208
- }
209
- else {
210
- updatedVariationData[visitorCode] = {
211
- [experimentId]: updatedVariation,
212
- };
213
- }
214
- return this.storage.write(updatedVariationData);
137
+ }
138
+ if (rule.type === _types.RuleType.TARGETED_DELIVERY) {
139
+ break;
140
+ }
215
141
  }
216
- getAssignedRuleVariation(visitorCode, rule) {
217
- const emptyVariation = {
218
- variationId: null,
219
- variationKey: '',
220
- };
221
- const { experimentId, variationByExposition } = rule;
222
- const variationsResult = this.getAssignedVariations(visitorCode);
142
+ return (0, _tsRes.Ok)({
143
+ featureKey,
144
+ featureFlagId,
145
+ experimentId: null,
146
+ variationKey: defaultVariationKey,
147
+ variationId: null,
148
+ rule: null
149
+ });
150
+ }
151
+ getExperimentVariation(visitorCode, experiment) {
152
+ const {
153
+ id,
154
+ respoolTime,
155
+ deviations
156
+ } = experiment;
157
+ const hashDouble = _hasher.Hasher.obtainExperimentHashDouble({
158
+ visitorCode,
159
+ campaignId: id,
160
+ respoolTime
161
+ });
162
+ let isUnallocated = true;
163
+ let totalDeviation = 0;
164
+ let resultVariationId = 0;
165
+ for (const deviation of deviations) {
166
+ totalDeviation += deviation.value;
167
+ if (totalDeviation >= hashDouble) {
223
168
  // --- Note ---
224
- // If there is an error, we just want to skip seeking
225
- // for variation in the storage, not throw an error
226
- if (!variationsResult.ok) {
227
- return (0, ts_res_1.Ok)(emptyVariation);
228
- }
229
- const variations = variationsResult.data;
230
- if (experimentId &&
231
- typeof variations[experimentId].variationId !== undefined) {
232
- const id = variations[experimentId].variationId;
233
- const featureFlagVariation = variationByExposition.find((item) => item.variationId == id);
234
- if (!featureFlagVariation) {
235
- // --- Note ---
236
- // This error is not described for public methods as
237
- // it serves internal purpose of checking whether
238
- // the persistent variation has been updated and should be re-allocated
239
- return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.DataInconsistency));
240
- }
241
- const { exposition } = featureFlagVariation, restParameters = __rest(featureFlagVariation, ["exposition"]);
242
- return (0, ts_res_1.Ok)(Object.assign({}, restParameters));
169
+ // If sum of all variations is less than 1 (100%), then there is a chance
170
+ // user will end up outside of any variation
171
+ isUnallocated = false;
172
+ // --- Note ---
173
+ // 'origin' is the default `variationId`, it must return id of 0
174
+ if (deviation.variationId !== 'origin') {
175
+ resultVariationId = Number(deviation.variationId);
243
176
  }
244
- return (0, ts_res_1.Ok)(emptyVariation);
177
+ break;
178
+ }
179
+ }
180
+ if (isUnallocated) {
181
+ return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.NotAllocated, visitorCode));
182
+ }
183
+ return (0, _tsRes.Ok)(resultVariationId);
184
+ }
185
+ assignVariation(visitorCode, experiment) {
186
+ const variationResult = this.getExperimentVariation(visitorCode, experiment);
187
+ if (!variationResult.ok) {
188
+ return variationResult;
189
+ }
190
+ const result = this.updateStorageData({
191
+ visitorCode,
192
+ experimentId: experiment.id,
193
+ variationId: variationResult.data
194
+ });
195
+ if (!result.ok) {
196
+ return result;
197
+ }
198
+ return (0, _tsRes.Ok)(variationResult.data);
199
+ }
200
+ updateStorageData({
201
+ visitorCode,
202
+ experimentId,
203
+ variationId
204
+ }) {
205
+ const result = this.storage.read();
206
+ if (!result.ok) {
207
+ // --- Note ---
208
+ // If there is a parsing error we return error
209
+ // But if there is `LocalStorageRead` error it means that
210
+ // data was read successfully and it's empty, which is not problem
211
+ // cause that might be initial `read`
212
+ if (result.error.type === _kameleoonError.KameleoonException.StorageParse) {
213
+ return result;
214
+ }
215
+ }
216
+ const updatedVariationData = result.ok ? result.data : {};
217
+ const updatedVariation = {
218
+ variationId,
219
+ assignmentDate: new Date().toString()
220
+ };
221
+ if (updatedVariationData[visitorCode]) {
222
+ updatedVariationData[visitorCode][experimentId] = updatedVariation;
223
+ } else {
224
+ updatedVariationData[visitorCode] = {
225
+ [experimentId]: updatedVariation
226
+ };
245
227
  }
228
+ return this.storage.write(updatedVariationData);
229
+ }
230
+
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
+ // }
246
279
  }
247
280
  exports.VariationConfiguration = VariationConfiguration;
248
281
  //# sourceMappingURL=variationConfiguration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"variationConfiguration.js","sourceRoot":"","sources":["../../src/variationConfiguration/variationConfiguration.ts"],"names":[],"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": "1.1.1",
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",
@@ -10,9 +10,11 @@
10
10
  "scripts": {
11
11
  "clean": "rimraf dist && rimraf tsconfig.tsbuildinfo",
12
12
  "start": "npm run clean && tsc -w",
13
- "build": "npm run clean && tsc",
13
+ "build": "npm run clean && npm run build:types && npm run build:js",
14
+ "build:types": "tsc --emitDeclarationOnly",
15
+ "build:js": "babel src --out-dir dist --extensions \".ts,.tsx\" --source-maps true",
14
16
  "deploy": "npm publish --tag latest --access public",
15
- "deploy-nexus": "npm publish --registry=https://nexus.kameleoon.net/repository/npm-kameleoon/",
17
+ "deploy-nexus": "/bin/bash ../../scripts/deploy_nexus.sh javascript-sdk-core",
16
18
  "update-documentation": "/bin/bash ../../scripts/update_documentation.sh javascript-sdk-core",
17
19
  "release": "/bin/bash ../../scripts/release.sh javascript-sdk-core",
18
20
  "test": "NODE_ENV=test && jest",
@@ -36,7 +38,6 @@
36
38
  },
37
39
  "dependencies": {
38
40
  "crypto-js": "^4.1.1",
39
- "node-fetch": "^2.6.1",
40
41
  "ts-res": "^1.1.1"
41
42
  },
42
43
  "devDependencies": {
@@ -45,6 +46,7 @@
45
46
  "@types/node": "^14.17.5",
46
47
  "@types/node-fetch": "^2.6.2",
47
48
  "jest": "^27.3.1",
49
+ "node-fetch": "2.6.1",
48
50
  "ts-jest": "^27.0.7"
49
51
  }
50
52
  }
@@ -1 +0,0 @@
1
- export declare const RESHUFFLE_SUFFIX = "variation";
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RESHUFFLE_SUFFIX = void 0;
4
- exports.RESHUFFLE_SUFFIX = 'variation';
5
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/hasher/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,WAAW,CAAC"}