[PM-6426] Working through jest tests and implementing a method to guard against setting a task without having a registered callback

This commit is contained in:
Cesar Gonzalez 2024-04-30 16:00:33 -05:00
parent ad3f2e4eb9
commit a907a401d0
No known key found for this signature in database
GPG Key ID: 3381A5457F8CCECF
2 changed files with 59 additions and 34 deletions

View File

@ -10,29 +10,22 @@ export type TaskIdentifier = {
};
export abstract class TaskSchedulerService {
protected taskHandlers: Map<string, () => void>;
constructor(
protected logService: LogService,
protected stateProvider: StateProvider,
) {}
abstract registerTaskHandler(taskName: ScheduledTaskName, handler: () => void): void;
abstract unregisterTaskHandler(taskName: ScheduledTaskName): void;
protected taskHandlers: Map<string, () => void>;
abstract setTimeout(
taskName: ScheduledTaskName,
delayInMs: number,
): Promise<number | NodeJS.Timeout>;
abstract setInterval(
taskName: ScheduledTaskName,
intervalInMs: number,
initialDelayInMs?: number,
): Promise<number | NodeJS.Timeout>;
abstract clearScheduledTask(taskIdentifier: TaskIdentifier): Promise<void>;
abstract registerTaskHandler(taskName: ScheduledTaskName, handler: () => void): void;
abstract unregisterTaskHandler(taskName: ScheduledTaskName): void;
protected abstract triggerTask(taskName: ScheduledTaskName, periodInMinutes?: number): void;
}

View File

@ -10,30 +10,6 @@ export class DefaultTaskSchedulerService extends TaskSchedulerService {
this.taskHandlers = new Map();
}
registerTaskHandler(taskName: ScheduledTaskName, handler: () => void) {
const existingHandler = this.taskHandlers.get(taskName);
if (existingHandler) {
this.logService.warning(`Task handler for ${taskName} already exists. Overwriting.`);
this.unregisterTaskHandler(taskName);
}
this.taskHandlers.set(taskName, handler);
}
unregisterTaskHandler(taskName: ScheduledTaskName) {
this.taskHandlers.delete(taskName);
}
protected async triggerTask(
taskName: ScheduledTaskName,
_periodInMinutes?: number,
): Promise<void> {
const handler = this.taskHandlers.get(taskName);
if (handler) {
handler();
}
}
/**
* Sets a timeout and returns the timeout id.
*
@ -44,6 +20,8 @@ export class DefaultTaskSchedulerService extends TaskSchedulerService {
taskName: ScheduledTaskName,
delayInMs: number,
): Promise<number | NodeJS.Timeout> {
this.validateRegisteredTask(taskName);
return globalThis.setTimeout(() => this.triggerTask(taskName), delayInMs);
}
@ -59,6 +37,8 @@ export class DefaultTaskSchedulerService extends TaskSchedulerService {
intervalInMs: number,
_initialDelayInMs?: number,
): Promise<number | NodeJS.Timeout> {
this.validateRegisteredTask(taskName);
return globalThis.setInterval(() => this.triggerTask(taskName), intervalInMs);
}
@ -76,4 +56,56 @@ export class DefaultTaskSchedulerService extends TaskSchedulerService {
globalThis.clearInterval(taskIdentifier.intervalId);
}
}
/**
* Registers a task handler.
*
* @param taskName - The name of the task.
* @param handler - The task handler.
*/
registerTaskHandler(taskName: ScheduledTaskName, handler: () => void) {
const existingHandler = this.taskHandlers.get(taskName);
if (existingHandler) {
this.logService.warning(`Task handler for ${taskName} already exists. Overwriting.`);
this.unregisterTaskHandler(taskName);
}
this.taskHandlers.set(taskName, handler);
}
/**
* Unregisters a task handler.
*
* @param taskName - The name of the task.
*/
unregisterTaskHandler(taskName: ScheduledTaskName) {
this.taskHandlers.delete(taskName);
}
/**
* Triggers a task.
*
* @param taskName - The name of the task.
* @param _periodInMinutes - The period in minutes. Unused in the base implementation.
*/
protected async triggerTask(
taskName: ScheduledTaskName,
_periodInMinutes?: number,
): Promise<void> {
const handler = this.taskHandlers.get(taskName);
if (handler) {
handler();
}
}
/**
* Validates that a task handler is registered.
*
* @param taskName - The name of the task.
*/
protected validateRegisteredTask(taskName: ScheduledTaskName): void {
if (!this.taskHandlers.has(taskName)) {
throw new Error(`Task handler for ${taskName} not registered. Unable to schedule task.`);
}
}
}