diff --git a/src/installer-message.ts b/src/installer-message.ts index 3e01b2e..d038d0c 100644 --- a/src/installer-message.ts +++ b/src/installer-message.ts @@ -31,7 +31,7 @@ export const isEmptyDeveloperSlotMessage = (message: string): boolean => export const isDeleteSuccess = (message: string): boolean => isRecognizedInstallerMessage(message) && - (/\b(?:uninstall|delete|remove|deletion)\b.*\bsuccess(?:ful)?\b/i.test(message) || + (/\b(?:uninstall|delete|remove|deletion)\b.*\b(?:success(?:ful)?|succeeded)\b/i.test(message) || isEmptyDeveloperSlotMessage(message)); const isRecognizedInstallerMessage = (message: string): boolean => diff --git a/test/roku-capture.test.ts b/test/roku-capture.test.ts index 79dca0f..e5374ad 100644 --- a/test/roku-capture.test.ts +++ b/test/roku-capture.test.ts @@ -125,6 +125,25 @@ describe("Roku retry helpers", () => { expect(init.body.get("archive")).toBe(""); }); + it("accepts Roku's Delete Succeeded response", async () => { + const fetchMock = vi + .fn() + .mockResolvedValueOnce( + new Response("", { + headers: { + "WWW-Authenticate": 'Digest qop="auth", realm="rokudev", nonce="nonce"', + }, + status: 401, + }), + ) + .mockResolvedValueOnce(new Response('Delete Succeeded.')); + vi.stubGlobal("fetch", fetchMock); + + await expect(deleteInstalledChannel({ ...context, password: "pass" })).resolves.toBe( + "Delete Succeeded.", + ); + }); + it("supports qop-less Digest installer challenges", async () => { const fetchMock = vi .fn()