Bullstudio
Embedded

Express

Mount Bullstudio in an Express app.

Install

pnpm add @bullstudio/express @bullstudio/bullmq-adapter bullmq ioredis express

Mount the dashboard

import { createBullMqQueueAdapter } from "@bullstudio/bullmq-adapter";
import { bullstudio } from "@bullstudio/express";
import { Queue } from "bullmq";
import express from "express";
import IORedis from "ioredis";

const connection = new IORedis(process.env.REDIS_URL!, {
  maxRetriesPerRequest: null,
});

const emailQueue = new Queue("email", { connection });
const app = express();

app.use(
  "/ops/bullstudio",
  bullstudio({
    queues: [
      createBullMqQueueAdapter(emailQueue, {
        key: "email",
        label: "Email",
      }),
    ],
    protection: {
      type: "session",
      username: process.env.BULLSTUDIO_USERNAME ?? "operator",
      password: process.env.BULLSTUDIO_PASSWORD!,
      sessionSecret: process.env.BULLSTUDIO_SESSION_SECRET!,
    },
  }),
);

const server = app.listen(3000);

Open http://localhost:3000/ops/bullstudio.

Shutdown

Bullstudio does not close host-owned queues or Redis connections.

async function shutdown() {
  await new Promise<void>((resolve, reject) => {
    server.close((error) => (error ? reject(error) : resolve()));
  });

  await emailQueue.close();
  await connection.quit();
}

On this page