Next JS Setup

Setting up

Install package

npm install streamthing

Environment variables

.env

SERVER_PASSWORD=abc123
NEXT_PUBLIC_SERVER_REGION=us3
SERVER_ID=123987
Server setup

When using Next JS you can setup your server with either server actions or Next JS route handlers. In the example we'll be using server actions

actions/streamthing.ts

"use server";

import { createServerStream } from "streamthing";

export async function sendEvent(event: string, message: string) {
  // Some sort of auth

  // Create a server stream
  const stream = createServerStream({
    channel: "main",
    id: process.env.SERVER_ID,
    region: process.env.NEXT_PUBLIC_SERVER_REGION,
    password: process.env.SERVER_PASSWORD,
  });

  // Send the event and message
  await stream.send(event, message);

  return {
    success: true,
    message: "Successfully sent message",
  };
}

export async function getToken(socketID: string) {
  // Some sort of auth

  const token = await createToken({
    id: process.env.SERVER_ID,
    channel: "main",
    password: process.env.SERVER_PASSWORD,
    socketID,
  });

  return token;
}
Full example

Here is a full example app using Next JS

app/index.tsx

"use client";

import { useEffect, useState } from "react";
import { createClientStream, ClientStream } from "streamthing";

export default function Page() {
  // Initialize state
  const [data, setData] = useState<string>("");

  useEffect(() => {
    let stream: ClientStream | null = null;
    // Create client stream
    (async () => {
      stream = await createClientStream(process.env.NEXT_PUBLIC_SERVER_REGION);
      stream.authenticate(await getToken(stream.id));

      // Create listener
      stream.receive("keyboard-event", (message) => {
        // Handle data
        setData(message);
      });
    })();

    // Send event
    window.onkeydown = async (e) => {
      await sendEvent("keyboard-event", e.key);
    };

    return () => {
      // Disconnect on unmount
      stream?.disconnect();
    };
  }, []);

  // Render data
  return (
    <div>
      <p>Data: {data}</p>
    </div>
  );
}