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:

ts
import { 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);
}
Hoe de handtekening werkt
authenticate() maakt een HMAC-SHA256 over socket_id:channel_name (en :channel_data voor presence) met je API-sleutel, als rauwe hex. Dit is bewust een eigen formaat — niet het key:signature-formaat van de Pusher-dienst.

Omgevingsvariabelen

Zorg dat deze in je .env.local staan (of koppel de realtime app aan je Cloud-app, dan worden ze automatisch gezet):

bash
GOPUSHER_API_KEY=JE_API_KEY
GOPUSHER_URL=https://realtime.eduinsights.nl