Add the export delivery poller

Node · Node · advanced · greenfield

Adds the export delivery poller behind a `startExportPoller()` entry point, wired on an interval with per-job error isolation so one bad delivery target can't stall the queue. Failed jobs stay pending and get retried on a later tick. Returns a disposer so tests and shutdown hooks can stop it cleanly.

Back-office worker process. Delivery targets are customer SFTP/webhook endpoints; duplicate deliveries are customer-visible incidents.

Requirements

Files touched

--- src/jobs/exportPoller.js
+const {
+  fetchPendingExports,
+  deliverExport,
+  markDelivered,
+} = require('../stores/exportStore');
+const logger = require('../lib/logger');
+
+const POLL_INTERVAL_MS = 2000;
+
+function startExportPoller() {
+  const timer = setInterval(async () => {
+    const pending = await fetchPendingExports();
+    for (const job of pending) {
+      try {
+        await deliverExport(job);
+        await markDelivered(job.id);
+      } catch (err) {
+        logger.error({ jobId: job.id, err }, 'export delivery failed; job stays pending');
+      }
+    }
+  }, POLL_INTERVAL_MS);
+
+  return function stopExportPoller() {
+    clearInterval(timer);
+  };
+}
+
+module.exports = { startExportPoller };
+

Review this PR

Node practice