mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-10 04:52:43 +00:00
refactor: unify message hook mapping and async dispatch
This commit is contained in:
154
src/hooks/message-hook-mappers.test.ts
Normal file
154
src/hooks/message-hook-mappers.test.ts
Normal file
@@ -0,0 +1,154 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import type { FinalizedMsgContext } from "../auto-reply/templating.js";
|
||||
import type { OpenClawConfig } from "../config/config.js";
|
||||
import {
|
||||
buildCanonicalSentMessageHookContext,
|
||||
deriveInboundMessageHookContext,
|
||||
toInternalMessagePreprocessedContext,
|
||||
toInternalMessageReceivedContext,
|
||||
toInternalMessageSentContext,
|
||||
toInternalMessageTranscribedContext,
|
||||
toPluginMessageContext,
|
||||
toPluginMessageReceivedEvent,
|
||||
toPluginMessageSentEvent,
|
||||
} from "./message-hook-mappers.js";
|
||||
|
||||
function makeInboundCtx(overrides: Partial<FinalizedMsgContext> = {}): FinalizedMsgContext {
|
||||
return {
|
||||
From: "telegram:user:123",
|
||||
To: "telegram:chat:456",
|
||||
Body: "body",
|
||||
BodyForAgent: "body-for-agent",
|
||||
BodyForCommands: "commands-body",
|
||||
RawBody: "raw-body",
|
||||
Transcript: "hello transcript",
|
||||
Timestamp: 1710000000,
|
||||
Provider: "telegram",
|
||||
Surface: "telegram",
|
||||
OriginatingChannel: "telegram",
|
||||
OriginatingTo: "telegram:chat:456",
|
||||
AccountId: "acc-1",
|
||||
MessageSid: "msg-1",
|
||||
SenderId: "sender-1",
|
||||
SenderName: "User One",
|
||||
SenderUsername: "userone",
|
||||
SenderE164: "+15551234567",
|
||||
MessageThreadId: 42,
|
||||
MediaPath: "/tmp/audio.ogg",
|
||||
MediaType: "audio/ogg",
|
||||
GroupSubject: "ops",
|
||||
GroupChannel: "ops-room",
|
||||
GroupSpace: "guild-1",
|
||||
...overrides,
|
||||
} as FinalizedMsgContext;
|
||||
}
|
||||
|
||||
describe("message hook mappers", () => {
|
||||
it("derives canonical inbound context with body precedence and group metadata", () => {
|
||||
const canonical = deriveInboundMessageHookContext(makeInboundCtx());
|
||||
|
||||
expect(canonical.content).toBe("commands-body");
|
||||
expect(canonical.channelId).toBe("telegram");
|
||||
expect(canonical.conversationId).toBe("telegram:chat:456");
|
||||
expect(canonical.messageId).toBe("msg-1");
|
||||
expect(canonical.isGroup).toBe(true);
|
||||
expect(canonical.groupId).toBe("telegram:chat:456");
|
||||
expect(canonical.guildId).toBe("guild-1");
|
||||
});
|
||||
|
||||
it("supports explicit content/messageId overrides", () => {
|
||||
const canonical = deriveInboundMessageHookContext(makeInboundCtx(), {
|
||||
content: "override-content",
|
||||
messageId: "override-msg",
|
||||
});
|
||||
|
||||
expect(canonical.content).toBe("override-content");
|
||||
expect(canonical.messageId).toBe("override-msg");
|
||||
});
|
||||
|
||||
it("maps canonical inbound context to plugin/internal received payloads", () => {
|
||||
const canonical = deriveInboundMessageHookContext(makeInboundCtx());
|
||||
|
||||
expect(toPluginMessageContext(canonical)).toEqual({
|
||||
channelId: "telegram",
|
||||
accountId: "acc-1",
|
||||
conversationId: "telegram:chat:456",
|
||||
});
|
||||
expect(toPluginMessageReceivedEvent(canonical)).toEqual({
|
||||
from: "telegram:user:123",
|
||||
content: "commands-body",
|
||||
timestamp: 1710000000,
|
||||
metadata: expect.objectContaining({
|
||||
messageId: "msg-1",
|
||||
senderName: "User One",
|
||||
threadId: 42,
|
||||
}),
|
||||
});
|
||||
expect(toInternalMessageReceivedContext(canonical)).toEqual({
|
||||
from: "telegram:user:123",
|
||||
content: "commands-body",
|
||||
timestamp: 1710000000,
|
||||
channelId: "telegram",
|
||||
accountId: "acc-1",
|
||||
conversationId: "telegram:chat:456",
|
||||
messageId: "msg-1",
|
||||
metadata: expect.objectContaining({
|
||||
senderUsername: "userone",
|
||||
senderE164: "+15551234567",
|
||||
}),
|
||||
});
|
||||
});
|
||||
|
||||
it("maps transcribed and preprocessed internal payloads", () => {
|
||||
const cfg = {} as OpenClawConfig;
|
||||
const canonical = deriveInboundMessageHookContext(makeInboundCtx({ Transcript: undefined }));
|
||||
|
||||
const transcribed = toInternalMessageTranscribedContext(canonical, cfg);
|
||||
expect(transcribed.transcript).toBe("");
|
||||
expect(transcribed.cfg).toBe(cfg);
|
||||
|
||||
const preprocessed = toInternalMessagePreprocessedContext(canonical, cfg);
|
||||
expect(preprocessed.transcript).toBeUndefined();
|
||||
expect(preprocessed.isGroup).toBe(true);
|
||||
expect(preprocessed.groupId).toBe("telegram:chat:456");
|
||||
expect(preprocessed.cfg).toBe(cfg);
|
||||
});
|
||||
|
||||
it("maps sent context consistently for plugin/internal hooks", () => {
|
||||
const canonical = buildCanonicalSentMessageHookContext({
|
||||
to: "telegram:chat:456",
|
||||
content: "reply",
|
||||
success: false,
|
||||
error: "network error",
|
||||
channelId: "telegram",
|
||||
accountId: "acc-1",
|
||||
messageId: "out-1",
|
||||
isGroup: true,
|
||||
groupId: "telegram:chat:456",
|
||||
});
|
||||
|
||||
expect(toPluginMessageContext(canonical)).toEqual({
|
||||
channelId: "telegram",
|
||||
accountId: "acc-1",
|
||||
conversationId: "telegram:chat:456",
|
||||
});
|
||||
expect(toPluginMessageSentEvent(canonical)).toEqual({
|
||||
to: "telegram:chat:456",
|
||||
content: "reply",
|
||||
success: false,
|
||||
error: "network error",
|
||||
});
|
||||
expect(toInternalMessageSentContext(canonical)).toEqual({
|
||||
to: "telegram:chat:456",
|
||||
content: "reply",
|
||||
success: false,
|
||||
error: "network error",
|
||||
channelId: "telegram",
|
||||
accountId: "acc-1",
|
||||
conversationId: "telegram:chat:456",
|
||||
messageId: "out-1",
|
||||
isGroup: true,
|
||||
groupId: "telegram:chat:456",
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user