WebSocket
Analog also supports WebSockets
and Server-Sent Events
through Nitro.
Enabling WebSockets
Currently, WebSocket support in Nitro is experimental and it can be enabled in the analog
plugin:
vite.config.ts
import { defineConfig } from 'vite';
import analog from '@analogjs/platform';
export default defineConfig({
// ...
plugins: [
analog({
// ...
nitro: {
experimental: {
websocket: true,
},
},
}),
],
// ...
});
Note: In development, the Vite HMR WebSocket server runs on the same port as the dev server by default. To prevent conflicts, you need to change this port. The dev server port is usually defined in project.json
/angular.json
, which takes precedence over vite.config.ts
. To allow the port settings in vite.config.ts
to take effect, remove the port definition from project.json
/angular.json
. Additionally, you can specify an optional path to easily differentiate connections in the browser dev tools:
vite.config.ts
import { defineConfig } from 'vite';
import analog from '@analogjs/platform';
export default defineConfig({
// ...
server: {
port: 3000, // dev-server port
hmr: {
port: 3002, // hmr ws port
path: 'vite-hmr', // optional
},
},
// ...
});
Defining a WebSocket Handler
Similar to API routes, WebSocket Handlers are defined in the src/server/routes/api
folder.
// src/server/api/routes/ws/chat.ts
import { defineWebSocketHandler } from 'h3';
export default defineWebSocketHandler({
open(peer) {
peer.send({ user: 'server', message: `Welcome ${peer}!` });
peer.publish('chat', { user: 'server', message: `${peer} joined!` });
peer.subscribe('chat');
},
message(peer, message) {
if (message.text().includes('ping')) {
peer.send({ user: 'server', message: 'pong' });
} else {
const msg = {
user: peer.toString(),
message: message.toString(),
};
peer.send(msg); // echo
peer.publish('chat', msg);
}
},
close(peer) {
peer.publish('chat', { user: 'server', message: `${peer} left!` });
},
});
WebSocket Routes
WebSocket routes are exposed with the same path as API routes. For example, src/server/routes/api/ws/chat
is exposed as ws://example.com/api/ws/chat
.