Skip to content

Commit e816ba4

Browse files
committed
onComplete
1 parent 06f6a04 commit e816ba4

File tree

4 files changed

+109
-1
lines changed

4 files changed

+109
-1
lines changed

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
RegisterHookFunctionParams,
77
AnyOnFailureHookFunction,
88
AnyOnSuccessHookFunction,
9+
AnyOnCompleteHookFunction,
910
} from "./types.js";
1011

1112
export class StandardLifecycleHooksManager implements LifecycleHooksManager {
@@ -25,6 +26,11 @@ export class StandardLifecycleHooksManager implements LifecycleHooksManager {
2526
private taskSuccessHooks: Map<string, RegisteredHookFunction<AnyOnSuccessHookFunction>> =
2627
new Map();
2728

29+
private globalCompleteHooks: Map<string, RegisteredHookFunction<AnyOnCompleteHookFunction>> =
30+
new Map();
31+
private taskCompleteHooks: Map<string, RegisteredHookFunction<AnyOnCompleteHookFunction>> =
32+
new Map();
33+
2834
registerGlobalStartHook(hook: RegisterHookFunctionParams<AnyOnStartHookFunction>): void {
2935
const id = generateHookId(hook);
3036

@@ -151,6 +157,37 @@ export class StandardLifecycleHooksManager implements LifecycleHooksManager {
151157
getGlobalSuccessHooks(): RegisteredHookFunction<AnyOnSuccessHookFunction>[] {
152158
return Array.from(this.globalSuccessHooks.values());
153159
}
160+
161+
registerGlobalCompleteHook(hook: RegisterHookFunctionParams<AnyOnCompleteHookFunction>): void {
162+
const id = generateHookId(hook);
163+
164+
this.globalCompleteHooks.set(id, {
165+
id,
166+
name: hook.id ?? hook.fn.name ? (hook.fn.name === "" ? undefined : hook.fn.name) : undefined,
167+
fn: hook.fn,
168+
});
169+
}
170+
171+
registerTaskCompleteHook(
172+
taskId: string,
173+
hook: RegisterHookFunctionParams<AnyOnCompleteHookFunction>
174+
): void {
175+
const id = generateHookId(hook);
176+
177+
this.taskCompleteHooks.set(taskId, {
178+
id,
179+
name: hook.id ?? hook.fn.name ? (hook.fn.name === "" ? undefined : hook.fn.name) : undefined,
180+
fn: hook.fn,
181+
});
182+
}
183+
184+
getTaskCompleteHook(taskId: string): AnyOnCompleteHookFunction | undefined {
185+
return this.taskCompleteHooks.get(taskId)?.fn;
186+
}
187+
188+
getGlobalCompleteHooks(): RegisteredHookFunction<AnyOnCompleteHookFunction>[] {
189+
return Array.from(this.globalCompleteHooks.values());
190+
}
154191
}
155192

156193
export class NoopLifecycleHooksManager implements LifecycleHooksManager {
@@ -229,6 +266,25 @@ export class NoopLifecycleHooksManager implements LifecycleHooksManager {
229266
getGlobalSuccessHooks(): RegisteredHookFunction<AnyOnSuccessHookFunction>[] {
230267
return [];
231268
}
269+
270+
registerGlobalCompleteHook(hook: RegisterHookFunctionParams<AnyOnCompleteHookFunction>): void {
271+
// Noop
272+
}
273+
274+
registerTaskCompleteHook(
275+
taskId: string,
276+
hook: RegisterHookFunctionParams<AnyOnCompleteHookFunction>
277+
): void {
278+
// Noop
279+
}
280+
281+
getTaskCompleteHook(taskId: string): AnyOnCompleteHookFunction | undefined {
282+
return undefined;
283+
}
284+
285+
getGlobalCompleteHooks(): RegisteredHookFunction<AnyOnCompleteHookFunction>[] {
286+
return [];
287+
}
232288
}
233289

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

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,34 @@ export type OnSuccessHookFunction<TPayload, TOutput> = (
5454

5555
export type AnyOnSuccessHookFunction = OnSuccessHookFunction<unknown, unknown>;
5656

57+
export type TaskCompleteSuccessResult<TOutput> = {
58+
ok: true;
59+
data: TOutput;
60+
};
61+
62+
export type TaskCompleteErrorResult = {
63+
ok: false;
64+
error: unknown;
65+
};
66+
67+
export type TaskCompleteResult<TOutput> =
68+
| TaskCompleteSuccessResult<TOutput>
69+
| TaskCompleteErrorResult;
70+
71+
export type TaskCompleteHookParams<TPayload = unknown, TOutput = unknown> = {
72+
ctx: TaskRunContext;
73+
payload: TPayload;
74+
task: string;
75+
result: TaskCompleteResult<TOutput>;
76+
signal?: AbortSignal;
77+
};
78+
79+
export type OnCompleteHookFunction<TPayload, TOutput> = (
80+
params: TaskCompleteHookParams<TPayload, TOutput>
81+
) => undefined | void | Promise<undefined | void>;
82+
83+
export type AnyOnCompleteHookFunction = OnCompleteHookFunction<unknown, unknown>;
84+
5785
export type RegisterHookFunctionParams<THookFunction extends (params: any) => any> = {
5886
id?: string;
5987
fn: THookFunction;
@@ -94,4 +122,11 @@ export interface LifecycleHooksManager {
94122
): void;
95123
getTaskSuccessHook(taskId: string): AnyOnSuccessHookFunction | undefined;
96124
getGlobalSuccessHooks(): RegisteredHookFunction<AnyOnSuccessHookFunction>[];
125+
registerGlobalCompleteHook(hook: RegisterHookFunctionParams<AnyOnCompleteHookFunction>): void;
126+
registerTaskCompleteHook(
127+
taskId: string,
128+
hook: RegisterHookFunctionParams<AnyOnCompleteHookFunction>
129+
): void;
130+
getTaskCompleteHook(taskId: string): AnyOnCompleteHookFunction | undefined;
131+
getGlobalCompleteHooks(): RegisteredHookFunction<AnyOnCompleteHookFunction>[];
97132
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
type OnStartHookFunction,
99
type AnyOnFailureHookFunction,
1010
type AnyOnSuccessHookFunction,
11+
type AnyOnCompleteHookFunction,
12+
type TaskCompleteResult,
1113
} from "@trigger.dev/core/v3";
1214

1315
export type {
@@ -19,6 +21,8 @@ export type {
1921
OnStartHookFunction,
2022
AnyOnFailureHookFunction,
2123
AnyOnSuccessHookFunction,
24+
AnyOnCompleteHookFunction,
25+
TaskCompleteResult,
2226
};
2327

2428
export function onInit(name: string, fn: AnyOnInitHookFunction): void;
@@ -65,3 +69,15 @@ export function onSuccess(
6569
fn: typeof fnOrName === "function" ? fnOrName : fn!,
6670
});
6771
}
72+
73+
export function onComplete(name: string, fn: AnyOnCompleteHookFunction): void;
74+
export function onComplete(fn: AnyOnCompleteHookFunction): void;
75+
export function onComplete(
76+
fnOrName: string | AnyOnCompleteHookFunction,
77+
fn?: AnyOnCompleteHookFunction
78+
): void {
79+
lifecycleHooks.registerGlobalCompleteHook({
80+
id: typeof fnOrName === "string" ? fnOrName : fnOrName.name ? fnOrName.name : undefined,
81+
fn: typeof fnOrName === "function" ? fnOrName : fn!,
82+
});
83+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { onInit, onStart, onFailure, onSuccess } from "./hooks.js";
1+
import { onInit, onStart, onFailure, onSuccess, onComplete } from "./hooks.js";
22
import {
33
batchTrigger,
44
batchTriggerAndWait,
@@ -83,4 +83,5 @@ export const tasks = {
8383
onStart,
8484
onFailure,
8585
onSuccess,
86+
onComplete,
8687
};

0 commit comments

Comments
 (0)