summaryrefslogtreecommitdiff
path: root/hooks
diff options
context:
space:
mode:
authorElizabeth Hunt <lizhunt@amazon.com>2025-05-14 18:02:34 -0700
committerElizabeth Hunt <lizhunt@amazon.com>2025-05-14 18:03:15 -0700
commit3a3fb9c8ab0c798a278f76d40de216fa96f6e2c4 (patch)
treebb44512bccceee43c57372a4ae325b5b70a6e192 /hooks
parentf316b4a015b5b2e2988b250b3c34bbb7f9994709 (diff)
downloadci-3a3fb9c8ab0c798a278f76d40de216fa96f6e2c4.tar.gz
ci-3a3fb9c8ab0c798a278f76d40de216fa96f6e2c4.zip
moar
Diffstat (limited to 'hooks')
-rw-r--r--hooks/server/activity/health.ts0
-rw-r--r--hooks/server/activity/hook.ts0
-rw-r--r--hooks/server/activity/mod.ts8
-rw-r--r--hooks/server/filter/json.ts25
-rw-r--r--hooks/server/filter/method.ts22
-rw-r--r--hooks/server/filter/mod.ts18
-rw-r--r--hooks/server/mod.ts39
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);
+ });
+}