- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
265 lines
9.2 KiB
JavaScript
265 lines
9.2 KiB
JavaScript
// modules/api-manager/index.js
|
|
import { Logger } from '../../core/logger.js';
|
|
import { ObserverManager } from './ObserverManager.js';
|
|
import { MediaManager } from './MediaManager.js';
|
|
import { StorageManager } from './StorageManager.js';
|
|
import { DeviceManager } from './DeviceManager.js';
|
|
import { AnimationManager } from './AnimationManager.js';
|
|
import { WorkerManager } from './WorkerManager.js';
|
|
import { PerformanceManager } from './PerformanceManager.js';
|
|
import { PermissionManager } from './PermissionManager.js';
|
|
import { BiometricAuthManager } from './BiometricAuthManager.js';
|
|
|
|
/**
|
|
* Centralized API Manager for all Web APIs
|
|
* Provides unified, simplified access to modern browser APIs
|
|
*/
|
|
const APIManagerModule = {
|
|
name: 'api-manager',
|
|
|
|
// Module-level init (called by module system)
|
|
init(config = {}, state = null) {
|
|
Logger.info('[APIManager] Module initialized - All Web APIs available');
|
|
this.initializeAPIManagers(config);
|
|
this.exposeGlobalAPI();
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* Initialize all API managers
|
|
*/
|
|
initializeAPIManagers(config) {
|
|
this.observers = new ObserverManager(config.observers || {});
|
|
this.media = new MediaManager(config.media || {});
|
|
this.storage = new StorageManager(config.storage || {});
|
|
this.device = new DeviceManager(config.device || {});
|
|
this.animation = new AnimationManager(config.animation || {});
|
|
this.worker = new WorkerManager(config.worker || {});
|
|
this.performance = new PerformanceManager(config.performance || {});
|
|
this.permissions = new PermissionManager(config.permissions || {});
|
|
this.biometric = new BiometricAuthManager(config.biometric || {});
|
|
|
|
Logger.info('[APIManager] All API managers initialized');
|
|
},
|
|
|
|
/**
|
|
* Expose global API for easy access
|
|
*/
|
|
exposeGlobalAPI() {
|
|
// Make API managers globally available
|
|
if (typeof window !== 'undefined') {
|
|
window.API = {
|
|
observers: this.observers,
|
|
media: this.media,
|
|
storage: this.storage,
|
|
device: this.device,
|
|
animation: this.animation,
|
|
worker: this.worker,
|
|
performance: this.performance,
|
|
permissions: this.permissions,
|
|
biometric: this.biometric
|
|
};
|
|
|
|
Logger.info('[APIManager] Global API exposed at window.API');
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Get specific API manager
|
|
*/
|
|
getAPI(name) {
|
|
return this[name] || null;
|
|
},
|
|
|
|
/**
|
|
* Check if specific Web API is supported
|
|
*/
|
|
isSupported(apiName) {
|
|
const supportMap = {
|
|
// Observer APIs
|
|
'IntersectionObserver': 'IntersectionObserver' in window,
|
|
'ResizeObserver': 'ResizeObserver' in window,
|
|
'MutationObserver': 'MutationObserver' in window,
|
|
'PerformanceObserver': 'PerformanceObserver' in window,
|
|
|
|
// Media APIs
|
|
'MediaDevices': navigator.mediaDevices !== undefined,
|
|
'WebRTC': 'RTCPeerConnection' in window,
|
|
'WebAudio': 'AudioContext' in window || 'webkitAudioContext' in window,
|
|
'MediaRecorder': 'MediaRecorder' in window,
|
|
|
|
// Storage APIs
|
|
'IndexedDB': 'indexedDB' in window,
|
|
'CacheAPI': 'caches' in window,
|
|
'WebLocks': 'locks' in navigator,
|
|
'BroadcastChannel': 'BroadcastChannel' in window,
|
|
|
|
// Device APIs
|
|
'Geolocation': 'geolocation' in navigator,
|
|
'DeviceMotion': 'DeviceMotionEvent' in window,
|
|
'DeviceOrientation': 'DeviceOrientationEvent' in window,
|
|
'Vibration': 'vibrate' in navigator,
|
|
'Battery': 'getBattery' in navigator,
|
|
'NetworkInfo': 'connection' in navigator,
|
|
|
|
// Animation APIs
|
|
'WebAnimations': 'animate' in Element.prototype,
|
|
'VisualViewport': 'visualViewport' in window,
|
|
|
|
// Worker APIs
|
|
'WebWorkers': 'Worker' in window,
|
|
'ServiceWorker': 'serviceWorker' in navigator,
|
|
'SharedWorker': 'SharedWorker' in window,
|
|
|
|
// Performance APIs
|
|
'PerformanceAPI': 'performance' in window,
|
|
'NavigationTiming': 'getEntriesByType' in performance,
|
|
|
|
// Permission APIs
|
|
'Permissions': 'permissions' in navigator,
|
|
'WebAuthn': 'credentials' in navigator && 'create' in navigator.credentials
|
|
};
|
|
|
|
return supportMap[apiName] || false;
|
|
},
|
|
|
|
/**
|
|
* Get browser capabilities report
|
|
*/
|
|
getCapabilities() {
|
|
const capabilities = {};
|
|
|
|
// Check all API support
|
|
Object.keys(this.getSupportMap()).forEach(api => {
|
|
capabilities[api] = this.isSupported(api);
|
|
});
|
|
|
|
return {
|
|
capabilities,
|
|
modernBrowser: this.isModernBrowser(),
|
|
recommendedAPIs: this.getRecommendedAPIs(),
|
|
summary: this.getCapabilitySummary(capabilities)
|
|
};
|
|
},
|
|
|
|
/**
|
|
* Check if browser is considered modern
|
|
*/
|
|
isModernBrowser() {
|
|
const requiredAPIs = [
|
|
'IntersectionObserver',
|
|
'ResizeObserver',
|
|
'WebAnimations',
|
|
'IndexedDB'
|
|
];
|
|
|
|
return requiredAPIs.every(api => this.isSupported(api));
|
|
},
|
|
|
|
/**
|
|
* Get recommended APIs for current browser
|
|
*/
|
|
getRecommendedAPIs() {
|
|
const recommendations = [];
|
|
|
|
if (this.isSupported('IntersectionObserver')) {
|
|
recommendations.push({
|
|
api: 'IntersectionObserver',
|
|
use: 'Lazy loading, scroll triggers, viewport detection',
|
|
example: 'API.observers.intersection(elements, callback)'
|
|
});
|
|
}
|
|
|
|
if (this.isSupported('WebAnimations')) {
|
|
recommendations.push({
|
|
api: 'Web Animations',
|
|
use: 'High-performance animations with timeline control',
|
|
example: 'API.animation.animate(element, keyframes, options)'
|
|
});
|
|
}
|
|
|
|
if (this.isSupported('IndexedDB')) {
|
|
recommendations.push({
|
|
api: 'IndexedDB',
|
|
use: 'Client-side database for complex data',
|
|
example: 'API.storage.db.set(key, value)'
|
|
});
|
|
}
|
|
|
|
if (this.isSupported('MediaDevices')) {
|
|
recommendations.push({
|
|
api: 'Media Devices',
|
|
use: 'Camera, microphone, screen sharing',
|
|
example: 'API.media.getUserCamera()'
|
|
});
|
|
}
|
|
|
|
return recommendations;
|
|
},
|
|
|
|
/**
|
|
* Get capability summary
|
|
*/
|
|
getCapabilitySummary(capabilities) {
|
|
const total = Object.keys(capabilities).length;
|
|
const supported = Object.values(capabilities).filter(Boolean).length;
|
|
const percentage = Math.round((supported / total) * 100);
|
|
|
|
return {
|
|
total,
|
|
supported,
|
|
percentage,
|
|
grade: this.getGrade(percentage)
|
|
};
|
|
},
|
|
|
|
/**
|
|
* Get grade based on API support percentage
|
|
*/
|
|
getGrade(percentage) {
|
|
if (percentage >= 90) return 'A+';
|
|
if (percentage >= 80) return 'A';
|
|
if (percentage >= 70) return 'B';
|
|
if (percentage >= 60) return 'C';
|
|
return 'D';
|
|
},
|
|
|
|
/**
|
|
* Get support map for reference
|
|
*/
|
|
getSupportMap() {
|
|
return {
|
|
'IntersectionObserver': 'Viewport intersection detection',
|
|
'ResizeObserver': 'Element resize detection',
|
|
'MutationObserver': 'DOM change detection',
|
|
'PerformanceObserver': 'Performance metrics monitoring',
|
|
'MediaDevices': 'Camera and microphone access',
|
|
'WebRTC': 'Real-time communication',
|
|
'WebAudio': 'Audio processing and synthesis',
|
|
'MediaRecorder': 'Audio/video recording',
|
|
'IndexedDB': 'Client-side database',
|
|
'CacheAPI': 'HTTP cache management',
|
|
'WebLocks': 'Resource locking',
|
|
'BroadcastChannel': 'Cross-tab communication',
|
|
'Geolocation': 'GPS and location services',
|
|
'DeviceMotion': 'Accelerometer and gyroscope',
|
|
'DeviceOrientation': 'Device orientation',
|
|
'Vibration': 'Haptic feedback',
|
|
'Battery': 'Battery status',
|
|
'NetworkInfo': 'Network connection info',
|
|
'WebAnimations': 'High-performance animations',
|
|
'VisualViewport': 'Viewport information',
|
|
'WebWorkers': 'Background processing',
|
|
'ServiceWorker': 'Background sync and caching',
|
|
'SharedWorker': 'Shared background processing',
|
|
'PerformanceAPI': 'Performance measurement',
|
|
'NavigationTiming': 'Navigation timing metrics',
|
|
'Permissions': 'Browser permission management',
|
|
'WebAuthn': 'Biometric authentication'
|
|
};
|
|
}
|
|
};
|
|
|
|
// Export für module system
|
|
export const init = APIManagerModule.init.bind(APIManagerModule);
|
|
export default APIManagerModule; |