@adonisjs/transmit

中文文档
3.0.2发布于 2026/08/26MITTypeScriptES Module构建来源已验证近 30 天下载 9.9万

一个Server-Sent-Event模块将实时能力带到了AdonisJS.

中文使用文档
文档目录9 节
  1. 使用量 | 检查 AdonisJS
  2. 目录
  3. 安装
  4. 使用量
  5. 频道
  6. 频道名称
  7. 频道授权
  8. 客户端
  9. 特拉菲克的示例配置

阿多尼斯JS 传送

AdonisJS的本地服务器-Sent-Event(SSE)模块.


typescript-image gh-workflow-image npm-image npm-download-image license-image



AdonisJS Transmit是AdonisJS的本地服务器-Sent-Event (SSE)模块. 它为发送事件给客户端提供了简单的API. 它还支持 重写 作为向多个服务器或实例广播事件的传输层.

在使用这个模块之前,你应该先知道一些事情.

👉 单向通信: 数据传输只发生在服务器到客户端之间,而不是相反.
👉 文本数据 仅限: SSE只支持文本数据的传输,不能发送二进制数据.
👉 HTTP 协议 : 使用的基本协议是常规的HTTP,而不是任何特殊或专有的协议.

目录

安装

从 npm 登记册中安装软件包如下:

node ace add @adonisjs/transmit

使用量

模块显示 transmit 实例,用于向客户端发送事件.

import transmit from '@adonisjs/transmit/services/main'

// Anywhere in your code
transmit.broadcast('channelName', { username: 'lanz' })

频道

频道是组织事件的一种方式. 例如,您可以有一个频道用于 users 和另一个用于 posts。客户端可以订阅一个或多个频道接收事件.

频道名称

频道名称必须是一个字符串,除此之外不得包含任何特殊字符 /。以下是有效的频道名称.

transmit.broadcast('users', { username: 'lanz' })
transmit.broadcast('users/1', { username: 'lanz' })
transmit.broadcast('users/1/posts', { username: 'lanz' })

频道授权

您可以将频道标为私人频道,然后授权客户端订阅. 授权使用回调函数进行.

// start/transmit.ts

import type { HttpContext } from '@adonisjs/core/http'

transmit.authorize<{ id: string }>('users/:id', (ctx: HttpContext, { id }) => {
  return ctx.auth.user?.id === +id
})

[注] 别忘了加上你 start/transmit.ts 文件在 preloads 数组 adonisrc.ts 文档.

当客户端试图订阅一个私人频道时,会以频道参数和HTTP上下文来引用回调函数. 回调函数必须返回布尔值以允许或不允许订阅 .

这个 ctx 当订阅请求通过您认证的中间软件时, 才会带一个认证的用户 。 默认情况下, 用于订阅和取消订阅的路由( X)__transmit/subscribe 财务报告和审定财务报表 __transmit/unsubscribe)是公开的,所以 ctx.auth.user 实值 undefined启用 transmit.registerRoutes 保护他们:

// start/routes.ts

import transmit from '@adonisjs/transmit/services/main'
import { middleware } from '#start/kernel'

transmit.registerRoutes((route) => {
  // Authenticate the client before it can subscribe to a channel
  if (route.getPattern() === '__transmit/subscribe') {
    route.middleware(middleware.auth())
    return
  }
})

[注] 一旦订阅路线被认证, ctx.auth.user 在您内部 authorize 调用,允许您将私有频道范围限制到当前用户.

客户端

这个 @adonisjs/transmit-client 软件包允许您连接到服务器,订阅频道,并对收到的信息作出反应.

npm i @adonisjs/transmit-client

通过指向您的服务器创建客户端 。 当您的订阅路由被认证时( 请参见 频道授权),使用 beforeSubscribe 勾勾在每次订阅请求中附上您的证书 。 钩子接收出局 Request,可以直接改变其标题.

import { Transmit } from '@adonisjs/transmit-client'

export const transmit = new Transmit({
  baseUrl: window.location.origin,
  beforeSubscribe: (request) => {
    request.headers.set('Authorization', `Bearer ${getToken()}`)
  },
})

然后订阅频道并收听消息:

const subscription = transmit.subscription('users/1')
await subscription.create()

subscription.onMessage((message) => {
  console.log(message)
})

// Stop receiving messages
await subscription.delete()

[注] 如果您也保护未订阅的路由, 请使用匹配 beforeUnsubscribe 要认证的钩 __transmit/unsubscribe 请求同样的方式.

同步中

传输支持跨多个服务器同步事件或使用传输层的事件. 您可以通过改变配置和引用驱动程序来启用同步( 目前只有 Redis 可用) .

// config/transmit.ts
import env from '#start/env'
import { defineConfig } from '@adonisjs/transmit'
import { redis } from '@adonisjs/transmit/transports'

export default defineConfig({
  transport: {
    driver: redis({
      host: env.get('REDIS_HOST'),
      port: env.get('REDIS_PORT'),
      password: env.get('REDIS_PASSWORD'),
    }),
  },
})

[注] 确保有 ioredis 使用时安装 redis 驾驶员.

Ing

传输支持拨打客户端以保持连接. 您可以通过改变配置来启用 ping.

// config/transmit.ts
import { defineConfig } from '@adonisjs/transmit'
import { redis } from '@adonisjs/transmit/transports'

export default defineConfig({
  pingInterval: '1m',
})

活动

传输用途 娱乐 释放任何生命周期事件。 您可以使用 on 方法.

transmit.on('broadcast', ({ channel, payload }) => {
  logger.debug('TRANSMIT broadcasted')
  logger.debug(`─ channel: ${channel}`)
  logger.debug(`─ payload: ${JSON.stringify(payload)}`)
})

transmit.on('connect', ({ uid }) => {
  logger.debug('TRANSMIT connected')
  logger.debug(`─ uid: ${uid}`)
})

transmit.on('disconnect', ({ uid }) => {
  logger.debug('TRANSMIT disconnected')
  logger.debug(`─ uid: ${uid}`)
})

transmit.on('subscribe', ({ channel, uid }) => {
  logger.debug('TRANSMIT subscribed')
  logger.debug(`─ channel: ${channel}`)
  logger.debug(`─ uid: ${uid}`)
})

transmit.on('unsubscribe', ({ channel, uid }) => {
  logger.debug('TRANSMIT unsubscribed')
  logger.debug(`─ channel: ${channel}`)
  logger.debug(`─ uid: ${uid}`)
})

这个 connect 财务报告和审定财务报表 disconnect 事件暴露了 uid 客户。 与 频道授权您可以绘制地图 uid 到经认证的用户,以跟踪当前连接的人.

测试

因为 transmit.on 返回一个停止监听的函数,您可以在击中您的端点时收集所发射的广播,并对此进行断言。 以下示例使用了 日本兵团 与 @japa/api-client 插件 :

import transmit from '@adonisjs/transmit/services/main'
import { test } from '@japa/runner'

test.group('Posts', () => {
  test('it broadcasts the created post', async ({ client, assert }) => {
    const broadcasts: { channel: string; payload: unknown }[] = []
    const stopListening = transmit.on('broadcast', (event) => broadcasts.push(event))

    const response = await client.post('/posts').loginAs(user)

    stopListening()

    assert.equal(response.status(), 201)
    assert.lengthOf(broadcasts, 1)
    assert.equal(broadcasts[0].channel, `users/${user.id}`)
  })

  test('it rejects an unauthenticated subscription', async ({ client, assert }) => {
    const response = await client.post('/__transmit/subscribe').json({ channel: 'users/1' })

    assert.equal(response.status(), 401)
  })
})

避免GZIP干扰

部署使用的程序时 @adonisjs/transmit,必须确保GZip压缩不会干扰 text/event-stream server-Sent Events(SSE)使用的内容类型. 压缩应用到 text/event-stream 可以引起连接问题,导致频繁断开或SSE故障.

如果您的部署使用了反向代理( 如 Traefik 或 Nginx) 或其他应用 GZip 的中间软件, 请确保 压缩被禁用 text/event-stream 内容类型.

特拉菲克的示例配置

traefik.http.middlewares.gzip.compress=true
traefik.http.middlewares.gzip.compress.excludedcontenttypes=text/event-stream
traefik.http.routers.my-router.middlewares=gzip

版本与发布记录

@adonisjs/transmit 共发布 36 个版本,首次发布于 2023/07/08;过去 12 个月发布了 4 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.0.2latest2026/08/262 个月前
3.0.12026/03/038 个月前
3.0.1-next.1next2026/02/168 个月前
3.0.1-next.02026/01/259 个月前
2.0.22024/09/252 年前
2.0.12024/09/212 年前

关于 @adonisjs/transmit 的常见问题

@adonisjs/transmit 是什么?

一个Server-Sent-Event模块将实时能力带到了AdonisJS.

如何安装 @adonisjs/transmit?

在项目目录运行 npm install @adonisjs/transmit,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@adonisjs/core(^7.0.0-next)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@adonisjs/transmit 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@adonisjs/transmit 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@adonisjs/transmit 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20.11.1。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@adonisjs/transmit 可以商用吗?

@adonisjs/transmit 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@adonisjs/transmit 的下载量有多少?

根据 npm 官方下载统计,@adonisjs/transmit 在 2026/10/05 – 2026/11/03 这 30 天内被下载 99,018 次,日均约 3,301 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@adonisjs/transmit 还在维护吗?

最新版本 3.0.2 发布于 2026/08/26(2 个月前);至今共发布 36 个版本,其中过去 12 个月发布了 4 个;首次发布于 2023/07/08。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。