Skip to content

Aedes 基础 (TCP)

最小 mqttkit app:Aedes TCP broker、用户名鉴权、审计中间件、publish 时校验 params.uid === principal.uid

bash
bun run --cwd examples/aedes-basic dev

监听 mqtt://localhost:1883,任意 MQTT 客户端可连。

源码

ts
import { aedes } from '@mqttkit/aedes'
import { MqttApp, router } from '@mqttkit/core'

type Services = {
  audit: {
    log(event: string, fields: Record<string, unknown>): Promise<void>
  }
}

const app = new MqttApp<{ principal?: { uid: string }; services: Services }>()
  .decorate('audit', {
    async log(event: string, fields: Record<string, unknown>) {
      console.log(event, fields)
    },
  })
  .use(
    aedes({
      tcp: { port: 1883 },
      authenticate: ({ clientId, username }) => {
        if (!username) return false
        return { uid: username || clientId }
      },
    }),
  )
  .use(async (ctx, next) => {
    await ctx.services.audit.log('mqtt.message', {
      clientId: ctx.clientId,
      topic: ctx.topic,
    })
    await next()
  })
  .use(
    router<{ principal?: { uid: string }; services: Services }>()
      .topic('devices/:uid/events', {
        publish: ({ params, principal }) => params.uid === principal?.uid,
        async onMessage(ctx) {
          await ctx.publish(`server/${ctx.params.uid}/echo`, ctx.payload, { qos: 0 })
        },
      })
      .topic('server/:uid/echo', {
        subscribe: ({ params, principal }) => params.uid === principal?.uid,
      }),
  )

await app.listen()
console.log('mqttkit Aedes TCP example listening on mqtt://localhost:1883')

在 GitHub 查看

基于 MIT 协议发布