1
0
Files
stale/src/classes/state/state.ts
T

72 lines
2.0 KiB
TypeScript
Raw Normal View History

2023-06-23 23:13:39 +02:00
import {IState} from '../../interfaces/state/state';
import * as core from '@actions/core';
import {IIssuesProcessorOptions} from '../../interfaces/issues-processor-options';
import {IStateStorage} from '../../interfaces/state/state-storage';
2023-07-02 11:01:29 +02:00
import {IIssue} from '../../interfaces/issue';
2023-06-23 23:13:39 +02:00
export type IssueID = number;
export class NoStateError extends Error {}
export class State implements IState {
/**
* @private don't mutate in the debug mode
*/
private readonly debug: boolean;
private readonly processedIssuesIDs: Set<IssueID>;
private readonly stateStorage: IStateStorage;
constructor(stateStorage: IStateStorage, options: IIssuesProcessorOptions) {
this.debug = options.debugOnly;
this.processedIssuesIDs = new Set();
this.stateStorage = stateStorage;
}
2023-07-02 11:01:29 +02:00
isIssueProcessed(issue: IIssue) {
2023-06-23 23:13:39 +02:00
return this.processedIssuesIDs.has(issue.number);
}
2023-07-02 11:01:29 +02:00
addIssueToProcessed(issue: IIssue) {
2023-06-23 23:13:39 +02:00
core.debug(`state: mark ${issue.number} as processed`);
2023-07-02 11:01:29 +02:00
this.processedIssuesIDs.add(issue.number);
2023-06-23 23:13:39 +02:00
}
reset() {
core.debug('state: reset');
2023-07-02 11:01:29 +02:00
this.processedIssuesIDs.clear();
2023-06-23 23:13:39 +02:00
}
private deserialize(serialized: string) {
const issueIDs = serialized
.split('|')
.map(id => parseInt(id))
.filter(i => !isNaN(i));
this.processedIssuesIDs.clear();
issueIDs.forEach(issueID => this.processedIssuesIDs.add(issueID));
}
private get serialized(): string {
return Array.from(this.processedIssuesIDs).join('|');
}
async persist(): Promise<void> {
if (this.debug) {
2023-07-02 11:01:29 +02:00
core.warning('The state is not persisted in the debug mode');
2023-06-23 23:13:39 +02:00
return;
}
core.info(
`state: persisting info about ${this.processedIssuesIDs.size} issue(s)`
);
return this.stateStorage.save(this.serialized);
}
async rehydrate(): Promise<void> {
this.reset();
const serialized = await this.stateStorage.restore();
this.deserialize(serialized);
core.info(
2023-07-02 11:01:29 +02:00
`state: rehydrated with info about ${this.processedIssuesIDs.size} issue(s)`
2023-06-23 23:13:39 +02:00
);
}
}