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/queuer.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 hooks/queuer.ts (limited to 'hooks/queuer.ts') diff --git a/hooks/queuer.ts b/hooks/queuer.ts new file mode 100644 index 0000000..1461809 --- /dev/null +++ b/hooks/queuer.ts @@ -0,0 +1,47 @@ +import type { IEither, ITraceable, ITraceableLogger } from "@liz-ci/utils"; +import type { Job } from "@liz-ci/model"; + +type QueuePosition = string; +export class QueueError extends Error {} +export interface IJobQueuer { + queue: >( + job: ITraceable, + ) => Promise>; +} + +export class LaminarJobQueuer implements IJobQueuer { + constructor( + private readonly queuePositionPrefix: string, + ) {} + + public async queue({ item: job, logger }: Traceable) { + 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, + ); + + return (await getStdout(laminarCommand)).mapBoth( + (e) => { + const err = `we bwoke oh noesss D:`; + logger.error(err, e); + return Either.left(e); + }, + (stdout) => { + logger.log(stdout); + + const [jobName, jobId] = stdout.split(":"); + const jobUrl = `${this.queuePositionPrefix}/jobs/${jobName}/${jobId}`; + + logger.log(`all queued up and weady to go~ (˘ω˘) => ${jobUrl}\n`); + return Either.right(jobUrl); + }, + ); + } +} -- cgit v1.2.3-70-g09d2