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,294 @@
1
+ import { PluginManager } from '../core/plugin-manager';
2
+ import { UpdateError, ValidationError, ErrorCode } from '../core/errors';
3
+ import { SecurityValidator } from '../core/security';
4
+ import { Directory } from '@capacitor/filesystem';
5
+ /**
6
+ * Manages atomic bundle installation with rollback capability
7
+ */
8
+ export class UpdateManager {
9
+ constructor() {
10
+ this.filesystem = null;
11
+ this.updateInProgress = false;
12
+ this.currentState = null;
13
+ this.pluginManager = PluginManager.getInstance();
14
+ this.securityValidator = SecurityValidator.getInstance();
15
+ }
16
+ /**
17
+ * Initialize update manager
18
+ */
19
+ async initialize() {
20
+ this.filesystem = this.pluginManager.getConfigManager().get('filesystem');
21
+ if (!this.filesystem) {
22
+ throw new UpdateError(ErrorCode.MISSING_DEPENDENCY, 'Filesystem not configured');
23
+ }
24
+ }
25
+ /**
26
+ * Apply bundle update atomically
27
+ */
28
+ async applyUpdate(bundleId, options) {
29
+ if (this.updateInProgress) {
30
+ throw new UpdateError(ErrorCode.UPDATE_FAILED, 'Another update is already in progress');
31
+ }
32
+ const logger = this.pluginManager.getLogger();
33
+ const bundleManager = this.pluginManager.getBundleManager();
34
+ try {
35
+ this.updateInProgress = true;
36
+ logger.info('Starting bundle update', { bundleId });
37
+ // Get the new bundle
38
+ const newBundle = await bundleManager.getBundle(bundleId);
39
+ if (!newBundle) {
40
+ throw new UpdateError(ErrorCode.FILE_NOT_FOUND, `Bundle ${bundleId} not found`);
41
+ }
42
+ // Verify bundle is ready
43
+ if (newBundle.status !== 'READY' && newBundle.status !== 'ACTIVE') {
44
+ throw new UpdateError(ErrorCode.BUNDLE_NOT_READY, `Bundle ${bundleId} is not ready for installation`);
45
+ }
46
+ // Get current active bundle
47
+ const currentBundle = await bundleManager.getActiveBundle();
48
+ // Initialize update state
49
+ this.currentState = {
50
+ currentBundle,
51
+ newBundle,
52
+ backupPath: null,
53
+ startTime: Date.now(),
54
+ };
55
+ // Validate update
56
+ await this.validateUpdate(currentBundle, newBundle, options);
57
+ // Create backup of current state
58
+ if (currentBundle && currentBundle.bundleId !== 'default') {
59
+ this.currentState.backupPath = await this.createBackup(currentBundle);
60
+ }
61
+ // Apply the update
62
+ await this.performUpdate(newBundle);
63
+ // Verify the update
64
+ await this.verifyUpdate(newBundle);
65
+ // Mark as active
66
+ await bundleManager.setActiveBundle(bundleId);
67
+ // Clean up old bundles if configured
68
+ if (options === null || options === void 0 ? void 0 : options.cleanupOldBundles) {
69
+ await bundleManager.cleanupOldBundles(options.keepBundleCount || 3);
70
+ }
71
+ logger.info('Bundle update completed successfully', {
72
+ bundleId,
73
+ version: newBundle.version,
74
+ duration: Date.now() - this.currentState.startTime,
75
+ });
76
+ // Clear state
77
+ this.currentState = null;
78
+ }
79
+ catch (error) {
80
+ logger.error('Bundle update failed', error);
81
+ // Attempt rollback
82
+ if (this.currentState) {
83
+ await this.rollback();
84
+ }
85
+ throw error;
86
+ }
87
+ finally {
88
+ this.updateInProgress = false;
89
+ }
90
+ }
91
+ /**
92
+ * Validate update before applying
93
+ */
94
+ async validateUpdate(currentBundle, newBundle, options) {
95
+ const logger = this.pluginManager.getLogger();
96
+ const versionManager = this.pluginManager.getVersionManager();
97
+ // Check if downgrade
98
+ if (currentBundle && !(options === null || options === void 0 ? void 0 : options.allowDowngrade)) {
99
+ if (versionManager.shouldBlockDowngrade(currentBundle.version, newBundle.version)) {
100
+ throw new ValidationError(ErrorCode.VERSION_DOWNGRADE, `Cannot downgrade from ${currentBundle.version} to ${newBundle.version}`);
101
+ }
102
+ }
103
+ // Verify bundle integrity
104
+ if (!newBundle.verified) {
105
+ logger.warn('Bundle not verified, verifying now', {
106
+ bundleId: newBundle.bundleId,
107
+ });
108
+ // Load bundle data
109
+ const downloadManager = this.pluginManager.getDownloadManager();
110
+ const blob = await downloadManager.loadBlob(newBundle.bundleId);
111
+ if (!blob) {
112
+ throw new UpdateError(ErrorCode.FILE_NOT_FOUND, 'Bundle data not found');
113
+ }
114
+ // Verify checksum
115
+ const arrayBuffer = await blob.arrayBuffer();
116
+ const isValid = await this.securityValidator.verifyChecksum(arrayBuffer, newBundle.checksum);
117
+ if (!isValid) {
118
+ throw new ValidationError(ErrorCode.CHECKSUM_MISMATCH, 'Bundle checksum verification failed');
119
+ }
120
+ // Verify signature if enabled
121
+ if (newBundle.signature) {
122
+ const signatureValid = await this.securityValidator.verifySignature(arrayBuffer, newBundle.signature);
123
+ if (!signatureValid) {
124
+ throw new ValidationError(ErrorCode.SIGNATURE_INVALID, 'Bundle signature verification failed');
125
+ }
126
+ }
127
+ // Mark as verified
128
+ await this.pluginManager
129
+ .getBundleManager()
130
+ .markBundleAsVerified(newBundle.bundleId);
131
+ }
132
+ logger.debug('Bundle validation passed', { bundleId: newBundle.bundleId });
133
+ }
134
+ /**
135
+ * Create backup of current bundle
136
+ */
137
+ async createBackup(bundle) {
138
+ const backupPath = `backups/${bundle.bundleId}_${Date.now()}`;
139
+ const logger = this.pluginManager.getLogger();
140
+ try {
141
+ // Create backup directory
142
+ await this.filesystem.mkdir({
143
+ path: backupPath,
144
+ directory: Directory.Data,
145
+ recursive: true,
146
+ });
147
+ // Copy bundle files
148
+ await this.filesystem.copy({
149
+ from: bundle.path,
150
+ to: backupPath,
151
+ directory: Directory.Data,
152
+ });
153
+ logger.info('Backup created', { bundleId: bundle.bundleId, backupPath });
154
+ return backupPath;
155
+ }
156
+ catch (error) {
157
+ logger.error('Failed to create backup', error);
158
+ throw new UpdateError(ErrorCode.UPDATE_FAILED, 'Failed to create backup', undefined, error);
159
+ }
160
+ }
161
+ /**
162
+ * Perform the actual update
163
+ */
164
+ async performUpdate(bundle) {
165
+ const logger = this.pluginManager.getLogger();
166
+ try {
167
+ // Extract bundle to target location
168
+ const targetPath = `active/${bundle.bundleId}`;
169
+ // Create target directory
170
+ await this.filesystem.mkdir({
171
+ path: targetPath,
172
+ directory: Directory.Data,
173
+ recursive: true,
174
+ });
175
+ // Copy bundle files
176
+ await this.filesystem.copy({
177
+ from: bundle.path,
178
+ to: targetPath,
179
+ directory: Directory.Data,
180
+ });
181
+ // Update bundle path
182
+ bundle.path = targetPath;
183
+ logger.debug('Bundle files installed', {
184
+ bundleId: bundle.bundleId,
185
+ targetPath,
186
+ });
187
+ }
188
+ catch (error) {
189
+ throw new UpdateError(ErrorCode.UPDATE_FAILED, 'Failed to install bundle files', undefined, error);
190
+ }
191
+ }
192
+ /**
193
+ * Verify update was successful
194
+ */
195
+ async verifyUpdate(bundle) {
196
+ try {
197
+ // Check if main bundle files exist
198
+ const indexPath = `${bundle.path}/index.html`;
199
+ await this.filesystem.stat({
200
+ path: indexPath,
201
+ directory: Directory.Data,
202
+ });
203
+ // Additional verification can be added here
204
+ }
205
+ catch (error) {
206
+ throw new UpdateError(ErrorCode.UPDATE_FAILED, 'Bundle verification failed after installation', undefined, error);
207
+ }
208
+ }
209
+ /**
210
+ * Rollback to previous state
211
+ */
212
+ async rollback() {
213
+ var _a;
214
+ if (!this.currentState) {
215
+ throw new UpdateError(ErrorCode.ROLLBACK_FAILED, 'No update state to rollback');
216
+ }
217
+ const logger = this.pluginManager.getLogger();
218
+ logger.warn('Starting rollback', {
219
+ from: this.currentState.newBundle.bundleId,
220
+ to: ((_a = this.currentState.currentBundle) === null || _a === void 0 ? void 0 : _a.bundleId) || 'default',
221
+ });
222
+ try {
223
+ const bundleManager = this.pluginManager.getBundleManager();
224
+ // Restore from backup if available
225
+ if (this.currentState.backupPath && this.currentState.currentBundle) {
226
+ const restoredPath = `active/${this.currentState.currentBundle.bundleId}`;
227
+ await this.filesystem.copy({
228
+ from: this.currentState.backupPath,
229
+ to: restoredPath,
230
+ directory: Directory.Data,
231
+ });
232
+ // Update bundle path
233
+ this.currentState.currentBundle.path = restoredPath;
234
+ await bundleManager.saveBundleInfo(this.currentState.currentBundle);
235
+ }
236
+ // Restore active bundle
237
+ if (this.currentState.currentBundle) {
238
+ await bundleManager.setActiveBundle(this.currentState.currentBundle.bundleId);
239
+ }
240
+ else {
241
+ // No previous bundle, clear active
242
+ await bundleManager.clearActiveBundle();
243
+ }
244
+ logger.info('Rollback completed successfully');
245
+ }
246
+ catch (error) {
247
+ logger.error('Rollback failed', error);
248
+ throw new UpdateError(ErrorCode.ROLLBACK_FAILED, 'Failed to rollback update', undefined, error);
249
+ }
250
+ finally {
251
+ // Clean up backup
252
+ if (this.currentState.backupPath) {
253
+ try {
254
+ await this.filesystem.rmdir({
255
+ path: this.currentState.backupPath,
256
+ directory: Directory.Data,
257
+ recursive: true,
258
+ });
259
+ }
260
+ catch (error) {
261
+ logger.warn('Failed to clean up backup', error);
262
+ }
263
+ }
264
+ }
265
+ }
266
+ /**
267
+ * Get current update progress
268
+ */
269
+ getUpdateProgress() {
270
+ var _a, _b;
271
+ return {
272
+ inProgress: this.updateInProgress,
273
+ bundleId: (_a = this.currentState) === null || _a === void 0 ? void 0 : _a.newBundle.bundleId,
274
+ startTime: (_b = this.currentState) === null || _b === void 0 ? void 0 : _b.startTime,
275
+ };
276
+ }
277
+ /**
278
+ * Cancel current update (if possible)
279
+ */
280
+ async cancelUpdate() {
281
+ if (!this.updateInProgress || !this.currentState) {
282
+ return;
283
+ }
284
+ const logger = this.pluginManager.getLogger();
285
+ logger.warn('Cancelling update', {
286
+ bundleId: this.currentState.newBundle.bundleId,
287
+ });
288
+ // Attempt rollback
289
+ await this.rollback();
290
+ this.updateInProgress = false;
291
+ this.currentState = null;
292
+ }
293
+ }
294
+ //# sourceMappingURL=update-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-manager.js","sourceRoot":"","sources":["../../../src/live-update/update-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AASlD;;GAEG;AACH,MAAM,OAAO,aAAa;IAOxB;QAJQ,eAAU,GAA6B,IAAI,CAAC;QAC5C,qBAAgB,GAAG,KAAK,CAAC;QACzB,iBAAY,GAAuB,IAAI,CAAC;QAG9C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,2BAA2B,CAC5B,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,OAAuB;QACzD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,aAAa,EACvB,uCAAuC,CACxC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QAE5D,IAAI,CAAC;YACH,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEpD,qBAAqB;YACrB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,cAAc,EACxB,UAAU,QAAQ,YAAY,CAC/B,CAAC;YACJ,CAAC;YAED,yBAAyB;YACzB,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAClE,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,gBAAgB,EAC1B,UAAU,QAAQ,gCAAgC,CACnD,CAAC;YACJ,CAAC;YAED,4BAA4B;YAC5B,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC;YAE5D,0BAA0B;YAC1B,IAAI,CAAC,YAAY,GAAG;gBAClB,aAAa;gBACb,SAAS;gBACT,UAAU,EAAE,IAAI;gBAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,kBAAkB;YAClB,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAE7D,iCAAiC;YACjC,IAAI,aAAa,IAAI,aAAa,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC1D,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YACxE,CAAC;YAED,mBAAmB;YACnB,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAEpC,oBAAoB;YACpB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAEnC,iBAAiB;YACjB,MAAM,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAE9C,qCAAqC;YACrC,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,EAAE,CAAC;gBAC/B,MAAM,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBAClD,QAAQ;gBACR,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS;aACnD,CAAC,CAAC;YAEH,cAAc;YACd,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAE5C,mBAAmB;YACnB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAC1B,aAAgC,EAChC,SAAqB,EACrB,OAAuB;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAE9D,qBAAqB;QACrB,IAAI,aAAa,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,CAAA,EAAE,CAAC;YAC9C,IACE,cAAc,CAAC,oBAAoB,CACjC,aAAa,CAAC,OAAO,EACrB,SAAS,CAAC,OAAO,CAClB,EACD,CAAC;gBACD,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,iBAAiB,EAC3B,yBAAyB,aAAa,CAAC,OAAO,OAAO,SAAS,CAAC,OAAO,EAAE,CACzE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;gBAChD,QAAQ,EAAE,SAAS,CAAC,QAAQ;aAC7B,CAAC,CAAC;YAEH,mBAAmB;YACnB,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAEhE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,cAAc,EACxB,uBAAuB,CACxB,CAAC;YACJ,CAAC;YAED,kBAAkB;YAClB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CACzD,WAAW,EACX,SAAS,CAAC,QAAQ,CACnB,CAAC;YAEF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,iBAAiB,EAC3B,qCAAqC,CACtC,CAAC;YACJ,CAAC;YAED,8BAA8B;YAC9B,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CACjE,WAAW,EACX,SAAS,CAAC,SAAS,CACpB,CAAC;gBAEF,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,iBAAiB,EAC3B,sCAAsC,CACvC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,MAAM,IAAI,CAAC,aAAa;iBACrB,gBAAgB,EAAE;iBAClB,oBAAoB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,MAAkB;QAC3C,MAAM,UAAU,GAAG,WAAW,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC;gBAC3B,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,SAAS,CAAC,IAAI;gBACzB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,oBAAoB;YACpB,MAAM,IAAI,CAAC,UAAW,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,EAAE,EAAE,UAAU;gBACd,SAAS,EAAE,SAAS,CAAC,IAAI;aAC1B,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YACzE,OAAO,UAAU,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,aAAa,EACvB,yBAAyB,EACzB,SAAS,EACT,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,MAAkB;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,UAAU,GAAG,UAAU,MAAM,CAAC,QAAQ,EAAE,CAAC;YAE/C,0BAA0B;YAC1B,MAAM,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC;gBAC3B,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,SAAS,CAAC,IAAI;gBACzB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,oBAAoB;YACpB,MAAM,IAAI,CAAC,UAAW,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,EAAE,EAAE,UAAU;gBACd,SAAS,EAAE,SAAS,CAAC,IAAI;aAC1B,CAAC,CAAC;YAEH,qBAAqB;YACrB,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC;YAEzB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,aAAa,EACvB,gCAAgC,EAChC,SAAS,EACT,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,MAAkB;QAC3C,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,IAAI,aAAa,CAAC;YAC9C,MAAM,IAAI,CAAC,UAAW,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,SAAS,CAAC,IAAI;aAC1B,CAAC,CAAC;YAEH,4CAA4C;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,aAAa,EACvB,+CAA+C,EAC/C,SAAS,EACT,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;;QACZ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,eAAe,EACzB,6BAA6B,CAC9B,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC/B,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ;YAC1C,EAAE,EAAE,CAAA,MAAA,IAAI,CAAC,YAAY,CAAC,aAAa,0CAAE,QAAQ,KAAI,SAAS;SAC3D,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;YAE5D,mCAAmC;YACnC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;gBACpE,MAAM,YAAY,GAAG,UAAU,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;gBAE1E,MAAM,IAAI,CAAC,UAAW,CAAC,IAAI,CAAC;oBAC1B,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU;oBAClC,EAAE,EAAE,YAAY;oBAChB,SAAS,EAAE,SAAS,CAAC,IAAI;iBAC1B,CAAC,CAAC;gBAEH,qBAAqB;gBACrB,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,GAAG,YAAY,CAAC;gBACpD,MAAM,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YACtE,CAAC;YAED,wBAAwB;YACxB,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;gBACpC,MAAM,aAAa,CAAC,eAAe,CACjC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CACzC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,mCAAmC;gBACnC,MAAM,aAAa,CAAC,iBAAiB,EAAE,CAAC;YAC1C,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,eAAe,EACzB,2BAA2B,EAC3B,SAAS,EACT,KAAc,CACf,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,kBAAkB;YAClB,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC;wBAC3B,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU;wBAClC,SAAS,EAAE,SAAS,CAAC,IAAI;wBACzB,SAAS,EAAE,IAAI;qBAChB,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;;QAKf,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,gBAAgB;YACjC,QAAQ,EAAE,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC,QAAQ;YAC/C,SAAS,EAAE,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS;SACxC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC/B,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ;SAC/C,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEtB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,84 @@
1
+ import type { LatestVersion } from '../definitions';
2
+ /**
3
+ * Manages version checking and comparison
4
+ */
5
+ export declare class VersionManager {
6
+ private readonly VERSION_CHECK_CACHE_KEY;
7
+ private readonly CACHE_DURATION;
8
+ private readonly logger;
9
+ private readonly configManager;
10
+ private readonly securityValidator;
11
+ private preferences;
12
+ private memoryCache;
13
+ constructor();
14
+ /**
15
+ * Compare two semantic versions
16
+ */
17
+ static compareVersions(version1: string, version2: string): number;
18
+ /**
19
+ * Validate semantic version format
20
+ */
21
+ static isValidVersion(version: string): boolean;
22
+ /**
23
+ * Check if update should be performed
24
+ */
25
+ static shouldUpdate(currentVersion: string, newVersion: string, minAppVersion?: string): boolean;
26
+ /**
27
+ * Initialize the version manager
28
+ */
29
+ initialize(): Promise<void>;
30
+ /**
31
+ * Check for latest version from server
32
+ */
33
+ checkForUpdates(serverUrl: string, channel: string, currentVersion: string, appId: string): Promise<LatestVersion | null>;
34
+ /**
35
+ * Compare two versions
36
+ */
37
+ isNewerVersion(version1: string, version2: string): boolean;
38
+ /**
39
+ * Check if update is mandatory based on minimum version
40
+ */
41
+ isUpdateMandatory(currentVersion: string, minimumVersion?: string): boolean;
42
+ /**
43
+ * Parse version metadata
44
+ */
45
+ parseVersion(version: string): {
46
+ major: number;
47
+ minor: number;
48
+ patch: number;
49
+ prerelease?: string;
50
+ build?: string;
51
+ };
52
+ /**
53
+ * Generate version string from components
54
+ */
55
+ buildVersionString(components: {
56
+ major: number;
57
+ minor: number;
58
+ patch: number;
59
+ prerelease?: string;
60
+ build?: string;
61
+ }): string;
62
+ /**
63
+ * Check if version is compatible with native version requirements
64
+ */
65
+ isCompatibleWithNativeVersion(bundleVersion: string, nativeVersion: string, compatibility?: {
66
+ [key: string]: string;
67
+ }): boolean;
68
+ /**
69
+ * Get version from cache
70
+ */
71
+ private getCachedVersionInfo;
72
+ /**
73
+ * Cache version info
74
+ */
75
+ private cacheVersionInfo;
76
+ /**
77
+ * Clear version cache
78
+ */
79
+ clearVersionCache(): Promise<void>;
80
+ /**
81
+ * Check if downgrade protection should block update
82
+ */
83
+ shouldBlockDowngrade(currentVersion: string, newVersion: string): boolean;
84
+ }