summaryrefslogtreecommitdiff
path: root/node_modules/@jet-app/app-store/tmp/src/common/util/lottery.js
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /node_modules/@jet-app/app-store/tmp/src/common/util/lottery.js
init commit
Diffstat (limited to 'node_modules/@jet-app/app-store/tmp/src/common/util/lottery.js')
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/util/lottery.js62
1 files changed, 62 insertions, 0 deletions
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/util/lottery.js b/node_modules/@jet-app/app-store/tmp/src/common/util/lottery.js
new file mode 100644
index 0000000..5916128
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/util/lottery.js
@@ -0,0 +1,62 @@
+import { isNothing } from "@jet/environment";
+import { MetricsIdentifierType } from "../../foundation/metrics/metrics-identifiers-cache";
+export function isFeatureEnabledForCurrentUser(objectGraph, rolloutRate) {
+ var _a;
+ if (rolloutRate <= 0.0) {
+ return false;
+ }
+ if (rolloutRate >= 1.0) {
+ // It is important that we not require a metrics ID when our rollout rate is 100%
+ return true;
+ }
+ const metricsIdString = (_a = objectGraph.metricsIdentifiersCache) === null || _a === void 0 ? void 0 : _a.getMetricsIdForType(MetricsIdentifierType.user);
+ if (isNothing(metricsIdString) || metricsIdString.length === 0) {
+ // if the user does not have a DSID, err on the side of caution.
+ return false;
+ }
+ if (metricsIdString.length < 2) {
+ // If we don't have enough characters to normalize, which should never happen, safely return false.
+ return false;
+ }
+ return normalizedMetricsIdLotteryValue(metricsIdString) < rolloutRate;
+}
+/**
+ * Gets a normalized value based on the metrics ID to match against the rollout rate to bucket a user.
+ * @param metricsId The user's metrics ID string
+ * @returns A value from 0.0 to 1.0 that we use to bucket the user
+ */
+function normalizedMetricsIdLotteryValue(metricsId) {
+ // Character mapping function that converts a character to its corresponding number.
+ // This value is guaranteed to be between 0 and 61, inclusive.
+ function charToNumber(char) {
+ const charCode = char.charCodeAt(0);
+ if (charCode >= 48 && charCode <= 57) {
+ // '0'-'9'
+ return 52 + charCode - 48;
+ }
+ else if (charCode >= 65 && charCode <= 90) {
+ // 'A'-'Z'
+ return 26 + charCode - 65;
+ }
+ else if (charCode >= 97 && charCode <= 122) {
+ // 'a'-'z'
+ return charCode - 97;
+ }
+ // This should never happen, if it does, the metrics ID is corrupt, but we rely on that not happening.
+ // This would indeed break the value guarantee.
+ return charCode;
+ }
+ // Extract the last two characters from the string.
+ const lastTwoChars = metricsId.slice(-2);
+ // Convert each of the last two characters to their respective number representation.
+ const num1 = charToNumber(lastTwoChars[0]);
+ const num2 = charToNumber(lastTwoChars[1]);
+ // Combine the two numbers into a single base-62 number.
+ const combinedValue = num1 * 62 + num2;
+ // Calculate the maximum possible value for two characters (each char has a value of 0 to 61, inclusive).
+ const maxValue = 61 * 62 + 61;
+ // Normalize the combined value to be between 0.0 and 1.0.
+ const normalizedValue = combinedValue / maxValue;
+ return normalizedValue;
+}
+//# sourceMappingURL=lottery.js.map \ No newline at end of file