A self-hosted orchestration system crafted for power users. composia.xyz
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263import { assertEquals } from "jsr:@std/assert@1.0.19/equals";
import { serializeContainerAction } from "./container-action-queue.ts";
function deferred() { let resolve; const promise = new Promise((done) => { resolve = done; }); return { promise, resolve };}
Deno.test("container actions run serially per container", async () => { const firstGate = deferred(); const events = [];
const first = serializeContainerAction("node-a:container-a", async () => { events.push("first:start"); await firstGate.promise; events.push("first:end"); return "first"; });
await Promise.resolve();
const second = serializeContainerAction("node-a:container-a", async () => { events.push("second:start"); return "second"; });
await Promise.resolve(); assertEquals(events, ["first:start"]);
firstGate.resolve(); assertEquals(await first, "first"); assertEquals(await second, "second"); assertEquals(events, ["first:start", "first:end", "second:start"]);});
Deno.test("container action queues are independent per container", async () => { const firstGate = deferred(); const events = [];
const first = serializeContainerAction("node-a:container-b", async () => { events.push("first:start"); await firstGate.promise; return "first"; });
const second = serializeContainerAction("node-a:container-c", async () => { events.push("second:start"); return "second"; });
await Promise.resolve(); await Promise.resolve(); assertEquals(events, ["first:start", "second:start"]);
firstGate.resolve(); assertEquals(await first, "first"); assertEquals(await second, "second");});