react-native-sherpa-onnx 0.3.6 → 0.3.7
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/LICENSE +1 -0
- package/README.md +89 -21
- package/SherpaOnnx.podspec +3 -0
- package/THIRD_PARTY_LICENSES/README.md +62 -0
- package/THIRD_PARTY_LICENSES/ffmpeg.txt +502 -0
- package/THIRD_PARTY_LICENSES/libarchive.txt +65 -0
- package/THIRD_PARTY_LICENSES/nvidia_omla.txt +181 -0
- package/THIRD_PARTY_LICENSES/onnxruntime.txt +21 -0
- package/THIRD_PARTY_LICENSES/opus.txt +44 -0
- package/THIRD_PARTY_LICENSES/sherpa-onnx.txt +201 -0
- package/THIRD_PARTY_LICENSES/shine.txt +482 -0
- package/THIRD_PARTY_LICENSES/zstd.txt +30 -0
- package/android/build.gradle +7 -3
- package/android/prebuilt-download.gradle +344 -152
- package/android/prebuilt-versions.gradle +1 -1
- package/android/src/main/assets/model_licenses/asr-models-license-status.csv +409 -0
- package/android/src/main/assets/model_licenses/qnn-asr-models-license-status.csv +695 -0
- package/android/src/main/assets/model_licenses/tts-models-license-status.csv +596 -0
- package/android/src/main/cpp/CMakeLists.txt +28 -10
- package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.cpp +2 -2
- package/android/src/main/cpp/jni/audio/sherpa-onnx-audio-convert-jni.cpp +268 -2
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-tts.cpp +6 -2
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-validate-tts.cpp +4 -2
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +40 -10
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +99 -0
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxOnlineSttHelper.kt +4 -1
- package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +112 -97
- package/ios/Resources/model_licenses/asr-models-license-status.csv +409 -0
- package/ios/Resources/model_licenses/qnn-asr-models-license-status.csv +695 -0
- package/ios/Resources/model_licenses/tts-models-license-status.csv +596 -0
- package/ios/SherpaOnnx+OnlineSTT.mm +2 -0
- package/ios/SherpaOnnx+PcmLiveStream.mm +2 -29
- package/ios/SherpaOnnx+TTS.mm +178 -20
- package/ios/SherpaOnnx.mm +54 -0
- package/ios/SherpaOnnxAudioConvert.h +10 -0
- package/ios/SherpaOnnxAudioConvert.mm +257 -1
- package/ios/archive/sherpa-onnx-archive-helper.h +3 -0
- package/ios/archive/sherpa-onnx-archive-helper.mm +39 -6
- package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +13 -2
- package/ios/model_detect/sherpa-onnx-validate-tts.mm +4 -2
- package/ios/online_stt/sherpa-onnx-online-stt-wrapper.h +1 -0
- package/ios/online_stt/sherpa-onnx-online-stt-wrapper.mm +4 -0
- package/ios/tts/sherpa-onnx-tts-wrapper.h +37 -0
- package/ios/tts/sherpa-onnx-tts-wrapper.mm +149 -3
- package/lib/module/NativeSherpaOnnx.js.map +1 -1
- package/lib/module/audio/index.js +8 -0
- package/lib/module/audio/index.js.map +1 -1
- package/lib/module/download/ModelDownloadManager.js +10 -929
- package/lib/module/download/ModelDownloadManager.js.map +1 -1
- package/lib/module/download/activeModelOperations.js +26 -0
- package/lib/module/download/activeModelOperations.js.map +1 -0
- package/lib/module/download/background-downloader.d.js +2 -0
- package/lib/module/download/background-downloader.d.js.map +1 -0
- package/lib/module/download/bulkPurge.js +72 -0
- package/lib/module/download/bulkPurge.js.map +1 -0
- package/lib/module/download/checksumPrompt.js +19 -0
- package/lib/module/download/checksumPrompt.js.map +1 -0
- package/lib/module/download/constants.js +7 -0
- package/lib/module/download/constants.js.map +1 -0
- package/lib/module/download/downloadEvents.js +35 -0
- package/lib/module/download/downloadEvents.js.map +1 -0
- package/lib/module/download/downloadTask.js +385 -0
- package/lib/module/download/downloadTask.js.map +1 -0
- package/lib/module/download/ensureModel.js +89 -0
- package/lib/module/download/ensureModel.js.map +1 -0
- package/lib/module/download/index.js +4 -4
- package/lib/module/download/index.js.map +1 -1
- package/lib/module/download/localModels.js +151 -0
- package/lib/module/download/localModels.js.map +1 -0
- package/lib/module/download/modelExtraction.js +174 -0
- package/lib/module/download/modelExtraction.js.map +1 -0
- package/lib/module/download/paths.js +98 -0
- package/lib/module/download/paths.js.map +1 -0
- package/lib/module/download/postDownloadProcessing.js +206 -0
- package/lib/module/download/postDownloadProcessing.js.map +1 -0
- package/lib/module/download/protectedModelKeys.js +31 -0
- package/lib/module/download/protectedModelKeys.js.map +1 -0
- package/lib/module/download/registry.js +267 -0
- package/lib/module/download/registry.js.map +1 -0
- package/lib/module/download/retry.js +59 -0
- package/lib/module/download/retry.js.map +1 -0
- package/lib/module/download/types.js +17 -0
- package/lib/module/download/types.js.map +1 -0
- package/lib/module/download/validation.js +101 -5
- package/lib/module/download/validation.js.map +1 -1
- package/lib/module/{download → extraction}/extractTarBz2.js +3 -1
- package/lib/module/extraction/extractTarBz2.js.map +1 -0
- package/lib/module/{download → extraction}/extractTarZst.js +3 -1
- package/lib/module/extraction/extractTarZst.js.map +1 -0
- package/lib/module/extraction/index.js +3 -4
- package/lib/module/extraction/index.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/licenses.js +63 -0
- package/lib/module/licenses.js.map +1 -0
- package/lib/module/stt/index.js +16 -2
- package/lib/module/stt/index.js.map +1 -1
- package/lib/module/stt/streaming.js +2 -0
- package/lib/module/stt/streaming.js.map +1 -1
- package/lib/module/stt/streamingTypes.js.map +1 -1
- package/lib/module/stt/types.js.map +1 -1
- package/lib/module/tts/index.js +20 -2
- package/lib/module/tts/index.js.map +1 -1
- package/lib/module/tts/streaming.js +4 -0
- package/lib/module/tts/streaming.js.map +1 -1
- package/lib/module/tts/types.js.map +1 -1
- package/lib/module/utils.js +16 -1
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/src/NativeSherpaOnnx.d.ts +33 -5
- package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
- package/lib/typescript/src/audio/index.d.ts +10 -0
- package/lib/typescript/src/audio/index.d.ts.map +1 -1
- package/lib/typescript/src/download/ModelDownloadManager.d.ts +10 -108
- package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -1
- package/lib/typescript/src/download/activeModelOperations.d.ts +6 -0
- package/lib/typescript/src/download/activeModelOperations.d.ts.map +1 -0
- package/lib/typescript/src/download/bulkPurge.d.ts +14 -0
- package/lib/typescript/src/download/bulkPurge.d.ts.map +1 -0
- package/lib/typescript/src/download/checksumPrompt.d.ts +3 -0
- package/lib/typescript/src/download/checksumPrompt.d.ts.map +1 -0
- package/lib/typescript/src/download/constants.d.ts +5 -0
- package/lib/typescript/src/download/constants.d.ts.map +1 -0
- package/lib/typescript/src/download/downloadEvents.d.ts +6 -0
- package/lib/typescript/src/download/downloadEvents.d.ts.map +1 -0
- package/lib/typescript/src/download/downloadTask.d.ts +20 -0
- package/lib/typescript/src/download/downloadTask.d.ts.map +1 -0
- package/lib/typescript/src/download/ensureModel.d.ts +26 -0
- package/lib/typescript/src/download/ensureModel.d.ts.map +1 -0
- package/lib/typescript/src/download/index.d.ts +7 -7
- package/lib/typescript/src/download/index.d.ts.map +1 -1
- package/lib/typescript/src/download/localModels.d.ts +15 -0
- package/lib/typescript/src/download/localModels.d.ts.map +1 -0
- package/lib/typescript/src/download/modelExtraction.d.ts +36 -0
- package/lib/typescript/src/download/modelExtraction.d.ts.map +1 -0
- package/lib/typescript/src/download/paths.d.ts +28 -0
- package/lib/typescript/src/download/paths.d.ts.map +1 -0
- package/lib/typescript/src/download/postDownloadProcessing.d.ts +19 -0
- package/lib/typescript/src/download/postDownloadProcessing.d.ts.map +1 -0
- package/lib/typescript/src/download/protectedModelKeys.d.ts +6 -0
- package/lib/typescript/src/download/protectedModelKeys.d.ts.map +1 -0
- package/lib/typescript/src/download/registry.d.ts +14 -0
- package/lib/typescript/src/download/registry.d.ts.map +1 -0
- package/lib/typescript/src/download/retry.d.ts +15 -0
- package/lib/typescript/src/download/retry.d.ts.map +1 -0
- package/lib/typescript/src/download/types.d.ts +96 -0
- package/lib/typescript/src/download/types.d.ts.map +1 -0
- package/lib/typescript/src/download/validation.d.ts +19 -0
- package/lib/typescript/src/download/validation.d.ts.map +1 -1
- package/lib/typescript/src/extraction/extractTarBz2.d.ts.map +1 -0
- package/lib/typescript/src/extraction/extractTarZst.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +1 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/licenses.d.ts +10 -0
- package/lib/typescript/src/licenses.d.ts.map +1 -0
- package/lib/typescript/src/stt/index.d.ts +4 -1
- package/lib/typescript/src/stt/index.d.ts.map +1 -1
- package/lib/typescript/src/stt/streaming.d.ts.map +1 -1
- package/lib/typescript/src/stt/streamingTypes.d.ts +5 -0
- package/lib/typescript/src/stt/streamingTypes.d.ts.map +1 -1
- package/lib/typescript/src/stt/types.d.ts +3 -1
- package/lib/typescript/src/stt/types.d.ts.map +1 -1
- package/lib/typescript/src/tts/index.d.ts +3 -1
- package/lib/typescript/src/tts/index.d.ts.map +1 -1
- package/lib/typescript/src/tts/streaming.d.ts.map +1 -1
- package/lib/typescript/src/tts/types.d.ts +6 -5
- package/lib/typescript/src/tts/types.d.ts.map +1 -1
- package/lib/typescript/src/utils.d.ts +5 -0
- package/lib/typescript/src/utils.d.ts.map +1 -1
- package/package.json +6 -1
- package/scripts/{check-model-csvs.sh → ci/check-model-csvs.sh} +9 -2
- package/scripts/ci/collect_all_sherpa_model_streams.sh +101 -0
- package/scripts/ci/collect_one_sherpa_release_stream.sh +189 -0
- package/scripts/ci/sherpa_asr_model_release_streams.json +21 -0
- package/scripts/ci/sherpa_tts_model_release_streams.json +13 -0
- package/scripts/ci/update_model_license_csv.sh +765 -0
- package/scripts/setup-ios-framework.sh +14 -11
- package/scripts/update_commercial_use.js +73 -0
- package/src/NativeSherpaOnnx.ts +36 -5
- package/src/audio/index.ts +20 -0
- package/src/download/ModelDownloadManager.ts +55 -1343
- package/src/download/activeModelOperations.ts +38 -0
- package/src/download/background-downloader.d.ts +43 -0
- package/src/download/bulkPurge.ts +102 -0
- package/src/download/checksumPrompt.ts +25 -0
- package/src/download/constants.ts +5 -0
- package/src/download/downloadEvents.ts +55 -0
- package/src/download/downloadTask.ts +497 -0
- package/src/download/ensureModel.ts +124 -0
- package/src/download/index.ts +19 -4
- package/src/download/localModels.ts +234 -0
- package/src/download/modelExtraction.ts +244 -0
- package/src/download/paths.ts +134 -0
- package/src/download/postDownloadProcessing.ts +292 -0
- package/src/download/protectedModelKeys.ts +30 -0
- package/src/download/registry.ts +404 -0
- package/src/download/retry.ts +76 -0
- package/src/download/types.ts +120 -0
- package/src/download/validation.ts +114 -8
- package/src/{download → extraction}/extractTarBz2.ts +3 -1
- package/src/{download → extraction}/extractTarZst.ts +3 -1
- package/src/extraction/index.ts +3 -7
- package/src/index.tsx +1 -0
- package/src/licenses.ts +100 -0
- package/src/stt/index.ts +20 -2
- package/src/stt/streaming.ts +3 -0
- package/src/stt/streamingTypes.ts +5 -0
- package/src/stt/types.ts +3 -1
- package/src/tts/index.ts +30 -2
- package/src/tts/streaming.ts +10 -0
- package/src/tts/types.ts +6 -5
- package/src/utils.ts +22 -1
- package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -1
- package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -1
- package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +0 -301
- package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +0 -187
- package/lib/module/download/extractTarBz2.js.map +0 -1
- package/lib/module/download/extractTarZst.js.map +0 -1
- package/lib/typescript/src/download/extractTarBz2.d.ts.map +0 -1
- package/lib/typescript/src/download/extractTarZst.d.ts.map +0 -1
- package/scripts/check-qnn-support.sh +0 -78
- /package/lib/typescript/src/{download → extraction}/extractTarBz2.d.ts +0 -0
- /package/lib/typescript/src/{download → extraction}/extractTarZst.d.ts +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ModelCategory } from './types';
|
|
2
|
+
|
|
3
|
+
/** Ref-count map keyed by `category:modelId`. A key is "active" (protected
|
|
4
|
+
* from bulk delete) as long as its count is > 0, which allows multiple
|
|
5
|
+
* concurrent post-download operations on the same model to coexist safely. */
|
|
6
|
+
const activePostProcessCounts = new Map<string, number>();
|
|
7
|
+
|
|
8
|
+
export function makeModelOperationKey(
|
|
9
|
+
category: ModelCategory,
|
|
10
|
+
modelId: string
|
|
11
|
+
): string {
|
|
12
|
+
return `${category}:${modelId}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function registerActivePostProcess(
|
|
16
|
+
category: ModelCategory,
|
|
17
|
+
modelId: string
|
|
18
|
+
): void {
|
|
19
|
+
const key = makeModelOperationKey(category, modelId);
|
|
20
|
+
activePostProcessCounts.set(key, (activePostProcessCounts.get(key) ?? 0) + 1);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function unregisterActivePostProcess(
|
|
24
|
+
category: ModelCategory,
|
|
25
|
+
modelId: string
|
|
26
|
+
): void {
|
|
27
|
+
const key = makeModelOperationKey(category, modelId);
|
|
28
|
+
const count = activePostProcessCounts.get(key) ?? 0;
|
|
29
|
+
if (count <= 1) {
|
|
30
|
+
activePostProcessCounts.delete(key);
|
|
31
|
+
} else {
|
|
32
|
+
activePostProcessCounts.set(key, count - 1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function getActivePostProcessKeys(): ReadonlySet<string> {
|
|
37
|
+
return new Set(activePostProcessCounts.keys());
|
|
38
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type declarations for @kesha-antonov/react-native-background-downloader
|
|
3
|
+
* when the package is not installed (e.g. SDK build). The real package provides full types.
|
|
4
|
+
*/
|
|
5
|
+
declare module '@kesha-antonov/react-native-background-downloader' {
|
|
6
|
+
export interface DownloadTask {
|
|
7
|
+
id: string;
|
|
8
|
+
start(): void;
|
|
9
|
+
stop(): void;
|
|
10
|
+
pause(): Promise<void>;
|
|
11
|
+
resume(): Promise<void>;
|
|
12
|
+
begin(
|
|
13
|
+
cb: (data: {
|
|
14
|
+
expectedBytes?: number;
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
}) => void
|
|
17
|
+
): DownloadTask;
|
|
18
|
+
progress(
|
|
19
|
+
cb: (data: { bytesDownloaded: number; bytesTotal: number }) => void
|
|
20
|
+
): DownloadTask;
|
|
21
|
+
done(
|
|
22
|
+
cb: (data: {
|
|
23
|
+
location?: string;
|
|
24
|
+
bytesDownloaded: number;
|
|
25
|
+
bytesTotal: number;
|
|
26
|
+
}) => void
|
|
27
|
+
): DownloadTask;
|
|
28
|
+
error(
|
|
29
|
+
cb: (data: { error?: string; errorCode?: number }) => void
|
|
30
|
+
): DownloadTask;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function createDownloadTask(options: {
|
|
34
|
+
id: string;
|
|
35
|
+
url: string;
|
|
36
|
+
destination: string;
|
|
37
|
+
metadata?: Record<string, unknown>;
|
|
38
|
+
}): DownloadTask;
|
|
39
|
+
|
|
40
|
+
export function completeHandler(taskId: string): void;
|
|
41
|
+
|
|
42
|
+
export function getExistingDownloadTasks(): Promise<DownloadTask[]>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { exists, unlink } from '@dr.pogodin/react-native-fs';
|
|
2
|
+
import { CATEGORY_CONFIG, getArchivePath } from './paths';
|
|
3
|
+
import type { ModelCategory, ModelMetaBase } from './types';
|
|
4
|
+
import { makeModelOperationKey } from './activeModelOperations';
|
|
5
|
+
import { getProtectedModelKeysForBulkDelete } from './protectedModelKeys';
|
|
6
|
+
import {
|
|
7
|
+
deleteModelByCategory,
|
|
8
|
+
listDownloadedModelsByCategory,
|
|
9
|
+
} from './localModels';
|
|
10
|
+
import {
|
|
11
|
+
deleteIncompleteDownload,
|
|
12
|
+
getIncompleteDownloads,
|
|
13
|
+
} from './downloadTask';
|
|
14
|
+
import {
|
|
15
|
+
deleteIncompleteExtraction,
|
|
16
|
+
getIncompleteExtractions,
|
|
17
|
+
} from './modelExtraction';
|
|
18
|
+
|
|
19
|
+
function allModelCategories(): ModelCategory[] {
|
|
20
|
+
return Object.keys(CATEGORY_CONFIG) as ModelCategory[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type PurgeDownloadedModelArtifactsResult = {
|
|
24
|
+
deletedComplete: number;
|
|
25
|
+
deletedIncompleteDownloads: number;
|
|
26
|
+
deletedIncompleteExtractions: number;
|
|
27
|
+
skippedProtected: number;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Deletes completed downloads, incomplete downloads, and incomplete extractions for every
|
|
32
|
+
* {@link ModelCategory}, except keys in `protectKeys` (or current {@link getProtectedModelKeysForBulkDelete}).
|
|
33
|
+
*/
|
|
34
|
+
export async function purgeDownloadedModelArtifacts(opts?: {
|
|
35
|
+
protectKeys?: ReadonlySet<string>;
|
|
36
|
+
}): Promise<PurgeDownloadedModelArtifactsResult> {
|
|
37
|
+
const protect =
|
|
38
|
+
opts?.protectKeys ?? (await getProtectedModelKeysForBulkDelete());
|
|
39
|
+
const result: PurgeDownloadedModelArtifactsResult = {
|
|
40
|
+
deletedComplete: 0,
|
|
41
|
+
deletedIncompleteDownloads: 0,
|
|
42
|
+
deletedIncompleteExtractions: 0,
|
|
43
|
+
skippedProtected: 0,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const categories = allModelCategories();
|
|
47
|
+
|
|
48
|
+
for (const category of categories) {
|
|
49
|
+
const downloaded = await listDownloadedModelsByCategory<ModelMetaBase>(
|
|
50
|
+
category
|
|
51
|
+
);
|
|
52
|
+
for (const m of downloaded) {
|
|
53
|
+
const key = makeModelOperationKey(category, m.id);
|
|
54
|
+
if (protect.has(key)) {
|
|
55
|
+
result.skippedProtected += 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
await deleteModelByCategory(category, m.id);
|
|
59
|
+
result.deletedComplete += 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
for (const category of categories) {
|
|
64
|
+
const incomplete = await getIncompleteDownloads(category);
|
|
65
|
+
for (const s of incomplete) {
|
|
66
|
+
const key = makeModelOperationKey(category, s.modelId);
|
|
67
|
+
if (protect.has(key)) {
|
|
68
|
+
result.skippedProtected += 1;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
await deleteIncompleteDownload(category, s.modelId);
|
|
72
|
+
result.deletedIncompleteDownloads += 1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
for (const category of categories) {
|
|
77
|
+
const extractions = await getIncompleteExtractions(category);
|
|
78
|
+
for (const e of extractions) {
|
|
79
|
+
const key = makeModelOperationKey(category, e.modelId);
|
|
80
|
+
if (protect.has(key)) {
|
|
81
|
+
result.skippedProtected += 1;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
await deleteIncompleteExtraction(category, e.modelId);
|
|
85
|
+
try {
|
|
86
|
+
const archivePath = getArchivePath(
|
|
87
|
+
category,
|
|
88
|
+
e.modelId,
|
|
89
|
+
e.model.archiveExt
|
|
90
|
+
);
|
|
91
|
+
if (await exists(archivePath)) {
|
|
92
|
+
await unlink(archivePath);
|
|
93
|
+
}
|
|
94
|
+
} catch {
|
|
95
|
+
// non-fatal
|
|
96
|
+
}
|
|
97
|
+
result.deletedIncompleteExtractions += 1;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Alert } from 'react-native';
|
|
2
|
+
import type { ChecksumIssue } from './types';
|
|
3
|
+
|
|
4
|
+
export function promptChecksumFallback(issue: ChecksumIssue): Promise<boolean> {
|
|
5
|
+
return new Promise((resolve) => {
|
|
6
|
+
const reasonText =
|
|
7
|
+
issue.reason === 'CHECKSUM_FAILED'
|
|
8
|
+
? 'Failed to compute checksum.'
|
|
9
|
+
: 'Computed checksum does not match the expected value.';
|
|
10
|
+
const body = `${reasonText}\n\n${issue.message}\n\nDo you want to keep the file and continue?`;
|
|
11
|
+
|
|
12
|
+
Alert.alert('Checksum Problem', body, [
|
|
13
|
+
{
|
|
14
|
+
text: 'Delete and cancel',
|
|
15
|
+
style: 'destructive',
|
|
16
|
+
onPress: () => resolve(false),
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
text: 'Keep file',
|
|
20
|
+
style: 'default',
|
|
21
|
+
onPress: () => resolve(true),
|
|
22
|
+
},
|
|
23
|
+
]);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ModelCategory,
|
|
3
|
+
ModelMetaBase,
|
|
4
|
+
DownloadProgress,
|
|
5
|
+
DownloadProgressListener,
|
|
6
|
+
ModelsListUpdatedListener,
|
|
7
|
+
} from './types';
|
|
8
|
+
|
|
9
|
+
const downloadProgressListeners = new Set<DownloadProgressListener>();
|
|
10
|
+
const modelsListUpdatedListeners = new Set<ModelsListUpdatedListener>();
|
|
11
|
+
|
|
12
|
+
export const subscribeDownloadProgress = (
|
|
13
|
+
listener: DownloadProgressListener
|
|
14
|
+
): (() => void) => {
|
|
15
|
+
downloadProgressListeners.add(listener);
|
|
16
|
+
return () => {
|
|
17
|
+
downloadProgressListeners.delete(listener);
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const subscribeModelsListUpdated = (
|
|
22
|
+
listener: ModelsListUpdatedListener
|
|
23
|
+
): (() => void) => {
|
|
24
|
+
modelsListUpdatedListeners.add(listener);
|
|
25
|
+
return () => {
|
|
26
|
+
modelsListUpdatedListeners.delete(listener);
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export function emitDownloadProgress(
|
|
31
|
+
category: ModelCategory,
|
|
32
|
+
modelId: string,
|
|
33
|
+
progress: DownloadProgress
|
|
34
|
+
): void {
|
|
35
|
+
for (const listener of downloadProgressListeners) {
|
|
36
|
+
try {
|
|
37
|
+
listener(category, modelId, progress);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.warn('Download progress listener error:', error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function emitModelsListUpdated(
|
|
45
|
+
category: ModelCategory,
|
|
46
|
+
models: ModelMetaBase[]
|
|
47
|
+
): void {
|
|
48
|
+
for (const listener of modelsListUpdatedListeners) {
|
|
49
|
+
try {
|
|
50
|
+
listener(category, models);
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.warn('Models list listener error:', error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|