Typed WebSocket infrastructure for SvelteKit, providing both ephemeral per-request sockets and persistent WebSocket endpoints, with a reactive Svelte client component and a Vite plugin for proper upgrade handling.
โ ๏ธ Node-only
This package requires
@sveltejs/adapter-node. WebSockets are not supported on serverless or edge adapters.
connect, message, close, error.upgrade() in dev & previewnpm install @sourceregistry/sveltekit-websockets
or
pnpm add @sourceregistry/sveltekit-websockets
# or
yarn add @sourceregistry/sveltekit-websockets
src/
โโโ lib/
โ โโโ client/ # Svelte WebSocket component + helpers
โ โโโ server/ # WebSocket controllers & server logic
โ โโโ vite/ # Vite plugin for upgrade handling
โโโ routes/
โโโ ... # SvelteKit routes using WebSockets
use())Creates a single-use WebSocket URL bound to a SvelteKit request (e.g. a form action).
// src/routes/example/+page.server.ts
import {websockets} from '$lib/server';
export const actions = {
ws: async (event) => {
return {
url: websockets.use(event, (socket) => {
socket.send("Connected!");
socket.addEventListener("message", (msg) => {
console.log("Client says:", msg.data);
});
})
};
}
};
Returned response:
{
"url": "ws://localhost:5173/_/connect/abc123"
}
Characteristics:
continuous())Register long-lived WebSocket endpoints independent of requests.
// src/lib/server/index.ts
import {WebSocketEndpointController} from '$lib/server/controller';
export const websockets = new WebSocketEndpointController();
websockets.continuous('/chat', (socket) => {
socket.send("Welcome to /chat");
socket.addEventListener("message", (msg) => {
socket.send(`Echo: ${msg.data}`);
});
});
Accessible via:
ws://localhost:5173/chat
The package exports a Svelte component for declarative WebSocket usage.
<script lang="ts">
import WebSocket from "@sourceregistry/sveltekit-websockets";
</script>
<WebSocket action="?/ws">
{#snippet message(data)}
<p>{new Date().toLocaleTimeString()}: {data}</p>
{/snippet}
</WebSocket>
| Prop | Type | Description |
|---|---|---|
action |
string |
POST action returning { url } |
url |
string |
Direct WebSocket URL (optional) |
data |
T[] |
Reactive array of received messages |
auto_open |
boolean |
Auto-connect on mount (default: true) |
controller |
object | Manual open() / close() control |
message |
snippet | Render callback per message |
To allow WebSocket upgrades during development and preview, the Vite plugin must be registered.
// vite.config.ts
import {defineConfig} from 'vite';
import {websockets} from '@sourceregistry/sveltekit-websockets/vite';
export default defineConfig({
plugins: [
sveltekit(),
websockets() //ADD THIS
],
server: {
hmr: {
port: 5174
}
}
});
Without this plugin:
.upgrade() requests will fail in devThe WebSocketEndpointController handles:
/_/connect/:key)Map)This design keeps WebSocket logic explicit, testable, and framework-aligned.
use()Contributions are welcome.
Apache-2.0