import { PrewarmLevel } from '../../model/PrewarmLevel';
/**
* 单调去重状态(design.md Decision 4)。
*
* - `MINIMAL`:全局只做一次(`minimalDone`)。
* - `LIGHT` / `HEAVY`:每 bizType 记录已达最高档;低于等于已达档则不再执行。
* - 不允许降级重热;仅 manifest version 变化时 `reset()` 整体重置。
*/
export class PrewarmDedup {
private reached: Map<string, PrewarmLevel> = new Map();
private minimalDone: boolean = false;
/**
* 判断本次 `(level, bizType)` 是否应执行(未被去重)。
*/
public shouldRun(level: PrewarmLevel, bizType: string): boolean {
if (level === PrewarmLevel.MINIMAL) {
return !this.minimalDone;
}
const cur: PrewarmLevel | undefined = this.reached.get(bizType);
if (cur === undefined) {
return true;
}
return level > cur;
}
/**
* 标记 `(level, bizType)` 已完成,更新已达档(单调不降)。
*/
public markDone(level: PrewarmLevel, bizType: string): void {
if (level === PrewarmLevel.MINIMAL) {
this.minimalDone = true;
return;
}
const cur: PrewarmLevel | undefined = this.reached.get(bizType);
if (cur === undefined || level > cur) {
this.reached.set(bizType, level);
}
}
/** 整体重置(manifest version 变化时调用)。 */
public reset(): void {
this.reached.clear();
this.minimalDone = false;
}
}
|