From 38a09188ad01de5b17491ca5148f47b770473cd1 Mon Sep 17 00:00:00 2001 From: tdurieux Date: Sun, 6 Sep 2026 09:18:42 +0200 Subject: [PATCH] fix: expire conference repositories before completing expiration --- src/core/Conference.ts | 2 +- src/server/routes/conference.ts | 2 +- test/production-regressions.test.js | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/core/Conference.ts b/src/core/Conference.ts index d2f8199..9c0601d 100644 --- a/src/core/Conference.ts +++ b/src/core/Conference.ts @@ -33,10 +33,10 @@ export default class Conference { * Expire the conference */ async expire() { - await this.updateStatus("expired"); await Promise.all( (await this.repositories()).map(async (conf) => await conf.expire()) ); + await this.updateStatus("expired"); } /** diff --git a/src/server/routes/conference.ts b/src/server/routes/conference.ts index 716b50f..21c7f78 100644 --- a/src/server/routes/conference.ts +++ b/src/server/routes/conference.ts @@ -56,7 +56,7 @@ router.get("/", async (req: express.Request, res: express.Response) => { ).map(async (data) => { const conf = new Conference(data); if (data.endDate < new Date() && data.status == "ready") { - await conf.updateStatus("expired"); + await conf.expire(); } return conf; }) diff --git a/test/production-regressions.test.js b/test/production-regressions.test.js index e23f5c3..f7d9800 100644 --- a/test/production-regressions.test.js +++ b/test/production-regressions.test.js @@ -232,6 +232,15 @@ describe("production regressions", function () { expect(res.headers["Content-Security-Policy"]).to.include("sandbox"); expect(res.headers["Content-Security-Policy"]).not.to.include("allow-same-origin"); }); + it("keeps a conference eligible for retry when repository expiration fails", async function () { + const Conference = require("../src/core/Conference").default; + const model = { status: "ready", save: async () => {} }; + const conference = new Conference(model); + conference.repositories = async () => [{ expire: async () => { throw new Error("storage failed"); } }]; + try { await conference.expire(); throw new Error("expected rejection"); } + catch (error) { expect(error.message).to.equal("storage failed"); } + expect(model.status).to.equal("ready"); + }); it("omits an upstream length when later text is rewritten", async function () { const File = require("../src/core/AnonymizedFile").default; stub(config, "STREAMER_ENTRYPOINT", "");