Defining multiple clients
A common and recommended pattern with this library is to define multiple safe action clients, to cover different use cases that you might want and/or need in your applicaton.
The most simple case that comes to mind is to define a client for unauthenticated actions, and one for authenticated actions, but you can define as many clients as you want:
import { createSafeActionClient } from "next-safe-action";
import { cookies } from "next/headers";
import { getUserIdFromSessionId } from "./db";
// This is our base client.
export const action = createSafeActionClient();
// This client ensures that the user is authenticated before running action server code.
export const authAction = createSafeActionClient({
// Can also be a non async function.
async middleware() {
const session = cookies().get("session")?.value;
if (!session) {
throw new Error("Session not found!");
}
// In the real world, you would check if the session is valid by querying a database.
// We'll keep it very simple here.
const userId = await getUserIdFromSessionId(session);
if (!userId) {
throw new Error("Session is not valid!");
}
return { userId };
},
});