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.
Files changed (228) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +92 -21
  3. package/SherpaOnnx.podspec +3 -0
  4. package/THIRD_PARTY_LICENSES/README.md +62 -0
  5. package/THIRD_PARTY_LICENSES/ffmpeg.txt +502 -0
  6. package/THIRD_PARTY_LICENSES/libarchive.txt +65 -0
  7. package/THIRD_PARTY_LICENSES/nvidia_omla.txt +181 -0
  8. package/THIRD_PARTY_LICENSES/onnxruntime.txt +21 -0
  9. package/THIRD_PARTY_LICENSES/opus.txt +44 -0
  10. package/THIRD_PARTY_LICENSES/sherpa-onnx.txt +201 -0
  11. package/THIRD_PARTY_LICENSES/shine.txt +482 -0
  12. package/THIRD_PARTY_LICENSES/zstd.txt +30 -0
  13. package/android/build.gradle +7 -3
  14. package/android/prebuilt-download.gradle +344 -152
  15. package/android/prebuilt-versions.gradle +1 -1
  16. package/android/src/main/assets/model_licenses/asr-models-license-status.csv +409 -0
  17. package/android/src/main/assets/model_licenses/qnn-asr-models-license-status.csv +695 -0
  18. package/android/src/main/assets/model_licenses/tts-models-license-status.csv +596 -0
  19. package/android/src/main/cpp/CMakeLists.txt +28 -10
  20. package/android/src/main/cpp/jni/archive/sherpa-onnx-archive-helper.cpp +2 -2
  21. package/android/src/main/cpp/jni/audio/sherpa-onnx-audio-convert-jni.cpp +268 -2
  22. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect-tts.cpp +37 -6
  23. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-model-detect.h +9 -1
  24. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-tts-wrapper.cpp +7 -0
  25. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-validate-tts.cpp +18 -2
  26. package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +40 -10
  27. package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +99 -0
  28. package/android/src/main/java/com/sherpaonnx/SherpaOnnxOnlineSttHelper.kt +4 -1
  29. package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +127 -97
  30. package/ios/Resources/model_licenses/asr-models-license-status.csv +409 -0
  31. package/ios/Resources/model_licenses/qnn-asr-models-license-status.csv +695 -0
  32. package/ios/Resources/model_licenses/tts-models-license-status.csv +596 -0
  33. package/ios/SherpaOnnx+OnlineSTT.mm +2 -0
  34. package/ios/SherpaOnnx+PcmLiveStream.mm +2 -29
  35. package/ios/SherpaOnnx+TTS.mm +179 -20
  36. package/ios/SherpaOnnx.mm +54 -0
  37. package/ios/SherpaOnnxAudioConvert.h +10 -0
  38. package/ios/SherpaOnnxAudioConvert.mm +257 -1
  39. package/ios/archive/sherpa-onnx-archive-helper.h +3 -0
  40. package/ios/archive/sherpa-onnx-archive-helper.mm +39 -6
  41. package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +49 -6
  42. package/ios/model_detect/sherpa-onnx-model-detect.h +9 -1
  43. package/ios/model_detect/sherpa-onnx-validate-tts.mm +18 -2
  44. package/ios/online_stt/sherpa-onnx-online-stt-wrapper.h +1 -0
  45. package/ios/online_stt/sherpa-onnx-online-stt-wrapper.mm +4 -0
  46. package/ios/tts/sherpa-onnx-tts-wrapper.h +37 -0
  47. package/ios/tts/sherpa-onnx-tts-wrapper.mm +158 -3
  48. package/lib/module/NativeSherpaOnnx.js.map +1 -1
  49. package/lib/module/audio/index.js +8 -0
  50. package/lib/module/audio/index.js.map +1 -1
  51. package/lib/module/download/ModelDownloadManager.js +10 -929
  52. package/lib/module/download/ModelDownloadManager.js.map +1 -1
  53. package/lib/module/download/activeModelOperations.js +26 -0
  54. package/lib/module/download/activeModelOperations.js.map +1 -0
  55. package/lib/module/download/background-downloader-types.js +2 -0
  56. package/lib/module/download/background-downloader-types.js.map +1 -0
  57. package/lib/module/download/bulkPurge.js +72 -0
  58. package/lib/module/download/bulkPurge.js.map +1 -0
  59. package/lib/module/download/checksumPrompt.js +19 -0
  60. package/lib/module/download/checksumPrompt.js.map +1 -0
  61. package/lib/module/download/constants.js +7 -0
  62. package/lib/module/download/constants.js.map +1 -0
  63. package/lib/module/download/downloadEvents.js +35 -0
  64. package/lib/module/download/downloadEvents.js.map +1 -0
  65. package/lib/module/download/downloadTask.js +438 -0
  66. package/lib/module/download/downloadTask.js.map +1 -0
  67. package/lib/module/download/ensureModel.js +89 -0
  68. package/lib/module/download/ensureModel.js.map +1 -0
  69. package/lib/module/download/index.js +4 -4
  70. package/lib/module/download/index.js.map +1 -1
  71. package/lib/module/download/localModels.js +151 -0
  72. package/lib/module/download/localModels.js.map +1 -0
  73. package/lib/module/download/modelExtraction.js +174 -0
  74. package/lib/module/download/modelExtraction.js.map +1 -0
  75. package/lib/module/download/paths.js +98 -0
  76. package/lib/module/download/paths.js.map +1 -0
  77. package/lib/module/download/postDownloadProcessing.js +206 -0
  78. package/lib/module/download/postDownloadProcessing.js.map +1 -0
  79. package/lib/module/download/protectedModelKeys.js +31 -0
  80. package/lib/module/download/protectedModelKeys.js.map +1 -0
  81. package/lib/module/download/registry.js +268 -0
  82. package/lib/module/download/registry.js.map +1 -0
  83. package/lib/module/download/retry.js +59 -0
  84. package/lib/module/download/retry.js.map +1 -0
  85. package/lib/module/download/types.js +17 -0
  86. package/lib/module/download/types.js.map +1 -0
  87. package/lib/module/download/validation.js +101 -5
  88. package/lib/module/download/validation.js.map +1 -1
  89. package/lib/module/{download → extraction}/extractTarBz2.js +3 -1
  90. package/lib/module/extraction/extractTarBz2.js.map +1 -0
  91. package/lib/module/{download → extraction}/extractTarZst.js +3 -1
  92. package/lib/module/extraction/extractTarZst.js.map +1 -0
  93. package/lib/module/extraction/index.js +3 -4
  94. package/lib/module/extraction/index.js.map +1 -1
  95. package/lib/module/index.js +1 -1
  96. package/lib/module/index.js.map +1 -1
  97. package/lib/module/licenses.js +63 -0
  98. package/lib/module/licenses.js.map +1 -0
  99. package/lib/module/stt/index.js +16 -2
  100. package/lib/module/stt/index.js.map +1 -1
  101. package/lib/module/stt/streaming.js +2 -0
  102. package/lib/module/stt/streaming.js.map +1 -1
  103. package/lib/module/stt/streamingTypes.js.map +1 -1
  104. package/lib/module/stt/types.js.map +1 -1
  105. package/lib/module/tts/index.js +21 -3
  106. package/lib/module/tts/index.js.map +1 -1
  107. package/lib/module/tts/streaming.js +5 -1
  108. package/lib/module/tts/streaming.js.map +1 -1
  109. package/lib/module/tts/types.js +4 -1
  110. package/lib/module/tts/types.js.map +1 -1
  111. package/lib/module/utils.js +16 -1
  112. package/lib/module/utils.js.map +1 -1
  113. package/lib/typescript/src/NativeSherpaOnnx.d.ts +34 -6
  114. package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
  115. package/lib/typescript/src/audio/index.d.ts +10 -0
  116. package/lib/typescript/src/audio/index.d.ts.map +1 -1
  117. package/lib/typescript/src/download/ModelDownloadManager.d.ts +11 -108
  118. package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -1
  119. package/lib/typescript/src/download/activeModelOperations.d.ts +6 -0
  120. package/lib/typescript/src/download/activeModelOperations.d.ts.map +1 -0
  121. package/lib/typescript/src/download/background-downloader-types.d.ts +64 -0
  122. package/lib/typescript/src/download/background-downloader-types.d.ts.map +1 -0
  123. package/lib/typescript/src/download/bulkPurge.d.ts +14 -0
  124. package/lib/typescript/src/download/bulkPurge.d.ts.map +1 -0
  125. package/lib/typescript/src/download/checksumPrompt.d.ts +3 -0
  126. package/lib/typescript/src/download/checksumPrompt.d.ts.map +1 -0
  127. package/lib/typescript/src/download/constants.d.ts +5 -0
  128. package/lib/typescript/src/download/constants.d.ts.map +1 -0
  129. package/lib/typescript/src/download/downloadEvents.d.ts +6 -0
  130. package/lib/typescript/src/download/downloadEvents.d.ts.map +1 -0
  131. package/lib/typescript/src/download/downloadTask.d.ts +30 -0
  132. package/lib/typescript/src/download/downloadTask.d.ts.map +1 -0
  133. package/lib/typescript/src/download/ensureModel.d.ts +26 -0
  134. package/lib/typescript/src/download/ensureModel.d.ts.map +1 -0
  135. package/lib/typescript/src/download/index.d.ts +7 -7
  136. package/lib/typescript/src/download/index.d.ts.map +1 -1
  137. package/lib/typescript/src/download/localModels.d.ts +15 -0
  138. package/lib/typescript/src/download/localModels.d.ts.map +1 -0
  139. package/lib/typescript/src/download/modelExtraction.d.ts +36 -0
  140. package/lib/typescript/src/download/modelExtraction.d.ts.map +1 -0
  141. package/lib/typescript/src/download/paths.d.ts +28 -0
  142. package/lib/typescript/src/download/paths.d.ts.map +1 -0
  143. package/lib/typescript/src/download/postDownloadProcessing.d.ts +19 -0
  144. package/lib/typescript/src/download/postDownloadProcessing.d.ts.map +1 -0
  145. package/lib/typescript/src/download/protectedModelKeys.d.ts +6 -0
  146. package/lib/typescript/src/download/protectedModelKeys.d.ts.map +1 -0
  147. package/lib/typescript/src/download/registry.d.ts +14 -0
  148. package/lib/typescript/src/download/registry.d.ts.map +1 -0
  149. package/lib/typescript/src/download/retry.d.ts +15 -0
  150. package/lib/typescript/src/download/retry.d.ts.map +1 -0
  151. package/lib/typescript/src/download/types.d.ts +96 -0
  152. package/lib/typescript/src/download/types.d.ts.map +1 -0
  153. package/lib/typescript/src/download/validation.d.ts +19 -0
  154. package/lib/typescript/src/download/validation.d.ts.map +1 -1
  155. package/lib/typescript/src/extraction/extractTarBz2.d.ts.map +1 -0
  156. package/lib/typescript/src/extraction/extractTarZst.d.ts.map +1 -0
  157. package/lib/typescript/src/index.d.ts +1 -0
  158. package/lib/typescript/src/index.d.ts.map +1 -1
  159. package/lib/typescript/src/licenses.d.ts +10 -0
  160. package/lib/typescript/src/licenses.d.ts.map +1 -0
  161. package/lib/typescript/src/stt/index.d.ts +4 -1
  162. package/lib/typescript/src/stt/index.d.ts.map +1 -1
  163. package/lib/typescript/src/stt/streaming.d.ts.map +1 -1
  164. package/lib/typescript/src/stt/streamingTypes.d.ts +5 -0
  165. package/lib/typescript/src/stt/streamingTypes.d.ts.map +1 -1
  166. package/lib/typescript/src/stt/types.d.ts +3 -1
  167. package/lib/typescript/src/stt/types.d.ts.map +1 -1
  168. package/lib/typescript/src/tts/index.d.ts +4 -2
  169. package/lib/typescript/src/tts/index.d.ts.map +1 -1
  170. package/lib/typescript/src/tts/streaming.d.ts.map +1 -1
  171. package/lib/typescript/src/tts/types.d.ts +12 -6
  172. package/lib/typescript/src/tts/types.d.ts.map +1 -1
  173. package/lib/typescript/src/utils.d.ts +5 -0
  174. package/lib/typescript/src/utils.d.ts.map +1 -1
  175. package/package.json +6 -1
  176. package/scripts/{check-model-csvs.sh → ci/check-model-csvs.sh} +9 -2
  177. package/scripts/ci/collect_all_sherpa_model_streams.sh +101 -0
  178. package/scripts/ci/collect_one_sherpa_release_stream.sh +189 -0
  179. package/scripts/ci/sherpa_asr_model_release_streams.json +21 -0
  180. package/scripts/ci/sherpa_tts_model_release_streams.json +13 -0
  181. package/scripts/ci/update_model_license_csv.sh +765 -0
  182. package/scripts/setup-ios-framework.sh +14 -11
  183. package/scripts/update_commercial_use.js +73 -0
  184. package/src/NativeSherpaOnnx.ts +37 -6
  185. package/src/audio/index.ts +20 -0
  186. package/src/download/ModelDownloadManager.ts +57 -1343
  187. package/src/download/activeModelOperations.ts +38 -0
  188. package/src/download/background-downloader-types.ts +73 -0
  189. package/src/download/bulkPurge.ts +102 -0
  190. package/src/download/checksumPrompt.ts +25 -0
  191. package/src/download/constants.ts +5 -0
  192. package/src/download/downloadEvents.ts +55 -0
  193. package/src/download/downloadTask.ts +565 -0
  194. package/src/download/ensureModel.ts +124 -0
  195. package/src/download/index.ts +21 -4
  196. package/src/download/localModels.ts +234 -0
  197. package/src/download/modelExtraction.ts +244 -0
  198. package/src/download/paths.ts +134 -0
  199. package/src/download/postDownloadProcessing.ts +292 -0
  200. package/src/download/protectedModelKeys.ts +30 -0
  201. package/src/download/registry.ts +405 -0
  202. package/src/download/retry.ts +76 -0
  203. package/src/download/types.ts +120 -0
  204. package/src/download/validation.ts +114 -8
  205. package/src/{download → extraction}/extractTarBz2.ts +3 -1
  206. package/src/{download → extraction}/extractTarZst.ts +3 -1
  207. package/src/extraction/index.ts +3 -7
  208. package/src/index.tsx +1 -0
  209. package/src/licenses.ts +100 -0
  210. package/src/stt/index.ts +20 -2
  211. package/src/stt/streaming.ts +3 -0
  212. package/src/stt/streamingTypes.ts +5 -0
  213. package/src/stt/types.ts +3 -1
  214. package/src/tts/index.ts +33 -2
  215. package/src/tts/streaming.ts +12 -0
  216. package/src/tts/types.ts +15 -5
  217. package/src/utils.ts +22 -1
  218. package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -1
  219. package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -1
  220. package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +0 -301
  221. package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +0 -187
  222. package/lib/module/download/extractTarBz2.js.map +0 -1
  223. package/lib/module/download/extractTarZst.js.map +0 -1
  224. package/lib/typescript/src/download/extractTarBz2.d.ts.map +0 -1
  225. package/lib/typescript/src/download/extractTarZst.d.ts.map +0 -1
  226. package/scripts/check-qnn-support.sh +0 -78
  227. /package/lib/typescript/src/{download → extraction}/extractTarBz2.d.ts +0 -0
  228. /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,5 @@
1
+ export const RELEASE_API_BASE =
2
+ 'https://api.github.com/repos/k2-fsa/sherpa-onnx/releases/tags';
3
+ export const CACHE_TTL_MINUTES = 24 * 60;
4
+ export const MODEL_ARCHIVE_EXT = '.tar.bz2';
5
+ export const MODEL_ONNX_EXT = '.onnx';
@@ -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
+ }