/** A browser's push subscription (Web Push), as the browser hands it over. */ export interface PushSubscriptionRecord { userId: string; /** The push service URL of that browser on that device: unique. */ endpoint: string; keys: { p256dh: string; auth: string }; createdAt: string; } /** What the service worker shows: a title, a line and where a tap goes. */ export interface PushPayload { title: string; body: string; /** A path in the web app, e.g. `/p/WEB/issues/WEB-12`. */ url: string; /** Replaces an earlier notification with the same tag on the device. */ tag: string; } /** * Sends Web Push messages (VAPID). Without keys configured it is off and * nobody is offered push. */ export abstract class PushSender { /** The VAPID public key browsers subscribe with; null: push is off. */ abstract get publicKey(): string | null; /** `gone`: the browser dropped the subscription; forget it. */ abstract send( subscription: PushSubscriptionRecord, payload: PushPayload, ): Promise<'sent' | 'gone'>; }