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,335 @@
|
|
|
1
|
+
import { ConfigManager } from '../core/config';
|
|
2
|
+
import { Logger } from '../core/logger';
|
|
3
|
+
import { SecurityValidator } from '../core/security';
|
|
4
|
+
import { ValidationError, ErrorCode } from '../core/errors';
|
|
5
|
+
/**
|
|
6
|
+
* Manages version checking and comparison
|
|
7
|
+
*/
|
|
8
|
+
export class VersionManager {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.VERSION_CHECK_CACHE_KEY = 'capacitor_native_update_version_cache';
|
|
11
|
+
this.CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
|
|
12
|
+
this.preferences = null;
|
|
13
|
+
this.memoryCache = new Map();
|
|
14
|
+
this.logger = Logger.getInstance();
|
|
15
|
+
this.configManager = ConfigManager.getInstance();
|
|
16
|
+
this.securityValidator = SecurityValidator.getInstance();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Compare two semantic versions
|
|
20
|
+
*/
|
|
21
|
+
static compareVersions(version1, version2) {
|
|
22
|
+
try {
|
|
23
|
+
// Split version and pre-release
|
|
24
|
+
const [v1Base, v1Pre] = version1.split('-');
|
|
25
|
+
const [v2Base, v2Pre] = version2.split('-');
|
|
26
|
+
const v1Parts = v1Base.split('.').map(Number);
|
|
27
|
+
const v2Parts = v2Base.split('.').map(Number);
|
|
28
|
+
// Compare major.minor.patch
|
|
29
|
+
for (let i = 0; i < 3; i++) {
|
|
30
|
+
const v1Part = v1Parts[i] || 0;
|
|
31
|
+
const v2Part = v2Parts[i] || 0;
|
|
32
|
+
if (v1Part > v2Part)
|
|
33
|
+
return 1;
|
|
34
|
+
if (v1Part < v2Part)
|
|
35
|
+
return -1;
|
|
36
|
+
}
|
|
37
|
+
// If base versions are equal, compare pre-release
|
|
38
|
+
if (v1Pre && !v2Pre)
|
|
39
|
+
return -1; // 1.0.0-alpha < 1.0.0
|
|
40
|
+
if (!v1Pre && v2Pre)
|
|
41
|
+
return 1; // 1.0.0 > 1.0.0-alpha
|
|
42
|
+
if (v1Pre && v2Pre) {
|
|
43
|
+
return v1Pre.localeCompare(v2Pre);
|
|
44
|
+
}
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
catch (_a) {
|
|
48
|
+
if (version1 === version2)
|
|
49
|
+
return 0;
|
|
50
|
+
return version1 > version2 ? 1 : -1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validate semantic version format
|
|
55
|
+
*/
|
|
56
|
+
static isValidVersion(version) {
|
|
57
|
+
return /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/.test(version);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if update should be performed
|
|
61
|
+
*/
|
|
62
|
+
static shouldUpdate(currentVersion, newVersion, minAppVersion) {
|
|
63
|
+
if (minAppVersion &&
|
|
64
|
+
VersionManager.compareVersions(currentVersion, minAppVersion) < 0) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return VersionManager.compareVersions(currentVersion, newVersion) < 0;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Initialize the version manager
|
|
71
|
+
*/
|
|
72
|
+
async initialize() {
|
|
73
|
+
this.preferences = this.configManager.get('preferences');
|
|
74
|
+
if (!this.preferences) {
|
|
75
|
+
throw new ValidationError(ErrorCode.MISSING_DEPENDENCY, 'Preferences not configured. Please configure the plugin first.');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check for latest version from server
|
|
80
|
+
*/
|
|
81
|
+
async checkForUpdates(serverUrl, channel, currentVersion, appId) {
|
|
82
|
+
// Validate inputs
|
|
83
|
+
this.securityValidator.validateUrl(serverUrl);
|
|
84
|
+
this.securityValidator.validateVersion(currentVersion);
|
|
85
|
+
if (!channel || !appId) {
|
|
86
|
+
throw new ValidationError(ErrorCode.INVALID_CONFIG, 'Channel and appId are required');
|
|
87
|
+
}
|
|
88
|
+
// Check cache first
|
|
89
|
+
const cacheKey = `${channel}-${appId}`;
|
|
90
|
+
const cached = await this.getCachedVersionInfo(cacheKey);
|
|
91
|
+
if (cached &&
|
|
92
|
+
cached.channel === channel &&
|
|
93
|
+
Date.now() - cached.timestamp < this.CACHE_DURATION) {
|
|
94
|
+
this.logger.debug('Returning cached version info', {
|
|
95
|
+
channel,
|
|
96
|
+
version: cached.data.version,
|
|
97
|
+
});
|
|
98
|
+
return cached.data;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const url = new URL(`${serverUrl}/check`);
|
|
102
|
+
url.searchParams.append('channel', channel);
|
|
103
|
+
url.searchParams.append('version', currentVersion);
|
|
104
|
+
url.searchParams.append('appId', appId);
|
|
105
|
+
url.searchParams.append('platform', 'web'); // Will be overridden by native platforms
|
|
106
|
+
const response = await fetch(url.toString(), {
|
|
107
|
+
method: 'GET',
|
|
108
|
+
headers: {
|
|
109
|
+
'Content-Type': 'application/json',
|
|
110
|
+
'X-App-Version': currentVersion,
|
|
111
|
+
'X-App-Id': appId,
|
|
112
|
+
},
|
|
113
|
+
signal: AbortSignal.timeout(this.configManager.get('downloadTimeout')),
|
|
114
|
+
});
|
|
115
|
+
if (!response.ok) {
|
|
116
|
+
throw new Error(`Version check failed: ${response.status}`);
|
|
117
|
+
}
|
|
118
|
+
const data = await response.json();
|
|
119
|
+
// Validate response
|
|
120
|
+
if (!data.version) {
|
|
121
|
+
throw new ValidationError(ErrorCode.INVALID_BUNDLE_FORMAT, 'No version in server response');
|
|
122
|
+
}
|
|
123
|
+
this.securityValidator.validateVersion(data.version);
|
|
124
|
+
// Additional validation
|
|
125
|
+
if (data.bundleUrl) {
|
|
126
|
+
this.securityValidator.validateUrl(data.bundleUrl);
|
|
127
|
+
}
|
|
128
|
+
if (data.minAppVersion) {
|
|
129
|
+
this.securityValidator.validateVersion(data.minAppVersion);
|
|
130
|
+
}
|
|
131
|
+
// Cache the result
|
|
132
|
+
await this.cacheVersionInfo(cacheKey, channel, data);
|
|
133
|
+
this.logger.info('Version check completed', {
|
|
134
|
+
channel,
|
|
135
|
+
currentVersion,
|
|
136
|
+
latestVersion: data.version,
|
|
137
|
+
updateAvailable: this.isNewerVersion(data.version, currentVersion),
|
|
138
|
+
});
|
|
139
|
+
return data;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
this.logger.error('Failed to check for updates', error);
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Compare two versions
|
|
148
|
+
*/
|
|
149
|
+
isNewerVersion(version1, version2) {
|
|
150
|
+
try {
|
|
151
|
+
const v1 = this.parseVersion(version1);
|
|
152
|
+
const v2 = this.parseVersion(version2);
|
|
153
|
+
if (v1.major !== v2.major)
|
|
154
|
+
return v1.major > v2.major;
|
|
155
|
+
if (v1.minor !== v2.minor)
|
|
156
|
+
return v1.minor > v2.minor;
|
|
157
|
+
if (v1.patch !== v2.patch)
|
|
158
|
+
return v1.patch > v2.patch;
|
|
159
|
+
// If main versions are equal, check pre-release
|
|
160
|
+
if (v1.prerelease && !v2.prerelease)
|
|
161
|
+
return false; // v1 is pre-release, v2 is not
|
|
162
|
+
if (!v1.prerelease && v2.prerelease)
|
|
163
|
+
return true; // v1 is not pre-release, v2 is
|
|
164
|
+
if (v1.prerelease && v2.prerelease) {
|
|
165
|
+
return v1.prerelease > v2.prerelease;
|
|
166
|
+
}
|
|
167
|
+
return false; // Versions are equal
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
this.logger.error('Failed to compare versions', {
|
|
171
|
+
version1,
|
|
172
|
+
version2,
|
|
173
|
+
error,
|
|
174
|
+
});
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if update is mandatory based on minimum version
|
|
180
|
+
*/
|
|
181
|
+
isUpdateMandatory(currentVersion, minimumVersion) {
|
|
182
|
+
if (!minimumVersion)
|
|
183
|
+
return false;
|
|
184
|
+
try {
|
|
185
|
+
this.securityValidator.validateVersion(currentVersion);
|
|
186
|
+
this.securityValidator.validateVersion(minimumVersion);
|
|
187
|
+
return (!this.isNewerVersion(currentVersion, minimumVersion) &&
|
|
188
|
+
currentVersion !== minimumVersion);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
this.logger.error('Failed to check mandatory update', error);
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Parse version metadata
|
|
197
|
+
*/
|
|
198
|
+
parseVersion(version) {
|
|
199
|
+
const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/);
|
|
200
|
+
if (!match) {
|
|
201
|
+
throw new ValidationError(ErrorCode.INVALID_BUNDLE_FORMAT, 'Invalid version format');
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
major: parseInt(match[1], 10),
|
|
205
|
+
minor: parseInt(match[2], 10),
|
|
206
|
+
patch: parseInt(match[3], 10),
|
|
207
|
+
prerelease: match[4],
|
|
208
|
+
build: match[5],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Generate version string from components
|
|
213
|
+
*/
|
|
214
|
+
buildVersionString(components) {
|
|
215
|
+
let version = `${components.major}.${components.minor}.${components.patch}`;
|
|
216
|
+
if (components.prerelease) {
|
|
217
|
+
version += `-${components.prerelease}`;
|
|
218
|
+
}
|
|
219
|
+
if (components.build) {
|
|
220
|
+
version += `+${components.build}`;
|
|
221
|
+
}
|
|
222
|
+
return version;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check if version is compatible with native version requirements
|
|
226
|
+
*/
|
|
227
|
+
isCompatibleWithNativeVersion(bundleVersion, nativeVersion, compatibility) {
|
|
228
|
+
if (!compatibility)
|
|
229
|
+
return true;
|
|
230
|
+
try {
|
|
231
|
+
// Check if there's a specific native version requirement for this bundle version
|
|
232
|
+
const requiredNativeVersion = compatibility[bundleVersion];
|
|
233
|
+
if (!requiredNativeVersion)
|
|
234
|
+
return true;
|
|
235
|
+
this.securityValidator.validateVersion(nativeVersion);
|
|
236
|
+
this.securityValidator.validateVersion(requiredNativeVersion);
|
|
237
|
+
return !this.isNewerVersion(requiredNativeVersion, nativeVersion);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
this.logger.error('Failed to check compatibility', error);
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get version from cache
|
|
246
|
+
*/
|
|
247
|
+
async getCachedVersionInfo(cacheKey) {
|
|
248
|
+
// Check memory cache first
|
|
249
|
+
const memCached = this.memoryCache.get(cacheKey);
|
|
250
|
+
if (memCached && Date.now() - memCached.timestamp < this.CACHE_DURATION) {
|
|
251
|
+
return memCached;
|
|
252
|
+
}
|
|
253
|
+
// Check persistent cache
|
|
254
|
+
try {
|
|
255
|
+
const { value } = await this.preferences.get({
|
|
256
|
+
key: this.VERSION_CHECK_CACHE_KEY,
|
|
257
|
+
});
|
|
258
|
+
if (!value)
|
|
259
|
+
return null;
|
|
260
|
+
const allCached = JSON.parse(value);
|
|
261
|
+
const cached = allCached[cacheKey];
|
|
262
|
+
if (cached && Date.now() - cached.timestamp < this.CACHE_DURATION) {
|
|
263
|
+
// Update memory cache
|
|
264
|
+
this.memoryCache.set(cacheKey, cached);
|
|
265
|
+
return cached;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
this.logger.debug('Failed to load cached version info', error);
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Cache version info
|
|
275
|
+
*/
|
|
276
|
+
async cacheVersionInfo(cacheKey, channel, data) {
|
|
277
|
+
const cacheEntry = {
|
|
278
|
+
channel,
|
|
279
|
+
data,
|
|
280
|
+
timestamp: Date.now(),
|
|
281
|
+
};
|
|
282
|
+
// Update memory cache
|
|
283
|
+
this.memoryCache.set(cacheKey, cacheEntry);
|
|
284
|
+
// Update persistent cache
|
|
285
|
+
try {
|
|
286
|
+
const { value } = await this.preferences.get({
|
|
287
|
+
key: this.VERSION_CHECK_CACHE_KEY,
|
|
288
|
+
});
|
|
289
|
+
const allCached = value
|
|
290
|
+
? JSON.parse(value)
|
|
291
|
+
: {};
|
|
292
|
+
// Clean old entries
|
|
293
|
+
const now = Date.now();
|
|
294
|
+
for (const key in allCached) {
|
|
295
|
+
if (now - allCached[key].timestamp > this.CACHE_DURATION * 2) {
|
|
296
|
+
delete allCached[key];
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
allCached[cacheKey] = cacheEntry;
|
|
300
|
+
await this.preferences.set({
|
|
301
|
+
key: this.VERSION_CHECK_CACHE_KEY,
|
|
302
|
+
value: JSON.stringify(allCached),
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
this.logger.warn('Failed to cache version info', error);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Clear version cache
|
|
311
|
+
*/
|
|
312
|
+
async clearVersionCache() {
|
|
313
|
+
this.memoryCache.clear();
|
|
314
|
+
try {
|
|
315
|
+
await this.preferences.remove({ key: this.VERSION_CHECK_CACHE_KEY });
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
this.logger.warn('Failed to clear version cache', error);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Check if downgrade protection should block update
|
|
323
|
+
*/
|
|
324
|
+
shouldBlockDowngrade(currentVersion, newVersion) {
|
|
325
|
+
try {
|
|
326
|
+
return this.securityValidator.isVersionDowngrade(currentVersion, newVersion);
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
this.logger.error('Failed to check downgrade', error);
|
|
330
|
+
// Default to safe behavior - block if we can't determine
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=version-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-manager.js","sourceRoot":"","sources":["../../../src/live-update/version-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAS5D;;GAEG;AACH,MAAM,OAAO,cAAc;IAUzB;QATiB,4BAAuB,GACtC,uCAAuC,CAAC;QACzB,mBAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;QAIrD,gBAAW,GAA8B,IAAI,CAAC;QAC9C,gBAAW,GAAmC,IAAI,GAAG,EAAE,CAAC;QAG9D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAgB,EAAE,QAAgB;QACvD,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE5C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE9C,4BAA4B;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAE/B,IAAI,MAAM,GAAG,MAAM;oBAAE,OAAO,CAAC,CAAC;gBAC9B,IAAI,MAAM,GAAG,MAAM;oBAAE,OAAO,CAAC,CAAC,CAAC;YACjC,CAAC;YAED,kDAAkD;YAClD,IAAI,KAAK,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC,sBAAsB;YACtD,IAAI,CAAC,KAAK,IAAI,KAAK;gBAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB;YACrD,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;gBACnB,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YAED,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,WAAM,CAAC;YACP,IAAI,QAAQ,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAC;YACpC,OAAO,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAe;QACnC,OAAO,sDAAsD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CACjB,cAAsB,EACtB,UAAkB,EAClB,aAAsB;QAEtB,IACE,aAAa;YACb,cAAc,CAAC,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,EACjE,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,cAAc,CAAC,eAAe,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,kBAAkB,EAC5B,gEAAgE,CACjE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACnB,SAAiB,EACjB,OAAe,EACf,cAAsB,EACtB,KAAa;QAEb,kBAAkB;QAClB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,cAAc,EACxB,gCAAgC,CACjC,CAAC;QACJ,CAAC;QAED,oBAAoB;QACpB,MAAM,QAAQ,GAAG,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACzD,IACE,MAAM;YACN,MAAM,CAAC,OAAO,KAAK,OAAO;YAC1B,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EACnD,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;gBACjD,OAAO;gBACP,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;aAC7B,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC;YAC1C,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC5C,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACnD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACxC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,yCAAyC;YAErF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;gBAC3C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,cAAc;oBAC/B,UAAU,EAAE,KAAK;iBAClB;gBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aACvE,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,oBAAoB;YACpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,qBAAqB,EAC/B,+BAA+B,CAChC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErD,wBAAwB;YACxB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7D,CAAC;YAED,mBAAmB;YACnB,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAErD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAC1C,OAAO;gBACP,cAAc;gBACd,aAAa,EAAE,IAAI,CAAC,OAAO;gBAC3B,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;aACnE,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAgB,EAAE,QAAgB;QAC/C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAEvC,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;YACtD,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;YACtD,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;YAEtD,gDAAgD;YAChD,IAAI,EAAE,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC,CAAC,+BAA+B;YAClF,IAAI,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC,CAAC,+BAA+B;YACjF,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;gBACnC,OAAO,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;YACvC,CAAC;YAED,OAAO,KAAK,CAAC,CAAC,qBAAqB;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;gBAC9C,QAAQ;gBACR,QAAQ;gBACR,KAAK;aACN,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,cAAsB,EAAE,cAAuB;QAC/D,IAAI,CAAC,cAAc;YAAE,OAAO,KAAK,CAAC;QAElC,IAAI,CAAC;YACH,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YACvD,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YACvD,OAAO,CACL,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,CAAC;gBACpD,cAAc,KAAK,cAAc,CAClC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe;QAO1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CACzB,0GAA0G,CAC3G,CAAC;QAEF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,qBAAqB,EAC/B,wBAAwB,CACzB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7B,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YACpB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;SAChB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,UAMlB;QACC,IAAI,OAAO,GAAG,GAAG,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QAE5E,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC1B,OAAO,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QACzC,CAAC;QAED,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,6BAA6B,CAC3B,aAAqB,EACrB,aAAqB,EACrB,aAAyC;QAEzC,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAEhC,IAAI,CAAC;YACH,iFAAiF;YACjF,MAAM,qBAAqB,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,CAAC,qBAAqB;gBAAE,OAAO,IAAI,CAAC;YAExC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;YACtD,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;YAE9D,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAChC,QAAgB;QAEhB,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACxE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,WAAY,CAAC,GAAG,CAAC;gBAC5C,GAAG,EAAE,IAAI,CAAC,uBAAuB;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAExB,MAAM,SAAS,GAAsC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAEnC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBAClE,sBAAsB;gBACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACvC,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,QAAgB,EAChB,OAAe,EACf,IAAmB;QAEnB,MAAM,UAAU,GAAsB;YACpC,OAAO;YACP,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,sBAAsB;QACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE3C,0BAA0B;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,WAAY,CAAC,GAAG,CAAC;gBAC5C,GAAG,EAAE,IAAI,CAAC,uBAAuB;aAClC,CAAC,CAAC;YACH,MAAM,SAAS,GAAsC,KAAK;gBACxD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBACnB,CAAC,CAAC,EAAE,CAAC;YAEP,oBAAoB;YACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC5B,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBAC7D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,SAAS,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;YAEjC,MAAM,IAAI,CAAC,WAAY,CAAC,GAAG,CAAC;gBAC1B,GAAG,EAAE,IAAI,CAAC,uBAAuB;gBACjC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAY,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,cAAsB,EAAE,UAAkB;QAC7D,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAC9C,cAAc,EACd,UAAU,CACX,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACtD,yDAAyD;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { registerPlugin } from '@capacitor/core';
|
|
2
|
+
import { SyncStatus, BundleStatus, UpdateErrorCode } from './definitions';
|
|
3
|
+
import { PluginManager } from './core/plugin-manager';
|
|
4
|
+
import { CapacitorNativeUpdateError, ErrorCode } from './core/errors';
|
|
5
|
+
/**
|
|
6
|
+
* Web implementation of the Capacitor Native Update Plugin
|
|
7
|
+
*/
|
|
8
|
+
class CapacitorNativeUpdatePluginWeb {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.initialized = false;
|
|
11
|
+
this.pluginManager = PluginManager.getInstance();
|
|
12
|
+
}
|
|
13
|
+
// Main plugin methods
|
|
14
|
+
async initialize(config) {
|
|
15
|
+
await this.pluginManager.initialize(config);
|
|
16
|
+
this.initialized = true;
|
|
17
|
+
}
|
|
18
|
+
isInitialized() {
|
|
19
|
+
return this.initialized && this.pluginManager.isInitialized();
|
|
20
|
+
}
|
|
21
|
+
async reset() {
|
|
22
|
+
await this.pluginManager.reset();
|
|
23
|
+
}
|
|
24
|
+
async cleanup() {
|
|
25
|
+
await this.pluginManager.cleanup();
|
|
26
|
+
}
|
|
27
|
+
// NativeUpdatePlugin methods
|
|
28
|
+
async configure(options) {
|
|
29
|
+
if (!this.initialized) {
|
|
30
|
+
throw new CapacitorNativeUpdateError(ErrorCode.NOT_CONFIGURED, 'Plugin not initialized. Call initialize() first.');
|
|
31
|
+
}
|
|
32
|
+
// Apply plugin configuration
|
|
33
|
+
const configManager = this.pluginManager.getConfigManager();
|
|
34
|
+
configManager.configure(options.config);
|
|
35
|
+
}
|
|
36
|
+
async getSecurityInfo() {
|
|
37
|
+
return {
|
|
38
|
+
enforceHttps: true,
|
|
39
|
+
certificatePinning: {
|
|
40
|
+
enabled: false,
|
|
41
|
+
pins: [],
|
|
42
|
+
},
|
|
43
|
+
validateInputs: true,
|
|
44
|
+
secureStorage: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// LiveUpdatePlugin methods
|
|
48
|
+
async sync(_options) {
|
|
49
|
+
const bundleManager = this.pluginManager.getBundleManager();
|
|
50
|
+
try {
|
|
51
|
+
// Check for updates
|
|
52
|
+
const currentBundle = await bundleManager.getActiveBundle();
|
|
53
|
+
const currentVersion = (currentBundle === null || currentBundle === void 0 ? void 0 : currentBundle.version) || '1.0.0';
|
|
54
|
+
// For now, return up-to-date status
|
|
55
|
+
return {
|
|
56
|
+
status: SyncStatus.UP_TO_DATE,
|
|
57
|
+
version: currentVersion,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return {
|
|
62
|
+
status: SyncStatus.ERROR,
|
|
63
|
+
error: {
|
|
64
|
+
code: UpdateErrorCode.UNKNOWN_ERROR,
|
|
65
|
+
message: error instanceof Error ? error.message : 'Sync failed',
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async download(options) {
|
|
71
|
+
const downloadManager = this.pluginManager.getDownloadManager();
|
|
72
|
+
const bundleManager = this.pluginManager.getBundleManager();
|
|
73
|
+
const blob = await downloadManager.downloadWithRetry(options.url, options.version);
|
|
74
|
+
const path = await downloadManager.saveBlob(options.version, blob);
|
|
75
|
+
const bundleInfo = {
|
|
76
|
+
bundleId: options.version,
|
|
77
|
+
version: options.version,
|
|
78
|
+
path,
|
|
79
|
+
downloadTime: Date.now(),
|
|
80
|
+
size: blob.size,
|
|
81
|
+
status: BundleStatus.READY,
|
|
82
|
+
checksum: options.checksum,
|
|
83
|
+
signature: options.signature,
|
|
84
|
+
verified: false,
|
|
85
|
+
};
|
|
86
|
+
await bundleManager.saveBundleInfo(bundleInfo);
|
|
87
|
+
return bundleInfo;
|
|
88
|
+
}
|
|
89
|
+
async set(bundle) {
|
|
90
|
+
const bundleManager = this.pluginManager.getBundleManager();
|
|
91
|
+
await bundleManager.setActiveBundle(bundle.bundleId);
|
|
92
|
+
}
|
|
93
|
+
async reload() {
|
|
94
|
+
// In web implementation, we can reload the page
|
|
95
|
+
if (typeof window !== 'undefined') {
|
|
96
|
+
window.location.reload();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async current() {
|
|
100
|
+
const bundleManager = this.pluginManager.getBundleManager();
|
|
101
|
+
const bundle = await bundleManager.getActiveBundle();
|
|
102
|
+
if (!bundle) {
|
|
103
|
+
throw new CapacitorNativeUpdateError(ErrorCode.FILE_NOT_FOUND, 'No active bundle found');
|
|
104
|
+
}
|
|
105
|
+
return bundle;
|
|
106
|
+
}
|
|
107
|
+
async list() {
|
|
108
|
+
const bundleManager = this.pluginManager.getBundleManager();
|
|
109
|
+
return bundleManager.getAllBundles();
|
|
110
|
+
}
|
|
111
|
+
async delete(options) {
|
|
112
|
+
const bundleManager = this.pluginManager.getBundleManager();
|
|
113
|
+
if (options.bundleId) {
|
|
114
|
+
await bundleManager.deleteBundle(options.bundleId);
|
|
115
|
+
}
|
|
116
|
+
else if (options.keepVersions !== undefined) {
|
|
117
|
+
// Delete old versions keeping the specified number
|
|
118
|
+
const bundles = await bundleManager.getAllBundles();
|
|
119
|
+
const sortedBundles = bundles.sort((a, b) => b.downloadTime - a.downloadTime);
|
|
120
|
+
for (let i = options.keepVersions; i < sortedBundles.length; i++) {
|
|
121
|
+
await bundleManager.deleteBundle(sortedBundles[i].bundleId);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async notifyAppReady() {
|
|
126
|
+
// Mark the current bundle as stable
|
|
127
|
+
const bundleManager = this.pluginManager.getBundleManager();
|
|
128
|
+
const activeBundle = await bundleManager.getActiveBundle();
|
|
129
|
+
if (activeBundle) {
|
|
130
|
+
activeBundle.status = BundleStatus.ACTIVE;
|
|
131
|
+
await bundleManager.saveBundleInfo(activeBundle);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async getLatest() {
|
|
135
|
+
// For web, we'll return no update available
|
|
136
|
+
return {
|
|
137
|
+
available: false,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
async setChannel(channel) {
|
|
141
|
+
// Store the channel preference
|
|
142
|
+
const preferences = this.pluginManager
|
|
143
|
+
.getConfigManager()
|
|
144
|
+
.get('preferences');
|
|
145
|
+
if (preferences) {
|
|
146
|
+
await preferences.set({
|
|
147
|
+
key: 'update_channel',
|
|
148
|
+
value: channel,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async setUpdateUrl(url) {
|
|
153
|
+
const configManager = this.pluginManager.getConfigManager();
|
|
154
|
+
configManager.configure({ baseUrl: url });
|
|
155
|
+
}
|
|
156
|
+
async validateUpdate(options) {
|
|
157
|
+
const securityValidator = this.pluginManager.getSecurityValidator();
|
|
158
|
+
try {
|
|
159
|
+
// Validate checksum
|
|
160
|
+
const isValid = await securityValidator.validateChecksum(new ArrayBuffer(0), // Placeholder for bundle data
|
|
161
|
+
options.checksum);
|
|
162
|
+
return {
|
|
163
|
+
isValid,
|
|
164
|
+
details: {
|
|
165
|
+
checksumValid: isValid,
|
|
166
|
+
signatureValid: true,
|
|
167
|
+
sizeValid: true,
|
|
168
|
+
versionValid: true,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return {
|
|
174
|
+
isValid: false,
|
|
175
|
+
error: error instanceof Error ? error.message : 'Validation failed',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// AppUpdatePlugin methods
|
|
180
|
+
async getAppUpdateInfo() {
|
|
181
|
+
// Web doesn't have native app updates
|
|
182
|
+
return {
|
|
183
|
+
updateAvailable: false,
|
|
184
|
+
currentVersion: '1.0.0',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
async performImmediateUpdate() {
|
|
188
|
+
throw new CapacitorNativeUpdateError(ErrorCode.PLATFORM_NOT_SUPPORTED, 'Native app updates are not supported on web');
|
|
189
|
+
}
|
|
190
|
+
async startFlexibleUpdate() {
|
|
191
|
+
throw new CapacitorNativeUpdateError(ErrorCode.PLATFORM_NOT_SUPPORTED, 'Native app updates are not supported on web');
|
|
192
|
+
}
|
|
193
|
+
async completeFlexibleUpdate() {
|
|
194
|
+
throw new CapacitorNativeUpdateError(ErrorCode.PLATFORM_NOT_SUPPORTED, 'Native app updates are not supported on web');
|
|
195
|
+
}
|
|
196
|
+
async openAppStore(_options) {
|
|
197
|
+
throw new CapacitorNativeUpdateError(ErrorCode.PLATFORM_NOT_SUPPORTED, 'App store is not available on web');
|
|
198
|
+
}
|
|
199
|
+
// AppReviewPlugin methods
|
|
200
|
+
async requestReview() {
|
|
201
|
+
return {
|
|
202
|
+
displayed: false,
|
|
203
|
+
error: 'Reviews are not supported on web',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
async canRequestReview() {
|
|
207
|
+
return {
|
|
208
|
+
canRequest: false,
|
|
209
|
+
reason: 'Reviews are not supported on web',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// BackgroundUpdatePlugin methods
|
|
213
|
+
async enableBackgroundUpdates(config) {
|
|
214
|
+
// Store the configuration
|
|
215
|
+
const preferences = this.pluginManager
|
|
216
|
+
.getConfigManager()
|
|
217
|
+
.get('preferences');
|
|
218
|
+
if (preferences) {
|
|
219
|
+
await preferences.set({
|
|
220
|
+
key: 'background_update_config',
|
|
221
|
+
value: JSON.stringify(config),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async disableBackgroundUpdates() {
|
|
226
|
+
const preferences = this.pluginManager
|
|
227
|
+
.getConfigManager()
|
|
228
|
+
.get('preferences');
|
|
229
|
+
if (preferences) {
|
|
230
|
+
await preferences.remove({ key: 'background_update_config' });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async getBackgroundUpdateStatus() {
|
|
234
|
+
return {
|
|
235
|
+
enabled: false,
|
|
236
|
+
isRunning: false,
|
|
237
|
+
checkCount: 0,
|
|
238
|
+
failureCount: 0,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
async scheduleBackgroundCheck(_interval) {
|
|
242
|
+
// Not supported on web
|
|
243
|
+
throw new CapacitorNativeUpdateError(ErrorCode.PLATFORM_NOT_SUPPORTED, 'Background updates are not supported on web');
|
|
244
|
+
}
|
|
245
|
+
async triggerBackgroundCheck() {
|
|
246
|
+
return {
|
|
247
|
+
success: false,
|
|
248
|
+
updatesFound: false,
|
|
249
|
+
notificationSent: false,
|
|
250
|
+
error: {
|
|
251
|
+
code: UpdateErrorCode.PLATFORM_NOT_SUPPORTED,
|
|
252
|
+
message: 'Background updates are not supported on web',
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
async setNotificationPreferences(preferences) {
|
|
257
|
+
// Store preferences but notifications aren't supported on web
|
|
258
|
+
const prefs = this.pluginManager.getConfigManager().get('preferences');
|
|
259
|
+
if (prefs) {
|
|
260
|
+
await prefs.set({
|
|
261
|
+
key: 'notification_preferences',
|
|
262
|
+
value: JSON.stringify(preferences),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async getNotificationPermissions() {
|
|
267
|
+
return {
|
|
268
|
+
granted: false,
|
|
269
|
+
canRequest: false,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
async requestNotificationPermissions() {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Register the plugin
|
|
278
|
+
*/
|
|
279
|
+
const CapacitorNativeUpdate = registerPlugin('CapacitorNativeUpdate', {
|
|
280
|
+
web: () => new CapacitorNativeUpdatePluginWeb(),
|
|
281
|
+
});
|
|
282
|
+
export { CapacitorNativeUpdate };
|
|
283
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cryptographic utilities for bundle verification
|
|
3
|
+
*/
|
|
4
|
+
export declare class CryptoUtils {
|
|
5
|
+
/**
|
|
6
|
+
* Calculate SHA-256 checksum of data
|
|
7
|
+
*/
|
|
8
|
+
static calculateChecksum(data: ArrayBuffer | string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Verify signature using public key
|
|
11
|
+
*/
|
|
12
|
+
static verifySignature(data: ArrayBuffer | string, signature: string, publicKey: string): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Convert base64 string to ArrayBuffer
|
|
15
|
+
*/
|
|
16
|
+
private static base64ToArrayBuffer;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a random nonce
|
|
19
|
+
*/
|
|
20
|
+
static generateNonce(length?: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Validate checksum format
|
|
23
|
+
*/
|
|
24
|
+
static isValidChecksum(checksum: string, algorithm?: 'SHA-256' | 'SHA-512'): boolean;
|
|
25
|
+
}
|