notification-kit
Version:
A unified notification library for React + Capacitor apps. One API for push notifications, in-app notifications, and local notifications across Web, iOS, and Android.
215 lines • 6.22 kB
TypeScript
import { PushNotificationPayload } from './notification';
import { PermissionStatus } from './permissions';
export interface NotificationProvider {
readonly name: string;
readonly type: 'firebase' | 'onesignal';
init(config: ProviderConfig): Promise<void>;
destroy(): Promise<void>;
requestPermission(): Promise<boolean>;
checkPermission(): Promise<PermissionStatus>;
getToken(): Promise<string>;
refreshToken(): Promise<string>;
deleteToken(): Promise<void>;
subscribe(topic: string): Promise<void>;
unsubscribe(topic: string): Promise<void>;
getSubscriptions(): Promise<string[]>;
sendNotification(payload: PushNotificationPayload): Promise<void>;
onMessage(callback: (payload: PushNotificationPayload) => void): () => void;
onTokenRefresh(callback: (token: string) => void): () => void;
onError(callback: (error: Error) => void): () => void;
isSupported(): Promise<boolean>;
getCapabilities(): Promise<ProviderCapabilities>;
}
export type ProviderConfig = FirebaseConfig | OneSignalConfig;
export interface FirebaseConfig {
apiKey: string;
authDomain: string;
projectId: string;
storageBucket: string;
messagingSenderId: string;
appId: string;
measurementId?: string;
vapidKey?: string;
serviceAccount?: FirebaseServiceAccount;
databaseURL?: string;
functionsURL?: string;
messagingOptions?: FirebaseMessagingOptions;
}
export interface FirebaseServiceAccount {
type: string;
project_id: string;
private_key_id: string;
private_key: string;
client_email: string;
client_id: string;
auth_uri: string;
token_uri: string;
auth_provider_x509_cert_url: string;
client_x509_cert_url: string;
}
export interface FirebaseMessagingOptions {
vapidKey?: string;
serviceWorkerRegistration?: ServiceWorkerRegistration;
usePublicVapidKey?: boolean;
experimentalUseMessagingInSw?: boolean;
}
export interface OneSignalConfig {
appId: string;
apiKey?: string;
restApiKey?: string;
userAuthKey?: string;
safariWebId?: string;
autoPrompt?: boolean;
autoResubscribe?: boolean;
path?: string;
serviceWorkerPath?: string;
serviceWorkerUpdaterPath?: string;
promptOptions?: OneSignalPromptOptions;
welcomeNotification?: OneSignalWelcomeNotification;
notificationClickHandlerMatch?: 'origin' | 'exact';
notificationClickHandlerAction?: 'focus' | 'navigate' | 'focusOrNavigate';
allowLocalhostAsSecureOrigin?: boolean;
}
export interface OneSignalPromptOptions {
slidedown?: OneSignalSlidedownOptions;
fullscreen?: OneSignalFullscreenOptions;
autoPrompt?: boolean;
customPrompt?: boolean;
delay?: number;
force?: boolean;
}
export interface OneSignalSlidedownOptions {
enabled?: boolean;
actionMessage?: string;
acceptButtonText?: string;
cancelButtonText?: string;
categoryOptions?: OneSignalCategoryOptions[];
}
export interface OneSignalFullscreenOptions {
enabled?: boolean;
title?: string;
message?: string;
acceptButtonText?: string;
cancelButtonText?: string;
actionMessage?: string;
}
export interface OneSignalCategoryOptions {
tag: string;
label: string;
checked?: boolean;
}
export interface OneSignalWelcomeNotification {
disable?: boolean;
title?: string;
message?: string;
url?: string;
}
export interface ProviderCapabilities {
pushNotifications: boolean;
topics: boolean;
richMedia: boolean;
actions: boolean;
backgroundSync: boolean;
analytics: boolean;
segmentation: boolean;
scheduling: boolean;
geofencing: boolean;
inAppMessages: boolean;
webPush: boolean;
badges: boolean;
sounds: boolean;
vibration: boolean;
lights: boolean;
bigText: boolean;
bigPicture: boolean;
inbox: boolean;
progress: boolean;
channels: boolean;
groups: boolean;
categories: boolean;
quietHours: boolean;
deliveryReceipts: boolean;
clickTracking: boolean;
impressionTracking: boolean;
customData: boolean;
multipleDevices: boolean;
userTags: boolean;
triggers: boolean;
templates: boolean;
abTesting: boolean;
automation: boolean;
journeys: boolean;
realTimeUpdates: boolean;
}
export interface ProviderStatistics {
totalNotifications: number;
deliveredNotifications: number;
openedNotifications: number;
clickedNotifications: number;
subscribedUsers: number;
unsubscribedUsers: number;
activeUsers: number;
deliveryRate: number;
openRate: number;
clickRate: number;
unsubscribeRate: number;
}
export interface ProviderHealth {
status: 'healthy' | 'degraded' | 'unhealthy';
lastCheck: Date;
responseTime: number;
errorRate: number;
uptime: number;
issues: ProviderIssue[];
}
export interface ProviderIssue {
id: string;
severity: 'low' | 'medium' | 'high' | 'critical';
message: string;
timestamp: Date;
resolved: boolean;
resolvedAt?: Date;
}
export interface ProviderMetadata {
version: string;
platform: string;
capabilities: ProviderCapabilities;
limits: ProviderLimits;
endpoints: ProviderEndpoints;
}
export interface ProviderLimits {
maxNotificationsPerDay?: number;
maxTopicsPerUser?: number;
maxPayloadSize?: number;
maxRetryAttempts?: number;
rateLimitPerMinute?: number;
maxConcurrentConnections?: number;
}
export interface ProviderEndpoints {
api: string;
websocket?: string;
webhook?: string;
analytics?: string;
health?: string;
}
export interface ProviderAuthentication {
type: 'api_key' | 'oauth' | 'jwt' | 'service_account';
credentials: Record<string, any>;
expiresAt?: Date;
refreshToken?: string;
scopes?: string[];
}
export interface ProviderWebhook {
url: string;
events: string[];
secret?: string;
headers?: Record<string, string>;
retry?: WebhookRetryConfig;
}
export interface WebhookRetryConfig {
maxAttempts: number;
backoff: 'linear' | 'exponential';
baseDelay: number;
maxDelay: number;
}
//# sourceMappingURL=providers.d.ts.map