summaryrefslogtreecommitdiff
path: root/hooks
diff options
context:
space:
mode:
Diffstat (limited to 'hooks')
-rw-r--r--hooks/job/queue.ts0
-rw-r--r--hooks/main.ts1
-rwxr-xr-xhooks/server.ts61
-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.ts0
10 files changed, 75 insertions, 60 deletions
diff --git a/hooks/job/queue.ts b/hooks/job/queue.ts
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hooks/job/queue.ts
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<R> {
healthCheck(req: R): Promise<Response>;
}
-class HealthCheckActivity implements IHealthCheckActivity<Traceable<Request>> {
- public async healthCheck(
- req: Traceable<Request>,
- ) {
- 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<Request>): IEither<Response, Request> => {
- 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<JsonT, R> = (json: Traceable<JsonT>) => Either<string, R>;
-const aJson =
- <BodyT, JsonT = unknown>(jsonTransformer: JsonTransformer<JsonT, BodyT>) =>
- async (r: Traceable<Request>): Promise<Either<string, BodyT>> => {
- const { item: request, logger } = r;
- try {
- return Either.right<string, JsonT>(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<R> {
processHook(req: R): Promise<Response>;
}
@@ -82,9 +25,7 @@ type GetJobRequest = { jobType: string; args: unknown };
class JobHookActivityImpl implements IJobHookActivity<Traceable<Request>> {
constructor(private readonly queuer: IJobQueuer<Traceable<Job>>) {}
- private getJob<JsonT>(
- u: Traceable<JsonT>,
- ): Either<string, Job> {
+ private getJob<JsonT>(u: Traceable<JsonT>): Either<string, Job> {
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
--- /dev/null
+++ b/hooks/server/activity/health.ts
diff --git a/hooks/server/activity/hook.ts b/hooks/server/activity/hook.ts
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hooks/server/activity/hook.ts
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<r200> {
+}
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<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
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<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
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<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
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hooks/server/mod.ts