@voltras/node-sdk 0.1.0
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/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/cjs/bluetooth/adapters/base.js +116 -0
- package/dist/cjs/bluetooth/adapters/base.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/index.js +58 -0
- package/dist/cjs/bluetooth/adapters/index.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/native.js +473 -0
- package/dist/cjs/bluetooth/adapters/native.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/node.js +228 -0
- package/dist/cjs/bluetooth/adapters/node.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/types.js +11 -0
- package/dist/cjs/bluetooth/adapters/types.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js +187 -0
- package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/web.js +112 -0
- package/dist/cjs/bluetooth/adapters/web.js.map +1 -0
- package/dist/cjs/bluetooth/controllers/scanner-controller.js +145 -0
- package/dist/cjs/bluetooth/controllers/scanner-controller.js.map +1 -0
- package/dist/cjs/bluetooth/index.js +27 -0
- package/dist/cjs/bluetooth/index.js.map +1 -0
- package/dist/cjs/bluetooth/models/connection.js +68 -0
- package/dist/cjs/bluetooth/models/connection.js.map +1 -0
- package/dist/cjs/bluetooth/models/device.js +26 -0
- package/dist/cjs/bluetooth/models/device.js.map +1 -0
- package/dist/cjs/bluetooth/models/environment.js +106 -0
- package/dist/cjs/bluetooth/models/environment.js.map +1 -0
- package/dist/cjs/errors.js +167 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +116 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/react/hooks.js +262 -0
- package/dist/cjs/react/hooks.js.map +1 -0
- package/dist/cjs/react/index.js +18 -0
- package/dist/cjs/react/index.js.map +1 -0
- package/dist/cjs/sdk/index.js +14 -0
- package/dist/cjs/sdk/index.js.map +1 -0
- package/dist/cjs/sdk/types.js +8 -0
- package/dist/cjs/sdk/types.js.map +1 -0
- package/dist/cjs/sdk/voltra-client.js +632 -0
- package/dist/cjs/sdk/voltra-client.js.map +1 -0
- package/dist/cjs/sdk/voltra-manager.js +419 -0
- package/dist/cjs/sdk/voltra-manager.js.map +1 -0
- package/dist/cjs/shared/index.js +12 -0
- package/dist/cjs/shared/index.js.map +1 -0
- package/dist/cjs/shared/utils.js +51 -0
- package/dist/cjs/shared/utils.js.map +1 -0
- package/dist/cjs/voltra/index.js +56 -0
- package/dist/cjs/voltra/index.js.map +1 -0
- package/dist/cjs/voltra/models/connection.js +68 -0
- package/dist/cjs/voltra/models/connection.js.map +1 -0
- package/dist/cjs/voltra/models/device-filter.js +28 -0
- package/dist/cjs/voltra/models/device-filter.js.map +1 -0
- package/dist/cjs/voltra/models/device.js +152 -0
- package/dist/cjs/voltra/models/device.js.map +1 -0
- package/dist/cjs/voltra/models/telemetry/frame.js +46 -0
- package/dist/cjs/voltra/models/telemetry/frame.js.map +1 -0
- package/dist/cjs/voltra/models/telemetry/index.js +14 -0
- package/dist/cjs/voltra/models/telemetry/index.js.map +1 -0
- package/dist/cjs/voltra/protocol/commands.js +230 -0
- package/dist/cjs/voltra/protocol/commands.js.map +1 -0
- package/dist/cjs/voltra/protocol/constants.js +136 -0
- package/dist/cjs/voltra/protocol/constants.js.map +1 -0
- package/dist/cjs/voltra/protocol/data/chains.json +830 -0
- package/dist/cjs/voltra/protocol/data/eccentric.json +1598 -0
- package/dist/cjs/voltra/protocol/data/protocol.json +54 -0
- package/dist/cjs/voltra/protocol/data/weights.json +62 -0
- package/dist/cjs/voltra/protocol/index.js +25 -0
- package/dist/cjs/voltra/protocol/index.js.map +1 -0
- package/dist/cjs/voltra/protocol/telemetry-decoder.js +146 -0
- package/dist/cjs/voltra/protocol/telemetry-decoder.js.map +1 -0
- package/dist/esm/bluetooth/adapters/base.js +112 -0
- package/dist/esm/bluetooth/adapters/base.js.map +1 -0
- package/dist/esm/bluetooth/adapters/index.js +51 -0
- package/dist/esm/bluetooth/adapters/index.js.map +1 -0
- package/dist/esm/bluetooth/adapters/native.js +469 -0
- package/dist/esm/bluetooth/adapters/native.js.map +1 -0
- package/dist/esm/bluetooth/adapters/node.js +191 -0
- package/dist/esm/bluetooth/adapters/node.js.map +1 -0
- package/dist/esm/bluetooth/adapters/types.js +10 -0
- package/dist/esm/bluetooth/adapters/types.js.map +1 -0
- package/dist/esm/bluetooth/adapters/web-bluetooth-base.js +183 -0
- package/dist/esm/bluetooth/adapters/web-bluetooth-base.js.map +1 -0
- package/dist/esm/bluetooth/adapters/web.js +108 -0
- package/dist/esm/bluetooth/adapters/web.js.map +1 -0
- package/dist/esm/bluetooth/controllers/scanner-controller.js +141 -0
- package/dist/esm/bluetooth/controllers/scanner-controller.js.map +1 -0
- package/dist/esm/bluetooth/index.js +17 -0
- package/dist/esm/bluetooth/index.js.map +1 -0
- package/dist/esm/bluetooth/models/connection.js +63 -0
- package/dist/esm/bluetooth/models/connection.js.map +1 -0
- package/dist/esm/bluetooth/models/device.js +22 -0
- package/dist/esm/bluetooth/models/device.js.map +1 -0
- package/dist/esm/bluetooth/models/environment.js +101 -0
- package/dist/esm/bluetooth/models/environment.js.map +1 -0
- package/dist/esm/errors.js +155 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +72 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/react/hooks.js +257 -0
- package/dist/esm/react/hooks.js.map +1 -0
- package/dist/esm/react/index.js +12 -0
- package/dist/esm/react/index.js.map +1 -0
- package/dist/esm/sdk/index.js +9 -0
- package/dist/esm/sdk/index.js.map +1 -0
- package/dist/esm/sdk/types.js +7 -0
- package/dist/esm/sdk/types.js.map +1 -0
- package/dist/esm/sdk/voltra-client.js +628 -0
- package/dist/esm/sdk/voltra-client.js.map +1 -0
- package/dist/esm/sdk/voltra-manager.js +415 -0
- package/dist/esm/sdk/voltra-manager.js.map +1 -0
- package/dist/esm/shared/index.js +5 -0
- package/dist/esm/shared/index.js.map +1 -0
- package/dist/esm/shared/utils.js +45 -0
- package/dist/esm/shared/utils.js.map +1 -0
- package/dist/esm/voltra/index.js +26 -0
- package/dist/esm/voltra/index.js.map +1 -0
- package/dist/esm/voltra/models/connection.js +63 -0
- package/dist/esm/voltra/models/connection.js.map +1 -0
- package/dist/esm/voltra/models/device-filter.js +23 -0
- package/dist/esm/voltra/models/device-filter.js.map +1 -0
- package/dist/esm/voltra/models/device.js +148 -0
- package/dist/esm/voltra/models/device.js.map +1 -0
- package/dist/esm/voltra/models/telemetry/frame.js +40 -0
- package/dist/esm/voltra/models/telemetry/frame.js.map +1 -0
- package/dist/esm/voltra/models/telemetry/index.js +7 -0
- package/dist/esm/voltra/models/telemetry/index.js.map +1 -0
- package/dist/esm/voltra/protocol/commands.js +224 -0
- package/dist/esm/voltra/protocol/commands.js.map +1 -0
- package/dist/esm/voltra/protocol/constants.js +130 -0
- package/dist/esm/voltra/protocol/constants.js.map +1 -0
- package/dist/esm/voltra/protocol/data/chains.json +830 -0
- package/dist/esm/voltra/protocol/data/eccentric.json +1598 -0
- package/dist/esm/voltra/protocol/data/protocol.json +54 -0
- package/dist/esm/voltra/protocol/data/weights.json +62 -0
- package/dist/esm/voltra/protocol/index.js +9 -0
- package/dist/esm/voltra/protocol/index.js.map +1 -0
- package/dist/esm/voltra/protocol/telemetry-decoder.js +140 -0
- package/dist/esm/voltra/protocol/telemetry-decoder.js.map +1 -0
- package/dist/types/bluetooth/adapters/base.d.ts +85 -0
- package/dist/types/bluetooth/adapters/base.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/index.d.ts +35 -0
- package/dist/types/bluetooth/adapters/index.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/native.d.ts +109 -0
- package/dist/types/bluetooth/adapters/native.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/node.d.ts +91 -0
- package/dist/types/bluetooth/adapters/node.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/types.d.ts +102 -0
- package/dist/types/bluetooth/adapters/types.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts +90 -0
- package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/web.d.ts +57 -0
- package/dist/types/bluetooth/adapters/web.d.ts.map +1 -0
- package/dist/types/bluetooth/controllers/scanner-controller.d.ts +93 -0
- package/dist/types/bluetooth/controllers/scanner-controller.d.ts.map +1 -0
- package/dist/types/bluetooth/index.d.ts +14 -0
- package/dist/types/bluetooth/index.d.ts.map +1 -0
- package/dist/types/bluetooth/models/connection.d.ts +37 -0
- package/dist/types/bluetooth/models/connection.d.ts.map +1 -0
- package/dist/types/bluetooth/models/device.d.ts +25 -0
- package/dist/types/bluetooth/models/device.d.ts.map +1 -0
- package/dist/types/bluetooth/models/environment.d.ts +45 -0
- package/dist/types/bluetooth/models/environment.d.ts.map +1 -0
- package/dist/types/errors.d.ts +113 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/react/hooks.d.ts +130 -0
- package/dist/types/react/hooks.d.ts.map +1 -0
- package/dist/types/react/index.d.ts +12 -0
- package/dist/types/react/index.d.ts.map +1 -0
- package/dist/types/sdk/index.d.ts +11 -0
- package/dist/types/sdk/index.d.ts.map +1 -0
- package/dist/types/sdk/types.d.ts +104 -0
- package/dist/types/sdk/types.d.ts.map +1 -0
- package/dist/types/sdk/voltra-client.d.ts +221 -0
- package/dist/types/sdk/voltra-client.d.ts.map +1 -0
- package/dist/types/sdk/voltra-manager.d.ts +226 -0
- package/dist/types/sdk/voltra-manager.d.ts.map +1 -0
- package/dist/types/shared/index.d.ts +5 -0
- package/dist/types/shared/index.d.ts.map +1 -0
- package/dist/types/shared/utils.d.ts +25 -0
- package/dist/types/shared/utils.d.ts.map +1 -0
- package/dist/types/voltra/index.d.ts +13 -0
- package/dist/types/voltra/index.d.ts.map +1 -0
- package/dist/types/voltra/models/connection.d.ts +37 -0
- package/dist/types/voltra/models/connection.d.ts.map +1 -0
- package/dist/types/voltra/models/device-filter.d.ts +19 -0
- package/dist/types/voltra/models/device-filter.d.ts.map +1 -0
- package/dist/types/voltra/models/device.d.ts +105 -0
- package/dist/types/voltra/models/device.d.ts.map +1 -0
- package/dist/types/voltra/models/telemetry/frame.d.ts +41 -0
- package/dist/types/voltra/models/telemetry/frame.d.ts.map +1 -0
- package/dist/types/voltra/models/telemetry/index.d.ts +8 -0
- package/dist/types/voltra/models/telemetry/index.d.ts.map +1 -0
- package/dist/types/voltra/protocol/commands.d.ts +99 -0
- package/dist/types/voltra/protocol/commands.d.ts.map +1 -0
- package/dist/types/voltra/protocol/constants.d.ts +103 -0
- package/dist/types/voltra/protocol/constants.d.ts.map +1 -0
- package/dist/types/voltra/protocol/index.d.ts +9 -0
- package/dist/types/voltra/protocol/index.d.ts.map +1 -0
- package/dist/types/voltra/protocol/telemetry-decoder.d.ts +45 -0
- package/dist/types/voltra/protocol/telemetry-decoder.d.ts.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scanner Controller
|
|
4
|
+
*
|
|
5
|
+
* Manages BLE device scanning with auto-scan functionality.
|
|
6
|
+
* This is a generic controller that can be configured with a device filter.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ScannerController = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Controller for BLE device scanning.
|
|
12
|
+
*/
|
|
13
|
+
class ScannerController {
|
|
14
|
+
constructor(adapter, _environment, config, deviceFilter) {
|
|
15
|
+
this.adapter = adapter;
|
|
16
|
+
this._environment = _environment;
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.deviceFilter = deviceFilter;
|
|
19
|
+
this._isScanning = false;
|
|
20
|
+
this._discoveredDevices = [];
|
|
21
|
+
this._lastScanTime = 0;
|
|
22
|
+
this._error = null;
|
|
23
|
+
this._autoScanInterval = null;
|
|
24
|
+
this._listeners = new Set();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get current scanner state.
|
|
28
|
+
*/
|
|
29
|
+
getState() {
|
|
30
|
+
return {
|
|
31
|
+
isScanning: this._isScanning,
|
|
32
|
+
discoveredDevices: this._discoveredDevices,
|
|
33
|
+
lastScanTime: this._lastScanTime,
|
|
34
|
+
error: this._error,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Subscribe to scanner events.
|
|
39
|
+
*/
|
|
40
|
+
subscribe(listener) {
|
|
41
|
+
this._listeners.add(listener);
|
|
42
|
+
return () => this._listeners.delete(listener);
|
|
43
|
+
}
|
|
44
|
+
emit(event) {
|
|
45
|
+
this._listeners.forEach((listener) => listener(event));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Scan for devices.
|
|
49
|
+
*/
|
|
50
|
+
async scan() {
|
|
51
|
+
// Don't scan if already scanning
|
|
52
|
+
if (this._isScanning) {
|
|
53
|
+
return this._discoveredDevices;
|
|
54
|
+
}
|
|
55
|
+
this._isScanning = true;
|
|
56
|
+
this._error = null;
|
|
57
|
+
this.emit({ type: 'scanStarted' });
|
|
58
|
+
try {
|
|
59
|
+
const devices = await this.adapter.scan(this.config.scanDurationMs / 1000);
|
|
60
|
+
// Apply device filter if provided, otherwise return all devices
|
|
61
|
+
const filteredDevices = this.deviceFilter
|
|
62
|
+
? this.deviceFilter(devices)
|
|
63
|
+
: devices;
|
|
64
|
+
this._discoveredDevices = filteredDevices;
|
|
65
|
+
this._lastScanTime = Date.now();
|
|
66
|
+
this._isScanning = false;
|
|
67
|
+
this.emit({ type: 'scanCompleted', devices: filteredDevices });
|
|
68
|
+
return filteredDevices;
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
this._isScanning = false;
|
|
72
|
+
const errorMsg = e instanceof Error ? e.message : String(e);
|
|
73
|
+
// User cancelled device picker (web) - not an error
|
|
74
|
+
if (errorMsg.includes('NotFoundError')) {
|
|
75
|
+
this._error = null;
|
|
76
|
+
this.emit({ type: 'scanCompleted', devices: [] });
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
// On web, "permission" errors are expected when scan is called without user gesture
|
|
80
|
+
// Don't show these as errors - user just needs to click the scan button
|
|
81
|
+
if (this._environment.requiresUserGesture && errorMsg.includes('permission')) {
|
|
82
|
+
this._error = null;
|
|
83
|
+
this.emit({ type: 'scanCompleted', devices: [] });
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
// Categorize errors
|
|
87
|
+
if (errorMsg.includes('permission') || errorMsg.includes('Unauthorized')) {
|
|
88
|
+
this._error = 'Bluetooth permission required. Please enable in Settings.';
|
|
89
|
+
}
|
|
90
|
+
else if (errorMsg.includes('Timeout') || errorMsg.includes('PoweredOff')) {
|
|
91
|
+
this._error = 'Please enable Bluetooth on your device.';
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this._error = `Scan failed: ${errorMsg}`;
|
|
95
|
+
}
|
|
96
|
+
this.emit({ type: 'scanFailed', error: this._error ?? 'Unknown error' });
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Start auto-scanning.
|
|
102
|
+
* Returns cleanup function.
|
|
103
|
+
*/
|
|
104
|
+
startAutoScan(isConnected) {
|
|
105
|
+
// Clear existing intervals
|
|
106
|
+
this.stopAutoScan();
|
|
107
|
+
// Initial scan after short delay
|
|
108
|
+
setTimeout(() => {
|
|
109
|
+
if (!isConnected()) {
|
|
110
|
+
this.scan();
|
|
111
|
+
}
|
|
112
|
+
}, 500);
|
|
113
|
+
// Periodic auto-scan when not connected
|
|
114
|
+
this._autoScanInterval = setInterval(() => {
|
|
115
|
+
if (!this._isScanning && !isConnected()) {
|
|
116
|
+
this.scan();
|
|
117
|
+
}
|
|
118
|
+
}, this.config.scanIntervalMs);
|
|
119
|
+
return () => this.stopAutoScan();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Stop auto-scanning.
|
|
123
|
+
*/
|
|
124
|
+
stopAutoScan() {
|
|
125
|
+
if (this._autoScanInterval) {
|
|
126
|
+
clearInterval(this._autoScanInterval);
|
|
127
|
+
this._autoScanInterval = null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Clear error state.
|
|
132
|
+
*/
|
|
133
|
+
clearError() {
|
|
134
|
+
this._error = null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Cleanup resources.
|
|
138
|
+
*/
|
|
139
|
+
dispose() {
|
|
140
|
+
this.stopAutoScan();
|
|
141
|
+
this._listeners.clear();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.ScannerController = ScannerController;
|
|
145
|
+
//# sourceMappingURL=scanner-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner-controller.js","sourceRoot":"","sources":["../../../../src/bluetooth/controllers/scanner-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bluetooth Domain
|
|
4
|
+
*
|
|
5
|
+
* Generic BLE connection management, device scanning, and environment detection.
|
|
6
|
+
* This domain provides reusable BLE infrastructure that can be configured
|
|
7
|
+
* for any BLE device.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createBLEAdapter = exports.NativeBLEAdapter = exports.NodeBLEAdapter = exports.WebBLEAdapter = exports.createNativeEnvironmentInfo = exports.isBLEAvailable = exports.detectBLEEnvironment = exports.sortBySignalStrength = exports.getDeviceDisplayName = void 0;
|
|
11
|
+
var device_1 = require("./models/device");
|
|
12
|
+
Object.defineProperty(exports, "getDeviceDisplayName", { enumerable: true, get: function () { return device_1.getDeviceDisplayName; } });
|
|
13
|
+
Object.defineProperty(exports, "sortBySignalStrength", { enumerable: true, get: function () { return device_1.sortBySignalStrength; } });
|
|
14
|
+
var environment_1 = require("./models/environment");
|
|
15
|
+
Object.defineProperty(exports, "detectBLEEnvironment", { enumerable: true, get: function () { return environment_1.detectBLEEnvironment; } });
|
|
16
|
+
Object.defineProperty(exports, "isBLEAvailable", { enumerable: true, get: function () { return environment_1.isBLEAvailable; } });
|
|
17
|
+
Object.defineProperty(exports, "createNativeEnvironmentInfo", { enumerable: true, get: function () { return environment_1.createNativeEnvironmentInfo; } });
|
|
18
|
+
// Adapters
|
|
19
|
+
var adapters_1 = require("./adapters");
|
|
20
|
+
// Adapters
|
|
21
|
+
Object.defineProperty(exports, "WebBLEAdapter", { enumerable: true, get: function () { return adapters_1.WebBLEAdapter; } });
|
|
22
|
+
Object.defineProperty(exports, "NodeBLEAdapter", { enumerable: true, get: function () { return adapters_1.NodeBLEAdapter; } });
|
|
23
|
+
Object.defineProperty(exports, "NativeBLEAdapter", { enumerable: true, get: function () { return adapters_1.NativeBLEAdapter; } });
|
|
24
|
+
// Factory
|
|
25
|
+
Object.defineProperty(exports, "createBLEAdapter", { enumerable: true, get: function () { return adapters_1.createBLEAdapter; } });
|
|
26
|
+
// Note: ScannerController is internal - use VoltraClient/VoltraManager for scanning
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bluetooth/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAIH,0CAA6E;AAApE,8GAAA,oBAAoB,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAOnD,oDAAyG;AAAhG,mHAAA,oBAAoB,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,0HAAA,2BAA2B,OAAA;AAE1E,WAAW;AACX,uCAeoB;AAPlB,WAAW;AACX,yGAAA,aAAa,OAAA;AACb,0GAAA,cAAc,OAAA;AACd,4GAAA,gBAAgB,OAAA;AAChB,UAAU;AACV,4GAAA,gBAAgB,OAAA;AAIlB,oFAAoF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bluetooth Connection Model
|
|
4
|
+
*
|
|
5
|
+
* Represents generic BLE connection state and transitions.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.BLEConnectionStateModel = void 0;
|
|
9
|
+
exports.isValidBLETransition = isValidBLETransition;
|
|
10
|
+
/**
|
|
11
|
+
* Valid state transitions for BLE connection.
|
|
12
|
+
*/
|
|
13
|
+
const VALID_BLE_TRANSITIONS = {
|
|
14
|
+
disconnected: ['connecting'],
|
|
15
|
+
connecting: ['connected', 'disconnected'],
|
|
16
|
+
connected: ['disconnecting', 'disconnected'],
|
|
17
|
+
disconnecting: ['disconnected'],
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Check if a BLE state transition is valid.
|
|
21
|
+
*/
|
|
22
|
+
function isValidBLETransition(from, to) {
|
|
23
|
+
return VALID_BLE_TRANSITIONS[from].includes(to);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generic BLE connection state model with validation.
|
|
27
|
+
*/
|
|
28
|
+
class BLEConnectionStateModel {
|
|
29
|
+
constructor() {
|
|
30
|
+
this._state = 'disconnected';
|
|
31
|
+
}
|
|
32
|
+
get state() {
|
|
33
|
+
return this._state;
|
|
34
|
+
}
|
|
35
|
+
get isConnected() {
|
|
36
|
+
return this._state === 'connected';
|
|
37
|
+
}
|
|
38
|
+
get isConnecting() {
|
|
39
|
+
return this._state === 'connecting';
|
|
40
|
+
}
|
|
41
|
+
get isDisconnected() {
|
|
42
|
+
return this._state === 'disconnected';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Transition to a new state.
|
|
46
|
+
* @throws Error if transition is invalid
|
|
47
|
+
*/
|
|
48
|
+
transitionTo(newState) {
|
|
49
|
+
if (!isValidBLETransition(this._state, newState)) {
|
|
50
|
+
throw new Error(`Invalid connection state transition: ${this._state} -> ${newState}`);
|
|
51
|
+
}
|
|
52
|
+
this._state = newState;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Force set state (for reconnection scenarios).
|
|
56
|
+
*/
|
|
57
|
+
forceState(state) {
|
|
58
|
+
this._state = state;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Reset to disconnected state.
|
|
62
|
+
*/
|
|
63
|
+
reset() {
|
|
64
|
+
this._state = 'disconnected';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.BLEConnectionStateModel = BLEConnectionStateModel;
|
|
68
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../src/bluetooth/models/connection.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAoBH,oDAEC;AAfD;;GAEG;AACH,MAAM,qBAAqB,GAAqD;IAC9E,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,UAAU,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IACzC,SAAS,EAAE,CAAC,eAAe,EAAE,cAAc,CAAC;IAC5C,aAAa,EAAE,CAAC,cAAc,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,SAAgB,oBAAoB,CAAC,IAAwB,EAAE,EAAsB;IACnF,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAa,uBAAuB;IAApC;QACU,WAAM,GAAuB,cAAc,CAAC;IA0CtD,CAAC;IAxCC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;IACrC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC;IACtC,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,QAA4B;QACvC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,MAAM,OAAO,QAAQ,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAyB;QAClC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;IAC/B,CAAC;CACF;AA3CD,0DA2CC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bluetooth Device Model
|
|
4
|
+
*
|
|
5
|
+
* Represents a discovered BLE device from scanning.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.getDeviceDisplayName = getDeviceDisplayName;
|
|
9
|
+
exports.sortBySignalStrength = sortBySignalStrength;
|
|
10
|
+
/**
|
|
11
|
+
* Get display name for a device.
|
|
12
|
+
*/
|
|
13
|
+
function getDeviceDisplayName(device) {
|
|
14
|
+
return device.name ?? `Device ${device.id.slice(0, 8)}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Sort devices by signal strength (strongest first).
|
|
18
|
+
*/
|
|
19
|
+
function sortBySignalStrength(devices) {
|
|
20
|
+
return [...devices].sort((a, b) => {
|
|
21
|
+
const rssiA = a.rssi ?? -100;
|
|
22
|
+
const rssiB = b.rssi ?? -100;
|
|
23
|
+
return rssiB - rssiA; // Higher (less negative) is better
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../src/bluetooth/models/device.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAiBH,oDAEC;AAKD,oDAMC;AAhBD;;GAEG;AACH,SAAgB,oBAAoB,CAAC,MAAwB;IAC3D,OAAO,MAAM,CAAC,IAAI,IAAI,UAAU,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,OAA2B;IAC9D,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;QAC7B,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,mCAAmC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bluetooth Environment Model
|
|
4
|
+
*
|
|
5
|
+
* Detects the current environment and BLE capabilities.
|
|
6
|
+
* This is a simplified version for the SDK that doesn't depend on Expo.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.detectBLEEnvironment = detectBLEEnvironment;
|
|
10
|
+
exports.isBLEAvailable = isBLEAvailable;
|
|
11
|
+
exports.createNativeEnvironmentInfo = createNativeEnvironmentInfo;
|
|
12
|
+
/**
|
|
13
|
+
* Warning messages for unsupported environments.
|
|
14
|
+
*/
|
|
15
|
+
const WARNING_MESSAGES = {
|
|
16
|
+
'expo-go': 'Bluetooth is not available in Expo Go. Run "npx expo run:ios --device" to build with native BLE support.',
|
|
17
|
+
simulator: 'Bluetooth is not available in the simulator. Connect a physical device to test BLE.',
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Check if running in a browser environment.
|
|
21
|
+
*/
|
|
22
|
+
function isBrowserEnvironment() {
|
|
23
|
+
return (typeof window !== 'undefined' &&
|
|
24
|
+
typeof document !== 'undefined' &&
|
|
25
|
+
typeof navigator !== 'undefined');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if running in Node.js environment.
|
|
29
|
+
*/
|
|
30
|
+
function isNodeEnvironment() {
|
|
31
|
+
return (typeof process !== 'undefined' && process.versions != null && process.versions.node != null);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Detect the current BLE environment.
|
|
35
|
+
*
|
|
36
|
+
* This is a simplified version that works without React Native/Expo dependencies.
|
|
37
|
+
* For full environment detection in React Native apps, use the app's environment detection.
|
|
38
|
+
*/
|
|
39
|
+
function detectBLEEnvironment() {
|
|
40
|
+
// Check for browser environment first
|
|
41
|
+
if (isBrowserEnvironment()) {
|
|
42
|
+
return {
|
|
43
|
+
environment: 'web',
|
|
44
|
+
bleSupported: true, // Via Web Bluetooth API
|
|
45
|
+
warningMessage: null,
|
|
46
|
+
isWeb: true,
|
|
47
|
+
requiresUserGesture: true, // Web Bluetooth requires user gesture for requestDevice()
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Check for Node.js environment
|
|
51
|
+
if (isNodeEnvironment()) {
|
|
52
|
+
return {
|
|
53
|
+
environment: 'node',
|
|
54
|
+
bleSupported: true, // Via webbluetooth npm package
|
|
55
|
+
warningMessage: null,
|
|
56
|
+
isWeb: false,
|
|
57
|
+
requiresUserGesture: false,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Default to native (React Native apps should use their own environment detection)
|
|
61
|
+
return {
|
|
62
|
+
environment: 'native',
|
|
63
|
+
bleSupported: true,
|
|
64
|
+
warningMessage: null,
|
|
65
|
+
isWeb: false,
|
|
66
|
+
requiresUserGesture: false,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if BLE is available in the current environment.
|
|
71
|
+
*/
|
|
72
|
+
function isBLEAvailable(env) {
|
|
73
|
+
return env.bleSupported;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create environment info for native React Native apps.
|
|
77
|
+
* Call this from your app with the detected environment.
|
|
78
|
+
*/
|
|
79
|
+
function createNativeEnvironmentInfo(options) {
|
|
80
|
+
if (options.isExpoGo) {
|
|
81
|
+
return {
|
|
82
|
+
environment: 'expo-go',
|
|
83
|
+
bleSupported: false,
|
|
84
|
+
warningMessage: WARNING_MESSAGES['expo-go'],
|
|
85
|
+
isWeb: false,
|
|
86
|
+
requiresUserGesture: false,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (options.isSimulator) {
|
|
90
|
+
return {
|
|
91
|
+
environment: 'simulator',
|
|
92
|
+
bleSupported: false,
|
|
93
|
+
warningMessage: WARNING_MESSAGES['simulator'],
|
|
94
|
+
isWeb: false,
|
|
95
|
+
requiresUserGesture: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
environment: 'native',
|
|
100
|
+
bleSupported: true,
|
|
101
|
+
warningMessage: null,
|
|
102
|
+
isWeb: false,
|
|
103
|
+
requiresUserGesture: false,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../src/bluetooth/models/environment.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA+DH,oDA+BC;AAKD,wCAEC;AAMD,kEA+BC;AA9GD;;GAEG;AACH,MAAM,gBAAgB,GAA4C;IAChE,SAAS,EACP,0GAA0G;IAC5G,SAAS,EAAE,qFAAqF;CACjG,CAAC;AAEF;;GAEG;AACH,SAAS,oBAAoB;IAC3B,OAAO,CACL,OAAO,MAAM,KAAK,WAAW;QAC7B,OAAO,QAAQ,KAAK,WAAW;QAC/B,OAAO,SAAS,KAAK,WAAW,CACjC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,OAAO,CACL,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAC5F,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB;IAClC,sCAAsC;IACtC,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC3B,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,IAAI,EAAE,wBAAwB;YAC5C,cAAc,EAAE,IAAI;YACpB,KAAK,EAAE,IAAI;YACX,mBAAmB,EAAE,IAAI,EAAE,0DAA0D;SACtF,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,IAAI,EAAE,+BAA+B;YACnD,cAAc,EAAE,IAAI;YACpB,KAAK,EAAE,KAAK;YACZ,mBAAmB,EAAE,KAAK;SAC3B,CAAC;IACJ,CAAC;IAED,mFAAmF;IACnF,OAAO;QACL,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,KAAK;QACZ,mBAAmB,EAAE,KAAK;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,GAAuB;IACpD,OAAO,GAAG,CAAC,YAAY,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAgB,2BAA2B,CAAC,OAG3C;IACC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO;YACL,WAAW,EAAE,SAAS;YACtB,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,gBAAgB,CAAC,SAAS,CAAE;YAC5C,KAAK,EAAE,KAAK;YACZ,mBAAmB,EAAE,KAAK;SAC3B,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO;YACL,WAAW,EAAE,WAAW;YACxB,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,gBAAgB,CAAC,WAAW,CAAE;YAC9C,KAAK,EAAE,KAAK;YACZ,mBAAmB,EAAE,KAAK;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,KAAK;QACZ,mBAAmB,EAAE,KAAK;KAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Custom SDK Error Types
|
|
4
|
+
*
|
|
5
|
+
* Provides typed errors for better error handling and developer experience.
|
|
6
|
+
* All SDK errors extend VoltraSDKError for easy catch-all handling.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* try {
|
|
11
|
+
* await client.connect();
|
|
12
|
+
* } catch (error) {
|
|
13
|
+
* if (error instanceof ConnectionError) {
|
|
14
|
+
* console.log('Connection failed:', error.code);
|
|
15
|
+
* } else if (error instanceof AuthenticationError) {
|
|
16
|
+
* console.log('Auth failed - device may need reset');
|
|
17
|
+
* } else if (error instanceof VoltraSDKError) {
|
|
18
|
+
* console.log('SDK error:', error.message);
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.TelemetryError = exports.CommandError = exports.BluetoothUnavailableError = exports.InvalidSettingError = exports.NotConnectedError = exports.TimeoutError = exports.AuthenticationError = exports.ConnectionError = exports.VoltraSDKError = exports.ErrorCode = void 0;
|
|
25
|
+
/**
|
|
26
|
+
* Error codes for SDK errors.
|
|
27
|
+
* Use these for programmatic error handling.
|
|
28
|
+
*/
|
|
29
|
+
exports.ErrorCode = {
|
|
30
|
+
// Connection errors
|
|
31
|
+
CONNECTION_FAILED: 'CONNECTION_FAILED',
|
|
32
|
+
CONNECTION_LOST: 'CONNECTION_LOST',
|
|
33
|
+
CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',
|
|
34
|
+
NOT_CONNECTED: 'NOT_CONNECTED',
|
|
35
|
+
ALREADY_CONNECTED: 'ALREADY_CONNECTED',
|
|
36
|
+
// Authentication errors
|
|
37
|
+
AUTH_FAILED: 'AUTH_FAILED',
|
|
38
|
+
AUTH_TIMEOUT: 'AUTH_TIMEOUT',
|
|
39
|
+
AUTH_INVALID_RESPONSE: 'AUTH_INVALID_RESPONSE',
|
|
40
|
+
// Bluetooth errors
|
|
41
|
+
BLUETOOTH_UNAVAILABLE: 'BLUETOOTH_UNAVAILABLE',
|
|
42
|
+
BLUETOOTH_PERMISSION_DENIED: 'BLUETOOTH_PERMISSION_DENIED',
|
|
43
|
+
BLUETOOTH_ADAPTER_ERROR: 'BLUETOOTH_ADAPTER_ERROR',
|
|
44
|
+
// Device errors
|
|
45
|
+
DEVICE_NOT_FOUND: 'DEVICE_NOT_FOUND',
|
|
46
|
+
DEVICE_DISCONNECTED: 'DEVICE_DISCONNECTED',
|
|
47
|
+
// Command errors
|
|
48
|
+
COMMAND_FAILED: 'COMMAND_FAILED',
|
|
49
|
+
COMMAND_TIMEOUT: 'COMMAND_TIMEOUT',
|
|
50
|
+
INVALID_SETTING: 'INVALID_SETTING',
|
|
51
|
+
// Telemetry errors
|
|
52
|
+
TELEMETRY_DECODE_ERROR: 'TELEMETRY_DECODE_ERROR',
|
|
53
|
+
// General
|
|
54
|
+
TIMEOUT: 'TIMEOUT',
|
|
55
|
+
UNKNOWN: 'UNKNOWN',
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Base error class for all SDK errors.
|
|
59
|
+
* Provides a consistent error interface with error codes.
|
|
60
|
+
*/
|
|
61
|
+
class VoltraSDKError extends Error {
|
|
62
|
+
constructor(message, code = exports.ErrorCode.UNKNOWN, cause) {
|
|
63
|
+
super(message);
|
|
64
|
+
this.name = 'VoltraSDKError';
|
|
65
|
+
this.code = code;
|
|
66
|
+
this.cause = cause;
|
|
67
|
+
// Maintains proper stack trace in V8 environments
|
|
68
|
+
if (Error.captureStackTrace) {
|
|
69
|
+
Error.captureStackTrace(this, this.constructor);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.VoltraSDKError = VoltraSDKError;
|
|
74
|
+
/**
|
|
75
|
+
* Thrown when a BLE connection fails or is lost.
|
|
76
|
+
*/
|
|
77
|
+
class ConnectionError extends VoltraSDKError {
|
|
78
|
+
constructor(message, code = exports.ErrorCode.CONNECTION_FAILED, cause) {
|
|
79
|
+
super(message, code, cause);
|
|
80
|
+
this.name = 'ConnectionError';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.ConnectionError = ConnectionError;
|
|
84
|
+
/**
|
|
85
|
+
* Thrown when Voltra device authentication fails.
|
|
86
|
+
* This typically happens during the initial connection handshake.
|
|
87
|
+
*/
|
|
88
|
+
class AuthenticationError extends VoltraSDKError {
|
|
89
|
+
constructor(message, code = exports.ErrorCode.AUTH_FAILED, cause) {
|
|
90
|
+
super(message, code, cause);
|
|
91
|
+
this.name = 'AuthenticationError';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.AuthenticationError = AuthenticationError;
|
|
95
|
+
/**
|
|
96
|
+
* Thrown when an operation times out.
|
|
97
|
+
*/
|
|
98
|
+
class TimeoutError extends VoltraSDKError {
|
|
99
|
+
constructor(message, timeoutMs, cause) {
|
|
100
|
+
super(message, exports.ErrorCode.TIMEOUT, cause);
|
|
101
|
+
this.name = 'TimeoutError';
|
|
102
|
+
this.timeoutMs = timeoutMs;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.TimeoutError = TimeoutError;
|
|
106
|
+
/**
|
|
107
|
+
* Thrown when an operation requires a connection but the device is not connected.
|
|
108
|
+
*/
|
|
109
|
+
class NotConnectedError extends VoltraSDKError {
|
|
110
|
+
constructor(message = 'Device is not connected') {
|
|
111
|
+
super(message, exports.ErrorCode.NOT_CONNECTED);
|
|
112
|
+
this.name = 'NotConnectedError';
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.NotConnectedError = NotConnectedError;
|
|
116
|
+
/**
|
|
117
|
+
* Thrown when an invalid setting value is provided.
|
|
118
|
+
* For example, setting weight to a value not supported by the device.
|
|
119
|
+
*/
|
|
120
|
+
class InvalidSettingError extends VoltraSDKError {
|
|
121
|
+
constructor(setting, value, validValues, message) {
|
|
122
|
+
const msg = message ??
|
|
123
|
+
`Invalid value for ${setting}: ${value}${validValues ? `. Valid values: ${validValues.join(', ')}` : ''}`;
|
|
124
|
+
super(msg, exports.ErrorCode.INVALID_SETTING);
|
|
125
|
+
this.name = 'InvalidSettingError';
|
|
126
|
+
this.setting = setting;
|
|
127
|
+
this.value = value;
|
|
128
|
+
this.validValues = validValues;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.InvalidSettingError = InvalidSettingError;
|
|
132
|
+
/**
|
|
133
|
+
* Thrown when Bluetooth is not available on the current platform.
|
|
134
|
+
*/
|
|
135
|
+
class BluetoothUnavailableError extends VoltraSDKError {
|
|
136
|
+
constructor(reason) {
|
|
137
|
+
const message = reason
|
|
138
|
+
? `Bluetooth is not available: ${reason}`
|
|
139
|
+
: 'Bluetooth is not available on this device';
|
|
140
|
+
super(message, exports.ErrorCode.BLUETOOTH_UNAVAILABLE);
|
|
141
|
+
this.name = 'BluetoothUnavailableError';
|
|
142
|
+
this.reason = reason;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.BluetoothUnavailableError = BluetoothUnavailableError;
|
|
146
|
+
/**
|
|
147
|
+
* Thrown when a command fails to execute on the device.
|
|
148
|
+
*/
|
|
149
|
+
class CommandError extends VoltraSDKError {
|
|
150
|
+
constructor(message, command, cause) {
|
|
151
|
+
super(message, exports.ErrorCode.COMMAND_FAILED, cause);
|
|
152
|
+
this.name = 'CommandError';
|
|
153
|
+
this.command = command;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
exports.CommandError = CommandError;
|
|
157
|
+
/**
|
|
158
|
+
* Thrown when telemetry data cannot be decoded.
|
|
159
|
+
*/
|
|
160
|
+
class TelemetryError extends VoltraSDKError {
|
|
161
|
+
constructor(message, cause) {
|
|
162
|
+
super(message, exports.ErrorCode.TELEMETRY_DECODE_ERROR, cause);
|
|
163
|
+
this.name = 'TelemetryError';
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.TelemetryError = TelemetryError;
|
|
167
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|