Add parallel server action utilities

This commit is contained in:
CPTProgrammer 2026-07-13 09:07:18 +08:00
parent a4686c09b5
commit 77b7db9dd1
No known key found for this signature in database

View File

@ -0,0 +1,46 @@
/**
* Parallel Server Action utilities.
*
* Server Actions are dispatched sequentially per client in Next.js.
* `createParallelAction` wraps a server function so its outer wrapper
* returns immediately without awaiting the inner work, freeing the
* dispatch queue. The real work continues asynchronously on the server,
* and the result is streamed back via React Flight.
*
* Usage:
*
* // server (in a "use server" file):
* export const getData = createParallelAction(async (id: string) => {
* return await fetchExpensiveData(id);
* });
*
* // client:
* const result = await runParallelAction(getData("abc"));
*
* Multiple calls can run in parallel each outer Action returns instantly,
* so the Next.js serial queue does not block subsequent calls.
*
* @see https://github.com/icflorescu/next-server-actions-parallel
*/
/**
* Wrap an async server function so it returns immediately without awaiting
* the inner work. The outer function completes instantly (returning a
* Flight-wrapped promise tuple), so the Next.js Server Action dispatch
* queue is freed for the next call.
*/
export function createParallelAction<T, U extends unknown[]>(
action: (...args: U) => Promise<T>,
) {
return async (...args: U) => [action(...args)] as const;
}
/**
* Await the result of a parallel Server Action created by
* {@link createParallelAction}. Call this on the client side.
*/
export async function runParallelAction<T>(
result: Promise<readonly [Promise<T>]>,
) {
return (await result)[0];
}