Initial Commit

This commit is contained in:
2026-05-27 23:29:53 +01:00
commit fbc70f96e6
10000 changed files with 1102152 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
/**
* §16 conformance proof — the in-memory broker MUST satisfy every
* documented invariant of the `@suaveplan/api-ws` `WsBroker` contract.
*
* The api-ws package's `runWsEngineConformance` harness needs a full
* `(bus, registry, broker, makeConnection)` tuple — broker-only
* packages cannot drive it. Instead, this conformance suite mirrors
* the broker-shaped assertions from `api-ws/broker/broker.spec-conformance.test.ts`
* against the concrete `createInMemoryWsBroker` factory.
*/
import type { TenantId } from "@suaveplan/api-types/tenant";
import type {
BrokerEnvelope,
BrokerHandler,
BrokerSubscription,
WsBroker,
} from "@suaveplan/api-ws/broker";
import { describe, expect, expectTypeOf, it } from "@suaveplan/testing/runner";
import { createInMemoryWsBroker } from "../../src/broker/broker.js";
describe("WsBroker conformance: in-memory-direct", () => {
it("type-shape matches WsBroker", { timeout: 5000 }, () => {
const broker = createInMemoryWsBroker<number>();
expectTypeOf(broker).toMatchTypeOf<WsBroker<number>>();
expectTypeOf(broker.publish).parameters.toEqualTypeOf<
[topic: string, envelope: BrokerEnvelope<number>]
>();
expectTypeOf(broker.subscribe).parameters.toEqualTypeOf<
[topic: string, handler: BrokerHandler<number>]
>();
broker.dispose();
});
it("subscribe returns a BrokerSubscription", { timeout: 5000 }, () => {
const broker = createInMemoryWsBroker();
const sub: BrokerSubscription = broker.subscribe("x", () => undefined);
expect(sub.topic).toBe("x");
expect(typeof sub.unsubscribe).toBe("function");
sub.unsubscribe();
broker.dispose();
});
it("publish + subscribe round-trip delivers an envelope", {
timeout: 5000,
}, async () => {
const broker = createInMemoryWsBroker<{ ok: true }>({
deliveryMode: "await-all",
});
let delivered: BrokerEnvelope<{ ok: true }> | null = null;
broker.subscribe("orders", (e) => {
delivered = e;
});
await broker.publish("orders", {
topic: "orders",
tenant: "t" as unknown as TenantId,
payload: { ok: true },
});
expect(delivered).not.toBeNull();
expect(delivered?.payload.ok).toBe(true);
broker.dispose();
});
it("dispose is mandatory and idempotent", { timeout: 5000 }, () => {
const broker = createInMemoryWsBroker();
broker.dispose();
broker.dispose();
});
});