@runanywhere/web 0.1.0-beta.7 → 0.1.0-beta.9
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 +67 -34
- package/dist/Foundation/EventBus.d.ts +13 -1
- package/dist/Foundation/EventBus.d.ts.map +1 -1
- package/dist/Foundation/EventBus.js.map +1 -1
- package/dist/Infrastructure/DeviceCapabilities.d.ts.map +1 -1
- package/dist/Infrastructure/DeviceCapabilities.js +7 -0
- package/dist/Infrastructure/DeviceCapabilities.js.map +1 -1
- package/dist/Infrastructure/ExtensionPoint.d.ts +24 -0
- package/dist/Infrastructure/ExtensionPoint.d.ts.map +1 -1
- package/dist/Infrastructure/ExtensionPoint.js +47 -0
- package/dist/Infrastructure/ExtensionPoint.js.map +1 -1
- package/dist/Infrastructure/ModelDownloader.d.ts.map +1 -1
- package/dist/Infrastructure/ModelDownloader.js +4 -0
- package/dist/Infrastructure/ModelDownloader.js.map +1 -1
- package/dist/Infrastructure/ProviderTypes.d.ts +78 -0
- package/dist/Infrastructure/ProviderTypes.d.ts.map +1 -0
- package/dist/Infrastructure/ProviderTypes.js +13 -0
- package/dist/Infrastructure/ProviderTypes.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -1
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +5 -5
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/services/AnalyticsEmitter.d.ts +53 -0
- package/dist/services/AnalyticsEmitter.d.ts.map +1 -0
- package/dist/services/AnalyticsEmitter.js +85 -0
- package/dist/services/AnalyticsEmitter.js.map +1 -0
- package/dist/services/HTTPService.d.ts +87 -0
- package/dist/services/HTTPService.d.ts.map +1 -0
- package/dist/services/HTTPService.js +255 -0
- package/dist/services/HTTPService.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed provider interfaces for cross-package communication.
|
|
3
|
+
*
|
|
4
|
+
* Backend packages (@runanywhere/web-llamacpp, @runanywhere/web-onnx) implement
|
|
5
|
+
* these interfaces and register instances via `ExtensionPoint.registerProvider()`.
|
|
6
|
+
* Core code (e.g. VoicePipeline) retrieves them at runtime via
|
|
7
|
+
* `ExtensionPoint.getProvider()` with full compile-time type safety.
|
|
8
|
+
*
|
|
9
|
+
* Replaces the previous implicit `globalThis.__runanywhere_*` contract.
|
|
10
|
+
* See: https://github.com/RunanywhereAI/runanywhere-sdks/issues/371
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=ProviderTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderTypes.js","sourceRoot":"","sources":["../../src/Infrastructure/ProviderTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunAnywhere+VoicePipeline.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VoicePipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VoicePipeline.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VoicePipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EACV,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAqC9B,qBAAa,aAAa;IACxB,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,MAAM,CAAqC;IAEnD,IAAI,KAAK,IAAI,aAAa,CAEzB;IAEK,WAAW,CACf,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE,oBAAoB,EAC9B,SAAS,CAAC,EAAE,sBAAsB,GACjC,OAAO,CAAC,uBAAuB,CAAC;IAmGnC,MAAM,IAAI,IAAI;IAQd,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -23,21 +23,21 @@
|
|
|
23
23
|
* ```
|
|
24
24
|
*/
|
|
25
25
|
import { SDKLogger } from '../../Foundation/SDKLogger';
|
|
26
|
-
import { ExtensionPoint
|
|
26
|
+
import { ExtensionPoint } from '../../Infrastructure/ExtensionPoint';
|
|
27
27
|
import { PipelineState } from './VoiceAgentTypes';
|
|
28
28
|
export { PipelineState } from './VoiceAgentTypes';
|
|
29
29
|
const logger = new SDKLogger('VoicePipeline');
|
|
30
30
|
// ---------------------------------------------------------------------------
|
|
31
|
-
// Dynamic backend access helpers (typed via ExtensionPoint
|
|
31
|
+
// Dynamic backend access helpers (typed via ExtensionPoint provider registry)
|
|
32
32
|
// ---------------------------------------------------------------------------
|
|
33
33
|
function requireSTT() {
|
|
34
|
-
return ExtensionPoint.
|
|
34
|
+
return ExtensionPoint.requireProvider('stt', '@runanywhere/web-onnx');
|
|
35
35
|
}
|
|
36
36
|
function requireTextGeneration() {
|
|
37
|
-
return ExtensionPoint.
|
|
37
|
+
return ExtensionPoint.requireProvider('llm', '@runanywhere/web-llamacpp');
|
|
38
38
|
}
|
|
39
39
|
function requireTTS() {
|
|
40
|
-
return ExtensionPoint.
|
|
40
|
+
return ExtensionPoint.requireProvider('tts', '@runanywhere/web-onnx');
|
|
41
41
|
}
|
|
42
42
|
// ---------------------------------------------------------------------------
|
|
43
43
|
// Default options
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunAnywhere+VoicePipeline.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VoicePipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VoicePipeline.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VoicePipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -42,9 +42,14 @@ export { ExtensionRegistry } from './Infrastructure/ExtensionRegistry';
|
|
|
42
42
|
export type { SDKExtension } from './Infrastructure/ExtensionRegistry';
|
|
43
43
|
export { ExtensionPoint, BackendCapability, ServiceKey } from './Infrastructure/ExtensionPoint';
|
|
44
44
|
export type { BackendExtension } from './Infrastructure/ExtensionPoint';
|
|
45
|
+
export type { ProviderCapability, ProviderMap, LLMProvider, STTProvider, TTSProvider, } from './Infrastructure/ProviderTypes';
|
|
45
46
|
export type { ModelLoadContext, LLMModelLoader, STTModelLoader, TTSModelLoader, VADModelLoader } from './Infrastructure/ModelLoaderTypes';
|
|
46
47
|
export { extractTarGz } from './Infrastructure/ArchiveUtility';
|
|
47
48
|
export { LocalFileStorage } from './Infrastructure/LocalFileStorage';
|
|
48
49
|
export { inferModelFromFilename, sanitizeId } from './Infrastructure/ModelFileInference';
|
|
49
50
|
export type { InferredModelMeta } from './Infrastructure/ModelFileInference';
|
|
51
|
+
export { HTTPService } from './services/HTTPService';
|
|
52
|
+
export type { HTTPServiceConfig, DevModeConfig } from './services/HTTPService';
|
|
53
|
+
export { AnalyticsEmitter } from './services/AnalyticsEmitter';
|
|
54
|
+
export type { AnalyticsEmitterBackend } from './services/AnalyticsEmitter';
|
|
50
55
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC1G,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAClJ,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAC9E,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAGpI,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,6BAA6B,EAC7B,iCAAiC,EACjC,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,YAAY,EACV,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAC/C,mBAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAC5D,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAChG,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC1I,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACzF,YAAY,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC1G,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAClJ,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAC9E,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAGpI,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,6BAA6B,EAC7B,iCAAiC,EACjC,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,YAAY,EACV,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAC/C,mBAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAC5D,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAChG,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,GACZ,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC1I,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACzF,YAAY,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAG7E,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -39,4 +39,7 @@ export { ExtensionPoint, BackendCapability, ServiceKey } from './Infrastructure/
|
|
|
39
39
|
export { extractTarGz } from './Infrastructure/ArchiveUtility';
|
|
40
40
|
export { LocalFileStorage } from './Infrastructure/LocalFileStorage';
|
|
41
41
|
export { inferModelFromFilename, sanitizeId } from './Infrastructure/ModelFileInference';
|
|
42
|
+
// Services
|
|
43
|
+
export { HTTPService } from './services/HTTPService';
|
|
44
|
+
export { AnalyticsEmitter } from './services/AnalyticsEmitter';
|
|
42
45
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,mBAAmB;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,gEAAgE;AAChE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAE1G,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAG9E,QAAQ;AACR,cAAc,SAAS,CAAC;AAExB,aAAa;AACb,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAoBjD,iBAAiB;AACjB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAM7D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,mBAAmB;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,gEAAgE;AAChE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAE1G,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAG9E,QAAQ;AACR,cAAc,SAAS,CAAC;AAExB,aAAa;AACb,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAoBjD,iBAAiB;AACjB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAM7D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAUhG,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAGzF,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnalyticsEmitter — abstract telemetry emission interface.
|
|
3
|
+
*
|
|
4
|
+
* Backend-agnostic: the core package defines the interface, while the
|
|
5
|
+
* llamacpp package provides the concrete WASM-backed implementation.
|
|
6
|
+
* This mirrors the iOS architecture where all analytics events flow
|
|
7
|
+
* through the C++ telemetry manager (rac_analytics_event_emit →
|
|
8
|
+
* rac_telemetry_manager → HTTP callback).
|
|
9
|
+
*
|
|
10
|
+
* If no backend is registered, calls are silently dropped.
|
|
11
|
+
*/
|
|
12
|
+
export interface AnalyticsEmitterBackend {
|
|
13
|
+
emitSTTModelLoadCompleted(modelId: string, modelName: string, durationMs: number, framework: number): void;
|
|
14
|
+
emitSTTModelLoadFailed(modelId: string, errorCode: number, errorMessage: string): void;
|
|
15
|
+
emitSTTTranscriptionCompleted(transcriptionId: string, modelId: string, text: string, confidence: number, durationMs: number, audioLengthMs: number, audioSizeBytes: number, wordCount: number, realTimeFactor: number, language: string, sampleRate: number, framework: number): void;
|
|
16
|
+
emitSTTTranscriptionFailed(transcriptionId: string, modelId: string, errorCode: number, errorMessage: string): void;
|
|
17
|
+
emitTTSVoiceLoadCompleted(modelId: string, modelName: string, durationMs: number, framework: number): void;
|
|
18
|
+
emitTTSVoiceLoadFailed(modelId: string, errorCode: number, errorMessage: string): void;
|
|
19
|
+
emitTTSSynthesisCompleted(synthesisId: string, modelId: string, characterCount: number, audioDurationMs: number, audioSizeBytes: number, processingDurationMs: number, charactersPerSecond: number, sampleRate: number, framework: number): void;
|
|
20
|
+
emitTTSSynthesisFailed(synthesisId: string, modelId: string, errorCode: number, errorMessage: string): void;
|
|
21
|
+
emitVADSpeechStarted(): void;
|
|
22
|
+
emitVADSpeechEnded(speechDurationMs: number, energyLevel: number): void;
|
|
23
|
+
emitModelDownloadStarted(modelId: string): void;
|
|
24
|
+
emitModelDownloadCompleted(modelId: string, fileSizeBytes: number, durationMs: number): void;
|
|
25
|
+
emitModelDownloadFailed(modelId: string, errorMessage: string): void;
|
|
26
|
+
}
|
|
27
|
+
declare class AnalyticsEmitterHolder {
|
|
28
|
+
private _backend;
|
|
29
|
+
/** Register the concrete backend (called once by LlamaCppProvider). */
|
|
30
|
+
registerBackend(backend: AnalyticsEmitterBackend): void;
|
|
31
|
+
/** Remove the registered backend (called during cleanup). */
|
|
32
|
+
removeBackend(): void;
|
|
33
|
+
/** Whether a backend has been registered. */
|
|
34
|
+
get hasBackend(): boolean;
|
|
35
|
+
emitSTTModelLoadCompleted(modelId: string, modelName: string, durationMs: number, framework: number): void;
|
|
36
|
+
emitSTTModelLoadFailed(modelId: string, errorCode: number, errorMessage: string): void;
|
|
37
|
+
emitSTTTranscriptionCompleted(transcriptionId: string, modelId: string, text: string, confidence: number, durationMs: number, audioLengthMs: number, audioSizeBytes: number, wordCount: number, realTimeFactor: number, language: string, sampleRate: number, framework: number): void;
|
|
38
|
+
emitSTTTranscriptionFailed(transcriptionId: string, modelId: string, errorCode: number, errorMessage: string): void;
|
|
39
|
+
emitTTSVoiceLoadCompleted(modelId: string, modelName: string, durationMs: number, framework: number): void;
|
|
40
|
+
emitTTSVoiceLoadFailed(modelId: string, errorCode: number, errorMessage: string): void;
|
|
41
|
+
emitTTSSynthesisCompleted(synthesisId: string, modelId: string, characterCount: number, audioDurationMs: number, audioSizeBytes: number, processingDurationMs: number, charactersPerSecond: number, sampleRate: number, framework: number): void;
|
|
42
|
+
emitTTSSynthesisFailed(synthesisId: string, modelId: string, errorCode: number, errorMessage: string): void;
|
|
43
|
+
emitVADSpeechStarted(): void;
|
|
44
|
+
emitVADSpeechEnded(speechDurationMs: number, energyLevel: number): void;
|
|
45
|
+
emitModelDownloadStarted(modelId: string): void;
|
|
46
|
+
emitModelDownloadCompleted(modelId: string, fileSizeBytes: number, durationMs: number): void;
|
|
47
|
+
emitModelDownloadFailed(modelId: string, errorMessage: string): void;
|
|
48
|
+
/** Swallow any error from telemetry — must never crash the host app. */
|
|
49
|
+
private safe;
|
|
50
|
+
}
|
|
51
|
+
export declare const AnalyticsEmitter: AnalyticsEmitterHolder;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=AnalyticsEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsEmitter.d.ts","sourceRoot":"","sources":["../../src/services/AnalyticsEmitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnalyticsEmitter — abstract telemetry emission interface.
|
|
3
|
+
*
|
|
4
|
+
* Backend-agnostic: the core package defines the interface, while the
|
|
5
|
+
* llamacpp package provides the concrete WASM-backed implementation.
|
|
6
|
+
* This mirrors the iOS architecture where all analytics events flow
|
|
7
|
+
* through the C++ telemetry manager (rac_analytics_event_emit →
|
|
8
|
+
* rac_telemetry_manager → HTTP callback).
|
|
9
|
+
*
|
|
10
|
+
* If no backend is registered, calls are silently dropped.
|
|
11
|
+
*/
|
|
12
|
+
import { SDKLogger } from '../Foundation/SDKLogger';
|
|
13
|
+
const logger = new SDKLogger('AnalyticsEmitter');
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Singleton holder
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
class AnalyticsEmitterHolder {
|
|
18
|
+
_backend = null;
|
|
19
|
+
/** Register the concrete backend (called once by LlamaCppProvider). */
|
|
20
|
+
registerBackend(backend) {
|
|
21
|
+
this._backend = backend;
|
|
22
|
+
logger.info('Analytics emitter backend registered');
|
|
23
|
+
}
|
|
24
|
+
/** Remove the registered backend (called during cleanup). */
|
|
25
|
+
removeBackend() {
|
|
26
|
+
this._backend = null;
|
|
27
|
+
}
|
|
28
|
+
/** Whether a backend has been registered. */
|
|
29
|
+
get hasBackend() {
|
|
30
|
+
return this._backend !== null;
|
|
31
|
+
}
|
|
32
|
+
// -- STT -----------------------------------------------------------------
|
|
33
|
+
emitSTTModelLoadCompleted(modelId, modelName, durationMs, framework) {
|
|
34
|
+
this.safe(() => this._backend?.emitSTTModelLoadCompleted(modelId, modelName, durationMs, framework));
|
|
35
|
+
}
|
|
36
|
+
emitSTTModelLoadFailed(modelId, errorCode, errorMessage) {
|
|
37
|
+
this.safe(() => this._backend?.emitSTTModelLoadFailed(modelId, errorCode, errorMessage));
|
|
38
|
+
}
|
|
39
|
+
emitSTTTranscriptionCompleted(transcriptionId, modelId, text, confidence, durationMs, audioLengthMs, audioSizeBytes, wordCount, realTimeFactor, language, sampleRate, framework) {
|
|
40
|
+
this.safe(() => this._backend?.emitSTTTranscriptionCompleted(transcriptionId, modelId, text, confidence, durationMs, audioLengthMs, audioSizeBytes, wordCount, realTimeFactor, language, sampleRate, framework));
|
|
41
|
+
}
|
|
42
|
+
emitSTTTranscriptionFailed(transcriptionId, modelId, errorCode, errorMessage) {
|
|
43
|
+
this.safe(() => this._backend?.emitSTTTranscriptionFailed(transcriptionId, modelId, errorCode, errorMessage));
|
|
44
|
+
}
|
|
45
|
+
// -- TTS -----------------------------------------------------------------
|
|
46
|
+
emitTTSVoiceLoadCompleted(modelId, modelName, durationMs, framework) {
|
|
47
|
+
this.safe(() => this._backend?.emitTTSVoiceLoadCompleted(modelId, modelName, durationMs, framework));
|
|
48
|
+
}
|
|
49
|
+
emitTTSVoiceLoadFailed(modelId, errorCode, errorMessage) {
|
|
50
|
+
this.safe(() => this._backend?.emitTTSVoiceLoadFailed(modelId, errorCode, errorMessage));
|
|
51
|
+
}
|
|
52
|
+
emitTTSSynthesisCompleted(synthesisId, modelId, characterCount, audioDurationMs, audioSizeBytes, processingDurationMs, charactersPerSecond, sampleRate, framework) {
|
|
53
|
+
this.safe(() => this._backend?.emitTTSSynthesisCompleted(synthesisId, modelId, characterCount, audioDurationMs, audioSizeBytes, processingDurationMs, charactersPerSecond, sampleRate, framework));
|
|
54
|
+
}
|
|
55
|
+
emitTTSSynthesisFailed(synthesisId, modelId, errorCode, errorMessage) {
|
|
56
|
+
this.safe(() => this._backend?.emitTTSSynthesisFailed(synthesisId, modelId, errorCode, errorMessage));
|
|
57
|
+
}
|
|
58
|
+
// -- VAD -----------------------------------------------------------------
|
|
59
|
+
emitVADSpeechStarted() {
|
|
60
|
+
this.safe(() => this._backend?.emitVADSpeechStarted());
|
|
61
|
+
}
|
|
62
|
+
emitVADSpeechEnded(speechDurationMs, energyLevel) {
|
|
63
|
+
this.safe(() => this._backend?.emitVADSpeechEnded(speechDurationMs, energyLevel));
|
|
64
|
+
}
|
|
65
|
+
// -- Download ------------------------------------------------------------
|
|
66
|
+
emitModelDownloadStarted(modelId) {
|
|
67
|
+
this.safe(() => this._backend?.emitModelDownloadStarted(modelId));
|
|
68
|
+
}
|
|
69
|
+
emitModelDownloadCompleted(modelId, fileSizeBytes, durationMs) {
|
|
70
|
+
this.safe(() => this._backend?.emitModelDownloadCompleted(modelId, fileSizeBytes, durationMs));
|
|
71
|
+
}
|
|
72
|
+
emitModelDownloadFailed(modelId, errorMessage) {
|
|
73
|
+
this.safe(() => this._backend?.emitModelDownloadFailed(modelId, errorMessage));
|
|
74
|
+
}
|
|
75
|
+
// -- Internal ------------------------------------------------------------
|
|
76
|
+
/** Swallow any error from telemetry — must never crash the host app. */
|
|
77
|
+
safe(fn) {
|
|
78
|
+
try {
|
|
79
|
+
fn();
|
|
80
|
+
}
|
|
81
|
+
catch { /* silent — telemetry must never block the app */ }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export const AnalyticsEmitter = new AnalyticsEmitterHolder();
|
|
85
|
+
//# sourceMappingURL=AnalyticsEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsEmitter.js","sourceRoot":"","sources":["../../src/services/AnalyticsEmitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTPService.ts
|
|
3
|
+
*
|
|
4
|
+
* Core HTTP service for the RunAnywhere Web SDK.
|
|
5
|
+
* Ported from sdk/runanywhere-react-native/packages/core/src/services/Network/HTTPService.ts
|
|
6
|
+
* Adapted for browser (uses native fetch, AbortController, setTimeout globals).
|
|
7
|
+
*
|
|
8
|
+
* Responsibilities:
|
|
9
|
+
* - Centralized HTTP transport layer for telemetry, device registration, etc.
|
|
10
|
+
* - Environment-aware routing (Supabase for dev, Railway for prod/staging)
|
|
11
|
+
* - Automatic header management (API key, auth tokens, SDK metadata)
|
|
12
|
+
*/
|
|
13
|
+
import { SDKEnvironment } from '../types/enums';
|
|
14
|
+
/**
|
|
15
|
+
* HTTP Service Configuration for non-dev environments.
|
|
16
|
+
*/
|
|
17
|
+
export interface HTTPServiceConfig {
|
|
18
|
+
/** Base URL for API requests */
|
|
19
|
+
baseURL: string;
|
|
20
|
+
/** API key for authentication */
|
|
21
|
+
apiKey: string;
|
|
22
|
+
/** SDK environment */
|
|
23
|
+
environment: SDKEnvironment;
|
|
24
|
+
/** Request timeout in milliseconds */
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Development (Supabase) Configuration
|
|
29
|
+
*/
|
|
30
|
+
export interface DevModeConfig {
|
|
31
|
+
/** Supabase project URL */
|
|
32
|
+
supabaseURL: string;
|
|
33
|
+
/** Supabase anon key */
|
|
34
|
+
supabaseKey: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* HTTPService - Centralized HTTP transport layer for the Web SDK.
|
|
38
|
+
*
|
|
39
|
+
* Environment-aware routing:
|
|
40
|
+
* - Development: Supabase credentials compiled into WASM (rac_dev_config_*)
|
|
41
|
+
* - Staging/Production: Railway backend with API key
|
|
42
|
+
*/
|
|
43
|
+
export declare class HTTPService {
|
|
44
|
+
private static _instance;
|
|
45
|
+
static get shared(): HTTPService;
|
|
46
|
+
private baseURL;
|
|
47
|
+
private apiKey;
|
|
48
|
+
private environment;
|
|
49
|
+
private accessToken;
|
|
50
|
+
private timeoutMs;
|
|
51
|
+
private supabaseURL;
|
|
52
|
+
private supabaseKey;
|
|
53
|
+
private constructor();
|
|
54
|
+
private get defaultHeaders();
|
|
55
|
+
/**
|
|
56
|
+
* @deprecated Use `AnalyticsEmitter` instead. All telemetry now routes
|
|
57
|
+
* through the C++ telemetry manager via `rac_analytics_emit_*()`.
|
|
58
|
+
* Kept as a fallback for edge cases where C++ is unavailable.
|
|
59
|
+
*/
|
|
60
|
+
postTelemetryEvent(partialPayload: Record<string, unknown>): void;
|
|
61
|
+
/**
|
|
62
|
+
* Returns the persistent device UUID, creating one if it doesn't exist.
|
|
63
|
+
* Mirrors getOrCreateDeviceId() in TelemetryService.ts.
|
|
64
|
+
*/
|
|
65
|
+
getOrCreateDeviceId(): string;
|
|
66
|
+
configure(config: HTTPServiceConfig): void;
|
|
67
|
+
/**
|
|
68
|
+
* Configure development mode using Supabase credentials.
|
|
69
|
+
* Called during WASM init using credentials read from rac_dev_config_*.
|
|
70
|
+
*/
|
|
71
|
+
configureDev(config: DevModeConfig): void;
|
|
72
|
+
setToken(token: string): void;
|
|
73
|
+
clearToken(): void;
|
|
74
|
+
get isConfigured(): boolean;
|
|
75
|
+
get currentBaseURL(): string;
|
|
76
|
+
post<T = unknown, R = unknown>(path: string, data?: T): Promise<R>;
|
|
77
|
+
get<R = unknown>(path: string): Promise<R>;
|
|
78
|
+
delete<R = unknown>(path: string): Promise<R>;
|
|
79
|
+
private executeRequest;
|
|
80
|
+
private buildHeaders;
|
|
81
|
+
private buildFullURL;
|
|
82
|
+
private isDeviceRegistrationPath;
|
|
83
|
+
private parseResponse;
|
|
84
|
+
private handleResponse;
|
|
85
|
+
private mapHttpError;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=HTTPService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HTTPService.d.ts","sourceRoot":"","sources":["../../src/services/HTTPService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAchD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,WAAW,EAAE,cAAc,CAAC;IAC5B,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,SAAS,CAA4B;IAEpD,MAAM,KAAK,MAAM,IAAI,WAAW,CAK/B;IAED,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAA8B;IAE/C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;IAEjC,OAAO;IAEP,OAAO,KAAK,cAAc,GAQzB;IAMD;;;;OAIG;IACH,kBAAkB,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAkBjE;;;OAGG;IACH,mBAAmB,IAAI,MAAM;IAgB7B,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAQ1C;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAOzC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,UAAU,IAAI,IAAI;IAIlB,IAAI,YAAY,IAAI,OAAO,CAK1B;IAED,IAAI,cAAc,IAAI,MAAM,CAK3B;IAMK,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAoBlE,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAO1C,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;YAWrC,cAAc;IAsB5B,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,wBAAwB;YAIlB,aAAa;YAUb,cAAc;IAsB5B,OAAO,CAAC,YAAY;CAYrB"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTPService.ts
|
|
3
|
+
*
|
|
4
|
+
* Core HTTP service for the RunAnywhere Web SDK.
|
|
5
|
+
* Ported from sdk/runanywhere-react-native/packages/core/src/services/Network/HTTPService.ts
|
|
6
|
+
* Adapted for browser (uses native fetch, AbortController, setTimeout globals).
|
|
7
|
+
*
|
|
8
|
+
* Responsibilities:
|
|
9
|
+
* - Centralized HTTP transport layer for telemetry, device registration, etc.
|
|
10
|
+
* - Environment-aware routing (Supabase for dev, Railway for prod/staging)
|
|
11
|
+
* - Automatic header management (API key, auth tokens, SDK metadata)
|
|
12
|
+
*/
|
|
13
|
+
import { SDKLogger } from '../Foundation/SDKLogger';
|
|
14
|
+
import { SDKError, SDKErrorCode } from '../Foundation/ErrorTypes';
|
|
15
|
+
import { SDKEnvironment } from '../types/enums';
|
|
16
|
+
const logger = new SDKLogger('HTTPService');
|
|
17
|
+
const SDK_CLIENT = 'RunAnywhereSDK';
|
|
18
|
+
const SDK_PLATFORM = 'web';
|
|
19
|
+
const SDK_VERSION = '0.1.0-beta.8';
|
|
20
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
21
|
+
const DEVICE_ID_KEY = 'rac_device_id';
|
|
22
|
+
const TELEMETRY_TABLE = 'rest/v1/telemetry_events';
|
|
23
|
+
/**
|
|
24
|
+
* HTTPService - Centralized HTTP transport layer for the Web SDK.
|
|
25
|
+
*
|
|
26
|
+
* Environment-aware routing:
|
|
27
|
+
* - Development: Supabase credentials compiled into WASM (rac_dev_config_*)
|
|
28
|
+
* - Staging/Production: Railway backend with API key
|
|
29
|
+
*/
|
|
30
|
+
export class HTTPService {
|
|
31
|
+
static _instance = null;
|
|
32
|
+
static get shared() {
|
|
33
|
+
if (!HTTPService._instance) {
|
|
34
|
+
HTTPService._instance = new HTTPService();
|
|
35
|
+
}
|
|
36
|
+
return HTTPService._instance;
|
|
37
|
+
}
|
|
38
|
+
baseURL = '';
|
|
39
|
+
apiKey = '';
|
|
40
|
+
environment = SDKEnvironment.Production;
|
|
41
|
+
accessToken = null;
|
|
42
|
+
timeoutMs = DEFAULT_TIMEOUT_MS;
|
|
43
|
+
supabaseURL = '';
|
|
44
|
+
supabaseKey = '';
|
|
45
|
+
constructor() { }
|
|
46
|
+
get defaultHeaders() {
|
|
47
|
+
return {
|
|
48
|
+
'Content-Type': 'application/json',
|
|
49
|
+
'Accept': 'application/json',
|
|
50
|
+
'X-SDK-Client': SDK_CLIENT,
|
|
51
|
+
'X-SDK-Version': SDK_VERSION,
|
|
52
|
+
'X-Platform': SDK_PLATFORM,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Telemetry helpers
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
/**
|
|
59
|
+
* @deprecated Use `AnalyticsEmitter` instead. All telemetry now routes
|
|
60
|
+
* through the C++ telemetry manager via `rac_analytics_emit_*()`.
|
|
61
|
+
* Kept as a fallback for edge cases where C++ is unavailable.
|
|
62
|
+
*/
|
|
63
|
+
postTelemetryEvent(partialPayload) {
|
|
64
|
+
if (!this.isConfigured)
|
|
65
|
+
return;
|
|
66
|
+
const payload = {
|
|
67
|
+
sdk_event_id: crypto.randomUUID(),
|
|
68
|
+
event_timestamp: new Date().toISOString(),
|
|
69
|
+
created_at: new Date().toISOString(),
|
|
70
|
+
device_id: this.getOrCreateDeviceId(),
|
|
71
|
+
platform: SDK_PLATFORM,
|
|
72
|
+
sdk_version: SDK_VERSION,
|
|
73
|
+
...partialPayload,
|
|
74
|
+
};
|
|
75
|
+
const url = this.buildFullURL(TELEMETRY_TABLE);
|
|
76
|
+
const headers = this.buildHeaders(false);
|
|
77
|
+
this.executeRequest('POST', url, headers, [payload]).catch(() => { });
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Returns the persistent device UUID, creating one if it doesn't exist.
|
|
81
|
+
* Mirrors getOrCreateDeviceId() in TelemetryService.ts.
|
|
82
|
+
*/
|
|
83
|
+
getOrCreateDeviceId() {
|
|
84
|
+
try {
|
|
85
|
+
const existing = localStorage.getItem(DEVICE_ID_KEY);
|
|
86
|
+
if (existing)
|
|
87
|
+
return existing;
|
|
88
|
+
const id = crypto.randomUUID();
|
|
89
|
+
localStorage.setItem(DEVICE_ID_KEY, id);
|
|
90
|
+
return id;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return crypto.randomUUID();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Configuration
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
configure(config) {
|
|
100
|
+
this.baseURL = config.baseURL;
|
|
101
|
+
this.apiKey = config.apiKey;
|
|
102
|
+
this.environment = config.environment;
|
|
103
|
+
this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
104
|
+
logger.info(`Configured for ${config.environment} environment`);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Configure development mode using Supabase credentials.
|
|
108
|
+
* Called during WASM init using credentials read from rac_dev_config_*.
|
|
109
|
+
*/
|
|
110
|
+
configureDev(config) {
|
|
111
|
+
this.supabaseURL = config.supabaseURL;
|
|
112
|
+
this.supabaseKey = config.supabaseKey;
|
|
113
|
+
this.environment = SDKEnvironment.Development;
|
|
114
|
+
logger.info('Development mode configured with Supabase');
|
|
115
|
+
}
|
|
116
|
+
setToken(token) {
|
|
117
|
+
this.accessToken = token;
|
|
118
|
+
}
|
|
119
|
+
clearToken() {
|
|
120
|
+
this.accessToken = null;
|
|
121
|
+
}
|
|
122
|
+
get isConfigured() {
|
|
123
|
+
if (this.environment === SDKEnvironment.Development) {
|
|
124
|
+
return !!this.supabaseURL;
|
|
125
|
+
}
|
|
126
|
+
return !!this.baseURL && !!this.apiKey;
|
|
127
|
+
}
|
|
128
|
+
get currentBaseURL() {
|
|
129
|
+
if (this.environment === SDKEnvironment.Development && this.supabaseURL) {
|
|
130
|
+
return this.supabaseURL;
|
|
131
|
+
}
|
|
132
|
+
return this.baseURL;
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// HTTP Methods
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
async post(path, data) {
|
|
138
|
+
let url = this.buildFullURL(path);
|
|
139
|
+
const isDeviceReg = this.isDeviceRegistrationPath(path);
|
|
140
|
+
const headers = this.buildHeaders(isDeviceReg);
|
|
141
|
+
if (isDeviceReg && this.environment === SDKEnvironment.Development) {
|
|
142
|
+
const separator = url.includes('?') ? '&' : '?';
|
|
143
|
+
url = `${url}${separator}on_conflict=device_id`;
|
|
144
|
+
}
|
|
145
|
+
const response = await this.executeRequest('POST', url, headers, data);
|
|
146
|
+
if (isDeviceReg && response.status === 409) {
|
|
147
|
+
logger.info('Device already registered (409) — treating as success');
|
|
148
|
+
return this.parseResponse(response);
|
|
149
|
+
}
|
|
150
|
+
return this.handleResponse(response, path);
|
|
151
|
+
}
|
|
152
|
+
async get(path) {
|
|
153
|
+
const url = this.buildFullURL(path);
|
|
154
|
+
const headers = this.buildHeaders(false);
|
|
155
|
+
const response = await this.executeRequest('GET', url, headers);
|
|
156
|
+
return this.handleResponse(response, path);
|
|
157
|
+
}
|
|
158
|
+
async delete(path) {
|
|
159
|
+
const url = this.buildFullURL(path);
|
|
160
|
+
const headers = this.buildHeaders(false);
|
|
161
|
+
const response = await this.executeRequest('DELETE', url, headers);
|
|
162
|
+
return this.handleResponse(response, path);
|
|
163
|
+
}
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
// Private
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
async executeRequest(method, url, headers, data) {
|
|
168
|
+
logger.debug(`${method} ${url}`);
|
|
169
|
+
const controller = new AbortController();
|
|
170
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
171
|
+
try {
|
|
172
|
+
const options = { method, headers, signal: controller.signal };
|
|
173
|
+
if (data !== undefined && method !== 'GET') {
|
|
174
|
+
options.body = JSON.stringify(data);
|
|
175
|
+
}
|
|
176
|
+
return await fetch(url, options);
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
clearTimeout(timeoutId);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
buildHeaders(isDeviceRegistration) {
|
|
183
|
+
const headers = { ...this.defaultHeaders };
|
|
184
|
+
if (this.environment === SDKEnvironment.Development) {
|
|
185
|
+
if (this.supabaseKey) {
|
|
186
|
+
headers['apikey'] = this.supabaseKey;
|
|
187
|
+
headers['Authorization'] = `Bearer ${this.supabaseKey}`;
|
|
188
|
+
headers['Prefer'] = isDeviceRegistration ? 'resolution=merge-duplicates' : 'return=representation';
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
const token = this.accessToken || this.apiKey;
|
|
193
|
+
if (token) {
|
|
194
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return headers;
|
|
198
|
+
}
|
|
199
|
+
buildFullURL(path) {
|
|
200
|
+
if (path.startsWith('http://') || path.startsWith('https://')) {
|
|
201
|
+
return path;
|
|
202
|
+
}
|
|
203
|
+
const base = this.currentBaseURL.replace(/\/$/, '');
|
|
204
|
+
const endpoint = path.startsWith('/') ? path : `/${path}`;
|
|
205
|
+
return `${base}${endpoint}`;
|
|
206
|
+
}
|
|
207
|
+
isDeviceRegistrationPath(path) {
|
|
208
|
+
return path.includes('sdk_devices') || path.includes('devices/register') || path.includes('rest/v1/sdk_devices');
|
|
209
|
+
}
|
|
210
|
+
async parseResponse(response) {
|
|
211
|
+
const text = await response.text();
|
|
212
|
+
if (!text)
|
|
213
|
+
return {};
|
|
214
|
+
try {
|
|
215
|
+
return JSON.parse(text);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return text;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async handleResponse(response, path) {
|
|
222
|
+
if (response.ok) {
|
|
223
|
+
return this.parseResponse(response);
|
|
224
|
+
}
|
|
225
|
+
let errorMessage = `HTTP ${response.status}`;
|
|
226
|
+
try {
|
|
227
|
+
const errorData = (await response.json());
|
|
228
|
+
errorMessage = errorData.message || errorData.error || errorMessage;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// ignore
|
|
232
|
+
}
|
|
233
|
+
// Telemetry failures are non-critical — log at debug level only
|
|
234
|
+
if (path.includes('telemetry')) {
|
|
235
|
+
logger.debug(`HTTP ${response.status}: ${path}`);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
logger.error(`HTTP ${response.status}: ${path}`);
|
|
239
|
+
}
|
|
240
|
+
throw this.mapHttpError(response.status, errorMessage);
|
|
241
|
+
}
|
|
242
|
+
mapHttpError(status, message) {
|
|
243
|
+
switch (status) {
|
|
244
|
+
case 401:
|
|
245
|
+
case 403:
|
|
246
|
+
return new SDKError(SDKErrorCode.AuthenticationFailed, message);
|
|
247
|
+
case 408:
|
|
248
|
+
case 429:
|
|
249
|
+
return new SDKError(SDKErrorCode.NetworkTimeout, message);
|
|
250
|
+
default:
|
|
251
|
+
return new SDKError(SDKErrorCode.NetworkError, `HTTP ${status}: ${message}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=HTTPService.js.map
|