Newer
Older
client_dwatch / app / api / ds-agent / commands / route.ts
/**
 * GET /ds-agent/commands — 制御盤が指示を取りに来る(ロングポーリング。指示書AY 段階7-3。D2・D-179)
 *
 * 仕様の正は `d-watch-api.yaml` の /ds-agent/commands。認証は制御盤の Bearer だけ(`requireAgent()` で再検証)。
 * 指示があればすぐ 200、無ければ `wait` 秒で 204。★DB を読まない★(`USE_FIXTURES` に関係なく同じ動き)。
 */
import { NextResponse } from "next/server";
import { noContent } from "@/lib/ds-agent/agent-request";
import { getRelay } from "@/lib/ds-agent/relay";
import { ensureDsAgentLogging } from "@/lib/ds-agent/relay-log";
import { agentVersionOf, requireAgent } from "@/lib/ds-agent/require-agent";
import { parseAgentPollWait } from "@/lib/ds-logs/validate";
import { withRequestId } from "@/lib/logger";

export async function GET(request: Request) {
  return withRequestId(request, async () => {
    ensureDsAgentLogging();
    const auth = await requireAgent(request);
    if (!auth.ok) return auth.response;

    const wait = parseAgentPollWait(new URL(request.url).searchParams.get("wait"));
    if (!wait.ok) return NextResponse.json(wait.error, { status: wait.status });

    const command = await getRelay().poll(auth.serial, agentVersionOf(request), wait.query, request.signal);
    return command ? NextResponse.json(command) : noContent();
  });
}