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,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,3 @@
1
+ export { BackgroundScheduler } from './background-scheduler';
2
+ export { NotificationManager } from './notification-manager';
3
+ export type { NotificationData, NotificationAction, } from './notification-manager';
@@ -0,0 +1,3 @@
1
+ export { BackgroundScheduler } from './background-scheduler';
2
+ export { NotificationManager } from './notification-manager';
3
+ //# sourceMappingURL=index.js.map
@@ -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
+ }