native-update 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CapacitorNativeUpdate.podspec +18 -0
- package/LICENSE +21 -0
- package/Readme.md +451 -0
- package/android/build.gradle +92 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +8 -0
- package/android/gradle.properties +17 -0
- package/android/proguard-rules.pro +29 -0
- package/android/settings.gradle +2 -0
- package/android/src/main/AndroidManifest.xml +34 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/AppReviewPlugin.kt +153 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/AppUpdatePlugin.kt +275 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundNotificationManager.kt +390 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateManager.kt +46 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdatePlugin.kt +333 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateWorker.kt +251 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/CapacitorNativeUpdatePlugin.kt +265 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/LiveUpdatePlugin.kt +526 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/NotificationActionReceiver.kt +99 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/SecurityManager.kt +249 -0
- package/dist/esm/__tests__/bundle-manager.test.d.ts +1 -0
- package/dist/esm/__tests__/bundle-manager.test.js +123 -0
- package/dist/esm/__tests__/bundle-manager.test.js.map +1 -0
- package/dist/esm/__tests__/config.test.d.ts +1 -0
- package/dist/esm/__tests__/config.test.js +69 -0
- package/dist/esm/__tests__/config.test.js.map +1 -0
- package/dist/esm/__tests__/integration.test.d.ts +1 -0
- package/dist/esm/__tests__/integration.test.js +78 -0
- package/dist/esm/__tests__/integration.test.js.map +1 -0
- package/dist/esm/__tests__/security.test.d.ts +1 -0
- package/dist/esm/__tests__/security.test.js +54 -0
- package/dist/esm/__tests__/security.test.js.map +1 -0
- package/dist/esm/__tests__/version-manager.test.d.ts +1 -0
- package/dist/esm/__tests__/version-manager.test.js +45 -0
- package/dist/esm/__tests__/version-manager.test.js.map +1 -0
- package/dist/esm/app-review/app-review-manager.d.ts +24 -0
- package/dist/esm/app-review/app-review-manager.js +195 -0
- package/dist/esm/app-review/app-review-manager.js.map +1 -0
- package/dist/esm/app-review/index.d.ts +5 -0
- package/dist/esm/app-review/index.js +6 -0
- package/dist/esm/app-review/index.js.map +1 -0
- package/dist/esm/app-review/platform-review-handler.d.ts +20 -0
- package/dist/esm/app-review/platform-review-handler.js +138 -0
- package/dist/esm/app-review/platform-review-handler.js.map +1 -0
- package/dist/esm/app-review/review-conditions-checker.d.ts +22 -0
- package/dist/esm/app-review/review-conditions-checker.js +155 -0
- package/dist/esm/app-review/review-conditions-checker.js.map +1 -0
- package/dist/esm/app-review/review-rate-limiter.d.ts +23 -0
- package/dist/esm/app-review/review-rate-limiter.js +164 -0
- package/dist/esm/app-review/review-rate-limiter.js.map +1 -0
- package/dist/esm/app-review/types.d.ts +41 -0
- package/dist/esm/app-review/types.js +2 -0
- package/dist/esm/app-review/types.js.map +1 -0
- package/dist/esm/app-update/app-update-checker.d.ts +13 -0
- package/dist/esm/app-update/app-update-checker.js +104 -0
- package/dist/esm/app-update/app-update-checker.js.map +1 -0
- package/dist/esm/app-update/app-update-installer.d.ts +19 -0
- package/dist/esm/app-update/app-update-installer.js +123 -0
- package/dist/esm/app-update/app-update-installer.js.map +1 -0
- package/dist/esm/app-update/app-update-manager.d.ts +28 -0
- package/dist/esm/app-update/app-update-manager.js +199 -0
- package/dist/esm/app-update/app-update-manager.js.map +1 -0
- package/dist/esm/app-update/app-update-notifier.d.ts +14 -0
- package/dist/esm/app-update/app-update-notifier.js +100 -0
- package/dist/esm/app-update/app-update-notifier.js.map +1 -0
- package/dist/esm/app-update/index.d.ts +6 -0
- package/dist/esm/app-update/index.js +7 -0
- package/dist/esm/app-update/index.js.map +1 -0
- package/dist/esm/app-update/platform-app-update.d.ts +19 -0
- package/dist/esm/app-update/platform-app-update.js +129 -0
- package/dist/esm/app-update/platform-app-update.js.map +1 -0
- package/dist/esm/app-update/types.d.ts +58 -0
- package/dist/esm/app-update/types.js +12 -0
- package/dist/esm/app-update/types.js.map +1 -0
- package/dist/esm/background-update/background-scheduler.d.ts +17 -0
- package/dist/esm/background-update/background-scheduler.js +195 -0
- package/dist/esm/background-update/background-scheduler.js.map +1 -0
- package/dist/esm/background-update/index.d.ts +3 -0
- package/dist/esm/background-update/index.js +3 -0
- package/dist/esm/background-update/index.js.map +1 -0
- package/dist/esm/background-update/notification-manager.d.ts +29 -0
- package/dist/esm/background-update/notification-manager.js +89 -0
- package/dist/esm/background-update/notification-manager.js.map +1 -0
- package/dist/esm/core/analytics.d.ts +70 -0
- package/dist/esm/core/analytics.js +137 -0
- package/dist/esm/core/analytics.js.map +1 -0
- package/dist/esm/core/cache-manager.d.ts +72 -0
- package/dist/esm/core/cache-manager.js +275 -0
- package/dist/esm/core/cache-manager.js.map +1 -0
- package/dist/esm/core/config.d.ts +48 -0
- package/dist/esm/core/config.js +83 -0
- package/dist/esm/core/config.js.map +1 -0
- package/dist/esm/core/errors.d.ts +51 -0
- package/dist/esm/core/errors.js +80 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/logger.d.ts +21 -0
- package/dist/esm/core/logger.js +109 -0
- package/dist/esm/core/logger.js.map +1 -0
- package/dist/esm/core/performance.d.ts +53 -0
- package/dist/esm/core/performance.js +140 -0
- package/dist/esm/core/performance.js.map +1 -0
- package/dist/esm/core/plugin-manager.d.ts +66 -0
- package/dist/esm/core/plugin-manager.js +148 -0
- package/dist/esm/core/plugin-manager.js.map +1 -0
- package/dist/esm/core/security.d.ts +93 -0
- package/dist/esm/core/security.js +315 -0
- package/dist/esm/core/security.js.map +1 -0
- package/dist/esm/definitions.d.ts +639 -0
- package/dist/esm/definitions.js +103 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/live-update/bundle-manager.d.ts +94 -0
- package/dist/esm/live-update/bundle-manager.js +310 -0
- package/dist/esm/live-update/bundle-manager.js.map +1 -0
- package/dist/esm/live-update/certificate-pinning.d.ts +38 -0
- package/dist/esm/live-update/certificate-pinning.js +78 -0
- package/dist/esm/live-update/certificate-pinning.js.map +1 -0
- package/dist/esm/live-update/download-manager.d.ts +67 -0
- package/dist/esm/live-update/download-manager.js +319 -0
- package/dist/esm/live-update/download-manager.js.map +1 -0
- package/dist/esm/live-update/update-manager.d.ts +52 -0
- package/dist/esm/live-update/update-manager.js +294 -0
- package/dist/esm/live-update/update-manager.js.map +1 -0
- package/dist/esm/live-update/version-manager.d.ts +84 -0
- package/dist/esm/live-update/version-manager.js +335 -0
- package/dist/esm/live-update/version-manager.js.map +1 -0
- package/dist/esm/plugin.d.ts +6 -0
- package/dist/esm/plugin.js +283 -0
- package/dist/esm/plugin.js.map +1 -0
- package/dist/esm/security/crypto.d.ts +25 -0
- package/dist/esm/security/crypto.js +70 -0
- package/dist/esm/security/crypto.js.map +1 -0
- package/dist/esm/security/validator.d.ts +60 -0
- package/dist/esm/security/validator.js +143 -0
- package/dist/esm/security/validator.js.map +1 -0
- package/dist/esm/web.d.ts +74 -0
- package/dist/esm/web.js +595 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +2 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.esm.js +2 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/plugin.js +3 -0
- package/dist/plugin.js.map +1 -0
- package/docs/APP_REVIEW_GUIDE.md +768 -0
- package/docs/BUNDLE_SIGNING.md +264 -0
- package/docs/LIVE_UPDATES_GUIDE.md +650 -0
- package/docs/MIGRATION.md +192 -0
- package/docs/NATIVE_UPDATES_GUIDE.md +694 -0
- package/docs/QUICK_START.md +606 -0
- package/docs/README.md +111 -0
- package/docs/REMAINING_FEATURES.md +139 -0
- package/docs/api/app-review-api.md +259 -0
- package/docs/api/app-update-api.md +238 -0
- package/docs/api/events-api.md +451 -0
- package/docs/api/live-update-api.md +265 -0
- package/docs/background-updates.md +392 -0
- package/docs/examples/advanced-scenarios.md +410 -0
- package/docs/examples/basic-usage.md +185 -0
- package/docs/features/app-reviews.md +975 -0
- package/docs/features/app-updates.md +785 -0
- package/docs/features/live-updates.md +633 -0
- package/docs/getting-started/configuration.md +468 -0
- package/docs/getting-started/installation.md +209 -0
- package/docs/getting-started/quick-start.md +379 -0
- package/docs/guides/deployment-guide.md +333 -0
- package/docs/guides/migration-from-codepush.md +142 -0
- package/docs/guides/security-best-practices.md +1057 -0
- package/docs/guides/testing-guide.md +373 -0
- package/docs/production-readiness.md +478 -0
- package/docs/security/certificate-pinning.md +122 -0
- package/docs/server-requirements.md +147 -0
- package/ios/Plugin/AppReview/AppReviewPlugin.swift +158 -0
- package/ios/Plugin/AppUpdate/AppUpdatePlugin.swift +234 -0
- package/ios/Plugin/BackgroundUpdate/BackgroundNotificationManager.swift +329 -0
- package/ios/Plugin/BackgroundUpdate/BackgroundUpdatePlugin.swift +396 -0
- package/ios/Plugin/CapacitorNativeUpdatePlugin.m +45 -0
- package/ios/Plugin/CapacitorNativeUpdatePlugin.swift +190 -0
- package/ios/Plugin/Info.plist +43 -0
- package/ios/Plugin/LiveUpdate/LiveUpdatePlugin.swift +689 -0
- package/ios/Plugin/LiveUpdate/WebViewConfiguration.swift +45 -0
- package/ios/Plugin/Security/SecurityManager.swift +289 -0
- package/package.json +90 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { ConfigManager } from './config';
|
|
2
|
+
export var LogLevel;
|
|
3
|
+
(function (LogLevel) {
|
|
4
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
5
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
6
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
7
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
8
|
+
})(LogLevel || (LogLevel = {}));
|
|
9
|
+
export class Logger {
|
|
10
|
+
constructor(context) {
|
|
11
|
+
this.configManager = ConfigManager.getInstance();
|
|
12
|
+
this.context = context || 'CapacitorNativeUpdate';
|
|
13
|
+
}
|
|
14
|
+
static getInstance() {
|
|
15
|
+
if (!Logger.instance) {
|
|
16
|
+
Logger.instance = new Logger();
|
|
17
|
+
}
|
|
18
|
+
return Logger.instance;
|
|
19
|
+
}
|
|
20
|
+
shouldLog() {
|
|
21
|
+
return this.configManager.get('enableLogging');
|
|
22
|
+
}
|
|
23
|
+
sanitize(data) {
|
|
24
|
+
if (typeof data === 'string') {
|
|
25
|
+
let sanitized = data;
|
|
26
|
+
// Remove potential file paths
|
|
27
|
+
sanitized = sanitized.replace(/\/[^\s]+\/([\w.-]+)$/g, '/<path>/$1');
|
|
28
|
+
// Remove potential URLs with credentials
|
|
29
|
+
sanitized = sanitized.replace(/https?:\/\/[^:]+:[^@]+@/g, 'https://***:***@');
|
|
30
|
+
// Remove potential API keys
|
|
31
|
+
sanitized = sanitized.replace(/[a-zA-Z0-9]{32,}/g, '<redacted>');
|
|
32
|
+
return sanitized;
|
|
33
|
+
}
|
|
34
|
+
else if (typeof data === 'object' && data !== null) {
|
|
35
|
+
if (Array.isArray(data)) {
|
|
36
|
+
return data.map((item) => this.sanitize(item));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const sanitized = {};
|
|
40
|
+
const dataObj = data;
|
|
41
|
+
for (const key in dataObj) {
|
|
42
|
+
if (key.toLowerCase().includes('key') ||
|
|
43
|
+
key.toLowerCase().includes('secret') ||
|
|
44
|
+
key.toLowerCase().includes('password') ||
|
|
45
|
+
key.toLowerCase().includes('token')) {
|
|
46
|
+
sanitized[key] = '<redacted>';
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
sanitized[key] = this.sanitize(dataObj[key]);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return sanitized;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return data;
|
|
56
|
+
}
|
|
57
|
+
log(message, data) {
|
|
58
|
+
this.logWithLevel(LogLevel.INFO, message, data);
|
|
59
|
+
}
|
|
60
|
+
logWithLevel(level, message, data) {
|
|
61
|
+
if (!this.shouldLog())
|
|
62
|
+
return;
|
|
63
|
+
const timestamp = new Date().toISOString();
|
|
64
|
+
const sanitizedData = data ? this.sanitize(data) : undefined;
|
|
65
|
+
const logEntry = {
|
|
66
|
+
timestamp,
|
|
67
|
+
level: LogLevel[level],
|
|
68
|
+
context: this.context,
|
|
69
|
+
message,
|
|
70
|
+
};
|
|
71
|
+
if (sanitizedData !== undefined) {
|
|
72
|
+
logEntry.data = sanitizedData;
|
|
73
|
+
}
|
|
74
|
+
switch (level) {
|
|
75
|
+
case LogLevel.DEBUG:
|
|
76
|
+
console.debug(`[${this.context}]`, logEntry);
|
|
77
|
+
break;
|
|
78
|
+
case LogLevel.INFO:
|
|
79
|
+
console.info(`[${this.context}]`, logEntry);
|
|
80
|
+
break;
|
|
81
|
+
case LogLevel.WARN:
|
|
82
|
+
console.warn(`[${this.context}]`, logEntry);
|
|
83
|
+
break;
|
|
84
|
+
case LogLevel.ERROR:
|
|
85
|
+
console.error(`[${this.context}]`, logEntry);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
debug(message, data) {
|
|
90
|
+
this.logWithLevel(LogLevel.DEBUG, message, data);
|
|
91
|
+
}
|
|
92
|
+
info(message, data) {
|
|
93
|
+
this.logWithLevel(LogLevel.INFO, message, data);
|
|
94
|
+
}
|
|
95
|
+
warn(message, data) {
|
|
96
|
+
this.logWithLevel(LogLevel.WARN, message, data);
|
|
97
|
+
}
|
|
98
|
+
error(message, error) {
|
|
99
|
+
const errorData = error instanceof Error
|
|
100
|
+
? {
|
|
101
|
+
name: error.name,
|
|
102
|
+
message: error.message,
|
|
103
|
+
stack: error.stack,
|
|
104
|
+
}
|
|
105
|
+
: error;
|
|
106
|
+
this.logWithLevel(LogLevel.ERROR, message, errorData);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/core/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface PerformanceMetrics {
|
|
2
|
+
checkDuration?: number;
|
|
3
|
+
downloadDuration?: number;
|
|
4
|
+
downloadSize?: number;
|
|
5
|
+
installDuration?: number;
|
|
6
|
+
totalDuration?: number;
|
|
7
|
+
networkSpeed?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class PerformanceMonitor {
|
|
10
|
+
private static instance;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
private metrics;
|
|
13
|
+
private timers;
|
|
14
|
+
private constructor();
|
|
15
|
+
static getInstance(): PerformanceMonitor;
|
|
16
|
+
/**
|
|
17
|
+
* Start timing an operation
|
|
18
|
+
*/
|
|
19
|
+
startTimer(operation: string, version?: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* End timing an operation
|
|
22
|
+
*/
|
|
23
|
+
endTimer(operation: string, version?: string): number;
|
|
24
|
+
/**
|
|
25
|
+
* Record download metrics
|
|
26
|
+
*/
|
|
27
|
+
recordDownload(version: string, size: number, duration: number): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get metrics for a version
|
|
30
|
+
*/
|
|
31
|
+
getMetrics(version?: string): PerformanceMetrics | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Get all metrics
|
|
34
|
+
*/
|
|
35
|
+
getAllMetrics(): Map<string, PerformanceMetrics>;
|
|
36
|
+
/**
|
|
37
|
+
* Clear metrics
|
|
38
|
+
*/
|
|
39
|
+
clearMetrics(version?: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Calculate optimal download chunk size based on network speed
|
|
42
|
+
*/
|
|
43
|
+
getOptimalChunkSize(): number;
|
|
44
|
+
/**
|
|
45
|
+
* Check if device has sufficient performance
|
|
46
|
+
*/
|
|
47
|
+
checkDevicePerformance(): Promise<{
|
|
48
|
+
cpuCores: number;
|
|
49
|
+
memory: number;
|
|
50
|
+
storage: number;
|
|
51
|
+
suitable: boolean;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { Logger } from './logger';
|
|
2
|
+
export class PerformanceMonitor {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.metrics = new Map();
|
|
5
|
+
this.timers = new Map();
|
|
6
|
+
this.logger = Logger.getInstance();
|
|
7
|
+
}
|
|
8
|
+
static getInstance() {
|
|
9
|
+
if (!PerformanceMonitor.instance) {
|
|
10
|
+
PerformanceMonitor.instance = new PerformanceMonitor();
|
|
11
|
+
}
|
|
12
|
+
return PerformanceMonitor.instance;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Start timing an operation
|
|
16
|
+
*/
|
|
17
|
+
startTimer(operation, version) {
|
|
18
|
+
const key = version ? `${operation}-${version}` : operation;
|
|
19
|
+
this.timers.set(key, Date.now());
|
|
20
|
+
this.logger.debug(`Performance timer started: ${key}`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* End timing an operation
|
|
24
|
+
*/
|
|
25
|
+
endTimer(operation, version) {
|
|
26
|
+
const key = version ? `${operation}-${version}` : operation;
|
|
27
|
+
const startTime = this.timers.get(key);
|
|
28
|
+
if (!startTime) {
|
|
29
|
+
this.logger.warn(`No timer found for: ${key}`);
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
const duration = Date.now() - startTime;
|
|
33
|
+
this.timers.delete(key);
|
|
34
|
+
// Update metrics
|
|
35
|
+
const metrics = this.metrics.get(version || 'current') || {};
|
|
36
|
+
switch (operation) {
|
|
37
|
+
case 'check':
|
|
38
|
+
metrics.checkDuration = duration;
|
|
39
|
+
break;
|
|
40
|
+
case 'download':
|
|
41
|
+
metrics.downloadDuration = duration;
|
|
42
|
+
break;
|
|
43
|
+
case 'install':
|
|
44
|
+
metrics.installDuration = duration;
|
|
45
|
+
break;
|
|
46
|
+
case 'total':
|
|
47
|
+
metrics.totalDuration = duration;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
this.metrics.set(version || 'current', metrics);
|
|
51
|
+
this.logger.debug(`Performance timer ended: ${key} = ${duration}ms`);
|
|
52
|
+
return duration;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Record download metrics
|
|
56
|
+
*/
|
|
57
|
+
recordDownload(version, size, duration) {
|
|
58
|
+
const metrics = this.metrics.get(version) || {};
|
|
59
|
+
metrics.downloadSize = size;
|
|
60
|
+
metrics.downloadDuration = duration;
|
|
61
|
+
metrics.networkSpeed = size / (duration / 1000); // bytes per second
|
|
62
|
+
this.metrics.set(version, metrics);
|
|
63
|
+
this.logger.info('Download performance', {
|
|
64
|
+
version,
|
|
65
|
+
size: `${(size / 1024 / 1024).toFixed(2)} MB`,
|
|
66
|
+
duration: `${(duration / 1000).toFixed(2)}s`,
|
|
67
|
+
speed: `${(metrics.networkSpeed / 1024 / 1024).toFixed(2)} MB/s`,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get metrics for a version
|
|
72
|
+
*/
|
|
73
|
+
getMetrics(version) {
|
|
74
|
+
return this.metrics.get(version || 'current');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get all metrics
|
|
78
|
+
*/
|
|
79
|
+
getAllMetrics() {
|
|
80
|
+
return new Map(this.metrics);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Clear metrics
|
|
84
|
+
*/
|
|
85
|
+
clearMetrics(version) {
|
|
86
|
+
if (version) {
|
|
87
|
+
this.metrics.delete(version);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.metrics.clear();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Calculate optimal download chunk size based on network speed
|
|
95
|
+
*/
|
|
96
|
+
getOptimalChunkSize() {
|
|
97
|
+
const recentMetrics = Array.from(this.metrics.values()).slice(-3);
|
|
98
|
+
if (recentMetrics.length === 0) {
|
|
99
|
+
return 1024 * 1024; // Default 1MB chunks
|
|
100
|
+
}
|
|
101
|
+
const avgSpeed = recentMetrics
|
|
102
|
+
.filter((m) => m.networkSpeed)
|
|
103
|
+
.reduce((sum, m) => sum + (m.networkSpeed || 0), 0) /
|
|
104
|
+
recentMetrics.length;
|
|
105
|
+
// Adjust chunk size based on speed
|
|
106
|
+
if (avgSpeed > 10 * 1024 * 1024) {
|
|
107
|
+
// > 10 MB/s
|
|
108
|
+
return 5 * 1024 * 1024; // 5MB chunks
|
|
109
|
+
}
|
|
110
|
+
else if (avgSpeed > 5 * 1024 * 1024) {
|
|
111
|
+
// > 5 MB/s
|
|
112
|
+
return 2 * 1024 * 1024; // 2MB chunks
|
|
113
|
+
}
|
|
114
|
+
else if (avgSpeed > 1 * 1024 * 1024) {
|
|
115
|
+
// > 1 MB/s
|
|
116
|
+
return 1024 * 1024; // 1MB chunks
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return 512 * 1024; // 512KB chunks for slow connections
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if device has sufficient performance
|
|
124
|
+
*/
|
|
125
|
+
async checkDevicePerformance() {
|
|
126
|
+
const cpuCores = navigator.hardwareConcurrency || 1;
|
|
127
|
+
// Estimate available memory (if available)
|
|
128
|
+
const memory = navigator.deviceMemory || 4; // GB
|
|
129
|
+
// Check storage (placeholder - implement per platform)
|
|
130
|
+
const storage = 1000; // MB - placeholder
|
|
131
|
+
const suitable = cpuCores >= 2 && memory >= 2 && storage >= 100;
|
|
132
|
+
return {
|
|
133
|
+
cpuCores,
|
|
134
|
+
memory,
|
|
135
|
+
storage,
|
|
136
|
+
suitable,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/core/performance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ConfigManager } from './config';
|
|
2
|
+
import { Logger } from './logger';
|
|
3
|
+
import { SecurityValidator } from './security';
|
|
4
|
+
import { BundleManager } from '../live-update/bundle-manager';
|
|
5
|
+
import { DownloadManager } from '../live-update/download-manager';
|
|
6
|
+
import { VersionManager } from '../live-update/version-manager';
|
|
7
|
+
import { PluginInitConfig } from '../definitions';
|
|
8
|
+
/**
|
|
9
|
+
* Central manager for all plugin components
|
|
10
|
+
*/
|
|
11
|
+
export declare class PluginManager {
|
|
12
|
+
private static instance;
|
|
13
|
+
private readonly configManager;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
private readonly securityValidator;
|
|
16
|
+
private bundleManager;
|
|
17
|
+
private downloadManager;
|
|
18
|
+
private versionManager;
|
|
19
|
+
private initialized;
|
|
20
|
+
private constructor();
|
|
21
|
+
static getInstance(): PluginManager;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the plugin with configuration
|
|
24
|
+
*/
|
|
25
|
+
initialize(config: PluginInitConfig): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if plugin is initialized
|
|
28
|
+
*/
|
|
29
|
+
isInitialized(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Ensure plugin is initialized
|
|
32
|
+
*/
|
|
33
|
+
private ensureInitialized;
|
|
34
|
+
/**
|
|
35
|
+
* Get bundle manager
|
|
36
|
+
*/
|
|
37
|
+
getBundleManager(): BundleManager;
|
|
38
|
+
/**
|
|
39
|
+
* Get download manager
|
|
40
|
+
*/
|
|
41
|
+
getDownloadManager(): DownloadManager;
|
|
42
|
+
/**
|
|
43
|
+
* Get version manager
|
|
44
|
+
*/
|
|
45
|
+
getVersionManager(): VersionManager;
|
|
46
|
+
/**
|
|
47
|
+
* Get configuration manager
|
|
48
|
+
*/
|
|
49
|
+
getConfigManager(): ConfigManager;
|
|
50
|
+
/**
|
|
51
|
+
* Get logger
|
|
52
|
+
*/
|
|
53
|
+
getLogger(): Logger;
|
|
54
|
+
/**
|
|
55
|
+
* Get security validator
|
|
56
|
+
*/
|
|
57
|
+
getSecurityValidator(): SecurityValidator;
|
|
58
|
+
/**
|
|
59
|
+
* Reset plugin state
|
|
60
|
+
*/
|
|
61
|
+
reset(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Clean up resources
|
|
64
|
+
*/
|
|
65
|
+
cleanup(): Promise<void>;
|
|
66
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { ConfigManager } from './config';
|
|
2
|
+
import { Logger } from './logger';
|
|
3
|
+
import { SecurityValidator } from './security';
|
|
4
|
+
import { BundleManager } from '../live-update/bundle-manager';
|
|
5
|
+
import { DownloadManager } from '../live-update/download-manager';
|
|
6
|
+
import { VersionManager } from '../live-update/version-manager';
|
|
7
|
+
import { CapacitorNativeUpdateError, ErrorCode } from './errors';
|
|
8
|
+
/**
|
|
9
|
+
* Central manager for all plugin components
|
|
10
|
+
*/
|
|
11
|
+
export class PluginManager {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.bundleManager = null;
|
|
14
|
+
this.downloadManager = null;
|
|
15
|
+
this.versionManager = null;
|
|
16
|
+
this.initialized = false;
|
|
17
|
+
this.configManager = ConfigManager.getInstance();
|
|
18
|
+
this.logger = Logger.getInstance();
|
|
19
|
+
this.securityValidator = SecurityValidator.getInstance();
|
|
20
|
+
}
|
|
21
|
+
static getInstance() {
|
|
22
|
+
if (!PluginManager.instance) {
|
|
23
|
+
PluginManager.instance = new PluginManager();
|
|
24
|
+
}
|
|
25
|
+
return PluginManager.instance;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize the plugin with configuration
|
|
29
|
+
*/
|
|
30
|
+
async initialize(config) {
|
|
31
|
+
if (this.initialized) {
|
|
32
|
+
this.logger.warn('Plugin already initialized');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
// Configure the plugin
|
|
37
|
+
this.configManager.configure(config);
|
|
38
|
+
// Validate required dependencies
|
|
39
|
+
if (!config.filesystem || !config.preferences) {
|
|
40
|
+
throw new CapacitorNativeUpdateError(ErrorCode.MISSING_DEPENDENCY, 'Filesystem and Preferences are required for plugin initialization');
|
|
41
|
+
}
|
|
42
|
+
// Initialize managers
|
|
43
|
+
this.bundleManager = new BundleManager();
|
|
44
|
+
await this.bundleManager.initialize();
|
|
45
|
+
this.downloadManager = new DownloadManager();
|
|
46
|
+
await this.downloadManager.initialize();
|
|
47
|
+
this.versionManager = new VersionManager();
|
|
48
|
+
await this.versionManager.initialize();
|
|
49
|
+
this.initialized = true;
|
|
50
|
+
this.logger.info('Plugin initialized successfully');
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
this.logger.error('Failed to initialize plugin', error);
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if plugin is initialized
|
|
59
|
+
*/
|
|
60
|
+
isInitialized() {
|
|
61
|
+
return this.initialized && this.configManager.isConfigured();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Ensure plugin is initialized
|
|
65
|
+
*/
|
|
66
|
+
ensureInitialized() {
|
|
67
|
+
if (!this.isInitialized()) {
|
|
68
|
+
throw new CapacitorNativeUpdateError(ErrorCode.NOT_CONFIGURED, 'Plugin not initialized. Please call initialize() first.');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get bundle manager
|
|
73
|
+
*/
|
|
74
|
+
getBundleManager() {
|
|
75
|
+
this.ensureInitialized();
|
|
76
|
+
return this.bundleManager;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get download manager
|
|
80
|
+
*/
|
|
81
|
+
getDownloadManager() {
|
|
82
|
+
this.ensureInitialized();
|
|
83
|
+
return this.downloadManager;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get version manager
|
|
87
|
+
*/
|
|
88
|
+
getVersionManager() {
|
|
89
|
+
this.ensureInitialized();
|
|
90
|
+
return this.versionManager;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get configuration manager
|
|
94
|
+
*/
|
|
95
|
+
getConfigManager() {
|
|
96
|
+
return this.configManager;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get logger
|
|
100
|
+
*/
|
|
101
|
+
getLogger() {
|
|
102
|
+
return this.logger;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get security validator
|
|
106
|
+
*/
|
|
107
|
+
getSecurityValidator() {
|
|
108
|
+
return this.securityValidator;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Reset plugin state
|
|
112
|
+
*/
|
|
113
|
+
async reset() {
|
|
114
|
+
this.logger.info('Resetting plugin state');
|
|
115
|
+
// Clear all data
|
|
116
|
+
if (this.bundleManager) {
|
|
117
|
+
await this.bundleManager.clearAllBundles();
|
|
118
|
+
}
|
|
119
|
+
if (this.versionManager) {
|
|
120
|
+
await this.versionManager.clearVersionCache();
|
|
121
|
+
}
|
|
122
|
+
if (this.downloadManager) {
|
|
123
|
+
this.downloadManager.cancelAllDownloads();
|
|
124
|
+
}
|
|
125
|
+
// Reset initialization state
|
|
126
|
+
this.bundleManager = null;
|
|
127
|
+
this.downloadManager = null;
|
|
128
|
+
this.versionManager = null;
|
|
129
|
+
this.initialized = false;
|
|
130
|
+
this.logger.info('Plugin reset complete');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Clean up resources
|
|
134
|
+
*/
|
|
135
|
+
async cleanup() {
|
|
136
|
+
this.logger.info('Cleaning up plugin resources');
|
|
137
|
+
// Cancel any active downloads
|
|
138
|
+
if (this.downloadManager) {
|
|
139
|
+
this.downloadManager.cancelAllDownloads();
|
|
140
|
+
}
|
|
141
|
+
// Clean expired bundles
|
|
142
|
+
if (this.bundleManager) {
|
|
143
|
+
await this.bundleManager.cleanExpiredBundles();
|
|
144
|
+
}
|
|
145
|
+
this.logger.info('Cleanup complete');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=plugin-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../../src/core/plugin-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export declare class SecurityValidator {
|
|
2
|
+
private static instance;
|
|
3
|
+
private readonly configManager;
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(): SecurityValidator;
|
|
7
|
+
/**
|
|
8
|
+
* Validate URL is HTTPS
|
|
9
|
+
*/
|
|
10
|
+
static validateUrl(url: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Validate checksum format
|
|
13
|
+
*/
|
|
14
|
+
static validateChecksum(checksum: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Sanitize input string
|
|
17
|
+
*/
|
|
18
|
+
static sanitizeInput(input: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Validate bundle size
|
|
21
|
+
*/
|
|
22
|
+
static validateBundleSize(size: number): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Calculate SHA-256 checksum of data
|
|
25
|
+
*/
|
|
26
|
+
calculateChecksum(data: ArrayBuffer): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Verify checksum matches expected value
|
|
29
|
+
*/
|
|
30
|
+
verifyChecksum(data: ArrayBuffer, expectedChecksum: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Alias for verifyChecksum for backward compatibility
|
|
33
|
+
*/
|
|
34
|
+
validateChecksum(data: ArrayBuffer, expectedChecksum: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Verify digital signature using Web Crypto API
|
|
37
|
+
*/
|
|
38
|
+
verifySignature(data: ArrayBuffer, signature: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Convert PEM to ArrayBuffer
|
|
41
|
+
*/
|
|
42
|
+
private pemToArrayBuffer;
|
|
43
|
+
/**
|
|
44
|
+
* Convert base64 to ArrayBuffer
|
|
45
|
+
*/
|
|
46
|
+
private base64ToArrayBuffer;
|
|
47
|
+
/**
|
|
48
|
+
* Sanitize file path to prevent directory traversal
|
|
49
|
+
*/
|
|
50
|
+
sanitizePath(path: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Validate bundle ID format
|
|
53
|
+
*/
|
|
54
|
+
validateBundleId(bundleId: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* Validate semantic version format
|
|
57
|
+
*/
|
|
58
|
+
validateVersion(version: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Check if version is a downgrade
|
|
61
|
+
*/
|
|
62
|
+
isVersionDowngrade(currentVersion: string, newVersion: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Parse semantic version
|
|
65
|
+
*/
|
|
66
|
+
private parseVersion;
|
|
67
|
+
/**
|
|
68
|
+
* Validate URL format and security
|
|
69
|
+
*/
|
|
70
|
+
validateUrl(url: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Validate file size
|
|
73
|
+
*/
|
|
74
|
+
validateFileSize(size: number): void;
|
|
75
|
+
/**
|
|
76
|
+
* Generate a secure random ID
|
|
77
|
+
*/
|
|
78
|
+
generateSecureId(): string;
|
|
79
|
+
/**
|
|
80
|
+
* Validate certificate pinning for HTTPS connections
|
|
81
|
+
* Note: This is a placeholder for web implementation as certificate pinning
|
|
82
|
+
* is primarily implemented at the native layer
|
|
83
|
+
*/
|
|
84
|
+
validateCertificatePin(hostname: string, certificate: string): Promise<boolean>;
|
|
85
|
+
/**
|
|
86
|
+
* Calculate SHA-256 hash of certificate
|
|
87
|
+
*/
|
|
88
|
+
private calculateCertificateHash;
|
|
89
|
+
/**
|
|
90
|
+
* Validate metadata object
|
|
91
|
+
*/
|
|
92
|
+
validateMetadata(metadata: unknown): void;
|
|
93
|
+
}
|