mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-14 10:48:34 +00:00
refactor(voice-call): extract twilio twiml policy and status mapping
This commit is contained in:
@@ -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);
|
||||
});
|
||||
});
|
||||
23
extensions/voice-call/src/providers/shared/call-status.ts
Normal file
23
extensions/voice-call/src/providers/shared/call-status.ts
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user