docs/framework/custom.mdx
A custom steps allows to execute any custom logic and persist in the durable execution context. The result of this step can be used in subsequent steps.
const stepResult = await step.custom(
'custom-step',
async () => {
return {
item_name: 'A product name',
item_price: 100,
};
},
{
outputSchema: {
type: 'object',
properties: {
item_name: { type: 'string' },
item_price: { type: 'number' },
},
required: ['item_name', 'item_price'],
},
}
);
This JSON Schema definition is used to validate the output of the custom step. If the output does not match the schema, the workflow will fail. Novu Framework will infer the Typescript interface from the JSON Schema definition.
The Custom Step function should return a valid serializable object. The return value will be persisted in the durable execution context.
The result can only be used in the resolver of the step/providers/skip functions of subsequent steps.
workflow('hello-world-workflow', async ({ payload }) => {
const task = await step.custom(
'fetch-db-data',
async () => {
const taskData = db.fetchTask(payload.task_id);
return {
task_id: taskData.id,
task_title: taskData.title,
complete: taskData.complete,
};
},
{
outputSchema: {
type: 'object',
properties: {
task_title: { type: 'string' },
task_id: { type: 'string' },
complete: { type: 'boolean' },
},
required: ['task_id', 'complete'],
},
}
);
await step.email(
'send-email',
() => {
return {
subject: `Task reminder for ${task.task_title}`,
body: 'Task is not yet complete. Please complete the task.',
};
},
{
// Only send the reminder E-mail if the task is not complete
skip: () => !task.complete,
}
);
});
To read more about the full list of parameters, check out the full SDK reference.