@runanywhere/web-llamacpp 0.1.0-beta.10
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.
- package/README.md +75 -0
- package/dist/Extensions/DiffusionTypes.d.ts +64 -0
- package/dist/Extensions/DiffusionTypes.d.ts.map +1 -0
- package/dist/Extensions/DiffusionTypes.js +28 -0
- package/dist/Extensions/DiffusionTypes.js.map +1 -0
- package/dist/Extensions/EmbeddingsTypes.d.ts +33 -0
- package/dist/Extensions/EmbeddingsTypes.d.ts.map +1 -0
- package/dist/Extensions/EmbeddingsTypes.js +13 -0
- package/dist/Extensions/EmbeddingsTypes.js.map +1 -0
- package/dist/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
- package/dist/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+Diffusion.js +185 -0
- package/dist/Extensions/RunAnywhere+Diffusion.js.map +1 -0
- package/dist/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
- package/dist/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+Embeddings.js +236 -0
- package/dist/Extensions/RunAnywhere+Embeddings.js.map +1 -0
- package/dist/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
- package/dist/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+StructuredOutput.js +194 -0
- package/dist/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
- package/dist/Extensions/RunAnywhere+TextGeneration.d.ts +87 -0
- package/dist/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+TextGeneration.js +525 -0
- package/dist/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
- package/dist/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
- package/dist/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+ToolCalling.js +574 -0
- package/dist/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
- package/dist/Extensions/RunAnywhere+VLM.d.ts +57 -0
- package/dist/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+VLM.js +258 -0
- package/dist/Extensions/RunAnywhere+VLM.js.map +1 -0
- package/dist/Extensions/ToolCallingTypes.d.ts +78 -0
- package/dist/Extensions/ToolCallingTypes.d.ts.map +1 -0
- package/dist/Extensions/ToolCallingTypes.js +8 -0
- package/dist/Extensions/ToolCallingTypes.js.map +1 -0
- package/dist/Extensions/VLMTypes.d.ts +16 -0
- package/dist/Extensions/VLMTypes.d.ts.map +1 -0
- package/dist/Extensions/VLMTypes.js +18 -0
- package/dist/Extensions/VLMTypes.js.map +1 -0
- package/dist/Foundation/AnalyticsEventsBridge.d.ts +38 -0
- package/dist/Foundation/AnalyticsEventsBridge.d.ts.map +1 -0
- package/dist/Foundation/AnalyticsEventsBridge.js +394 -0
- package/dist/Foundation/AnalyticsEventsBridge.js.map +1 -0
- package/dist/Foundation/LlamaCppBridge.d.ts +182 -0
- package/dist/Foundation/LlamaCppBridge.d.ts.map +1 -0
- package/dist/Foundation/LlamaCppBridge.js +483 -0
- package/dist/Foundation/LlamaCppBridge.js.map +1 -0
- package/dist/Foundation/LlamaCppOffsets.d.ts +32 -0
- package/dist/Foundation/LlamaCppOffsets.d.ts.map +1 -0
- package/dist/Foundation/LlamaCppOffsets.js +191 -0
- package/dist/Foundation/LlamaCppOffsets.js.map +1 -0
- package/dist/Foundation/PlatformAdapter.d.ts +109 -0
- package/dist/Foundation/PlatformAdapter.d.ts.map +1 -0
- package/dist/Foundation/PlatformAdapter.js +417 -0
- package/dist/Foundation/PlatformAdapter.js.map +1 -0
- package/dist/Foundation/TelemetryService.d.ts +96 -0
- package/dist/Foundation/TelemetryService.d.ts.map +1 -0
- package/dist/Foundation/TelemetryService.js +345 -0
- package/dist/Foundation/TelemetryService.js.map +1 -0
- package/dist/Foundation/WASMAnalyticsEmitter.d.ts +29 -0
- package/dist/Foundation/WASMAnalyticsEmitter.d.ts.map +1 -0
- package/dist/Foundation/WASMAnalyticsEmitter.js +70 -0
- package/dist/Foundation/WASMAnalyticsEmitter.js.map +1 -0
- package/dist/Infrastructure/VLMWorkerBridge.d.ts +219 -0
- package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
- package/dist/Infrastructure/VLMWorkerBridge.js +288 -0
- package/dist/Infrastructure/VLMWorkerBridge.js.map +1 -0
- package/dist/Infrastructure/VLMWorkerRuntime.d.ts +38 -0
- package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +1 -0
- package/dist/Infrastructure/VLMWorkerRuntime.js +620 -0
- package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
- package/dist/LlamaCPP.d.ts +49 -0
- package/dist/LlamaCPP.d.ts.map +1 -0
- package/dist/LlamaCPP.js +63 -0
- package/dist/LlamaCPP.js.map +1 -0
- package/dist/LlamaCppProvider.d.ts +32 -0
- package/dist/LlamaCppProvider.d.ts.map +1 -0
- package/dist/LlamaCppProvider.js +106 -0
- package/dist/LlamaCppProvider.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/workers/vlm-worker.d.ts +9 -0
- package/dist/workers/vlm-worker.d.ts.map +1 -0
- package/dist/workers/vlm-worker.js +10 -0
- package/dist/workers/vlm-worker.js.map +1 -0
- package/package.json +69 -0
- package/wasm/racommons-llamacpp-webgpu.js +159 -0
- package/wasm/racommons-llamacpp-webgpu.wasm +0 -0
- package/wasm/racommons-llamacpp.js +129 -0
- package/wasm/racommons-llamacpp.wasm +0 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - Platform Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements rac_platform_adapter_t callbacks using browser Web APIs.
|
|
5
|
+
* This is the web equivalent of:
|
|
6
|
+
* - SwiftPlatformAdapter (iOS)
|
|
7
|
+
* - KotlinPlatformAdapter (Android/JVM)
|
|
8
|
+
* - DartPlatformAdapter (Flutter)
|
|
9
|
+
*
|
|
10
|
+
* Each callback is registered as a C function pointer via Emscripten's
|
|
11
|
+
* Module.addFunction(), then written into the rac_platform_adapter_t
|
|
12
|
+
* struct in WASM memory.
|
|
13
|
+
*/
|
|
14
|
+
import { LlamaCppBridge } from './LlamaCppBridge';
|
|
15
|
+
import { SDKLogger } from '@runanywhere/web';
|
|
16
|
+
const logger = new SDKLogger('PlatformAdapter');
|
|
17
|
+
/**
|
|
18
|
+
* PlatformAdapter - Bridges browser Web APIs to RACommons C callbacks.
|
|
19
|
+
*
|
|
20
|
+
* The rac_platform_adapter_t struct is a collection of C function pointers.
|
|
21
|
+
* JavaScript provides implementations via Emscripten's addFunction(),
|
|
22
|
+
* which creates callable C function pointers from JS closures.
|
|
23
|
+
*/
|
|
24
|
+
export class PlatformAdapter {
|
|
25
|
+
callbacks = null;
|
|
26
|
+
adapterPtr = 0;
|
|
27
|
+
/**
|
|
28
|
+
* Create and register the platform adapter with RACommons.
|
|
29
|
+
* Must be called after WASM module is loaded but before rac_init().
|
|
30
|
+
*/
|
|
31
|
+
register() {
|
|
32
|
+
const bridge = LlamaCppBridge.shared;
|
|
33
|
+
const m = bridge.module;
|
|
34
|
+
logger.info('Registering platform adapter callbacks...');
|
|
35
|
+
// Allocate the rac_platform_adapter_t struct
|
|
36
|
+
const adapterSize = m._rac_wasm_sizeof_platform_adapter();
|
|
37
|
+
this.adapterPtr = m._malloc(adapterSize);
|
|
38
|
+
// Zero-initialize
|
|
39
|
+
for (let i = 0; i < adapterSize; i++) {
|
|
40
|
+
m.setValue(this.adapterPtr + i, 0, 'i8');
|
|
41
|
+
}
|
|
42
|
+
// Register each callback as a C function pointer
|
|
43
|
+
this.callbacks = {
|
|
44
|
+
fileExists: this.registerFileExists(m),
|
|
45
|
+
fileRead: this.registerFileRead(m),
|
|
46
|
+
fileWrite: this.registerFileWrite(m),
|
|
47
|
+
fileDelete: this.registerFileDelete(m),
|
|
48
|
+
secureGet: this.registerSecureGet(m),
|
|
49
|
+
secureSet: this.registerSecureSet(m),
|
|
50
|
+
secureDelete: this.registerSecureDelete(m),
|
|
51
|
+
log: this.registerLog(m),
|
|
52
|
+
nowMs: this.registerNowMs(m),
|
|
53
|
+
getMemoryInfo: this.registerGetMemoryInfo(m),
|
|
54
|
+
httpDownload: this.registerHttpDownload(m),
|
|
55
|
+
extractArchive: this.registerExtractArchive(m),
|
|
56
|
+
};
|
|
57
|
+
// Write function pointers into the struct.
|
|
58
|
+
// The struct layout matches rac_platform_adapter.h field order.
|
|
59
|
+
// Each field is a function pointer (4 bytes on wasm32).
|
|
60
|
+
const PTR_SIZE = 4;
|
|
61
|
+
let offset = 0;
|
|
62
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.fileExists, '*');
|
|
63
|
+
offset += PTR_SIZE;
|
|
64
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.fileRead, '*');
|
|
65
|
+
offset += PTR_SIZE;
|
|
66
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.fileWrite, '*');
|
|
67
|
+
offset += PTR_SIZE;
|
|
68
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.fileDelete, '*');
|
|
69
|
+
offset += PTR_SIZE;
|
|
70
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.secureGet, '*');
|
|
71
|
+
offset += PTR_SIZE;
|
|
72
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.secureSet, '*');
|
|
73
|
+
offset += PTR_SIZE;
|
|
74
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.secureDelete, '*');
|
|
75
|
+
offset += PTR_SIZE;
|
|
76
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.log, '*');
|
|
77
|
+
offset += PTR_SIZE;
|
|
78
|
+
// track_error: optional, set to 0 (null)
|
|
79
|
+
m.setValue(this.adapterPtr + offset, 0, '*');
|
|
80
|
+
offset += PTR_SIZE;
|
|
81
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.nowMs, '*');
|
|
82
|
+
offset += PTR_SIZE;
|
|
83
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.getMemoryInfo, '*');
|
|
84
|
+
offset += PTR_SIZE;
|
|
85
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.httpDownload, '*');
|
|
86
|
+
offset += PTR_SIZE;
|
|
87
|
+
// http_download_cancel: optional, set to 0 (null)
|
|
88
|
+
m.setValue(this.adapterPtr + offset, 0, '*');
|
|
89
|
+
offset += PTR_SIZE;
|
|
90
|
+
m.setValue(this.adapterPtr + offset, this.callbacks.extractArchive, '*');
|
|
91
|
+
offset += PTR_SIZE;
|
|
92
|
+
// user_data: set to 0 (null)
|
|
93
|
+
m.setValue(this.adapterPtr + offset, 0, '*');
|
|
94
|
+
// Register with RACommons
|
|
95
|
+
const result = m._rac_set_platform_adapter(this.adapterPtr);
|
|
96
|
+
if (result !== 0) {
|
|
97
|
+
logger.error(`Failed to set platform adapter: ${result}`);
|
|
98
|
+
this.cleanup();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
logger.info('Platform adapter registered successfully');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the WASM pointer to the adapter struct.
|
|
105
|
+
* Used by RunAnywhere.initialize() to populate rac_config_t.
|
|
106
|
+
*/
|
|
107
|
+
getAdapterPtr() {
|
|
108
|
+
return this.adapterPtr;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Clean up allocated callbacks and memory.
|
|
112
|
+
*/
|
|
113
|
+
cleanup() {
|
|
114
|
+
const m = LlamaCppBridge.shared.module;
|
|
115
|
+
if (this.callbacks) {
|
|
116
|
+
for (const ptr of Object.values(this.callbacks)) {
|
|
117
|
+
if (ptr !== 0) {
|
|
118
|
+
try {
|
|
119
|
+
m.removeFunction(ptr);
|
|
120
|
+
}
|
|
121
|
+
catch { /* ignore */ }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
this.callbacks = null;
|
|
125
|
+
}
|
|
126
|
+
if (this.adapterPtr !== 0) {
|
|
127
|
+
m._free(this.adapterPtr);
|
|
128
|
+
this.adapterPtr = 0;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// -----------------------------------------------------------------------
|
|
132
|
+
// Callback Implementations
|
|
133
|
+
// -----------------------------------------------------------------------
|
|
134
|
+
/** file_exists: rac_bool_t (*)(const char* path, void* user_data) */
|
|
135
|
+
registerFileExists(m) {
|
|
136
|
+
return m.addFunction((pathPtr, _userData) => {
|
|
137
|
+
try {
|
|
138
|
+
const path = m.UTF8ToString(pathPtr);
|
|
139
|
+
const result = m.FS.analyzePath(path);
|
|
140
|
+
return result.exists ? 1 : 0;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
}, 'iii');
|
|
146
|
+
}
|
|
147
|
+
/** file_read: rac_result_t (*)(const char* path, void** out_data, size_t* out_size, void* user_data) */
|
|
148
|
+
registerFileRead(m) {
|
|
149
|
+
return m.addFunction((pathPtr, outDataPtr, outSizePtr, _userData) => {
|
|
150
|
+
try {
|
|
151
|
+
const path = m.UTF8ToString(pathPtr);
|
|
152
|
+
const data = m.FS.readFile(path);
|
|
153
|
+
const wasmPtr = m._malloc(data.length);
|
|
154
|
+
LlamaCppBridge.shared.writeBytes(data, wasmPtr);
|
|
155
|
+
m.setValue(outDataPtr, wasmPtr, '*');
|
|
156
|
+
m.setValue(outSizePtr, data.length, 'i32');
|
|
157
|
+
return 0; // RAC_OK
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return -182; // RAC_ERROR_FILE_NOT_FOUND
|
|
161
|
+
}
|
|
162
|
+
}, 'iiiii');
|
|
163
|
+
}
|
|
164
|
+
/** file_write: rac_result_t (*)(const char* path, const void* data, size_t size, void* user_data) */
|
|
165
|
+
registerFileWrite(m) {
|
|
166
|
+
return m.addFunction((pathPtr, dataPtr, size, _userData) => {
|
|
167
|
+
try {
|
|
168
|
+
const path = m.UTF8ToString(pathPtr);
|
|
169
|
+
const data = LlamaCppBridge.shared.readBytes(dataPtr, size);
|
|
170
|
+
m.FS.writeFile(path, data);
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return -183; // RAC_ERROR_FILE_WRITE_FAILED
|
|
175
|
+
}
|
|
176
|
+
}, 'iiiii');
|
|
177
|
+
}
|
|
178
|
+
/** file_delete: rac_result_t (*)(const char* path, void* user_data) */
|
|
179
|
+
registerFileDelete(m) {
|
|
180
|
+
return m.addFunction((pathPtr, _userData) => {
|
|
181
|
+
try {
|
|
182
|
+
const path = m.UTF8ToString(pathPtr);
|
|
183
|
+
m.FS.unlink(path);
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return -182;
|
|
188
|
+
}
|
|
189
|
+
}, 'iii');
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* secure_get: rac_result_t (*)(const char* key, char** out_value, void* user_data)
|
|
193
|
+
*
|
|
194
|
+
* SECURITY NOTE: On web, "secure" storage uses localStorage which is NOT
|
|
195
|
+
* truly secure. Data is accessible to any script running on the same origin
|
|
196
|
+
* (including XSS attacks). Do NOT store sensitive secrets (API keys, tokens,
|
|
197
|
+
* PII) here. On native platforms (iOS/Android) the equivalent callback uses
|
|
198
|
+
* Keychain / KeyStore which are hardware-backed and encrypted.
|
|
199
|
+
*
|
|
200
|
+
* For the web platform this is intentionally best-effort: the RACommons C
|
|
201
|
+
* layer only uses it for non-sensitive SDK state (e.g. cached environment).
|
|
202
|
+
*/
|
|
203
|
+
registerSecureGet(m) {
|
|
204
|
+
return m.addFunction((keyPtr, outValuePtr, _userData) => {
|
|
205
|
+
try {
|
|
206
|
+
const key = m.UTF8ToString(keyPtr);
|
|
207
|
+
const value = localStorage.getItem(`rac_sdk_${key}`);
|
|
208
|
+
if (value === null) {
|
|
209
|
+
m.setValue(outValuePtr, 0, '*');
|
|
210
|
+
return -182;
|
|
211
|
+
}
|
|
212
|
+
const strPtr = LlamaCppBridge.shared.allocString(value);
|
|
213
|
+
m.setValue(outValuePtr, strPtr, '*');
|
|
214
|
+
return 0;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return -180;
|
|
218
|
+
}
|
|
219
|
+
}, 'iiii');
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* secure_set: rac_result_t (*)(const char* key, const char* value, void* user_data)
|
|
223
|
+
*
|
|
224
|
+
* SECURITY NOTE: See registerSecureGet — localStorage is NOT secure on web.
|
|
225
|
+
* Do not use for sensitive data.
|
|
226
|
+
*/
|
|
227
|
+
registerSecureSet(m) {
|
|
228
|
+
return m.addFunction((keyPtr, valuePtr, _userData) => {
|
|
229
|
+
try {
|
|
230
|
+
const key = m.UTF8ToString(keyPtr);
|
|
231
|
+
const value = m.UTF8ToString(valuePtr);
|
|
232
|
+
localStorage.setItem(`rac_sdk_${key}`, value);
|
|
233
|
+
return 0;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return -180;
|
|
237
|
+
}
|
|
238
|
+
}, 'iiii');
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* secure_delete: rac_result_t (*)(const char* key, void* user_data)
|
|
242
|
+
*
|
|
243
|
+
* SECURITY NOTE: See registerSecureGet — localStorage is NOT secure on web.
|
|
244
|
+
*/
|
|
245
|
+
registerSecureDelete(m) {
|
|
246
|
+
return m.addFunction((keyPtr, _userData) => {
|
|
247
|
+
try {
|
|
248
|
+
const key = m.UTF8ToString(keyPtr);
|
|
249
|
+
localStorage.removeItem(`rac_sdk_${key}`);
|
|
250
|
+
return 0;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return -180;
|
|
254
|
+
}
|
|
255
|
+
}, 'iii');
|
|
256
|
+
}
|
|
257
|
+
/** log: void (*)(rac_log_level_t level, const char* category, const char* message, void* user_data) */
|
|
258
|
+
registerLog(m) {
|
|
259
|
+
return m.addFunction((level, categoryPtr, messagePtr, _userData) => {
|
|
260
|
+
const category = m.UTF8ToString(categoryPtr);
|
|
261
|
+
const message = m.UTF8ToString(messagePtr);
|
|
262
|
+
const prefix = `[RAC:${category}]`;
|
|
263
|
+
switch (level) {
|
|
264
|
+
case 0: // TRACE
|
|
265
|
+
case 1: // DEBUG
|
|
266
|
+
console.debug(prefix, message);
|
|
267
|
+
break;
|
|
268
|
+
case 2: // INFO
|
|
269
|
+
console.info(prefix, message);
|
|
270
|
+
break;
|
|
271
|
+
case 3: // WARNING
|
|
272
|
+
console.warn(prefix, message);
|
|
273
|
+
break;
|
|
274
|
+
case 4: // ERROR
|
|
275
|
+
case 5: // FATAL
|
|
276
|
+
console.error(prefix, message);
|
|
277
|
+
break;
|
|
278
|
+
default:
|
|
279
|
+
console.log(prefix, message);
|
|
280
|
+
}
|
|
281
|
+
}, 'viiii');
|
|
282
|
+
}
|
|
283
|
+
/** now_ms: int64_t (*)(void* user_data) */
|
|
284
|
+
registerNowMs(m) {
|
|
285
|
+
// Note: Emscripten represents int64_t as two i32 values (lo, hi) in some cases.
|
|
286
|
+
// For simplicity, we use 'ii' return (returns i32 which truncates but is fine for ms).
|
|
287
|
+
return m.addFunction((_userData) => {
|
|
288
|
+
return Date.now();
|
|
289
|
+
}, 'ii');
|
|
290
|
+
}
|
|
291
|
+
/** get_memory_info: rac_result_t (*)(rac_memory_info_t* out_info, void* user_data) */
|
|
292
|
+
registerGetMemoryInfo(m) {
|
|
293
|
+
return m.addFunction((outInfoPtr, _userData) => {
|
|
294
|
+
try {
|
|
295
|
+
// rac_memory_info_t: { uint64_t total, available, used }
|
|
296
|
+
// Estimate browser memory
|
|
297
|
+
const nav = navigator;
|
|
298
|
+
const totalMB = nav.deviceMemory ?? 4; // deviceMemory API (GB)
|
|
299
|
+
const totalBytes = totalMB * 1024 * 1024 * 1024;
|
|
300
|
+
// performance.memory is Chrome-only (non-standard)
|
|
301
|
+
const perf = performance;
|
|
302
|
+
const jsHeapUsed = perf.memory?.usedJSHeapSize ?? 0;
|
|
303
|
+
const jsHeapTotal = perf.memory?.jsHeapSizeLimit ?? totalBytes;
|
|
304
|
+
// Write as uint64 (two i32 values each for wasm32)
|
|
305
|
+
// Simplified: write lower 32 bits only
|
|
306
|
+
m.setValue(outInfoPtr, jsHeapTotal & 0xFFFFFFFF, 'i32'); // total low
|
|
307
|
+
m.setValue(outInfoPtr + 4, 0, 'i32'); // total high
|
|
308
|
+
m.setValue(outInfoPtr + 8, (jsHeapTotal - jsHeapUsed) & 0xFFFFFFFF, 'i32'); // available low
|
|
309
|
+
m.setValue(outInfoPtr + 12, 0, 'i32'); // available high
|
|
310
|
+
m.setValue(outInfoPtr + 16, jsHeapUsed & 0xFFFFFFFF, 'i32'); // used low
|
|
311
|
+
m.setValue(outInfoPtr + 20, 0, 'i32'); // used high
|
|
312
|
+
return 0;
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
return -180;
|
|
316
|
+
}
|
|
317
|
+
}, 'iii');
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* http_download: rac_result_t (*)(const char* url, const char* dest_path,
|
|
321
|
+
* progress_cb, complete_cb, void* cb_user_data, char** out_task_id, void* user_data)
|
|
322
|
+
* Note: 7 params in C
|
|
323
|
+
*/
|
|
324
|
+
registerHttpDownload(m) {
|
|
325
|
+
return m.addFunction((urlPtr, destPathPtr, progressCbPtr, completeCbPtr, cbUserData, outTaskIdPtr, _userData) => {
|
|
326
|
+
const url = m.UTF8ToString(urlPtr);
|
|
327
|
+
const destPath = m.UTF8ToString(destPathPtr);
|
|
328
|
+
// Generate task ID string
|
|
329
|
+
const taskId = `dl_${Date.now()}`;
|
|
330
|
+
if (outTaskIdPtr !== 0) {
|
|
331
|
+
const strPtr = LlamaCppBridge.shared.allocString(taskId);
|
|
332
|
+
m.setValue(outTaskIdPtr, strPtr, '*');
|
|
333
|
+
}
|
|
334
|
+
// Async download via fetch
|
|
335
|
+
this.performDownload(m, url, destPath, progressCbPtr, completeCbPtr, cbUserData)
|
|
336
|
+
.catch((err) => {
|
|
337
|
+
logger.error(`Download failed: ${err}`);
|
|
338
|
+
});
|
|
339
|
+
return 0;
|
|
340
|
+
}, 'iiiiiiii');
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* extract_archive: rac_result_t (*)(const char* archive_path, const char* dest_dir,
|
|
344
|
+
* progress_cb, void* cb_user_data, void* user_data)
|
|
345
|
+
* Note: 5 params in C
|
|
346
|
+
*/
|
|
347
|
+
registerExtractArchive(m) {
|
|
348
|
+
return m.addFunction((_archivePtr, _destPtr, _progressCb, _cbUserData, _userData) => {
|
|
349
|
+
// Archive extraction not yet implemented for WASM
|
|
350
|
+
logger.warning('Archive extraction not yet implemented for WASM');
|
|
351
|
+
return -180;
|
|
352
|
+
}, 'iiiiii');
|
|
353
|
+
}
|
|
354
|
+
// -----------------------------------------------------------------------
|
|
355
|
+
// Helpers
|
|
356
|
+
// -----------------------------------------------------------------------
|
|
357
|
+
/**
|
|
358
|
+
* Perform an HTTP download using fetch() and stream to Emscripten FS.
|
|
359
|
+
*/
|
|
360
|
+
async performDownload(m, url, destPath, progressCbPtr, completeCbPtr, cbUserData) {
|
|
361
|
+
try {
|
|
362
|
+
const response = await fetch(url);
|
|
363
|
+
if (!response.ok) {
|
|
364
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
365
|
+
}
|
|
366
|
+
const contentLength = parseInt(response.headers.get('content-length') ?? '0', 10);
|
|
367
|
+
const reader = response.body?.getReader();
|
|
368
|
+
if (!reader) {
|
|
369
|
+
throw new Error('ReadableStream not supported');
|
|
370
|
+
}
|
|
371
|
+
const chunks = [];
|
|
372
|
+
let downloaded = 0;
|
|
373
|
+
while (true) {
|
|
374
|
+
const { done, value } = await reader.read();
|
|
375
|
+
if (done)
|
|
376
|
+
break;
|
|
377
|
+
chunks.push(value);
|
|
378
|
+
downloaded += value.length;
|
|
379
|
+
// Report progress via C callback
|
|
380
|
+
if (progressCbPtr !== 0) {
|
|
381
|
+
m.dynCall('viii', progressCbPtr, [downloaded, contentLength, cbUserData]);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// Combine chunks and write to Emscripten FS
|
|
385
|
+
const totalData = new Uint8Array(downloaded);
|
|
386
|
+
let offset = 0;
|
|
387
|
+
for (const chunk of chunks) {
|
|
388
|
+
totalData.set(chunk, offset);
|
|
389
|
+
offset += chunk.length;
|
|
390
|
+
}
|
|
391
|
+
// Ensure parent directory exists
|
|
392
|
+
const parentDir = destPath.substring(0, destPath.lastIndexOf('/'));
|
|
393
|
+
if (parentDir) {
|
|
394
|
+
try {
|
|
395
|
+
m.FS.mkdir(parentDir);
|
|
396
|
+
}
|
|
397
|
+
catch { /* exists */ }
|
|
398
|
+
}
|
|
399
|
+
m.FS.writeFile(destPath, totalData);
|
|
400
|
+
// Report completion via C callback
|
|
401
|
+
if (completeCbPtr !== 0) {
|
|
402
|
+
const pathPtr = LlamaCppBridge.shared.allocString(destPath);
|
|
403
|
+
m.dynCall('viii', completeCbPtr, [0, pathPtr, cbUserData]); // 0 = RAC_OK
|
|
404
|
+
m._free(pathPtr);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
catch (error) {
|
|
408
|
+
logger.error(`Download failed for ${url}: ${error}`);
|
|
409
|
+
if (completeCbPtr !== 0) {
|
|
410
|
+
const pathPtr = LlamaCppBridge.shared.allocString('');
|
|
411
|
+
m.dynCall('viii', completeCbPtr, [-160, pathPtr, cbUserData]); // RAC_ERROR_DOWNLOAD_FAILED
|
|
412
|
+
m._free(pathPtr);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=PlatformAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlatformAdapter.js","sourceRoot":"","sources":["../../src/Foundation/PlatformAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelemetryService.ts
|
|
3
|
+
*
|
|
4
|
+
* Web SDK bridge to the C++ telemetry manager (rac_telemetry_manager_*).
|
|
5
|
+
* Mirrors the role of TelemetryBridge.cpp in React Native.
|
|
6
|
+
*
|
|
7
|
+
* Architecture:
|
|
8
|
+
* - Creates rac_telemetry_manager_t via WASM
|
|
9
|
+
* - Registers an HTTP callback that C++ calls when events need sending
|
|
10
|
+
* - The HTTP callback uses HTTPService (browser fetch) to POST to the endpoint
|
|
11
|
+
* - Calls rac_telemetry_manager_http_complete() with the result
|
|
12
|
+
* - Also provides AnalyticsEventCallback for forwarding events from AnalyticsEventsBridge
|
|
13
|
+
*
|
|
14
|
+
* Device UUID:
|
|
15
|
+
* - Persisted in localStorage under 'rac_device_id'
|
|
16
|
+
* - Generated with crypto.randomUUID() on first run
|
|
17
|
+
*/
|
|
18
|
+
import { SDKEnvironment } from '@runanywhere/web';
|
|
19
|
+
import type { DeviceInfoData } from '@runanywhere/web';
|
|
20
|
+
import type { LlamaCppModule } from './LlamaCppBridge';
|
|
21
|
+
/**
|
|
22
|
+
* Returns the persistent device UUID, creating one if it doesn't exist.
|
|
23
|
+
* Uses localStorage for persistence across page loads.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getOrCreateDeviceId(): string;
|
|
26
|
+
/**
|
|
27
|
+
* Manages the lifecycle of the C++ telemetry manager and bridges HTTP calls
|
|
28
|
+
* to browser fetch for telemetry event batching and delivery.
|
|
29
|
+
*/
|
|
30
|
+
export declare class TelemetryService {
|
|
31
|
+
private static _instance;
|
|
32
|
+
static get shared(): TelemetryService;
|
|
33
|
+
private _module;
|
|
34
|
+
private _handle;
|
|
35
|
+
private _httpCallbackPtr;
|
|
36
|
+
private _initialized;
|
|
37
|
+
private _initPromise;
|
|
38
|
+
private constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Initialize the telemetry manager.
|
|
41
|
+
* Called from LlamaCppBridge._doLoad() after WASM is loaded.
|
|
42
|
+
*
|
|
43
|
+
* Concurrent calls are safe: a second caller awaits the in-flight promise
|
|
44
|
+
* rather than starting a duplicate initialization, preventing duplicate
|
|
45
|
+
* WASM handles and leaked function-table entries.
|
|
46
|
+
*/
|
|
47
|
+
initialize(module: LlamaCppModule, environment: SDKEnvironment, deviceInfo: DeviceInfoData): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Callback for AnalyticsEventsBridge — forwards raw C++ event to telemetry manager.
|
|
50
|
+
*/
|
|
51
|
+
trackAnalyticsEvent(eventType: number, dataPtr: number): void;
|
|
52
|
+
/**
|
|
53
|
+
* Flush all queued telemetry events immediately.
|
|
54
|
+
*/
|
|
55
|
+
flush(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Flush and tear down the telemetry manager.
|
|
58
|
+
*/
|
|
59
|
+
shutdown(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Core initialization logic — only called once, guarded by initialize().
|
|
62
|
+
*/
|
|
63
|
+
private _doInitialize;
|
|
64
|
+
/**
|
|
65
|
+
* Registers the HTTP callback with the WASM telemetry manager.
|
|
66
|
+
* C++ will call this when it wants to POST a telemetry batch.
|
|
67
|
+
*
|
|
68
|
+
* C signature: void(void* user_data, const char* endpoint, const char* json_body,
|
|
69
|
+
* size_t json_length, rac_bool_t requires_auth)
|
|
70
|
+
* Emscripten signature: 'viiiii'
|
|
71
|
+
*
|
|
72
|
+
* IMPORTANT: We call http_complete SYNCHRONOUSLY (before the async fetch) to
|
|
73
|
+
* prevent C++ from re-flushing the same event while awaiting the HTTP response,
|
|
74
|
+
* which caused duplicate POSTs. The actual fetch continues in the background.
|
|
75
|
+
*/
|
|
76
|
+
private registerHttpCallback;
|
|
77
|
+
/**
|
|
78
|
+
* Perform the actual HTTP POST for a telemetry batch.
|
|
79
|
+
* Returns the response JSON string on success.
|
|
80
|
+
*/
|
|
81
|
+
private performHttpPost;
|
|
82
|
+
/**
|
|
83
|
+
* Strip keys that don't exist in the V2 `telemetry_events` table.
|
|
84
|
+
* Handles both array format (dev flat batch) and single-object format.
|
|
85
|
+
*/
|
|
86
|
+
private filterForDevTable;
|
|
87
|
+
private filterObject;
|
|
88
|
+
/**
|
|
89
|
+
* If the WASM module has dev config compiled in, use it to configure HTTPService.
|
|
90
|
+
*/
|
|
91
|
+
private configureDevHTTP;
|
|
92
|
+
private mapEnvironment;
|
|
93
|
+
private allocString;
|
|
94
|
+
private freeAll;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=TelemetryService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryService.d.ts","sourceRoot":"","sources":["../../src/Foundation/TelemetryService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAa,cAAc,EAAe,MAAM,kBAAkB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAkCvD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAY5C;AAMD;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAiC;IAEzD,MAAM,KAAK,MAAM,IAAI,gBAAgB,CAKpC;IAED,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAA8B;IAElD,OAAO;IAMP;;;;;;;OAOG;IACG,UAAU,CACd,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,cAAc,EAC3B,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,IAAI,CAAC;IAmBhB;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAY7D;;OAEG;IACH,KAAK,IAAI,IAAI;IAYb;;OAEG;IACH,QAAQ,IAAI,IAAI;IAoChB;;OAEG;YACW,aAAa;IAsD3B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;;OAGG;YACW,eAAe;IAmC7B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,OAAO;CAMhB"}
|