Files
talk-pro/node_modules/astro/dist/actions/handler.js
2026-05-12 16:16:03 +08:00

46 lines
1.4 KiB
JavaScript

import { PipelineFeatures } from "../core/base-pipeline.js";
import { getActionContext, serializeActionResult } from "./runtime/server.js";
class ActionHandler {
/**
* Run action handling for the current request. Expects the APIContext
* that is already being used by the render pipeline.
*
* Returns a `Response` when the action fully handles the request (RPC),
* or `undefined` when the caller should continue processing the
* request (form actions or non-action requests).
*/
handle(apiContext, state) {
state.pipeline.usedFeatures |= PipelineFeatures.actions;
if (apiContext.isPrerendered) {
return void 0;
}
const { action, setActionResult } = getActionContext(apiContext);
if (!action) {
return void 0;
}
return this.#executeAction(action, setActionResult);
}
async #executeAction(action, setActionResult) {
const actionResult = await action.handler();
const serialized = serializeActionResult(actionResult);
if (action.calledFrom === "rpc") {
if (serialized.type === "empty") {
return new Response(null, {
status: serialized.status
});
}
return new Response(serialized.body, {
status: serialized.status,
headers: {
"Content-Type": serialized.contentType
}
});
}
setActionResult(action.name, serialized);
return void 0;
}
}
export {
ActionHandler
};