Next.js
WebSockets
Implementing real-time communication using Pusher in a Next.js application.
Pusher Server-side (API Route): Triggering real-time events from an API route.
app/api/message/route.ts
TypeScript
import { NextResponse } from 'next/server';
import Pusher from 'pusher';
const pusher = new Pusher({
appId: process.env.PUSHER_APP_ID!,
key: process.env.PUSHER_KEY!,
secret: process.env.PUSHER_SECRET!,
cluster: process.env.PUSHER_CLUSTER!,
useTLS: true,
});
export async function POST(request: Request) {
const { message } = await request.json();
await pusher.trigger('chat-channel', 'new-message', {
message,
timestamp: new Date().toISOString(),
});
return NextResponse.json({ success: true });
}
Pusher Client-side: Listening to real-time events in a React component.
app/components/Chat.tsx
TSX
'use client';
import { useEffect, useState } from 'react';
import Pusher from 'pusher-js';
export default function Chat() {
const [messages, setMessages] = useState<string[]>([]);
useEffect(() => {
// Initialize Pusher
const pusher = new Pusher(process.env.NEXT_PUBLIC_PUSHER_KEY!, {
cluster: process.env.NEXT_PUBLIC_PUSHER_CLUSTER!,
});
// Subscribe to channel
const channel = pusher.subscribe('chat-channel');
// Bind to event
channel.bind('new-message', (data: { message: string }) => {
setMessages((prev) => [...prev, data.message]);
});
// Cleanup
return () => {
pusher.unsubscribe('chat-channel');
};
}, []);
return (
<div>
<h2>Live Chat</h2>
<ul>
{messages.map((msg, i) => (
<li key={i}>{msg}</li>
))}
</ul>
</div>
);
}