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.
Files changed (184) hide show
  1. package/CapacitorNativeUpdate.podspec +18 -0
  2. package/LICENSE +21 -0
  3. package/Readme.md +451 -0
  4. package/android/build.gradle +92 -0
  5. package/android/gradle/wrapper/gradle-wrapper.properties +8 -0
  6. package/android/gradle.properties +17 -0
  7. package/android/proguard-rules.pro +29 -0
  8. package/android/settings.gradle +2 -0
  9. package/android/src/main/AndroidManifest.xml +34 -0
  10. package/android/src/main/java/com/aoneahsan/nativeupdate/AppReviewPlugin.kt +153 -0
  11. package/android/src/main/java/com/aoneahsan/nativeupdate/AppUpdatePlugin.kt +275 -0
  12. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundNotificationManager.kt +390 -0
  13. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateManager.kt +46 -0
  14. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdatePlugin.kt +333 -0
  15. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateWorker.kt +251 -0
  16. package/android/src/main/java/com/aoneahsan/nativeupdate/CapacitorNativeUpdatePlugin.kt +265 -0
  17. package/android/src/main/java/com/aoneahsan/nativeupdate/LiveUpdatePlugin.kt +526 -0
  18. package/android/src/main/java/com/aoneahsan/nativeupdate/NotificationActionReceiver.kt +99 -0
  19. package/android/src/main/java/com/aoneahsan/nativeupdate/SecurityManager.kt +249 -0
  20. package/dist/esm/__tests__/bundle-manager.test.d.ts +1 -0
  21. package/dist/esm/__tests__/bundle-manager.test.js +123 -0
  22. package/dist/esm/__tests__/bundle-manager.test.js.map +1 -0
  23. package/dist/esm/__tests__/config.test.d.ts +1 -0
  24. package/dist/esm/__tests__/config.test.js +69 -0
  25. package/dist/esm/__tests__/config.test.js.map +1 -0
  26. package/dist/esm/__tests__/integration.test.d.ts +1 -0
  27. package/dist/esm/__tests__/integration.test.js +78 -0
  28. package/dist/esm/__tests__/integration.test.js.map +1 -0
  29. package/dist/esm/__tests__/security.test.d.ts +1 -0
  30. package/dist/esm/__tests__/security.test.js +54 -0
  31. package/dist/esm/__tests__/security.test.js.map +1 -0
  32. package/dist/esm/__tests__/version-manager.test.d.ts +1 -0
  33. package/dist/esm/__tests__/version-manager.test.js +45 -0
  34. package/dist/esm/__tests__/version-manager.test.js.map +1 -0
  35. package/dist/esm/app-review/app-review-manager.d.ts +24 -0
  36. package/dist/esm/app-review/app-review-manager.js +195 -0
  37. package/dist/esm/app-review/app-review-manager.js.map +1 -0
  38. package/dist/esm/app-review/index.d.ts +5 -0
  39. package/dist/esm/app-review/index.js +6 -0
  40. package/dist/esm/app-review/index.js.map +1 -0
  41. package/dist/esm/app-review/platform-review-handler.d.ts +20 -0
  42. package/dist/esm/app-review/platform-review-handler.js +138 -0
  43. package/dist/esm/app-review/platform-review-handler.js.map +1 -0
  44. package/dist/esm/app-review/review-conditions-checker.d.ts +22 -0
  45. package/dist/esm/app-review/review-conditions-checker.js +155 -0
  46. package/dist/esm/app-review/review-conditions-checker.js.map +1 -0
  47. package/dist/esm/app-review/review-rate-limiter.d.ts +23 -0
  48. package/dist/esm/app-review/review-rate-limiter.js +164 -0
  49. package/dist/esm/app-review/review-rate-limiter.js.map +1 -0
  50. package/dist/esm/app-review/types.d.ts +41 -0
  51. package/dist/esm/app-review/types.js +2 -0
  52. package/dist/esm/app-review/types.js.map +1 -0
  53. package/dist/esm/app-update/app-update-checker.d.ts +13 -0
  54. package/dist/esm/app-update/app-update-checker.js +104 -0
  55. package/dist/esm/app-update/app-update-checker.js.map +1 -0
  56. package/dist/esm/app-update/app-update-installer.d.ts +19 -0
  57. package/dist/esm/app-update/app-update-installer.js +123 -0
  58. package/dist/esm/app-update/app-update-installer.js.map +1 -0
  59. package/dist/esm/app-update/app-update-manager.d.ts +28 -0
  60. package/dist/esm/app-update/app-update-manager.js +199 -0
  61. package/dist/esm/app-update/app-update-manager.js.map +1 -0
  62. package/dist/esm/app-update/app-update-notifier.d.ts +14 -0
  63. package/dist/esm/app-update/app-update-notifier.js +100 -0
  64. package/dist/esm/app-update/app-update-notifier.js.map +1 -0
  65. package/dist/esm/app-update/index.d.ts +6 -0
  66. package/dist/esm/app-update/index.js +7 -0
  67. package/dist/esm/app-update/index.js.map +1 -0
  68. package/dist/esm/app-update/platform-app-update.d.ts +19 -0
  69. package/dist/esm/app-update/platform-app-update.js +129 -0
  70. package/dist/esm/app-update/platform-app-update.js.map +1 -0
  71. package/dist/esm/app-update/types.d.ts +58 -0
  72. package/dist/esm/app-update/types.js +12 -0
  73. package/dist/esm/app-update/types.js.map +1 -0
  74. package/dist/esm/background-update/background-scheduler.d.ts +17 -0
  75. package/dist/esm/background-update/background-scheduler.js +195 -0
  76. package/dist/esm/background-update/background-scheduler.js.map +1 -0
  77. package/dist/esm/background-update/index.d.ts +3 -0
  78. package/dist/esm/background-update/index.js +3 -0
  79. package/dist/esm/background-update/index.js.map +1 -0
  80. package/dist/esm/background-update/notification-manager.d.ts +29 -0
  81. package/dist/esm/background-update/notification-manager.js +89 -0
  82. package/dist/esm/background-update/notification-manager.js.map +1 -0
  83. package/dist/esm/core/analytics.d.ts +70 -0
  84. package/dist/esm/core/analytics.js +137 -0
  85. package/dist/esm/core/analytics.js.map +1 -0
  86. package/dist/esm/core/cache-manager.d.ts +72 -0
  87. package/dist/esm/core/cache-manager.js +275 -0
  88. package/dist/esm/core/cache-manager.js.map +1 -0
  89. package/dist/esm/core/config.d.ts +48 -0
  90. package/dist/esm/core/config.js +83 -0
  91. package/dist/esm/core/config.js.map +1 -0
  92. package/dist/esm/core/errors.d.ts +51 -0
  93. package/dist/esm/core/errors.js +80 -0
  94. package/dist/esm/core/errors.js.map +1 -0
  95. package/dist/esm/core/logger.d.ts +21 -0
  96. package/dist/esm/core/logger.js +109 -0
  97. package/dist/esm/core/logger.js.map +1 -0
  98. package/dist/esm/core/performance.d.ts +53 -0
  99. package/dist/esm/core/performance.js +140 -0
  100. package/dist/esm/core/performance.js.map +1 -0
  101. package/dist/esm/core/plugin-manager.d.ts +66 -0
  102. package/dist/esm/core/plugin-manager.js +148 -0
  103. package/dist/esm/core/plugin-manager.js.map +1 -0
  104. package/dist/esm/core/security.d.ts +93 -0
  105. package/dist/esm/core/security.js +315 -0
  106. package/dist/esm/core/security.js.map +1 -0
  107. package/dist/esm/definitions.d.ts +639 -0
  108. package/dist/esm/definitions.js +103 -0
  109. package/dist/esm/definitions.js.map +1 -0
  110. package/dist/esm/index.d.ts +12 -0
  111. package/dist/esm/index.js +16 -0
  112. package/dist/esm/index.js.map +1 -0
  113. package/dist/esm/live-update/bundle-manager.d.ts +94 -0
  114. package/dist/esm/live-update/bundle-manager.js +310 -0
  115. package/dist/esm/live-update/bundle-manager.js.map +1 -0
  116. package/dist/esm/live-update/certificate-pinning.d.ts +38 -0
  117. package/dist/esm/live-update/certificate-pinning.js +78 -0
  118. package/dist/esm/live-update/certificate-pinning.js.map +1 -0
  119. package/dist/esm/live-update/download-manager.d.ts +67 -0
  120. package/dist/esm/live-update/download-manager.js +319 -0
  121. package/dist/esm/live-update/download-manager.js.map +1 -0
  122. package/dist/esm/live-update/update-manager.d.ts +52 -0
  123. package/dist/esm/live-update/update-manager.js +294 -0
  124. package/dist/esm/live-update/update-manager.js.map +1 -0
  125. package/dist/esm/live-update/version-manager.d.ts +84 -0
  126. package/dist/esm/live-update/version-manager.js +335 -0
  127. package/dist/esm/live-update/version-manager.js.map +1 -0
  128. package/dist/esm/plugin.d.ts +6 -0
  129. package/dist/esm/plugin.js +283 -0
  130. package/dist/esm/plugin.js.map +1 -0
  131. package/dist/esm/security/crypto.d.ts +25 -0
  132. package/dist/esm/security/crypto.js +70 -0
  133. package/dist/esm/security/crypto.js.map +1 -0
  134. package/dist/esm/security/validator.d.ts +60 -0
  135. package/dist/esm/security/validator.js +143 -0
  136. package/dist/esm/security/validator.js.map +1 -0
  137. package/dist/esm/web.d.ts +74 -0
  138. package/dist/esm/web.js +595 -0
  139. package/dist/esm/web.js.map +1 -0
  140. package/dist/plugin.cjs.js +2 -0
  141. package/dist/plugin.cjs.js.map +1 -0
  142. package/dist/plugin.esm.js +2 -0
  143. package/dist/plugin.esm.js.map +1 -0
  144. package/dist/plugin.js +3 -0
  145. package/dist/plugin.js.map +1 -0
  146. package/docs/APP_REVIEW_GUIDE.md +768 -0
  147. package/docs/BUNDLE_SIGNING.md +264 -0
  148. package/docs/LIVE_UPDATES_GUIDE.md +650 -0
  149. package/docs/MIGRATION.md +192 -0
  150. package/docs/NATIVE_UPDATES_GUIDE.md +694 -0
  151. package/docs/QUICK_START.md +606 -0
  152. package/docs/README.md +111 -0
  153. package/docs/REMAINING_FEATURES.md +139 -0
  154. package/docs/api/app-review-api.md +259 -0
  155. package/docs/api/app-update-api.md +238 -0
  156. package/docs/api/events-api.md +451 -0
  157. package/docs/api/live-update-api.md +265 -0
  158. package/docs/background-updates.md +392 -0
  159. package/docs/examples/advanced-scenarios.md +410 -0
  160. package/docs/examples/basic-usage.md +185 -0
  161. package/docs/features/app-reviews.md +975 -0
  162. package/docs/features/app-updates.md +785 -0
  163. package/docs/features/live-updates.md +633 -0
  164. package/docs/getting-started/configuration.md +468 -0
  165. package/docs/getting-started/installation.md +209 -0
  166. package/docs/getting-started/quick-start.md +379 -0
  167. package/docs/guides/deployment-guide.md +333 -0
  168. package/docs/guides/migration-from-codepush.md +142 -0
  169. package/docs/guides/security-best-practices.md +1057 -0
  170. package/docs/guides/testing-guide.md +373 -0
  171. package/docs/production-readiness.md +478 -0
  172. package/docs/security/certificate-pinning.md +122 -0
  173. package/docs/server-requirements.md +147 -0
  174. package/ios/Plugin/AppReview/AppReviewPlugin.swift +158 -0
  175. package/ios/Plugin/AppUpdate/AppUpdatePlugin.swift +234 -0
  176. package/ios/Plugin/BackgroundUpdate/BackgroundNotificationManager.swift +329 -0
  177. package/ios/Plugin/BackgroundUpdate/BackgroundUpdatePlugin.swift +396 -0
  178. package/ios/Plugin/CapacitorNativeUpdatePlugin.m +45 -0
  179. package/ios/Plugin/CapacitorNativeUpdatePlugin.swift +190 -0
  180. package/ios/Plugin/Info.plist +43 -0
  181. package/ios/Plugin/LiveUpdate/LiveUpdatePlugin.swift +689 -0
  182. package/ios/Plugin/LiveUpdate/WebViewConfiguration.swift +45 -0
  183. package/ios/Plugin/Security/SecurityManager.swift +289 -0
  184. 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
+ }