70 lines
1.9 KiB
TypeScript
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;
|
|
};
|