Skip to content

WebSocket ​

WebSocket is a realtime protocol for communication between your client and server.

Unlike HTTP where our client repeatedly asking the website for information and waiting for a reply each time, WebSocket sets up a direct line where our client and server can send messages back and forth directly, making the conversation quicker and smoother without having to start over each message.

SocketIO is a popular library for WebSocket, but it is not the only one. Elysia uses uWebSocket which Bun uses under the hood with the same API.

To use websocket, simply call Elysia.ws():

typescript
import { 
Elysia
} from 'elysia'
new
Elysia
()
.
ws
('/ws', {
message
(
ws
,
message
) {
ws
.
send
(
message
)
} }) .
listen
(3000)

WebSocket message validation: ​

Same as normal route, WebSockets also accepts a schema object to strictly type and validate requests.

typescript
import { 
Elysia
,
t
} from 'elysia'
const
app
= new
Elysia
()
.
ws
('/ws', {
// validate incoming message
body
:
t
.
Object
({
message
:
t
.
String
()
}),
message
(
ws
, {
message
}) {
ws
.
send
({
message
,
time
:
Date
.
now
()
}) } }) .
listen
(3000)

WebSocket schema can validate the following:

  • message - An incoming message.
  • query - query string or URL parameters.
  • params - Path parameters.
  • header - Request's headers.
  • cookie - Request's cookie
  • response - Value returned from handler

By default Elysia will parse incoming stringified JSON message as Object for validation.

Configuration ​

You can set Elysia constructor to set the Web Socket value.

ts
import { 
Elysia
} from 'elysia'
new
Elysia
({
websocket
: {
idleTimeout
: 30
} })

Elysia's WebSocket implementation extends Bun's WebSocket configuration, please refer to Bun's WebSocket documentation for more information.

The following are a brief configuration from Bun WebSocket

perMessageDeflate ​

@default false

Enable compression for clients that support it.

By default, compression is disabled.

maxPayloadLength ​

The maximum size of a message.

idleTimeout ​

@default 120

After a connection has not received a message for this many seconds, it will be closed.

backpressureLimit ​

@default 16777216 (16MB)

The maximum number of bytes that can be buffered for a single connection.

closeOnBackpressureLimit ​

@default false

Close the connection if the backpressure limit is reached.

Methods ​

Below are the new methods that are available to the WebSocket route

ws ​

Create a websocket handler

Example:

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

Type:

typescript
.ws(endpoint: path, options: Partial<WebSocketHandler<Context>>): this

endpoint: A path to exposed as websocket handler options: Customize WebSocket handler behavior

WebSocketHandler ​

WebSocketHandler extends config from config.

Below is a config which is accepted by ws.

open ​

Callback function for new websocket connection.

Type:

typescript
open(ws: ServerWebSocket<{
    // uid for each connection
    id: string
    data: Context
}>): this

message ​

Callback function for incoming websocket message.

Type:

typescript
message(
    ws: ServerWebSocket<{
        // uid for each connection
        id: string
        data: Context
    }>,
    message: Message
): this

Message type based on schema.message. Default is string.

close ​

Callback function for closing websocket connection.

Type:

typescript
close(ws: ServerWebSocket<{
    // uid for each connection
    id: string
    data: Context
}>): this

drain ​

Callback function for the server is ready to accept more data.

Type:

typescript
drain(
    ws: ServerWebSocket<{
        // uid for each connection
        id: string
        data: Context
    }>,
    code: number,
    reason: string
): this

parse ​

Parse middleware to parse the request before upgrading the HTTP connection to WebSocket.

beforeHandle ​

Before Handle middleware which execute before upgrading the HTTP connection to WebSocket.

Ideal place for validation.

transform ​

Transform middleware which execute before validation.

transformMessage ​

Like transform, but execute before validation of WebSocket message

Additional headers to add before upgrade connection to WebSocket.