[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:
parent
ad3f2e4eb9
commit
a907a401d0
|
@ -10,29 +10,22 @@ export type TaskIdentifier = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export abstract class TaskSchedulerService {
|
export abstract class TaskSchedulerService {
|
||||||
protected taskHandlers: Map<string, () => void>;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
protected logService: LogService,
|
protected logService: LogService,
|
||||||
protected stateProvider: StateProvider,
|
protected stateProvider: StateProvider,
|
||||||
) {}
|
) {}
|
||||||
|
protected taskHandlers: Map<string, () => void>;
|
||||||
abstract registerTaskHandler(taskName: ScheduledTaskName, handler: () => void): void;
|
|
||||||
|
|
||||||
abstract unregisterTaskHandler(taskName: ScheduledTaskName): void;
|
|
||||||
|
|
||||||
abstract setTimeout(
|
abstract setTimeout(
|
||||||
taskName: ScheduledTaskName,
|
taskName: ScheduledTaskName,
|
||||||
delayInMs: number,
|
delayInMs: number,
|
||||||
): Promise<number | NodeJS.Timeout>;
|
): Promise<number | NodeJS.Timeout>;
|
||||||
|
|
||||||
abstract setInterval(
|
abstract setInterval(
|
||||||
taskName: ScheduledTaskName,
|
taskName: ScheduledTaskName,
|
||||||
intervalInMs: number,
|
intervalInMs: number,
|
||||||
initialDelayInMs?: number,
|
initialDelayInMs?: number,
|
||||||
): Promise<number | NodeJS.Timeout>;
|
): Promise<number | NodeJS.Timeout>;
|
||||||
|
|
||||||
abstract clearScheduledTask(taskIdentifier: TaskIdentifier): Promise<void>;
|
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;
|
protected abstract triggerTask(taskName: ScheduledTaskName, periodInMinutes?: number): void;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,30 +10,6 @@ export class DefaultTaskSchedulerService extends TaskSchedulerService {
|
||||||
this.taskHandlers = new Map();
|
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.
|
* Sets a timeout and returns the timeout id.
|
||||||
*
|
*
|
||||||
|
@ -44,6 +20,8 @@ export class DefaultTaskSchedulerService extends TaskSchedulerService {
|
||||||
taskName: ScheduledTaskName,
|
taskName: ScheduledTaskName,
|
||||||
delayInMs: number,
|
delayInMs: number,
|
||||||
): Promise<number | NodeJS.Timeout> {
|
): Promise<number | NodeJS.Timeout> {
|
||||||
|
this.validateRegisteredTask(taskName);
|
||||||
|
|
||||||
return globalThis.setTimeout(() => this.triggerTask(taskName), delayInMs);
|
return globalThis.setTimeout(() => this.triggerTask(taskName), delayInMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +37,8 @@ export class DefaultTaskSchedulerService extends TaskSchedulerService {
|
||||||
intervalInMs: number,
|
intervalInMs: number,
|
||||||
_initialDelayInMs?: number,
|
_initialDelayInMs?: number,
|
||||||
): Promise<number | NodeJS.Timeout> {
|
): Promise<number | NodeJS.Timeout> {
|
||||||
|
this.validateRegisteredTask(taskName);
|
||||||
|
|
||||||
return globalThis.setInterval(() => this.triggerTask(taskName), intervalInMs);
|
return globalThis.setInterval(() => this.triggerTask(taskName), intervalInMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,4 +56,56 @@ export class DefaultTaskSchedulerService extends TaskSchedulerService {
|
||||||
globalThis.clearInterval(taskIdentifier.intervalId);
|
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.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue