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.
Files changed (222) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +89 -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 +6 -2
  23. package/android/src/main/cpp/jni/model_detect/sherpa-onnx-validate-tts.cpp +4 -2
  24. package/android/src/main/java/com/sherpaonnx/SherpaOnnxArchiveHelper.kt +40 -10
  25. package/android/src/main/java/com/sherpaonnx/SherpaOnnxModule.kt +99 -0
  26. package/android/src/main/java/com/sherpaonnx/SherpaOnnxOnlineSttHelper.kt +4 -1
  27. package/android/src/main/java/com/sherpaonnx/SherpaOnnxTtsHelper.kt +112 -97
  28. package/ios/Resources/model_licenses/asr-models-license-status.csv +409 -0
  29. package/ios/Resources/model_licenses/qnn-asr-models-license-status.csv +695 -0
  30. package/ios/Resources/model_licenses/tts-models-license-status.csv +596 -0
  31. package/ios/SherpaOnnx+OnlineSTT.mm +2 -0
  32. package/ios/SherpaOnnx+PcmLiveStream.mm +2 -29
  33. package/ios/SherpaOnnx+TTS.mm +178 -20
  34. package/ios/SherpaOnnx.mm +54 -0
  35. package/ios/SherpaOnnxAudioConvert.h +10 -0
  36. package/ios/SherpaOnnxAudioConvert.mm +257 -1
  37. package/ios/archive/sherpa-onnx-archive-helper.h +3 -0
  38. package/ios/archive/sherpa-onnx-archive-helper.mm +39 -6
  39. package/ios/model_detect/sherpa-onnx-model-detect-tts.mm +13 -2
  40. package/ios/model_detect/sherpa-onnx-validate-tts.mm +4 -2
  41. package/ios/online_stt/sherpa-onnx-online-stt-wrapper.h +1 -0
  42. package/ios/online_stt/sherpa-onnx-online-stt-wrapper.mm +4 -0
  43. package/ios/tts/sherpa-onnx-tts-wrapper.h +37 -0
  44. package/ios/tts/sherpa-onnx-tts-wrapper.mm +149 -3
  45. package/lib/module/NativeSherpaOnnx.js.map +1 -1
  46. package/lib/module/audio/index.js +8 -0
  47. package/lib/module/audio/index.js.map +1 -1
  48. package/lib/module/download/ModelDownloadManager.js +10 -929
  49. package/lib/module/download/ModelDownloadManager.js.map +1 -1
  50. package/lib/module/download/activeModelOperations.js +26 -0
  51. package/lib/module/download/activeModelOperations.js.map +1 -0
  52. package/lib/module/download/background-downloader.d.js +2 -0
  53. package/lib/module/download/background-downloader.d.js.map +1 -0
  54. package/lib/module/download/bulkPurge.js +72 -0
  55. package/lib/module/download/bulkPurge.js.map +1 -0
  56. package/lib/module/download/checksumPrompt.js +19 -0
  57. package/lib/module/download/checksumPrompt.js.map +1 -0
  58. package/lib/module/download/constants.js +7 -0
  59. package/lib/module/download/constants.js.map +1 -0
  60. package/lib/module/download/downloadEvents.js +35 -0
  61. package/lib/module/download/downloadEvents.js.map +1 -0
  62. package/lib/module/download/downloadTask.js +385 -0
  63. package/lib/module/download/downloadTask.js.map +1 -0
  64. package/lib/module/download/ensureModel.js +89 -0
  65. package/lib/module/download/ensureModel.js.map +1 -0
  66. package/lib/module/download/index.js +4 -4
  67. package/lib/module/download/index.js.map +1 -1
  68. package/lib/module/download/localModels.js +151 -0
  69. package/lib/module/download/localModels.js.map +1 -0
  70. package/lib/module/download/modelExtraction.js +174 -0
  71. package/lib/module/download/modelExtraction.js.map +1 -0
  72. package/lib/module/download/paths.js +98 -0
  73. package/lib/module/download/paths.js.map +1 -0
  74. package/lib/module/download/postDownloadProcessing.js +206 -0
  75. package/lib/module/download/postDownloadProcessing.js.map +1 -0
  76. package/lib/module/download/protectedModelKeys.js +31 -0
  77. package/lib/module/download/protectedModelKeys.js.map +1 -0
  78. package/lib/module/download/registry.js +267 -0
  79. package/lib/module/download/registry.js.map +1 -0
  80. package/lib/module/download/retry.js +59 -0
  81. package/lib/module/download/retry.js.map +1 -0
  82. package/lib/module/download/types.js +17 -0
  83. package/lib/module/download/types.js.map +1 -0
  84. package/lib/module/download/validation.js +101 -5
  85. package/lib/module/download/validation.js.map +1 -1
  86. package/lib/module/{download → extraction}/extractTarBz2.js +3 -1
  87. package/lib/module/extraction/extractTarBz2.js.map +1 -0
  88. package/lib/module/{download → extraction}/extractTarZst.js +3 -1
  89. package/lib/module/extraction/extractTarZst.js.map +1 -0
  90. package/lib/module/extraction/index.js +3 -4
  91. package/lib/module/extraction/index.js.map +1 -1
  92. package/lib/module/index.js +1 -1
  93. package/lib/module/index.js.map +1 -1
  94. package/lib/module/licenses.js +63 -0
  95. package/lib/module/licenses.js.map +1 -0
  96. package/lib/module/stt/index.js +16 -2
  97. package/lib/module/stt/index.js.map +1 -1
  98. package/lib/module/stt/streaming.js +2 -0
  99. package/lib/module/stt/streaming.js.map +1 -1
  100. package/lib/module/stt/streamingTypes.js.map +1 -1
  101. package/lib/module/stt/types.js.map +1 -1
  102. package/lib/module/tts/index.js +20 -2
  103. package/lib/module/tts/index.js.map +1 -1
  104. package/lib/module/tts/streaming.js +4 -0
  105. package/lib/module/tts/streaming.js.map +1 -1
  106. package/lib/module/tts/types.js.map +1 -1
  107. package/lib/module/utils.js +16 -1
  108. package/lib/module/utils.js.map +1 -1
  109. package/lib/typescript/src/NativeSherpaOnnx.d.ts +33 -5
  110. package/lib/typescript/src/NativeSherpaOnnx.d.ts.map +1 -1
  111. package/lib/typescript/src/audio/index.d.ts +10 -0
  112. package/lib/typescript/src/audio/index.d.ts.map +1 -1
  113. package/lib/typescript/src/download/ModelDownloadManager.d.ts +10 -108
  114. package/lib/typescript/src/download/ModelDownloadManager.d.ts.map +1 -1
  115. package/lib/typescript/src/download/activeModelOperations.d.ts +6 -0
  116. package/lib/typescript/src/download/activeModelOperations.d.ts.map +1 -0
  117. package/lib/typescript/src/download/bulkPurge.d.ts +14 -0
  118. package/lib/typescript/src/download/bulkPurge.d.ts.map +1 -0
  119. package/lib/typescript/src/download/checksumPrompt.d.ts +3 -0
  120. package/lib/typescript/src/download/checksumPrompt.d.ts.map +1 -0
  121. package/lib/typescript/src/download/constants.d.ts +5 -0
  122. package/lib/typescript/src/download/constants.d.ts.map +1 -0
  123. package/lib/typescript/src/download/downloadEvents.d.ts +6 -0
  124. package/lib/typescript/src/download/downloadEvents.d.ts.map +1 -0
  125. package/lib/typescript/src/download/downloadTask.d.ts +20 -0
  126. package/lib/typescript/src/download/downloadTask.d.ts.map +1 -0
  127. package/lib/typescript/src/download/ensureModel.d.ts +26 -0
  128. package/lib/typescript/src/download/ensureModel.d.ts.map +1 -0
  129. package/lib/typescript/src/download/index.d.ts +7 -7
  130. package/lib/typescript/src/download/index.d.ts.map +1 -1
  131. package/lib/typescript/src/download/localModels.d.ts +15 -0
  132. package/lib/typescript/src/download/localModels.d.ts.map +1 -0
  133. package/lib/typescript/src/download/modelExtraction.d.ts +36 -0
  134. package/lib/typescript/src/download/modelExtraction.d.ts.map +1 -0
  135. package/lib/typescript/src/download/paths.d.ts +28 -0
  136. package/lib/typescript/src/download/paths.d.ts.map +1 -0
  137. package/lib/typescript/src/download/postDownloadProcessing.d.ts +19 -0
  138. package/lib/typescript/src/download/postDownloadProcessing.d.ts.map +1 -0
  139. package/lib/typescript/src/download/protectedModelKeys.d.ts +6 -0
  140. package/lib/typescript/src/download/protectedModelKeys.d.ts.map +1 -0
  141. package/lib/typescript/src/download/registry.d.ts +14 -0
  142. package/lib/typescript/src/download/registry.d.ts.map +1 -0
  143. package/lib/typescript/src/download/retry.d.ts +15 -0
  144. package/lib/typescript/src/download/retry.d.ts.map +1 -0
  145. package/lib/typescript/src/download/types.d.ts +96 -0
  146. package/lib/typescript/src/download/types.d.ts.map +1 -0
  147. package/lib/typescript/src/download/validation.d.ts +19 -0
  148. package/lib/typescript/src/download/validation.d.ts.map +1 -1
  149. package/lib/typescript/src/extraction/extractTarBz2.d.ts.map +1 -0
  150. package/lib/typescript/src/extraction/extractTarZst.d.ts.map +1 -0
  151. package/lib/typescript/src/index.d.ts +1 -0
  152. package/lib/typescript/src/index.d.ts.map +1 -1
  153. package/lib/typescript/src/licenses.d.ts +10 -0
  154. package/lib/typescript/src/licenses.d.ts.map +1 -0
  155. package/lib/typescript/src/stt/index.d.ts +4 -1
  156. package/lib/typescript/src/stt/index.d.ts.map +1 -1
  157. package/lib/typescript/src/stt/streaming.d.ts.map +1 -1
  158. package/lib/typescript/src/stt/streamingTypes.d.ts +5 -0
  159. package/lib/typescript/src/stt/streamingTypes.d.ts.map +1 -1
  160. package/lib/typescript/src/stt/types.d.ts +3 -1
  161. package/lib/typescript/src/stt/types.d.ts.map +1 -1
  162. package/lib/typescript/src/tts/index.d.ts +3 -1
  163. package/lib/typescript/src/tts/index.d.ts.map +1 -1
  164. package/lib/typescript/src/tts/streaming.d.ts.map +1 -1
  165. package/lib/typescript/src/tts/types.d.ts +6 -5
  166. package/lib/typescript/src/tts/types.d.ts.map +1 -1
  167. package/lib/typescript/src/utils.d.ts +5 -0
  168. package/lib/typescript/src/utils.d.ts.map +1 -1
  169. package/package.json +6 -1
  170. package/scripts/{check-model-csvs.sh → ci/check-model-csvs.sh} +9 -2
  171. package/scripts/ci/collect_all_sherpa_model_streams.sh +101 -0
  172. package/scripts/ci/collect_one_sherpa_release_stream.sh +189 -0
  173. package/scripts/ci/sherpa_asr_model_release_streams.json +21 -0
  174. package/scripts/ci/sherpa_tts_model_release_streams.json +13 -0
  175. package/scripts/ci/update_model_license_csv.sh +765 -0
  176. package/scripts/setup-ios-framework.sh +14 -11
  177. package/scripts/update_commercial_use.js +73 -0
  178. package/src/NativeSherpaOnnx.ts +36 -5
  179. package/src/audio/index.ts +20 -0
  180. package/src/download/ModelDownloadManager.ts +55 -1343
  181. package/src/download/activeModelOperations.ts +38 -0
  182. package/src/download/background-downloader.d.ts +43 -0
  183. package/src/download/bulkPurge.ts +102 -0
  184. package/src/download/checksumPrompt.ts +25 -0
  185. package/src/download/constants.ts +5 -0
  186. package/src/download/downloadEvents.ts +55 -0
  187. package/src/download/downloadTask.ts +497 -0
  188. package/src/download/ensureModel.ts +124 -0
  189. package/src/download/index.ts +19 -4
  190. package/src/download/localModels.ts +234 -0
  191. package/src/download/modelExtraction.ts +244 -0
  192. package/src/download/paths.ts +134 -0
  193. package/src/download/postDownloadProcessing.ts +292 -0
  194. package/src/download/protectedModelKeys.ts +30 -0
  195. package/src/download/registry.ts +404 -0
  196. package/src/download/retry.ts +76 -0
  197. package/src/download/types.ts +120 -0
  198. package/src/download/validation.ts +114 -8
  199. package/src/{download → extraction}/extractTarBz2.ts +3 -1
  200. package/src/{download → extraction}/extractTarZst.ts +3 -1
  201. package/src/extraction/index.ts +3 -7
  202. package/src/index.tsx +1 -0
  203. package/src/licenses.ts +100 -0
  204. package/src/stt/index.ts +20 -2
  205. package/src/stt/streaming.ts +3 -0
  206. package/src/stt/streamingTypes.ts +5 -0
  207. package/src/stt/types.ts +3 -1
  208. package/src/tts/index.ts +30 -2
  209. package/src/tts/streaming.ts +10 -0
  210. package/src/tts/types.ts +6 -5
  211. package/src/utils.ts +22 -1
  212. package/third_party/sherpa-onnx-prebuilt/ANDROID_RELEASE_TAG +1 -1
  213. package/third_party/sherpa-onnx-prebuilt/IOS_RELEASE_TAG +1 -1
  214. package/android/src/main/cpp/jni/tts/sherpa-onnx-tts-zipvoice-jni.cpp +0 -301
  215. package/android/src/main/java/com/sherpaonnx/ZipvoiceTtsWrapper.kt +0 -187
  216. package/lib/module/download/extractTarBz2.js.map +0 -1
  217. package/lib/module/download/extractTarZst.js.map +0 -1
  218. package/lib/typescript/src/download/extractTarBz2.d.ts.map +0 -1
  219. package/lib/typescript/src/download/extractTarZst.d.ts.map +0 -1
  220. package/scripts/check-qnn-support.sh +0 -78
  221. /package/lib/typescript/src/{download → extraction}/extractTarBz2.d.ts +0 -0
  222. /package/lib/typescript/src/{download → extraction}/extractTarZst.d.ts +0 -0
@@ -0,0 +1,385 @@
1
+ "use strict";
2
+
3
+ import { createDownloadTask, completeHandler, getExistingDownloadTasks } from '@kesha-antonov/react-native-background-downloader';
4
+ import { exists, readFile, mkdir, writeFile, stat, unlink } from '@dr.pogodin/react-native-fs';
5
+ import { checkDiskSpace, removeDirectoryRecursive } from "./validation.js";
6
+ import { getModelsBaseDir, getModelDir, getArchivePath, getReadyMarkerPath, getDownloadStatePath, getNativeAssetExtractedModelDir, getTarArchivePath, getOnnxPath } from "./paths.js";
7
+ import { emitDownloadProgress } from "./downloadEvents.js";
8
+ import { runPostDownloadProcessing } from "./postDownloadProcessing.js";
9
+ import { getModelByIdByCategory } from "./registry.js";
10
+ import { listDownloadedModelsByCategory } from "./localModels.js";
11
+ function makeDownloadTaskId(category, id) {
12
+ return `${category}:${id}`;
13
+ }
14
+ const activeDownloadTasks = new Map();
15
+ export async function downloadModelByCategory(category, id, opts) {
16
+ const isAborted = () => Boolean(opts?.signal?.aborted);
17
+ if (opts?.signal?.aborted) {
18
+ const abortError = new Error('Download aborted');
19
+ abortError.name = 'AbortError';
20
+ throw abortError;
21
+ }
22
+ const model = await getModelByIdByCategory(category, id);
23
+ if (!model) {
24
+ throw new Error(`Unknown model id: ${id}`);
25
+ }
26
+ const baseDir = getModelsBaseDir(category);
27
+ await mkdir(baseDir);
28
+ const downloadPath = getArchivePath(category, id, model.archiveExt);
29
+ const isArchive = model.archiveExt === 'tar.bz2';
30
+ const modelDir = getModelDir(category, id);
31
+ const sleep = ms => new Promise(resolve => {
32
+ setTimeout(resolve, ms);
33
+ });
34
+ const cleanupPartial = async () => {
35
+ if (!isArchive) return;
36
+ if (await exists(modelDir)) {
37
+ await unlink(modelDir);
38
+ }
39
+ };
40
+ const cleanupPartialWithRetry = async () => {
41
+ for (let attempt = 0; attempt < 4; attempt += 1) {
42
+ await cleanupPartial();
43
+ if (!(await exists(modelDir))) return;
44
+ await sleep(400);
45
+ }
46
+ if (await exists(modelDir)) {
47
+ console.warn(`Model cleanup after abort did not fully complete for ${category}:${id}`);
48
+ }
49
+ };
50
+ const diskSpaceCheck = await checkDiskSpace(model.bytes);
51
+ if (!diskSpaceCheck.success) {
52
+ throw new Error(`Insufficient disk space: ${diskSpaceCheck.message}`);
53
+ }
54
+ const statePath = getDownloadStatePath(category, id);
55
+ if (opts?.overwrite) {
56
+ if (await exists(modelDir)) await unlink(modelDir);
57
+ if (await exists(downloadPath)) await unlink(downloadPath);
58
+ if (await exists(statePath)) await unlink(statePath);
59
+ } else {
60
+ const readyMarkerExists = await exists(getReadyMarkerPath(category, id));
61
+ if (!readyMarkerExists && isArchive) {
62
+ if (await exists(modelDir)) await unlink(modelDir);
63
+ }
64
+ }
65
+ try {
66
+ const downloadState = {
67
+ modelId: id,
68
+ category,
69
+ phase: 'downloading',
70
+ startedAt: new Date().toISOString(),
71
+ archivePath: downloadPath,
72
+ model,
73
+ totalBytes: model.bytes
74
+ };
75
+ await mkdir(getModelsBaseDir(category));
76
+ await writeFile(statePath, JSON.stringify(downloadState), 'utf8');
77
+ if (!isArchive) {
78
+ await mkdir(modelDir);
79
+ }
80
+ const taskId = makeDownloadTaskId(category, id);
81
+ return new Promise((resolve, reject) => {
82
+ let abortHandler;
83
+ const cleanup = () => {
84
+ if (abortHandler && opts?.signal) {
85
+ opts.signal.removeEventListener('abort', abortHandler);
86
+ abortHandler = undefined;
87
+ }
88
+ activeDownloadTasks.delete(taskId);
89
+ };
90
+ const task = createDownloadTask({
91
+ id: taskId,
92
+ url: model.downloadUrl,
93
+ destination: downloadPath,
94
+ metadata: {}
95
+ }).progress(({
96
+ bytesDownloaded,
97
+ bytesTotal
98
+ }) => {
99
+ if (isAborted()) return;
100
+ const total = bytesTotal ?? model.bytes ?? 0;
101
+ const percent = total > 0 ? bytesDownloaded / total * 100 : 0;
102
+ const progress = {
103
+ bytesDownloaded,
104
+ totalBytes: total,
105
+ percent,
106
+ phase: 'downloading'
107
+ };
108
+ opts?.onProgress?.(progress);
109
+ emitDownloadProgress(category, id, progress);
110
+ }).done(async () => {
111
+ cleanup();
112
+ try {
113
+ const result = await runPostDownloadProcessing({
114
+ category,
115
+ id,
116
+ model,
117
+ downloadPath,
118
+ modelDir,
119
+ isArchive,
120
+ statePath,
121
+ signal: opts?.signal,
122
+ onChecksumIssue: opts?.onChecksumIssue,
123
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract,
124
+ onProgress: opts?.onProgress,
125
+ getDownloadedList: () => listDownloadedModelsByCategory(category)
126
+ });
127
+ completeHandler(taskId);
128
+ resolve(result);
129
+ } catch (e) {
130
+ completeHandler(taskId);
131
+ reject(e);
132
+ }
133
+ }).error(({
134
+ error,
135
+ errorCode
136
+ }) => {
137
+ cleanup();
138
+ completeHandler(taskId);
139
+ (async () => {
140
+ try {
141
+ if (await exists(statePath)) await unlink(statePath);
142
+ } catch {
143
+ // ignore
144
+ }
145
+ })();
146
+ reject(new Error(typeof error === 'string' ? error : String(errorCode ?? error)));
147
+ });
148
+ activeDownloadTasks.set(taskId, task);
149
+ if (opts?.signal) {
150
+ abortHandler = () => {
151
+ task.stop();
152
+ cleanup();
153
+ (async () => {
154
+ try {
155
+ if (await exists(statePath)) await unlink(statePath);
156
+ } catch {
157
+ // ignore
158
+ }
159
+ })();
160
+ const err = new Error('Download aborted');
161
+ err.name = 'AbortError';
162
+ reject(err);
163
+ };
164
+ opts.signal.addEventListener('abort', abortHandler);
165
+ }
166
+ task.start();
167
+ });
168
+ } catch (err) {
169
+ if (err instanceof Error && err.name === 'AbortError' || isAborted()) {
170
+ await cleanupPartialWithRetry();
171
+ try {
172
+ if (await exists(statePath)) await unlink(statePath);
173
+ } catch {
174
+ // ignore
175
+ }
176
+ }
177
+ if (isArchive && !(err instanceof Error && err.name === 'AbortError')) {
178
+ try {
179
+ if (await exists(downloadPath)) {
180
+ const archiveStat = await stat(downloadPath);
181
+ if (model.bytes > 0 && archiveStat.size < model.bytes) {
182
+ console.warn(`[Download] Deleting truncated archive for ${category}:${id} (${archiveStat.size}/${model.bytes})`);
183
+ await unlink(downloadPath);
184
+ }
185
+ }
186
+ } catch {
187
+ // ignore
188
+ }
189
+ }
190
+ throw err;
191
+ }
192
+ }
193
+ export async function getIncompleteDownloads(category) {
194
+ const prefix = category + ':';
195
+ const states = [];
196
+ const existingTasks = await getExistingDownloadTasks();
197
+ for (const task of existingTasks) {
198
+ if (!task.id || !task.id.startsWith(prefix)) continue;
199
+ const modelId = task.id.slice(prefix.length);
200
+ const readyPath = getReadyMarkerPath(category, modelId);
201
+ if (await exists(readyPath)) continue;
202
+ const statePath = getDownloadStatePath(category, modelId);
203
+ let model;
204
+ let totalBytes;
205
+ let archivePath;
206
+ let startedAt;
207
+ if (await exists(statePath)) {
208
+ try {
209
+ const raw = await readFile(statePath, 'utf8');
210
+ const fromFile = JSON.parse(raw);
211
+ model = fromFile.model;
212
+ totalBytes = fromFile.totalBytes ?? fromFile.model?.bytes;
213
+ archivePath = fromFile.archivePath;
214
+ startedAt = fromFile.startedAt;
215
+ } catch {
216
+ // ignore
217
+ }
218
+ }
219
+ if (!model) {
220
+ const meta = await getModelByIdByCategory(category, modelId);
221
+ if (!meta) continue;
222
+ model = meta;
223
+ totalBytes = model.bytes;
224
+ archivePath = getArchivePath(category, modelId, model.archiveExt);
225
+ }
226
+ let bytesDownloaded;
227
+ if (archivePath) {
228
+ try {
229
+ const st = await stat(archivePath);
230
+ if (st?.size != null && st.size >= 0) bytesDownloaded = st.size;
231
+ } catch {
232
+ // ignore
233
+ }
234
+ }
235
+ states.push({
236
+ modelId,
237
+ category,
238
+ phase: 'downloading',
239
+ startedAt: startedAt ?? new Date().toISOString(),
240
+ archivePath: archivePath ?? '',
241
+ model,
242
+ bytesDownloaded,
243
+ totalBytes: totalBytes ?? model.bytes
244
+ });
245
+ }
246
+ return states;
247
+ }
248
+ export async function resumeDownload(category, id, opts) {
249
+ const taskId = makeDownloadTaskId(category, id);
250
+ const existingTasks = await getExistingDownloadTasks();
251
+ const existing = existingTasks.find(t => t.id === taskId);
252
+ if (!existing) {
253
+ return downloadModelByCategory(category, id, {
254
+ onProgress: opts?.onProgress,
255
+ signal: opts?.signal,
256
+ onChecksumIssue: opts?.onChecksumIssue,
257
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract
258
+ });
259
+ }
260
+ const model = await getModelByIdByCategory(category, id);
261
+ if (!model) throw new Error(`Unknown model id: ${id}`);
262
+ const downloadPath = getArchivePath(category, id, model.archiveExt);
263
+ const modelDir = getModelDir(category, id);
264
+ const isArchive = model.archiveExt === 'tar.bz2';
265
+ const statePath = getDownloadStatePath(category, id);
266
+ const isAborted = () => Boolean(opts?.signal?.aborted);
267
+ return new Promise((resolve, reject) => {
268
+ let abortHandler;
269
+ const cleanup = () => {
270
+ if (abortHandler && opts?.signal) {
271
+ opts.signal.removeEventListener('abort', abortHandler);
272
+ abortHandler = undefined;
273
+ }
274
+ activeDownloadTasks.delete(taskId);
275
+ };
276
+ existing.progress(({
277
+ bytesDownloaded,
278
+ bytesTotal
279
+ }) => {
280
+ if (isAborted()) return;
281
+ const total = bytesTotal ?? model.bytes ?? 0;
282
+ const percent = total > 0 ? bytesDownloaded / total * 100 : 0;
283
+ opts?.onProgress?.({
284
+ bytesDownloaded,
285
+ totalBytes: total,
286
+ percent,
287
+ phase: 'downloading'
288
+ });
289
+ emitDownloadProgress(category, id, {
290
+ bytesDownloaded,
291
+ totalBytes: total,
292
+ percent,
293
+ phase: 'downloading'
294
+ });
295
+ }).done(async () => {
296
+ cleanup();
297
+ try {
298
+ const result = await runPostDownloadProcessing({
299
+ category,
300
+ id,
301
+ model,
302
+ downloadPath,
303
+ modelDir,
304
+ isArchive,
305
+ statePath,
306
+ signal: opts?.signal,
307
+ onChecksumIssue: opts?.onChecksumIssue,
308
+ deleteArchiveAfterExtract: opts?.deleteArchiveAfterExtract,
309
+ onProgress: opts?.onProgress,
310
+ getDownloadedList: () => listDownloadedModelsByCategory(category)
311
+ });
312
+ completeHandler(taskId);
313
+ resolve(result);
314
+ } catch (e) {
315
+ completeHandler(taskId);
316
+ reject(e);
317
+ }
318
+ }).error(({
319
+ error,
320
+ errorCode
321
+ }) => {
322
+ cleanup();
323
+ completeHandler(taskId);
324
+ (async () => {
325
+ try {
326
+ if (await exists(statePath)) await unlink(statePath);
327
+ } catch {
328
+ // ignore
329
+ }
330
+ })();
331
+ reject(new Error(typeof error === 'string' ? error : String(errorCode ?? error)));
332
+ });
333
+ activeDownloadTasks.set(taskId, existing);
334
+ if (opts?.signal) {
335
+ abortHandler = () => {
336
+ existing.stop();
337
+ cleanup();
338
+ (async () => {
339
+ try {
340
+ if (await exists(statePath)) await unlink(statePath);
341
+ } catch {
342
+ // ignore
343
+ }
344
+ })();
345
+ const err = new Error('Download aborted');
346
+ err.name = 'AbortError';
347
+ reject(err);
348
+ };
349
+ opts.signal.addEventListener('abort', abortHandler);
350
+ }
351
+ existing.resume().catch(() => {});
352
+ });
353
+ }
354
+ export async function deleteIncompleteDownload(category, id) {
355
+ const taskId = makeDownloadTaskId(category, id);
356
+ const existingTasks = await getExistingDownloadTasks();
357
+ const task = existingTasks.find(t => t.id === taskId);
358
+ if (task) {
359
+ task.stop();
360
+ activeDownloadTasks.delete(taskId);
361
+ }
362
+ const modelDir = getModelDir(category, id);
363
+ if (await exists(modelDir)) {
364
+ await unlink(modelDir);
365
+ }
366
+ const tarPath = getTarArchivePath(category, id);
367
+ const onnxPath = getOnnxPath(category, id);
368
+ if (await exists(tarPath)) {
369
+ await unlink(tarPath);
370
+ }
371
+ if (await exists(onnxPath)) {
372
+ await unlink(onnxPath);
373
+ }
374
+ const statePath = getDownloadStatePath(category, id);
375
+ if (await exists(statePath)) {
376
+ await unlink(statePath);
377
+ }
378
+ await removeDirectoryRecursive(getNativeAssetExtractedModelDir(id));
379
+ }
380
+
381
+ /** Task ids in the form `category:modelId` for downloads currently tracked in JS (before post-processing). */
382
+ export function getActiveDownloadTaskKeys() {
383
+ return [...activeDownloadTasks.keys()];
384
+ }
385
+ //# sourceMappingURL=downloadTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createDownloadTask","completeHandler","getExistingDownloadTasks","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","downloadModelByCategory","opts","isAborted","Boolean","signal","aborted","abortError","Error","name","model","baseDir","downloadPath","archiveExt","isArchive","modelDir","sleep","ms","Promise","resolve","setTimeout","cleanupPartial","cleanupPartialWithRetry","attempt","console","warn","diskSpaceCheck","bytes","success","message","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","error","errorCode","String","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 } 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","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,QACxB,2BAAwB;AAiB/B,SACEC,gBAAgB,EAChBC,sBAAsB,EACtBC,cAAc,EACdC,qBAAqB,EACrBC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,iBAAiB,EACjBC,qBAAqB,QAChB,iBAAc","ignoreList":[]}