native-update 1.4.4 → 1.4.5

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 (56) hide show
  1. package/android/src/main/AndroidManifest.xml +2 -3
  2. package/dist/esm/__tests__/bundle-manager.test.js +49 -22
  3. package/dist/esm/__tests__/bundle-manager.test.js.map +1 -1
  4. package/dist/esm/app-update/app-update-checker.d.ts +27 -1
  5. package/dist/esm/app-update/app-update-checker.js +109 -4
  6. package/dist/esm/app-update/app-update-checker.js.map +1 -1
  7. package/dist/esm/background-update/background-scheduler.d.ts +25 -0
  8. package/dist/esm/background-update/background-scheduler.js +176 -61
  9. package/dist/esm/background-update/background-scheduler.js.map +1 -1
  10. package/dist/esm/core/config.d.ts +15 -0
  11. package/dist/esm/core/config.js +8 -0
  12. package/dist/esm/core/config.js.map +1 -1
  13. package/dist/esm/core/errors.d.ts +4 -0
  14. package/dist/esm/core/errors.js +5 -0
  15. package/dist/esm/core/errors.js.map +1 -1
  16. package/dist/esm/core/plugin-manager.d.ts +6 -0
  17. package/dist/esm/core/plugin-manager.js +17 -0
  18. package/dist/esm/core/plugin-manager.js.map +1 -1
  19. package/dist/esm/definitions.d.ts +82 -0
  20. package/dist/esm/definitions.js +1 -0
  21. package/dist/esm/definitions.js.map +1 -1
  22. package/dist/esm/firestore/schema.d.ts +1 -0
  23. package/dist/esm/firestore/schema.js +5 -1
  24. package/dist/esm/firestore/schema.js.map +1 -1
  25. package/dist/esm/index.d.ts +3 -1
  26. package/dist/esm/index.js +2 -0
  27. package/dist/esm/index.js.map +1 -1
  28. package/dist/esm/live-update/delta-processor.d.ts +7 -3
  29. package/dist/esm/live-update/delta-processor.js +100 -13
  30. package/dist/esm/live-update/delta-processor.js.map +1 -1
  31. package/dist/esm/plugin.js +384 -21
  32. package/dist/esm/plugin.js.map +1 -1
  33. package/dist/esm/security/crypto.d.ts +64 -1
  34. package/dist/esm/security/crypto.js +158 -1
  35. package/dist/esm/security/crypto.js.map +1 -1
  36. package/dist/esm/web.d.ts +40 -1
  37. package/dist/esm/web.js +317 -23
  38. package/dist/esm/web.js.map +1 -1
  39. package/dist/plugin.cjs.js +1 -1
  40. package/dist/plugin.cjs.js.map +1 -1
  41. package/dist/plugin.esm.js +1 -1
  42. package/dist/plugin.esm.js.map +1 -1
  43. package/dist/plugin.js +2 -2
  44. package/dist/plugin.js.map +1 -1
  45. package/docs/CHANGELOG.md +13 -0
  46. package/docs/KNOWN_LIMITATIONS.md +54 -69
  47. package/docs/REMAINING_FEATURES.md +14 -13
  48. package/docs/features/live-updates.md +7 -7
  49. package/docs/production-readiness.md +20 -23
  50. package/docs/reports/CLAUDE-CODE-COMPLETION-PROMPT.md +403 -0
  51. package/docs/reports/CLAUDE_CODE_PROMPT.md +29 -0
  52. package/docs/reports/CODEBASE_STATUS_REPORT.md +272 -0
  53. package/docs/reports/COMPREHENSIVE-PROJECT-AUDIT-2026-02-24.md +747 -0
  54. package/docs/reports/claude-completion.json +241 -0
  55. package/docs/tracking/completion-tracker-2026-02-24.json +174 -0
  56. package/package.json +10 -10
@@ -1,5 +1,4 @@
1
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
- package="com.aoneahsan.nativeupdate">
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
3
2
 
4
3
  <!-- Required permissions -->
5
4
  <uses-permission android:name="android.permission.INTERNET" />
@@ -15,4 +14,4 @@
15
14
  <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
16
15
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
17
16
 
18
- </manifest>
17
+ </manifest>
@@ -67,38 +67,65 @@ describe('BundleManager', () => {
67
67
  });
68
68
  describe('cleanupOldBundles', () => {
69
69
  it('should keep only specified number of bundles', async () => {
70
- const mockBundles = [
70
+ // Create 4 bundles with different download times
71
+ const bundles = [
71
72
  {
72
- path: 'bundle-1.0.0',
73
- modificationTime: new Date('2024-01-01').getTime(),
73
+ bundleId: 'bundle-1.0.0',
74
+ version: '1.0.0',
75
+ path: '/bundles/bundle-1.0.0',
76
+ downloadTime: new Date('2024-01-01').getTime(),
77
+ size: 1024,
78
+ status: 'ready',
79
+ checksum: 'a'.repeat(64),
80
+ verified: true,
74
81
  },
75
82
  {
76
- path: 'bundle-1.0.1',
77
- modificationTime: new Date('2024-01-02').getTime(),
83
+ bundleId: 'bundle-1.0.1',
84
+ version: '1.0.1',
85
+ path: '/bundles/bundle-1.0.1',
86
+ downloadTime: new Date('2024-01-02').getTime(),
87
+ size: 1024,
88
+ status: 'ready',
89
+ checksum: 'b'.repeat(64),
90
+ verified: true,
78
91
  },
79
92
  {
80
- path: 'bundle-1.0.2',
81
- modificationTime: new Date('2024-01-03').getTime(),
93
+ bundleId: 'bundle-1.0.2',
94
+ version: '1.0.2',
95
+ path: '/bundles/bundle-1.0.2',
96
+ downloadTime: new Date('2024-01-03').getTime(),
97
+ size: 1024,
98
+ status: 'ready',
99
+ checksum: 'c'.repeat(64),
100
+ verified: true,
82
101
  },
83
102
  {
84
- path: 'bundle-1.0.3',
85
- modificationTime: new Date('2024-01-04').getTime(),
103
+ bundleId: 'bundle-1.0.3',
104
+ version: '1.0.3',
105
+ path: '/bundles/bundle-1.0.3',
106
+ downloadTime: new Date('2024-01-04').getTime(),
107
+ size: 1024,
108
+ status: 'ready',
109
+ checksum: 'd'.repeat(64),
110
+ verified: true,
86
111
  },
87
112
  ];
88
- const { Filesystem } = await import('@capacitor/filesystem');
89
- vi.mocked(Filesystem.readdir).mockResolvedValue({
90
- files: mockBundles.map((b) => ({
91
- name: b.path,
92
- type: 'directory',
93
- size: 1024,
94
- uri: b.path,
95
- ctime: b.modificationTime,
96
- mtime: b.modificationTime,
97
- })),
98
- });
113
+ // Save all bundles
114
+ for (const bundle of bundles) {
115
+ await bundleManager.saveBundleInfo(bundle);
116
+ }
117
+ // Verify we have 4 bundles
118
+ const beforeCleanup = await bundleManager.getAllBundles();
119
+ expect(beforeCleanup.length).toBe(4);
120
+ // Cleanup to keep only 2 bundles
99
121
  await bundleManager['cleanupOldBundles'](2);
100
- // Should delete the 2 oldest bundles
101
- expect(Filesystem.rmdir).toHaveBeenCalledTimes(2);
122
+ // Should have only 2 bundles remaining (the newest ones)
123
+ const afterCleanup = await bundleManager.getAllBundles();
124
+ expect(afterCleanup.length).toBe(2);
125
+ // The 2 newest bundles should remain
126
+ const bundleIds = afterCleanup.map((b) => b.bundleId);
127
+ expect(bundleIds).toContain('bundle-1.0.3');
128
+ expect(bundleIds).toContain('bundle-1.0.2');
102
129
  });
103
130
  });
104
131
  describe('getBundle', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"bundle-manager.test.js","sourceRoot":"","sources":["../../../src/__tests__/bundle-manager.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundle-manager.test.js","sourceRoot":"","sources":["../../../src/__tests__/bundle-manager.test.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,39 @@
1
1
  import { PluginConfig } from '../core/config';
2
2
  import { AppUpdateInfo, AppUpdateOptions } from './types';
3
+ interface CachedAppInfo {
4
+ version: string;
5
+ build: string;
6
+ name: string;
7
+ id: string;
8
+ timestamp: number;
9
+ }
3
10
  export declare class AppUpdateChecker {
4
11
  private config;
5
12
  private logger;
13
+ private cachedAppInfo;
14
+ private readonly CACHE_DURATION;
6
15
  constructor(config: PluginConfig);
7
16
  checkServerVersion(_?: AppUpdateOptions): Promise<Partial<AppUpdateInfo>>;
8
17
  compareVersions(version1: string, version2: string): number;
9
18
  isUpdateRequired(currentVersion: string, availableVersion: string, minimumVersion?: string): boolean;
10
19
  determineUpdatePriority(versionDiff: string, stalenessDays?: number): number;
11
- private getCurrentVersion;
20
+ /**
21
+ * Get current app version using @capacitor/app
22
+ * Falls back to config or default if native API unavailable
23
+ */
24
+ getCurrentVersion(): Promise<string>;
25
+ /**
26
+ * Get current app build number
27
+ */
28
+ getCurrentBuild(): Promise<string>;
29
+ /**
30
+ * Get full app info
31
+ */
32
+ getAppInfo(): Promise<CachedAppInfo>;
33
+ /**
34
+ * Clear the cached app info (useful after updates)
35
+ */
36
+ clearCache(): void;
12
37
  private getPlatform;
13
38
  }
39
+ export {};
@@ -1,6 +1,8 @@
1
1
  import { Logger } from '../core/logger';
2
2
  export class AppUpdateChecker {
3
3
  constructor(config) {
4
+ this.cachedAppInfo = null;
5
+ this.CACHE_DURATION = 60 * 1000; // 1 minute cache
4
6
  this.config = config;
5
7
  this.logger = new Logger('AppUpdateChecker');
6
8
  }
@@ -9,9 +11,10 @@ export class AppUpdateChecker {
9
11
  return {};
10
12
  }
11
13
  try {
14
+ const currentVersion = await this.getCurrentVersion();
12
15
  const url = new URL(`${this.config.updateUrl}/app-version`);
13
16
  url.searchParams.append('platform', this.getPlatform());
14
- url.searchParams.append('current', await this.getCurrentVersion());
17
+ url.searchParams.append('current', currentVersion);
15
18
  if (this.config.channel) {
16
19
  url.searchParams.append('channel', this.config.channel);
17
20
  }
@@ -19,7 +22,7 @@ export class AppUpdateChecker {
19
22
  method: 'GET',
20
23
  headers: {
21
24
  Accept: 'application/json',
22
- 'X-App-Version': await this.getCurrentVersion(),
25
+ 'X-App-Version': currentVersion,
23
26
  'X-App-Platform': this.getPlatform(),
24
27
  },
25
28
  });
@@ -83,9 +86,111 @@ export class AppUpdateChecker {
83
86
  // Patch version = LOW (priority 1)
84
87
  return 1;
85
88
  }
89
+ /**
90
+ * Get current app version using @capacitor/app
91
+ * Falls back to config or default if native API unavailable
92
+ */
86
93
  async getCurrentVersion() {
87
- // This would be implemented by the native platform
88
- return '1.0.0';
94
+ // Check cache first
95
+ if (this.cachedAppInfo && Date.now() - this.cachedAppInfo.timestamp < this.CACHE_DURATION) {
96
+ return this.cachedAppInfo.version;
97
+ }
98
+ try {
99
+ // Try to use @capacitor/app for real version info
100
+ const { App } = await import('@capacitor/app');
101
+ const info = await App.getInfo();
102
+ // Cache the result
103
+ this.cachedAppInfo = {
104
+ version: info.version,
105
+ build: info.build,
106
+ name: info.name,
107
+ id: info.id,
108
+ timestamp: Date.now(),
109
+ };
110
+ this.logger.debug('Got app info from Capacitor', {
111
+ version: info.version,
112
+ build: info.build,
113
+ });
114
+ return info.version;
115
+ }
116
+ catch (error) {
117
+ this.logger.debug('Failed to get app info from Capacitor, using fallback', error);
118
+ // Fallback to config value or environment
119
+ const configAppVersion = this.config.appVersion;
120
+ if (typeof configAppVersion === 'string') {
121
+ return configAppVersion;
122
+ }
123
+ // Try to get from environment/window
124
+ if (typeof window !== 'undefined') {
125
+ const windowWithVersion = window;
126
+ if (typeof windowWithVersion.APP_VERSION === 'string') {
127
+ return windowWithVersion.APP_VERSION;
128
+ }
129
+ }
130
+ // Last resort fallback
131
+ return '1.0.0';
132
+ }
133
+ }
134
+ /**
135
+ * Get current app build number
136
+ */
137
+ async getCurrentBuild() {
138
+ // Check cache first
139
+ if (this.cachedAppInfo && Date.now() - this.cachedAppInfo.timestamp < this.CACHE_DURATION) {
140
+ return this.cachedAppInfo.build;
141
+ }
142
+ try {
143
+ const { App } = await import('@capacitor/app');
144
+ const info = await App.getInfo();
145
+ // Cache the result
146
+ this.cachedAppInfo = {
147
+ version: info.version,
148
+ build: info.build,
149
+ name: info.name,
150
+ id: info.id,
151
+ timestamp: Date.now(),
152
+ };
153
+ return info.build;
154
+ }
155
+ catch (_a) {
156
+ return '1';
157
+ }
158
+ }
159
+ /**
160
+ * Get full app info
161
+ */
162
+ async getAppInfo() {
163
+ // Check cache first
164
+ if (this.cachedAppInfo && Date.now() - this.cachedAppInfo.timestamp < this.CACHE_DURATION) {
165
+ return this.cachedAppInfo;
166
+ }
167
+ try {
168
+ const { App } = await import('@capacitor/app');
169
+ const info = await App.getInfo();
170
+ this.cachedAppInfo = {
171
+ version: info.version,
172
+ build: info.build,
173
+ name: info.name,
174
+ id: info.id,
175
+ timestamp: Date.now(),
176
+ };
177
+ return this.cachedAppInfo;
178
+ }
179
+ catch (_a) {
180
+ return {
181
+ version: '1.0.0',
182
+ build: '1',
183
+ name: 'App',
184
+ id: 'com.app',
185
+ timestamp: Date.now(),
186
+ };
187
+ }
188
+ }
189
+ /**
190
+ * Clear the cached app info (useful after updates)
191
+ */
192
+ clearCache() {
193
+ this.cachedAppInfo = null;
89
194
  }
90
195
  getPlatform() {
91
196
  // Detect platform
@@ -1 +1 @@
1
- {"version":3,"file":"app-update-checker.js","sourceRoot":"","sources":["../../../src/app-update/app-update-checker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-update-checker.js","sourceRoot":"","sources":["../../../src/app-update/app-update-checker.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,23 @@
1
1
  import type { BackgroundUpdateConfig, BackgroundUpdateStatus, BackgroundCheckResult } from '../definitions';
2
+ import type { AppUpdateManager } from '../app-update/app-update-manager';
3
+ import type { VersionManager } from '../live-update/version-manager';
4
+ import type { BundleManager } from '../live-update/bundle-manager';
5
+ interface BackgroundSchedulerDeps {
6
+ appUpdateManager?: AppUpdateManager;
7
+ versionManager?: VersionManager;
8
+ bundleManager?: BundleManager;
9
+ }
2
10
  export declare class BackgroundScheduler {
3
11
  private config;
4
12
  private status;
13
+ private readonly logger;
14
+ private readonly configManager;
15
+ private deps;
16
+ constructor();
17
+ /**
18
+ * Set dependencies for the scheduler
19
+ */
20
+ setDependencies(deps: BackgroundSchedulerDeps): void;
5
21
  configure(config: BackgroundUpdateConfig): void;
6
22
  getStatus(): BackgroundUpdateStatus;
7
23
  performCheck(): Promise<BackgroundCheckResult>;
@@ -9,9 +25,18 @@ export declare class BackgroundScheduler {
9
25
  private checkAppUpdate;
10
26
  private checkLiveUpdate;
11
27
  private sendNotification;
28
+ /**
29
+ * Get current app version
30
+ */
31
+ private getCurrentAppVersion;
32
+ /**
33
+ * Get current platform
34
+ */
35
+ private getPlatform;
12
36
  protected calculateNextCheckTime(): number;
13
37
  protected shouldRespectBatteryOptimization(): boolean;
14
38
  protected isNetworkConditionMet(): boolean;
15
39
  protected isBatteryLevelSufficient(): boolean;
16
40
  private compareVersions;
17
41
  }
42
+ export {};
@@ -1,4 +1,6 @@
1
1
  import { BackgroundUpdateType, UpdateErrorCode } from '../definitions';
2
+ import { Logger } from '../core/logger';
3
+ import { ConfigManager } from '../core/config';
2
4
  export class BackgroundScheduler {
3
5
  constructor() {
4
6
  this.config = null;
@@ -8,6 +10,15 @@ export class BackgroundScheduler {
8
10
  checkCount: 0,
9
11
  failureCount: 0,
10
12
  };
13
+ this.deps = {};
14
+ this.logger = Logger.getInstance();
15
+ this.configManager = ConfigManager.getInstance();
16
+ }
17
+ /**
18
+ * Set dependencies for the scheduler
19
+ */
20
+ setDependencies(deps) {
21
+ this.deps = deps;
11
22
  }
12
23
  configure(config) {
13
24
  this.config = config;
@@ -87,80 +98,179 @@ export class BackgroundScheduler {
87
98
  };
88
99
  }
89
100
  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
- };
101
+ // Use AppUpdateManager if available
102
+ if (this.deps.appUpdateManager) {
103
+ try {
104
+ return await this.deps.appUpdateManager.getAppUpdateInfo();
105
+ }
106
+ catch (error) {
107
+ this.logger.error('Failed to check app update via manager', error);
108
+ }
107
109
  }
108
- catch (error) {
109
- console.error('Failed to check app update:', error);
110
- return undefined;
110
+ // Fallback: Check via server if configured
111
+ const serverUrl = this.configManager.get('baseUrl') || this.configManager.get('serverUrl');
112
+ if (serverUrl) {
113
+ try {
114
+ const currentVersion = await this.getCurrentAppVersion();
115
+ const response = await fetch(`${serverUrl}/app-version`, {
116
+ method: 'GET',
117
+ headers: {
118
+ 'Content-Type': 'application/json',
119
+ 'X-Current-Version': currentVersion,
120
+ 'X-Platform': this.getPlatform(),
121
+ },
122
+ });
123
+ if (response.ok) {
124
+ const data = await response.json();
125
+ const availableVersion = data.version || data.latestVersion;
126
+ const updateAvailable = availableVersion &&
127
+ this.compareVersions(currentVersion, availableVersion) < 0;
128
+ return {
129
+ updateAvailable,
130
+ currentVersion,
131
+ availableVersion: updateAvailable ? availableVersion : undefined,
132
+ updatePriority: data.priority,
133
+ };
134
+ }
135
+ }
136
+ catch (error) {
137
+ this.logger.error('Failed to check app update via server', error);
138
+ }
111
139
  }
140
+ // No update info available
141
+ const currentVersion = await this.getCurrentAppVersion();
142
+ return {
143
+ updateAvailable: false,
144
+ currentVersion,
145
+ };
112
146
  }
113
147
  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;
148
+ // Get current bundle version
149
+ let currentVersion = '1.0.0';
150
+ if (this.deps.bundleManager) {
151
+ try {
152
+ const activeBundle = await this.deps.bundleManager.getActiveBundle();
153
+ if (activeBundle) {
154
+ currentVersion = activeBundle.version;
155
+ }
156
+ }
157
+ catch (_a) {
158
+ // Use default version
159
+ }
130
160
  }
131
- catch (error) {
132
- console.error('Failed to check live update:', error);
133
- return undefined;
161
+ // Use VersionManager if available
162
+ if (this.deps.versionManager) {
163
+ try {
164
+ const serverUrl = this.configManager.get('serverUrl');
165
+ const channel = this.configManager.get('channel') || 'production';
166
+ const appId = this.configManager.get('appId');
167
+ if (serverUrl && appId) {
168
+ const result = await this.deps.versionManager.checkForUpdates(serverUrl, channel, currentVersion, appId);
169
+ if (result) {
170
+ return result;
171
+ }
172
+ }
173
+ }
174
+ catch (error) {
175
+ this.logger.error('Failed to check live update via VersionManager', error);
176
+ }
134
177
  }
178
+ // Fallback: Check via server if configured
179
+ const serverUrl = this.configManager.get('baseUrl') || this.configManager.get('serverUrl');
180
+ if (serverUrl) {
181
+ try {
182
+ const response = await fetch(`${serverUrl}/updates/latest`, {
183
+ method: 'GET',
184
+ headers: {
185
+ 'Content-Type': 'application/json',
186
+ 'X-Current-Version': currentVersion,
187
+ },
188
+ });
189
+ if (response.ok) {
190
+ const data = await response.json();
191
+ const latestVersion = data.version || data.latestVersion;
192
+ const updateAvailable = latestVersion &&
193
+ this.compareVersions(currentVersion, latestVersion) < 0;
194
+ return {
195
+ available: updateAvailable,
196
+ version: latestVersion,
197
+ url: updateAvailable ? data.url : undefined,
198
+ notes: data.notes || data.releaseNotes,
199
+ size: data.size,
200
+ checksum: data.checksum,
201
+ };
202
+ }
203
+ }
204
+ catch (error) {
205
+ this.logger.error('Failed to check live update via server', error);
206
+ }
207
+ }
208
+ // No update available
209
+ return {
210
+ available: false,
211
+ };
135
212
  }
136
213
  async sendNotification(appUpdate, liveUpdate) {
137
214
  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.`;
215
+ // Check if notifications are enabled in config
216
+ if (!((_a = this.config) === null || _a === void 0 ? void 0 : _a.notificationPreferences)) {
217
+ return false;
218
+ }
219
+ const prefs = this.config.notificationPreferences;
220
+ let title = prefs.title || 'Update Available';
221
+ let body = prefs.description || '';
222
+ if (appUpdate === null || appUpdate === void 0 ? void 0 : appUpdate.updateAvailable) {
223
+ title = 'App Update Available';
224
+ body = `Version ${appUpdate.availableVersion} is ready to install.`;
225
+ }
226
+ else if (liveUpdate === null || liveUpdate === void 0 ? void 0 : liveUpdate.available) {
227
+ title = 'New Update Available';
228
+ body = `Version ${liveUpdate.version} is ready to download. ${liveUpdate.notes || ''}`;
229
+ }
230
+ // Use Web Notifications API in browser
231
+ if (typeof window !== 'undefined' && 'Notification' in window) {
232
+ try {
233
+ if (Notification.permission === 'granted') {
234
+ new Notification(title, { body });
235
+ return true;
236
+ }
150
237
  }
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 || ''}`;
238
+ catch (error) {
239
+ this.logger.error('Failed to send notification', error);
154
240
  }
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
241
  }
160
- catch (error) {
161
- console.error('Failed to send notification:', error);
162
- return false;
242
+ // Log notification for debugging
243
+ this.logger.info('Background update notification', { title, body });
244
+ return false;
245
+ }
246
+ /**
247
+ * Get current app version
248
+ */
249
+ async getCurrentAppVersion() {
250
+ // Try to get version from @capacitor/app if available
251
+ try {
252
+ // Dynamic import to avoid hard dependency
253
+ const { App } = await import('@capacitor/app');
254
+ const info = await App.getInfo();
255
+ return info.version;
163
256
  }
257
+ catch (_a) {
258
+ // Fallback to baseUrl config to extract app version or use default
259
+ return '1.0.0';
260
+ }
261
+ }
262
+ /**
263
+ * Get current platform
264
+ */
265
+ getPlatform() {
266
+ if (typeof window !== 'undefined') {
267
+ const userAgent = window.navigator.userAgent;
268
+ if (/android/i.test(userAgent))
269
+ return 'android';
270
+ if (/iPad|iPhone|iPod/.test(userAgent))
271
+ return 'ios';
272
+ }
273
+ return 'web';
164
274
  }
165
275
  calculateNextCheckTime() {
166
276
  var _a;
@@ -173,9 +283,14 @@ export class BackgroundScheduler {
173
283
  return (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.respectBatteryOptimization) !== null && _b !== void 0 ? _b : true;
174
284
  }
175
285
  isNetworkConditionMet() {
286
+ // Check network connectivity
287
+ if (typeof navigator !== 'undefined' && 'onLine' in navigator) {
288
+ return navigator.onLine;
289
+ }
176
290
  return true;
177
291
  }
178
292
  isBatteryLevelSufficient() {
293
+ // Battery API is deprecated in most browsers, return true by default
179
294
  return true;
180
295
  }
181
296
  compareVersions(version1, version2) {