summaryrefslogtreecommitdiff
path: root/hooks/queuer.ts
blob: d2987caffdc267752b90322584a87787d93fa64b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { getStdout, type IEither, type Traceable } from "@liz-ci/utils";
import type { Job } from "@liz-ci/model";

type QueuePosition = string;
export class QueueError extends Error {}
export interface IJobQueuer<TJob> {
  queue: (
    job: TJob,
  ) => Promise<IEither<QueueError, QueuePosition>>;
}

export class LaminarJobQueuer implements IJobQueuer<Traceable<Job>> {
  constructor(
    private readonly queuePositionPrefix: string,
  ) {}

  public async queue(j: Traceable<Job>) {
    const { item: job, logger: _logger } = j;
    const logger = _logger.addTracer(() => `[LaminarJobQueuer.queue.${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(j.map(() => laminarCommand))).mapRight(
      (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 jobUrl;
      },
    );
  }
}