alpha01 filetti: web app, crossword service and tor batch

This commit is contained in:
2026-06-05 16:22:17 +02:00
parent 47d8957e15
commit 9cb8a5aa8f
29 changed files with 8590 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
import { readFile } from "node:fs/promises";
import { join } from "node:path";
import { NextResponse } from "next/server";
const RUNTIME_DIR = join(process.cwd(), ".runtime-crosswords");
export async function GET(
_request: Request,
context: { params: Promise<{ id: string }> },
) {
try {
const { id } = await context.params;
const source = await readFile(join(RUNTIME_DIR, `${id}.json`), "utf-8");
return NextResponse.json(JSON.parse(source));
} catch {
return NextResponse.json({ status: "not_found" }, { status: 404 });
}
}

View File

@@ -0,0 +1,65 @@
import { mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { spawn } from "node:child_process";
import { NextResponse } from "next/server";
const PYTHON = process.env.PYTHON_EXECUTABLE || "python";
const PROJECT_ROOT = join(process.cwd(), "..");
const RUNTIME_DIR = join(process.cwd(), ".runtime-crosswords");
function runPython(requestPayload: unknown): Promise<string> {
return new Promise((resolve, reject) => {
const child = spawn(PYTHON, ["crossword_service.py"], {
cwd: PROJECT_ROOT,
stdio: ["pipe", "pipe", "pipe"],
});
let stdout = "";
let stderr = "";
child.stdout.on("data", (chunk) => {
stdout += chunk.toString();
});
child.stderr.on("data", (chunk) => {
stderr += chunk.toString();
});
child.on("error", (error) => {
reject(error);
});
child.on("close", (code) => {
if (code !== 0) {
reject(new Error(stderr || `Python process exited with code ${code}`));
return;
}
resolve(stdout);
});
child.stdin.write(JSON.stringify(requestPayload));
child.stdin.end();
});
}
export async function POST(request: Request) {
try {
const payload = await request.json();
const stdout = await runPython(payload);
const responsePayload = JSON.parse(stdout);
await mkdir(RUNTIME_DIR, { recursive: true });
const targetPath = join(RUNTIME_DIR, `${responsePayload.crossword_id}.json`);
await writeFile(targetPath, JSON.stringify(responsePayload, null, 2), "utf-8");
return NextResponse.json(responsePayload);
} catch (error) {
return NextResponse.json(
{
status: "error",
message: error instanceof Error ? error.message : "Unknown error",
},
{ status: 500 },
);
}
}