brilliantsole 0.0.26 → 0.0.28

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 (215) hide show
  1. package/README.md +16 -10
  2. package/assets/3d/anchor.glb +0 -0
  3. package/assets/3d/coin.glb +0 -0
  4. package/assets/3d/glasses.glb +0 -0
  5. package/assets/3d/rightHand.glb +0 -0
  6. package/assets/audio/bounceMedium.wav +0 -0
  7. package/assets/audio/bounceStrong.wav +0 -0
  8. package/assets/audio/bounceWeak.wav +0 -0
  9. package/assets/audio/coin.wav +0 -0
  10. package/assets/audio/getUp.wav +0 -0
  11. package/assets/audio/grab.wav +0 -0
  12. package/assets/audio/kick.wav +0 -0
  13. package/assets/audio/platterFadeIn old.wav +0 -0
  14. package/assets/audio/platterFadeIn.wav +0 -0
  15. package/assets/audio/platterFadeOut.wav +0 -0
  16. package/assets/audio/punch.wav +0 -0
  17. package/assets/audio/punchSqueak.wav +0 -0
  18. package/assets/audio/purr.wav +0 -0
  19. package/assets/audio/purrFadeOut.wav +0 -0
  20. package/assets/audio/release.wav +0 -0
  21. package/assets/audio/splat.wav +0 -0
  22. package/assets/audio/stomp.wav +0 -0
  23. package/assets/images/ukaton-pressure-0.svg +9 -0
  24. package/assets/images/ukaton-pressure-1.svg +9 -0
  25. package/assets/images/ukaton-pressure-10.svg +9 -0
  26. package/assets/images/ukaton-pressure-11.svg +9 -0
  27. package/assets/images/ukaton-pressure-12.svg +9 -0
  28. package/assets/images/ukaton-pressure-13.svg +9 -0
  29. package/assets/images/ukaton-pressure-14.svg +9 -0
  30. package/assets/images/ukaton-pressure-15.svg +9 -0
  31. package/assets/images/ukaton-pressure-2.svg +9 -0
  32. package/assets/images/ukaton-pressure-3.svg +9 -0
  33. package/assets/images/ukaton-pressure-4.svg +9 -0
  34. package/assets/images/ukaton-pressure-5.svg +9 -0
  35. package/assets/images/ukaton-pressure-6.svg +9 -0
  36. package/assets/images/ukaton-pressure-7.svg +9 -0
  37. package/assets/images/ukaton-pressure-8.svg +9 -0
  38. package/assets/images/ukaton-pressure-9.svg +9 -0
  39. package/assets/images/ukaton-right-insole.svg +798 -0
  40. package/build/brilliantsole.cjs +2870 -882
  41. package/build/brilliantsole.cjs.map +1 -1
  42. package/build/brilliantsole.js +2477 -782
  43. package/build/brilliantsole.js.map +1 -1
  44. package/build/brilliantsole.ls.js +2260 -592
  45. package/build/brilliantsole.ls.js.map +1 -1
  46. package/build/brilliantsole.min.js +1 -1
  47. package/build/brilliantsole.min.js.map +1 -1
  48. package/build/brilliantsole.module.d.ts +302 -116
  49. package/build/brilliantsole.module.js +2468 -782
  50. package/build/brilliantsole.module.js.map +1 -1
  51. package/build/brilliantsole.module.min.d.ts +302 -116
  52. package/build/brilliantsole.module.min.js +1 -1
  53. package/build/brilliantsole.module.min.js.map +1 -1
  54. package/build/brilliantsole.node.module.d.ts +295 -113
  55. package/build/brilliantsole.node.module.js +2860 -882
  56. package/build/brilliantsole.node.module.js.map +1 -1
  57. package/build/dts/BS-output.d.ts +10 -0
  58. package/build/dts/BS.d.ts +21 -9
  59. package/build/dts/CameraManager.d.ts +72 -0
  60. package/build/dts/Device.d.ts +53 -16
  61. package/build/dts/DeviceInformationManager.d.ts +4 -4
  62. package/build/dts/DeviceManager.d.ts +3 -0
  63. package/build/dts/FileTransferManager.d.ts +18 -8
  64. package/build/dts/InformationManager.d.ts +8 -5
  65. package/build/dts/TfliteManager.d.ts +22 -2
  66. package/build/dts/WifiManager.d.ts +61 -0
  67. package/build/dts/connection/BaseConnectionManager.d.ts +37 -3
  68. package/build/dts/connection/ClientConnectionManager.d.ts +11 -2
  69. package/build/dts/connection/bluetooth/BluetoothConnectionManager.d.ts +1 -0
  70. package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +3 -1
  71. package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +2 -0
  72. package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +2 -2
  73. package/build/dts/connection/udp/UDPConnectionManager.d.ts +28 -0
  74. package/build/dts/connection/webSocket/WebSocketConnectionManager.d.ts +25 -0
  75. package/build/dts/devicePair/DevicePair.d.ts +14 -10
  76. package/build/dts/devicePair/DevicePairPressureSensorDataManager.d.ts +8 -4
  77. package/build/dts/devicePair/DevicePairSensorDataManager.d.ts +2 -2
  78. package/build/dts/scanner/BaseScanner.d.ts +4 -1
  79. package/build/dts/scanner/NobleScanner.d.ts +2 -1
  80. package/build/dts/sensor/MotionSensorDataManager.d.ts +5 -2
  81. package/build/dts/sensor/SensorDataManager.d.ts +5 -4
  82. package/build/dts/server/BaseClient.d.ts +6 -3
  83. package/build/dts/server/ServerUtils.d.ts +1 -1
  84. package/build/dts/server/websocket/WebSocketUtils.d.ts +1 -1
  85. package/build/dts/utils/CenterOfPressureHelper.d.ts +2 -2
  86. package/build/dts/utils/Console.d.ts +2 -0
  87. package/build/dts/utils/MathUtils.d.ts +2 -0
  88. package/build/dts/utils/ThrottleUtils.d.ts +2 -0
  89. package/build/dts/vibration/VibrationManager.d.ts +19 -2
  90. package/build/index.d.ts +299 -113
  91. package/build/index.node.d.ts +292 -110
  92. package/examples/3d/scene.html +19 -5
  93. package/examples/3d/script.js +90 -17
  94. package/examples/3d-generic/index.html +144 -0
  95. package/examples/3d-generic/script.js +266 -0
  96. package/examples/balance/script.js +2 -1
  97. package/examples/basic/index.html +232 -18
  98. package/examples/basic/script.js +746 -106
  99. package/examples/bottango/index.html +11 -1
  100. package/examples/bottango/script.js +2 -2
  101. package/examples/center-of-pressure/index.html +114 -114
  102. package/examples/center-of-pressure/script.js +1 -1
  103. package/examples/device-pair/index.html +58 -58
  104. package/examples/device-pair/script.js +12 -8
  105. package/examples/edge-impulse/script.js +135 -44
  106. package/examples/edge-impulse-test/README.md +11 -0
  107. package/examples/edge-impulse-test/edge-impulse-standalone.js +7228 -0
  108. package/examples/edge-impulse-test/edge-impulse-standalone.wasm +0 -0
  109. package/examples/edge-impulse-test/index.html +75 -0
  110. package/examples/edge-impulse-test/run-impulse.js +135 -0
  111. package/examples/edge-impulse-test/script.js +200 -0
  112. package/examples/gloves/edge-impulse-standalone.js +7228 -0
  113. package/examples/gloves/edge-impulse-standalone.wasm +0 -0
  114. package/examples/gloves/index.html +119 -0
  115. package/examples/gloves/run-impulse.js +135 -0
  116. package/examples/gloves/scene.html +124 -0
  117. package/examples/gloves/script.js +931 -0
  118. package/examples/graph/index.html +11 -1
  119. package/examples/graph/script.js +94 -37
  120. package/examples/pressure/index.html +180 -12
  121. package/examples/pressure/script.js +144 -7
  122. package/examples/punch/index.html +135 -0
  123. package/examples/punch/punch.tflite +0 -0
  124. package/examples/punch/script.js +169 -0
  125. package/examples/recording/index.html +191 -183
  126. package/examples/server/index.html +109 -23
  127. package/examples/server/script.js +322 -111
  128. package/examples/ukaton-firmware-update/index.html +20 -0
  129. package/examples/ukaton-firmware-update/manifest.json +11 -0
  130. package/examples/ukaton-firmware-update/merged-firmware.bin +0 -0
  131. package/examples/utils/aframe/aframe-master.min.js +2 -0
  132. package/examples/utils/aframe/bs-vibration.js +150 -0
  133. package/examples/utils/aframe/force-pushable.js +80 -0
  134. package/examples/utils/aframe/grabbable-anchor.js +46 -0
  135. package/examples/utils/aframe/grabbable-listener.js +31 -0
  136. package/examples/utils/aframe/grabbable-physics-body.js +190 -0
  137. package/examples/utils/aframe/grow-shrink.js +25 -0
  138. package/examples/utils/aframe/hand-punch.js +119 -0
  139. package/examples/utils/aframe/my-obb-collider.js +293 -0
  140. package/examples/utils/aframe/occlude-hand-tracking-controls.js +47 -0
  141. package/examples/utils/aframe/occlude-mesh.js +42 -0
  142. package/examples/utils/aframe/palm-up-detector.js +47 -0
  143. package/examples/utils/aframe/shadow-material.js +20 -0
  144. package/examples/utils/aframe/soft-shadow-light.js +9 -0
  145. package/examples/webxr/script.js +3 -3
  146. package/examples/webxr-2/assets/3d/soccerBall.glb +0 -0
  147. package/examples/webxr-2/assets/audio/shellBounce.wav +0 -0
  148. package/examples/webxr-2/assets/audio/shellHit.wav +0 -0
  149. package/examples/webxr-2/assets/audio/shellKick.wav +0 -0
  150. package/examples/webxr-2/assets/audio/soccerBounce.wav +0 -0
  151. package/examples/webxr-2/assets/audio/soccerKick.mp3 +0 -0
  152. package/examples/webxr-2/assets/images/shellTexture.png +0 -0
  153. package/examples/webxr-2/components/bs-ankle.js +337 -0
  154. package/examples/webxr-2/components/coin.js +84 -0
  155. package/examples/webxr-2/components/custom-wrap.js +17 -0
  156. package/examples/webxr-2/components/goomba.js +3250 -0
  157. package/examples/webxr-2/components/init-shell-material.js +215 -0
  158. package/examples/webxr-2/components/platter.js +172 -0
  159. package/examples/webxr-2/components/shell.js +374 -0
  160. package/examples/webxr-2/components/soccer-ball.js +250 -0
  161. package/examples/webxr-2/components/squashed-goomba.js +249 -0
  162. package/examples/webxr-2/edge-impulse-standalone.js +7228 -0
  163. package/examples/webxr-2/edge-impulse-standalone.wasm +0 -0
  164. package/examples/webxr-2/index.html +996 -0
  165. package/examples/webxr-2/kick.tflite +0 -0
  166. package/examples/webxr-2/kick2.tflite +0 -0
  167. package/examples/webxr-2/run-impulse.js +135 -0
  168. package/examples/webxr-2/script.js +384 -0
  169. package/package.json +2 -1
  170. package/src/.prettierrc +4 -0
  171. package/src/BS.ts +66 -9
  172. package/src/CameraManager.ts +499 -0
  173. package/src/Device.ts +620 -92
  174. package/src/DeviceInformationManager.ts +22 -11
  175. package/src/DeviceManager.ts +94 -25
  176. package/src/FileTransferManager.ts +146 -21
  177. package/src/FirmwareManager.ts +1 -1
  178. package/src/InformationManager.ts +62 -20
  179. package/src/TfliteManager.ts +172 -26
  180. package/src/WifiManager.ts +323 -0
  181. package/src/connection/BaseConnectionManager.ts +145 -30
  182. package/src/connection/ClientConnectionManager.ts +47 -11
  183. package/src/connection/bluetooth/BluetoothConnectionManager.ts +14 -3
  184. package/src/connection/bluetooth/NobleConnectionManager.ts +155 -42
  185. package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +104 -35
  186. package/src/connection/bluetooth/bluetoothUUIDs.ts +40 -13
  187. package/src/connection/udp/UDPConnectionManager.ts +356 -0
  188. package/src/connection/websocket/WebSocketConnectionManager.ts +282 -0
  189. package/src/devicePair/DevicePair.ts +145 -49
  190. package/src/devicePair/DevicePairPressureSensorDataManager.ts +72 -24
  191. package/src/devicePair/DevicePairSensorDataManager.ts +5 -5
  192. package/src/scanner/BaseScanner.ts +49 -11
  193. package/src/scanner/NobleScanner.ts +81 -17
  194. package/src/sensor/BarometerSensorDataManager.ts +1 -1
  195. package/src/sensor/MotionSensorDataManager.ts +22 -7
  196. package/src/sensor/PressureSensorDataManager.ts +47 -13
  197. package/src/sensor/SensorConfigurationManager.ts +75 -24
  198. package/src/sensor/SensorDataManager.ts +107 -26
  199. package/src/server/BaseClient.ts +192 -37
  200. package/src/server/BaseServer.ts +201 -43
  201. package/src/server/ServerUtils.ts +39 -9
  202. package/src/server/udp/UDPServer.ts +74 -23
  203. package/src/server/udp/UDPUtils.ts +9 -2
  204. package/src/server/websocket/WebSocketClient.ts +30 -9
  205. package/src/server/websocket/WebSocketServer.ts +1 -1
  206. package/src/server/websocket/WebSocketUtils.ts +4 -2
  207. package/src/utils/CenterOfPressureHelper.ts +5 -5
  208. package/src/utils/Console.ts +62 -9
  209. package/src/utils/MathUtils.ts +31 -1
  210. package/src/utils/ParseUtils.ts +25 -6
  211. package/src/utils/ThrottleUtils.ts +62 -0
  212. package/src/utils/Timer.ts +1 -1
  213. package/src/utils/checksum.ts +1 -1
  214. package/src/utils/mcumgr.js +1 -1
  215. package/src/vibration/VibrationManager.ts +166 -40
@@ -1,5 +1,9 @@
1
1
  import { createConsole } from "../utils/Console.ts";
2
- import EventDispatcher, { BoundEventListeners, Event, EventMap } from "../utils/EventDispatcher.ts";
2
+ import EventDispatcher, {
3
+ BoundEventListeners,
4
+ Event,
5
+ EventMap,
6
+ } from "../utils/EventDispatcher.ts";
3
7
  import {
4
8
  createServerMessage,
5
9
  ServerMessageTypes,
@@ -8,18 +12,49 @@ import {
8
12
  ServerMessageType,
9
13
  createDeviceMessage,
10
14
  } from "./ServerUtils.ts";
11
- import Device, { BoundDeviceEventListeners, DeviceEventMap, DeviceEventType } from "../Device.ts";
12
- import { addEventListeners, removeEventListeners } from "../utils/EventUtils.ts";
15
+ import Device, {
16
+ BoundDeviceEventListeners,
17
+ DeviceEventMap,
18
+ DeviceEventType,
19
+ RequiredInformationConnectionMessages,
20
+ } from "../Device.ts";
21
+ import {
22
+ addEventListeners,
23
+ removeEventListeners,
24
+ } from "../utils/EventUtils.ts";
13
25
  import scanner from "../scanner/Scanner.ts";
14
26
  import { parseMessage, parseStringFromDataView } from "../utils/ParseUtils.ts";
15
- import { ConnectionMessageType, ConnectionMessageTypes } from "../connection/BaseConnectionManager.ts";
16
- import { BoundScannerEventListeners, DiscoveredDevice, ScannerEventMap } from "../scanner/BaseScanner.ts";
27
+ import {
28
+ ConnectionMessageType,
29
+ ConnectionMessageTypes,
30
+ ConnectionType,
31
+ ConnectionTypes,
32
+ } from "../connection/BaseConnectionManager.ts";
33
+ import {
34
+ BoundScannerEventListeners,
35
+ DiscoveredDevice,
36
+ ScannerEventMap,
37
+ } from "../scanner/BaseScanner.ts";
17
38
  import { concatenateArrayBuffers } from "../utils/ArrayBufferUtils.ts";
18
- import DeviceManager, { DeviceManagerEventMap, BoundDeviceManagerEventListeners } from "../DeviceManager.ts";
19
-
20
- const _console = createConsole("BaseServer", { log: true });
21
-
22
- export const ServerEventTypes = ["clientConnected", "clientDisconnected"] as const;
39
+ import DeviceManager, {
40
+ DeviceManagerEventMap,
41
+ BoundDeviceManagerEventListeners,
42
+ } from "../DeviceManager.ts";
43
+ import { RequiredWifiMessageTypes } from "../WifiManager.ts";
44
+ import { DeviceInformationTypes } from "../DeviceInformationManager.ts";
45
+
46
+ const RequiredDeviceInformationMessageTypes: ConnectionMessageType[] = [
47
+ ...DeviceInformationTypes,
48
+ "batteryLevel",
49
+ ...RequiredInformationConnectionMessages,
50
+ ];
51
+
52
+ const _console = createConsole("BaseServer", { log: false });
53
+
54
+ export const ServerEventTypes = [
55
+ "clientConnected",
56
+ "clientDisconnected",
57
+ ] as const;
23
58
  export type ServerEventType = (typeof ServerEventTypes)[number];
24
59
 
25
60
  interface ServerEventMessages {
@@ -27,14 +62,33 @@ interface ServerEventMessages {
27
62
  clientDisconnected: { client: any };
28
63
  }
29
64
 
30
- export type ServerEventDispatcher = EventDispatcher<BaseServer, ServerEventType, ServerEventMessages>;
31
- export type ServerEvent = Event<BaseServer, ServerEventType, ServerEventMessages>;
32
- export type ServerEventMap = EventMap<BaseServer, ServerEventType, ServerEventMessages>;
33
- export type BoundServerEventListeners = BoundEventListeners<BaseServer, ServerEventType, ServerEventMessages>;
65
+ export type ServerEventDispatcher = EventDispatcher<
66
+ BaseServer,
67
+ ServerEventType,
68
+ ServerEventMessages
69
+ >;
70
+ export type ServerEvent = Event<
71
+ BaseServer,
72
+ ServerEventType,
73
+ ServerEventMessages
74
+ >;
75
+ export type ServerEventMap = EventMap<
76
+ BaseServer,
77
+ ServerEventType,
78
+ ServerEventMessages
79
+ >;
80
+ export type BoundServerEventListeners = BoundEventListeners<
81
+ BaseServer,
82
+ ServerEventType,
83
+ ServerEventMessages
84
+ >;
34
85
 
35
86
  abstract class BaseServer {
36
87
  // EVENT DISPATCHER
37
- protected eventDispatcher: ServerEventDispatcher = new EventDispatcher(this as BaseServer, ServerEventTypes);
88
+ protected eventDispatcher: ServerEventDispatcher = new EventDispatcher(
89
+ this as BaseServer,
90
+ ServerEventTypes
91
+ );
38
92
  get addEventListener() {
39
93
  return this.eventDispatcher.addEventListener;
40
94
  }
@@ -71,7 +125,8 @@ abstract class BaseServer {
71
125
  this.#ClearSensorConfigurationsWhenNoClients = newValue;
72
126
  }
73
127
 
74
- #clearSensorConfigurationsWhenNoClients = BaseServer.#ClearSensorConfigurationsWhenNoClients;
128
+ #clearSensorConfigurationsWhenNoClients =
129
+ BaseServer.#ClearSensorConfigurationsWhenNoClients;
75
130
  get clearSensorConfigurationsWhenNoClients() {
76
131
  return this.#clearSensorConfigurationsWhenNoClients;
77
132
  }
@@ -92,7 +147,10 @@ abstract class BaseServer {
92
147
  #onClientDisconnected(event: ServerEventMap["clientDisconnected"]) {
93
148
  const client = event.message.client;
94
149
  _console.log("onClientDisconnected");
95
- if (this.numberOfClients == 0 && this.clearSensorConfigurationsWhenNoClients) {
150
+ if (
151
+ this.numberOfClients == 0 &&
152
+ this.clearSensorConfigurationsWhenNoClients
153
+ ) {
96
154
  DeviceManager.ConnectedDevices.forEach((device) => {
97
155
  device.clearSensorConfiguration();
98
156
  device.setTfliteInferencingEnabled(false);
@@ -117,33 +175,51 @@ abstract class BaseServer {
117
175
  this.broadcastMessage(this.#isScanningAvailableMessage);
118
176
  }
119
177
  get #isScanningAvailableMessage() {
120
- return createServerMessage({ type: "isScanningAvailable", data: scanner!.isScanningAvailable });
178
+ return createServerMessage({
179
+ type: "isScanningAvailable",
180
+ data: scanner!.isScanningAvailable,
181
+ });
121
182
  }
122
183
 
123
184
  #onScannerIsScanning(event: ScannerEventMap["isScanning"]) {
124
185
  this.broadcastMessage(this.#isScanningMessage);
125
186
  }
126
187
  get #isScanningMessage() {
127
- return createServerMessage({ type: "isScanning", data: scanner!.isScanning });
188
+ return createServerMessage({
189
+ type: "isScanning",
190
+ data: scanner!.isScanning,
191
+ });
128
192
  }
129
193
 
130
194
  #onScannerDiscoveredDevice(event: ScannerEventMap["discoveredDevice"]) {
131
195
  const { discoveredDevice } = event.message;
132
196
  _console.log(discoveredDevice);
133
197
 
134
- this.broadcastMessage(this.#createDiscoveredDeviceMessage(discoveredDevice));
198
+ this.broadcastMessage(
199
+ this.#createDiscoveredDeviceMessage(discoveredDevice)
200
+ );
135
201
  }
136
202
  #createDiscoveredDeviceMessage(discoveredDevice: DiscoveredDevice) {
137
- return createServerMessage({ type: "discoveredDevice", data: discoveredDevice });
203
+ return createServerMessage({
204
+ type: "discoveredDevice",
205
+ data: discoveredDevice,
206
+ });
138
207
  }
139
208
 
140
- #onExpiredDiscoveredDevice(event: ScannerEventMap["expiredDiscoveredDevice"]) {
209
+ #onExpiredDiscoveredDevice(
210
+ event: ScannerEventMap["expiredDiscoveredDevice"]
211
+ ) {
141
212
  const { discoveredDevice } = event.message;
142
213
  _console.log("expired", discoveredDevice);
143
- this.broadcastMessage(this.#createExpiredDiscoveredDeviceMessage(discoveredDevice));
214
+ this.broadcastMessage(
215
+ this.#createExpiredDiscoveredDeviceMessage(discoveredDevice)
216
+ );
144
217
  }
145
218
  #createExpiredDiscoveredDeviceMessage(discoveredDevice: DiscoveredDevice) {
146
- return createServerMessage({ type: "expiredDiscoveredDevice", data: discoveredDevice.bluetoothId });
219
+ return createServerMessage({
220
+ type: "expiredDiscoveredDevice",
221
+ data: discoveredDevice.bluetoothId,
222
+ });
147
223
  }
148
224
 
149
225
  get #discoveredDevicesMessage() {
@@ -163,7 +239,11 @@ abstract class BaseServer {
163
239
  get #connectedDevicesMessage() {
164
240
  return createServerMessage({
165
241
  type: "connectedDevices",
166
- data: JSON.stringify({ connectedDevices: DeviceManager.ConnectedDevices.map((device) => device.bluetoothId) }),
242
+ data: JSON.stringify({
243
+ connectedDevices: DeviceManager.ConnectedDevices.map(
244
+ (device) => device.bluetoothId
245
+ ),
246
+ }),
167
247
  });
168
248
  }
169
249
 
@@ -173,10 +253,14 @@ abstract class BaseServer {
173
253
  connectionMessage: this.#onDeviceConnectionMessage.bind(this),
174
254
  };
175
255
 
176
- #createDeviceMessage(device: Device, messageType: ConnectionMessageType, dataView?: DataView): DeviceMessage {
256
+ #createDeviceMessage(
257
+ device: Device,
258
+ messageType: ConnectionMessageType,
259
+ dataView?: DataView
260
+ ): DeviceMessage {
177
261
  return {
178
262
  type: messageType as DeviceEventType,
179
- data: dataView || device.latestConnectionMessage.get(messageType),
263
+ data: dataView || device.latestConnectionMessages.get(messageType),
180
264
  };
181
265
  }
182
266
 
@@ -191,7 +275,10 @@ abstract class BaseServer {
191
275
  const { messageType, dataView } = message;
192
276
 
193
277
  this.broadcastMessage(
194
- this.#createDeviceServerMessage(device, this.#createDeviceMessage(device, messageType, dataView))
278
+ this.#createDeviceServerMessage(
279
+ device,
280
+ this.#createDeviceMessage(device, messageType, dataView)
281
+ )
195
282
  );
196
283
  }
197
284
 
@@ -202,26 +289,35 @@ abstract class BaseServer {
202
289
  deviceIsConnected: this.#onDeviceIsConnected.bind(this),
203
290
  };
204
291
 
205
- #onDeviceConnected(staticDeviceEvent: DeviceManagerEventMap["deviceConnected"]) {
292
+ #onDeviceConnected(
293
+ staticDeviceEvent: DeviceManagerEventMap["deviceConnected"]
294
+ ) {
206
295
  const { device } = staticDeviceEvent.message;
207
296
  _console.log("onDeviceConnected", device.bluetoothId);
208
297
  addEventListeners(device, this.#boundDeviceListeners);
209
298
  device.isServerSide = true;
210
299
  }
211
300
 
212
- #onDeviceDisconnected(staticDeviceEvent: DeviceManagerEventMap["deviceDisconnected"]) {
301
+ #onDeviceDisconnected(
302
+ staticDeviceEvent: DeviceManagerEventMap["deviceDisconnected"]
303
+ ) {
213
304
  const { device } = staticDeviceEvent.message;
214
305
  _console.log("onDeviceDisconnected", device.bluetoothId);
215
306
  removeEventListeners(device, this.#boundDeviceListeners);
216
307
  }
217
308
 
218
- #onDeviceIsConnected(staticDeviceEvent: DeviceManagerEventMap["deviceIsConnected"]) {
309
+ #onDeviceIsConnected(
310
+ staticDeviceEvent: DeviceManagerEventMap["deviceIsConnected"]
311
+ ) {
219
312
  const { device } = staticDeviceEvent.message;
220
313
  _console.log("onDeviceIsConnected", device.bluetoothId);
221
314
  this.broadcastMessage(this.#createDeviceIsConnectedMessage(device));
222
315
  }
223
316
  #createDeviceIsConnectedMessage(device: Device) {
224
- return this.#createDeviceServerMessage(device, { type: "isConnected", data: device.isConnected });
317
+ return this.#createDeviceServerMessage(device, {
318
+ type: "isConnected",
319
+ data: device.isConnected,
320
+ });
225
321
  }
226
322
 
227
323
  #createDeviceServerMessage(device: Device, ...messages: DeviceMessage[]) {
@@ -235,7 +331,13 @@ abstract class BaseServer {
235
331
  protected parseClientMessage(dataView: DataView) {
236
332
  let responseMessages: ArrayBuffer[] = [];
237
333
 
238
- parseMessage(dataView, ServerMessageTypes, this.#onClientMessage.bind(this), { responseMessages }, true);
334
+ parseMessage(
335
+ dataView,
336
+ ServerMessageTypes,
337
+ this.#onClientMessage.bind(this),
338
+ { responseMessages },
339
+ true
340
+ );
239
341
 
240
342
  responseMessages = responseMessages.filter(Boolean);
241
343
 
@@ -244,7 +346,14 @@ abstract class BaseServer {
244
346
  }
245
347
  }
246
348
 
247
- #onClientMessage(messageType: ServerMessageType, dataView: DataView, context: { responseMessages: ArrayBuffer[] }) {
349
+ #onClientMessage(
350
+ messageType: ServerMessageType,
351
+ dataView: DataView,
352
+ context: { responseMessages: ArrayBuffer[] }
353
+ ) {
354
+ _console.log(
355
+ `onClientMessage "${messageType}" (${dataView.byteLength} bytes)`
356
+ );
248
357
  const { responseMessages } = context;
249
358
  switch (messageType) {
250
359
  case "isScanningAvailable":
@@ -264,14 +373,22 @@ abstract class BaseServer {
264
373
  break;
265
374
  case "connectToDevice":
266
375
  {
267
- const { string: deviceId } = parseStringFromDataView(dataView);
268
- scanner!.connectToDevice(deviceId);
376
+ const { string: deviceId, byteOffset } =
377
+ parseStringFromDataView(dataView);
378
+ let connectionType = undefined;
379
+ if (byteOffset < dataView.byteLength) {
380
+ connectionType = ConnectionTypes[dataView.getUint8(byteOffset)];
381
+ _console.log(`connectToDevice via ${connectionType}`);
382
+ }
383
+ scanner!.connectToDevice(deviceId, connectionType);
269
384
  }
270
385
  break;
271
386
  case "disconnectFromDevice":
272
387
  {
273
388
  const { string: deviceId } = parseStringFromDataView(dataView);
274
- const device = DeviceManager.ConnectedDevices.find((device) => device.bluetoothId == deviceId);
389
+ const device = DeviceManager.ConnectedDevices.find(
390
+ (device) => device.bluetoothId == deviceId
391
+ );
275
392
  if (!device) {
276
393
  _console.error(`no device found with id ${deviceId}`);
277
394
  break;
@@ -284,14 +401,51 @@ abstract class BaseServer {
284
401
  break;
285
402
  case "deviceMessage":
286
403
  {
287
- const { string: deviceId, byteOffset } = parseStringFromDataView(dataView);
288
- const device = DeviceManager.ConnectedDevices.find((device) => device.bluetoothId == deviceId);
404
+ const { string: deviceId, byteOffset } =
405
+ parseStringFromDataView(dataView);
406
+ const device = DeviceManager.ConnectedDevices.find(
407
+ (device) => device.bluetoothId == deviceId
408
+ );
289
409
  if (!device) {
290
410
  _console.error(`no device found with id ${deviceId}`);
291
411
  break;
292
412
  }
293
- const _dataView = new DataView(dataView.buffer, dataView.byteOffset + byteOffset);
294
- const responseMessage = this.parseClientDeviceMessage(device, _dataView);
413
+ const _dataView = new DataView(
414
+ dataView.buffer,
415
+ dataView.byteOffset + byteOffset
416
+ );
417
+ const responseMessage = this.parseClientDeviceMessage(
418
+ device,
419
+ _dataView
420
+ );
421
+ if (responseMessage) {
422
+ responseMessages.push(responseMessage);
423
+ }
424
+ }
425
+ break;
426
+ case "requiredDeviceInformation":
427
+ {
428
+ const { string: deviceId } = parseStringFromDataView(dataView);
429
+ const device = DeviceManager.ConnectedDevices.find(
430
+ (device) => device.bluetoothId == deviceId
431
+ );
432
+ if (!device) {
433
+ _console.error(`no device found with id ${deviceId}`);
434
+ break;
435
+ }
436
+
437
+ const messages = RequiredDeviceInformationMessageTypes.map(
438
+ (messageType) => this.#createDeviceMessage(device, messageType)
439
+ );
440
+ if (device.isWifiAvailable) {
441
+ RequiredWifiMessageTypes.forEach((messageType) => {
442
+ messages.push(this.#createDeviceMessage(device, messageType));
443
+ });
444
+ }
445
+ const responseMessage = this.#createDeviceServerMessage(
446
+ device,
447
+ ...messages
448
+ );
295
449
  if (responseMessage) {
296
450
  responseMessages.push(responseMessage);
297
451
  }
@@ -326,7 +480,9 @@ abstract class BaseServer {
326
480
  dataView: DataView,
327
481
  context: { responseMessages: DeviceMessage[]; device: Device }
328
482
  ) {
329
- _console.log(`clientDeviceMessage ${messageType} (${dataView.byteLength} bytes)`);
483
+ _console.log(
484
+ `clientDeviceMessage ${messageType} (${dataView.byteLength} bytes)`
485
+ );
330
486
  switch (messageType) {
331
487
  case "smp":
332
488
  context.device.connectionManager!.sendSmpMessage(dataView.buffer);
@@ -335,7 +491,9 @@ abstract class BaseServer {
335
491
  context.device.connectionManager!.sendTxData(dataView.buffer);
336
492
  break;
337
493
  default:
338
- context.responseMessages.push(this.#createDeviceMessage(context.device, messageType));
494
+ context.responseMessages.push(
495
+ this.#createDeviceMessage(context.device, messageType)
496
+ );
339
497
  break;
340
498
  }
341
499
  }
@@ -1,5 +1,8 @@
1
1
  import { DeviceEventTypes } from "../Device.ts";
2
- import { ConnectionMessageType, ConnectionMessageTypes } from "../connection/BaseConnectionManager.ts";
2
+ import {
3
+ ConnectionMessageType,
4
+ ConnectionMessageTypes,
5
+ } from "../connection/BaseConnectionManager.ts";
3
6
  import { concatenateArrayBuffers } from "../utils/ArrayBufferUtils.ts";
4
7
  import { createConsole } from "../utils/Console.ts";
5
8
  import { DeviceEventType } from "../Device.ts";
@@ -18,15 +21,29 @@ export const ServerMessageTypes = [
18
21
  "disconnectFromDevice",
19
22
  "connectedDevices",
20
23
  "deviceMessage",
24
+ "requiredDeviceInformation",
21
25
  ] as const;
22
26
  export type ServerMessageType = (typeof ServerMessageTypes)[number];
23
27
 
24
- export const DeviceMessageTypes = ["connectionStatus", "batteryLevel", "deviceInformation", "rx", "smp"] as const;
28
+ export const DeviceMessageTypes = [
29
+ "connectionStatus",
30
+ "batteryLevel",
31
+ "deviceInformation",
32
+ "rx",
33
+ "smp",
34
+ ] as const;
25
35
  export type DeviceMessageType = (typeof DeviceMessageTypes)[number];
26
36
 
27
37
  // MESSAGING
28
38
 
29
- export type MessageLike = number | number[] | ArrayBufferLike | DataView | boolean | string | any;
39
+ export type MessageLike =
40
+ | number
41
+ | number[]
42
+ | ArrayBufferLike
43
+ | DataView
44
+ | boolean
45
+ | string
46
+ | any;
30
47
 
31
48
  export interface Message<MessageType extends string> {
32
49
  type: MessageType;
@@ -59,9 +76,17 @@ export function createMessage<MessageType extends string>(
59
76
  const messageTypeEnum = enumeration.indexOf(message.type);
60
77
 
61
78
  const messageDataLengthDataView = new DataView(new ArrayBuffer(2));
62
- messageDataLengthDataView.setUint16(0, messageDataArrayBufferByteLength, true);
63
-
64
- return concatenateArrayBuffers(messageTypeEnum, messageDataLengthDataView, messageDataArrayBuffer);
79
+ messageDataLengthDataView.setUint16(
80
+ 0,
81
+ messageDataArrayBufferByteLength,
82
+ true
83
+ );
84
+
85
+ return concatenateArrayBuffers(
86
+ messageTypeEnum,
87
+ messageDataLengthDataView,
88
+ messageDataArrayBuffer
89
+ );
65
90
  });
66
91
  _console.log("messageBuffers", ...messageBuffers);
67
92
  return concatenateArrayBuffers(...messageBuffers);
@@ -79,15 +104,20 @@ export function createDeviceMessage(...messages: DeviceMessage[]) {
79
104
  return createMessage(DeviceEventTypes, ...messages);
80
105
  }
81
106
 
82
- export type ClientDeviceMessage = ConnectionMessageType | Message<ConnectionMessageType>;
107
+ export type ClientDeviceMessage =
108
+ | ConnectionMessageType
109
+ | Message<ConnectionMessageType>;
83
110
  export function createClientDeviceMessage(...messages: ClientDeviceMessage[]) {
84
111
  _console.log("createClientDeviceMessage", ...messages);
85
112
  return createMessage(ConnectionMessageTypes, ...messages);
86
113
  }
87
114
 
88
115
  // STATIC MESSAGES
89
- export const isScanningAvailableRequestMessage = createServerMessage("isScanningAvailable");
116
+ export const isScanningAvailableRequestMessage = createServerMessage(
117
+ "isScanningAvailable"
118
+ );
90
119
  export const isScanningRequestMessage = createServerMessage("isScanning");
91
120
  export const startScanRequestMessage = createServerMessage("startScan");
92
121
  export const stopScanRequestMessage = createServerMessage("stopScan");
93
- export const discoveredDevicesMessage = createServerMessage("discoveredDevices");
122
+ export const discoveredDevicesMessage =
123
+ createServerMessage("discoveredDevices");
@@ -1,6 +1,12 @@
1
- import { concatenateArrayBuffers, dataToArrayBuffer } from "../../utils/ArrayBufferUtils.ts";
1
+ import {
2
+ concatenateArrayBuffers,
3
+ dataToArrayBuffer,
4
+ } from "../../utils/ArrayBufferUtils.ts";
2
5
  import { createConsole } from "../../utils/Console.ts";
3
- import { addEventListeners, removeEventListeners } from "../../utils/EventUtils.ts";
6
+ import {
7
+ addEventListeners,
8
+ removeEventListeners,
9
+ } from "../../utils/EventUtils.ts";
4
10
  import { parseMessage } from "../../utils/ParseUtils.ts";
5
11
  import BaseServer from "../BaseServer.ts";
6
12
  import {
@@ -11,13 +17,13 @@ import {
11
17
  UDPServerMessageType,
12
18
  UDPServerMessageTypes,
13
19
  } from "./UDPUtils.ts";
20
+ import Timer from "../../utils/Timer.ts";
14
21
 
15
22
  /** NODE_START */
16
23
  import type * as dgram from "dgram";
17
- import Timer from "../../utils/Timer.ts";
18
24
  /** NODE_END */
19
25
 
20
- const _console = createConsole("UDPServer", { log: true });
26
+ const _console = createConsole("UDPServer", { log: false });
21
27
 
22
28
  interface UDPClient extends dgram.RemoteInfo {
23
29
  receivePort?: number;
@@ -38,14 +44,22 @@ class UDPServer extends BaseServer {
38
44
  return this.#clients.length;
39
45
  }
40
46
 
41
- #getClientByRemoteInfo(remoteInfo: dgram.RemoteInfo, createIfNotFound = false) {
47
+ #getClientByRemoteInfo(
48
+ remoteInfo: dgram.RemoteInfo,
49
+ createIfNotFound = false
50
+ ) {
42
51
  const { address, port } = remoteInfo;
43
- let client = this.#clients.find((client) => client.address == address && client.port == port);
52
+ let client = this.#clients.find(
53
+ (client) => client.address == address && client.port == port
54
+ );
44
55
  if (!client && createIfNotFound) {
45
56
  client = {
46
57
  ...remoteInfo,
47
58
  isAlive: true,
48
- removeSelfTimer: new Timer(() => this.#removeClient(client!), removeUDPClientTimeout),
59
+ removeSelfTimer: new Timer(
60
+ () => this.#removeClient(client!),
61
+ removeUDPClientTimeout
62
+ ),
49
63
  lastTimeSentData: 0,
50
64
  };
51
65
  _console.log("created new client", client);
@@ -114,7 +128,11 @@ class UDPServer extends BaseServer {
114
128
  _console.log(`socket listening on port ${address.address}:${address.port}`);
115
129
  }
116
130
  #onSocketMessage(message: Buffer, remoteInfo: dgram.RemoteInfo) {
117
- _console.log(`received ${message.length} bytes from ${this.#remoteInfoToString(remoteInfo)}`);
131
+ _console.log(
132
+ `received ${message.length} bytes from ${this.#remoteInfoToString(
133
+ remoteInfo
134
+ )}`
135
+ );
118
136
  const client = this.#getClientByRemoteInfo(remoteInfo, true);
119
137
  if (!client) {
120
138
  _console.error("no client found");
@@ -127,7 +145,12 @@ class UDPServer extends BaseServer {
127
145
 
128
146
  // PARSING
129
147
  #onClientData(client: UDPClient, dataView: DataView) {
130
- _console.log(`parsing ${dataView.byteLength} bytes from ${this.#clientToString(client)}`, dataView.buffer);
148
+ _console.log(
149
+ `parsing ${dataView.byteLength} bytes from ${this.#clientToString(
150
+ client
151
+ )}`,
152
+ dataView.buffer
153
+ );
131
154
  let responseMessages: ArrayBuffer[] = [];
132
155
  parseMessage(
133
156
  dataView,
@@ -153,9 +176,15 @@ class UDPServer extends BaseServer {
153
176
  _console.log(`responding with ${response.byteLength} bytes...`, response);
154
177
  this.#sendToClient(client, response);
155
178
  }
156
- #onClientUDPMessage(messageType: UDPServerMessageType, dataView: DataView, context: UDPClientContext) {
179
+ #onClientUDPMessage(
180
+ messageType: UDPServerMessageType,
181
+ dataView: DataView,
182
+ context: UDPClientContext
183
+ ) {
157
184
  const { client, responseMessages } = context;
158
- _console.log(`received "${messageType}" message from ${client.address}:${client.port}`);
185
+ _console.log(
186
+ `received "${messageType}" message from ${client.address}:${client.port}`
187
+ );
159
188
  switch (messageType) {
160
189
  case "ping":
161
190
  responseMessages.push(this.#createPongMessage(context));
@@ -168,7 +197,12 @@ class UDPServer extends BaseServer {
168
197
  case "serverMessage":
169
198
  const responseMessage = this.parseClientMessage(dataView);
170
199
  if (responseMessage) {
171
- responseMessages.push(createUDPServerMessage({ type: "serverMessage", data: responseMessage }));
200
+ responseMessages.push(
201
+ createUDPServerMessage({
202
+ type: "serverMessage",
203
+ data: responseMessage,
204
+ })
205
+ );
172
206
  }
173
207
  break;
174
208
 
@@ -187,24 +221,38 @@ class UDPServer extends BaseServer {
187
221
  #parseRemoteReceivePort(dataView: DataView, client: UDPClient) {
188
222
  const receivePort = dataView.getUint16(0);
189
223
  client.receivePort = receivePort;
190
- _console.log(`updated ${client.address}:${client.port} receivePort to ${receivePort}`);
224
+ _console.log(
225
+ `updated ${client.address}:${client.port} receivePort to ${receivePort}`
226
+ );
191
227
  const responseDataView = new DataView(new ArrayBuffer(2));
192
228
  responseDataView.setUint16(0, client.receivePort);
193
- return createUDPServerMessage({ type: "setRemoteReceivePort", data: responseDataView });
229
+ return createUDPServerMessage({
230
+ type: "setRemoteReceivePort",
231
+ data: responseDataView,
232
+ });
194
233
  }
195
234
 
196
235
  // CLIENT MESSAGING
197
236
  #sendToClient(client: UDPClient, message: ArrayBuffer) {
198
- _console.log(`sending ${message.byteLength} bytes to ${this.#clientToString(client)}...`);
237
+ _console.log(
238
+ `sending ${message.byteLength} bytes to ${this.#clientToString(
239
+ client
240
+ )}...`
241
+ );
199
242
  try {
200
- this.#socket!.send(new Uint8Array(message), client.receivePort, client.address, (error, bytes) => {
201
- if (error) {
202
- _console.error("error sending data", error);
203
- return;
243
+ this.#socket!.send(
244
+ new Uint8Array(message),
245
+ client.receivePort,
246
+ client.address,
247
+ (error, bytes) => {
248
+ if (error) {
249
+ _console.error("error sending data", error);
250
+ return;
251
+ }
252
+ _console.log(`sent ${bytes} bytes`);
253
+ client.lastTimeSentData = Date.now();
204
254
  }
205
- _console.log(`sent ${bytes} bytes`);
206
- client.lastTimeSentData = Date.now();
207
- });
255
+ );
208
256
  } catch (error) {
209
257
  _console.error("serious error sending data", error);
210
258
  }
@@ -212,7 +260,10 @@ class UDPServer extends BaseServer {
212
260
  broadcastMessage(message: ArrayBuffer) {
213
261
  super.broadcastMessage(message);
214
262
  this.#clients.forEach((client) => {
215
- this.#sendToClient(client, createUDPServerMessage({ type: "serverMessage", data: message }));
263
+ this.#sendToClient(
264
+ client,
265
+ createUDPServerMessage({ type: "serverMessage", data: message })
266
+ );
216
267
  });
217
268
  }
218
269
 
@@ -6,10 +6,17 @@ const _console = createConsole("UDPUtils", { log: false });
6
6
  export const pongUDPClientTimeout = 2_000;
7
7
  export const removeUDPClientTimeout = 3_000;
8
8
 
9
- export const UDPServerMessageTypes = ["ping", "pong", "setRemoteReceivePort", "serverMessage"] as const;
9
+ export const UDPServerMessageTypes = [
10
+ "ping",
11
+ "pong",
12
+ "setRemoteReceivePort",
13
+ "serverMessage",
14
+ ] as const;
10
15
  export type UDPServerMessageType = (typeof UDPServerMessageTypes)[number];
11
16
 
12
- export type UDPServerMessage = UDPServerMessageType | Message<UDPServerMessageType>;
17
+ export type UDPServerMessage =
18
+ | UDPServerMessageType
19
+ | Message<UDPServerMessageType>;
13
20
  export function createUDPServerMessage(...messages: UDPServerMessage[]) {
14
21
  _console.log("createUDPServerMessage", ...messages);
15
22
  return createMessage(UDPServerMessageTypes, ...messages);