1
0
mirror of https://gitcode.com/gh_mirrors/re/react-native-pushy.git synced 2025-11-01 05:43:11 +08:00
Code Issues Packages Projects Releases Wiki Activity GitHub Gitee

resolve harmony hot update fail issue (#483)

* fix harmony more than 2M issue

* fix mtpush-react-native conflics

* update harmony remote dependency flow

* udpate

* udpate

* udpate

* udpate

* udpate

* update

* uddate

* udpapte

* adapter pushy for Expo

* udpate

* resolve harmony hot update fail issue

* udpate

* udpate

* udpate

* udpate

* udpate

* update

* udpate
This commit is contained in:
波仔糕
2025-03-09 10:08:30 +08:00
committed by GitHub
parent 93f2d51c46
commit 3876110a66
9 changed files with 91 additions and 69 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
{ {
"pushy_build_time": "2025-02-14T09:43:25.648Z", "pushy_build_time": "2025-03-09T01:57:42.464Z",
"versionName": "1.0.0" "versionName": "1.0.0"
} }

View File

@@ -5520,9 +5520,9 @@ mustache@^4.2.0:
integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==
nanoid@^3.3.3: nanoid@^3.3.3:
version "3.3.8" version "3.3.9"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.9.tgz#e0097d8e026b3343ff053e9ccd407360a03f503a"
integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==
natural-compare-lite@^1.4.0: natural-compare-lite@^1.4.0:
version "1.4.0" version "1.4.0"
@@ -6003,7 +6003,7 @@ react-is@^17.0.1:
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
"react-native-update@file:../..": "react-native-update@file:../..":
version "10.19.6" version "10.26.1"
dependencies: dependencies:
nanoid "^3.3.3" nanoid "^3.3.3"
react-native-url-polyfill "^2.0.0" react-native-url-polyfill "^2.0.0"

View File

@@ -65,9 +65,13 @@ export class DownloadTask {
0, 0,
params.targetFile.lastIndexOf('/'), params.targetFile.lastIndexOf('/'),
); );
const exists = fileIo.accessSync(targetDir);
if(!exists){
await fileIo.mkdir(targetDir); await fileIo.mkdir(targetDir);
} }
}
} catch (error) { } catch (error) {
throw error;
} }
const response = await httpRequest.request(params.url, { const response = await httpRequest.request(params.url, {
@@ -78,12 +82,11 @@ export class DownloadTask {
'Content-Type': 'application/octet-stream', 'Content-Type': 'application/octet-stream',
}, },
}); });
if (response.responseCode > 299) { if (response.responseCode > 299) {
throw new Error(`Server error: ${response.responseCode}`); throw new Error(`Server error: ${response.responseCode}`);
} }
const contentLength = parseInt(response.header['Content-Length'] || '0'); const contentLength = parseInt(response.header['content-length'] || '0');
const writer = await fileIo.open( const writer = await fileIo.open(
params.targetFile, params.targetFile,
fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE,
@@ -102,8 +105,12 @@ export class DownloadTask {
this.onProgressUpdate(received, contentLength); this.onProgressUpdate(received, contentLength);
} }
await fileIo.close(writer); await fileIo.close(writer);
const stat = await fileIo.stat(params.targetFile); const stats = await fileIo.stat(params.targetFile);
const fileSize = stat.size; const fileSize = stats.size;
if (fileSize !== contentLength) {
throw new Error(`Download incomplete: expected ${contentLength} bytes but got ${stats.size} bytes`);
}
} catch (error) { } catch (error) {
console.error('Download failed:', error); console.error('Download failed:', error);
throw error; throw error;
@@ -113,7 +120,7 @@ export class DownloadTask {
} }
private onProgressUpdate(received: number, total: number): void { private onProgressUpdate(received: number, total: number): void {
this.eventHub.emit('downloadProgress', { this.eventHub.emit('RCTPushyDownloadProgress', {
received, received,
total, total,
hash: this.hash, hash: this.hash,
@@ -288,8 +295,8 @@ export class DownloadTask {
} }
} }
if(entry.filename !== '.DS_Store'){ if(fn !== '.DS_Store'){
await zip.decompressFile(entry.filename, params.unzipDirectory); await zip.decompressFile(fn, params.unzipDirectory);
} }
} }

View File

@@ -3,6 +3,7 @@ type EventCallback = (data: any) => void;
export class EventHub { export class EventHub {
private static instance: EventHub; private static instance: EventHub;
private listeners: Map<string, Set<EventCallback>>; private listeners: Map<string, Set<EventCallback>>;
private rnInstance: any;
private constructor() { private constructor() {
this.listeners = new Map(); this.listeners = new Map();
@@ -27,12 +28,12 @@ export class EventHub {
} }
public emit(event: string, data: any): void { public emit(event: string, data: any): void {
this.listeners.get(event)?.forEach(callback => { if (this.rnInstance) {
try { this.rnInstance.emitDeviceEvent(event, data);
callback(data); }
} catch (error) { }
console.error(`Error in event listener for ${event}:`, error);
} setRNInstance(instance: any) {
}); this.rnInstance = instance;
} }
} }

View File

@@ -7,6 +7,7 @@ import { BusinessError } from '@ohos.base';
import logger from './Logger'; import logger from './Logger';
import { UpdateModuleImpl } from './UpdateModuleImpl'; import { UpdateModuleImpl } from './UpdateModuleImpl';
import { UpdateContext } from './UpdateContext'; import { UpdateContext } from './UpdateContext';
import { EventHub } from './EventHub';
const TAG = "PushyTurboModule" const TAG = "PushyTurboModule"
@@ -18,9 +19,8 @@ export class PushyTurboModule extends TurboModule {
super(ctx); super(ctx);
logger.debug(TAG, ",PushyTurboModule constructor"); logger.debug(TAG, ",PushyTurboModule constructor");
this.mUiCtx = ctx.uiAbilityContext this.mUiCtx = ctx.uiAbilityContext
let rnInstance = ctx.rnInstance
this.context = new UpdateContext(this.mUiCtx) this.context = new UpdateContext(this.mUiCtx)
// rnInstance.emitDeviceEvent("Pushy",{code: err.code, message: err.message}); EventHub.getInstance().setRNInstance(ctx.rnInstance)
} }

View File

@@ -31,7 +31,10 @@ export class UpdateContext {
this.preferences = preferences.getPreferencesSync(this.context, {name:'update'}); this.preferences = preferences.getPreferencesSync(this.context, {name:'update'});
const packageVersion = this.getPackageVersion(); const packageVersion = this.getPackageVersion();
const storedVersion = this.preferences.getSync('packageVersion', ''); const storedVersion = this.preferences.getSync('packageVersion', '');
if (packageVersion !== storedVersion) { if(!storedVersion){
this.preferences.putSync('packageVersion', packageVersion);
this.preferences.flush();
} else if (storedVersion && packageVersion !== storedVersion) {
this.preferences.clear(); this.preferences.clear();
this.preferences.putSync('packageVersion', packageVersion); this.preferences.putSync('packageVersion', packageVersion);
this.preferences.flush(); this.preferences.flush();
@@ -137,8 +140,9 @@ export class UpdateContext {
params.unzipDirectory = `${this.rootDir}/${hash}`; params.unzipDirectory = `${this.rootDir}/${hash}`;
const downloadTask = new DownloadTask(this.context); const downloadTask = new DownloadTask(this.context);
await downloadTask.execute(params); return await downloadTask.execute(params);
} catch (e) { } catch (e) {
throw e;
console.error('Failed to download APK patch:', e); console.error('Failed to download APK patch:', e);
} }
} }
@@ -152,14 +156,13 @@ export class UpdateContext {
const lastVersion = this.getKv('currentVersion'); const lastVersion = this.getKv('currentVersion');
this.setKv('currentVersion', hash); this.setKv('currentVersion', hash);
if (lastVersion && lastVersion !== hash) { if (lastVersion && lastVersion !== hash) {
this.setKv('lastVersion', lastVersion); this.setKv('lastVersion', lastVersion);
} }
this.setKv('firstTime', 'true'); this.setKv('firstTime', 'true');
this.setKv('firstTimeOk', 'false'); this.setKv('firstTimeOk', 'false');
this.setKv('rolledBackVersion', null); this.setKv('rolledBackVersion', "");
} catch (e) { } catch (e) {
console.error('Failed to switch version:', e); console.error('Failed to switch version:', e);
} }
@@ -211,7 +214,7 @@ export class UpdateContext {
} }
public getCurrentVersion() : string { public getCurrentVersion() : string {
const currentVersion = this.preferences.getSync('currentVersion', '') as string; const currentVersion = this.getKv('currentVersion');
return currentVersion; return currentVersion;
} }

View File

@@ -56,7 +56,7 @@ export class UpdateModuleImpl {
options: { updateUrl: string; hash: string } options: { updateUrl: string; hash: string }
): Promise<void> { ): Promise<void> {
try { try {
await updateContext.downloadPatchFromPackage(options.updateUrl, options.hash, { return await updateContext.downloadPatchFromPackage(options.updateUrl, options.hash, {
onDownloadCompleted: (params: DownloadTaskParams) => { onDownloadCompleted: (params: DownloadTaskParams) => {
return Promise.resolve(); return Promise.resolve();
}, },

View File

@@ -9,7 +9,7 @@ import {
promiseAny, promiseAny,
testUrls, testUrls,
} from './utils'; } from './utils';
import { EmitterSubscription, Platform } from 'react-native'; import { EmitterSubscription, Platform, DeviceEventEmitter } from 'react-native';
import { PermissionsAndroid } from './permissions'; import { PermissionsAndroid } from './permissions';
import { import {
PushyModule, PushyModule,
@@ -350,6 +350,16 @@ export class Pushy {
return; return;
} }
if (onDownloadProgress) { if (onDownloadProgress) {
if (Platform.OS === 'harmony') {
Pushy.progressHandlers[hash] = DeviceEventEmitter.addListener(
'RCTPushyDownloadProgress',
progressData => {
if (progressData.hash === hash) {
onDownloadProgress(progressData);
}
},
);
} else {
Pushy.progressHandlers[hash] = pushyNativeEventEmitter.addListener( Pushy.progressHandlers[hash] = pushyNativeEventEmitter.addListener(
'RCTPushyDownloadProgress', 'RCTPushyDownloadProgress',
progressData => { progressData => {
@@ -359,6 +369,7 @@ export class Pushy {
}, },
); );
} }
}
let succeeded = ''; let succeeded = '';
this.report({ type: 'downloading' }); this.report({ type: 'downloading' });
let lastError: any; let lastError: any;