Server (Next.js)
De GoPusherServer-class wordt gebruikt in Server Actions en Route Handlers om events te publiceren en kanalen te autoriseren. Zorg dat je de bestanden hebt geïnstalleerd.
Instantie gebruiken
In lib/go-pusher-server.ts wordt automatisch een pusher-instantie aangemaakt met je omgevingsvariabelen. Importeer die overal:
tsimport { pusher } from "@/lib/go-pusher-server";
Events publiceren (Server Action)
Gebruik pusher.publish(kanaal, event, data) om een event naar alle verbonden clients te sturen:
ts"use server"; import { pusher } from "@/lib/go-pusher-server"; export async function verstuurBericht(formData: FormData) { const tekst = formData.get("tekst") as string; await pusher.publish("chat", "nieuw-bericht", { gebruiker: "Bas", tekst }); }
Gebruik dit als form action in een Client Component:
tsx"use client"; import { useState } from "react"; import { useChannel } from "@/hooks/use-channel"; import { verstuurBericht } from "./actions"; export default function Chat() { const [bericht, setBericht] = useState<any>(null); useChannel(process.env.NEXT_PUBLIC_GOPUSHER_KEY!, "chat", "nieuw-bericht", setBericht); return ( <div> {bericht && <p><b>{bericht.gebruiker}:</b> {bericht.tekst}</p>} <form action={verstuurBericht}> <input name="tekst" placeholder="Typ een bericht..." /> <button type="submit">Verstuur</button> </form> </div> ); }
Publiceren vanuit een Route Handler
Je kunt ook events publiceren vanuit een API-route:
ts// app/api/notify/route.ts import { NextRequest, NextResponse } from "next/server"; import { pusher } from "@/lib/go-pusher-server"; export async function POST(req: NextRequest) { const { bericht } = await req.json(); await pusher.publish("notificaties", "alert", { tekst: bericht, tijd: new Date().toISOString(), }); return NextResponse.json({ ok: true }); }
Kanaal-autorisatie (Route Handler)
Privé- en presence-kanalen vereisen server-side autorisatie. De client roept je auth-endpoint automatisch aan via subscribePrivate():
ts// app/api/pusher/auth/route.ts import { NextRequest, NextResponse } from "next/server"; import { pusher } from "@/lib/go-pusher-server"; export async function POST(req: NextRequest) { const { socket_id, channel_name, channel_data } = await req.json(); // Controleer hier of de gebruiker toegang heeft! // const sessie = await getServerSession(); // if (!sessie) return NextResponse.json({ error: "Niet ingelogd" }, { status: 401 }); const auth = pusher.authenticate(socket_id, channel_name, channel_data); return NextResponse.json(auth); }
Omgevingsvariabelen
Zorg dat deze in je .env.local staan (of koppel de realtime app aan je Cloud-app, dan worden ze automatisch gezet):
bashGOPUSHER_API_KEY=JE_API_KEY GOPUSHER_URL=https://realtime.eduinsights.nl
Meer in Realtime (WebSockets)