From 1d66a0f58e4ebcdf4f42c9d78f82a1ab49a2cf11 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Tue, 13 May 2025 18:58:45 -0700 Subject: snapshot! --- hooks/job/queue.ts | 0 hooks/main.ts | 1 + hooks/server.ts | 61 +---------------------------------------- hooks/server/activity/health.ts | 0 hooks/server/activity/hook.ts | 0 hooks/server/activity/mod.ts | 8 ++++++ hooks/server/filter/json.ts | 25 +++++++++++++++++ hooks/server/filter/method.ts | 22 +++++++++++++++ hooks/server/filter/mod.ts | 18 ++++++++++++ hooks/server/mod.ts | 0 10 files changed, 75 insertions(+), 60 deletions(-) create mode 100644 hooks/job/queue.ts create mode 100644 hooks/main.ts create mode 100644 hooks/server/activity/health.ts create mode 100644 hooks/server/activity/hook.ts create mode 100644 hooks/server/activity/mod.ts create mode 100644 hooks/server/filter/json.ts create mode 100644 hooks/server/filter/method.ts create mode 100644 hooks/server/filter/mod.ts create mode 100644 hooks/server/mod.ts (limited to 'hooks') diff --git a/hooks/job/queue.ts b/hooks/job/queue.ts new file mode 100644 index 0000000..e69de29 diff --git a/hooks/main.ts b/hooks/main.ts new file mode 100644 index 0000000..1348e57 --- /dev/null +++ b/hooks/main.ts @@ -0,0 +1 @@ +#!/usr/bin/env -S deno run --allow-env --allow-net --allow-run diff --git a/hooks/server.ts b/hooks/server.ts index 000c391..9a3f716 100755 --- a/hooks/server.ts +++ b/hooks/server.ts @@ -1,5 +1,3 @@ -#!/usr/bin/env -S deno run --allow-env --allow-net --allow-run - import { Either, getRequiredEnv, @@ -20,61 +18,6 @@ interface IHealthCheckActivity { healthCheck(req: R): Promise; } -class HealthCheckActivity implements IHealthCheckActivity> { - public async healthCheck( - req: Traceable, - ) { - return await req.bimap(Traceable.withClassTrace(this)) - .map(async (r) => { - const { logger } = r; - try { - getRequiredEnv("LAMINAR_HOST"); - await getStdout(r.map(() => ["laminarc", "show-jobs"])); - const msg = `think im healthy!! (✿˘◡˘) ready to do work~\n`; - logger.log(msg); - return new Response( - msg, - { status: 200 }, - ); - } catch (error) { - logger.error(error); - return new Response( - "oh no, i need to eat more vegetables (。•́︿•̀。)...\n", - { status: 500 }, - ); - } - }).item; - } -} - -const aPost = (req: Traceable): IEither => { - const { item: request, logger: _logger } = req; - const logger = _logger.addTracer(() => "[aPost]"); - - if (request.method !== "POST") { - const msg = "that's not how you pet me (⋟﹏⋞) try post instead~"; - logger.warn(msg); - return Either.left(new Response(msg + "\n", { status: 405 })); - } - return Either.right(request); -}; - -type JsonTransformer = (json: Traceable) => Either; -const aJson = - (jsonTransformer: JsonTransformer) => - async (r: Traceable): Promise> => { - const { item: request, logger } = r; - try { - return Either.right(await request.json()) - .mapRight(r.move) - .flatMap(jsonTransformer); - } catch (_e) { - const err = "seems to be invalid JSON (>//<) can you fix?"; - logger.warn(err); - return Either.left(err); - } - }; - interface IJobHookActivity { processHook(req: R): Promise; } @@ -82,9 +25,7 @@ type GetJobRequest = { jobType: string; args: unknown }; class JobHookActivityImpl implements IJobHookActivity> { constructor(private readonly queuer: IJobQueuer>) {} - private getJob( - u: Traceable, - ): Either { + private getJob(u: Traceable): Either { const { logger: _logger, item } = u; const logger = _logger.addTracer(() => "[getJob]"); const couldBeJsonJob = isObject(item) && "arguments" in item && diff --git a/hooks/server/activity/health.ts b/hooks/server/activity/health.ts new file mode 100644 index 0000000..e69de29 diff --git a/hooks/server/activity/hook.ts b/hooks/server/activity/hook.ts new file mode 100644 index 0000000..e69de29 diff --git a/hooks/server/activity/mod.ts b/hooks/server/activity/mod.ts new file mode 100644 index 0000000..0dee57b --- /dev/null +++ b/hooks/server/activity/mod.ts @@ -0,0 +1,8 @@ +import type { RequestFilter } from "../filter/mod.ts"; + +export class r200 extends Response { + public override readonly status = 200; +} + +export interface IActivity extends RequestFilter { +} diff --git a/hooks/server/filter/json.ts b/hooks/server/filter/json.ts new file mode 100644 index 0000000..bcdd3ee --- /dev/null +++ b/hooks/server/filter/json.ts @@ -0,0 +1,25 @@ +import { Either, type IEither, type Traceable } from "@emprespresso/utils"; +import type { RequestFilter } from "./mod.ts"; + +type JsonTransformer = ( + json: Traceable, +) => IEither; +export const json = ( + jsonTransformer: JsonTransformer, +): RequestFilter => +async (r: Traceable) => { + const { item: request, logger: _logger } = r; + const logger = _logger.addTracer(() => "[jsonVerification]"); + + const getJson = request.json().catch((errReason) => { + const err = "seems to be invalid JSON (>//<) can you fix?"; + logger.warn(err, errReason); + return new Error(err); + }); + return (await Either.fromAsync(getJson)) + .mapRight(r.move).flatMap(jsonTransformer) + .mapLeft((err) => { + logger.warn(err); + return new Response(err.message, { status: 400 }); + }); +}; diff --git a/hooks/server/filter/method.ts b/hooks/server/filter/method.ts new file mode 100644 index 0000000..07fa5ee --- /dev/null +++ b/hooks/server/filter/method.ts @@ -0,0 +1,22 @@ +import { Either, type Traceable } from "@liz-ci/utils"; +import type { RequestFilter } from "./mod.ts"; + +type HttpMethod = "POST" | "GET" | "HEAD" | "PUT" | "DELETE"; +export const requireMethod = + (methods: Array): RequestFilter => + (req: Traceable) => { + const { item: request, logger: _logger } = req; + const logger = _logger.addTracer(() => "[aPost]"); + + const { method: _method } = request; + const method = _method; + if (!methods.includes(method)) { + const msg = "that's not how you pet me (⋟﹏⋞)~"; + logger.warn(msg); + return Promise.resolve(Either.left( + new Response(msg + "\n", { status: 405 }), + )); + } + + return Promise.resolve(Either.right(method)); + }; diff --git a/hooks/server/filter/mod.ts b/hooks/server/filter/mod.ts new file mode 100644 index 0000000..bedc678 --- /dev/null +++ b/hooks/server/filter/mod.ts @@ -0,0 +1,18 @@ +import type { + IEither, + ITraceable, + ITraceableLogger, + TraceableLogger, +} from "@liz-ci/utils"; + +export interface RequestFilter< + T, + L extends ITraceableLogger = TraceableLogger, + RIn = ITraceable, + Err = Response, +> { + (req: RIn): Promise>; +} + +export * from "./method.ts"; +export * from "./json.ts"; diff --git a/hooks/server/mod.ts b/hooks/server/mod.ts new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3-70-g09d2