diff --git a/apps/webapp/app/platform/zodWorker.server.ts b/apps/webapp/app/platform/zodWorker.server.ts index a32bd3020..b88520a58 100644 --- a/apps/webapp/app/platform/zodWorker.server.ts +++ b/apps/webapp/app/platform/zodWorker.server.ts @@ -14,6 +14,7 @@ import { run as graphileRun, parseCronItems } from "graphile-worker"; import omit from "lodash.omit"; import { z } from "zod"; import { PrismaClient, PrismaClientOrTransaction } from "~/db.server"; +import { PgListenService } from "~/services/db/pgListen.server"; import { workerLogger as logger, trace } from "~/services/logger.server"; export interface MessageCatalogSchema { @@ -175,6 +176,21 @@ export class ZodWorker { this.#runner?.events.on("pool:listen:success", async ({ workerPool, client }) => { this.#logDebug("pool:listen:success"); + + // hijack client instance to listen and react to incoming NOTIFY events + const pgListen = new PgListenService(client, this.#name, logger); + + await pgListen.on("trigger:graphile:migrate", async ({ latestMigration }) => { + this.#logDebug("Detected incoming migration", { latestMigration }); + + if (latestMigration > 10) { + // already migrated past v0.14 - nothing to do + return; + } + + // simulate SIGTERM to trigger graceful shutdown + this._handleSignal("SIGTERM"); + }); }); this.#runner?.events.on("pool:listen:error", ({ error }) => {