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