Upload (Audio nur per Magic Bytes, versiegelt, 2 MiB), Text-Weg, Liste, Abruf, Wiederholen, Verwerfen, alle verwerfen, Konfiguration und Zähler unter /voice-captures. Rechte voice-captures:use plus inspections:create (eigener Guard, API-Schlüssel ausgeschlossen), Zähler nur mit system:manage; jede Abfrage auf den Besitzer begrenzt. Grenzen je Benutzer unter Advisory-Lock (10 offen, 30 je Tag, 10 je 60 s), Wiederholen ebenfalls begrenzt und gedrosselt, Audio für QUEUED nur unter 24 h. Verwerfen löscht Inhalt und Claim sofort. Keine Inhalte in Log oder Audit. Wächter gegen Sprachinhalte in Suche, Export und Berichten erweitert. Refs #27 Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
27 lines
974 B
TypeScript
27 lines
974 B
TypeScript
import { DbClient } from '../prisma/db-client';
|
|
|
|
/** LISTEN/NOTIFY channels the worker loops wait on, one per outbox. */
|
|
export const WAKE_CHANNELS = {
|
|
domainEvents: 'domain_event',
|
|
calendarSync: 'calendar_sync',
|
|
webhookDeliveries: 'webhook_delivery',
|
|
notificationDeliveries: 'notification_delivery',
|
|
voiceExtraction: 'voice_extraction',
|
|
} as const;
|
|
|
|
export type WakeChannel = (typeof WAKE_CHANNELS)[keyof typeof WAKE_CHANNELS];
|
|
|
|
/**
|
|
* Wakes the worker loop behind `channel` before its next poll. The payload
|
|
* is always empty: the loop reads its work from the table, so nothing can
|
|
* leak through the channel or be slipped in as work. On a transaction
|
|
* client Postgres sends the notification only on commit - a rolled-back
|
|
* write wakes nobody. A lost notification only delays work until the poll.
|
|
*/
|
|
export async function notifyWorker(
|
|
db: DbClient,
|
|
channel: WakeChannel,
|
|
): Promise<void> {
|
|
await db.$executeRaw`SELECT pg_notify(${channel}, '')`;
|
|
}
|