summaryrefslogtreecommitdiff
path: root/hooks/queuer.ts
diff options
context:
space:
mode:
Diffstat (limited to 'hooks/queuer.ts')
-rw-r--r--hooks/queuer.ts47
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);
+ },
+ );
+ }
+}