Skip to content

WebSocket

WebSocket 是一种用于客户端与服务器之间通信的实时协议。

与 HTTP 不同,客户端一次又一次地询问网站信息并等待每次的回复,WebSocket 建立了一条直接的通道,使我们的客户端和服务器可以直接来回发送消息,从而使对话更快、更流畅,而无需每条消息都重新开始。

SocketIO 是一个流行的 WebSocket 库,但并不是唯一的。Elysia 使用 uWebSocket,它与 Bun 在底层使用相同的 API。

要使用 WebSocket,只需调用 Elysia.ws()

typescript
import { Elysia } from 'elysia'

new Elysia()
    .ws('/ws', {
        message(ws, message) {
            ws.send(message)
        }
    })
    .listen(3000)

WebSocket 消息验证:

与普通路由相同,WebSocket 也接受一个 schema 对象来严格类型化和验证请求。

typescript
import { Elysia, t } from 'elysia'

const app = new Elysia()
    .ws('/ws', {
        // 验证传入消息
        body: t.Object({
            message: t.String()
        }),
        query: t.Object({
            id: t.String()
        }),
        message(ws, { message }) {
            // 从 `ws.data` 获取 schema
            const { id } = ws.data.query
            ws.send({
                id,
                message,
                time: Date.now()
            })
        }
    })
    .listen(3000)

WebSocket schema 可以验证如下内容:

  • message - 传入消息。
  • query - 查询字符串或 URL 参数。
  • params - 路径参数。
  • header - 请求的头部。
  • cookie - 请求的 cookie。
  • response - 从处理器返回的值。

默认情况下,Elysia 将解析传入的字符串化 JSON 消息为对象以供验证。

配置

您可以通过 Elysia 构造函数设置 WebSocket 值。

ts
import { Elysia } from 'elysia'

new Elysia({
    websocket: {
        idleTimeout: 30
    }
})

Elysia 的 WebSocket 实现扩展了 Bun 的 WebSocket 配置,更多信息请参见 Bun 的 WebSocket 文档

以下是 Bun WebSocket 的简要配置:

perMessageDeflate

@default false

为支持的客户端启用压缩。

默认情况下,压缩是禁用的。

maxPayloadLength

消息的最大大小。

idleTimeout

@default 120

在连接未接收到消息后,经过这一秒数将关闭连接。

backpressureLimit

@default 16777216 (16MB)

单个连接可以缓冲的最大字节数。

closeOnBackpressureLimit

@default false

如果超过背压限制,关闭连接。

方法

以下是可用于 WebSocket 路由的新方法。

ws

创建 WebSocket 处理程序。

示例:

typescript
import { Elysia } from 'elysia'

const app = new Elysia()
    .ws('/ws', {
        message(ws, message) {
            ws.send(message)
        }
    })
    .listen(3000)

类型:

typescript
.ws(endpoint: path, options: Partial<WebSocketHandler<Context>>): this
  • endpoint - 作为 WebSocket 处理程序暴露的路径
  • options - 自定义 WebSocket 处理程序行为

WebSocketHandler

WebSocketHandler 扩展自 config 的配置。

以下是 ws 接受的配置。

open

新的 WebSocket 连接的回调函数。

类型:

typescript
open(ws: ServerWebSocket<{
    // 每个连接的 uid
    id: string
    data: Context
}>): this

message

传入 WebSocket 消息的回调函数。

类型:

typescript
message(
    ws: ServerWebSocket<{
        // 每个连接的 uid
        id: string
        data: Context
    }>,
    message: Message
): this

Message 类型基于 schema.message。默认是 string

close

关闭 WebSocket 连接的回调函数。

类型:

typescript
close(ws: ServerWebSocket<{
    // 每个连接的 uid
    id: string
    data: Context
}>): this

drain

服务器准备好接受更多数据的回调函数。

类型:

typescript
drain(
    ws: ServerWebSocket<{
        // 每个连接的 uid
        id: string
        data: Context
    }>,
    code: number,
    reason: string
): this

parse

Parse 中间件在将 HTTP 连接升级到 WebSocket 之前解析请求。

beforeHandle

Before Handle 中间件在将 HTTP 连接升级到 WebSocket 之前执行。

理想的验证位置。

transform

Transform 中间件在验证之前执行。

transformMessage

类似于 transform,但在验证 WebSocket 消息之前执行。

在将连接升级到 WebSocket 之前添加的附加头。