diff options
author | Elizabeth Hunt <lizhunt@amazon.com> | 2025-05-14 18:02:34 -0700 |
---|---|---|
committer | Elizabeth Hunt <lizhunt@amazon.com> | 2025-05-14 18:03:15 -0700 |
commit | 3a3fb9c8ab0c798a278f76d40de216fa96f6e2c4 (patch) | |
tree | bb44512bccceee43c57372a4ae325b5b70a6e192 /hooks | |
parent | f316b4a015b5b2e2988b250b3c34bbb7f9994709 (diff) | |
download | ci-3a3fb9c8ab0c798a278f76d40de216fa96f6e2c4.tar.gz ci-3a3fb9c8ab0c798a278f76d40de216fa96f6e2c4.zip |
moar
Diffstat (limited to 'hooks')
-rw-r--r-- | hooks/server/activity/health.ts | 0 | ||||
-rw-r--r-- | hooks/server/activity/hook.ts | 0 | ||||
-rw-r--r-- | hooks/server/activity/mod.ts | 8 | ||||
-rw-r--r-- | hooks/server/filter/json.ts | 25 | ||||
-rw-r--r-- | hooks/server/filter/method.ts | 22 | ||||
-rw-r--r-- | hooks/server/filter/mod.ts | 18 | ||||
-rw-r--r-- | hooks/server/mod.ts | 39 |
7 files changed, 39 insertions, 73 deletions
diff --git a/hooks/server/activity/health.ts b/hooks/server/activity/health.ts deleted file mode 100644 index e69de29..0000000 --- a/hooks/server/activity/health.ts +++ /dev/null diff --git a/hooks/server/activity/hook.ts b/hooks/server/activity/hook.ts deleted file mode 100644 index e69de29..0000000 --- a/hooks/server/activity/hook.ts +++ /dev/null diff --git a/hooks/server/activity/mod.ts b/hooks/server/activity/mod.ts deleted file mode 100644 index 0dee57b..0000000 --- a/hooks/server/activity/mod.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { RequestFilter } from "../filter/mod.ts"; - -export class r200 extends Response { - public override readonly status = 200; -} - -export interface IActivity extends RequestFilter<r200> { -} diff --git a/hooks/server/filter/json.ts b/hooks/server/filter/json.ts deleted file mode 100644 index bcdd3ee..0000000 --- a/hooks/server/filter/json.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Either, type IEither, type Traceable } from "@emprespresso/utils"; -import type { RequestFilter } from "./mod.ts"; - -type JsonTransformer<JsonT, R> = ( - json: Traceable<JsonT>, -) => IEither<Error, R>; -export const json = <BodyT, JsonT = unknown>( - jsonTransformer: JsonTransformer<JsonT, BodyT>, -): RequestFilter<BodyT> => -async (r: Traceable<Request>) => { - 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<Error, JsonT>(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 deleted file mode 100644 index 07fa5ee..0000000 --- a/hooks/server/filter/method.ts +++ /dev/null @@ -1,22 +0,0 @@ -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<HttpMethod>): RequestFilter<HttpMethod> => - (req: Traceable<Request>) => { - const { item: request, logger: _logger } = req; - const logger = _logger.addTracer(() => "[aPost]"); - - const { method: _method } = request; - const method = <HttpMethod> _method; - if (!methods.includes(method)) { - const msg = "that's not how you pet me (âīšâ)~"; - logger.warn(msg); - return Promise.resolve(Either.left<Response, HttpMethod>( - 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 deleted file mode 100644 index bedc678..0000000 --- a/hooks/server/filter/mod.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { - IEither, - ITraceable, - ITraceableLogger, - TraceableLogger, -} from "@liz-ci/utils"; - -export interface RequestFilter< - T, - L extends ITraceableLogger<L> = TraceableLogger, - RIn = ITraceable<Request, L>, - Err = Response, -> { - (req: RIn): Promise<IEither<Err, T>>; -} - -export * from "./method.ts"; -export * from "./json.ts"; diff --git a/hooks/server/mod.ts b/hooks/server/mod.ts index e69de29..c484af4 100644 --- a/hooks/server/mod.ts +++ b/hooks/server/mod.ts @@ -0,0 +1,39 @@ +import { Either, type ITraceable } from "@emprespresso/pengueno"; + +const healthCheck = async <Trace>(in: ITraceable<"healthy?", Trace>) => { + return getRequiredEnv("LAMINAR_HOST").flatMap((_host) => Either.fromFailableAsync( + getStdout(in.move(["laminarc", "show-jobs"])) + )) +} + +export class LizCIServer { + private constructor( + private readonly healthCheckActivity = HealthCheckActivity(healthCheck), + private readonly jobHookActivity = JobHookActivity(jobQueuer) + ) {} + + private async route(req: ITraceable<req: Request, LogTraceable>) { + return req.flatMap((req) => { + const { logger, item: { method, pathname } } = req; + if (pathname === "/health") { + return this.healthCheckActivity.healthCheck(req); + } + return this.jobHookActivity.processHook(req); + }); + } + + public async serve(req: Request): Promise<Response> { + return LogTraceable(req).bimap(TraceUtil.withClassTrace(this)).map(this.route) + } +} +private route( + req: Traceable<Request & { pathname: string }>, +): Traceable<Promise<Response>> { + return req.flatMap((req) => { + const { logger, item: { method, pathname } } = req; + if (pathname === "/health") { + return this.healthCheckActivity.healthCheck(req); + } + return this.jobHookActivity.processHook(req); + }); +} |