fix: strip trailing punctuation from MEDIA tokens and add tests
This commit is contained in:
@@ -223,6 +223,31 @@ describe("config and templating", () => {
|
||||
expect(result?.mediaUrl).toBe("/tmp/pic.png");
|
||||
});
|
||||
|
||||
it("captures MEDIA token with trailing JSON characters", async () => {
|
||||
const runSpy = vi.spyOn(index, "runCommandWithTimeout").mockResolvedValue({
|
||||
stdout: 'MEDIA:/tmp/pic.png"} trailing',
|
||||
stderr: "",
|
||||
code: 0,
|
||||
signal: null,
|
||||
killed: false,
|
||||
});
|
||||
const cfg = {
|
||||
inbound: {
|
||||
reply: {
|
||||
mode: "command" as const,
|
||||
command: ["echo", "{{Body}}"],
|
||||
},
|
||||
},
|
||||
};
|
||||
const result = await index.getReplyFromConfig(
|
||||
{ Body: "hi", From: "+1", To: "+2" },
|
||||
undefined,
|
||||
cfg,
|
||||
runSpy,
|
||||
);
|
||||
expect(result?.mediaUrl).toBe("/tmp/pic.png");
|
||||
});
|
||||
|
||||
it("ignores invalid MEDIA lines with whitespace", async () => {
|
||||
const runSpy = vi.spyOn(index, "runCommandWithTimeout").mockResolvedValue({
|
||||
stdout: "hello\nMEDIA: not a url with spaces\nrest\n",
|
||||
|
||||
@@ -17,15 +17,21 @@ export function splitMediaFromOutput(raw: string): {
|
||||
let text = trimmedRaw;
|
||||
let mediaUrl: string | undefined;
|
||||
|
||||
const mediaLine = trimmedRaw.split("\n").find((line) => MEDIA_LINE_RE.test(line));
|
||||
if (!mediaLine) {
|
||||
let mediaLine = trimmedRaw.split("\n").find((line) => MEDIA_LINE_RE.test(line));
|
||||
let mediaMatch = mediaLine?.match(MEDIA_TOKEN_RE) ?? trimmedRaw.match(MEDIA_TOKEN_RE);
|
||||
if (!mediaMatch) {
|
||||
return { text: trimmedRaw };
|
||||
}
|
||||
if (!mediaLine && mediaMatch) {
|
||||
mediaLine = mediaMatch[0];
|
||||
}
|
||||
|
||||
let isValidMedia = false;
|
||||
const mediaMatch = mediaLine.match(MEDIA_TOKEN_RE);
|
||||
if (mediaMatch?.[1]) {
|
||||
const candidate = normalizeMediaSource(mediaMatch[1]);
|
||||
const cleaned = mediaMatch[1]
|
||||
.replace(/^[`"'[{(]+/, "")
|
||||
.replace(/[`"'\\})\],]+$/, "");
|
||||
const candidate = normalizeMediaSource(cleaned);
|
||||
const looksLikeUrl = /^https?:\/\//i.test(candidate);
|
||||
const looksLikePath = candidate.startsWith("/") || candidate.startsWith("./");
|
||||
const hasWhitespace = /\s/.test(candidate);
|
||||
|
||||
Reference in New Issue
Block a user