From e49fda41176d025a671802be76c219d66167276f Mon Sep 17 00:00:00 2001 From: Elizabeth Alexander Hunt Date: Mon, 12 May 2025 23:05:27 -0700 Subject: snapshot --- hooks/mod.ts | 107 ++++++++++++++++++----------------------------------------- 1 file changed, 32 insertions(+), 75 deletions(-) (limited to 'hooks/mod.ts') diff --git a/hooks/mod.ts b/hooks/mod.ts index 9fc4501..9df7d67 100755 --- a/hooks/mod.ts +++ b/hooks/mod.ts @@ -4,8 +4,11 @@ import { getRequiredEnv, getStdout, invalidExecutionEntriesOf, - type Traceable, - TraceableImpl, + Traceable, + ITraceable, + ITraceableLogger, + IEither, + Either, } from "@liz-ci/utils"; import type { Job } from "@liz-ci/model"; @@ -13,49 +16,6 @@ const SERVER_CONFIG = { host: "0.0.0.0", port: 9000, }; - -type QueuePosition = string; -interface IJobQueuer { - queue: ( - job: Traceable, - ) => Promise<{ ok?: QueuePosition; err?: unknown }>; -} - -class LaminarJobQueuer implements IJobQueuer { - constructor( - private readonly queuePositionPrefix: string, - ) {} - - public async queue({ item: job, logger }: Traceable) { - try { - const laminarCommand = [ - "laminarc", - "queue", - job.type, - ...Object.entries(job.arguments).map(([key, val]) => - `"${key}"="${val}"` - ), - ]; - - logger.log( - `im so excited to see how this queue job will end!! (>ᴗ<)`, - laminarCommand, - ); - - const output = await getStdout(laminarCommand); - logger.log(output); - - const [jobName, jobId] = output.split(":"); - const jobUrl = `${this.queuePositionPrefix}/jobs/${jobName}/${jobId}`; - - logger.log(`all queued up and weady to go~ (˘ω˘) => ${jobUrl}\n`); - return { ok: jobUrl, err: undefined }; - } catch (e) { - return { ok: undefined, err: e }; - } - } -} - interface IHealthCheckActivity { healthCheck(req: Traceable): Traceable>; } @@ -85,39 +45,36 @@ class HealthCheckActivity implements IHealthCheckActivity { } } -const aPost = (r: Traceable): Traceable<{ ok?: Request, err?: Response }> => - r.map((req) => { - const {item: request, logger} = req; - const {method} = request; - if (method !== "POST") { - const msg = "that's not how you pet me (⋟﹏⋞) try post instead~"; - logger.warn(msg); - const r405 = new Response(msg + "\n", {status: 405}); - return {err: r405}; - } - return {ok: request}; - }); +const aPost = (req: Traceable): IEither => { + const {item: request, logger} = req; + const {method} = request; + if (method !== "POST") { + const msg = "that's not how you pet me (⋟﹏⋞) try post instead~"; + logger.warn(msg); + return { err: new Response(msg + "\n", {status: 405}) }; + } + return {ok: request}; +}; -type JsonTransformer = (json: Traceable) => Traceable<{ ok?: R; err?: Response }>; +type JsonTransformer = (json: Traceable) => Either; const aJson = (jsonTransformer: JsonTransformer) => (r: Traceable) => r - .map(async ({item: request, logger}): Promise<{ ok?: JsonT, err?: Response }> => { - + .map(async ({item: request, logger}): Promise> => { try { return {ok: (await request.json())}; } catch (e) { const err = "seems to be invalid JSON (>//<) can you fix?"; logger.warn(err); - const r400 = new Response(msg + "\n", {status: 400}); - return {err: r400}; + return { err }; } }) - .flatMapAsync(TraceableImpl.promiseify((t): Traceable<{ ok?: BodyT, err?: Response }> => { + .flatMapAsync(TraceableImpl.promiseify((t): Traceable> => { const {item: {err, ok: json}} = t; - if (err) return >t; - return t.map(() => json!).flatMap(jsonTransformer); + if (err) return t.map(() => ({ err })); + return t.map(() => json!).map(jsonTransformer); })) + interface IJobHookActivity { processHook(req: Traceable): Traceable>; } @@ -126,31 +83,31 @@ class JobHookActivityImpl implements IJobHookActivity { constructor(private readonly queuer: IJobQueuer) {} private getJob( - j: Traceable, - ): Traceable<{ ok?: Job; err?: Response }> { - return j.map(({ logger, item }) => { + { logger, item }: Traceable, + ): Either { const isObject = (o: unknown): o is Record => typeof o === "object" && !Array.isArray(o) && !!o; if (!isObject(item) || !isObject(item.arguments)|| typeof item.type !== "string") { - const err = "your reqwest seems compwetewy mawfomed \\(-.-)/\n"; - logger.warn(err); - return { err: new Response(err, { status: 400 }) }; + const err = "seems like a pwetty mawfomed job \\(-.-)/"; + logger.warn(err) + return { err }; } const ok = { type: item.type, arguments: item.arguments }; const invalidArgEntries = invalidExecutionEntriesOf({type: ok.type, ...ok.arguments}); if (invalidArgEntries.length > 0) { - const err = "your reqwest seems invawid (´。﹏。`) can you fix? uwu"; + const err = "your reqwest seems invawid (´。﹏。`) can you fix? uwu\n" + invalidArgEntries; logger.warn(err); - return { err: new Response(err, { status: 400 }) }; + return { err }; } return { ok: ok }; - }); } public processHook(r: Traceable) { - return r.flatMap(aPost).flatMap((t) => { + return r.map(aPost) + .map((t) => { + either((err) => ({ err }), (request) => ) const {item: {ok: request, err}} = t; if (err) return > t; return t.map(() => request!).map(aJson(this.getJob)); -- cgit v1.2.3-70-g09d2