You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							274 lines
						
					
					
						
							8.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							274 lines
						
					
					
						
							8.2 KiB
						
					
					
				
								/**
							 | 
						|
								 * TimeSafari Integration Example
							 | 
						|
								 * 
							 | 
						|
								 * Demonstrates how to integrate the Daily Notification Plugin with TimeSafari's
							 | 
						|
								 * privacy-preserving claims architecture, community features, and storage patterns.
							 | 
						|
								 * 
							 | 
						|
								 * @author Matthew Raymer
							 | 
						|
								 * @version 1.0.0
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								import { 
							 | 
						|
								  DailyNotification,
							 | 
						|
								  TimeSafariIntegrationService,
							 | 
						|
								  TimeSafariStorageAdapterImpl,
							 | 
						|
								  TimeSafariCommunityIntegrationService,
							 | 
						|
								  StorageFactory,
							 | 
						|
								  TimeSafariIntegrationConfig,
							 | 
						|
								  CommunityIntegrationConfig
							 | 
						|
								} from '@timesafari/daily-notification-plugin';
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * TimeSafari Integration Example
							 | 
						|
								 * 
							 | 
						|
								 * This example shows how to integrate the plugin with TimeSafari's architecture:
							 | 
						|
								 * - Privacy-preserving claims with DIDs
							 | 
						|
								 * - Community features with rate limiting
							 | 
						|
								 * - Storage adapter pattern
							 | 
						|
								 * - Observability and monitoring
							 | 
						|
								 */
							 | 
						|
								export class TimeSafariIntegrationExample {
							 | 
						|
								  private integrationService: TimeSafariIntegrationService;
							 | 
						|
								  private communityService: TimeSafariCommunityIntegrationService;
							 | 
						|
								  private storageAdapter: TimeSafariStorageAdapterImpl;
							 | 
						|
								
							 | 
						|
								  constructor() {
							 | 
						|
								    this.integrationService = TimeSafariIntegrationService.getInstance();
							 | 
						|
								    this.communityService = TimeSafariCommunityIntegrationService.getInstance();
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Initialize TimeSafari integration
							 | 
						|
								   */
							 | 
						|
								  async initialize(): Promise<void> {
							 | 
						|
								    try {
							 | 
						|
								      // Initializing TimeSafari integration...
							 | 
						|
								
							 | 
						|
								      // Create storage adapter
							 | 
						|
								      const storage = StorageFactory.createStorage('android');
							 | 
						|
								      this.storageAdapter = new TimeSafariStorageAdapterImpl(storage, 'timesafari_notifications');
							 | 
						|
								
							 | 
						|
								      // Initialize TimeSafari integration service
							 | 
						|
								      const integrationConfig: TimeSafariIntegrationConfig = {
							 | 
						|
								        activeDid: 'did:example:timesafari-user-123',
							 | 
						|
								        storageAdapter: this.storageAdapter,
							 | 
						|
								        endorserApiBaseUrl: 'https://endorser.ch/api/v1'
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      await this.integrationService.initialize(integrationConfig);
							 | 
						|
								
							 | 
						|
								      // Initialize community integration service
							 | 
						|
								      const communityConfig: CommunityIntegrationConfig = {
							 | 
						|
								        maxRequestsPerMinute: 30,
							 | 
						|
								        maxRequestsPerHour: 1000,
							 | 
						|
								        burstLimit: 10,
							 | 
						|
								        initialBackoffMs: 1000,
							 | 
						|
								        maxBackoffMs: 30000,
							 | 
						|
								        backoffMultiplier: 2,
							 | 
						|
								        jitterEnabled: true,
							 | 
						|
								        basePollingIntervalMs: 300000, // 5 minutes
							 | 
						|
								        maxPollingIntervalMs: 1800000, // 30 minutes
							 | 
						|
								        adaptivePolling: true
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      await this.communityService.initialize(communityConfig);
							 | 
						|
								
							 | 
						|
								      // Log: TimeSafari integration initialized successfully
							 | 
						|
								    } catch (error) {
							 | 
						|
								      throw new Error(`Initialization failed: ${error}`);
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Schedule TimeSafari daily notifications
							 | 
						|
								   */
							 | 
						|
								  async scheduleTimeSafariNotifications(): Promise<void> {
							 | 
						|
								    try {
							 | 
						|
								      // Log: Scheduling TimeSafari daily notifications
							 | 
						|
								
							 | 
						|
								      // Schedule content fetch for community data
							 | 
						|
								      await DailyNotification.scheduleContentFetch({
							 | 
						|
								        schedule: '0 8 * * *', // 8 AM daily
							 | 
						|
								        ttlSeconds: 3600, // 1 hour TTL
							 | 
						|
								        source: 'timesafari_community',
							 | 
						|
								        url: 'https://endorser.ch/api/v1/community-updates',
							 | 
						|
								        headers: {
							 | 
						|
								          'Authorization': 'Bearer did-jwt-token',
							 | 
						|
								          'Content-Type': 'application/json'
							 | 
						|
								        }
							 | 
						|
								      });
							 | 
						|
								
							 | 
						|
								      // Schedule user notification
							 | 
						|
								      await DailyNotification.scheduleUserNotification({
							 | 
						|
								        schedule: '0 9 * * *', // 9 AM daily
							 | 
						|
								        title: 'TimeSafari Community Update',
							 | 
						|
								        body: 'New offers and project updates available',
							 | 
						|
								        actions: [
							 | 
						|
								          { id: 'view_offers', title: 'View Offers' },
							 | 
						|
								          { id: 'view_projects', title: 'View Projects' },
							 | 
						|
								          { id: 'dismiss', title: 'Dismiss' }
							 | 
						|
								        ]
							 | 
						|
								      });
							 | 
						|
								
							 | 
						|
								      // Register callback for analytics
							 | 
						|
								      await DailyNotification.registerCallback('timesafari_analytics', {
							 | 
						|
								        kind: 'http',
							 | 
						|
								        target: 'https://analytics.timesafari.com/events',
							 | 
						|
								        headers: {
							 | 
						|
								          'Authorization': 'Bearer analytics-token',
							 | 
						|
								          'Content-Type': 'application/json'
							 | 
						|
								        }
							 | 
						|
								      });
							 | 
						|
								
							 | 
						|
								      // Log: TimeSafari notifications scheduled successfully
							 | 
						|
								    } catch (error) {
							 | 
						|
								      throw new Error(`Failed to schedule notifications: ${error}`);
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Fetch community data with rate limiting
							 | 
						|
								   */
							 | 
						|
								  async fetchCommunityData(): Promise<void> {
							 | 
						|
								    try {
							 | 
						|
								      // Log: Fetching community data
							 | 
						|
								
							 | 
						|
								      const userConfig = {
							 | 
						|
								        activeDid: 'did:example:timesafari-user-123',
							 | 
						|
								        fetchOffersToPerson: true,
							 | 
						|
								        fetchOffersToProjects: true,
							 | 
						|
								        fetchProjectUpdates: true,
							 | 
						|
								        starredPlanIds: ['plan-1', 'plan-2', 'plan-3']
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      const bundle = await this.communityService.fetchCommunityDataWithRateLimit(userConfig);
							 | 
						|
								      
							 | 
						|
								      // Log: Community data fetched with success: bundle.success
							 | 
						|
								
							 | 
						|
								      // Store in TimeSafari storage
							 | 
						|
								      await this.storageAdapter.store('community_data', bundle, 3600); // 1 hour TTL
							 | 
						|
								
							 | 
						|
								    } catch (error) {
							 | 
						|
								      throw new Error(`Failed to fetch community data: ${error}`);
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Demonstrate DID-signed payloads
							 | 
						|
								   */
							 | 
						|
								  async demonstrateDidPayloads(): Promise<void> {
							 | 
						|
								    try {
							 | 
						|
								      // Log: Demonstrating DID-signed payloads
							 | 
						|
								
							 | 
						|
								      const samplePayloads = this.integrationService.generateSampleDidPayloads();
							 | 
						|
								      
							 | 
						|
								      for (const payload of samplePayloads) {
							 | 
						|
								        // Log: Sample payload type: payload.type
							 | 
						|
								
							 | 
						|
								        // Verify signature (placeholder)
							 | 
						|
								        await this.integrationService.verifyDidSignature(
							 | 
						|
								          JSON.stringify(payload.payload),
							 | 
						|
								          payload.signature
							 | 
						|
								        );
							 | 
						|
								        
							 | 
						|
								        // Log: Signature verification completed
							 | 
						|
								      }
							 | 
						|
								
							 | 
						|
								    } catch (error) {
							 | 
						|
								      throw new Error(`Failed to demonstrate DID payloads: ${error}`);
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Demonstrate data retention and redaction
							 | 
						|
								   */
							 | 
						|
								  async demonstrateDataRetention(): Promise<void> {
							 | 
						|
								    try {
							 | 
						|
								      // Log: Demonstrating data retention and redaction
							 | 
						|
								
							 | 
						|
								      this.integrationService.getDataRetentionPolicy();
							 | 
						|
								      
							 | 
						|
								      // Log: Data retention policy configured
							 | 
						|
								
							 | 
						|
								      // Store sample data with different retention policies
							 | 
						|
								      await this.storageAdapter.store('session_data', { activeDid: 'did:example:123' }, 3600);
							 | 
						|
								      await this.storageAdapter.store('notification_content', { title: 'Test', body: 'Test' }, 604800); // 7 days
							 | 
						|
								      await this.storageAdapter.store('callback_events', { event: 'delivered' }, 2592000); // 30 days
							 | 
						|
								      await this.storageAdapter.store('performance_metrics', { latency: 100 }, 7776000); // 90 days
							 | 
						|
								
							 | 
						|
								      // Get storage statistics
							 | 
						|
								      await this.storageAdapter.getStats();
							 | 
						|
								      // Log: Storage statistics available
							 | 
						|
								
							 | 
						|
								    } catch (error) {
							 | 
						|
								      throw new Error(`Failed to demonstrate data retention: ${error}`);
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Monitor rate limiting and backoff
							 | 
						|
								   */
							 | 
						|
								  async monitorRateLimiting(): Promise<void> {
							 | 
						|
								    try {
							 | 
						|
								      // Log: Monitoring rate limiting and backoff
							 | 
						|
								
							 | 
						|
								      // Get current status
							 | 
						|
								      this.communityService.getRateLimitStatus();
							 | 
						|
								      this.communityService.getBackoffStatus();
							 | 
						|
								      this.communityService.getPollingStatus();
							 | 
						|
								
							 | 
						|
								      // Log: Rate limit status available
							 | 
						|
								      // Log: Backoff status available  
							 | 
						|
								      // Log: Polling status available
							 | 
						|
								
							 | 
						|
								      // Get optimized polling interval
							 | 
						|
								      this.communityService.getOptimizedPollingInterval();
							 | 
						|
								      // Log: Optimized polling interval available
							 | 
						|
								
							 | 
						|
								    } catch (error) {
							 | 
						|
								      throw new Error(`Failed to monitor rate limiting: ${error}`);
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Run complete TimeSafari integration example
							 | 
						|
								   */
							 | 
						|
								  async runExample(): Promise<void> {
							 | 
						|
								    try {
							 | 
						|
								      // Log: Running complete TimeSafari integration example
							 | 
						|
								
							 | 
						|
								      // Initialize
							 | 
						|
								      await this.initialize();
							 | 
						|
								
							 | 
						|
								      // Schedule notifications
							 | 
						|
								      await this.scheduleTimeSafariNotifications();
							 | 
						|
								
							 | 
						|
								      // Fetch community data
							 | 
						|
								      await this.fetchCommunityData();
							 | 
						|
								
							 | 
						|
								      // Demonstrate DID payloads
							 | 
						|
								      await this.demonstrateDidPayloads();
							 | 
						|
								
							 | 
						|
								      // Demonstrate data retention
							 | 
						|
								      await this.demonstrateDataRetention();
							 | 
						|
								
							 | 
						|
								      // Monitor rate limiting
							 | 
						|
								      await this.monitorRateLimiting();
							 | 
						|
								
							 | 
						|
								      // Log: Complete TimeSafari integration example finished successfully
							 | 
						|
								    } catch (error) {
							 | 
						|
								      throw new Error(`Example failed: ${error}`);
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Usage Example
							 | 
						|
								 */
							 | 
						|
								export async function runTimeSafariIntegrationExample(): Promise<void> {
							 | 
						|
								  const example = new TimeSafariIntegrationExample();
							 | 
						|
								  await example.runExample();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// Export for use in other modules
							 | 
						|
								export default TimeSafariIntegrationExample;
							 | 
						|
								
							 |