docs: add comprehensive host request configuration guides
- Add detailed host request configuration guide with examples - Add quick reference guide for common configurations - Include TimeSafari-specific configuration patterns - Add platform-specific configuration examples (Android, iOS, Electron) - Include security, authentication, and observability configurations - Add troubleshooting and debugging guidance - Provide Vue.js integration examples These guides show how the TimeSafari PWA host should configure HTTP requests and network settings for the Daily Notification Plugin.
This commit is contained in:
741
docs/host-request-configuration.md
Normal file
741
docs/host-request-configuration.md
Normal file
@@ -0,0 +1,741 @@
|
|||||||
|
# TimeSafari Daily Notification Plugin - Host Request Configuration Guide
|
||||||
|
|
||||||
|
**Author**: Matthew Raymer
|
||||||
|
**Version**: 1.0.0
|
||||||
|
**Created**: 2025-10-08 06:24:57 UTC
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This guide explains how the TimeSafari PWA host application should configure HTTP requests and network settings for the Daily Notification Plugin. The plugin uses a **host-managed request pattern** where the host provides network configuration and the plugin handles the actual requests.
|
||||||
|
|
||||||
|
## Request Configuration Architecture
|
||||||
|
|
||||||
|
### Plugin Request Pattern
|
||||||
|
```
|
||||||
|
Host Application (TimeSafari PWA)
|
||||||
|
↓ (provides configuration)
|
||||||
|
Plugin Network Layer
|
||||||
|
↓ (executes requests)
|
||||||
|
External APIs (Endorser.ch, etc.)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Key Principles
|
||||||
|
1. **Host-Managed Configuration**: Host provides all network settings
|
||||||
|
2. **Plugin Execution**: Plugin handles actual HTTP requests
|
||||||
|
3. **Structured Logging**: All requests are logged with event IDs
|
||||||
|
4. **Circuit Breaker**: Built-in failure handling and retry logic
|
||||||
|
5. **ETag Support**: Conditional requests for efficient caching
|
||||||
|
|
||||||
|
## Host Configuration Options
|
||||||
|
|
||||||
|
### 1. Basic Network Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// In TimeSafari PWA main configuration
|
||||||
|
import { DailyNotification } from '@timesafari/daily-notification-plugin';
|
||||||
|
|
||||||
|
await DailyNotification.configure({
|
||||||
|
// Basic network settings
|
||||||
|
networkConfig: {
|
||||||
|
timeout: 30000, // 30 second timeout
|
||||||
|
retryAttempts: 3, // 3 retry attempts
|
||||||
|
retryDelay: 1000, // 1 second initial delay
|
||||||
|
maxConcurrent: 5, // Max 5 concurrent requests
|
||||||
|
userAgent: 'TimeSafari-PWA/1.0.0'
|
||||||
|
},
|
||||||
|
|
||||||
|
// Request headers
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Accept-Language': 'en-US,en;q=0.9',
|
||||||
|
'Cache-Control': 'no-cache'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. TimeSafari-Specific Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// TimeSafari Endorser.ch API configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
timesafariConfig: {
|
||||||
|
// Required: Active DID for authentication
|
||||||
|
activeDid: userDid,
|
||||||
|
|
||||||
|
// API endpoints (optional - defaults provided)
|
||||||
|
endpoints: {
|
||||||
|
offersToPerson: 'https://endorser.ch/api/v1/offers/person',
|
||||||
|
offersToPlans: 'https://endorser.ch/api/v1/offers/plans',
|
||||||
|
projectsLastUpdated: 'https://endorser.ch/api/v1/projects/last-updated'
|
||||||
|
},
|
||||||
|
|
||||||
|
// Sync configuration
|
||||||
|
syncConfig: {
|
||||||
|
enableParallel: true, // Enable parallel API requests
|
||||||
|
maxConcurrent: 3, // Max 3 concurrent requests
|
||||||
|
batchSize: 10 // Batch size for requests
|
||||||
|
},
|
||||||
|
|
||||||
|
// Credential configuration
|
||||||
|
credentialConfig: {
|
||||||
|
jwtSecret: process.env.JWT_SECRET,
|
||||||
|
tokenExpirationMinutes: 60,
|
||||||
|
refreshThresholdMinutes: 10
|
||||||
|
},
|
||||||
|
|
||||||
|
// Error handling policy
|
||||||
|
errorPolicy: {
|
||||||
|
maxRetries: 3,
|
||||||
|
backoffMultiplier: 2,
|
||||||
|
activeDidChangeRetries: 5 // Special retry for DID changes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Content Fetch Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Configure content fetching
|
||||||
|
await DailyNotification.configure({
|
||||||
|
contentFetch: {
|
||||||
|
enabled: true,
|
||||||
|
schedule: '0 8 * * *', // Daily at 8 AM
|
||||||
|
|
||||||
|
// Request configuration
|
||||||
|
url: 'https://endorser.ch/api/v1/community/updates',
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${authToken}`,
|
||||||
|
'X-User-DID': userDid,
|
||||||
|
'X-Client-Version': '1.0.0'
|
||||||
|
},
|
||||||
|
timeout: 15000,
|
||||||
|
retryAttempts: 2,
|
||||||
|
retryDelay: 2000,
|
||||||
|
|
||||||
|
// Callback configuration
|
||||||
|
callbacks: {
|
||||||
|
apiService: 'https://api.timesafari.com/notifications/callback',
|
||||||
|
database: 'local://notification-storage',
|
||||||
|
reporting: 'https://analytics.timesafari.com/events'
|
||||||
|
},
|
||||||
|
|
||||||
|
// Cache policy
|
||||||
|
cachePolicy: {
|
||||||
|
maxAge: 3600, // 1 hour cache
|
||||||
|
staleWhileRevalidate: 1800, // 30 minutes stale
|
||||||
|
etagSupport: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Platform-Specific Request Configuration
|
||||||
|
|
||||||
|
### Android Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Android-specific network configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
platform: 'android',
|
||||||
|
|
||||||
|
// Android network settings
|
||||||
|
androidConfig: {
|
||||||
|
// WorkManager constraints
|
||||||
|
workManagerConstraints: {
|
||||||
|
requiresNetworkType: 'CONNECTED',
|
||||||
|
requiresBatteryNotLow: false,
|
||||||
|
requiresCharging: false,
|
||||||
|
requiresDeviceIdle: false,
|
||||||
|
requiresStorageNotLow: false
|
||||||
|
},
|
||||||
|
|
||||||
|
// Network security
|
||||||
|
networkSecurityConfig: {
|
||||||
|
cleartextTrafficPermitted: false,
|
||||||
|
certificatePinning: true,
|
||||||
|
trustedCertificates: ['endorser.ch', 'api.timesafari.com']
|
||||||
|
},
|
||||||
|
|
||||||
|
// Request configuration
|
||||||
|
requestConfig: {
|
||||||
|
connectTimeout: 30000,
|
||||||
|
readTimeout: 30000,
|
||||||
|
writeTimeout: 30000,
|
||||||
|
followRedirects: true,
|
||||||
|
followSslRedirects: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### iOS Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// iOS-specific network configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
platform: 'ios',
|
||||||
|
|
||||||
|
// iOS network settings
|
||||||
|
iosConfig: {
|
||||||
|
// Background task configuration
|
||||||
|
backgroundTasks: {
|
||||||
|
'com.timesafari.daily-notification-fetch': {
|
||||||
|
identifier: 'com.timesafari.daily-notification-fetch',
|
||||||
|
requiresNetworkConnectivity: true,
|
||||||
|
requiresExternalPower: false,
|
||||||
|
requiresDeviceIdle: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// URL session configuration
|
||||||
|
urlSessionConfig: {
|
||||||
|
timeoutIntervalForRequest: 30,
|
||||||
|
timeoutIntervalForResource: 60,
|
||||||
|
allowsCellularAccess: true,
|
||||||
|
allowsConstrainedNetworkAccess: true,
|
||||||
|
allowsExpensiveNetworkAccess: true
|
||||||
|
},
|
||||||
|
|
||||||
|
// App transport security
|
||||||
|
atsConfig: {
|
||||||
|
allowsArbitraryLoads: false,
|
||||||
|
allowsLocalNetworking: false,
|
||||||
|
exceptionDomains: {
|
||||||
|
'endorser.ch': {
|
||||||
|
nstExceptionAllowsInsecureHTTPLoads: false,
|
||||||
|
nstExceptionMinimumTLSVersion: 'TLSv1.2'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Electron Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Electron-specific network configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
platform: 'electron',
|
||||||
|
|
||||||
|
// Electron network settings
|
||||||
|
electronConfig: {
|
||||||
|
// Session configuration
|
||||||
|
sessionConfig: {
|
||||||
|
userAgent: 'TimeSafari-Desktop/1.0.0',
|
||||||
|
acceptLanguages: ['en-US', 'en'],
|
||||||
|
cacheEnabled: true,
|
||||||
|
cacheSize: 100 * 1024 * 1024 // 100MB cache
|
||||||
|
},
|
||||||
|
|
||||||
|
// Request configuration
|
||||||
|
requestConfig: {
|
||||||
|
timeout: 30000,
|
||||||
|
maxRedirects: 5,
|
||||||
|
followRedirects: true,
|
||||||
|
validateSSL: true
|
||||||
|
},
|
||||||
|
|
||||||
|
// Proxy configuration (if needed)
|
||||||
|
proxyConfig: {
|
||||||
|
enabled: false,
|
||||||
|
type: 'http',
|
||||||
|
host: '',
|
||||||
|
port: 0,
|
||||||
|
username: '',
|
||||||
|
password: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Request Configuration
|
||||||
|
|
||||||
|
### 1. Circuit Breaker Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Circuit breaker for fault tolerance
|
||||||
|
await DailyNotification.configure({
|
||||||
|
circuitBreaker: {
|
||||||
|
failureThreshold: 5, // Open after 5 failures
|
||||||
|
recoveryTimeout: 30000, // 30 second recovery timeout
|
||||||
|
monitoringPeriod: 60000 // 1 minute monitoring period
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Rate Limiting Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Rate limiting configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
rateLimiting: {
|
||||||
|
maxRequestsPerMinute: 30,
|
||||||
|
maxRequestsPerHour: 1000,
|
||||||
|
burstLimit: 10,
|
||||||
|
backoffStrategy: 'exponential',
|
||||||
|
jitterEnabled: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Authentication Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Authentication configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
authentication: {
|
||||||
|
// JWT configuration
|
||||||
|
jwt: {
|
||||||
|
secret: process.env.JWT_SECRET,
|
||||||
|
algorithm: 'HS256',
|
||||||
|
expirationMinutes: 60,
|
||||||
|
refreshThresholdMinutes: 10
|
||||||
|
},
|
||||||
|
|
||||||
|
// API key configuration
|
||||||
|
apiKey: {
|
||||||
|
header: 'X-API-Key',
|
||||||
|
value: process.env.API_KEY
|
||||||
|
},
|
||||||
|
|
||||||
|
// OAuth configuration
|
||||||
|
oauth: {
|
||||||
|
clientId: process.env.OAUTH_CLIENT_ID,
|
||||||
|
clientSecret: process.env.OAUTH_CLIENT_SECRET,
|
||||||
|
tokenEndpoint: 'https://auth.timesafari.com/oauth/token',
|
||||||
|
scope: 'notifications:read notifications:write'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Request Monitoring and Observability
|
||||||
|
|
||||||
|
### 1. Structured Logging Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Configure structured logging
|
||||||
|
await DailyNotification.configure({
|
||||||
|
logging: {
|
||||||
|
level: 'INFO',
|
||||||
|
enableRequestLogging: true,
|
||||||
|
enableResponseLogging: true,
|
||||||
|
enableErrorLogging: true,
|
||||||
|
enablePerformanceLogging: true,
|
||||||
|
|
||||||
|
// Log formatting
|
||||||
|
logFormat: 'json',
|
||||||
|
includeHeaders: false, // Don't log sensitive headers
|
||||||
|
includeBody: false, // Don't log request/response bodies
|
||||||
|
redactSensitiveData: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Metrics Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Configure metrics collection
|
||||||
|
await DailyNotification.configure({
|
||||||
|
metrics: {
|
||||||
|
enabled: true,
|
||||||
|
collectionInterval: 60000, // 1 minute
|
||||||
|
|
||||||
|
// Metrics to collect
|
||||||
|
requestMetrics: {
|
||||||
|
count: true,
|
||||||
|
duration: true,
|
||||||
|
statusCodes: true,
|
||||||
|
errorRates: true
|
||||||
|
},
|
||||||
|
|
||||||
|
// Performance metrics
|
||||||
|
performanceMetrics: {
|
||||||
|
cacheHitRate: true,
|
||||||
|
networkLatency: true,
|
||||||
|
retryCount: true,
|
||||||
|
circuitBreakerState: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling Configuration
|
||||||
|
|
||||||
|
### 1. Retry Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Retry configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
retry: {
|
||||||
|
// Exponential backoff
|
||||||
|
strategy: 'exponential',
|
||||||
|
initialDelay: 1000, // 1 second
|
||||||
|
maxDelay: 30000, // 30 seconds
|
||||||
|
multiplier: 2,
|
||||||
|
jitter: true,
|
||||||
|
|
||||||
|
// Retry conditions
|
||||||
|
retryOn: {
|
||||||
|
networkErrors: true,
|
||||||
|
timeoutErrors: true,
|
||||||
|
serverErrors: true, // 5xx errors
|
||||||
|
clientErrors: false // Don't retry 4xx errors
|
||||||
|
},
|
||||||
|
|
||||||
|
// Max retries per request type
|
||||||
|
maxRetries: {
|
||||||
|
contentFetch: 3,
|
||||||
|
notificationDelivery: 2,
|
||||||
|
callbackDelivery: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Fallback Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Fallback configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
fallback: {
|
||||||
|
// Content fallbacks
|
||||||
|
contentFallbacks: [
|
||||||
|
{
|
||||||
|
condition: 'network_unavailable',
|
||||||
|
action: 'use_cached_content',
|
||||||
|
maxAge: 3600 // 1 hour
|
||||||
|
},
|
||||||
|
{
|
||||||
|
condition: 'api_error',
|
||||||
|
action: 'use_emergency_content',
|
||||||
|
content: {
|
||||||
|
title: 'TimeSafari Community Update',
|
||||||
|
body: 'Check back later for the latest updates!'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
// Notification fallbacks
|
||||||
|
notificationFallbacks: [
|
||||||
|
{
|
||||||
|
condition: 'permission_denied',
|
||||||
|
action: 'show_in_app_notification'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
condition: 'platform_unsupported',
|
||||||
|
action: 'log_warning'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Configuration
|
||||||
|
|
||||||
|
### 1. SSL/TLS Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// SSL/TLS configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
security: {
|
||||||
|
// Certificate pinning
|
||||||
|
certificatePinning: {
|
||||||
|
enabled: true,
|
||||||
|
pins: [
|
||||||
|
{
|
||||||
|
hostname: 'endorser.ch',
|
||||||
|
pins: [
|
||||||
|
'sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',
|
||||||
|
'sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB='
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// TLS configuration
|
||||||
|
tls: {
|
||||||
|
minVersion: '1.2',
|
||||||
|
maxVersion: '1.3',
|
||||||
|
cipherSuites: [
|
||||||
|
'TLS_AES_256_GCM_SHA384',
|
||||||
|
'TLS_CHACHA20_POLY1305_SHA256',
|
||||||
|
'TLS_AES_128_GCM_SHA256'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Data Protection Configuration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Data protection configuration
|
||||||
|
await DailyNotification.configure({
|
||||||
|
dataProtection: {
|
||||||
|
// Encryption at rest
|
||||||
|
encryption: {
|
||||||
|
enabled: true,
|
||||||
|
algorithm: 'AES-256-GCM',
|
||||||
|
keyDerivation: 'PBKDF2'
|
||||||
|
},
|
||||||
|
|
||||||
|
// Data redaction
|
||||||
|
redaction: {
|
||||||
|
enabled: true,
|
||||||
|
patterns: [
|
||||||
|
'password',
|
||||||
|
'token',
|
||||||
|
'secret',
|
||||||
|
'key',
|
||||||
|
'authorization'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// Data retention
|
||||||
|
retention: {
|
||||||
|
maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days
|
||||||
|
autoCleanup: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Integration Examples
|
||||||
|
|
||||||
|
### 1. TimeSafari PWA Integration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// In TimeSafari PWA main.ts
|
||||||
|
import { DailyNotification } from '@timesafari/daily-notification-plugin';
|
||||||
|
import { TimeSafariIntegrationService } from '@timesafari/daily-notification-plugin';
|
||||||
|
|
||||||
|
// Initialize with TimeSafari configuration
|
||||||
|
const initializeDailyNotifications = async () => {
|
||||||
|
try {
|
||||||
|
// Configure plugin with TimeSafari settings
|
||||||
|
await DailyNotification.configure({
|
||||||
|
// Basic configuration
|
||||||
|
storage: 'tiered',
|
||||||
|
ttlSeconds: 1800,
|
||||||
|
enableETagSupport: true,
|
||||||
|
|
||||||
|
// TimeSafari-specific configuration
|
||||||
|
timesafariConfig: {
|
||||||
|
activeDid: userDid,
|
||||||
|
endpoints: {
|
||||||
|
offersToPerson: 'https://endorser.ch/api/v1/offers/person',
|
||||||
|
offersToPlans: 'https://endorser.ch/api/v1/offers/plans'
|
||||||
|
},
|
||||||
|
syncConfig: {
|
||||||
|
enableParallel: true,
|
||||||
|
maxConcurrent: 3,
|
||||||
|
batchSize: 10
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Network configuration
|
||||||
|
networkConfig: {
|
||||||
|
timeout: 30000,
|
||||||
|
retryAttempts: 3,
|
||||||
|
retryDelay: 1000,
|
||||||
|
maxConcurrent: 5
|
||||||
|
},
|
||||||
|
|
||||||
|
// Authentication
|
||||||
|
authentication: {
|
||||||
|
jwt: {
|
||||||
|
secret: process.env.JWT_SECRET,
|
||||||
|
algorithm: 'HS256',
|
||||||
|
expirationMinutes: 60
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Observability
|
||||||
|
logging: {
|
||||||
|
level: 'INFO',
|
||||||
|
enableRequestLogging: true,
|
||||||
|
redactSensitiveData: true
|
||||||
|
},
|
||||||
|
|
||||||
|
// Security
|
||||||
|
security: {
|
||||||
|
certificatePinning: {
|
||||||
|
enabled: true,
|
||||||
|
pins: [
|
||||||
|
{
|
||||||
|
hostname: 'endorser.ch',
|
||||||
|
pins: ['sha256/...']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialize TimeSafari integration
|
||||||
|
const integrationService = TimeSafariIntegrationService.getInstance();
|
||||||
|
await integrationService.initialize({
|
||||||
|
activeDid: userDid,
|
||||||
|
storageAdapter: timeSafariStorageAdapter,
|
||||||
|
endorserApiBaseUrl: 'https://endorser.ch/api/v1'
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Daily notifications configured successfully');
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to configure daily notifications:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialize on app startup
|
||||||
|
initializeDailyNotifications();
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Vue.js Component Integration
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// In TimeSafari PWA Vue component
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import { DailyNotification } from '@timesafari/daily-notification-plugin';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'DailyNotificationSettings',
|
||||||
|
|
||||||
|
async mounted() {
|
||||||
|
// Configure notifications for this component
|
||||||
|
await DailyNotification.configure({
|
||||||
|
// Component-specific configuration
|
||||||
|
contentFetch: {
|
||||||
|
enabled: true,
|
||||||
|
schedule: '0 9 * * *', // 9 AM daily
|
||||||
|
url: 'https://endorser.ch/api/v1/community/updates',
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${this.authToken}`,
|
||||||
|
'X-User-DID': this.userDid
|
||||||
|
},
|
||||||
|
callbacks: {
|
||||||
|
onSuccess: async (data) => {
|
||||||
|
// Handle successful fetch
|
||||||
|
this.updateNotificationContent(data);
|
||||||
|
},
|
||||||
|
onError: async (error) => {
|
||||||
|
// Handle fetch error
|
||||||
|
this.handleNotificationError(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
async updateNotificationContent(data: Record<string, unknown>) {
|
||||||
|
// Update UI with new content
|
||||||
|
this.notificationData = data;
|
||||||
|
},
|
||||||
|
|
||||||
|
async handleNotificationError(error: Error) {
|
||||||
|
// Handle error in UI
|
||||||
|
this.showError(error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Configuration Issues
|
||||||
|
|
||||||
|
#### 1. Network Timeout Issues
|
||||||
|
```typescript
|
||||||
|
// Increase timeout for slow networks
|
||||||
|
await DailyNotification.configure({
|
||||||
|
networkConfig: {
|
||||||
|
timeout: 60000, // 60 seconds
|
||||||
|
retryAttempts: 5,
|
||||||
|
retryDelay: 2000
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Authentication Issues
|
||||||
|
```typescript
|
||||||
|
// Debug authentication
|
||||||
|
await DailyNotification.configure({
|
||||||
|
logging: {
|
||||||
|
level: 'DEBUG',
|
||||||
|
enableRequestLogging: true,
|
||||||
|
includeHeaders: true // Temporarily enable for debugging
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. Certificate Issues
|
||||||
|
```typescript
|
||||||
|
// Disable certificate pinning for development
|
||||||
|
await DailyNotification.configure({
|
||||||
|
security: {
|
||||||
|
certificatePinning: {
|
||||||
|
enabled: false // Only for development
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Debugging Request Issues
|
||||||
|
|
||||||
|
#### 1. Enable Debug Logging
|
||||||
|
```typescript
|
||||||
|
// Enable comprehensive logging
|
||||||
|
await DailyNotification.configure({
|
||||||
|
logging: {
|
||||||
|
level: 'DEBUG',
|
||||||
|
enableRequestLogging: true,
|
||||||
|
enableResponseLogging: true,
|
||||||
|
enableErrorLogging: true,
|
||||||
|
enablePerformanceLogging: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Monitor Request Metrics
|
||||||
|
```typescript
|
||||||
|
// Get request statistics
|
||||||
|
const stats = await DailyNotification.getRequestStats();
|
||||||
|
console.log('Request Statistics:', stats);
|
||||||
|
|
||||||
|
// Get error statistics
|
||||||
|
const errors = await DailyNotification.getErrorStats();
|
||||||
|
console.log('Error Statistics:', errors);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### 1. Configuration Management
|
||||||
|
- **Environment Variables**: Use environment variables for sensitive data
|
||||||
|
- **Configuration Validation**: Validate configuration on startup
|
||||||
|
- **Graceful Degradation**: Provide fallbacks for missing configuration
|
||||||
|
- **Configuration Updates**: Support runtime configuration updates
|
||||||
|
|
||||||
|
### 2. Security Best Practices
|
||||||
|
- **Certificate Pinning**: Enable for production environments
|
||||||
|
- **Data Redaction**: Always redact sensitive data in logs
|
||||||
|
- **Token Management**: Use secure token storage and rotation
|
||||||
|
- **Network Security**: Use HTTPS for all requests
|
||||||
|
|
||||||
|
### 3. Performance Best Practices
|
||||||
|
- **Connection Pooling**: Reuse HTTP connections
|
||||||
|
- **Request Batching**: Batch multiple requests when possible
|
||||||
|
- **Caching**: Use ETag support for efficient caching
|
||||||
|
- **Rate Limiting**: Implement appropriate rate limits
|
||||||
|
|
||||||
|
### 4. Monitoring Best Practices
|
||||||
|
- **Structured Logging**: Use structured logs with event IDs
|
||||||
|
- **Metrics Collection**: Collect relevant performance metrics
|
||||||
|
- **Error Tracking**: Track and analyze error patterns
|
||||||
|
- **Health Checks**: Implement health check endpoints
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note**: This configuration guide should be updated as the plugin evolves. Regular review and updates are recommended to ensure accuracy and completeness.
|
||||||
372
docs/request-configuration-quick-reference.md
Normal file
372
docs/request-configuration-quick-reference.md
Normal file
@@ -0,0 +1,372 @@
|
|||||||
|
# TimeSafari Daily Notification Plugin - Request Configuration Quick Reference
|
||||||
|
|
||||||
|
**Author**: Matthew Raymer
|
||||||
|
**Version**: 1.0.0
|
||||||
|
**Created**: 2025-10-08 06:24:57 UTC
|
||||||
|
|
||||||
|
## Quick Setup for TimeSafari PWA
|
||||||
|
|
||||||
|
### Basic Configuration
|
||||||
|
```typescript
|
||||||
|
import { DailyNotification } from '@timesafari/daily-notification-plugin';
|
||||||
|
|
||||||
|
await DailyNotification.configure({
|
||||||
|
// Required: Active DID for TimeSafari integration
|
||||||
|
timesafariConfig: {
|
||||||
|
activeDid: userDid
|
||||||
|
},
|
||||||
|
|
||||||
|
// Basic network settings
|
||||||
|
networkConfig: {
|
||||||
|
timeout: 30000,
|
||||||
|
retryAttempts: 3,
|
||||||
|
maxConcurrent: 5
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Complete TimeSafari Configuration
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
// TimeSafari integration
|
||||||
|
timesafariConfig: {
|
||||||
|
activeDid: userDid,
|
||||||
|
endpoints: {
|
||||||
|
offersToPerson: 'https://endorser.ch/api/v1/offers/person',
|
||||||
|
offersToPlans: 'https://endorser.ch/api/v1/offers/plans'
|
||||||
|
},
|
||||||
|
syncConfig: {
|
||||||
|
enableParallel: true,
|
||||||
|
maxConcurrent: 3,
|
||||||
|
batchSize: 10
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Network configuration
|
||||||
|
networkConfig: {
|
||||||
|
timeout: 30000,
|
||||||
|
retryAttempts: 3,
|
||||||
|
retryDelay: 1000,
|
||||||
|
maxConcurrent: 5,
|
||||||
|
userAgent: 'TimeSafari-PWA/1.0.0'
|
||||||
|
},
|
||||||
|
|
||||||
|
// Authentication
|
||||||
|
authentication: {
|
||||||
|
jwt: {
|
||||||
|
secret: process.env.JWT_SECRET,
|
||||||
|
algorithm: 'HS256',
|
||||||
|
expirationMinutes: 60
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Observability
|
||||||
|
logging: {
|
||||||
|
level: 'INFO',
|
||||||
|
enableRequestLogging: true,
|
||||||
|
redactSensitiveData: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Platform-Specific Quick Configs
|
||||||
|
|
||||||
|
### Android
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
platform: 'android',
|
||||||
|
androidConfig: {
|
||||||
|
workManagerConstraints: {
|
||||||
|
requiresNetworkType: 'CONNECTED',
|
||||||
|
requiresBatteryNotLow: false
|
||||||
|
},
|
||||||
|
requestConfig: {
|
||||||
|
connectTimeout: 30000,
|
||||||
|
readTimeout: 30000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### iOS
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
platform: 'ios',
|
||||||
|
iosConfig: {
|
||||||
|
backgroundTasks: {
|
||||||
|
'com.timesafari.daily-notification-fetch': {
|
||||||
|
requiresNetworkConnectivity: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
urlSessionConfig: {
|
||||||
|
timeoutIntervalForRequest: 30,
|
||||||
|
allowsCellularAccess: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Electron
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
platform: 'electron',
|
||||||
|
electronConfig: {
|
||||||
|
sessionConfig: {
|
||||||
|
userAgent: 'TimeSafari-Desktop/1.0.0',
|
||||||
|
cacheEnabled: true
|
||||||
|
},
|
||||||
|
requestConfig: {
|
||||||
|
timeout: 30000,
|
||||||
|
maxRedirects: 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Request Patterns
|
||||||
|
|
||||||
|
### 1. Content Fetching
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
contentFetch: {
|
||||||
|
enabled: true,
|
||||||
|
schedule: '0 8 * * *', // Daily at 8 AM
|
||||||
|
url: 'https://endorser.ch/api/v1/community/updates',
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${authToken}`,
|
||||||
|
'X-User-DID': userDid
|
||||||
|
},
|
||||||
|
timeout: 15000,
|
||||||
|
retryAttempts: 2
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Callback Configuration
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
callbacks: {
|
||||||
|
apiService: 'https://api.timesafari.com/notifications/callback',
|
||||||
|
database: 'local://notification-storage',
|
||||||
|
reporting: 'https://analytics.timesafari.com/events',
|
||||||
|
onSuccess: async (data) => {
|
||||||
|
// Handle successful fetch
|
||||||
|
console.log('Content fetched:', data);
|
||||||
|
},
|
||||||
|
onError: async (error) => {
|
||||||
|
// Handle error
|
||||||
|
console.error('Fetch error:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Circuit Breaker
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
circuitBreaker: {
|
||||||
|
failureThreshold: 5,
|
||||||
|
recoveryTimeout: 30000,
|
||||||
|
monitoringPeriod: 60000
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Rate Limiting
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
rateLimiting: {
|
||||||
|
maxRequestsPerMinute: 30,
|
||||||
|
maxRequestsPerHour: 1000,
|
||||||
|
burstLimit: 10,
|
||||||
|
backoffStrategy: 'exponential'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Quick Configs
|
||||||
|
|
||||||
|
### Certificate Pinning
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
security: {
|
||||||
|
certificatePinning: {
|
||||||
|
enabled: true,
|
||||||
|
pins: [
|
||||||
|
{
|
||||||
|
hostname: 'endorser.ch',
|
||||||
|
pins: ['sha256/YOUR_PIN_HERE']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Protection
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
dataProtection: {
|
||||||
|
encryption: {
|
||||||
|
enabled: true,
|
||||||
|
algorithm: 'AES-256-GCM'
|
||||||
|
},
|
||||||
|
redaction: {
|
||||||
|
enabled: true,
|
||||||
|
patterns: ['password', 'token', 'secret']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Debugging Configs
|
||||||
|
|
||||||
|
### Enable Debug Logging
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
logging: {
|
||||||
|
level: 'DEBUG',
|
||||||
|
enableRequestLogging: true,
|
||||||
|
enableResponseLogging: true,
|
||||||
|
enableErrorLogging: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Disable Security for Development
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
security: {
|
||||||
|
certificatePinning: {
|
||||||
|
enabled: false // Only for development
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling Quick Configs
|
||||||
|
|
||||||
|
### Retry Configuration
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
retry: {
|
||||||
|
strategy: 'exponential',
|
||||||
|
initialDelay: 1000,
|
||||||
|
maxDelay: 30000,
|
||||||
|
multiplier: 2,
|
||||||
|
maxRetries: {
|
||||||
|
contentFetch: 3,
|
||||||
|
notificationDelivery: 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fallback Configuration
|
||||||
|
```typescript
|
||||||
|
await DailyNotification.configure({
|
||||||
|
fallback: {
|
||||||
|
contentFallbacks: [
|
||||||
|
{
|
||||||
|
condition: 'network_unavailable',
|
||||||
|
action: 'use_cached_content',
|
||||||
|
maxAge: 3600
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Vue.js Integration Example
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// In your Vue component
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import { DailyNotification } from '@timesafari/daily-notification-plugin';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'NotificationSettings',
|
||||||
|
|
||||||
|
async mounted() {
|
||||||
|
await DailyNotification.configure({
|
||||||
|
timesafariConfig: {
|
||||||
|
activeDid: this.userDid
|
||||||
|
},
|
||||||
|
contentFetch: {
|
||||||
|
enabled: true,
|
||||||
|
schedule: '0 9 * * *',
|
||||||
|
callbacks: {
|
||||||
|
onSuccess: this.handleSuccess,
|
||||||
|
onError: this.handleError
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
handleSuccess(data: Record<string, unknown>) {
|
||||||
|
this.notificationData = data;
|
||||||
|
},
|
||||||
|
|
||||||
|
handleError(error: Error) {
|
||||||
|
this.showError(error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
|
||||||
|
### Required Environment Variables
|
||||||
|
```bash
|
||||||
|
# TimeSafari configuration
|
||||||
|
JWT_SECRET=your_jwt_secret_here
|
||||||
|
API_KEY=your_api_key_here
|
||||||
|
|
||||||
|
# Optional configuration
|
||||||
|
OAUTH_CLIENT_ID=your_oauth_client_id
|
||||||
|
OAUTH_CLIENT_SECRET=your_oauth_client_secret
|
||||||
|
```
|
||||||
|
|
||||||
|
### Development Environment
|
||||||
|
```bash
|
||||||
|
# Development settings
|
||||||
|
NODE_ENV=development
|
||||||
|
LOG_LEVEL=DEBUG
|
||||||
|
CERTIFICATE_PINNING=false
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Issues and Solutions
|
||||||
|
|
||||||
|
### Issue: Network Timeout
|
||||||
|
**Solution**: Increase timeout
|
||||||
|
```typescript
|
||||||
|
networkConfig: {
|
||||||
|
timeout: 60000 // 60 seconds
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Issue: Authentication Errors
|
||||||
|
**Solution**: Check JWT configuration
|
||||||
|
```typescript
|
||||||
|
authentication: {
|
||||||
|
jwt: {
|
||||||
|
secret: process.env.JWT_SECRET,
|
||||||
|
algorithm: 'HS256'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Issue: Certificate Errors
|
||||||
|
**Solution**: Disable pinning for development
|
||||||
|
```typescript
|
||||||
|
security: {
|
||||||
|
certificatePinning: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**For detailed configuration options, see**: `docs/host-request-configuration.md`
|
||||||
Reference in New Issue
Block a user