refactor(voice-call): extract twilio twiml policy and status mapping

This commit is contained in:
Peter Steinberger
2026-03-03 00:29:00 +00:00
parent 68e982ec80
commit a96b3b406a
5 changed files with 280 additions and 84 deletions

View File

@@ -0,0 +1,24 @@
import { describe, expect, it } from "vitest";
import {
isProviderStatusTerminal,
mapProviderStatusToEndReason,
normalizeProviderStatus,
} from "./call-status.js";
describe("provider call status mapping", () => {
it("normalizes missing statuses to unknown", () => {
expect(normalizeProviderStatus(undefined)).toBe("unknown");
expect(normalizeProviderStatus(" ")).toBe("unknown");
});
it("maps terminal provider statuses to end reasons", () => {
expect(mapProviderStatusToEndReason("completed")).toBe("completed");
expect(mapProviderStatusToEndReason("CANCELED")).toBe("hangup-bot");
expect(mapProviderStatusToEndReason("no-answer")).toBe("no-answer");
});
it("flags terminal provider statuses", () => {
expect(isProviderStatusTerminal("busy")).toBe(true);
expect(isProviderStatusTerminal("in-progress")).toBe(false);
});
});

View File

@@ -0,0 +1,23 @@
import type { EndReason } from "../../types.js";
const TERMINAL_PROVIDER_STATUS_TO_END_REASON: Record<string, EndReason> = {
completed: "completed",
failed: "failed",
busy: "busy",
"no-answer": "no-answer",
canceled: "hangup-bot",
};
export function normalizeProviderStatus(status: string | null | undefined): string {
const normalized = status?.trim().toLowerCase();
return normalized && normalized.length > 0 ? normalized : "unknown";
}
export function mapProviderStatusToEndReason(status: string | null | undefined): EndReason | null {
const normalized = normalizeProviderStatus(status);
return TERMINAL_PROVIDER_STATUS_TO_END_REASON[normalized] ?? null;
}
export function isProviderStatusTerminal(status: string | null | undefined): boolean {
return mapProviderStatusToEndReason(status) !== null;
}