Guide

GlyriaBus

A typed event bus with middleware support for your Discord bot.

What is GlyriaBus?

GlyriaBus is a typed event bus built into glyria.js. It lets you create internal communication channels between different parts of your bot — commands, events, services — without coupling them together.

Think of it as a typed pub/sub system with middleware support.

Basic usage

Define your events and their payload types, then create a bus:

// src/utils/useBus.ts
type BotEvents = {
  userBanned: [guildId: string, userId: string, reason: string]
  levelUp: [userId: string, level: number]
  messageLogged: [content: string]
}

export const useBus = new GlyriaBus<BotEvents>()

Since src/utils/ is auto-imported, useBus is available everywhere without imports.

Listening to events

Use .on() to listen to an event:

// src/events/ready.ts
export default event()
  .setEvent(Events.ClientReady)
  .once()
  .execute(() => {
    useBus.on("userBanned", (guildId, userId, reason) => {
      console.log(`User ${userId} banned from ${guildId}: ${reason}`)
    })
  })

.on() returns an unregister function:

const unregister = useBus.on("levelUp", (userId, level) => {
  console.log(`${userId} reached level ${level}`)
})

// later
unregister()

Emitting events

Use .emit() to trigger an event from anywhere in your bot:

// src/commands/moderation/ban.ts
export default new GlyriaCommand()
  .setName("ban")
  .setDescription("Ban a user from the server")
  .execute(async (ctx) => {
    // ... ban logic

    await useBus.emit("userBanned", ctx.guild.id, targetId, reason)
  })

Middleware

Use .use() to add middleware that runs before listeners — useful for logging, validation, or transforming data:

useBus.use("userBanned", async (guildId, userId, reason, next) => {
  console.log(`[middleware] ban event received`)
  await next() // call next middleware or listener
})

useBus.on("userBanned", (guildId, userId, reason) => {
  // runs after middleware
})

Middleware runs in the order it was registered. Calling next() passes control to the next middleware or listener. Not calling next() stops the chain.

Removing listeners

Use .off() to manually remove a middleware or listener:

useBus.off("userBanned", myMiddleware)

Or use the unregister function returned by .on():

const stop = useBus.on("levelUp", handler)
stop() // removes the listener

Clearing all listeners

Use .clear() to remove all listeners for a given event:

useBus.clear("userBanned")

API

MethodDescription
.use(event, middleware)Register a middleware for an event
.on(event, listener)Register a listener — returns an unregister function
.off(event, middleware)Remove a specific middleware
.emit(event, ...args)Emit an event with typed arguments
.clear(event)Remove all listeners for an event
Copyright © 2026