fix: unblock discord listener concurrency
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import type { Guild } from "@buape/carbon";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import {
|
||||
allowListMatches,
|
||||
buildDiscordMediaPayload,
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
sanitizeDiscordThreadName,
|
||||
shouldEmitDiscordReactionNotification,
|
||||
} from "./monitor.js";
|
||||
import { DiscordMessageListener } from "./monitor/listeners.js";
|
||||
|
||||
const fakeGuild = (id: string, name: string) => ({ id, name }) as Guild;
|
||||
|
||||
@@ -48,6 +49,85 @@ describe("registerDiscordListener", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("DiscordMessageListener", () => {
|
||||
it("returns before the handler finishes", async () => {
|
||||
let handlerResolved = false;
|
||||
let resolveHandler: (() => void) | null = null;
|
||||
const handlerPromise = new Promise<void>((resolve) => {
|
||||
resolveHandler = () => {
|
||||
handlerResolved = true;
|
||||
resolve();
|
||||
};
|
||||
});
|
||||
const handler = vi.fn(() => handlerPromise);
|
||||
const listener = new DiscordMessageListener(handler);
|
||||
|
||||
await listener.handle(
|
||||
{} as unknown as import("./monitor/listeners.js").DiscordMessageEvent,
|
||||
{} as unknown as import("@buape/carbon").Client,
|
||||
);
|
||||
|
||||
expect(handler).toHaveBeenCalledOnce();
|
||||
expect(handlerResolved).toBe(false);
|
||||
|
||||
resolveHandler?.();
|
||||
await handlerPromise;
|
||||
});
|
||||
|
||||
it("logs handler failures", async () => {
|
||||
const logger = {
|
||||
warn: vi.fn(),
|
||||
error: vi.fn(),
|
||||
} as unknown as ReturnType<typeof import("../logging/subsystem.js").createSubsystemLogger>;
|
||||
const handler = vi.fn(async () => {
|
||||
throw new Error("boom");
|
||||
});
|
||||
const listener = new DiscordMessageListener(handler, logger);
|
||||
|
||||
await listener.handle(
|
||||
{} as unknown as import("./monitor/listeners.js").DiscordMessageEvent,
|
||||
{} as unknown as import("@buape/carbon").Client,
|
||||
);
|
||||
await new Promise((resolve) => setTimeout(resolve, 0));
|
||||
|
||||
expect(logger.error).toHaveBeenCalledWith(expect.stringContaining("discord handler failed"));
|
||||
});
|
||||
|
||||
it("logs slow handlers after the threshold", async () => {
|
||||
vi.useFakeTimers();
|
||||
vi.setSystemTime(0);
|
||||
|
||||
try {
|
||||
let resolveHandler: (() => void) | null = null;
|
||||
const handlerPromise = new Promise<void>((resolve) => {
|
||||
resolveHandler = resolve;
|
||||
});
|
||||
const handler = vi.fn(() => handlerPromise);
|
||||
const logger = {
|
||||
warn: vi.fn(),
|
||||
error: vi.fn(),
|
||||
} as unknown as ReturnType<typeof import("../logging/subsystem.js").createSubsystemLogger>;
|
||||
const listener = new DiscordMessageListener(handler, logger);
|
||||
|
||||
await listener.handle(
|
||||
{} as unknown as import("./monitor/listeners.js").DiscordMessageEvent,
|
||||
{} as unknown as import("@buape/carbon").Client,
|
||||
);
|
||||
|
||||
vi.setSystemTime(31_000);
|
||||
resolveHandler?.();
|
||||
await handlerPromise;
|
||||
await Promise.resolve();
|
||||
|
||||
expect(logger.warn).toHaveBeenCalled();
|
||||
const [, meta] = logger.warn.mock.calls[0] ?? [];
|
||||
expect(meta?.durationMs).toBeGreaterThanOrEqual(30_000);
|
||||
} finally {
|
||||
vi.useRealTimers();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("discord allowlist helpers", () => {
|
||||
it("normalizes slugs", () => {
|
||||
expect(normalizeDiscordSlug("Friends of Clawd")).toBe("friends-of-clawd");
|
||||
|
||||
Reference in New Issue
Block a user