@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.
Files changed (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +272 -0
  3. package/dist/cjs/bluetooth/adapters/base.js +116 -0
  4. package/dist/cjs/bluetooth/adapters/base.js.map +1 -0
  5. package/dist/cjs/bluetooth/adapters/index.js +58 -0
  6. package/dist/cjs/bluetooth/adapters/index.js.map +1 -0
  7. package/dist/cjs/bluetooth/adapters/native.js +473 -0
  8. package/dist/cjs/bluetooth/adapters/native.js.map +1 -0
  9. package/dist/cjs/bluetooth/adapters/node.js +228 -0
  10. package/dist/cjs/bluetooth/adapters/node.js.map +1 -0
  11. package/dist/cjs/bluetooth/adapters/types.js +11 -0
  12. package/dist/cjs/bluetooth/adapters/types.js.map +1 -0
  13. package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js +187 -0
  14. package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js.map +1 -0
  15. package/dist/cjs/bluetooth/adapters/web.js +112 -0
  16. package/dist/cjs/bluetooth/adapters/web.js.map +1 -0
  17. package/dist/cjs/bluetooth/controllers/scanner-controller.js +145 -0
  18. package/dist/cjs/bluetooth/controllers/scanner-controller.js.map +1 -0
  19. package/dist/cjs/bluetooth/index.js +27 -0
  20. package/dist/cjs/bluetooth/index.js.map +1 -0
  21. package/dist/cjs/bluetooth/models/connection.js +68 -0
  22. package/dist/cjs/bluetooth/models/connection.js.map +1 -0
  23. package/dist/cjs/bluetooth/models/device.js +26 -0
  24. package/dist/cjs/bluetooth/models/device.js.map +1 -0
  25. package/dist/cjs/bluetooth/models/environment.js +106 -0
  26. package/dist/cjs/bluetooth/models/environment.js.map +1 -0
  27. package/dist/cjs/errors.js +167 -0
  28. package/dist/cjs/errors.js.map +1 -0
  29. package/dist/cjs/index.js +116 -0
  30. package/dist/cjs/index.js.map +1 -0
  31. package/dist/cjs/react/hooks.js +262 -0
  32. package/dist/cjs/react/hooks.js.map +1 -0
  33. package/dist/cjs/react/index.js +18 -0
  34. package/dist/cjs/react/index.js.map +1 -0
  35. package/dist/cjs/sdk/index.js +14 -0
  36. package/dist/cjs/sdk/index.js.map +1 -0
  37. package/dist/cjs/sdk/types.js +8 -0
  38. package/dist/cjs/sdk/types.js.map +1 -0
  39. package/dist/cjs/sdk/voltra-client.js +632 -0
  40. package/dist/cjs/sdk/voltra-client.js.map +1 -0
  41. package/dist/cjs/sdk/voltra-manager.js +419 -0
  42. package/dist/cjs/sdk/voltra-manager.js.map +1 -0
  43. package/dist/cjs/shared/index.js +12 -0
  44. package/dist/cjs/shared/index.js.map +1 -0
  45. package/dist/cjs/shared/utils.js +51 -0
  46. package/dist/cjs/shared/utils.js.map +1 -0
  47. package/dist/cjs/voltra/index.js +56 -0
  48. package/dist/cjs/voltra/index.js.map +1 -0
  49. package/dist/cjs/voltra/models/connection.js +68 -0
  50. package/dist/cjs/voltra/models/connection.js.map +1 -0
  51. package/dist/cjs/voltra/models/device-filter.js +28 -0
  52. package/dist/cjs/voltra/models/device-filter.js.map +1 -0
  53. package/dist/cjs/voltra/models/device.js +152 -0
  54. package/dist/cjs/voltra/models/device.js.map +1 -0
  55. package/dist/cjs/voltra/models/telemetry/frame.js +46 -0
  56. package/dist/cjs/voltra/models/telemetry/frame.js.map +1 -0
  57. package/dist/cjs/voltra/models/telemetry/index.js +14 -0
  58. package/dist/cjs/voltra/models/telemetry/index.js.map +1 -0
  59. package/dist/cjs/voltra/protocol/commands.js +230 -0
  60. package/dist/cjs/voltra/protocol/commands.js.map +1 -0
  61. package/dist/cjs/voltra/protocol/constants.js +136 -0
  62. package/dist/cjs/voltra/protocol/constants.js.map +1 -0
  63. package/dist/cjs/voltra/protocol/data/chains.json +830 -0
  64. package/dist/cjs/voltra/protocol/data/eccentric.json +1598 -0
  65. package/dist/cjs/voltra/protocol/data/protocol.json +54 -0
  66. package/dist/cjs/voltra/protocol/data/weights.json +62 -0
  67. package/dist/cjs/voltra/protocol/index.js +25 -0
  68. package/dist/cjs/voltra/protocol/index.js.map +1 -0
  69. package/dist/cjs/voltra/protocol/telemetry-decoder.js +146 -0
  70. package/dist/cjs/voltra/protocol/telemetry-decoder.js.map +1 -0
  71. package/dist/esm/bluetooth/adapters/base.js +112 -0
  72. package/dist/esm/bluetooth/adapters/base.js.map +1 -0
  73. package/dist/esm/bluetooth/adapters/index.js +51 -0
  74. package/dist/esm/bluetooth/adapters/index.js.map +1 -0
  75. package/dist/esm/bluetooth/adapters/native.js +469 -0
  76. package/dist/esm/bluetooth/adapters/native.js.map +1 -0
  77. package/dist/esm/bluetooth/adapters/node.js +191 -0
  78. package/dist/esm/bluetooth/adapters/node.js.map +1 -0
  79. package/dist/esm/bluetooth/adapters/types.js +10 -0
  80. package/dist/esm/bluetooth/adapters/types.js.map +1 -0
  81. package/dist/esm/bluetooth/adapters/web-bluetooth-base.js +183 -0
  82. package/dist/esm/bluetooth/adapters/web-bluetooth-base.js.map +1 -0
  83. package/dist/esm/bluetooth/adapters/web.js +108 -0
  84. package/dist/esm/bluetooth/adapters/web.js.map +1 -0
  85. package/dist/esm/bluetooth/controllers/scanner-controller.js +141 -0
  86. package/dist/esm/bluetooth/controllers/scanner-controller.js.map +1 -0
  87. package/dist/esm/bluetooth/index.js +17 -0
  88. package/dist/esm/bluetooth/index.js.map +1 -0
  89. package/dist/esm/bluetooth/models/connection.js +63 -0
  90. package/dist/esm/bluetooth/models/connection.js.map +1 -0
  91. package/dist/esm/bluetooth/models/device.js +22 -0
  92. package/dist/esm/bluetooth/models/device.js.map +1 -0
  93. package/dist/esm/bluetooth/models/environment.js +101 -0
  94. package/dist/esm/bluetooth/models/environment.js.map +1 -0
  95. package/dist/esm/errors.js +155 -0
  96. package/dist/esm/errors.js.map +1 -0
  97. package/dist/esm/index.js +72 -0
  98. package/dist/esm/index.js.map +1 -0
  99. package/dist/esm/react/hooks.js +257 -0
  100. package/dist/esm/react/hooks.js.map +1 -0
  101. package/dist/esm/react/index.js +12 -0
  102. package/dist/esm/react/index.js.map +1 -0
  103. package/dist/esm/sdk/index.js +9 -0
  104. package/dist/esm/sdk/index.js.map +1 -0
  105. package/dist/esm/sdk/types.js +7 -0
  106. package/dist/esm/sdk/types.js.map +1 -0
  107. package/dist/esm/sdk/voltra-client.js +628 -0
  108. package/dist/esm/sdk/voltra-client.js.map +1 -0
  109. package/dist/esm/sdk/voltra-manager.js +415 -0
  110. package/dist/esm/sdk/voltra-manager.js.map +1 -0
  111. package/dist/esm/shared/index.js +5 -0
  112. package/dist/esm/shared/index.js.map +1 -0
  113. package/dist/esm/shared/utils.js +45 -0
  114. package/dist/esm/shared/utils.js.map +1 -0
  115. package/dist/esm/voltra/index.js +26 -0
  116. package/dist/esm/voltra/index.js.map +1 -0
  117. package/dist/esm/voltra/models/connection.js +63 -0
  118. package/dist/esm/voltra/models/connection.js.map +1 -0
  119. package/dist/esm/voltra/models/device-filter.js +23 -0
  120. package/dist/esm/voltra/models/device-filter.js.map +1 -0
  121. package/dist/esm/voltra/models/device.js +148 -0
  122. package/dist/esm/voltra/models/device.js.map +1 -0
  123. package/dist/esm/voltra/models/telemetry/frame.js +40 -0
  124. package/dist/esm/voltra/models/telemetry/frame.js.map +1 -0
  125. package/dist/esm/voltra/models/telemetry/index.js +7 -0
  126. package/dist/esm/voltra/models/telemetry/index.js.map +1 -0
  127. package/dist/esm/voltra/protocol/commands.js +224 -0
  128. package/dist/esm/voltra/protocol/commands.js.map +1 -0
  129. package/dist/esm/voltra/protocol/constants.js +130 -0
  130. package/dist/esm/voltra/protocol/constants.js.map +1 -0
  131. package/dist/esm/voltra/protocol/data/chains.json +830 -0
  132. package/dist/esm/voltra/protocol/data/eccentric.json +1598 -0
  133. package/dist/esm/voltra/protocol/data/protocol.json +54 -0
  134. package/dist/esm/voltra/protocol/data/weights.json +62 -0
  135. package/dist/esm/voltra/protocol/index.js +9 -0
  136. package/dist/esm/voltra/protocol/index.js.map +1 -0
  137. package/dist/esm/voltra/protocol/telemetry-decoder.js +140 -0
  138. package/dist/esm/voltra/protocol/telemetry-decoder.js.map +1 -0
  139. package/dist/types/bluetooth/adapters/base.d.ts +85 -0
  140. package/dist/types/bluetooth/adapters/base.d.ts.map +1 -0
  141. package/dist/types/bluetooth/adapters/index.d.ts +35 -0
  142. package/dist/types/bluetooth/adapters/index.d.ts.map +1 -0
  143. package/dist/types/bluetooth/adapters/native.d.ts +109 -0
  144. package/dist/types/bluetooth/adapters/native.d.ts.map +1 -0
  145. package/dist/types/bluetooth/adapters/node.d.ts +91 -0
  146. package/dist/types/bluetooth/adapters/node.d.ts.map +1 -0
  147. package/dist/types/bluetooth/adapters/types.d.ts +102 -0
  148. package/dist/types/bluetooth/adapters/types.d.ts.map +1 -0
  149. package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts +90 -0
  150. package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts.map +1 -0
  151. package/dist/types/bluetooth/adapters/web.d.ts +57 -0
  152. package/dist/types/bluetooth/adapters/web.d.ts.map +1 -0
  153. package/dist/types/bluetooth/controllers/scanner-controller.d.ts +93 -0
  154. package/dist/types/bluetooth/controllers/scanner-controller.d.ts.map +1 -0
  155. package/dist/types/bluetooth/index.d.ts +14 -0
  156. package/dist/types/bluetooth/index.d.ts.map +1 -0
  157. package/dist/types/bluetooth/models/connection.d.ts +37 -0
  158. package/dist/types/bluetooth/models/connection.d.ts.map +1 -0
  159. package/dist/types/bluetooth/models/device.d.ts +25 -0
  160. package/dist/types/bluetooth/models/device.d.ts.map +1 -0
  161. package/dist/types/bluetooth/models/environment.d.ts +45 -0
  162. package/dist/types/bluetooth/models/environment.d.ts.map +1 -0
  163. package/dist/types/errors.d.ts +113 -0
  164. package/dist/types/errors.d.ts.map +1 -0
  165. package/dist/types/index.d.ts +55 -0
  166. package/dist/types/index.d.ts.map +1 -0
  167. package/dist/types/react/hooks.d.ts +130 -0
  168. package/dist/types/react/hooks.d.ts.map +1 -0
  169. package/dist/types/react/index.d.ts +12 -0
  170. package/dist/types/react/index.d.ts.map +1 -0
  171. package/dist/types/sdk/index.d.ts +11 -0
  172. package/dist/types/sdk/index.d.ts.map +1 -0
  173. package/dist/types/sdk/types.d.ts +104 -0
  174. package/dist/types/sdk/types.d.ts.map +1 -0
  175. package/dist/types/sdk/voltra-client.d.ts +221 -0
  176. package/dist/types/sdk/voltra-client.d.ts.map +1 -0
  177. package/dist/types/sdk/voltra-manager.d.ts +226 -0
  178. package/dist/types/sdk/voltra-manager.d.ts.map +1 -0
  179. package/dist/types/shared/index.d.ts +5 -0
  180. package/dist/types/shared/index.d.ts.map +1 -0
  181. package/dist/types/shared/utils.d.ts +25 -0
  182. package/dist/types/shared/utils.d.ts.map +1 -0
  183. package/dist/types/voltra/index.d.ts +13 -0
  184. package/dist/types/voltra/index.d.ts.map +1 -0
  185. package/dist/types/voltra/models/connection.d.ts +37 -0
  186. package/dist/types/voltra/models/connection.d.ts.map +1 -0
  187. package/dist/types/voltra/models/device-filter.d.ts +19 -0
  188. package/dist/types/voltra/models/device-filter.d.ts.map +1 -0
  189. package/dist/types/voltra/models/device.d.ts +105 -0
  190. package/dist/types/voltra/models/device.d.ts.map +1 -0
  191. package/dist/types/voltra/models/telemetry/frame.d.ts +41 -0
  192. package/dist/types/voltra/models/telemetry/frame.d.ts.map +1 -0
  193. package/dist/types/voltra/models/telemetry/index.d.ts +8 -0
  194. package/dist/types/voltra/models/telemetry/index.d.ts.map +1 -0
  195. package/dist/types/voltra/protocol/commands.d.ts +99 -0
  196. package/dist/types/voltra/protocol/commands.d.ts.map +1 -0
  197. package/dist/types/voltra/protocol/constants.d.ts +103 -0
  198. package/dist/types/voltra/protocol/constants.d.ts.map +1 -0
  199. package/dist/types/voltra/protocol/index.d.ts +9 -0
  200. package/dist/types/voltra/protocol/index.d.ts.map +1 -0
  201. package/dist/types/voltra/protocol/telemetry-decoder.d.ts +45 -0
  202. package/dist/types/voltra/protocol/telemetry-decoder.d.ts.map +1 -0
  203. package/package.json +111 -0
@@ -0,0 +1,419 @@
1
+ "use strict";
2
+ /**
3
+ * VoltraManager
4
+ *
5
+ * Main entry point for the Voltra SDK. Handles device discovery and connection.
6
+ * Returns VoltraClient instances for controlling individual devices.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { VoltraManager } from '@voltras/node-sdk';
11
+ *
12
+ * const manager = new VoltraManager();
13
+ *
14
+ * // Scan for devices
15
+ * const devices = await manager.scan();
16
+ *
17
+ * // Connect to a device (returns a VoltraClient)
18
+ * const client = await manager.connect(devices[0]);
19
+ *
20
+ * // Or connect by name (scans + connects in one step)
21
+ * const client = await manager.connectByName('VTR-123456');
22
+ *
23
+ * // Use the client
24
+ * await client.setWeight(50);
25
+ * client.onFrame((frame) => console.log(frame.position));
26
+ *
27
+ * // Cleanup
28
+ * manager.dispose();
29
+ * ```
30
+ */
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.VoltraManager = void 0;
33
+ const device_filter_1 = require("../voltra/models/device-filter");
34
+ const constants_1 = require("../voltra/protocol/constants");
35
+ const voltra_client_1 = require("./voltra-client");
36
+ /**
37
+ * Main entry point for the Voltra SDK.
38
+ */
39
+ class VoltraManager {
40
+ constructor(options = {}) {
41
+ // Connected devices
42
+ this.clients = new Map();
43
+ this.clientUnsubscribes = new Map();
44
+ // Discovered devices (from last scan)
45
+ this.discoveredDevices = [];
46
+ // Scanning state
47
+ this._isScanning = false;
48
+ this.scanAdapter = null;
49
+ // Event listeners
50
+ this.listeners = new Set();
51
+ // Disposed flag
52
+ this.disposed = false;
53
+ this.clientOptions = options.clientOptions ?? {};
54
+ if (options.adapterFactory) {
55
+ // Use provided factory
56
+ this.adapterFactory = options.adapterFactory;
57
+ this.platform = options.platform ?? 'web';
58
+ }
59
+ else if (options.platform) {
60
+ // Use specified platform
61
+ this.platform = options.platform;
62
+ this.adapterFactory = this.createAdapterFactory(options.platform);
63
+ }
64
+ else {
65
+ // Auto-detect platform
66
+ this.platform = this.detectPlatform();
67
+ this.adapterFactory = this.createAdapterFactory(this.platform);
68
+ }
69
+ }
70
+ // ===========================================================================
71
+ // Static Factory Methods
72
+ // ===========================================================================
73
+ /**
74
+ * Create a manager for web browsers.
75
+ */
76
+ static forWeb(options) {
77
+ return new VoltraManager({ ...options, platform: 'web' });
78
+ }
79
+ /**
80
+ * Create a manager for Node.js.
81
+ */
82
+ static forNode(options) {
83
+ return new VoltraManager({ ...options, platform: 'node' });
84
+ }
85
+ /**
86
+ * Create a manager for React Native.
87
+ * Note: Prefer importing from '@voltras/node-sdk/native' instead.
88
+ */
89
+ static forNative(options) {
90
+ return new VoltraManager({ ...options, platform: 'native' });
91
+ }
92
+ // ===========================================================================
93
+ // Public Getters
94
+ // ===========================================================================
95
+ /**
96
+ * Get all connected device IDs.
97
+ */
98
+ get connectedDeviceIds() {
99
+ return Array.from(this.clients.keys());
100
+ }
101
+ /**
102
+ * Get number of connected devices.
103
+ */
104
+ get connectedCount() {
105
+ return this.clients.size;
106
+ }
107
+ /**
108
+ * Check if scanning is in progress.
109
+ */
110
+ get isScanning() {
111
+ return this._isScanning;
112
+ }
113
+ /**
114
+ * Get devices discovered in last scan.
115
+ */
116
+ get devices() {
117
+ return [...this.discoveredDevices];
118
+ }
119
+ // ===========================================================================
120
+ // Device Access
121
+ // ===========================================================================
122
+ /**
123
+ * Get a connected device client by ID.
124
+ */
125
+ getClient(deviceId) {
126
+ return this.clients.get(deviceId);
127
+ }
128
+ /**
129
+ * Get all connected device clients.
130
+ */
131
+ getAllClients() {
132
+ return Array.from(this.clients.values());
133
+ }
134
+ /**
135
+ * Check if a device is connected.
136
+ */
137
+ isConnected(deviceId) {
138
+ return this.clients.has(deviceId);
139
+ }
140
+ // ===========================================================================
141
+ // Discovery
142
+ // ===========================================================================
143
+ /**
144
+ * Scan for Voltra devices.
145
+ *
146
+ * @param options Scan options
147
+ * @returns Array of discovered Voltra devices
148
+ */
149
+ async scan(options = {}) {
150
+ this.ensureNotDisposed();
151
+ const { timeout = 10000, filterVoltra = true } = options;
152
+ this._isScanning = true;
153
+ this.emit({ type: 'scanStarted' });
154
+ try {
155
+ // Create adapter for scanning if needed
156
+ if (!this.scanAdapter) {
157
+ this.scanAdapter = this.adapterFactory();
158
+ }
159
+ const devices = await this.scanAdapter.scan(timeout);
160
+ this.discoveredDevices = filterVoltra ? (0, device_filter_1.filterVoltraDevices)(devices) : devices;
161
+ this.emit({ type: 'scanStopped', devices: this.discoveredDevices });
162
+ return this.discoveredDevices;
163
+ }
164
+ finally {
165
+ this._isScanning = false;
166
+ }
167
+ }
168
+ // ===========================================================================
169
+ // Connection
170
+ // ===========================================================================
171
+ /**
172
+ * Connect to a Voltra device.
173
+ *
174
+ * @param device Device to connect to
175
+ * @returns VoltraClient for the connected device
176
+ */
177
+ async connect(device) {
178
+ this.ensureNotDisposed();
179
+ // Check if already connected
180
+ if (this.clients.has(device.id)) {
181
+ return this.clients.get(device.id);
182
+ }
183
+ // Create new adapter and client
184
+ const adapter = this.adapterFactory();
185
+ const client = new voltra_client_1.VoltraClient({
186
+ ...this.clientOptions,
187
+ adapter,
188
+ });
189
+ try {
190
+ await client.connect(device);
191
+ // Store client
192
+ this.clients.set(device.id, client);
193
+ // Subscribe to client events
194
+ const unsubscribe = client.subscribe((event) => {
195
+ this.handleClientEvent(device.id, event);
196
+ });
197
+ this.clientUnsubscribes.set(device.id, unsubscribe);
198
+ // Emit connected event
199
+ this.emit({
200
+ type: 'deviceConnected',
201
+ deviceId: device.id,
202
+ deviceName: device.name ?? null,
203
+ client,
204
+ });
205
+ return client;
206
+ }
207
+ catch (error) {
208
+ client.dispose();
209
+ throw error;
210
+ }
211
+ }
212
+ /**
213
+ * Scan for a device by name and connect to it.
214
+ * This is a convenience method that combines scan() and connect().
215
+ *
216
+ * @param namePattern Name or partial name to search for
217
+ * @param options Connection options
218
+ * @returns VoltraClient for the connected device
219
+ * @throws Error if no matching device is found
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * // Connect to device containing "VTR-123" in its name
224
+ * const client = await manager.connectByName('VTR-123');
225
+ *
226
+ * // Connect to exact name match
227
+ * const client = await manager.connectByName('VTR-123456', { matchMode: 'exact' });
228
+ * ```
229
+ */
230
+ async connectByName(namePattern, options = {}) {
231
+ this.ensureNotDisposed();
232
+ const { matchMode = 'contains', timeout = 10000, filterVoltra = true } = options;
233
+ // Scan for devices
234
+ const devices = await this.scan({ timeout, filterVoltra });
235
+ // Find matching device
236
+ const device = devices.find((d) => {
237
+ if (!d.name)
238
+ return false;
239
+ switch (matchMode) {
240
+ case 'exact':
241
+ return d.name === namePattern;
242
+ case 'startsWith':
243
+ return d.name.startsWith(namePattern);
244
+ case 'contains':
245
+ default:
246
+ return d.name.includes(namePattern);
247
+ }
248
+ });
249
+ if (!device) {
250
+ throw new Error(`No Voltra device found matching "${namePattern}". ` +
251
+ `Found ${devices.length} device(s): ${devices.map((d) => d.name ?? d.id).join(', ') || 'none'}`);
252
+ }
253
+ return this.connect(device);
254
+ }
255
+ /**
256
+ * Connect to the first available Voltra device.
257
+ * Convenience method for single-device scenarios.
258
+ *
259
+ * @param options Scan options
260
+ * @returns VoltraClient for the connected device
261
+ * @throws Error if no devices are found
262
+ */
263
+ async connectFirst(options = {}) {
264
+ const devices = await this.scan(options);
265
+ if (devices.length === 0) {
266
+ throw new Error('No Voltra devices found. Make sure your device is powered on.');
267
+ }
268
+ return this.connect(devices[0]);
269
+ }
270
+ /**
271
+ * Disconnect a specific device.
272
+ */
273
+ async disconnect(deviceId) {
274
+ const client = this.clients.get(deviceId);
275
+ if (!client)
276
+ return;
277
+ const unsubscribe = this.clientUnsubscribes.get(deviceId);
278
+ unsubscribe?.();
279
+ this.clientUnsubscribes.delete(deviceId);
280
+ await client.disconnect();
281
+ client.dispose();
282
+ this.clients.delete(deviceId);
283
+ this.emit({ type: 'deviceDisconnected', deviceId });
284
+ }
285
+ /**
286
+ * Disconnect all devices.
287
+ */
288
+ async disconnectAll() {
289
+ const deviceIds = Array.from(this.clients.keys());
290
+ await Promise.all(deviceIds.map((id) => this.disconnect(id)));
291
+ }
292
+ // ===========================================================================
293
+ // Event Subscriptions
294
+ // ===========================================================================
295
+ /**
296
+ * Subscribe to manager events.
297
+ */
298
+ subscribe(listener) {
299
+ this.listeners.add(listener);
300
+ return () => this.listeners.delete(listener);
301
+ }
302
+ /**
303
+ * Subscribe to device connected events.
304
+ */
305
+ onDeviceConnected(callback) {
306
+ const listener = (event) => {
307
+ if (event.type === 'deviceConnected') {
308
+ callback(event.client, event.deviceId, event.deviceName);
309
+ }
310
+ };
311
+ this.listeners.add(listener);
312
+ return () => this.listeners.delete(listener);
313
+ }
314
+ /**
315
+ * Subscribe to device disconnected events.
316
+ */
317
+ onDeviceDisconnected(callback) {
318
+ const listener = (event) => {
319
+ if (event.type === 'deviceDisconnected') {
320
+ callback(event.deviceId);
321
+ }
322
+ };
323
+ this.listeners.add(listener);
324
+ return () => this.listeners.delete(listener);
325
+ }
326
+ // ===========================================================================
327
+ // Lifecycle
328
+ // ===========================================================================
329
+ /**
330
+ * Dispose of the manager and all connected devices.
331
+ */
332
+ dispose() {
333
+ if (this.disposed)
334
+ return;
335
+ this.disposed = true;
336
+ this.disconnectAll().catch(() => { });
337
+ this.listeners.clear();
338
+ this.clientUnsubscribes.clear();
339
+ this.scanAdapter = null;
340
+ }
341
+ // ===========================================================================
342
+ // Private Methods
343
+ // ===========================================================================
344
+ detectPlatform() {
345
+ // Check for browser environment
346
+ if (typeof window !== 'undefined' &&
347
+ typeof navigator !== 'undefined' &&
348
+ 'bluetooth' in navigator) {
349
+ return 'web';
350
+ }
351
+ // Check for Node.js environment
352
+ if (typeof process !== 'undefined' && process.versions?.node) {
353
+ return 'node';
354
+ }
355
+ // Default to native (React Native)
356
+ // Note: This fallback may not work well - users should specify platform
357
+ return 'native';
358
+ }
359
+ createAdapterFactory(platform) {
360
+ switch (platform) {
361
+ case 'web':
362
+ return () => {
363
+ // Dynamic import to avoid bundling issues
364
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
365
+ const { WebBLEAdapter } = require('../bluetooth/adapters/web');
366
+ return new WebBLEAdapter({ ble: constants_1.BLE });
367
+ };
368
+ case 'node':
369
+ return () => {
370
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
371
+ const { NodeBLEAdapter } = require('../bluetooth/adapters/node');
372
+ return new NodeBLEAdapter({ ble: constants_1.BLE });
373
+ };
374
+ case 'native':
375
+ return () => {
376
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
377
+ const { NativeBLEAdapter } = require('../bluetooth/adapters/native');
378
+ return new NativeBLEAdapter({ ble: constants_1.BLE });
379
+ };
380
+ default:
381
+ throw new Error(`Unknown platform: ${platform}`);
382
+ }
383
+ }
384
+ handleClientEvent(deviceId, event) {
385
+ switch (event.type) {
386
+ case 'disconnected':
387
+ if (this.clients.has(deviceId)) {
388
+ const unsubscribe = this.clientUnsubscribes.get(deviceId);
389
+ unsubscribe?.();
390
+ this.clientUnsubscribes.delete(deviceId);
391
+ const client = this.clients.get(deviceId);
392
+ client?.dispose();
393
+ this.clients.delete(deviceId);
394
+ this.emit({ type: 'deviceDisconnected', deviceId });
395
+ }
396
+ break;
397
+ case 'error':
398
+ this.emit({ type: 'deviceError', deviceId, error: event.error });
399
+ break;
400
+ }
401
+ }
402
+ emit(event) {
403
+ this.listeners.forEach((listener) => {
404
+ try {
405
+ listener(event);
406
+ }
407
+ catch (e) {
408
+ console.error('[VoltraManager] Event listener error:', e);
409
+ }
410
+ });
411
+ }
412
+ ensureNotDisposed() {
413
+ if (this.disposed) {
414
+ throw new Error('Manager has been disposed');
415
+ }
416
+ }
417
+ }
418
+ exports.VoltraManager = VoltraManager;
419
+ //# sourceMappingURL=voltra-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voltra-manager.js","sourceRoot":"","sources":["../../../src/sdk/voltra-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bytesEqual = exports.bytesToHex = exports.hexToBytes = exports.delay = void 0;
4
+ /**
5
+ * Shared Utilities
6
+ */
7
+ var utils_1 = require("./utils");
8
+ Object.defineProperty(exports, "delay", { enumerable: true, get: function () { return utils_1.delay; } });
9
+ Object.defineProperty(exports, "hexToBytes", { enumerable: true, get: function () { return utils_1.hexToBytes; } });
10
+ Object.defineProperty(exports, "bytesToHex", { enumerable: true, get: function () { return utils_1.bytesToHex; } });
11
+ Object.defineProperty(exports, "bytesEqual", { enumerable: true, get: function () { return utils_1.bytesEqual; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,iCAAoE;AAA3D,8FAAA,KAAK,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,mGAAA,UAAU,OAAA"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * Shared Utilities
4
+ *
5
+ * Common utilities used across SDK modules.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.delay = delay;
9
+ exports.hexToBytes = hexToBytes;
10
+ exports.bytesToHex = bytesToHex;
11
+ exports.bytesEqual = bytesEqual;
12
+ /**
13
+ * Delay execution for a specified duration.
14
+ * @param ms Duration in milliseconds
15
+ */
16
+ function delay(ms) {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+ /**
20
+ * Convert hex string to Uint8Array.
21
+ * @param hex Hex string (e.g., "48656c6c6f")
22
+ */
23
+ function hexToBytes(hex) {
24
+ const bytes = new Uint8Array(hex.length / 2);
25
+ for (let i = 0; i < bytes.length; i++) {
26
+ bytes[i] = parseInt(hex.substr(i * 2, 2), 16);
27
+ }
28
+ return bytes;
29
+ }
30
+ /**
31
+ * Convert Uint8Array to hex string.
32
+ * @param bytes Byte array
33
+ */
34
+ function bytesToHex(bytes) {
35
+ return Array.from(bytes)
36
+ .map((b) => b.toString(16).padStart(2, '0'))
37
+ .join('');
38
+ }
39
+ /**
40
+ * Check if two byte arrays are equal.
41
+ */
42
+ function bytesEqual(a, b) {
43
+ if (a.length !== b.length)
44
+ return false;
45
+ for (let i = 0; i < a.length; i++) {
46
+ if (a[i] !== b[i])
47
+ return false;
48
+ }
49
+ return true;
50
+ }
51
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/shared/utils.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAMH,sBAEC;AAMD,gCAMC;AAMD,gCAIC;AAKD,gCAMC;AAvCD;;;GAGG;AACH,SAAgB,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,KAAiB;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,CAAa,EAAE,CAAa;IACrD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ /**
3
+ * Voltra Domain
4
+ *
5
+ * Voltra device management, telemetry processing, and workout control.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.identifyMessageType = exports.encodeTelemetryFrame = exports.decodeTelemetryFrame = exports.decodeNotification = exports.PhaseNames = exports.MovementPhase = exports.BLE = exports.Workout = exports.Init = exports.Auth = exports.Timing = exports.TelemetryOffsets = exports.MessageTypes = exports.EccentricCommands = exports.ChainsCommands = exports.WeightCommands = exports.isEccentricPhase = exports.isConcentricPhase = exports.isActivePhase = exports.createFrame = exports.filterVoltraDevices = exports.isVoltraDevice = exports.VOLTRA_DEVICE_PREFIX = exports.VoltraConnectionStateModel = exports.isValidVoltraTransition = exports.DEFAULT_SETTINGS = exports.VoltraDevice = void 0;
9
+ // =============================================================================
10
+ // Models
11
+ // =============================================================================
12
+ // Device model
13
+ var device_1 = require("./models/device");
14
+ Object.defineProperty(exports, "VoltraDevice", { enumerable: true, get: function () { return device_1.VoltraDevice; } });
15
+ Object.defineProperty(exports, "DEFAULT_SETTINGS", { enumerable: true, get: function () { return device_1.DEFAULT_SETTINGS; } });
16
+ // Connection model
17
+ var connection_1 = require("./models/connection");
18
+ Object.defineProperty(exports, "isValidVoltraTransition", { enumerable: true, get: function () { return connection_1.isValidVoltraTransition; } });
19
+ Object.defineProperty(exports, "VoltraConnectionStateModel", { enumerable: true, get: function () { return connection_1.VoltraConnectionStateModel; } });
20
+ // Device filter
21
+ var device_filter_1 = require("./models/device-filter");
22
+ Object.defineProperty(exports, "VOLTRA_DEVICE_PREFIX", { enumerable: true, get: function () { return device_filter_1.VOLTRA_DEVICE_PREFIX; } });
23
+ Object.defineProperty(exports, "isVoltraDevice", { enumerable: true, get: function () { return device_filter_1.isVoltraDevice; } });
24
+ Object.defineProperty(exports, "filterVoltraDevices", { enumerable: true, get: function () { return device_filter_1.filterVoltraDevices; } });
25
+ // Telemetry models
26
+ var telemetry_1 = require("./models/telemetry");
27
+ Object.defineProperty(exports, "createFrame", { enumerable: true, get: function () { return telemetry_1.createFrame; } });
28
+ Object.defineProperty(exports, "isActivePhase", { enumerable: true, get: function () { return telemetry_1.isActivePhase; } });
29
+ Object.defineProperty(exports, "isConcentricPhase", { enumerable: true, get: function () { return telemetry_1.isConcentricPhase; } });
30
+ Object.defineProperty(exports, "isEccentricPhase", { enumerable: true, get: function () { return telemetry_1.isEccentricPhase; } });
31
+ // =============================================================================
32
+ // Protocol
33
+ // =============================================================================
34
+ // Command builders
35
+ var commands_1 = require("./protocol/commands");
36
+ Object.defineProperty(exports, "WeightCommands", { enumerable: true, get: function () { return commands_1.WeightCommands; } });
37
+ Object.defineProperty(exports, "ChainsCommands", { enumerable: true, get: function () { return commands_1.ChainsCommands; } });
38
+ Object.defineProperty(exports, "EccentricCommands", { enumerable: true, get: function () { return commands_1.EccentricCommands; } });
39
+ // Protocol constants
40
+ var constants_1 = require("./protocol/constants");
41
+ Object.defineProperty(exports, "MessageTypes", { enumerable: true, get: function () { return constants_1.MessageTypes; } });
42
+ Object.defineProperty(exports, "TelemetryOffsets", { enumerable: true, get: function () { return constants_1.TelemetryOffsets; } });
43
+ Object.defineProperty(exports, "Timing", { enumerable: true, get: function () { return constants_1.Timing; } });
44
+ Object.defineProperty(exports, "Auth", { enumerable: true, get: function () { return constants_1.Auth; } });
45
+ Object.defineProperty(exports, "Init", { enumerable: true, get: function () { return constants_1.Init; } });
46
+ Object.defineProperty(exports, "Workout", { enumerable: true, get: function () { return constants_1.Workout; } });
47
+ Object.defineProperty(exports, "BLE", { enumerable: true, get: function () { return constants_1.BLE; } });
48
+ Object.defineProperty(exports, "MovementPhase", { enumerable: true, get: function () { return constants_1.MovementPhase; } });
49
+ Object.defineProperty(exports, "PhaseNames", { enumerable: true, get: function () { return constants_1.PhaseNames; } });
50
+ // Telemetry decoder (low-level)
51
+ var telemetry_decoder_1 = require("./protocol/telemetry-decoder");
52
+ Object.defineProperty(exports, "decodeNotification", { enumerable: true, get: function () { return telemetry_decoder_1.decodeNotification; } });
53
+ Object.defineProperty(exports, "decodeTelemetryFrame", { enumerable: true, get: function () { return telemetry_decoder_1.decodeTelemetryFrame; } });
54
+ Object.defineProperty(exports, "encodeTelemetryFrame", { enumerable: true, get: function () { return telemetry_decoder_1.encodeTelemetryFrame; } });
55
+ Object.defineProperty(exports, "identifyMessageType", { enumerable: true, get: function () { return telemetry_decoder_1.identifyMessageType; } });
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/voltra/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,eAAe;AACf,0CAMyB;AALvB,sGAAA,YAAY,OAAA;AACZ,0GAAA,gBAAgB,OAAA;AAMlB,mBAAmB;AACnB,kDAI6B;AAF3B,qHAAA,uBAAuB,OAAA;AACvB,wHAAA,0BAA0B,OAAA;AAG5B,gBAAgB;AAChB,wDAAmG;AAA1F,qHAAA,oBAAoB,OAAA;AAAE,+GAAA,cAAc,OAAA;AAAE,oHAAA,mBAAmB,OAAA;AAElE,mBAAmB;AACnB,gDAM4B;AAJ1B,wGAAA,WAAW,OAAA;AACX,0GAAA,aAAa,OAAA;AACb,8GAAA,iBAAiB,OAAA;AACjB,6GAAA,gBAAgB,OAAA;AAGlB,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAEhF,mBAAmB;AACnB,gDAK6B;AAJ3B,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AACd,6GAAA,iBAAiB,OAAA;AAInB,qBAAqB;AACrB,kDAU8B;AAT5B,yGAAA,YAAY,OAAA;AACZ,6GAAA,gBAAgB,OAAA;AAChB,mGAAA,MAAM,OAAA;AACN,iGAAA,IAAI,OAAA;AACJ,iGAAA,IAAI,OAAA;AACJ,oGAAA,OAAO,OAAA;AACP,gGAAA,GAAG,OAAA;AACH,0GAAA,aAAa,OAAA;AACb,uGAAA,UAAU,OAAA;AAGZ,gCAAgC;AAChC,kEAOsC;AANpC,uHAAA,kBAAkB,OAAA;AAClB,yHAAA,oBAAoB,OAAA;AACpB,yHAAA,oBAAoB,OAAA;AACpB,wHAAA,mBAAmB,OAAA"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * Voltra Connection Model
4
+ *
5
+ * Voltra-specific connection state that includes the authentication step.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.VoltraConnectionStateModel = void 0;
9
+ exports.isValidVoltraTransition = isValidVoltraTransition;
10
+ /**
11
+ * Valid state transitions for Voltra connection.
12
+ */
13
+ const VALID_VOLTRA_TRANSITIONS = {
14
+ disconnected: ['connecting'],
15
+ connecting: ['authenticating', 'disconnected'],
16
+ authenticating: ['connected', 'disconnected'],
17
+ connected: ['disconnected'],
18
+ };
19
+ /**
20
+ * Check if a Voltra state transition is valid.
21
+ */
22
+ function isValidVoltraTransition(from, to) {
23
+ return VALID_VOLTRA_TRANSITIONS[from].includes(to);
24
+ }
25
+ /**
26
+ * Voltra connection state model with validation.
27
+ */
28
+ class VoltraConnectionStateModel {
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' || this._state === 'authenticating';
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 (!isValidVoltraTransition(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.VoltraConnectionStateModel = VoltraConnectionStateModel;
68
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../src/voltra/models/connection.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAoBH,0DAKC;AAlBD;;GAEG;AACH,MAAM,wBAAwB,GAA2D;IACvF,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,UAAU,EAAE,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAC9C,cAAc,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IAC7C,SAAS,EAAE,CAAC,cAAc,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,SAAgB,uBAAuB,CACrC,IAA2B,EAC3B,EAAyB;IAEzB,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAa,0BAA0B;IAAvC;QACU,WAAM,GAA0B,cAAc,CAAC;IA0CzD,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,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC;IAC1E,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,QAA+B;QAC1C,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpD,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,KAA4B;QACrC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;IAC/B,CAAC;CACF;AA3CD,gEA2CC"}