1

Construindo uma biblioteca que facilita de criação de workflows

Contexto

Estamos vendo uma tendencia em workflows dentro de SaaS, poderia citar como Stripe Workflows. Imagino que isso se deve a soluções como o n8n e Zapier. Como um criador de SaaS, precisei implementar algo parecido, não consegui achar nenhuma biblioteca viabiliza a criação de workflows de forma simples, foi aí que tive uma ideia de criar essa biblioteca.

o Sig

O sig, tem como objetivo principal facilitar o máximo possível a criação de workflows, com retries, delays, criações de nós, que irá funcionar tanto em serverless e serverful. Aqui está um exemplo:

import { WorkflowEngine, databaseAdapter, WorkflowDefinition } from '@sigworkflow/sig';
import { postgres } from '@sigworkflow/postgres-adapter';
import { bullmq } from '@sigworkflow/bullmq-adapter';

const engine = new WorkflowEngine({
  db: databaseAdapter(postgres(pool)),
  mq: mqAdapter(bullmq(connection)),
  nodes: [new AI(), new Approval(), new IfNode(), new Blog()]
});

// create new workflow
const workflow = await engine.spawn(
  new WorkflowDefinition("blog-workflow")
    .step("create-blog-post", {
      name: "Create Blog Post",
      execute: new AI().execute({ model: "claude-sonnet-4-5", input: "write a blog post about AI" })
    })
    .step("approve-blog-post", {
      name: "Wait for Approval",
      execute: new Approval().execute({ approver: "manager" })
    })
    .step("publish-blog-post", {
      name: "Publish Blog Post",
      execute: new IfNode().execute({
        field: "$approve-blog-post.approved",
        condition: "equals",
        value: true,
        then: "post-blog",
        else: "reject-blog"
      })
    })
    .step("post-blog", {
      name: "Post Blog",
      execute: new Blog().execute({ 
        create: {
          title: "$create-blog-post.title", content: "$create-blog-post.content"
        }
      })
    })
);

// create execution
const execution = await workflow.spawn({
  userId: "user-123",
});

await execution.start();

Criação de Nós

export class BlogPost<V extends BasicTypes> extends Node<
  BlogPostParams<V>,
  BlogPostOutput
> {
  async run() {
    const blogSlug = this.evaluate(this.params.blogSlug);

    const createdBlog = blog.post({ ... })

    return this.next({ blogId: createdBlog.id });
  }
}

Não se confunda!

Sig não é como o Vercel Workflow ou UpStash Workflow, por mais que são muito parecidos, o Sig permite criações de workflows dinâmicos em runtime!

Notas finais

Bem, o Sig está longe de ter o seu primeiro release (na verdade ainda o projeto foi recém-criado), o meu objetivo aqui é ver a aceitação de vocês e se faz sentido tudo isso XD.

Tenho um objetivo de adicionar integrações com outros messages queue como QStash e frameworks web como Next.js

Repositório do Sig

Carregando publicação patrocinada...