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,195 @@
|
|
|
1
|
+
import { BackgroundUpdateType, UpdateErrorCode } from '../definitions';
|
|
2
|
+
export class BackgroundScheduler {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.config = null;
|
|
5
|
+
this.status = {
|
|
6
|
+
enabled: false,
|
|
7
|
+
isRunning: false,
|
|
8
|
+
checkCount: 0,
|
|
9
|
+
failureCount: 0,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
configure(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.status.enabled = config.enabled;
|
|
15
|
+
}
|
|
16
|
+
getStatus() {
|
|
17
|
+
return Object.assign({}, this.status);
|
|
18
|
+
}
|
|
19
|
+
async performCheck() {
|
|
20
|
+
var _a;
|
|
21
|
+
if (!((_a = this.config) === null || _a === void 0 ? void 0 : _a.enabled)) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
updatesFound: false,
|
|
25
|
+
notificationSent: false,
|
|
26
|
+
error: {
|
|
27
|
+
code: UpdateErrorCode.INVALID_CONFIG,
|
|
28
|
+
message: 'Background updates not enabled',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
this.status.isRunning = true;
|
|
33
|
+
this.status.checkCount++;
|
|
34
|
+
try {
|
|
35
|
+
const result = await this.checkForUpdates();
|
|
36
|
+
this.status.lastCheckTime = Date.now();
|
|
37
|
+
this.status.isRunning = false;
|
|
38
|
+
this.status.lastError = undefined;
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
this.status.failureCount++;
|
|
43
|
+
this.status.isRunning = false;
|
|
44
|
+
this.status.lastError = {
|
|
45
|
+
code: UpdateErrorCode.UNKNOWN_ERROR,
|
|
46
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
updatesFound: false,
|
|
51
|
+
notificationSent: false,
|
|
52
|
+
error: this.status.lastError,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async checkForUpdates() {
|
|
57
|
+
var _a, _b, _c, _d, _e, _f;
|
|
58
|
+
const promises = [];
|
|
59
|
+
let appUpdate;
|
|
60
|
+
let liveUpdate;
|
|
61
|
+
if (((_a = this.config) === null || _a === void 0 ? void 0 : _a.updateTypes.includes(BackgroundUpdateType.APP_UPDATE)) ||
|
|
62
|
+
((_b = this.config) === null || _b === void 0 ? void 0 : _b.updateTypes.includes(BackgroundUpdateType.BOTH))) {
|
|
63
|
+
promises.push(this.checkAppUpdate());
|
|
64
|
+
}
|
|
65
|
+
if (((_c = this.config) === null || _c === void 0 ? void 0 : _c.updateTypes.includes(BackgroundUpdateType.LIVE_UPDATE)) ||
|
|
66
|
+
((_d = this.config) === null || _d === void 0 ? void 0 : _d.updateTypes.includes(BackgroundUpdateType.BOTH))) {
|
|
67
|
+
promises.push(this.checkLiveUpdate());
|
|
68
|
+
}
|
|
69
|
+
const results = await Promise.allSettled(promises);
|
|
70
|
+
if (((_e = results[0]) === null || _e === void 0 ? void 0 : _e.status) === 'fulfilled') {
|
|
71
|
+
appUpdate = results[0].value;
|
|
72
|
+
}
|
|
73
|
+
if (((_f = results[1]) === null || _f === void 0 ? void 0 : _f.status) === 'fulfilled') {
|
|
74
|
+
liveUpdate = results[1].value;
|
|
75
|
+
}
|
|
76
|
+
const updatesFound = (appUpdate === null || appUpdate === void 0 ? void 0 : appUpdate.updateAvailable) || (liveUpdate === null || liveUpdate === void 0 ? void 0 : liveUpdate.available) || false;
|
|
77
|
+
let notificationSent = false;
|
|
78
|
+
if (updatesFound) {
|
|
79
|
+
notificationSent = await this.sendNotification(appUpdate, liveUpdate);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
updatesFound,
|
|
84
|
+
appUpdate,
|
|
85
|
+
liveUpdate,
|
|
86
|
+
notificationSent,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async checkAppUpdate() {
|
|
90
|
+
// Implementation for checking app updates
|
|
91
|
+
// This would normally call the native platform or server API
|
|
92
|
+
try {
|
|
93
|
+
// Simulate app update check
|
|
94
|
+
const currentVersion = '1.0.0';
|
|
95
|
+
const availableVersion = '1.1.0';
|
|
96
|
+
// In real implementation, this would check with app store or server
|
|
97
|
+
const updateAvailable = this.compareVersions(currentVersion, availableVersion) < 0;
|
|
98
|
+
return {
|
|
99
|
+
updateAvailable,
|
|
100
|
+
currentVersion,
|
|
101
|
+
availableVersion,
|
|
102
|
+
updatePriority: updateAvailable ? 3 : undefined, // 3 = MEDIUM priority
|
|
103
|
+
// releaseNotes: updateAvailable
|
|
104
|
+
// ? 'Bug fixes and performance improvements'
|
|
105
|
+
// : undefined,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error('Failed to check app update:', error);
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async checkLiveUpdate() {
|
|
114
|
+
// Implementation for checking live updates
|
|
115
|
+
try {
|
|
116
|
+
// In real implementation, this would call the update server
|
|
117
|
+
const currentVersion = '1.0.0';
|
|
118
|
+
const latestVersion = '1.0.1';
|
|
119
|
+
const updateAvailable = this.compareVersions(currentVersion, latestVersion) < 0;
|
|
120
|
+
const result = {
|
|
121
|
+
available: updateAvailable,
|
|
122
|
+
version: latestVersion,
|
|
123
|
+
url: updateAvailable ? 'https://updates.example.com/v1.0.1' : undefined,
|
|
124
|
+
notes: updateAvailable ? 'Minor bug fixes' : undefined,
|
|
125
|
+
size: updateAvailable ? 1024 * 1024 * 5 : undefined, // 5MB
|
|
126
|
+
};
|
|
127
|
+
// Store checksum separately if needed
|
|
128
|
+
result.checksum = updateAvailable ? 'abc123def456' : undefined;
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error('Failed to check live update:', error);
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async sendNotification(appUpdate, liveUpdate) {
|
|
137
|
+
var _a;
|
|
138
|
+
// Implementation for sending notifications
|
|
139
|
+
try {
|
|
140
|
+
// Check if notifications are enabled in config
|
|
141
|
+
const notificationEnabled = (_a = this.config) === null || _a === void 0 ? void 0 : _a.notificationEnabled;
|
|
142
|
+
if (!notificationEnabled) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
let title = 'Update Available';
|
|
146
|
+
let body = '';
|
|
147
|
+
if (appUpdate === null || appUpdate === void 0 ? void 0 : appUpdate.updateAvailable) {
|
|
148
|
+
title = 'App Update Available';
|
|
149
|
+
body = `Version ${appUpdate.availableVersion} is ready to install.`;
|
|
150
|
+
}
|
|
151
|
+
else if (liveUpdate === null || liveUpdate === void 0 ? void 0 : liveUpdate.available) {
|
|
152
|
+
title = 'New Update Available';
|
|
153
|
+
body = `Version ${liveUpdate.version} is ready to download. ${liveUpdate.notes || ''}`;
|
|
154
|
+
}
|
|
155
|
+
// In real implementation, this would use native notification APIs
|
|
156
|
+
console.log('Sending notification:', { title, body });
|
|
157
|
+
// Simulate notification sent
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
console.error('Failed to send notification:', error);
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
calculateNextCheckTime() {
|
|
166
|
+
var _a;
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
const interval = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.checkInterval) || 24 * 60 * 60 * 1000; // Default 24 hours
|
|
169
|
+
return now + interval;
|
|
170
|
+
}
|
|
171
|
+
shouldRespectBatteryOptimization() {
|
|
172
|
+
var _a, _b;
|
|
173
|
+
return (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.respectBatteryOptimization) !== null && _b !== void 0 ? _b : true;
|
|
174
|
+
}
|
|
175
|
+
isNetworkConditionMet() {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
isBatteryLevelSufficient() {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
compareVersions(version1, version2) {
|
|
182
|
+
const v1Parts = version1.split('.').map(Number);
|
|
183
|
+
const v2Parts = version2.split('.').map(Number);
|
|
184
|
+
for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
|
|
185
|
+
const v1Part = v1Parts[i] || 0;
|
|
186
|
+
const v2Part = v2Parts[i] || 0;
|
|
187
|
+
if (v1Part > v2Part)
|
|
188
|
+
return 1;
|
|
189
|
+
if (v1Part < v2Part)
|
|
190
|
+
return -1;
|
|
191
|
+
}
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=background-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-scheduler.js","sourceRoot":"","sources":["../../../src/background-update/background-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/background-update/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { NotificationPreferences, NotificationPermissionStatus, AppUpdateInfo, LatestVersion } from '../definitions';
|
|
2
|
+
import { NotificationPriority } from '../definitions';
|
|
3
|
+
export interface NotificationData {
|
|
4
|
+
title: string;
|
|
5
|
+
body: string;
|
|
6
|
+
data?: Record<string, unknown>;
|
|
7
|
+
actions?: NotificationAction[];
|
|
8
|
+
}
|
|
9
|
+
export interface NotificationAction {
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
icon?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare abstract class NotificationManager {
|
|
15
|
+
protected preferences: NotificationPreferences;
|
|
16
|
+
setPreferences(preferences: NotificationPreferences): void;
|
|
17
|
+
abstract getPermissionStatus(): Promise<NotificationPermissionStatus>;
|
|
18
|
+
abstract requestPermissions(): Promise<boolean>;
|
|
19
|
+
abstract showNotification(data: NotificationData): Promise<boolean>;
|
|
20
|
+
abstract cancelNotification(id: string): Promise<void>;
|
|
21
|
+
abstract setupNotificationChannels(): Promise<void>;
|
|
22
|
+
sendUpdateNotification(appUpdate?: AppUpdateInfo, liveUpdate?: LatestVersion): Promise<boolean>;
|
|
23
|
+
protected createNotificationData(appUpdate?: AppUpdateInfo, liveUpdate?: LatestVersion): NotificationData;
|
|
24
|
+
protected getChannelId(): string;
|
|
25
|
+
protected getChannelName(): string;
|
|
26
|
+
protected getPriority(): NotificationPriority;
|
|
27
|
+
protected shouldPlaySound(): boolean;
|
|
28
|
+
protected shouldVibrate(): boolean;
|
|
29
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { NotificationPriority } from '../definitions';
|
|
2
|
+
export class NotificationManager {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.preferences = {
|
|
5
|
+
title: 'App Update Available',
|
|
6
|
+
description: 'A new version of the app is available',
|
|
7
|
+
soundEnabled: true,
|
|
8
|
+
vibrationEnabled: true,
|
|
9
|
+
showActions: true,
|
|
10
|
+
actionLabels: {
|
|
11
|
+
updateNow: 'Update Now',
|
|
12
|
+
updateLater: 'Later',
|
|
13
|
+
dismiss: 'Dismiss',
|
|
14
|
+
},
|
|
15
|
+
priority: NotificationPriority.DEFAULT,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
setPreferences(preferences) {
|
|
19
|
+
this.preferences = Object.assign(Object.assign({}, this.preferences), preferences);
|
|
20
|
+
}
|
|
21
|
+
async sendUpdateNotification(appUpdate, liveUpdate) {
|
|
22
|
+
const permissions = await this.getPermissionStatus();
|
|
23
|
+
if (!permissions.granted) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const notificationData = this.createNotificationData(appUpdate, liveUpdate);
|
|
27
|
+
return this.showNotification(notificationData);
|
|
28
|
+
}
|
|
29
|
+
createNotificationData(appUpdate, liveUpdate) {
|
|
30
|
+
var _a, _b, _c;
|
|
31
|
+
let title = this.preferences.title || 'App Update Available';
|
|
32
|
+
let body = this.preferences.description || 'A new version of the app is available';
|
|
33
|
+
if ((appUpdate === null || appUpdate === void 0 ? void 0 : appUpdate.updateAvailable) && (liveUpdate === null || liveUpdate === void 0 ? void 0 : liveUpdate.available)) {
|
|
34
|
+
title = 'App Updates Available';
|
|
35
|
+
body = `App version ${appUpdate.availableVersion} and content updates are available`;
|
|
36
|
+
}
|
|
37
|
+
else if (appUpdate === null || appUpdate === void 0 ? void 0 : appUpdate.updateAvailable) {
|
|
38
|
+
title = 'App Update Available';
|
|
39
|
+
body = `Version ${appUpdate.availableVersion} is available`;
|
|
40
|
+
}
|
|
41
|
+
else if (liveUpdate === null || liveUpdate === void 0 ? void 0 : liveUpdate.available) {
|
|
42
|
+
title = 'Content Update Available';
|
|
43
|
+
body = `New content version ${liveUpdate.version} is available`;
|
|
44
|
+
}
|
|
45
|
+
const actions = [];
|
|
46
|
+
if (this.preferences.showActions) {
|
|
47
|
+
actions.push({
|
|
48
|
+
id: 'update_now',
|
|
49
|
+
title: ((_a = this.preferences.actionLabels) === null || _a === void 0 ? void 0 : _a.updateNow) || 'Update Now',
|
|
50
|
+
});
|
|
51
|
+
actions.push({
|
|
52
|
+
id: 'update_later',
|
|
53
|
+
title: ((_b = this.preferences.actionLabels) === null || _b === void 0 ? void 0 : _b.updateLater) || 'Later',
|
|
54
|
+
});
|
|
55
|
+
actions.push({
|
|
56
|
+
id: 'dismiss',
|
|
57
|
+
title: ((_c = this.preferences.actionLabels) === null || _c === void 0 ? void 0 : _c.dismiss) || 'Dismiss',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
title,
|
|
62
|
+
body,
|
|
63
|
+
data: {
|
|
64
|
+
type: 'update_available',
|
|
65
|
+
appUpdate,
|
|
66
|
+
liveUpdate,
|
|
67
|
+
},
|
|
68
|
+
actions,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
getChannelId() {
|
|
72
|
+
return this.preferences.channelId || 'capacitor_native_update';
|
|
73
|
+
}
|
|
74
|
+
getChannelName() {
|
|
75
|
+
return this.preferences.channelName || 'App Updates';
|
|
76
|
+
}
|
|
77
|
+
getPriority() {
|
|
78
|
+
return this.preferences.priority || NotificationPriority.DEFAULT;
|
|
79
|
+
}
|
|
80
|
+
shouldPlaySound() {
|
|
81
|
+
var _a;
|
|
82
|
+
return (_a = this.preferences.soundEnabled) !== null && _a !== void 0 ? _a : true;
|
|
83
|
+
}
|
|
84
|
+
shouldVibrate() {
|
|
85
|
+
var _a;
|
|
86
|
+
return (_a = this.preferences.vibrationEnabled) !== null && _a !== void 0 ? _a : true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=notification-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-manager.js","sourceRoot":"","sources":["../../../src/background-update/notification-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface UpdateEvent {
|
|
2
|
+
type: 'check' | 'download' | 'install' | 'error' | 'rollback';
|
|
3
|
+
version?: string;
|
|
4
|
+
success: boolean;
|
|
5
|
+
duration?: number;
|
|
6
|
+
error?: string;
|
|
7
|
+
metadata?: Record<string, any>;
|
|
8
|
+
}
|
|
9
|
+
export interface AnalyticsProvider {
|
|
10
|
+
trackEvent(event: UpdateEvent): Promise<void>;
|
|
11
|
+
trackError(error: Error, context?: Record<string, any>): Promise<void>;
|
|
12
|
+
setUserId(userId: string): void;
|
|
13
|
+
setProperties(properties: Record<string, any>): void;
|
|
14
|
+
}
|
|
15
|
+
export declare class Analytics {
|
|
16
|
+
private static instance;
|
|
17
|
+
private providers;
|
|
18
|
+
private readonly logger;
|
|
19
|
+
private userId?;
|
|
20
|
+
private properties;
|
|
21
|
+
private constructor();
|
|
22
|
+
static getInstance(): Analytics;
|
|
23
|
+
/**
|
|
24
|
+
* Add an analytics provider
|
|
25
|
+
*/
|
|
26
|
+
addProvider(provider: AnalyticsProvider): void;
|
|
27
|
+
/**
|
|
28
|
+
* Track an update event
|
|
29
|
+
*/
|
|
30
|
+
trackEvent(event: UpdateEvent): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Track an error
|
|
33
|
+
*/
|
|
34
|
+
trackError(error: Error, context?: Record<string, any>): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Set user ID for analytics
|
|
37
|
+
*/
|
|
38
|
+
setUserId(userId: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Set global properties
|
|
41
|
+
*/
|
|
42
|
+
setProperties(properties: Record<string, any>): void;
|
|
43
|
+
/**
|
|
44
|
+
* Track update check
|
|
45
|
+
*/
|
|
46
|
+
trackUpdateCheck(available: boolean, version?: string): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Track download progress
|
|
49
|
+
*/
|
|
50
|
+
trackDownload(version: string, success: boolean, error?: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Track installation
|
|
53
|
+
*/
|
|
54
|
+
trackInstall(version: string, success: boolean, error?: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Track rollback
|
|
57
|
+
*/
|
|
58
|
+
trackRollback(fromVersion: string, toVersion: string, reason: string): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Console analytics provider for development
|
|
62
|
+
*/
|
|
63
|
+
export declare class ConsoleAnalyticsProvider implements AnalyticsProvider {
|
|
64
|
+
private userId?;
|
|
65
|
+
private properties;
|
|
66
|
+
trackEvent(event: UpdateEvent): Promise<void>;
|
|
67
|
+
trackError(error: Error, context?: Record<string, any>): Promise<void>;
|
|
68
|
+
setUserId(userId: string): void;
|
|
69
|
+
setProperties(properties: Record<string, any>): void;
|
|
70
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Logger } from './logger';
|
|
2
|
+
export class Analytics {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.providers = [];
|
|
5
|
+
this.properties = {};
|
|
6
|
+
this.logger = Logger.getInstance();
|
|
7
|
+
}
|
|
8
|
+
static getInstance() {
|
|
9
|
+
if (!Analytics.instance) {
|
|
10
|
+
Analytics.instance = new Analytics();
|
|
11
|
+
}
|
|
12
|
+
return Analytics.instance;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Add an analytics provider
|
|
16
|
+
*/
|
|
17
|
+
addProvider(provider) {
|
|
18
|
+
this.providers.push(provider);
|
|
19
|
+
// Set existing user ID and properties
|
|
20
|
+
if (this.userId) {
|
|
21
|
+
provider.setUserId(this.userId);
|
|
22
|
+
}
|
|
23
|
+
if (Object.keys(this.properties).length > 0) {
|
|
24
|
+
provider.setProperties(this.properties);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Track an update event
|
|
29
|
+
*/
|
|
30
|
+
async trackEvent(event) {
|
|
31
|
+
this.logger.debug('Analytics event', event);
|
|
32
|
+
const promises = this.providers.map((provider) => provider
|
|
33
|
+
.trackEvent(event)
|
|
34
|
+
.catch((error) => this.logger.error('Analytics provider error', error)));
|
|
35
|
+
await Promise.all(promises);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Track an error
|
|
39
|
+
*/
|
|
40
|
+
async trackError(error, context) {
|
|
41
|
+
this.logger.error('Analytics error', { error, context });
|
|
42
|
+
const promises = this.providers.map((provider) => provider
|
|
43
|
+
.trackError(error, context)
|
|
44
|
+
.catch((err) => this.logger.error('Analytics provider error', err)));
|
|
45
|
+
await Promise.all(promises);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Set user ID for analytics
|
|
49
|
+
*/
|
|
50
|
+
setUserId(userId) {
|
|
51
|
+
this.userId = userId;
|
|
52
|
+
this.providers.forEach((provider) => provider.setUserId(userId));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Set global properties
|
|
56
|
+
*/
|
|
57
|
+
setProperties(properties) {
|
|
58
|
+
this.properties = Object.assign(Object.assign({}, this.properties), properties);
|
|
59
|
+
this.providers.forEach((provider) => provider.setProperties(this.properties));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Track update check
|
|
63
|
+
*/
|
|
64
|
+
async trackUpdateCheck(available, version) {
|
|
65
|
+
const startTime = Date.now();
|
|
66
|
+
await this.trackEvent({
|
|
67
|
+
type: 'check',
|
|
68
|
+
version,
|
|
69
|
+
success: true,
|
|
70
|
+
metadata: { updateAvailable: available },
|
|
71
|
+
duration: Date.now() - startTime,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Track download progress
|
|
76
|
+
*/
|
|
77
|
+
async trackDownload(version, success, error) {
|
|
78
|
+
await this.trackEvent({
|
|
79
|
+
type: 'download',
|
|
80
|
+
version,
|
|
81
|
+
success,
|
|
82
|
+
error,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Track installation
|
|
87
|
+
*/
|
|
88
|
+
async trackInstall(version, success, error) {
|
|
89
|
+
await this.trackEvent({
|
|
90
|
+
type: 'install',
|
|
91
|
+
version,
|
|
92
|
+
success,
|
|
93
|
+
error,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Track rollback
|
|
98
|
+
*/
|
|
99
|
+
async trackRollback(fromVersion, toVersion, reason) {
|
|
100
|
+
await this.trackEvent({
|
|
101
|
+
type: 'rollback',
|
|
102
|
+
success: true,
|
|
103
|
+
metadata: {
|
|
104
|
+
fromVersion,
|
|
105
|
+
toVersion,
|
|
106
|
+
reason,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Console analytics provider for development
|
|
113
|
+
*/
|
|
114
|
+
export class ConsoleAnalyticsProvider {
|
|
115
|
+
constructor() {
|
|
116
|
+
this.properties = {};
|
|
117
|
+
}
|
|
118
|
+
async trackEvent(event) {
|
|
119
|
+
console.log('[Analytics]', event.type, Object.assign(Object.assign({}, event), { userId: this.userId, properties: this.properties }));
|
|
120
|
+
}
|
|
121
|
+
async trackError(error, context) {
|
|
122
|
+
console.error('[Analytics Error]', {
|
|
123
|
+
error: error.message,
|
|
124
|
+
stack: error.stack,
|
|
125
|
+
context,
|
|
126
|
+
userId: this.userId,
|
|
127
|
+
properties: this.properties,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
setUserId(userId) {
|
|
131
|
+
this.userId = userId;
|
|
132
|
+
}
|
|
133
|
+
setProperties(properties) {
|
|
134
|
+
this.properties = Object.assign(Object.assign({}, this.properties), properties);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/core/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { BundleInfo } from '../definitions';
|
|
2
|
+
/**
|
|
3
|
+
* Manages caching with expiration for various data types
|
|
4
|
+
*/
|
|
5
|
+
export declare class CacheManager {
|
|
6
|
+
private readonly logger;
|
|
7
|
+
private readonly configManager;
|
|
8
|
+
private filesystem;
|
|
9
|
+
private memoryCache;
|
|
10
|
+
private readonly CACHE_DIR;
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Initialize cache manager
|
|
14
|
+
*/
|
|
15
|
+
initialize(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Set cache entry with expiration
|
|
18
|
+
*/
|
|
19
|
+
set<T>(key: string, data: T, ttlMs?: number): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Get cache entry
|
|
22
|
+
*/
|
|
23
|
+
get<T>(key: string): Promise<T | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if cache entry exists and is valid
|
|
26
|
+
*/
|
|
27
|
+
has(key: string): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Remove cache entry
|
|
30
|
+
*/
|
|
31
|
+
remove(key: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Clear all cache
|
|
34
|
+
*/
|
|
35
|
+
clear(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Clean expired cache entries
|
|
38
|
+
*/
|
|
39
|
+
cleanExpiredCache(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Get cache statistics
|
|
42
|
+
*/
|
|
43
|
+
getStats(): Promise<{
|
|
44
|
+
memoryEntries: number;
|
|
45
|
+
fileEntries: number;
|
|
46
|
+
totalSize: number;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Cache bundle metadata
|
|
50
|
+
*/
|
|
51
|
+
cacheBundleMetadata(bundle: BundleInfo): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Get cached bundle metadata
|
|
54
|
+
*/
|
|
55
|
+
getCachedBundleMetadata(bundleId: string): Promise<BundleInfo | null>;
|
|
56
|
+
/**
|
|
57
|
+
* Check if data should be persisted to filesystem
|
|
58
|
+
*/
|
|
59
|
+
private shouldPersist;
|
|
60
|
+
/**
|
|
61
|
+
* Persist cache entry to file
|
|
62
|
+
*/
|
|
63
|
+
private persistToFile;
|
|
64
|
+
/**
|
|
65
|
+
* Load cache entry from file
|
|
66
|
+
*/
|
|
67
|
+
private loadFromFile;
|
|
68
|
+
/**
|
|
69
|
+
* Remove cache file
|
|
70
|
+
*/
|
|
71
|
+
private removeFile;
|
|
72
|
+
}
|