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

/**
* 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;