diff options
Diffstat (limited to 'hooks/queuer.ts')
-rw-r--r-- | hooks/queuer.ts | 47 |
1 files changed, 47 insertions, 0 deletions
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<TJob> { + queue: <L extends ITraceableLogger<L>>( + job: ITraceable<TJob, L>, + ) => Promise<IEither<QueueError, QueuePosition>>; +} + +export class LaminarJobQueuer implements IJobQueuer<Job> { + constructor( + private readonly queuePositionPrefix: string, + ) {} + + public async queue({ item: job, logger }: Traceable<Job>) { + 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<QueueError, QueuePosition>(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<QueueError, QueuePosition>(jobUrl); + }, + ); + } +} |