WebSockets
WebSocket procedures enable real-time bi-directional communication between the client and server without the need to manage any kind of infrastructure ๐ฅณ.
Important: JStack's WebSocket implementation is designed specifically for Cloudflare Workers. This is because Cloudflare Workers allow long-lived real-time connections while Vercel and other Node.js runtime providers do not.
A WebSocket handler receives the following objects:
c: Hono context, e.g. headers, request info, env variablesctx: Your context, e.g. database instance, authenticated userio: Connection manager for sending messages to clients
WebSockets Example
WebSockets are incredible for real-time features:
- Collaborative editing
- Real-time chat
- Live dashboard updates
Example: In the WebSocket router below, we implement a basic chat:
- Validate
incoming/outgoingmessages using thechatValidator - Manage WebSocket connections and room-based message broadcasting
server/routers/chat-router.ts
You can now listen to (and emit) real-time events on the client:
app/page.tsx
WebSockets Setup
Development
To make scalable, serverless WebSockets possible, JStack uses Upstash Redis as its real-time engine. Deploying real-world, production WebSocket applications is possible without a credit card, entirely on their free tier.
Side note: In the future, I'd like to add the ability to provide your own Redis connection string (e.g. self-hosted).
-
After logging into Upstash, create a Redis database by clicking the Create Database button

-
Copy the
UPSTASH_REDIS_REST_URLandUPSTASH_REDIS_REST_TOKENenv variables into a.dev.varsfile in the root of your app
.dev.vars
-
Start your Cloudflare backend using
Terminal
-
Point the client
baseUrlto the Cloudflare backend on port8080:That's it! ๐ You can now use WebSockets for your local development. See below for an examle usage.
Deployment
-
Deploy your backend to Cloudflare Workers using wrangler:
Terminal
Reason: Serverless functions, such as those provided by Vercel, Netlify, or other serverless platforms, have a maximum execution limit and do not support long-lived connections. Cloudflare workers do.
The console output looks like this:

-
Add the deployment URL to the client:
lib/client.ts
- Set the
UPSTASH_REDIS_REST_URLandUPSTASH_REDIS_REST_TOKENenv variables in your Worker so it can access them:
Terminal

That's it! ๐ If you now deploy your app to Vercel, Netlify, etc., the client will automatically connect to your production Cloudflare Worker.
You can verify the connection by sending a request to:

- Set the