Hono middleware that turns glide-mq queues into a REST API with real-time SSE and type-safe RPC. One middleware + one router gives you queue operations, schedulers, flow orchestration over HTTP, rolling usage summaries, and broadcast routes.
- Type-safe RPC - export
GlideMQApiTypeand use Hono'shc<>for end-to-end typed HTTP calls with zero codegen - Multi-runtime - runs on Node, Bun, Deno, and edge runtimes
- Testable without Valkey -
createTestAppbuilds an in-memory app forapp.request()assertions
npm install @glidemq/hono glide-mq honoOptional - install zod and @hono/zod-validator for request validation.
Requires glide-mq >= 0.14.0 and Hono 4+.
import { Hono } from "hono";
import { glideMQ, glideMQApi } from "@glidemq/hono";
const app = new Hono();
app.use(
glideMQ({
connection: { addresses: [{ host: "localhost", port: 6379 }] },
queues: {
emails: {
processor: async (job) => {
await sendEmail(job.data.to, job.data.subject);
return { sent: true };
},
concurrency: 5,
},
},
}),
);
app.route("/api/queues", glideMQApi());
export default app;glideMQ() injects a registry into c.var.glideMQ. glideMQApi() returns a typed sub-router that exposes the full queue-management HTTP surface.
import { hc } from "hono/client";
import type { GlideMQApiType } from "@glidemq/hono";
const client = hc<GlideMQApiType>("http://localhost:3000/api/queues");
const res = await client[":name"].jobs.$post({
param: { name: "emails" },
json: { name: "welcome", data: { to: "user@example.com" } },
});
const job = await res.json(); // typed as JobResponseglide-mq is an AI-native message queue. This middleware exposes AI orchestration primitives as REST endpoints:
GET /:name/flows/:id/usage- aggregated token/cost usage across all jobs in a flowGET /:name/flows/:id/budget- budget state (limits, spent, exceeded) for a flowPOST /flows- create a tree flow or DAG over HTTP with{ flow, budget? }or{ dag }GET /flows/:id- inspect a flow snapshot with nodes, roots, counts, usage, and budgetGET /flows/:id/tree- inspect the nested tree view for a submitted tree flow or DAGDELETE /flows/:id- revoke or flag remaining jobs in a flow and delete the HTTP flow recordGET /:name/jobs/:id/stream- SSE stream of real-time chunks from a streaming jobGET /usage/summary- rolling per-queue or cross-queue usage summary from persisted minute bucketsPOST /broadcast/:name- publish a broadcast message with asubject, payload, and optional job optionsGET /broadcast/:name/events- SSE stream for broadcast delivery; requiressubscriptionand optionally filterssubjects
Jobs returned from all endpoints include AI fields when present: usage, signals, budgetKey, fallbackIndex, tpmTokens. SSE events include usage, suspended, and budget-exceeded event types.
HTTP-submitted budgets are currently supported for tree flows only, not DAG payloads.
See the glide-mq docs for the full AI primitives API.
GlideMQConfig accepts connection, queues, producers, prefix (default "glide"), and testing (boolean). Restrict exposed queue and broadcast names via glideMQApi({ queues: ["emails"], producers: ["emails"] }).
import { createTestApp } from "@glidemq/hono/testing";
const { app, registry } = createTestApp({
emails: { processor: async (job) => ({ sent: true }) },
});
const res = await app.request("/emails/jobs", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "welcome", data: { to: "user@test.com" } }),
});
await registry.closeAll();- Graceful shutdown is manual - call
registry.closeAll()(Hono has no lifecycle hooks). - SSE requires a long-lived connection; edge runtimes with short execution limits may not support it.
/flows*,GET /usage/summary, and broadcast routes require a liveconnection; they are unavailable in testing mode.- Producers not available in testing mode. Queue names must match
/^[a-zA-Z0-9_-]{1,128}$/.
- glide-mq - core library
- Full documentation
- Issues
- @glidemq/fastify | @glidemq/hapi | @glidemq/nestjs | @glidemq/dashboard