Skip to content

Commit 99f312f

Browse files
committed
onFailure
1 parent a05c27a commit 99f312f

File tree

5 files changed

+113
-2
lines changed

5 files changed

+113
-2
lines changed

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { TaskOptions } from "../types/index.js";
2-
import { AnyOnInitHookFunction, AnyOnStartHookFunction } from "./types.js";
2+
import {
3+
AnyOnInitHookFunction,
4+
AnyOnStartHookFunction,
5+
AnyOnFailureHookFunction,
6+
} from "./types.js";
37

48
export function createInitHookAdapter<TPayload>(
59
fn: NonNullable<TaskOptions<string, TPayload, unknown, any>["init"]>
@@ -28,3 +32,18 @@ export function createStartHookAdapter<TPayload>(
2832
return await fn(params.payload as unknown as TPayload, paramsWithoutPayload);
2933
};
3034
}
35+
36+
export function createFailureHookAdapter<TPayload>(
37+
fn: NonNullable<TaskOptions<string, TPayload, unknown, any>["onFailure"]>
38+
): AnyOnFailureHookFunction {
39+
return async (params) => {
40+
const paramsWithoutPayload = {
41+
...params,
42+
};
43+
44+
delete paramsWithoutPayload["payload"];
45+
delete paramsWithoutPayload["error"];
46+
47+
return await fn(params.payload as unknown as TPayload, params.error, paramsWithoutPayload);
48+
};
49+
}

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
LifecycleHooksManager,
55
RegisteredHookFunction,
66
RegisterHookFunctionParams,
7+
AnyOnFailureHookFunction,
78
} from "./types.js";
89

910
export class StandardLifecycleHooksManager implements LifecycleHooksManager {
@@ -13,6 +14,11 @@ export class StandardLifecycleHooksManager implements LifecycleHooksManager {
1314
private globalStartHooks: Map<string, RegisteredHookFunction<AnyOnStartHookFunction>> = new Map();
1415
private taskStartHooks: Map<string, RegisteredHookFunction<AnyOnStartHookFunction>> = new Map();
1516

17+
private globalFailureHooks: Map<string, RegisteredHookFunction<AnyOnFailureHookFunction>> =
18+
new Map();
19+
private taskFailureHooks: Map<string, RegisteredHookFunction<AnyOnFailureHookFunction>> =
20+
new Map();
21+
1622
registerGlobalStartHook(hook: RegisterHookFunctionParams<AnyOnStartHookFunction>): void {
1723
const id = generateHookId(hook);
1824

@@ -77,6 +83,37 @@ export class StandardLifecycleHooksManager implements LifecycleHooksManager {
7783
getGlobalInitHooks(): RegisteredHookFunction<AnyOnInitHookFunction>[] {
7884
return Array.from(this.globalInitHooks.values());
7985
}
86+
87+
registerGlobalFailureHook(hook: RegisterHookFunctionParams<AnyOnFailureHookFunction>): void {
88+
const id = generateHookId(hook);
89+
90+
this.globalFailureHooks.set(id, {
91+
id,
92+
name: hook.id ?? hook.fn.name ? (hook.fn.name === "" ? undefined : hook.fn.name) : undefined,
93+
fn: hook.fn,
94+
});
95+
}
96+
97+
registerTaskFailureHook(
98+
taskId: string,
99+
hook: RegisterHookFunctionParams<AnyOnFailureHookFunction>
100+
): void {
101+
const id = generateHookId(hook);
102+
103+
this.taskFailureHooks.set(taskId, {
104+
id,
105+
name: hook.id ?? hook.fn.name ? (hook.fn.name === "" ? undefined : hook.fn.name) : undefined,
106+
fn: hook.fn,
107+
});
108+
}
109+
110+
getTaskFailureHook(taskId: string): AnyOnFailureHookFunction | undefined {
111+
return this.taskFailureHooks.get(taskId)?.fn;
112+
}
113+
114+
getGlobalFailureHooks(): RegisteredHookFunction<AnyOnFailureHookFunction>[] {
115+
return Array.from(this.globalFailureHooks.values());
116+
}
80117
}
81118

82119
export class NoopLifecycleHooksManager implements LifecycleHooksManager {
@@ -117,6 +154,25 @@ export class NoopLifecycleHooksManager implements LifecycleHooksManager {
117154
getGlobalStartHooks(): RegisteredHookFunction<AnyOnStartHookFunction>[] {
118155
return [];
119156
}
157+
158+
registerGlobalFailureHook(hook: RegisterHookFunctionParams<AnyOnFailureHookFunction>): void {
159+
// Noop
160+
}
161+
162+
registerTaskFailureHook(
163+
taskId: string,
164+
hook: RegisterHookFunctionParams<AnyOnFailureHookFunction>
165+
): void {
166+
// Noop
167+
}
168+
169+
getTaskFailureHook(taskId: string): AnyOnFailureHookFunction | undefined {
170+
return undefined;
171+
}
172+
173+
getGlobalFailureHooks(): RegisteredHookFunction<AnyOnFailureHookFunction>[] {
174+
return [];
175+
}
120176
}
121177

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

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,20 @@ export type OnStartHookFunction<TPayload> = (
2626

2727
export type AnyOnStartHookFunction = OnStartHookFunction<unknown>;
2828

29+
export type TaskFailureHookParams<TPayload = unknown> = {
30+
ctx: TaskRunContext;
31+
payload: TPayload;
32+
task: string;
33+
error: unknown;
34+
signal?: AbortSignal;
35+
};
36+
37+
export type OnFailureHookFunction<TPayload> = (
38+
params: TaskFailureHookParams<TPayload>
39+
) => undefined | void | Promise<undefined | void>;
40+
41+
export type AnyOnFailureHookFunction = OnFailureHookFunction<unknown>;
42+
2943
export type RegisterHookFunctionParams<THookFunction extends (params: any) => any> = {
3044
id?: string;
3145
fn: THookFunction;
@@ -52,4 +66,11 @@ export interface LifecycleHooksManager {
5266
): void;
5367
getTaskStartHook(taskId: string): AnyOnStartHookFunction | undefined;
5468
getGlobalStartHooks(): RegisteredHookFunction<AnyOnStartHookFunction>[];
69+
registerGlobalFailureHook(hook: RegisterHookFunctionParams<AnyOnFailureHookFunction>): void;
70+
registerTaskFailureHook(
71+
taskId: string,
72+
hook: RegisterHookFunctionParams<AnyOnFailureHookFunction>
73+
): void;
74+
getTaskFailureHook(taskId: string): AnyOnFailureHookFunction | undefined;
75+
getGlobalFailureHooks(): RegisteredHookFunction<AnyOnFailureHookFunction>[];
5576
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
type AnyOnStartHookFunction,
77
type TaskStartHookParams,
88
type OnStartHookFunction,
9+
type AnyOnFailureHookFunction,
910
} from "@trigger.dev/core/v3";
1011

1112
export type {
@@ -15,6 +16,7 @@ export type {
1516
AnyOnStartHookFunction,
1617
TaskStartHookParams,
1718
OnStartHookFunction,
19+
AnyOnFailureHookFunction,
1820
};
1921

2022
export function onInit(name: string, fn: AnyOnInitHookFunction): void;
@@ -37,3 +39,15 @@ export function onStart(
3739
fn: typeof fnOrName === "function" ? fnOrName : fn!,
3840
});
3941
}
42+
43+
export function onFailure(name: string, fn: AnyOnFailureHookFunction): void;
44+
export function onFailure(fn: AnyOnFailureHookFunction): void;
45+
export function onFailure(
46+
fnOrName: string | AnyOnFailureHookFunction,
47+
fn?: AnyOnFailureHookFunction
48+
): void {
49+
lifecycleHooks.registerGlobalFailureHook({
50+
id: typeof fnOrName === "string" ? fnOrName : fnOrName.name ? fnOrName.name : undefined,
51+
fn: typeof fnOrName === "function" ? fnOrName : fn!,
52+
});
53+
}

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 } from "./hooks.js";
1+
import { onInit, onStart, onFailure } from "./hooks.js";
22
import {
33
batchTrigger,
44
batchTriggerAndWait,
@@ -81,4 +81,5 @@ export const tasks = {
8181
batchTriggerAndWait,
8282
init: onInit,
8383
onStart,
84+
onFailure,
8485
};

0 commit comments

Comments
 (0)