From 2002dd4749d4fdcbd19442ec9a14001cc031deec Mon Sep 17 00:00:00 2001 From: lifegpc Date: Wed, 7 Jun 2023 09:51:32 +0800 Subject: [PATCH] Add exit api --- fresh.gen.ts | 14 ++++++++------ routes/api/exit.ts | 27 +++++++++++++++++++++++++++ server/parse_form.ts | 14 ++++++++++++++ server/parse_form_test.ts | 17 +++++++++++++++++ 4 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 routes/api/exit.ts create mode 100644 server/parse_form.ts create mode 100644 server/parse_form_test.ts diff --git a/fresh.gen.ts b/fresh.gen.ts index 8b674f6..b8a0d9f 100644 --- a/fresh.gen.ts +++ b/fresh.gen.ts @@ -4,18 +4,20 @@ import config from "./deno.json" assert { type: "json" }; import * as $0 from "./routes/api/config.ts"; -import * as $1 from "./routes/api/export/gallery/zip/[gid].ts"; -import * as $2 from "./routes/api/task.ts"; -import * as $3 from "./routes/index.tsx"; +import * as $1 from "./routes/api/exit.ts"; +import * as $2 from "./routes/api/export/gallery/zip/[gid].ts"; +import * as $3 from "./routes/api/task.ts"; +import * as $4 from "./routes/index.tsx"; import * as $$0 from "./islands/Container.tsx"; import * as $$1 from "./islands/Settings.tsx"; const manifest = { routes: { "./routes/api/config.ts": $0, - "./routes/api/export/gallery/zip/[gid].ts": $1, - "./routes/api/task.ts": $2, - "./routes/index.tsx": $3, + "./routes/api/exit.ts": $1, + "./routes/api/export/gallery/zip/[gid].ts": $2, + "./routes/api/task.ts": $3, + "./routes/index.tsx": $4, }, islands: { "./islands/Container.tsx": $$0, diff --git a/routes/api/exit.ts b/routes/api/exit.ts new file mode 100644 index 0000000..2f504b3 --- /dev/null +++ b/routes/api/exit.ts @@ -0,0 +1,27 @@ +import { Handlers } from "$fresh/server.ts"; +import { parse_bool } from "../../server/parse_form.ts"; +import { get_task_manager } from "../../server.ts"; + +export const handler: Handlers = { + async POST(req, _ctx) { + let force = false; + try { + const form = await req.formData(); + force = await parse_bool(form.get("force"), false); + } catch (_) { + null; + } + setTimeout(async () => { + const m = get_task_manager(); + const aborted = m.aborted; + m.abort(); + if (force) { + m.force_abort(); + } + if (aborted) return; + await m.waiting_unfinished_task(); + m.close(); + }, 1); + return new Response("Aborted."); + }, +}; diff --git a/server/parse_form.ts b/server/parse_form.ts new file mode 100644 index 0000000..cb96ee0 --- /dev/null +++ b/server/parse_form.ts @@ -0,0 +1,14 @@ +export async function parse_bool( + value: FormDataEntryValue | null, + def: T, +): Promise { + if (value === null) return def; + const nv = typeof value === "string" ? value : await value.text(); + const v = nv.toLowerCase(); + const n = parseInt(v); + if (isNaN(n)) { + return v === "true"; + } else { + return n !== 0; + } +} diff --git a/server/parse_form_test.ts b/server/parse_form_test.ts new file mode 100644 index 0000000..f462f35 --- /dev/null +++ b/server/parse_form_test.ts @@ -0,0 +1,17 @@ +import { assertEquals } from "std/testing/asserts.ts"; +import { parse_bool } from "./parse_form.ts"; + +Deno.test("parse_bool_test", async () => { + const f = new FormData(); + f.append("a", "d"); + assertEquals(await parse_bool(f.get("a"), true), false); + assertEquals(await parse_bool(f.get("b"), true), true); + assertEquals(await parse_bool(f.get("b"), null), null); + assertEquals(await parse_bool(f.get("a"), null), false); + f.append("c", "1"); + f.append("d", "TRue"); + assertEquals(await parse_bool(f.get("c"), null), true); + assertEquals(await parse_bool(f.get("d"), null), true); + f.append("e", "tRUE", "a.png"); + assertEquals(await parse_bool(f.get("e"), null), true); +});