Zum Hauptinhalt springen

WebSocket

Analog unterstützt auch WebSockets und Server-Sent Events über Nitro.

Aktiviere WebSockets

Derzeit ist die WebSocket-Unterstützung in Nitro experimentell und kann im analog Plugin aktiviert werden:

vite.config.ts

import { defineConfig } from 'vite';
import analog from '@analogjs/platform';

export default defineConfig({
// ...
plugins: [
analog({
// ...
nitro: {
experimental: {
websocket: true,
},
},
}),
],
// ...
});

Hinweis: In der Entwicklung läuft der Vite HMR WebSocket-Server standardmäßig auf demselben Port wie der Entwicklungsserver. Um Konflikte zu vermeiden, musst du diesen Port ändern. Der Port des Entwicklungsservers ist normalerweise in project.json/angular.json definiert, was Vorrang vor vite.config.ts hat. Damit die Port-Einstellungen in vite.config.ts wirksam werden, entferne die Port-Definition aus project.json/angular.json. Zusätzlich kannst du einen optionalen Pfad angeben, um Verbindungen in den Browser-Entwicklertools einfach zu unterscheiden:

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
},
},
// ...
});

WebSocket-Handler definieren

Ähnlich wie API-Routen werden WebSocket-Handler im Ordner src/server/routes definiert.

// src/server/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-Routen

Analog's internal API middleware is not applied to WebSocket routes, therefore, WebSocket routes are exposed without the /api prefix. Die interne API-Middleware von Analog wird nicht auf WebSocket-Routen angewendet, daher werden WebSocket-Routen ohne das Präfix /api verfügbar gemacht.

Beispielsweise wird src/server/routes/ws/chat.ts als ws://example.com/ws/chat statt als ws://example.com/api/ws/chat verfügbar gemacht.

Server-Sent Event Handler definieren

Server-Sent Event Handler können mit der Funktion createEventStream im Event-Handler erstellt werden.

// src/server/routes/sse.ts
import { defineEventHandler, createEventStream } from 'h3';

export default defineEventHandler(async (event) => {
const eventStream = createEventStream(event);

const interval = setInterval(async () => {
await eventStream.push(`Message @ ${new Date().toLocaleTimeString()}`);
}, 1000);

eventStream.onClosed(async () => {
clearInterval(interval);
await eventStream.close();
});

return eventStream.send();
});

Weitere Informationen

WebSockets werden von Nitro, h3 und crossws unterstützt. Weitere Informationen findest du in den Dokumenten zu Nitro, h3 und crossws.