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); }, ); } }