@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,503 @@
1
+ /**
2
+ * RunAnywhere Web SDK - VLM Worker Runtime
3
+ *
4
+ * Encapsulates the Worker-side logic for VLM inference. This module runs
5
+ * inside a dedicated Web Worker and manages its own WASM instance
6
+ * (separate from the main-thread SDK).
7
+ *
8
+ * Architecture:
9
+ * - Loads its OWN WASM instance (separate from the main thread SDK)
10
+ * - Reads model files from OPFS directly (no large postMessage transfers)
11
+ * - Communicates via typed postMessage RPC
12
+ *
13
+ * Why a separate WASM instance?
14
+ * The C function `rac_vlm_component_process` is synchronous and blocks for
15
+ * ~100s (2B model in WASM). Running it on the main thread freezes the entire UI.
16
+ * A Worker with its own WASM instance allows inference to happen concurrently.
17
+ *
18
+ * IMPORTANT: This file must NOT import from WASMBridge.ts or other SDK modules
19
+ * that assume a main-thread context. The Worker has its own WASM instance and
20
+ * should be self-contained. Only `type`-only imports are safe.
21
+ */
22
+ import { loadOffsetsFromModule } from '../Foundation/StructOffsets';
23
+ // ---------------------------------------------------------------------------
24
+ // Worker state
25
+ // ---------------------------------------------------------------------------
26
+ let wasmModule = null;
27
+ let vlmHandle = 0;
28
+ let isWebGPU = false;
29
+ let offsets = null;
30
+ // ---------------------------------------------------------------------------
31
+ // Logging (lightweight — no SDKLogger dependency in Worker context)
32
+ // ---------------------------------------------------------------------------
33
+ const LOG_PREFIX = '[RunAnywhere:VLMWorker]';
34
+ function logInfo(...args) { console.info(LOG_PREFIX, ...args); }
35
+ function logWarn(...args) { console.warn(LOG_PREFIX, ...args); }
36
+ function logError(...args) { console.error(LOG_PREFIX, ...args); }
37
+ // ---------------------------------------------------------------------------
38
+ // Helpers: string alloc / free on WASM heap
39
+ // ---------------------------------------------------------------------------
40
+ function allocString(str) {
41
+ const m = wasmModule;
42
+ const len = m.lengthBytesUTF8(str) + 1; // +1 for null terminator
43
+ const ptr = m._malloc(len);
44
+ m.stringToUTF8(str, ptr, len);
45
+ return ptr;
46
+ }
47
+ function readString(ptr) {
48
+ if (!ptr)
49
+ return '';
50
+ return wasmModule.UTF8ToString(ptr);
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // Helpers: binary data ↔ WASM heap
54
+ //
55
+ // HEAPU8 may not be exported from the WASM module (depends on build config).
56
+ // Try HEAPU8 first for speed, fall back to setValue byte-by-byte.
57
+ // ---------------------------------------------------------------------------
58
+ function writeToWasmHeap(src, destPtr) {
59
+ const m = wasmModule;
60
+ // Fast path: direct HEAPU8 (available when exported via EXPORTED_RUNTIME_METHODS)
61
+ if (m.HEAPU8) {
62
+ m.HEAPU8.set(src, destPtr);
63
+ return;
64
+ }
65
+ // Slow fallback: byte-by-byte via setValue (always available)
66
+ for (let i = 0; i < src.length; i++) {
67
+ m.setValue(destPtr + i, src[i], 'i8');
68
+ }
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // OPFS helpers (Workers have full OPFS access)
72
+ //
73
+ // Lightweight inline reader matching the same directory layout as OPFSStorage
74
+ // (root → models/ → nested paths). We don't import OPFSStorage because it
75
+ // uses SDKLogger and other SDK infrastructure that may not work in Workers.
76
+ // ---------------------------------------------------------------------------
77
+ const OPFS_MODELS_DIR = 'models';
78
+ async function loadFromOPFS(key) {
79
+ try {
80
+ const root = await navigator.storage.getDirectory();
81
+ const modelsDir = await root.getDirectoryHandle(OPFS_MODELS_DIR);
82
+ let file;
83
+ if (key.includes('/')) {
84
+ const parts = key.split('/');
85
+ let dir = modelsDir;
86
+ for (let i = 0; i < parts.length - 1; i++) {
87
+ dir = await dir.getDirectoryHandle(parts[i]);
88
+ }
89
+ const handle = await dir.getFileHandle(parts[parts.length - 1]);
90
+ file = await handle.getFile();
91
+ }
92
+ else {
93
+ const handle = await modelsDir.getFileHandle(key);
94
+ file = await handle.getFile();
95
+ }
96
+ const buffer = await file.arrayBuffer();
97
+ return new Uint8Array(buffer);
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // WASM initialization
105
+ // ---------------------------------------------------------------------------
106
+ async function initWASM(wasmJsUrl, useWebGPU = false) {
107
+ isWebGPU = useWebGPU;
108
+ logInfo(`Loading WASM module (${useWebGPU ? 'WebGPU' : 'CPU'})...`);
109
+ // Dynamically import the Emscripten ES6 glue JS
110
+ const { default: createModule } = await import(/* @vite-ignore */ wasmJsUrl);
111
+ wasmModule = await createModule({
112
+ print: (text) => logInfo(text),
113
+ printErr: (text) => logError(text),
114
+ });
115
+ const m = wasmModule;
116
+ // ---- rac_init: minimal initialization ----
117
+ // We need a platform adapter for rac_init. Create a minimal one.
118
+ const adapterSize = m._rac_wasm_sizeof_platform_adapter();
119
+ const adapterPtr = m._malloc(adapterSize);
120
+ for (let i = 0; i < adapterSize; i++)
121
+ m.setValue(adapterPtr + i, 0, 'i8');
122
+ // Register essential callbacks via addFunction.
123
+ // Signatures MUST match the main-thread PlatformAdapter.ts exactly —
124
+ // Emscripten's indirect-call table traps on signature mismatch.
125
+ const PTR_SIZE = 4;
126
+ let offset = 0;
127
+ // file_exists: rac_bool_t (*)(const char* path, void* user_data)
128
+ const fileExistsCb = m.addFunction((_pathPtr, _ud) => {
129
+ return 0; // nothing exists — VLM uses Emscripten's C fopen/fread
130
+ }, 'iii');
131
+ m.setValue(adapterPtr + offset, fileExistsCb, '*');
132
+ offset += PTR_SIZE;
133
+ // file_read: rac_result_t (*)(const char* path, void** out_data, size_t* out_size, void* user_data)
134
+ const noopReadCb = m.addFunction((_pathPtr, _outData, _outSize, _ud) => -180, 'iiiii');
135
+ m.setValue(adapterPtr + offset, noopReadCb, '*');
136
+ offset += PTR_SIZE;
137
+ // file_write: rac_result_t (*)(const char* path, const void* data, size_t size, void* user_data)
138
+ const noopWriteCb = m.addFunction((_pathPtr, _data, _size, _ud) => -180, 'iiiii');
139
+ m.setValue(adapterPtr + offset, noopWriteCb, '*');
140
+ offset += PTR_SIZE;
141
+ // file_delete: rac_result_t (*)(const char* path, void* user_data)
142
+ const noopDelCb = m.addFunction((_pathPtr, _ud) => -180, 'iii');
143
+ m.setValue(adapterPtr + offset, noopDelCb, '*');
144
+ offset += PTR_SIZE;
145
+ // secure_get: rac_result_t (*)(const char* key, char** out_value, void* user_data)
146
+ const secureGetCb = m.addFunction((_kp, outPtr, _ud) => {
147
+ m.setValue(outPtr, 0, '*');
148
+ return -182;
149
+ }, 'iiii');
150
+ m.setValue(adapterPtr + offset, secureGetCb, '*');
151
+ offset += PTR_SIZE;
152
+ // secure_set: rac_result_t (*)(const char* key, const char* value, void* user_data)
153
+ const secureSetCb = m.addFunction((_keyPtr, _valPtr, _ud) => 0, 'iiii');
154
+ m.setValue(adapterPtr + offset, secureSetCb, '*');
155
+ offset += PTR_SIZE;
156
+ // secure_delete: rac_result_t (*)(const char* key, void* user_data)
157
+ const secureDelCb = m.addFunction((_keyPtr, _ud) => 0, 'iii');
158
+ m.setValue(adapterPtr + offset, secureDelCb, '*');
159
+ offset += PTR_SIZE;
160
+ // log: void (*)(rac_log_level_t level, const char* category, const char* message, void* user_data)
161
+ const logCb = m.addFunction((level, catPtr, msgPtr, _ud) => {
162
+ const cat = m.UTF8ToString(catPtr);
163
+ const msg = m.UTF8ToString(msgPtr);
164
+ const prefix = `[RunAnywhere:VLMWorker:${cat}]`;
165
+ if (level <= 1)
166
+ console.debug(prefix, msg);
167
+ else if (level === 2)
168
+ console.info(prefix, msg);
169
+ else if (level === 3)
170
+ console.warn(prefix, msg);
171
+ else
172
+ console.error(prefix, msg);
173
+ }, 'viiii');
174
+ m.setValue(adapterPtr + offset, logCb, '*');
175
+ offset += PTR_SIZE;
176
+ // track_error (null)
177
+ m.setValue(adapterPtr + offset, 0, '*');
178
+ offset += PTR_SIZE;
179
+ // now_ms: int64_t (*)(void* user_data) — signature 'ii' (returns i32, takes i32 user_data)
180
+ const nowMsCb = m.addFunction((_ud) => Date.now(), 'ii');
181
+ m.setValue(adapterPtr + offset, nowMsCb, '*');
182
+ offset += PTR_SIZE;
183
+ // get_memory_info: rac_result_t (*)(rac_memory_info_t* out_info, void* user_data)
184
+ const memInfoCb = m.addFunction((outPtr, _ud) => {
185
+ const totalMB = navigator.deviceMemory ?? 4;
186
+ const totalBytes = totalMB * 1024 * 1024 * 1024;
187
+ // rac_memory_info_t: { uint64_t total, available, used }
188
+ // Write as two i32 values per uint64 (wasm32)
189
+ m.setValue(outPtr, totalBytes & 0xFFFFFFFF, 'i32'); // total low
190
+ m.setValue(outPtr + 4, 0, 'i32'); // total high
191
+ m.setValue(outPtr + 8, totalBytes & 0xFFFFFFFF, 'i32'); // available low
192
+ m.setValue(outPtr + 12, 0, 'i32'); // available high
193
+ m.setValue(outPtr + 16, 0, 'i32'); // used low
194
+ m.setValue(outPtr + 20, 0, 'i32'); // used high
195
+ return 0;
196
+ }, 'iii');
197
+ m.setValue(adapterPtr + offset, memInfoCb, '*');
198
+ offset += PTR_SIZE;
199
+ // http_download (no-op)
200
+ m.setValue(adapterPtr + offset, 0, '*');
201
+ offset += PTR_SIZE;
202
+ // http_download_cancel (no-op) — main-thread PlatformAdapter also sets this slot
203
+ m.setValue(adapterPtr + offset, 0, '*');
204
+ offset += PTR_SIZE;
205
+ // extract_archive (no-op)
206
+ m.setValue(adapterPtr + offset, 0, '*');
207
+ offset += PTR_SIZE;
208
+ // user_data (null)
209
+ m.setValue(adapterPtr + offset, 0, '*');
210
+ // ---- Register the adapter with RACommons (must happen before rac_init) ----
211
+ // _rac_set_platform_adapter is a simple pointer-store: it makes NO indirect
212
+ // calls into JS, so Emscripten does NOT wrap it with JSPI → returns a plain
213
+ // number synchronously.
214
+ logInfo('Step 1: Registering platform adapter...');
215
+ if (typeof m._rac_set_platform_adapter === 'function') {
216
+ const adapterResult = m._rac_set_platform_adapter(adapterPtr);
217
+ if (adapterResult !== 0) {
218
+ logWarn(`rac_set_platform_adapter returned ${adapterResult}`);
219
+ }
220
+ }
221
+ logInfo('Step 1 done: Platform adapter registered');
222
+ // ---- Call rac_init ----
223
+ //
224
+ // rac_init is logically synchronous C++ (stores adapter, inits diffusion
225
+ // registry, logs). However, in the WebGPU WASM build **every** export that
226
+ // transitively calls an addFunction-registered callback (e.g. the log
227
+ // callback via adapter->log) is JSPI-wrapped and returns a Promise.
228
+ //
229
+ // The Worker's JSPI suspendable stack is smaller than the main thread's,
230
+ // and the diffusion-model-registry init inside rac_init calls RAC_LOG_INFO
231
+ // multiple times — each log allocates 2×2048-byte char[] buffers on the
232
+ // stack — which overflows the JSPI stack with "memory access out of bounds".
233
+ //
234
+ // This is NON-FATAL for VLM: none of rac_backend_llamacpp_vlm_register,
235
+ // rac_vlm_component_create, rac_vlm_component_load_model, or
236
+ // rac_vlm_component_process check `s_initialized`. The platform adapter
237
+ // was already stored in Step 1 via rac_set_platform_adapter, so logging
238
+ // from subsequent calls still works.
239
+ //
240
+ // Strategy: try rac_init, and if it fails (JSPI stack overflow), continue.
241
+ logInfo('Step 2: Calling rac_init...');
242
+ const configSize = m._rac_wasm_sizeof_config();
243
+ const configPtr = m._malloc(configSize);
244
+ for (let i = 0; i < configSize; i++)
245
+ m.setValue(configPtr + i, 0, 'i8');
246
+ m.setValue(configPtr, adapterPtr, '*'); // platform_adapter (offset 0)
247
+ const logLevelOffset = typeof m._rac_wasm_offsetof_config_log_level === 'function'
248
+ ? m._rac_wasm_offsetof_config_log_level()
249
+ : 4;
250
+ m.setValue(configPtr + logLevelOffset, 2, 'i32'); // log_level = INFO
251
+ try {
252
+ const initResult = await m.ccall('rac_init', 'number', ['number'], [configPtr], { async: true });
253
+ if (initResult !== 0) {
254
+ logWarn(`rac_init returned non-zero (${initResult}), continuing without full core init`);
255
+ }
256
+ else {
257
+ logInfo('Step 2 done: rac_init succeeded');
258
+ }
259
+ }
260
+ catch (e) {
261
+ // Expected on WebGPU Workers: diffusion registry logging overflows the
262
+ // JSPI suspendable stack. Non-fatal — VLM functions don't depend on it.
263
+ logWarn(`rac_init failed in Worker (${e}), continuing — VLM does not require full core init`);
264
+ }
265
+ m._free(configPtr);
266
+ // ---- Load struct field offsets ----
267
+ // These are simple sizeof / offsetof helper exports that return plain ints.
268
+ // They do NOT call any callbacks → not JSPI-wrapped → synchronous.
269
+ logInfo('Step 3: Loading struct offsets...');
270
+ offsets = loadOffsetsFromModule(m);
271
+ logInfo('Step 3 done: Offsets loaded');
272
+ // ---- Register VLM backend ----
273
+ // rac_backend_llamacpp_vlm_register is only available when the WASM binary
274
+ // was built with --vlm (RAC_WASM_VLM=ON). It is in JSPI_EXPORTS so it
275
+ // returns a Promise → use ccall({async: true}).
276
+ logInfo('Step 4: Registering VLM backend...');
277
+ if (typeof m['_rac_backend_llamacpp_vlm_register'] !== 'function') {
278
+ throw new Error('VLM backend not available in WASM build. '
279
+ + 'Rebuild with: ./scripts/build.sh --webgpu --vlm');
280
+ }
281
+ const regResult = await m.ccall('rac_backend_llamacpp_vlm_register', 'number', [], [], { async: true });
282
+ logInfo(`Step 4 done: VLM backend registered (result: ${regResult})`);
283
+ // ---- Create VLM component ----
284
+ // rac_vlm_component_create is in JSPI_EXPORTS → returns Promise.
285
+ logInfo('Step 5: Creating VLM component...');
286
+ const handlePtr = m._malloc(4);
287
+ const createResult = await m.ccall('rac_vlm_component_create', 'number', ['number'], [handlePtr], { async: true });
288
+ if (createResult !== 0) {
289
+ m._free(handlePtr);
290
+ throw new Error(`rac_vlm_component_create failed: ${createResult}`);
291
+ }
292
+ vlmHandle = m.getValue(handlePtr, 'i32');
293
+ m._free(handlePtr);
294
+ logInfo(`WASM initialized, VLM component ready (${isWebGPU ? 'WebGPU' : 'CPU'})`);
295
+ }
296
+ // ---------------------------------------------------------------------------
297
+ // Model loading (reads from OPFS, writes to Worker's WASM FS)
298
+ // ---------------------------------------------------------------------------
299
+ async function loadModel(modelOpfsKey, modelFilename, mmprojOpfsKey, mmprojFilename, modelId, modelName, providedModelData, providedMmprojData) {
300
+ const m = wasmModule;
301
+ // Ensure /models directory exists in Emscripten FS
302
+ m.FS_createPath('/', 'models', true, true);
303
+ // Read model: use provided data (transferred from main thread) or OPFS
304
+ self.postMessage({ id: -1, type: 'progress', payload: { stage: 'Reading model from storage...' } });
305
+ let modelData;
306
+ if (providedModelData && providedModelData.byteLength > 0) {
307
+ logInfo(`Using transferred model data: ${(providedModelData.byteLength / 1024 / 1024).toFixed(1)} MB`);
308
+ modelData = new Uint8Array(providedModelData);
309
+ }
310
+ else {
311
+ logInfo(`Reading model from OPFS: key=${modelOpfsKey}`);
312
+ const opfsData = await loadFromOPFS(modelOpfsKey);
313
+ if (!opfsData)
314
+ throw new Error(`Model not found in OPFS: ${modelOpfsKey}`);
315
+ modelData = opfsData;
316
+ }
317
+ logInfo(`Model data: ${(modelData.length / 1024 / 1024).toFixed(1)} MB`);
318
+ // Write to WASM FS
319
+ self.postMessage({ id: -1, type: 'progress', payload: { stage: 'Preparing model...' } });
320
+ const modelPath = `/models/${modelFilename}`;
321
+ try {
322
+ m.FS_unlink(modelPath);
323
+ }
324
+ catch { /* doesn't exist */ }
325
+ logInfo(`Writing model to WASM FS: ${modelPath}`);
326
+ m.FS_createDataFile('/models', modelFilename, modelData, true, true, true);
327
+ logInfo('Model written to WASM FS');
328
+ // Read mmproj: use provided data or OPFS
329
+ self.postMessage({ id: -1, type: 'progress', payload: { stage: 'Reading vision encoder...' } });
330
+ let mmprojData;
331
+ if (providedMmprojData && providedMmprojData.byteLength > 0) {
332
+ logInfo(`Using transferred mmproj data: ${(providedMmprojData.byteLength / 1024 / 1024).toFixed(1)} MB`);
333
+ mmprojData = new Uint8Array(providedMmprojData);
334
+ }
335
+ else {
336
+ logInfo(`Reading mmproj from OPFS: key=${mmprojOpfsKey}`);
337
+ const opfsMmproj = await loadFromOPFS(mmprojOpfsKey);
338
+ if (!opfsMmproj)
339
+ throw new Error(`mmproj not found in OPFS: ${mmprojOpfsKey}`);
340
+ mmprojData = opfsMmproj;
341
+ }
342
+ logInfo(`mmproj data: ${(mmprojData.length / 1024 / 1024).toFixed(1)} MB`);
343
+ const mmprojPath = `/models/${mmprojFilename}`;
344
+ try {
345
+ m.FS_unlink(mmprojPath);
346
+ }
347
+ catch { /* doesn't exist */ }
348
+ logInfo(`Writing mmproj to WASM FS: ${mmprojPath}`);
349
+ m.FS_createDataFile('/models', mmprojFilename, mmprojData, true, true, true);
350
+ logInfo('mmproj written to WASM FS');
351
+ // Load model via VLM component
352
+ self.postMessage({ id: -1, type: 'progress', payload: { stage: 'Loading model...' } });
353
+ const pathPtr = allocString(modelPath);
354
+ const projPtr = allocString(mmprojPath);
355
+ const idPtr = allocString(modelId);
356
+ const namePtr = allocString(modelName);
357
+ try {
358
+ // {async: true} for JSPI — model loading creates WebGPU buffers and
359
+ // allocates GPU memory, which suspends the WASM stack.
360
+ const result = await m.ccall('rac_vlm_component_load_model', 'number', ['number', 'number', 'number', 'number', 'number'], [vlmHandle, pathPtr, projPtr, idPtr, namePtr], { async: true });
361
+ if (result !== 0) {
362
+ throw new Error(`rac_vlm_component_load_model failed: ${result}`);
363
+ }
364
+ logInfo(`Model loaded: ${modelId}`);
365
+ }
366
+ finally {
367
+ m._free(pathPtr);
368
+ m._free(projPtr);
369
+ m._free(idPtr);
370
+ m._free(namePtr);
371
+ }
372
+ }
373
+ // ---------------------------------------------------------------------------
374
+ // Image processing
375
+ // ---------------------------------------------------------------------------
376
+ async function processImage(rgbPixels, width, height, prompt, maxTokens, temperature) {
377
+ const m = wasmModule;
378
+ const pixelArray = new Uint8Array(rgbPixels);
379
+ // Use C sizeof helpers for correct struct sizes (avoids 32/64-bit mismatch)
380
+ const imageSize = m.ccall('rac_wasm_sizeof_vlm_image', 'number', [], []);
381
+ const optSize = m.ccall('rac_wasm_sizeof_vlm_options', 'number', [], []);
382
+ const resSize = m.ccall('rac_wasm_sizeof_vlm_result', 'number', [], []);
383
+ // Build rac_vlm_image_t struct (format=1 for RGB pixels)
384
+ const imagePtr = m._malloc(imageSize);
385
+ for (let i = 0; i < imageSize; i++)
386
+ m.setValue(imagePtr + i, 0, 'i8');
387
+ const vi = offsets.vlmImage;
388
+ m.setValue(imagePtr + vi.format, 1, 'i32'); // format = RGBPixels
389
+ const pixelPtr = m._malloc(pixelArray.length);
390
+ writeToWasmHeap(pixelArray, pixelPtr);
391
+ m.setValue(imagePtr + vi.pixelData, pixelPtr, '*');
392
+ m.setValue(imagePtr + vi.width, width, 'i32');
393
+ m.setValue(imagePtr + vi.height, height, 'i32');
394
+ m.setValue(imagePtr + vi.dataSize, pixelArray.length, 'i32');
395
+ // Build rac_vlm_options_t (offsets from compiler)
396
+ const optPtr = m._malloc(optSize);
397
+ for (let i = 0; i < optSize; i++)
398
+ m.setValue(optPtr + i, 0, 'i8');
399
+ const vo = offsets.vlmOptions;
400
+ m.setValue(optPtr + vo.maxTokens, maxTokens, 'i32');
401
+ m.setValue(optPtr + vo.temperature, temperature, 'float');
402
+ m.setValue(optPtr + vo.topP, 0.9, 'float');
403
+ const promptPtr = allocString(prompt);
404
+ // Result struct
405
+ const resPtr = m._malloc(resSize);
406
+ for (let i = 0; i < resSize; i++)
407
+ m.setValue(resPtr + i, 0, 'i8');
408
+ try {
409
+ // {async: true} for JSPI — VLM inference performs extensive GPU compute
410
+ // (CLIP encoding + LLM generation) that suspends the WASM stack.
411
+ const r = await m.ccall('rac_vlm_component_process', 'number', ['number', 'number', 'number', 'number', 'number'], [vlmHandle, imagePtr, promptPtr, optPtr, resPtr], { async: true });
412
+ if (r !== 0) {
413
+ throw new Error(`rac_vlm_component_process failed: ${r}`);
414
+ }
415
+ // Read rac_vlm_result_t (offsets from compiler via StructOffsets)
416
+ const vr = offsets.vlmResult;
417
+ const textPtr = m.getValue(resPtr + vr.text, '*');
418
+ const result = {
419
+ text: readString(textPtr),
420
+ promptTokens: m.getValue(resPtr + vr.promptTokens, 'i32'),
421
+ imageTokens: m.getValue(resPtr + vr.imageTokens, 'i32'),
422
+ completionTokens: m.getValue(resPtr + vr.completionTokens, 'i32'),
423
+ totalTokens: m.getValue(resPtr + vr.totalTokens, 'i32'),
424
+ };
425
+ // Free C-allocated internal strings, then free JS-allocated struct
426
+ m.ccall('rac_vlm_result_free', null, ['number'], [resPtr]);
427
+ return result;
428
+ }
429
+ finally {
430
+ m._free(promptPtr);
431
+ m._free(imagePtr);
432
+ m._free(optPtr);
433
+ m._free(pixelPtr);
434
+ m._free(resPtr);
435
+ }
436
+ }
437
+ // ---------------------------------------------------------------------------
438
+ // RPC message handler
439
+ // ---------------------------------------------------------------------------
440
+ function handleMessage(e) {
441
+ const { type, id } = e.data;
442
+ const respond = async () => {
443
+ switch (type) {
444
+ case 'init': {
445
+ await initWASM(e.data.payload.wasmJsUrl, e.data.payload.useWebGPU ?? false);
446
+ self.postMessage({ id, type: 'result', payload: { success: true, useWebGPU: isWebGPU } });
447
+ break;
448
+ }
449
+ case 'load-model': {
450
+ const p = e.data.payload;
451
+ await loadModel(p.modelOpfsKey, p.modelFilename, p.mmprojOpfsKey, p.mmprojFilename, p.modelId, p.modelName, p.modelData, p.mmprojData);
452
+ self.postMessage({ id, type: 'result', payload: { success: true } });
453
+ break;
454
+ }
455
+ case 'process': {
456
+ const p = e.data.payload;
457
+ const result = await processImage(p.rgbPixels, p.width, p.height, p.prompt, p.maxTokens, p.temperature);
458
+ self.postMessage({ id, type: 'result', payload: result });
459
+ break;
460
+ }
461
+ case 'cancel': {
462
+ if (wasmModule && vlmHandle) {
463
+ wasmModule.ccall('rac_vlm_component_cancel', 'number', ['number'], [vlmHandle]);
464
+ }
465
+ self.postMessage({ id, type: 'result', payload: { success: true } });
466
+ break;
467
+ }
468
+ case 'unload': {
469
+ if (wasmModule && vlmHandle) {
470
+ wasmModule.ccall('rac_vlm_component_unload', 'number', ['number'], [vlmHandle]);
471
+ }
472
+ self.postMessage({ id, type: 'result', payload: { success: true } });
473
+ break;
474
+ }
475
+ }
476
+ };
477
+ respond().catch((err) => {
478
+ const message = err instanceof Error ? err.message : String(err);
479
+ logError(`Error in ${type}:`, message);
480
+ self.postMessage({ id, type: 'error', payload: { message } });
481
+ });
482
+ }
483
+ // ---------------------------------------------------------------------------
484
+ // Public API: start the runtime
485
+ // ---------------------------------------------------------------------------
486
+ /**
487
+ * Start the VLM Worker runtime.
488
+ *
489
+ * Call this once from the Worker entry point. It sets up the `self.onmessage`
490
+ * handler that processes RPC commands from the main-thread VLMWorkerBridge.
491
+ *
492
+ * @example
493
+ * ```typescript
494
+ * // workers/vlm-worker.ts
495
+ * import { startVLMWorkerRuntime } from '../Infrastructure/VLMWorkerRuntime';
496
+ * startVLMWorkerRuntime();
497
+ * ```
498
+ */
499
+ export function startVLMWorkerRuntime() {
500
+ logInfo('VLM Worker runtime starting...');
501
+ self.onmessage = handleMessage;
502
+ }
503
+ //# sourceMappingURL=VLMWorkerRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VLMWorkerRuntime.js","sourceRoot":"","sources":["../../src/Infrastructure/VLMWorkerRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Video Capture
3
+ *
4
+ * Manages webcam lifecycle and frame extraction for VLM inference.
5
+ * Provides aspect-ratio-preserving downscaling and RGBA->RGB conversion
6
+ * matching the format expected by the C++ VLM backend
7
+ * (RAC_VLM_IMAGE_FORMAT_RGB_PIXELS with RGBRGBRGB... byte layout).
8
+ *
9
+ * Follows the same pattern as AudioCapture: config, start/stop lifecycle,
10
+ * and utility getters.
11
+ *
12
+ * Usage:
13
+ * ```typescript
14
+ * import { VideoCapture } from '@runanywhere/web';
15
+ *
16
+ * const camera = new VideoCapture({ facingMode: 'environment' });
17
+ * await camera.start();
18
+ * document.body.appendChild(camera.videoElement);
19
+ *
20
+ * const frame = camera.captureFrame(256);
21
+ * if (frame) {
22
+ * await vlm.process(frame.rgbPixels, frame.width, frame.height, prompt);
23
+ * }
24
+ *
25
+ * camera.stop();
26
+ * ```
27
+ */
28
+ /** Configuration for the VideoCapture instance. */
29
+ export interface VideoCaptureConfig {
30
+ /** Camera facing mode (default: 'environment' for back camera). */
31
+ facingMode?: 'user' | 'environment';
32
+ /** Ideal video width in pixels (default: 640). */
33
+ idealWidth?: number;
34
+ /** Ideal video height in pixels (default: 480). */
35
+ idealHeight?: number;
36
+ }
37
+ /** Captured frame: raw RGB pixels suitable for VLM inference. */
38
+ export interface CapturedFrame {
39
+ /** Raw RGBRGBRGB... byte layout (no alpha). */
40
+ rgbPixels: Uint8Array;
41
+ /** Frame width in pixels. */
42
+ width: number;
43
+ /** Frame height in pixels. */
44
+ height: number;
45
+ }
46
+ /**
47
+ * VideoCapture - Manages webcam and frame extraction for VLM inference.
48
+ *
49
+ * Creates an internal HTMLVideoElement (for the media stream) and an
50
+ * offscreen HTMLCanvasElement (for pixel extraction). The video element
51
+ * is accessible via `videoElement` so the app can attach it to the DOM
52
+ * for live preview.
53
+ */
54
+ export declare class VideoCapture {
55
+ private readonly config;
56
+ private _mediaStream;
57
+ private _videoEl;
58
+ private _canvasEl;
59
+ private _isCapturing;
60
+ constructor(config?: VideoCaptureConfig);
61
+ /** Whether the camera is currently capturing. */
62
+ get isCapturing(): boolean;
63
+ /**
64
+ * The HTMLVideoElement receiving the camera stream.
65
+ * Attach this to the DOM for live preview:
66
+ *
67
+ * ```typescript
68
+ * previewContainer.appendChild(camera.videoElement);
69
+ * ```
70
+ */
71
+ get videoElement(): HTMLVideoElement;
72
+ /** Native video width from the camera (0 if not started). */
73
+ get videoWidth(): number;
74
+ /** Native video height from the camera (0 if not started). */
75
+ get videoHeight(): number;
76
+ /**
77
+ * Start the camera and begin capturing video.
78
+ *
79
+ * Requests camera permission via `getUserMedia`. The returned Promise
80
+ * resolves once the video stream is active and ready for frame capture.
81
+ *
82
+ * @throws If camera permission is denied or no camera is available.
83
+ */
84
+ start(): Promise<void>;
85
+ /**
86
+ * Stop capturing video and release camera resources.
87
+ */
88
+ stop(): void;
89
+ /**
90
+ * Capture the current video frame as raw RGB pixels.
91
+ *
92
+ * The frame is downscaled to fit within `maxDimension` while preserving
93
+ * aspect ratio. The CLIP encoder resizes to its fixed input size
94
+ * internally, so capturing at larger sizes only wastes WASM copy time.
95
+ *
96
+ * @param maxDimension Maximum width or height in pixels (default: 512).
97
+ * @returns CapturedFrame or null if the video stream isn't ready.
98
+ */
99
+ captureFrame(maxDimension?: number): CapturedFrame | null;
100
+ /**
101
+ * Compute a downscaled size that fits within `maxDim` while
102
+ * preserving aspect ratio. Returns original size if already small enough.
103
+ */
104
+ static fitSize(srcW: number, srcH: number, maxDim: number): {
105
+ w: number;
106
+ h: number;
107
+ };
108
+ /**
109
+ * Extract raw RGB pixels from a canvas 2D context.
110
+ *
111
+ * Canvas gives RGBA; this strips the alpha channel to produce the
112
+ * RGBRGBRGB... byte layout expected by the C++ VLM backend
113
+ * (RAC_VLM_IMAGE_FORMAT_RGB_PIXELS).
114
+ */
115
+ static extractRGB(ctx: CanvasRenderingContext2D, w: number, h: number): CapturedFrame;
116
+ private cleanupResources;
117
+ }
118
+ //# sourceMappingURL=VideoCapture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoCapture.d.ts","sourceRoot":"","sources":["../../src/Infrastructure/VideoCapture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAUH,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACpC,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,SAAS,EAAE,UAAU,CAAC;IACtB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,GAAE,kBAAuB;IAkB3C,iDAAiD;IACjD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;;;;;;OAOG;IACH,IAAI,YAAY,IAAI,gBAAgB,CAEnC;IAED,6DAA6D;IAC7D,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,8DAA8D;IAC9D,IAAI,WAAW,IAAI,MAAM,CAExB;IAID;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAUZ;;;;;;;;;OASG;IACH,YAAY,CAAC,YAAY,SAAM,GAAG,aAAa,GAAG,IAAI;IAuBtD;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAWpF;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa;IAmBrF,OAAO,CAAC,gBAAgB;CAOzB"}