Skip to content

Commit d0a5c16

Browse files
committed
Add cleanup hook
1 parent 6ba2b04 commit d0a5c16

File tree

6 files changed

+127
-0
lines changed

6 files changed

+127
-0
lines changed

packages/core/src/v3/lifecycle-hooks-api.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ export type {
2828
TaskMiddlewareHookParams,
2929
AnyOnMiddlewareHookFunction,
3030
OnMiddlewareHookFunction,
31+
OnCleanupHookFunction,
32+
AnyOnCleanupHookFunction,
33+
TaskCleanupHookParams,
3134
} from "./lifecycleHooks/types.js";
3235

3336
export * as lifecycleHooksAdapters from "./lifecycleHooks/adapters.js";

packages/core/src/v3/lifecycleHooks/adapters.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111
TaskFailureHookParams,
1212
TaskStartHookParams,
1313
TaskCatchErrorHookParams,
14+
TaskCleanupHookParams,
15+
AnyOnCleanupHookFunction,
1416
} from "./types.js";
1517

1618
export function createInitHookAdapter<TPayload>(
@@ -95,3 +97,17 @@ export function createMiddlewareHookAdapter<TPayload>(
9597
});
9698
};
9799
}
100+
101+
export function createCleanupHookAdapter<
102+
TPayload,
103+
TInitOutput extends TaskInitOutput = TaskInitOutput,
104+
>(
105+
fn: NonNullable<TaskOptions<string, TPayload, unknown, TInitOutput>["cleanup"]>
106+
): AnyOnCleanupHookFunction {
107+
return async (params) => {
108+
return await fn(
109+
params.payload as unknown as TPayload,
110+
params as TaskCleanupHookParams<TPayload, TInitOutput>
111+
);
112+
};
113+
}

packages/core/src/v3/lifecycleHooks/index.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { getGlobal, registerGlobal, unregisterGlobal } from "../utils/globals.js
44
import { NoopLifecycleHooksManager } from "./manager.js";
55
import {
66
AnyOnCatchErrorHookFunction,
7+
AnyOnCleanupHookFunction,
78
AnyOnCompleteHookFunction,
89
AnyOnFailureHookFunction,
910
AnyOnInitHookFunction,
@@ -221,6 +222,27 @@ export class LifecycleHooksAPI {
221222
return this.#getManager().getGlobalMiddlewareHooks();
222223
}
223224

225+
public registerGlobalCleanupHook(
226+
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
227+
): void {
228+
this.#getManager().registerGlobalCleanupHook(hook);
229+
}
230+
231+
public registerTaskCleanupHook(
232+
taskId: string,
233+
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
234+
): void {
235+
this.#getManager().registerTaskCleanupHook(taskId, hook);
236+
}
237+
238+
public getTaskCleanupHook(taskId: string): AnyOnCleanupHookFunction | undefined {
239+
return this.#getManager().getTaskCleanupHook(taskId);
240+
}
241+
242+
public getGlobalCleanupHooks(): RegisteredHookFunction<AnyOnCleanupHookFunction>[] {
243+
return this.#getManager().getGlobalCleanupHooks();
244+
}
245+
224246
#getManager(): LifecycleHooksManager {
225247
return getGlobal(API_NAME) ?? NOOP_LIFECYCLE_HOOKS_MANAGER;
226248
}

packages/core/src/v3/lifecycleHooks/manager.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
AnyOnResumeHookFunction,
1212
AnyOnCatchErrorHookFunction,
1313
AnyOnMiddlewareHookFunction,
14+
AnyOnCleanupHookFunction,
1415
} from "./types.js";
1516

1617
export class StandardLifecycleHooksManager implements LifecycleHooksManager {
@@ -52,6 +53,11 @@ export class StandardLifecycleHooksManager implements LifecycleHooksManager {
5253
private taskMiddlewareHooks: Map<string, RegisteredHookFunction<AnyOnMiddlewareHookFunction>> =
5354
new Map();
5455

56+
private globalCleanupHooks: Map<string, RegisteredHookFunction<AnyOnCleanupHookFunction>> =
57+
new Map();
58+
private taskCleanupHooks: Map<string, RegisteredHookFunction<AnyOnCleanupHookFunction>> =
59+
new Map();
60+
5561
registerGlobalStartHook(hook: RegisterHookFunctionParams<AnyOnStartHookFunction>): void {
5662
const id = generateHookId(hook);
5763

@@ -337,6 +343,37 @@ export class StandardLifecycleHooksManager implements LifecycleHooksManager {
337343
getGlobalMiddlewareHooks(): RegisteredHookFunction<AnyOnMiddlewareHookFunction>[] {
338344
return Array.from(this.globalMiddlewareHooks.values());
339345
}
346+
347+
registerGlobalCleanupHook(hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>): void {
348+
const id = generateHookId(hook);
349+
350+
this.globalCleanupHooks.set(id, {
351+
id,
352+
name: hook.id,
353+
fn: hook.fn,
354+
});
355+
}
356+
357+
registerTaskCleanupHook(
358+
taskId: string,
359+
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
360+
): void {
361+
const id = generateHookId(hook);
362+
363+
this.taskCleanupHooks.set(taskId, {
364+
id,
365+
name: hook.id,
366+
fn: hook.fn,
367+
});
368+
}
369+
370+
getTaskCleanupHook(taskId: string): AnyOnCleanupHookFunction | undefined {
371+
return this.taskCleanupHooks.get(taskId)?.fn;
372+
}
373+
374+
getGlobalCleanupHooks(): RegisteredHookFunction<AnyOnCleanupHookFunction>[] {
375+
return Array.from(this.globalCleanupHooks.values());
376+
}
340377
}
341378

342379
export class NoopLifecycleHooksManager implements LifecycleHooksManager {
@@ -504,6 +541,25 @@ export class NoopLifecycleHooksManager implements LifecycleHooksManager {
504541
getGlobalMiddlewareHooks(): [] {
505542
return [];
506543
}
544+
545+
registerGlobalCleanupHook(hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>): void {
546+
// Noop
547+
}
548+
549+
registerTaskCleanupHook(
550+
taskId: string,
551+
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
552+
): void {
553+
// Noop
554+
}
555+
556+
getTaskCleanupHook(taskId: string): AnyOnCleanupHookFunction | undefined {
557+
return undefined;
558+
}
559+
560+
getGlobalCleanupHooks(): RegisteredHookFunction<AnyOnCleanupHookFunction>[] {
561+
return [];
562+
}
507563
}
508564

509565
function generateHookId(hook: RegisterHookFunctionParams<any>): string {

packages/core/src/v3/lifecycleHooks/types.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,23 @@ export type OnMiddlewareHookFunction<TPayload> = (
192192

193193
export type AnyOnMiddlewareHookFunction = OnMiddlewareHookFunction<unknown>;
194194

195+
export type TaskCleanupHookParams<
196+
TPayload = unknown,
197+
TInitOutput extends TaskInitOutput = TaskInitOutput,
198+
> = {
199+
ctx: TaskRunContext;
200+
payload: TPayload;
201+
task: string;
202+
signal?: AbortSignal;
203+
init?: TInitOutput;
204+
};
205+
206+
export type OnCleanupHookFunction<TPayload, TInitOutput extends TaskInitOutput = TaskInitOutput> = (
207+
params: TaskCleanupHookParams<TPayload, TInitOutput>
208+
) => undefined | void | Promise<undefined | void>;
209+
210+
export type AnyOnCleanupHookFunction = OnCleanupHookFunction<unknown, TaskInitOutput>;
211+
195212
export interface LifecycleHooksManager {
196213
registerGlobalInitHook(hook: RegisterHookFunctionParams<AnyOnInitHookFunction>): void;
197214
registerTaskInitHook(
@@ -256,4 +273,11 @@ export interface LifecycleHooksManager {
256273
): void;
257274
getTaskMiddlewareHook(taskId: string): AnyOnMiddlewareHookFunction | undefined;
258275
getGlobalMiddlewareHooks(): RegisteredHookFunction<AnyOnMiddlewareHookFunction>[];
276+
registerGlobalCleanupHook(hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>): void;
277+
registerTaskCleanupHook(
278+
taskId: string,
279+
hook: RegisterHookFunctionParams<AnyOnCleanupHookFunction>
280+
): void;
281+
getTaskCleanupHook(taskId: string): AnyOnCleanupHookFunction | undefined;
282+
getGlobalCleanupHooks(): RegisteredHookFunction<AnyOnCleanupHookFunction>[];
259283
}

packages/trigger-sdk/src/v3/shared.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,4 +1624,10 @@ function registerTaskLifecycleHooks<
16241624
fn: lifecycleHooksAdapters.createMiddlewareHookAdapter(params.middleware),
16251625
});
16261626
}
1627+
1628+
if (params.cleanup) {
1629+
lifecycleHooks.registerTaskCleanupHook(taskId, {
1630+
fn: lifecycleHooksAdapters.createCleanupHookAdapter(params.cleanup),
1631+
});
1632+
}
16271633
}

0 commit comments

Comments
 (0)