expo-geofencing
Version:
Production-ready geofencing and activity recognition for Expo React Native with offline support, security features, and enterprise-grade reliability
116 lines (115 loc) • 3.79 kB
TypeScript
import { GeofenceEvent, ActivityRecognitionResult, HealthAlert } from './index';
export interface WebhookConfig {
id: string;
name: string;
url: string;
method: 'POST' | 'PUT' | 'PATCH';
headers: Record<string, string>;
events: WebhookEventType[];
isActive: boolean;
retryConfig: {
maxRetries: number;
backoffStrategy: 'linear' | 'exponential';
baseDelay: number;
maxDelay: number;
};
filterConfig?: {
regions?: string[];
activities?: string[];
severities?: string[];
conditions?: Record<string, any>;
};
authConfig?: {
type: 'none' | 'bearer' | 'api_key' | 'basic' | 'custom';
credentials: Record<string, string>;
};
timeout: number;
rateLimit?: {
maxRequests: number;
windowMs: number;
};
metadata?: Record<string, any>;
}
export type WebhookEventType = 'geofence.enter' | 'geofence.exit' | 'activity.change' | 'health.alert' | 'system.status' | 'location.update';
export interface WebhookPayload {
event: WebhookEventType;
timestamp: number;
webhookId: string;
data: any;
metadata?: Record<string, any>;
signature?: string;
}
export interface WebhookDeliveryAttempt {
id: string;
webhookId: string;
payload: WebhookPayload;
attempt: number;
timestamp: number;
status: 'pending' | 'success' | 'failed' | 'retrying';
responseStatus?: number;
responseBody?: string;
error?: string;
nextRetryAt?: number;
}
export interface WebhookStats {
webhookId: string;
totalAttempts: number;
successfulDeliveries: number;
failedDeliveries: number;
averageResponseTime: number;
lastDeliveryAt?: number;
lastSuccessAt?: number;
lastFailureAt?: number;
errorRate: number;
}
export declare class WebhookManager {
private webhooks;
private deliveryQueue;
private stats;
private rateLimitTracking;
private isProcessing;
private processingInterval?;
private secretKey;
constructor(secretKey?: string);
addWebhook(config: Omit<WebhookConfig, 'id'>): string;
removeWebhook(webhookId: string): boolean;
updateWebhook(webhookId: string, updates: Partial<WebhookConfig>): boolean;
getWebhook(webhookId: string): WebhookConfig | undefined;
getAllWebhooks(): WebhookConfig[];
getActiveWebhooks(): WebhookConfig[];
triggerGeofenceEvent(event: GeofenceEvent): Promise<void>;
triggerActivityEvent(event: ActivityRecognitionResult): Promise<void>;
triggerHealthAlert(alert: HealthAlert): Promise<void>;
triggerLocationUpdate(location: any): Promise<void>;
triggerSystemStatus(status: any): Promise<void>;
private triggerWebhooks;
private getWebhooksForEvent;
private applyFilters;
private queueDelivery;
private processDeliveryQueue;
private attemptDelivery;
private makeHttpRequest;
private addAuthHeaders;
private checkRateLimit;
private initializeStats;
private updateStats;
getWebhookStats(webhookId: string): WebhookStats | undefined;
getAllWebhookStats(): WebhookStats[];
private calculateNextRetryTime;
private generateSignature;
verifySignature(payload: string, signature: string): boolean;
private hmacSha256;
private startProcessing;
stopProcessing(): void;
retryFailedDeliveries(webhookId?: string): Promise<number>;
getPendingDeliveries(webhookId?: string): WebhookDeliveryAttempt[];
getDeliveryHistory(webhookId: string, limit?: number): WebhookDeliveryAttempt[];
testWebhook(webhookId: string): Promise<{
success: boolean;
responseTime: number;
error?: string;
}>;
private generateId;
private generateSecretKey;
cleanup(): void;
}