Add cleanup hook

This commit is contained in:
Eric Allam
2025-03-25 11:22:11 +00:00
parent 6ba2b0476b
commit d0a5c16c63
6 changed files with 127 additions and 0 deletions
@@ -28,6 +28,9 @@ export type {
TaskMiddlewareHookParams,
AnyOnMiddlewareHookFunction,
OnMiddlewareHookFunction,
OnCleanupHookFunction,
AnyOnCleanupHookFunction,
TaskCleanupHookParams,
} from "./lifecycleHooks/types.js";
export * as lifecycleHooksAdapters from "./lifecycleHooks/adapters.js";
@@ -11,6 +11,8 @@ import {
TaskFailureHookParams,
TaskStartHookParams,
TaskCatchErrorHookParams,
TaskCleanupHookParams,
AnyOnCleanupHookFunction,
} from "./types.js";
export function createInitHookAdapter<TPayload>(
@@ -95,3 +97,17 @@ export function createMiddlewareHookAdapter<TPayload>(
});
};
}
export function createCleanupHookAdapter<
TPayload,
TInitOutput extends TaskInitOutput = TaskInitOutput,
>(
fn: NonNullable<TaskOptions<string, TPayload, unknown, TInitOutput>["cleanup"]>
): AnyOnCleanupHookFunction {
return async (params) => {
return await fn(
params.payload as unknown as TPayload,
params as TaskCleanupHookParams<TPayload, TInitOutput>
);
};
}
@@ -4,6 +4,7 @@ import { getGlobal, registerGlobal, unregisterGlobal } from "../utils/globals.js
import { NoopLifecycleHooksManager } from "./manager.js";
import {
AnyOnCatchErrorHookFunction,
AnyOnCleanupHookFunction,
AnyOnCompleteHookFunction,
AnyOnFailureHookFunction,
AnyOnInitHookFunction,
@@ -221,6 +222,27 @@ export class LifecycleHooksAPI {
return this.#getManager().getGlobalMiddlewareHooks();
}
public registerGlobalCleanupHook(
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
): void {
this.#getManager().registerGlobalCleanupHook(hook);
}
public registerTaskCleanupHook(
taskId: string,
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
): void {
this.#getManager().registerTaskCleanupHook(taskId, hook);
}
public getTaskCleanupHook(taskId: string): AnyOnCleanupHookFunction | undefined {
return this.#getManager().getTaskCleanupHook(taskId);
}
public getGlobalCleanupHooks(): RegisteredHookFunction<AnyOnCleanupHookFunction>[] {
return this.#getManager().getGlobalCleanupHooks();
}
#getManager(): LifecycleHooksManager {
return getGlobal(API_NAME) ?? NOOP_LIFECYCLE_HOOKS_MANAGER;
}
@@ -11,6 +11,7 @@ import {
AnyOnResumeHookFunction,
AnyOnCatchErrorHookFunction,
AnyOnMiddlewareHookFunction,
AnyOnCleanupHookFunction,
} from "./types.js";
export class StandardLifecycleHooksManager implements LifecycleHooksManager {
@@ -52,6 +53,11 @@ export class StandardLifecycleHooksManager implements LifecycleHooksManager {
private taskMiddlewareHooks: Map<string, RegisteredHookFunction<AnyOnMiddlewareHookFunction>> =
new Map();
private globalCleanupHooks: Map<string, RegisteredHookFunction<AnyOnCleanupHookFunction>> =
new Map();
private taskCleanupHooks: Map<string, RegisteredHookFunction<AnyOnCleanupHookFunction>> =
new Map();
registerGlobalStartHook(hook: RegisterHookFunctionParams<AnyOnStartHookFunction>): void {
const id = generateHookId(hook);
@@ -337,6 +343,37 @@ export class StandardLifecycleHooksManager implements LifecycleHooksManager {
getGlobalMiddlewareHooks(): RegisteredHookFunction<AnyOnMiddlewareHookFunction>[] {
return Array.from(this.globalMiddlewareHooks.values());
}
registerGlobalCleanupHook(hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>): void {
const id = generateHookId(hook);
this.globalCleanupHooks.set(id, {
id,
name: hook.id,
fn: hook.fn,
});
}
registerTaskCleanupHook(
taskId: string,
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
): void {
const id = generateHookId(hook);
this.taskCleanupHooks.set(taskId, {
id,
name: hook.id,
fn: hook.fn,
});
}
getTaskCleanupHook(taskId: string): AnyOnCleanupHookFunction | undefined {
return this.taskCleanupHooks.get(taskId)?.fn;
}
getGlobalCleanupHooks(): RegisteredHookFunction<AnyOnCleanupHookFunction>[] {
return Array.from(this.globalCleanupHooks.values());
}
}
export class NoopLifecycleHooksManager implements LifecycleHooksManager {
@@ -504,6 +541,25 @@ export class NoopLifecycleHooksManager implements LifecycleHooksManager {
getGlobalMiddlewareHooks(): [] {
return [];
}
registerGlobalCleanupHook(hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>): void {
// Noop
}
registerTaskCleanupHook(
taskId: string,
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
): void {
// Noop
}
getTaskCleanupHook(taskId: string): AnyOnCleanupHookFunction | undefined {
return undefined;
}
getGlobalCleanupHooks(): RegisteredHookFunction<AnyOnCleanupHookFunction>[] {
return [];
}
}
function generateHookId(hook: RegisterHookFunctionParams<any>): string {
@@ -192,6 +192,23 @@ export type OnMiddlewareHookFunction<TPayload> = (
export type AnyOnMiddlewareHookFunction = OnMiddlewareHookFunction<unknown>;
export type TaskCleanupHookParams<
TPayload = unknown,
TInitOutput extends TaskInitOutput = TaskInitOutput,
> = {
ctx: TaskRunContext;
payload: TPayload;
task: string;
signal?: AbortSignal;
init?: TInitOutput;
};
export type OnCleanupHookFunction<TPayload, TInitOutput extends TaskInitOutput = TaskInitOutput> = (
params: TaskCleanupHookParams<TPayload, TInitOutput>
) => undefined | void | Promise<undefined | void>;
export type AnyOnCleanupHookFunction = OnCleanupHookFunction<unknown, TaskInitOutput>;
export interface LifecycleHooksManager {
registerGlobalInitHook(hook: RegisterHookFunctionParams<AnyOnInitHookFunction>): void;
registerTaskInitHook(
@@ -256,4 +273,11 @@ export interface LifecycleHooksManager {
): void;
getTaskMiddlewareHook(taskId: string): AnyOnMiddlewareHookFunction | undefined;
getGlobalMiddlewareHooks(): RegisteredHookFunction<AnyOnMiddlewareHookFunction>[];
registerGlobalCleanupHook(hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>): void;
registerTaskCleanupHook(
taskId: string,
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
): void;
getTaskCleanupHook(taskId: string): AnyOnCleanupHookFunction | undefined;
getGlobalCleanupHooks(): RegisteredHookFunction<AnyOnCleanupHookFunction>[];
}
+6
View File
@@ -1624,4 +1624,10 @@ function registerTaskLifecycleHooks<
fn: lifecycleHooksAdapters.createMiddlewareHookAdapter(params.middleware),
});
}
if (params.cleanup) {
lifecycleHooks.registerTaskCleanupHook(taskId, {
fn: lifecycleHooksAdapters.createCleanupHookAdapter(params.cleanup),
});
}
}