app.post('/process', walletMiddleware(...), payMiddleware(...), vaultMiddleware(), async (req, res) => {
const { items } = req.body;
const vault = req.vault!;
// Respond immediately — client subscribes to the stream in parallel
res.json({
vaultId: vault.id,
streamUrl: `https://api.prudra.dev/vaults/${vault.id}/events`,
});
// Run job after response
setImmediate(async () => {
await vault.emit('job.started', {
itemCount: items.length,
startedAt: new Date().toISOString(),
});
for (let i = 0; i < items.length; i++) {
await processItem(items[i]);
await vault.emit('job.progress', {
current: i + 1,
total: items.length,
percent: Math.round(((i + 1) / items.length) * 100),
item: items[i],
});
}
await vault.addDocument({ results }, 'Job results');
await vault.seal('All items processed');
});
});