24 lines · 868 B
import { createMiddleware } from "@tanstack/react-start";
import { notFound } from "@tanstack/react-router";
import { sessionViewer } from "~/server/auth";
import { HttpError, unauthorized } from "~/server/errors";
import type { Viewer } from "~/lib/types";

const HTTP_NOT_FOUND = 404;

/** Resolves the session viewer for every server function and maps 404s onto router not-found handling. */
export const viewerMiddleware = createMiddleware({ type: "function" }).server(async ({ next }) => {
  const viewer = await sessionViewer();
  try {
    return await next({ context: { viewer } });
  } catch (error) {
    if (error instanceof HttpError && error.status === HTTP_NOT_FOUND) throw notFound();
    throw error;
  }
});

export function requireViewer(viewer: Viewer | null): Viewer {
  if (!viewer) throw unauthorized("You must be signed in");
  return viewer;
}