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.
- package/android/src/main/AndroidManifest.xml +2 -3
- package/dist/esm/__tests__/bundle-manager.test.js +49 -22
- package/dist/esm/__tests__/bundle-manager.test.js.map +1 -1
- package/dist/esm/app-update/app-update-checker.d.ts +27 -1
- package/dist/esm/app-update/app-update-checker.js +109 -4
- package/dist/esm/app-update/app-update-checker.js.map +1 -1
- package/dist/esm/background-update/background-scheduler.d.ts +25 -0
- package/dist/esm/background-update/background-scheduler.js +176 -61
- package/dist/esm/background-update/background-scheduler.js.map +1 -1
- package/dist/esm/core/config.d.ts +15 -0
- package/dist/esm/core/config.js +8 -0
- package/dist/esm/core/config.js.map +1 -1
- package/dist/esm/core/errors.d.ts +4 -0
- package/dist/esm/core/errors.js +5 -0
- package/dist/esm/core/errors.js.map +1 -1
- package/dist/esm/core/plugin-manager.d.ts +6 -0
- package/dist/esm/core/plugin-manager.js +17 -0
- package/dist/esm/core/plugin-manager.js.map +1 -1
- package/dist/esm/definitions.d.ts +82 -0
- package/dist/esm/definitions.js +1 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/firestore/schema.d.ts +1 -0
- package/dist/esm/firestore/schema.js +5 -1
- package/dist/esm/firestore/schema.js.map +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/live-update/delta-processor.d.ts +7 -3
- package/dist/esm/live-update/delta-processor.js +100 -13
- package/dist/esm/live-update/delta-processor.js.map +1 -1
- package/dist/esm/plugin.js +384 -21
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/security/crypto.d.ts +64 -1
- package/dist/esm/security/crypto.js +158 -1
- package/dist/esm/security/crypto.js.map +1 -1
- package/dist/esm/web.d.ts +40 -1
- package/dist/esm/web.js +317 -23
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +1 -1
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.esm.js +1 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/plugin.js +2 -2
- package/dist/plugin.js.map +1 -1
- package/docs/CHANGELOG.md +13 -0
- package/docs/KNOWN_LIMITATIONS.md +54 -69
- package/docs/REMAINING_FEATURES.md +14 -13
- package/docs/features/live-updates.md +7 -7
- package/docs/production-readiness.md +20 -23
- package/docs/reports/CLAUDE-CODE-COMPLETION-PROMPT.md +403 -0
- package/docs/reports/CLAUDE_CODE_PROMPT.md +29 -0
- package/docs/reports/CODEBASE_STATUS_REPORT.md +272 -0
- package/docs/reports/COMPREHENSIVE-PROJECT-AUDIT-2026-02-24.md +747 -0
- package/docs/reports/claude-completion.json +241 -0
- package/docs/tracking/completion-tracker-2026-02-24.json +174 -0
- 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
|
-
|
|
70
|
+
// Create 4 bundles with different download times
|
|
71
|
+
const bundles = [
|
|
71
72
|
{
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
81
|
-
|
|
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
|
-
|
|
85
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
|
101
|
-
|
|
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
|
-
|
|
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',
|
|
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':
|
|
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
|
-
//
|
|
88
|
-
|
|
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":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"app-update-checker.js","sourceRoot":"","sources":["../../../src/app-update/app-update-checker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAiBxC,MAAM,OAAO,gBAAgB;IAM3B,YAAY,MAAoB;QAHxB,kBAAa,GAAyB,IAAI,CAAC;QAClC,mBAAc,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,iBAAiB;QAG5D,IAAI,CAAC,MAAM,GAAG,MAAsB,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,CAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,CAAC,CAAC;YAC5D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACxD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAEnD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;gBAC3C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,MAAM,EAAE,kBAAkB;oBAC1B,eAAe,EAAE,cAAc;oBAC/B,gBAAgB,EAAE,IAAI,CAAC,WAAW,EAAE;iBACrC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,OAAO;gBACL,gBAAgB,EAAE,IAAI,CAAC,OAAO;gBAC9B,cAAc,EAAE,IAAI,CAAC,QAAQ;gBAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,UAAU,EAAE,IAAI,CAAC,IAAI;gBACrB,SAAS,EAAE,IAAI,CAAC,WAAW;aAC5B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,eAAe,CAAC,QAAgB,EAAE,QAAgB;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE/B,IAAI,MAAM,GAAG,MAAM;gBAAE,OAAO,CAAC,CAAC;YAC9B,IAAI,MAAM,GAAG,MAAM;gBAAE,OAAO,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAED,gBAAgB,CACd,cAAsB,EACtB,gBAAwB,EACxB,cAAuB;QAEvB,kDAAkD;QAClD,IAAI,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qDAAqD;QACrD,IACE,cAAc;YACd,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,EACxD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uBAAuB,CACrB,WAAmB,EACnB,aAAsB;QAEtB,2BAA2B;QAC3B,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE1D,gDAAgD;QAChD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC;QACX,CAAC;QAED,wDAAwD;QACxD,IAAI,KAAK,GAAG,CAAC,IAAI,aAAa,IAAI,aAAa,GAAG,EAAE,EAAE,CAAC;YACrD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,sCAAsC;QACtC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC;QACX,CAAC;QAED,mCAAmC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB;QACrB,oBAAoB;QACpB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1F,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;QACpC,CAAC;QAED,IAAI,CAAC;YACH,kDAAkD;YAClD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YAEjC,mBAAmB;YACnB,IAAI,CAAC,aAAa,GAAG;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;gBAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,EAAE,KAAK,CAAC,CAAC;YAElF,0CAA0C;YAC1C,MAAM,gBAAgB,GAAI,IAAI,CAAC,MAAkC,CAAC,UAAU,CAAC;YAC7E,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBACzC,OAAO,gBAAgB,CAAC;YAC1B,CAAC;YAED,qCAAqC;YACrC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,iBAAiB,GAAG,MAA6C,CAAC;gBACxE,IAAI,OAAO,iBAAiB,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACtD,OAAO,iBAAiB,CAAC,WAAW,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,oBAAoB;QACpB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1F,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAClC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YAEjC,mBAAmB;YACnB,IAAI,CAAC,aAAa,GAAG;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,oBAAoB;QACpB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1F,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YAEjC,IAAI,CAAC,aAAa,GAAG;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAAC,WAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,SAAS;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAEO,WAAW;QACjB,kBAAkB;QAClB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;YAC7C,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,OAAO,SAAS,CAAC;YACnB,CAAC;iBAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9C,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -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
|
-
//
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
152
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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) {
|