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,438 @@
1
+ "use strict";
2
+
3
+ import { Platform } from 'react-native';
4
+ import { createDownloadTask, completeHandler, getExistingDownloadTasks, setConfig } from '@kesha-antonov/react-native-background-downloader';
5
+ import { exists, readFile, mkdir, writeFile, stat, unlink } from '@dr.pogodin/react-native-fs';
6
+ import { checkDiskSpace, removeDirectoryRecursive } from "./validation.js";
7
+ import { getModelsBaseDir, getModelDir, getArchivePath, getReadyMarkerPath, getDownloadStatePath, getNativeAssetExtractedModelDir, getTarArchivePath, getOnnxPath } from "./paths.js";
8
+ import { emitDownloadProgress } from "./downloadEvents.js";
9
+ import { runPostDownloadProcessing } from "./postDownloadProcessing.js";
10
+ import { getModelByIdByCategory } from "./registry.js";
11
+ import { listDownloadedModelsByCategory } from "./localModels.js";
12
+ function makeDownloadTaskId(category, id) {
13
+ return `${category}:${id}`;
14
+ }
15
+ const activeDownloadTasks = new Map();
16
+ let androidDownloaderNotificationConfigApplied = false;
17
+ let didWarnConfigFailure = false;
18
+ function warnBackgroundDownloaderConfigFailure(context, error) {
19
+ if (didWarnConfigFailure) return;
20
+ didWarnConfigFailure = true;
21
+ const reason = error instanceof Error ? error.message : String(error);
22
+ console.warn(`[Download] Background downloader config failed (${context}): ${reason}`);
23
+ }
24
+ /**
25
+ * Apply your own `@kesha-antonov/react-native-background-downloader` `setConfig` **before** the first
26
+ * model download. When called, the SDK will **not** overwrite it with built-in defaults on first download.
27
+ *
28
+ * Safe to call at app startup (e.g. `App.tsx`). Other `setConfig` options (e.g. headers) are forwarded
29
+ * where the native module supports them on each platform.
30
+ */
31
+ export function configureModelDownloadBackgroundDownloader(options) {
32
+ try {
33
+ setConfig(options);
34
+ androidDownloaderNotificationConfigApplied = true;
35
+ } catch (error) {
36
+ // Keep fallback default config enabled if custom config fails.
37
+ warnBackgroundDownloaderConfigFailure('custom', error);
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Library default is showNotificationsEnabled: false (silent empty FGS notification).
43
+ * Enable visible notifications unless the host app already called `configureModelDownloadBackgroundDownloader`.
44
+ */
45
+ function ensureAndroidBackgroundDownloaderNotifications() {
46
+ if (androidDownloaderNotificationConfigApplied) return;
47
+ if (Platform.OS !== 'android') return;
48
+ try {
49
+ setConfig({
50
+ showNotificationsEnabled: true,
51
+ notificationsGrouping: {
52
+ enabled: false,
53
+ mode: 'individual',
54
+ texts: {
55
+ downloadTitle: 'Model download',
56
+ downloadStarting: 'Starting download…',
57
+ downloadProgress: 'Downloading… {progress}%'
58
+ }
59
+ }
60
+ });
61
+ androidDownloaderNotificationConfigApplied = true;
62
+ } catch (error) {
63
+ warnBackgroundDownloaderConfigFailure('default', error);
64
+ }
65
+ }
66
+ export async function downloadModelByCategory(category, id, opts) {
67
+ const isAborted = () => Boolean(opts?.signal?.aborted);
68
+ if (opts?.signal?.aborted) {
69
+ const abortError = new Error('Download aborted');
70
+ abortError.name = 'AbortError';
71
+ throw abortError;
72
+ }
73
+ const model = await getModelByIdByCategory(category, id);
74
+ if (!model) {
75
+ throw new Error(`Unknown model id: ${id}`);
76
+ }
77
+ const baseDir = getModelsBaseDir(category);
78
+ await mkdir(baseDir);
79
+ const downloadPath = getArchivePath(category, id, model.archiveExt);
80
+ const isArchive = model.archiveExt === 'tar.bz2';
81
+ const modelDir = getModelDir(category, id);
82
+ const sleep = ms => new Promise(resolve => {
83
+ setTimeout(resolve, ms);
84
+ });
85
+ const cleanupPartial = async () => {
86
+ if (!isArchive) return;
87
+ if (await exists(modelDir)) {
88
+ await unlink(modelDir);
89
+ }
90
+ };
91
+ const cleanupPartialWithRetry = async () => {
92
+ for (let attempt = 0; attempt < 4; attempt += 1) {
93
+ await cleanupPartial();
94
+ if (!(await exists(modelDir))) return;
95
+ await sleep(400);
96
+ }
97
+ if (await exists(modelDir)) {
98
+ console.warn(`Model cleanup after abort did not fully complete for ${category}:${id}`);
99
+ }
100
+ };
101
+ const diskSpaceCheck = await checkDiskSpace(model.bytes);
102
+ if (!diskSpaceCheck.success) {
103
+ throw new Error(`Insufficient disk space: ${diskSpaceCheck.message}`);
104
+ }
105
+ ensureAndroidBackgroundDownloaderNotifications();
106
+ const statePath = getDownloadStatePath(category, id);
107
+ if (opts?.overwrite) {
108
+ if (await exists(modelDir)) await unlink(modelDir);
109
+ if (await exists(downloadPath)) await unlink(downloadPath);
110
+ if (await exists(statePath)) await unlink(statePath);
111
+ } else {
112
+ const readyMarkerExists = await exists(getReadyMarkerPath(category, id));
113
+ if (!readyMarkerExists && isArchive) {
114
+ if (await exists(modelDir)) await unlink(modelDir);
115
+ }
116
+ }
117
+ try {
118
+ const downloadState = {
119
+ modelId: id,
120
+ category,
121
+ phase: 'downloading',
122
+ startedAt: new Date().toISOString(),
123
+ archivePath: downloadPath,
124
+ model,
125
+ totalBytes: model.bytes
126
+ };
127
+ await mkdir(getModelsBaseDir(category));
128
+ await writeFile(statePath, JSON.stringify(downloadState), 'utf8');
129
+ if (!isArchive) {
130
+ await mkdir(modelDir);
131
+ }
132
+ const taskId = makeDownloadTaskId(category, id);
133
+ return new Promise((resolve, reject) => {
134
+ let abortHandler;
135
+ const cleanup = () => {
136
+ if (abortHandler && opts?.signal) {
137
+ opts.signal.removeEventListener('abort', abortHandler);
138
+ abortHandler = undefined;
139
+ }
140
+ activeDownloadTasks.delete(taskId);
141
+ };
142
+ const task = createDownloadTask({
143
+ id: taskId,
144
+ url: model.downloadUrl,
145
+ destination: downloadPath,
146
+ metadata: {}
147
+ }).progress(({
148
+ bytesDownloaded,
149
+ bytesTotal
150
+ }) => {
151
+ if (isAborted()) return;
152
+ const total = bytesTotal ?? model.bytes ?? 0;
153
+ const percent = total > 0 ? bytesDownloaded / total * 100 : 0;
154
+ const progress = {
155
+ bytesDownloaded,
156
+ totalBytes: total,
157
+ percent,
158
+ phase: 'downloading'
159
+ };
160
+ opts?.onProgress?.(progress);
161
+ emitDownloadProgress(category, id, progress);
162
+ }).done(async () => {
163
+ cleanup();
164
+ try {
165
+ const result = await runPostDownloadProcessing({
166
+ category,
167
+ id,
168
+ model,
169
+ downloadPath,
170
+ modelDir,
171
+ isArchive,
172
+ statePath,
173
+ signal: opts?.signal,
174
+ onChecksumIssue: opts?.onChecksumIssue,
175
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract,
176
+ onProgress: opts?.onProgress,
177
+ getDownloadedList: () => listDownloadedModelsByCategory(category)
178
+ });
179
+ completeHandler(taskId);
180
+ resolve(result);
181
+ } catch (e) {
182
+ completeHandler(taskId);
183
+ reject(e);
184
+ }
185
+ }).error(({
186
+ error,
187
+ errorCode
188
+ }) => {
189
+ cleanup();
190
+ completeHandler(taskId);
191
+ (async () => {
192
+ try {
193
+ if (await exists(statePath)) await unlink(statePath);
194
+ } catch {
195
+ // ignore
196
+ }
197
+ })();
198
+ reject(new Error(typeof error === 'string' ? error : String(errorCode ?? error)));
199
+ });
200
+ activeDownloadTasks.set(taskId, task);
201
+ if (opts?.signal) {
202
+ abortHandler = () => {
203
+ task.stop();
204
+ cleanup();
205
+ (async () => {
206
+ try {
207
+ if (await exists(statePath)) await unlink(statePath);
208
+ } catch {
209
+ // ignore
210
+ }
211
+ })();
212
+ const err = new Error('Download aborted');
213
+ err.name = 'AbortError';
214
+ reject(err);
215
+ };
216
+ opts.signal.addEventListener('abort', abortHandler);
217
+ }
218
+ task.start();
219
+ });
220
+ } catch (err) {
221
+ if (err instanceof Error && err.name === 'AbortError' || isAborted()) {
222
+ await cleanupPartialWithRetry();
223
+ try {
224
+ if (await exists(statePath)) await unlink(statePath);
225
+ } catch {
226
+ // ignore
227
+ }
228
+ }
229
+ if (isArchive && !(err instanceof Error && err.name === 'AbortError')) {
230
+ try {
231
+ if (await exists(downloadPath)) {
232
+ const archiveStat = await stat(downloadPath);
233
+ if (model.bytes > 0 && archiveStat.size < model.bytes) {
234
+ console.warn(`[Download] Deleting truncated archive for ${category}:${id} (${archiveStat.size}/${model.bytes})`);
235
+ await unlink(downloadPath);
236
+ }
237
+ }
238
+ } catch {
239
+ // ignore
240
+ }
241
+ }
242
+ throw err;
243
+ }
244
+ }
245
+ export async function getIncompleteDownloads(category) {
246
+ const prefix = category + ':';
247
+ const states = [];
248
+ const existingTasks = await getExistingDownloadTasks();
249
+ for (const task of existingTasks) {
250
+ if (!task.id || !task.id.startsWith(prefix)) continue;
251
+ const modelId = task.id.slice(prefix.length);
252
+ const readyPath = getReadyMarkerPath(category, modelId);
253
+ if (await exists(readyPath)) continue;
254
+ const statePath = getDownloadStatePath(category, modelId);
255
+ let model;
256
+ let totalBytes;
257
+ let archivePath;
258
+ let startedAt;
259
+ if (await exists(statePath)) {
260
+ try {
261
+ const raw = await readFile(statePath, 'utf8');
262
+ const fromFile = JSON.parse(raw);
263
+ model = fromFile.model;
264
+ totalBytes = fromFile.totalBytes ?? fromFile.model?.bytes;
265
+ archivePath = fromFile.archivePath;
266
+ startedAt = fromFile.startedAt;
267
+ } catch {
268
+ // ignore
269
+ }
270
+ }
271
+ if (!model) {
272
+ const meta = await getModelByIdByCategory(category, modelId);
273
+ if (!meta) continue;
274
+ model = meta;
275
+ totalBytes = model.bytes;
276
+ archivePath = getArchivePath(category, modelId, model.archiveExt);
277
+ }
278
+ let bytesDownloaded;
279
+ if (archivePath) {
280
+ try {
281
+ const st = await stat(archivePath);
282
+ if (st?.size != null && st.size >= 0) bytesDownloaded = st.size;
283
+ } catch {
284
+ // ignore
285
+ }
286
+ }
287
+ states.push({
288
+ modelId,
289
+ category,
290
+ phase: 'downloading',
291
+ startedAt: startedAt ?? new Date().toISOString(),
292
+ archivePath: archivePath ?? '',
293
+ model,
294
+ bytesDownloaded,
295
+ totalBytes: totalBytes ?? model.bytes
296
+ });
297
+ }
298
+ return states;
299
+ }
300
+ export async function resumeDownload(category, id, opts) {
301
+ ensureAndroidBackgroundDownloaderNotifications();
302
+ const taskId = makeDownloadTaskId(category, id);
303
+ const existingTasks = await getExistingDownloadTasks();
304
+ const existing = existingTasks.find(t => t.id === taskId);
305
+ if (!existing) {
306
+ return downloadModelByCategory(category, id, {
307
+ onProgress: opts?.onProgress,
308
+ signal: opts?.signal,
309
+ onChecksumIssue: opts?.onChecksumIssue,
310
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract
311
+ });
312
+ }
313
+ const model = await getModelByIdByCategory(category, id);
314
+ if (!model) throw new Error(`Unknown model id: ${id}`);
315
+ const downloadPath = getArchivePath(category, id, model.archiveExt);
316
+ const modelDir = getModelDir(category, id);
317
+ const isArchive = model.archiveExt === 'tar.bz2';
318
+ const statePath = getDownloadStatePath(category, id);
319
+ const isAborted = () => Boolean(opts?.signal?.aborted);
320
+ return new Promise((resolve, reject) => {
321
+ let abortHandler;
322
+ const cleanup = () => {
323
+ if (abortHandler && opts?.signal) {
324
+ opts.signal.removeEventListener('abort', abortHandler);
325
+ abortHandler = undefined;
326
+ }
327
+ activeDownloadTasks.delete(taskId);
328
+ };
329
+ existing.progress(({
330
+ bytesDownloaded,
331
+ bytesTotal
332
+ }) => {
333
+ if (isAborted()) return;
334
+ const total = bytesTotal ?? model.bytes ?? 0;
335
+ const percent = total > 0 ? bytesDownloaded / total * 100 : 0;
336
+ opts?.onProgress?.({
337
+ bytesDownloaded,
338
+ totalBytes: total,
339
+ percent,
340
+ phase: 'downloading'
341
+ });
342
+ emitDownloadProgress(category, id, {
343
+ bytesDownloaded,
344
+ totalBytes: total,
345
+ percent,
346
+ phase: 'downloading'
347
+ });
348
+ }).done(async () => {
349
+ cleanup();
350
+ try {
351
+ const result = await runPostDownloadProcessing({
352
+ category,
353
+ id,
354
+ model,
355
+ downloadPath,
356
+ modelDir,
357
+ isArchive,
358
+ statePath,
359
+ signal: opts?.signal,
360
+ onChecksumIssue: opts?.onChecksumIssue,
361
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract,
362
+ onProgress: opts?.onProgress,
363
+ getDownloadedList: () => listDownloadedModelsByCategory(category)
364
+ });
365
+ completeHandler(taskId);
366
+ resolve(result);
367
+ } catch (e) {
368
+ completeHandler(taskId);
369
+ reject(e);
370
+ }
371
+ }).error(({
372
+ error,
373
+ errorCode
374
+ }) => {
375
+ cleanup();
376
+ completeHandler(taskId);
377
+ (async () => {
378
+ try {
379
+ if (await exists(statePath)) await unlink(statePath);
380
+ } catch {
381
+ // ignore
382
+ }
383
+ })();
384
+ reject(new Error(typeof error === 'string' ? error : String(errorCode ?? error)));
385
+ });
386
+ activeDownloadTasks.set(taskId, existing);
387
+ if (opts?.signal) {
388
+ abortHandler = () => {
389
+ existing.stop();
390
+ cleanup();
391
+ (async () => {
392
+ try {
393
+ if (await exists(statePath)) await unlink(statePath);
394
+ } catch {
395
+ // ignore
396
+ }
397
+ })();
398
+ const err = new Error('Download aborted');
399
+ err.name = 'AbortError';
400
+ reject(err);
401
+ };
402
+ opts.signal.addEventListener('abort', abortHandler);
403
+ }
404
+ existing.resume().catch(() => {});
405
+ });
406
+ }
407
+ export async function deleteIncompleteDownload(category, id) {
408
+ const taskId = makeDownloadTaskId(category, id);
409
+ const existingTasks = await getExistingDownloadTasks();
410
+ const task = existingTasks.find(t => t.id === taskId);
411
+ if (task) {
412
+ task.stop();
413
+ activeDownloadTasks.delete(taskId);
414
+ }
415
+ const modelDir = getModelDir(category, id);
416
+ if (await exists(modelDir)) {
417
+ await unlink(modelDir);
418
+ }
419
+ const tarPath = getTarArchivePath(category, id);
420
+ const onnxPath = getOnnxPath(category, id);
421
+ if (await exists(tarPath)) {
422
+ await unlink(tarPath);
423
+ }
424
+ if (await exists(onnxPath)) {
425
+ await unlink(onnxPath);
426
+ }
427
+ const statePath = getDownloadStatePath(category, id);
428
+ if (await exists(statePath)) {
429
+ await unlink(statePath);
430
+ }
431
+ await removeDirectoryRecursive(getNativeAssetExtractedModelDir(id));
432
+ }
433
+
434
+ /** Task ids in the form `category:modelId` for downloads currently tracked in JS (before post-processing). */
435
+ export function getActiveDownloadTaskKeys() {
436
+ return [...activeDownloadTasks.keys()];
437
+ }
438
+ //# sourceMappingURL=downloadTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Platform","createDownloadTask","completeHandler","getExistingDownloadTasks","setConfig","exists","readFile","mkdir","writeFile","stat","unlink","checkDiskSpace","removeDirectoryRecursive","getModelsBaseDir","getModelDir","getArchivePath","getReadyMarkerPath","getDownloadStatePath","getNativeAssetExtractedModelDir","getTarArchivePath","getOnnxPath","emitDownloadProgress","runPostDownloadProcessing","getModelByIdByCategory","listDownloadedModelsByCategory","makeDownloadTaskId","category","id","activeDownloadTasks","Map","androidDownloaderNotificationConfigApplied","didWarnConfigFailure","warnBackgroundDownloaderConfigFailure","context","error","reason","Error","message","String","console","warn","configureModelDownloadBackgroundDownloader","options","ensureAndroidBackgroundDownloaderNotifications","OS","showNotificationsEnabled","notificationsGrouping","enabled","mode","texts","downloadTitle","downloadStarting","downloadProgress","downloadModelByCategory","opts","isAborted","Boolean","signal","aborted","abortError","name","model","baseDir","downloadPath","archiveExt","isArchive","modelDir","sleep","ms","Promise","resolve","setTimeout","cleanupPartial","cleanupPartialWithRetry","attempt","diskSpaceCheck","bytes","success","statePath","overwrite","readyMarkerExists","downloadState","modelId","phase","startedAt","Date","toISOString","archivePath","totalBytes","JSON","stringify","taskId","reject","abortHandler","cleanup","removeEventListener","undefined","delete","task","url","downloadUrl","destination","metadata","progress","bytesDownloaded","bytesTotal","total","percent","onProgress","done","result","onChecksumIssue","deleteArchiveAfterExtract","getDownloadedList","e","errorCode","set","stop","err","addEventListener","start","archiveStat","size","getIncompleteDownloads","prefix","states","existingTasks","startsWith","slice","length","readyPath","raw","fromFile","parse","meta","st","push","resumeDownload","existing","find","t","resume","catch","deleteIncompleteDownload","tarPath","onnxPath","getActiveDownloadTaskKeys","keys"],"sourceRoot":"../../../src","sources":["download/downloadTask.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ import { exists, stat } from '@dr.pogodin/react-native-fs';
4
+ import { getArchivePath } from "./paths.js";
5
+ import { getModelByIdByCategory } from "./registry.js";
6
+ import { isModelDownloadedByCategory, getLocalModelPathByCategory, deleteModelByCategory } from "./localModels.js";
7
+ import { downloadModelByCategory } from "./downloadTask.js";
8
+ import { getIncompleteDownloads, resumeDownload } from "./downloadTask.js";
9
+ import { getIncompleteExtractions, resumeExtraction, extractModelByCategory, deleteIncompleteExtraction } from "./modelExtraction.js";
10
+ import { deleteIncompleteDownload } from "./downloadTask.js";
11
+ /**
12
+ * Single entry point to ensure a model is available locally: handles download, extraction,
13
+ * and all edge cases (already ready, incomplete download, incomplete extraction, archive
14
+ * already present). Call this with category, id, and optional opts; the function decides
15
+ * whether to return the existing path, resume an interrupted operation, or start download/extraction.
16
+ *
17
+ * Use this as the main API when you only need "make this model ready"; the lower-level
18
+ * APIs (downloadModelByCategory, resumeDownload, extractModelByCategory, getIncompleteExtractions,
19
+ * etc.) remain available for advanced flows.
20
+ */
21
+ export async function ensureModelByCategory(category, id, opts) {
22
+ const model = await getModelByIdByCategory(category, id);
23
+ if (!model) {
24
+ throw new Error(`Unknown model id: ${id}`);
25
+ }
26
+ const isArchive = model.archiveExt === 'tar.bz2';
27
+ if (opts?.overwrite) {
28
+ await deleteModelByCategory(category, id);
29
+ await deleteIncompleteExtraction(category, id);
30
+ await deleteIncompleteDownload(category, id);
31
+ }
32
+ if (!opts?.overwrite && (await isModelDownloadedByCategory(category, id))) {
33
+ const localPath = await getLocalModelPathByCategory(category, id);
34
+ if (localPath) {
35
+ return {
36
+ modelId: id,
37
+ localPath
38
+ };
39
+ }
40
+ }
41
+ if (isArchive) {
42
+ const incompleteExtractions = await getIncompleteExtractions(category);
43
+ const extractionState = incompleteExtractions.find(s => s.modelId === id);
44
+ if (extractionState) {
45
+ return resumeExtraction(category, id, {
46
+ onProgress: opts?.onProgress,
47
+ signal: opts?.signal,
48
+ onChecksumIssue: opts?.onChecksumIssue,
49
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract
50
+ });
51
+ }
52
+ }
53
+ const incompleteDownloads = await getIncompleteDownloads(category);
54
+ const downloadState = incompleteDownloads.find(s => s.modelId === id);
55
+ if (downloadState) {
56
+ return resumeDownload(category, id, {
57
+ onProgress: opts?.onProgress,
58
+ signal: opts?.signal,
59
+ onChecksumIssue: opts?.onChecksumIssue,
60
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract
61
+ });
62
+ }
63
+ if (isArchive) {
64
+ const downloadPath = getArchivePath(category, id, model.archiveExt);
65
+ if (await exists(downloadPath)) {
66
+ try {
67
+ const st = await stat(downloadPath);
68
+ if (model.bytes <= 0 || st.size != null && st.size >= model.bytes) {
69
+ return extractModelByCategory(category, id, {
70
+ onProgress: opts?.onProgress,
71
+ signal: opts?.signal,
72
+ onChecksumIssue: opts?.onChecksumIssue,
73
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract
74
+ });
75
+ }
76
+ } catch {
77
+ // fall through to download
78
+ }
79
+ }
80
+ }
81
+ return downloadModelByCategory(category, id, {
82
+ onProgress: opts?.onProgress,
83
+ overwrite: opts?.overwrite ?? false,
84
+ signal: opts?.signal,
85
+ onChecksumIssue: opts?.onChecksumIssue,
86
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract
87
+ });
88
+ }
89
+ //# sourceMappingURL=ensureModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["exists","stat","getArchivePath","getModelByIdByCategory","isModelDownloadedByCategory","getLocalModelPathByCategory","deleteModelByCategory","downloadModelByCategory","getIncompleteDownloads","resumeDownload","getIncompleteExtractions","resumeExtraction","extractModelByCategory","deleteIncompleteExtraction","deleteIncompleteDownload","ensureModelByCategory","category","id","opts","model","Error","isArchive","archiveExt","overwrite","localPath","modelId","incompleteExtractions","extractionState","find","s","onProgress","signal","onChecksumIssue","deleteArchiveAfterExtract","incompleteDownloads","downloadState","downloadPath","st","bytes","size"],"sourceRoot":"../../../src","sources":["download/ensureModel.ts"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- export { extractTarBz2 } from "./extractTarBz2.js";
4
- export { extractTarZst } from "./extractTarZst.js";
5
- export { listModelsByCategory, refreshModelsByCategory, getModelsCacheStatusByCategory, getModelByIdByCategory, listDownloadedModelsByCategory, isModelDownloadedByCategory, getLocalModelPathByCategory, downloadModelByCategory, deleteModelByCategory, clearModelCacheByCategory, getDownloadStorageBase, subscribeDownloadProgress, subscribeModelsListUpdated, updateModelLastUsed, listDownloadedModelsWithMetadata, cleanupLeastRecentlyUsed, ModelCategory } from "./ModelDownloadManager.js";
6
- export { validateChecksum, validateExtractedFiles, checkDiskSpace, setExpectedFilesForCategory, getExpectedFilesForCategory, parseChecksumFile, calculateFileChecksum } from "./validation.js";
3
+ export { extractTarBz2 } from "../extraction/extractTarBz2.js";
4
+ export { extractTarZst } from "../extraction/extractTarZst.js";
5
+ export { listModelsByCategory, refreshModelsByCategory, getModelsCacheStatusByCategory, getModelByIdByCategory, listDownloadedModelsByCategory, isModelDownloadedByCategory, getLocalModelPathByCategory, downloadModelByCategory, deleteModelByCategory, clearModelCacheByCategory, getDownloadStorageBase, subscribeDownloadProgress, subscribeModelsListUpdated, updateModelLastUsed, listDownloadedModelsWithMetadata, cleanupLeastRecentlyUsed, getIncompleteDownloads, resumeDownload, deleteIncompleteDownload, extractModelByCategory, getIncompleteExtractions, resumeExtraction, deleteIncompleteExtraction, ensureModelByCategory, ModelCategory, getProtectedModelKeysForBulkDelete, purgeDownloadedModelArtifacts, configureModelDownloadBackgroundDownloader } from "./ModelDownloadManager.js";
6
+ export { validateChecksum, validateExtractedFiles, checkDiskSpace, resolveActualModelDir, setExpectedFilesForCategory, getExpectedFilesForCategory, parseChecksumFile, calculateFileChecksum } from "./validation.js";
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["extractTarBz2","extractTarZst","listModelsByCategory","refreshModelsByCategory","getModelsCacheStatusByCategory","getModelByIdByCategory","listDownloadedModelsByCategory","isModelDownloadedByCategory","getLocalModelPathByCategory","downloadModelByCategory","deleteModelByCategory","clearModelCacheByCategory","getDownloadStorageBase","subscribeDownloadProgress","subscribeModelsListUpdated","updateModelLastUsed","listDownloadedModelsWithMetadata","cleanupLeastRecentlyUsed","ModelCategory","validateChecksum","validateExtractedFiles","checkDiskSpace","setExpectedFilesForCategory","getExpectedFilesForCategory","parseChecksumFile","calculateFileChecksum"],"sourceRoot":"../../../src","sources":["download/index.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,oBAAiB;AAE/C,SAASC,aAAa,QAAQ,oBAAiB;AAE/C,SACEC,oBAAoB,EACpBC,uBAAuB,EACvBC,8BAA8B,EAC9BC,sBAAsB,EACtBC,8BAA8B,EAC9BC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,uBAAuB,EACvBC,qBAAqB,EACrBC,yBAAyB,EACzBC,sBAAsB,EACtBC,yBAAyB,EACzBC,0BAA0B,EAC1BC,mBAAmB,EACnBC,gCAAgC,EAChCC,wBAAwB,EACxBC,aAAa,QACR,2BAAwB;AAa/B,SACEC,gBAAgB,EAChBC,sBAAsB,EACtBC,cAAc,EACdC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,iBAAiB,EACjBC,qBAAqB,QAChB,iBAAc","ignoreList":[]}
1
+ {"version":3,"names":["extractTarBz2","extractTarZst","listModelsByCategory","refreshModelsByCategory","getModelsCacheStatusByCategory","getModelByIdByCategory","listDownloadedModelsByCategory","isModelDownloadedByCategory","getLocalModelPathByCategory","downloadModelByCategory","deleteModelByCategory","clearModelCacheByCategory","getDownloadStorageBase","subscribeDownloadProgress","subscribeModelsListUpdated","updateModelLastUsed","listDownloadedModelsWithMetadata","cleanupLeastRecentlyUsed","getIncompleteDownloads","resumeDownload","deleteIncompleteDownload","extractModelByCategory","getIncompleteExtractions","resumeExtraction","deleteIncompleteExtraction","ensureModelByCategory","ModelCategory","getProtectedModelKeysForBulkDelete","purgeDownloadedModelArtifacts","configureModelDownloadBackgroundDownloader","validateChecksum","validateExtractedFiles","checkDiskSpace","resolveActualModelDir","setExpectedFilesForCategory","getExpectedFilesForCategory","parseChecksumFile","calculateFileChecksum"],"sourceRoot":"../../../src","sources":["download/index.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,gCAA6B;AAE3D,SAASC,aAAa,QAAQ,gCAA6B;AAE3D,SACEC,oBAAoB,EACpBC,uBAAuB,EACvBC,8BAA8B,EAC9BC,sBAAsB,EACtBC,8BAA8B,EAC9BC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,uBAAuB,EACvBC,qBAAqB,EACrBC,yBAAyB,EACzBC,sBAAsB,EACtBC,yBAAyB,EACzBC,0BAA0B,EAC1BC,mBAAmB,EACnBC,gCAAgC,EAChCC,wBAAwB,EACxBC,sBAAsB,EACtBC,cAAc,EACdC,wBAAwB,EACxBC,sBAAsB,EACtBC,wBAAwB,EACxBC,gBAAgB,EAChBC,0BAA0B,EAC1BC,qBAAqB,EACrBC,aAAa,EACbC,kCAAkC,EAClCC,6BAA6B,EAC7BC,0CAA0C,QACrC,2BAAwB;AAkB/B,SACEC,gBAAgB,EAChBC,sBAAsB,EACtBC,cAAc,EACdC,qBAAqB,EACrBC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,iBAAiB,EACjBC,qBAAqB,QAChB,iBAAc","ignoreList":[]}