diff options
Diffstat (limited to 'hooks/mod.ts')
-rwxr-xr-x | hooks/mod.ts | 107 |
1 files changed, 32 insertions, 75 deletions
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<Job>, - ) => Promise<{ ok?: QueuePosition; err?: unknown }>; -} - -class LaminarJobQueuer implements IJobQueuer { - constructor( - private readonly queuePositionPrefix: string, - ) {} - - public async queue({ item: job, logger }: Traceable<Job>) { - 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<Request>): Traceable<Promise<Response>>; } @@ -85,39 +45,36 @@ class HealthCheckActivity implements IHealthCheckActivity { } } -const aPost = (r: Traceable<Request>): 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<Request>): IEither<Response, Request> => { + 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<JsonT, R> = (json: Traceable<JsonT>) => Traceable<{ ok?: R; err?: Response }>; +type JsonTransformer<JsonT, R> = (json: Traceable<JsonT>) => Either<string, R>; const aJson = <BodyT, JsonT = unknown>(jsonTransformer: JsonTransformer<JsonT, BodyT>) => (r: Traceable<Request>) => r - .map(async ({item: request, logger}): Promise<{ ok?: JsonT, err?: Response }> => { - + .map(async ({item: request, logger}): Promise<Either<string, JsonT>> => { try { return {ok: <JsonT>(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<Either<string, BodyT>> => { const {item: {err, ok: json}} = t; - if (err) return <Traceable<{ err: Response }>>t; - return t.map(() => json!).flatMap(jsonTransformer); + if (err) return t.map(() => ({ err })); + return t.map(() => json!).map(jsonTransformer); })) + interface IJobHookActivity { processHook(req: Traceable<Request>): Traceable<Promise<Response>>; } @@ -126,31 +83,31 @@ class JobHookActivityImpl implements IJobHookActivity { constructor(private readonly queuer: IJobQueuer) {} private getJob( - j: Traceable<unknown>, - ): Traceable<{ ok?: Job; err?: Response }> { - return j.map(({ logger, item }) => { + { logger, item }: Traceable<unknown>, + ): Either<string, Job> { const isObject = (o: unknown): o is Record<string, unknown> => 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: <Job>ok }; - }); } public processHook(r: Traceable<Request>) { - 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 <Traceable<{ err: Response }>> t; return t.map(() => request!).map(aJson(this.getJob)); |