From 4203563a9463760d03aa51aa1d0847d2d55dd771 Mon Sep 17 00:00:00 2001 From: WarrenJones <8704779+WarrenJones@users.noreply.github.com> Date: Wed, 27 May 2026 20:59:31 +0800 Subject: [PATCH] fix(hooks): pass mediaUrl/mediaUrls to plugin message_received event metadata --- src/hooks/message-hook-mappers.test.ts | 22 ++++++++++++++++++++++ src/hooks/message-hook-mappers.ts | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/hooks/message-hook-mappers.test.ts b/src/hooks/message-hook-mappers.test.ts index d4cf8f5ebf569..5281ae086e78c 100644 --- a/src/hooks/message-hook-mappers.test.ts +++ b/src/hooks/message-hook-mappers.test.ts @@ -40,6 +40,7 @@ function makeInboundCtx(overrides: Partial = {}): Finalized MessageThreadId: 42, MediaPath: "/tmp/audio.ogg", MediaType: "audio/ogg", + MediaUrl: "https://cdn.example.com/audio.ogg", GroupSubject: "ops", GroupChannel: "ops-room", GroupSpace: "guild-1", @@ -112,6 +113,8 @@ describe("message hook mappers", () => { MediaType: undefined, MediaPaths: ["/tmp/tree.jpg", "/tmp/ramp.jpg"], MediaTypes: ["image/jpeg", "image/jpeg"], + MediaUrl: "https://cdn.example.com/tree.jpg", + MediaUrls: ["https://cdn.example.com/tree.jpg", "https://cdn.example.com/ramp.jpg"], }), ); @@ -119,6 +122,11 @@ describe("message hook mappers", () => { expect(canonical.mediaType).toBe("image/jpeg"); expect(canonical.mediaPaths).toEqual(["/tmp/tree.jpg", "/tmp/ramp.jpg"]); expect(canonical.mediaTypes).toEqual(["image/jpeg", "image/jpeg"]); + expect(canonical.mediaUrl).toBe("https://cdn.example.com/tree.jpg"); + expect(canonical.mediaUrls).toEqual([ + "https://cdn.example.com/tree.jpg", + "https://cdn.example.com/ramp.jpg", + ]); expect(toPluginInboundClaimEvent(canonical)).toEqual( expect.objectContaining({ metadata: expect.objectContaining({ @@ -126,6 +134,20 @@ describe("message hook mappers", () => { mediaType: "image/jpeg", mediaPaths: ["/tmp/tree.jpg", "/tmp/ramp.jpg"], mediaTypes: ["image/jpeg", "image/jpeg"], + mediaUrl: "https://cdn.example.com/tree.jpg", + mediaUrls: ["https://cdn.example.com/tree.jpg", "https://cdn.example.com/ramp.jpg"], + }), + }), + ); + expect(toPluginMessageReceivedEvent(canonical)).toEqual( + expect.objectContaining({ + metadata: expect.objectContaining({ + mediaPath: "/tmp/tree.jpg", + mediaType: "image/jpeg", + mediaPaths: ["/tmp/tree.jpg", "/tmp/ramp.jpg"], + mediaTypes: ["image/jpeg", "image/jpeg"], + mediaUrl: "https://cdn.example.com/tree.jpg", + mediaUrls: ["https://cdn.example.com/tree.jpg", "https://cdn.example.com/ramp.jpg"], }), }), ); diff --git a/src/hooks/message-hook-mappers.ts b/src/hooks/message-hook-mappers.ts index f0d07cfa22511..7e245cabccc30 100644 --- a/src/hooks/message-hook-mappers.ts +++ b/src/hooks/message-hook-mappers.ts @@ -42,6 +42,8 @@ export type CanonicalInboundMessageHookContext = { mediaType?: string; mediaPaths?: string[]; mediaTypes?: string[]; + mediaUrl?: string; + mediaUrls?: string[]; originatingChannel?: string; originatingTo?: string; guildId?: string; @@ -94,6 +96,12 @@ export function deriveInboundMessageHookContext( (value): value is string => typeof value === "string" && value.length > 0, ) : undefined; + const mediaUrl = ctx.MediaUrl; + const mediaUrls = Array.isArray(ctx.MediaUrls) + ? ctx.MediaUrls.filter( + (value): value is string => typeof value === "string" && value.length > 0, + ) + : undefined; return { from: ctx.From ?? "", to: ctx.To, @@ -125,6 +133,8 @@ export function deriveInboundMessageHookContext( mediaType: ctx.MediaType ?? mediaTypes?.[0], mediaPaths, mediaTypes, + mediaUrl, + mediaUrls, originatingChannel: ctx.OriginatingChannel, originatingTo: ctx.OriginatingTo, guildId: ctx.GroupSpace, @@ -263,6 +273,8 @@ export function toPluginInboundClaimEvent( mediaType: canonical.mediaType, mediaPaths: canonical.mediaPaths, mediaTypes: canonical.mediaTypes, + mediaUrl: canonical.mediaUrl, + mediaUrls: canonical.mediaUrls, guildId: canonical.guildId, channelName: canonical.channelName, groupId: canonical.groupId, @@ -289,6 +301,12 @@ export function toPluginMessageReceivedEvent( senderName: canonical.senderName, senderUsername: canonical.senderUsername, senderE164: canonical.senderE164, + mediaPath: canonical.mediaPath, + mediaType: canonical.mediaType, + mediaPaths: canonical.mediaPaths, + mediaTypes: canonical.mediaTypes, + mediaUrl: canonical.mediaUrl, + mediaUrls: canonical.mediaUrls, guildId: canonical.guildId, channelName: canonical.channelName, },