@runanywhere/web 0.1.0-beta.1

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 (205) hide show
  1. package/README.md +795 -0
  2. package/dist/Foundation/ErrorTypes.d.ts +61 -0
  3. package/dist/Foundation/ErrorTypes.d.ts.map +1 -0
  4. package/dist/Foundation/ErrorTypes.js +90 -0
  5. package/dist/Foundation/ErrorTypes.js.map +1 -0
  6. package/dist/Foundation/EventBus.d.ts +171 -0
  7. package/dist/Foundation/EventBus.d.ts.map +1 -0
  8. package/dist/Foundation/EventBus.js +113 -0
  9. package/dist/Foundation/EventBus.js.map +1 -0
  10. package/dist/Foundation/PlatformAdapter.d.ts +101 -0
  11. package/dist/Foundation/PlatformAdapter.d.ts.map +1 -0
  12. package/dist/Foundation/PlatformAdapter.js +417 -0
  13. package/dist/Foundation/PlatformAdapter.js.map +1 -0
  14. package/dist/Foundation/SDKLogger.d.ts +33 -0
  15. package/dist/Foundation/SDKLogger.d.ts.map +1 -0
  16. package/dist/Foundation/SDKLogger.js +82 -0
  17. package/dist/Foundation/SDKLogger.js.map +1 -0
  18. package/dist/Foundation/SherpaONNXBridge.d.ts +134 -0
  19. package/dist/Foundation/SherpaONNXBridge.d.ts.map +1 -0
  20. package/dist/Foundation/SherpaONNXBridge.js +332 -0
  21. package/dist/Foundation/SherpaONNXBridge.js.map +1 -0
  22. package/dist/Foundation/StructOffsets.d.ts +147 -0
  23. package/dist/Foundation/StructOffsets.d.ts.map +1 -0
  24. package/dist/Foundation/StructOffsets.js +161 -0
  25. package/dist/Foundation/StructOffsets.js.map +1 -0
  26. package/dist/Foundation/WASMBridge.d.ts +241 -0
  27. package/dist/Foundation/WASMBridge.d.ts.map +1 -0
  28. package/dist/Foundation/WASMBridge.js +393 -0
  29. package/dist/Foundation/WASMBridge.js.map +1 -0
  30. package/dist/Infrastructure/ArchiveUtility.d.ts +25 -0
  31. package/dist/Infrastructure/ArchiveUtility.d.ts.map +1 -0
  32. package/dist/Infrastructure/ArchiveUtility.js +139 -0
  33. package/dist/Infrastructure/ArchiveUtility.js.map +1 -0
  34. package/dist/Infrastructure/AudioCapture.d.ts +87 -0
  35. package/dist/Infrastructure/AudioCapture.d.ts.map +1 -0
  36. package/dist/Infrastructure/AudioCapture.js +231 -0
  37. package/dist/Infrastructure/AudioCapture.js.map +1 -0
  38. package/dist/Infrastructure/AudioPlayback.d.ts +53 -0
  39. package/dist/Infrastructure/AudioPlayback.d.ts.map +1 -0
  40. package/dist/Infrastructure/AudioPlayback.js +117 -0
  41. package/dist/Infrastructure/AudioPlayback.js.map +1 -0
  42. package/dist/Infrastructure/DeviceCapabilities.d.ts +39 -0
  43. package/dist/Infrastructure/DeviceCapabilities.d.ts.map +1 -0
  44. package/dist/Infrastructure/DeviceCapabilities.js +111 -0
  45. package/dist/Infrastructure/DeviceCapabilities.js.map +1 -0
  46. package/dist/Infrastructure/ExtensionRegistry.d.ts +30 -0
  47. package/dist/Infrastructure/ExtensionRegistry.d.ts.map +1 -0
  48. package/dist/Infrastructure/ExtensionRegistry.js +41 -0
  49. package/dist/Infrastructure/ExtensionRegistry.js.map +1 -0
  50. package/dist/Infrastructure/ModelDownloader.d.ts +98 -0
  51. package/dist/Infrastructure/ModelDownloader.d.ts.map +1 -0
  52. package/dist/Infrastructure/ModelDownloader.js +431 -0
  53. package/dist/Infrastructure/ModelDownloader.js.map +1 -0
  54. package/dist/Infrastructure/ModelLoaderTypes.d.ts +34 -0
  55. package/dist/Infrastructure/ModelLoaderTypes.d.ts.map +1 -0
  56. package/dist/Infrastructure/ModelLoaderTypes.js +12 -0
  57. package/dist/Infrastructure/ModelLoaderTypes.js.map +1 -0
  58. package/dist/Infrastructure/ModelManager.d.ts +219 -0
  59. package/dist/Infrastructure/ModelManager.d.ts.map +1 -0
  60. package/dist/Infrastructure/ModelManager.js +885 -0
  61. package/dist/Infrastructure/ModelManager.js.map +1 -0
  62. package/dist/Infrastructure/ModelRegistry.d.ts +131 -0
  63. package/dist/Infrastructure/ModelRegistry.d.ts.map +1 -0
  64. package/dist/Infrastructure/ModelRegistry.js +122 -0
  65. package/dist/Infrastructure/ModelRegistry.js.map +1 -0
  66. package/dist/Infrastructure/OPFSStorage.d.ts +143 -0
  67. package/dist/Infrastructure/OPFSStorage.d.ts.map +1 -0
  68. package/dist/Infrastructure/OPFSStorage.js +330 -0
  69. package/dist/Infrastructure/OPFSStorage.js.map +1 -0
  70. package/dist/Infrastructure/VLMWorkerBridge.d.ts +211 -0
  71. package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
  72. package/dist/Infrastructure/VLMWorkerBridge.js +264 -0
  73. package/dist/Infrastructure/VLMWorkerBridge.js.map +1 -0
  74. package/dist/Infrastructure/VLMWorkerRuntime.d.ts +38 -0
  75. package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +1 -0
  76. package/dist/Infrastructure/VLMWorkerRuntime.js +503 -0
  77. package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
  78. package/dist/Infrastructure/VideoCapture.d.ts +118 -0
  79. package/dist/Infrastructure/VideoCapture.d.ts.map +1 -0
  80. package/dist/Infrastructure/VideoCapture.js +207 -0
  81. package/dist/Infrastructure/VideoCapture.js.map +1 -0
  82. package/dist/Public/Extensions/DiffusionTypes.d.ts +64 -0
  83. package/dist/Public/Extensions/DiffusionTypes.d.ts.map +1 -0
  84. package/dist/Public/Extensions/DiffusionTypes.js +28 -0
  85. package/dist/Public/Extensions/DiffusionTypes.js.map +1 -0
  86. package/dist/Public/Extensions/EmbeddingsTypes.d.ts +33 -0
  87. package/dist/Public/Extensions/EmbeddingsTypes.d.ts.map +1 -0
  88. package/dist/Public/Extensions/EmbeddingsTypes.js +13 -0
  89. package/dist/Public/Extensions/EmbeddingsTypes.js.map +1 -0
  90. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
  91. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
  92. package/dist/Public/Extensions/RunAnywhere+Diffusion.js +189 -0
  93. package/dist/Public/Extensions/RunAnywhere+Diffusion.js.map +1 -0
  94. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
  95. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
  96. package/dist/Public/Extensions/RunAnywhere+Embeddings.js +240 -0
  97. package/dist/Public/Extensions/RunAnywhere+Embeddings.js.map +1 -0
  98. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts +53 -0
  99. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +1 -0
  100. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js +153 -0
  101. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js.map +1 -0
  102. package/dist/Public/Extensions/RunAnywhere+STT.d.ts +95 -0
  103. package/dist/Public/Extensions/RunAnywhere+STT.d.ts.map +1 -0
  104. package/dist/Public/Extensions/RunAnywhere+STT.js +417 -0
  105. package/dist/Public/Extensions/RunAnywhere+STT.js.map +1 -0
  106. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
  107. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
  108. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js +196 -0
  109. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
  110. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts +55 -0
  111. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts.map +1 -0
  112. package/dist/Public/Extensions/RunAnywhere+TTS.js +253 -0
  113. package/dist/Public/Extensions/RunAnywhere+TTS.js.map +1 -0
  114. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts +80 -0
  115. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
  116. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js +436 -0
  117. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
  118. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
  119. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
  120. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js +576 -0
  121. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
  122. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts +70 -0
  123. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts.map +1 -0
  124. package/dist/Public/Extensions/RunAnywhere+VAD.js +231 -0
  125. package/dist/Public/Extensions/RunAnywhere+VAD.js.map +1 -0
  126. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts +58 -0
  127. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
  128. package/dist/Public/Extensions/RunAnywhere+VLM.js +262 -0
  129. package/dist/Public/Extensions/RunAnywhere+VLM.js.map +1 -0
  130. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +49 -0
  131. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +1 -0
  132. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js +222 -0
  133. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js.map +1 -0
  134. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +63 -0
  135. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -0
  136. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +168 -0
  137. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -0
  138. package/dist/Public/Extensions/STTTypes.d.ts +53 -0
  139. package/dist/Public/Extensions/STTTypes.d.ts.map +1 -0
  140. package/dist/Public/Extensions/STTTypes.js +16 -0
  141. package/dist/Public/Extensions/STTTypes.js.map +1 -0
  142. package/dist/Public/Extensions/TTSTypes.d.ts +31 -0
  143. package/dist/Public/Extensions/TTSTypes.d.ts.map +1 -0
  144. package/dist/Public/Extensions/TTSTypes.js +3 -0
  145. package/dist/Public/Extensions/TTSTypes.js.map +1 -0
  146. package/dist/Public/Extensions/ToolCallingTypes.d.ts +78 -0
  147. package/dist/Public/Extensions/ToolCallingTypes.d.ts.map +1 -0
  148. package/dist/Public/Extensions/ToolCallingTypes.js +8 -0
  149. package/dist/Public/Extensions/ToolCallingTypes.js.map +1 -0
  150. package/dist/Public/Extensions/VADTypes.d.ts +30 -0
  151. package/dist/Public/Extensions/VADTypes.d.ts.map +1 -0
  152. package/dist/Public/Extensions/VADTypes.js +8 -0
  153. package/dist/Public/Extensions/VADTypes.js.map +1 -0
  154. package/dist/Public/Extensions/VLMTypes.d.ts +56 -0
  155. package/dist/Public/Extensions/VLMTypes.d.ts.map +1 -0
  156. package/dist/Public/Extensions/VLMTypes.js +24 -0
  157. package/dist/Public/Extensions/VLMTypes.js.map +1 -0
  158. package/dist/Public/Extensions/VoiceAgentTypes.d.ts +42 -0
  159. package/dist/Public/Extensions/VoiceAgentTypes.d.ts.map +1 -0
  160. package/dist/Public/Extensions/VoiceAgentTypes.js +12 -0
  161. package/dist/Public/Extensions/VoiceAgentTypes.js.map +1 -0
  162. package/dist/Public/Extensions/VoicePipelineTypes.d.ts +69 -0
  163. package/dist/Public/Extensions/VoicePipelineTypes.d.ts.map +1 -0
  164. package/dist/Public/Extensions/VoicePipelineTypes.js +9 -0
  165. package/dist/Public/Extensions/VoicePipelineTypes.js.map +1 -0
  166. package/dist/Public/RunAnywhere.d.ts +121 -0
  167. package/dist/Public/RunAnywhere.d.ts.map +1 -0
  168. package/dist/Public/RunAnywhere.js +332 -0
  169. package/dist/Public/RunAnywhere.js.map +1 -0
  170. package/dist/index.d.ts +67 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +53 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/types/LLMTypes.d.ts +48 -0
  175. package/dist/types/LLMTypes.d.ts.map +1 -0
  176. package/dist/types/LLMTypes.js +8 -0
  177. package/dist/types/LLMTypes.js.map +1 -0
  178. package/dist/types/enums.d.ts +144 -0
  179. package/dist/types/enums.d.ts.map +1 -0
  180. package/dist/types/enums.js +159 -0
  181. package/dist/types/enums.js.map +1 -0
  182. package/dist/types/index.d.ts +9 -0
  183. package/dist/types/index.d.ts.map +1 -0
  184. package/dist/types/index.js +8 -0
  185. package/dist/types/index.js.map +1 -0
  186. package/dist/types/models.d.ts +154 -0
  187. package/dist/types/models.d.ts.map +1 -0
  188. package/dist/types/models.js +8 -0
  189. package/dist/types/models.js.map +1 -0
  190. package/dist/workers/vlm-worker.d.ts +9 -0
  191. package/dist/workers/vlm-worker.d.ts.map +1 -0
  192. package/dist/workers/vlm-worker.js +10 -0
  193. package/dist/workers/vlm-worker.js.map +1 -0
  194. package/package.json +62 -0
  195. package/wasm/racommons-webgpu.js +156 -0
  196. package/wasm/racommons-webgpu.wasm +0 -0
  197. package/wasm/racommons.js +126 -0
  198. package/wasm/racommons.wasm +0 -0
  199. package/wasm/sherpa/sherpa-onnx-asr.js +1538 -0
  200. package/wasm/sherpa/sherpa-onnx-glue-original.js +19 -0
  201. package/wasm/sherpa/sherpa-onnx-glue.js +17 -0
  202. package/wasm/sherpa/sherpa-onnx-tts.js +657 -0
  203. package/wasm/sherpa/sherpa-onnx-vad.js +337 -0
  204. package/wasm/sherpa/sherpa-onnx-wave.js +88 -0
  205. package/wasm/sherpa/sherpa-onnx.wasm +0 -0
@@ -0,0 +1,330 @@
1
+ /**
2
+ * RunAnywhere Web SDK - OPFS (Origin Private File System) Storage
3
+ *
4
+ * Persistent model storage using the browser's Origin Private File System.
5
+ * OPFS provides a sandboxed, high-performance file system for large model files
6
+ * that persists across page reloads (unlike Emscripten MEMFS).
7
+ *
8
+ * Supports nested paths: keys containing `/` are treated as subdirectory paths.
9
+ * e.g. `saveModel('org/model/file.gguf', data)` creates `models/org/model/file.gguf`
10
+ *
11
+ * Fallback: If OPFS is not available, models stay in MEMFS (volatile).
12
+ *
13
+ * Usage:
14
+ * import { OPFSStorage } from '@runanywhere/web';
15
+ *
16
+ * const storage = new OPFSStorage();
17
+ * await storage.saveModel('whisper-base', modelArrayBuffer);
18
+ * await storage.saveModel('org/model/file.gguf', modelArrayBuffer);
19
+ * const data = await storage.loadModel('whisper-base');
20
+ * const models = await storage.listModels();
21
+ */
22
+ import { SDKLogger } from '../Foundation/SDKLogger';
23
+ const logger = new SDKLogger('OPFSStorage');
24
+ /** OPFS root directory name for model storage. */
25
+ const MODELS_DIR = 'models';
26
+ /**
27
+ * OPFSStorage - Persistent model file storage using Origin Private File System.
28
+ *
29
+ * Keys can be flat (`whisper-base`) or nested (`org/model/file.gguf`).
30
+ * Nested keys are stored in the corresponding subdirectory hierarchy under the
31
+ * `models/` OPFS root.
32
+ */
33
+ export class OPFSStorage {
34
+ rootDir = null;
35
+ modelsDir = null;
36
+ _isAvailable = null;
37
+ /**
38
+ * Check if OPFS is available in this browser.
39
+ */
40
+ static get isSupported() {
41
+ return typeof navigator !== 'undefined' &&
42
+ 'storage' in navigator &&
43
+ 'getDirectory' in (navigator.storage || {});
44
+ }
45
+ /**
46
+ * Initialize OPFS storage. Must be called before other methods.
47
+ *
48
+ * @returns true if OPFS was initialized, false if not available
49
+ */
50
+ async initialize() {
51
+ if (this._isAvailable !== null)
52
+ return this._isAvailable;
53
+ if (!OPFSStorage.isSupported) {
54
+ logger.warning('OPFS not available in this browser. Models will use volatile MEMFS.');
55
+ this._isAvailable = false;
56
+ return false;
57
+ }
58
+ try {
59
+ this.rootDir = await navigator.storage.getDirectory();
60
+ this.modelsDir = await this.rootDir.getDirectoryHandle(MODELS_DIR, { create: true });
61
+ this._isAvailable = true;
62
+ logger.info('OPFS storage initialized');
63
+ return true;
64
+ }
65
+ catch (error) {
66
+ const msg = error instanceof Error ? error.message : String(error);
67
+ logger.warning(`OPFS initialization failed: ${msg}`);
68
+ this._isAvailable = false;
69
+ return false;
70
+ }
71
+ }
72
+ get isAvailable() {
73
+ return this._isAvailable === true;
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Core operations
77
+ // ---------------------------------------------------------------------------
78
+ /**
79
+ * Save model data to OPFS.
80
+ *
81
+ * Supports nested paths: `saveModel('org/model/file.gguf', data)` creates
82
+ * `models/org/model/` directories and writes `file.gguf`.
83
+ *
84
+ * @param key - Model identifier or nested path (used as filename / path)
85
+ * @param data - Model file data
86
+ */
87
+ async saveModel(key, data) {
88
+ if (!this.modelsDir)
89
+ throw new Error('OPFS not initialized. Call initialize() first.');
90
+ logger.info(`Saving model to OPFS: ${key} (${(data.byteLength / 1024 / 1024).toFixed(1)} MB)`);
91
+ const dir = await this.resolveParentDir(key, /* create */ true);
92
+ const filename = this.resolveFilename(key);
93
+ const fileHandle = await dir.getFileHandle(filename, { create: true });
94
+ const writable = await fileHandle.createWritable();
95
+ try {
96
+ await writable.write(data);
97
+ await writable.close();
98
+ }
99
+ catch (writeError) {
100
+ // Abort the writable stream instead of closing it (close() throws on errored streams)
101
+ try {
102
+ await writable.abort();
103
+ }
104
+ catch { /* ignore abort errors */ }
105
+ // Remove the corrupted 0-byte file so it doesn't poison the cache
106
+ try {
107
+ await dir.removeEntry(filename);
108
+ }
109
+ catch { /* ignore cleanup errors */ }
110
+ throw writeError;
111
+ }
112
+ logger.info(`Model saved: ${key}`);
113
+ }
114
+ /**
115
+ * Load model data from OPFS.
116
+ *
117
+ * @param key - Model identifier or nested path
118
+ * @returns Model data, or null if not found
119
+ */
120
+ async loadModel(key) {
121
+ if (!this.modelsDir)
122
+ return null;
123
+ try {
124
+ const dir = await this.resolveParentDir(key, /* create */ false);
125
+ const filename = this.resolveFilename(key);
126
+ const fileHandle = await dir.getFileHandle(filename);
127
+ const file = await fileHandle.getFile();
128
+ logger.info(`Loaded model from OPFS: ${key} (${(file.size / 1024 / 1024).toFixed(1)} MB)`);
129
+ return await file.arrayBuffer();
130
+ }
131
+ catch {
132
+ return null; // File not found
133
+ }
134
+ }
135
+ /**
136
+ * Check if a model exists in OPFS.
137
+ *
138
+ * @param key - Model identifier or nested path
139
+ */
140
+ async hasModel(key) {
141
+ if (!this.modelsDir)
142
+ return false;
143
+ try {
144
+ const dir = await this.resolveParentDir(key, /* create */ false);
145
+ const filename = this.resolveFilename(key);
146
+ await dir.getFileHandle(filename);
147
+ return true;
148
+ }
149
+ catch {
150
+ return false;
151
+ }
152
+ }
153
+ /**
154
+ * Delete a model from OPFS.
155
+ *
156
+ * @param key - Model identifier or nested path
157
+ */
158
+ async deleteModel(key) {
159
+ if (!this.modelsDir)
160
+ return;
161
+ try {
162
+ const dir = await this.resolveParentDir(key, /* create */ false);
163
+ const filename = this.resolveFilename(key);
164
+ await dir.removeEntry(filename);
165
+ logger.info(`Deleted model from OPFS: ${key}`);
166
+ }
167
+ catch {
168
+ // File doesn't exist, ignore
169
+ }
170
+ }
171
+ /**
172
+ * Get the byte size of a stored file without reading it into memory.
173
+ *
174
+ * @param key - Model identifier or nested path
175
+ * @returns File size in bytes, or null if the file doesn't exist
176
+ */
177
+ async getFileSize(key) {
178
+ if (!this.modelsDir)
179
+ return null;
180
+ try {
181
+ const dir = await this.resolveParentDir(key, /* create */ false);
182
+ const filename = this.resolveFilename(key);
183
+ const fileHandle = await dir.getFileHandle(filename);
184
+ const file = await fileHandle.getFile();
185
+ return file.size;
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ // ---------------------------------------------------------------------------
192
+ // Bulk operations
193
+ // ---------------------------------------------------------------------------
194
+ /**
195
+ * List all stored models (top-level files only).
196
+ */
197
+ async listModels() {
198
+ if (!this.modelsDir)
199
+ return [];
200
+ const models = [];
201
+ for await (const [name, handle] of this.modelsDir.entries()) {
202
+ if (handle.kind === 'file') {
203
+ const file = await handle.getFile();
204
+ models.push({
205
+ id: name,
206
+ sizeBytes: file.size,
207
+ lastModified: file.lastModified,
208
+ });
209
+ }
210
+ }
211
+ return models;
212
+ }
213
+ /**
214
+ * Get total storage usage.
215
+ */
216
+ async getStorageUsage() {
217
+ if (!navigator.storage?.estimate) {
218
+ return { usedBytes: 0, quotaBytes: 0 };
219
+ }
220
+ const estimate = await navigator.storage.estimate();
221
+ return {
222
+ usedBytes: estimate.usage ?? 0,
223
+ quotaBytes: estimate.quota ?? 0,
224
+ };
225
+ }
226
+ /**
227
+ * Clear all stored models.
228
+ */
229
+ async clearAll() {
230
+ if (!this.rootDir)
231
+ return;
232
+ try {
233
+ await this.rootDir.removeEntry(MODELS_DIR, { recursive: true });
234
+ this.modelsDir = await this.rootDir.getDirectoryHandle(MODELS_DIR, { create: true });
235
+ logger.info('All OPFS models cleared');
236
+ }
237
+ catch (error) {
238
+ const msg = error instanceof Error ? error.message : String(error);
239
+ logger.error(`Failed to clear OPFS: ${msg}`);
240
+ }
241
+ }
242
+ // ---------------------------------------------------------------------------
243
+ // Metadata persistence (lightweight JSON alongside model files)
244
+ // ---------------------------------------------------------------------------
245
+ static METADATA_FILENAME = '_metadata.json';
246
+ /**
247
+ * Save model metadata map to OPFS as a small JSON file.
248
+ * Used for LRU tracking (lastUsedAt timestamps).
249
+ */
250
+ async saveMetadata(data) {
251
+ if (!this.modelsDir)
252
+ return;
253
+ try {
254
+ const json = JSON.stringify(data);
255
+ const blob = new Blob([json], { type: 'application/json' });
256
+ const buf = await blob.arrayBuffer();
257
+ const handle = await this.modelsDir.getFileHandle(OPFSStorage.METADATA_FILENAME, { create: true });
258
+ const writable = await handle.createWritable();
259
+ await writable.write(buf);
260
+ await writable.close();
261
+ }
262
+ catch (err) {
263
+ const msg = err instanceof Error ? err.message : String(err);
264
+ logger.warning(`Failed to save metadata: ${msg}`);
265
+ }
266
+ }
267
+ /**
268
+ * Load the persisted metadata map, or return an empty object.
269
+ */
270
+ async loadMetadata() {
271
+ if (!this.modelsDir)
272
+ return {};
273
+ try {
274
+ const handle = await this.modelsDir.getFileHandle(OPFSStorage.METADATA_FILENAME);
275
+ const file = await handle.getFile();
276
+ const text = await file.text();
277
+ return JSON.parse(text);
278
+ }
279
+ catch {
280
+ return {};
281
+ }
282
+ }
283
+ // ---------------------------------------------------------------------------
284
+ // Path resolution helpers
285
+ // ---------------------------------------------------------------------------
286
+ /**
287
+ * For a key that may contain `/`, traverse (and optionally create) the
288
+ * intermediate directories and return the parent directory handle.
289
+ *
290
+ * For a flat key (no `/`) this returns `this.modelsDir` directly.
291
+ */
292
+ async resolveParentDir(key, create) {
293
+ const dir = this.modelsDir;
294
+ if (!key.includes('/'))
295
+ return dir;
296
+ const parts = key.split('/');
297
+ // All parts except the last are directory segments
298
+ let current = dir;
299
+ for (let i = 0; i < parts.length - 1; i++) {
300
+ current = await current.getDirectoryHandle(parts[i], { create });
301
+ }
302
+ return current;
303
+ }
304
+ /**
305
+ * Extract the final filename segment from a key.
306
+ *
307
+ * For flat keys this returns a sanitized version of the whole key.
308
+ * For nested keys (`org/model/file.gguf`) this returns the last segment
309
+ * with only the filename portion sanitized (directory separators are handled
310
+ * by `resolveParentDir`).
311
+ */
312
+ resolveFilename(key) {
313
+ const raw = key.includes('/') ? key.split('/').pop() : key;
314
+ return this.sanitizeFilename(raw);
315
+ }
316
+ /**
317
+ * Sanitize a single filename segment.
318
+ *
319
+ * Only strips characters that are invalid in filenames. Keeps `.`, `-`, `_`,
320
+ * and all alphanumeric characters. This is intentionally lenient compared to
321
+ * the old implementation which also stripped `/` — directory separators are
322
+ * now handled structurally by `resolveParentDir`.
323
+ */
324
+ sanitizeFilename(name) {
325
+ // Replace characters that are problematic in filenames across platforms.
326
+ // Keeps: alphanumeric, dot, dash, underscore, plus, space, parentheses.
327
+ return name.replace(/[<>:"/\\|?*\x00-\x1F]/g, '_');
328
+ }
329
+ }
330
+ //# sourceMappingURL=OPFSStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OPFSStorage.js","sourceRoot":"","sources":["../../src/Infrastructure/OPFSStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * RunAnywhere Web SDK - VLM Worker Bridge
3
+ *
4
+ * Main-thread proxy for the VLM Web Worker. All VLM inference runs off the
5
+ * main thread so the camera, UI animations, and event loop stay responsive.
6
+ *
7
+ * Usage:
8
+ * ```typescript
9
+ * import { VLMWorkerBridge } from '@runanywhere/web';
10
+ *
11
+ * const vlm = VLMWorkerBridge.shared;
12
+ * await vlm.init();
13
+ * await vlm.loadModel({ ... });
14
+ * const result = await vlm.process(rgbPixels, width, height, prompt, { maxTokens: 100 });
15
+ * ```
16
+ */
17
+ /**
18
+ * RPC commands sent from the main thread to the Worker.
19
+ */
20
+ export type VLMWorkerCommand = {
21
+ type: 'init';
22
+ id: number;
23
+ payload: {
24
+ /** URL to the WASM glue JS (racommons.js or racommons-webgpu.js) */
25
+ wasmJsUrl: string;
26
+ /** Whether the loaded module is the WebGPU variant */
27
+ useWebGPU?: boolean;
28
+ };
29
+ } | {
30
+ type: 'load-model';
31
+ id: number;
32
+ payload: {
33
+ modelOpfsKey: string;
34
+ modelFilename: string;
35
+ mmprojOpfsKey: string;
36
+ mmprojFilename: string;
37
+ modelId: string;
38
+ modelName: string;
39
+ /** Optional: raw model data when OPFS doesn't have it (memory-cache fallback). */
40
+ modelData?: ArrayBuffer;
41
+ /** Optional: raw mmproj data when OPFS doesn't have it. */
42
+ mmprojData?: ArrayBuffer;
43
+ };
44
+ } | {
45
+ type: 'process';
46
+ id: number;
47
+ payload: {
48
+ rgbPixels: ArrayBuffer;
49
+ width: number;
50
+ height: number;
51
+ prompt: string;
52
+ maxTokens: number;
53
+ temperature: number;
54
+ };
55
+ } | {
56
+ type: 'cancel';
57
+ id: number;
58
+ } | {
59
+ type: 'unload';
60
+ id: number;
61
+ };
62
+ /**
63
+ * Result of a VLM inference operation.
64
+ */
65
+ export interface VLMWorkerResult {
66
+ text: string;
67
+ totalTokens: number;
68
+ promptTokens: number;
69
+ completionTokens: number;
70
+ imageTokens: number;
71
+ }
72
+ /**
73
+ * RPC responses from the Worker to the main thread.
74
+ */
75
+ export type VLMWorkerResponse = {
76
+ id: number;
77
+ type: 'result';
78
+ payload: any;
79
+ } | {
80
+ id: number;
81
+ type: 'error';
82
+ payload: {
83
+ message: string;
84
+ };
85
+ } | {
86
+ id: number;
87
+ type: 'progress';
88
+ payload: {
89
+ stage: string;
90
+ };
91
+ };
92
+ /**
93
+ * Parameters for loading a VLM model in the Worker.
94
+ */
95
+ export interface VLMLoadModelParams {
96
+ modelOpfsKey: string;
97
+ modelFilename: string;
98
+ mmprojOpfsKey: string;
99
+ mmprojFilename: string;
100
+ modelId: string;
101
+ modelName: string;
102
+ /** Optional: raw model data when OPFS doesn't have it (memory-cache fallback). */
103
+ modelData?: ArrayBuffer;
104
+ /** Optional: raw mmproj data when OPFS doesn't have it. */
105
+ mmprojData?: ArrayBuffer;
106
+ }
107
+ /**
108
+ * Options for VLM image processing.
109
+ */
110
+ export interface VLMProcessOptions {
111
+ maxTokens?: number;
112
+ temperature?: number;
113
+ }
114
+ /**
115
+ * Callback for VLM progress updates (model loading stages, etc.).
116
+ */
117
+ export type ProgressListener = (stage: string) => void;
118
+ /**
119
+ * VLMWorkerBridge - Main-thread proxy for VLM Web Worker inference.
120
+ *
121
+ * Manages the lifecycle of a dedicated Web Worker that runs VLM inference
122
+ * in its own WASM instance. Provides:
123
+ * - RPC protocol with message ID tracking and promise correlation
124
+ * - Auto-recovery from WASM crashes (OOB, stack overflow, etc.)
125
+ * - Progress listeners for model loading stages
126
+ * - Transferable pixel data for zero-copy image transfer
127
+ */
128
+ export declare class VLMWorkerBridge {
129
+ private static _instance;
130
+ static get shared(): VLMWorkerBridge;
131
+ private worker;
132
+ private nextId;
133
+ private pending;
134
+ private _isInitialized;
135
+ private _isModelLoaded;
136
+ private _progressListeners;
137
+ /** Saved for auto-recovery after WASM crash */
138
+ private _lastModelParams;
139
+ private _needsRecovery;
140
+ /**
141
+ * Optional: the app can provide a custom Worker URL or factory.
142
+ * If not set, the bridge uses the bundled SDK worker entry point.
143
+ */
144
+ private _workerUrl;
145
+ get isInitialized(): boolean;
146
+ get isModelLoaded(): boolean;
147
+ /**
148
+ * Set a custom Worker URL.
149
+ *
150
+ * By default the bridge creates a Worker using the SDK's bundled entry point
151
+ * (`workers/vlm-worker.js`). Apps that need to customise the Worker location
152
+ * (e.g. different deploy path, or a worker that wraps the runtime) can call
153
+ * this before `init()`.
154
+ */
155
+ set workerUrl(url: URL | string);
156
+ /**
157
+ * Subscribe to progress updates from the Worker.
158
+ * Returns an unsubscribe function.
159
+ */
160
+ onProgress(fn: ProgressListener): () => void;
161
+ private emitProgress;
162
+ /**
163
+ * Initialize the Worker and its WASM instance.
164
+ * Must be called once before loadModel/process.
165
+ *
166
+ * Reads the WASM URL and acceleration mode from WASMBridge internally — the
167
+ * app does not need to pass these.
168
+ *
169
+ * @param wasmJsUrl - Optional explicit URL for the WASM glue JS.
170
+ * When omitted, the SDK's WASMBridge.workerWasmUrl is used
171
+ * so the worker loads the exact same variant (WebGPU or CPU)
172
+ * that the main thread successfully loaded.
173
+ */
174
+ init(wasmJsUrl?: string): Promise<void>;
175
+ /**
176
+ * Load a VLM model in the Worker's WASM instance.
177
+ *
178
+ * Normally the Worker reads model files directly from OPFS (zero-copy).
179
+ * When OPFS quota is exceeded and models are only in the main-thread memory
180
+ * cache, the data is transferred via postMessage (still zero-copy via
181
+ * Transferable ArrayBuffers).
182
+ */
183
+ loadModel(params: VLMLoadModelParams): Promise<void>;
184
+ /**
185
+ * Process an image with the VLM.
186
+ * Returns a promise that resolves when inference is complete.
187
+ * The main thread stays responsive during processing.
188
+ *
189
+ * The pixel buffer is transferred (zero-copy) to the Worker.
190
+ */
191
+ process(rgbPixels: Uint8Array, width: number, height: number, prompt: string, options?: VLMProcessOptions): Promise<VLMWorkerResult>;
192
+ /**
193
+ * Recover from a WASM crash by terminating the old Worker,
194
+ * creating a fresh one, and reloading the model.
195
+ */
196
+ private recover;
197
+ /** Cancel in-progress VLM generation. */
198
+ cancel(): void;
199
+ /** Unload the VLM model. */
200
+ unloadModel(): Promise<void>;
201
+ /**
202
+ * Terminate the Worker entirely.
203
+ *
204
+ * Rejects any in-flight RPC promises so callers aren't left hanging,
205
+ * then terminates the underlying Web Worker.
206
+ */
207
+ terminate(): void;
208
+ private send;
209
+ private handleMessage;
210
+ }
211
+ //# sourceMappingURL=VLMWorkerBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VLMWorkerBridge.d.ts","sourceRoot":"","sources":["../../src/Infrastructure/VLMWorkerBridge.ts"],"names":[],"mappings":"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"}