react-native-sherpa-onnx 0.3.6 → 0.3.8
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 +92 -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 +37 -6
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect.h +9 -1
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.cpp +7 -0
- package/android/src/main/cpp/jni/model_detect/sherpa-onnx-validate-tts.cpp +18 -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 +127 -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 +179 -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 +49 -6
- package/ios/model_detect/sherpa-onnx-model-detect.h +9 -1
- package/ios/model_detect/sherpa-onnx-validate-tts.mm +18 -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 +158 -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-types.js +2 -0
- package/lib/module/download/background-downloader-types.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 +438 -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 +268 -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 +21 -3
- package/lib/module/tts/index.js.map +1 -1
- package/lib/module/tts/streaming.js +5 -1
- package/lib/module/tts/streaming.js.map +1 -1
- package/lib/module/tts/types.js +4 -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 +34 -6
- 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 +11 -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/background-downloader-types.d.ts +64 -0
- package/lib/typescript/src/download/background-downloader-types.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 +30 -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 +4 -2
- 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 +12 -6
- 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 +37 -6
- package/src/audio/index.ts +20 -0
- package/src/download/ModelDownloadManager.ts +57 -1343
- package/src/download/activeModelOperations.ts +38 -0
- package/src/download/background-downloader-types.ts +73 -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 +565 -0
- package/src/download/ensureModel.ts +124 -0
- package/src/download/index.ts +21 -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 +405 -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 +33 -2
- package/src/tts/streaming.ts +12 -0
- package/src/tts/types.ts +15 -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,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile-time shim for @kesha-antonov/react-native-background-downloader.
|
|
3
|
+
*
|
|
4
|
+
* The package currently ships TS sources without distributable .d.ts files.
|
|
5
|
+
* We route TS path resolution to this shim so the SDK can typecheck strictly
|
|
6
|
+
* without checking third-party TS internals.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface BackgroundDownloaderNotificationTexts {
|
|
10
|
+
downloadTitle?: string;
|
|
11
|
+
downloadStarting?: string;
|
|
12
|
+
downloadProgress?: string;
|
|
13
|
+
downloadPaused?: string;
|
|
14
|
+
downloadFinished?: string;
|
|
15
|
+
groupTitle?: string;
|
|
16
|
+
groupText?: string | ((count: number) => string);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type BackgroundDownloaderSetConfigOptions = {
|
|
20
|
+
showNotificationsEnabled?: boolean;
|
|
21
|
+
notificationsGrouping?: {
|
|
22
|
+
enabled?: boolean;
|
|
23
|
+
mode?: 'individual' | 'summaryOnly';
|
|
24
|
+
texts?: BackgroundDownloaderNotificationTexts;
|
|
25
|
+
};
|
|
26
|
+
headers?: Record<string, string>;
|
|
27
|
+
progressInterval?: number;
|
|
28
|
+
progressMinBytes?: number;
|
|
29
|
+
isLogsEnabled?: boolean;
|
|
30
|
+
maxParallelDownloads?: number;
|
|
31
|
+
allowsCellularAccess?: boolean;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export interface DownloadTask {
|
|
35
|
+
id: string;
|
|
36
|
+
start(): void;
|
|
37
|
+
stop(): void;
|
|
38
|
+
pause(): Promise<void>;
|
|
39
|
+
resume(): Promise<void>;
|
|
40
|
+
begin(
|
|
41
|
+
cb: (data: {
|
|
42
|
+
expectedBytes?: number;
|
|
43
|
+
headers?: Record<string, string>;
|
|
44
|
+
}) => void
|
|
45
|
+
): DownloadTask;
|
|
46
|
+
progress(
|
|
47
|
+
cb: (data: { bytesDownloaded: number; bytesTotal: number }) => void
|
|
48
|
+
): DownloadTask;
|
|
49
|
+
done(
|
|
50
|
+
cb: (data: {
|
|
51
|
+
location?: string;
|
|
52
|
+
bytesDownloaded: number;
|
|
53
|
+
bytesTotal: number;
|
|
54
|
+
}) => void
|
|
55
|
+
): DownloadTask;
|
|
56
|
+
error(
|
|
57
|
+
cb: (data: { error?: string; errorCode?: number }) => void
|
|
58
|
+
): DownloadTask;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export declare function setConfig(
|
|
62
|
+
options: BackgroundDownloaderSetConfigOptions
|
|
63
|
+
): void;
|
|
64
|
+
|
|
65
|
+
export declare function createDownloadTask(options: {
|
|
66
|
+
id: string;
|
|
67
|
+
url: string;
|
|
68
|
+
destination: string;
|
|
69
|
+
metadata?: Record<string, unknown>;
|
|
70
|
+
}): DownloadTask;
|
|
71
|
+
|
|
72
|
+
export declare function completeHandler(taskId: string): void;
|
|
73
|
+
export declare function getExistingDownloadTasks(): Promise<DownloadTask[]>;
|
|
@@ -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
|
+
}
|