monitor/core/modules/UpdateChecker/updateRollout.ts
2025-04-16 22:30:27 +07:00

70 lines
1.9 KiB
TypeScript

import type { ReleaseType } from 'semver';
type RolloutStrategyType = {
pct: number,
delay: number
}[];
/**
* Returns the delay in days for the update rollout based on the release type and the dice roll.
*/
export const getUpdateRolloutDelay = (
releaseDiff: ReleaseType,
isCurrentPreRelease: boolean,
diceRoll: number,
): number => {
//Sanity check diceRoll
if (diceRoll < 0 || diceRoll > 100) {
return 0;
}
let rolloutStrategy: RolloutStrategyType;
if (isCurrentPreRelease) {
// If you are on beta, it's probably really important to update immediately
rolloutStrategy = [
{ pct: 100, delay: 0 },
];
} else if (releaseDiff === 'major') {
// 5% immediate rollout
// 20% after 2 days
// 100% after 7 days
rolloutStrategy = [
{ pct: 5, delay: 0 },
{ pct: 15, delay: 2 },
{ pct: 80, delay: 7 },
];
} else if (releaseDiff === 'minor') {
// 10% immediate rollout
// 40% after 2 day
// 100% after 4 days
rolloutStrategy = [
{ pct: 10, delay: 0 },
{ pct: 30, delay: 2 },
{ pct: 60, delay: 4 },
];
} else if (releaseDiff === 'patch') {
// Immediate rollout to everyone, probably correcting bugs
rolloutStrategy = [
{ pct: 100, delay: 0 },
];
} else {
// Update notification from stable to pre-release should not happen, delay 7 days
rolloutStrategy = [
{ pct: 100, delay: 7 },
];
}
// Implement strategy based on diceRoll
let cumulativePct = 0;
for (const tier of rolloutStrategy) {
cumulativePct += tier.pct;
if (diceRoll <= cumulativePct) {
return tier.delay;
}
}
// Default delay if somehow no tier is matched (which shouldn't happen)
return 0;
};