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.
- package/README.md +16 -10
- package/assets/3d/anchor.glb +0 -0
- package/assets/3d/coin.glb +0 -0
- package/assets/3d/glasses.glb +0 -0
- package/assets/3d/rightHand.glb +0 -0
- package/assets/audio/bounceMedium.wav +0 -0
- package/assets/audio/bounceStrong.wav +0 -0
- package/assets/audio/bounceWeak.wav +0 -0
- package/assets/audio/coin.wav +0 -0
- package/assets/audio/getUp.wav +0 -0
- package/assets/audio/grab.wav +0 -0
- package/assets/audio/kick.wav +0 -0
- package/assets/audio/platterFadeIn old.wav +0 -0
- package/assets/audio/platterFadeIn.wav +0 -0
- package/assets/audio/platterFadeOut.wav +0 -0
- package/assets/audio/punch.wav +0 -0
- package/assets/audio/punchSqueak.wav +0 -0
- package/assets/audio/purr.wav +0 -0
- package/assets/audio/purrFadeOut.wav +0 -0
- package/assets/audio/release.wav +0 -0
- package/assets/audio/splat.wav +0 -0
- package/assets/audio/stomp.wav +0 -0
- package/assets/images/ukaton-pressure-0.svg +9 -0
- package/assets/images/ukaton-pressure-1.svg +9 -0
- package/assets/images/ukaton-pressure-10.svg +9 -0
- package/assets/images/ukaton-pressure-11.svg +9 -0
- package/assets/images/ukaton-pressure-12.svg +9 -0
- package/assets/images/ukaton-pressure-13.svg +9 -0
- package/assets/images/ukaton-pressure-14.svg +9 -0
- package/assets/images/ukaton-pressure-15.svg +9 -0
- package/assets/images/ukaton-pressure-2.svg +9 -0
- package/assets/images/ukaton-pressure-3.svg +9 -0
- package/assets/images/ukaton-pressure-4.svg +9 -0
- package/assets/images/ukaton-pressure-5.svg +9 -0
- package/assets/images/ukaton-pressure-6.svg +9 -0
- package/assets/images/ukaton-pressure-7.svg +9 -0
- package/assets/images/ukaton-pressure-8.svg +9 -0
- package/assets/images/ukaton-pressure-9.svg +9 -0
- package/assets/images/ukaton-right-insole.svg +798 -0
- package/build/brilliantsole.cjs +2870 -882
- package/build/brilliantsole.cjs.map +1 -1
- package/build/brilliantsole.js +2477 -782
- package/build/brilliantsole.js.map +1 -1
- package/build/brilliantsole.ls.js +2260 -592
- package/build/brilliantsole.ls.js.map +1 -1
- package/build/brilliantsole.min.js +1 -1
- package/build/brilliantsole.min.js.map +1 -1
- package/build/brilliantsole.module.d.ts +302 -116
- package/build/brilliantsole.module.js +2468 -782
- package/build/brilliantsole.module.js.map +1 -1
- package/build/brilliantsole.module.min.d.ts +302 -116
- package/build/brilliantsole.module.min.js +1 -1
- package/build/brilliantsole.module.min.js.map +1 -1
- package/build/brilliantsole.node.module.d.ts +295 -113
- package/build/brilliantsole.node.module.js +2860 -882
- package/build/brilliantsole.node.module.js.map +1 -1
- package/build/dts/BS-output.d.ts +10 -0
- package/build/dts/BS.d.ts +21 -9
- package/build/dts/CameraManager.d.ts +72 -0
- package/build/dts/Device.d.ts +53 -16
- package/build/dts/DeviceInformationManager.d.ts +4 -4
- package/build/dts/DeviceManager.d.ts +3 -0
- package/build/dts/FileTransferManager.d.ts +18 -8
- package/build/dts/InformationManager.d.ts +8 -5
- package/build/dts/TfliteManager.d.ts +22 -2
- package/build/dts/WifiManager.d.ts +61 -0
- package/build/dts/connection/BaseConnectionManager.d.ts +37 -3
- package/build/dts/connection/ClientConnectionManager.d.ts +11 -2
- package/build/dts/connection/bluetooth/BluetoothConnectionManager.d.ts +1 -0
- package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +3 -1
- package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +2 -0
- package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +2 -2
- package/build/dts/connection/udp/UDPConnectionManager.d.ts +28 -0
- package/build/dts/connection/webSocket/WebSocketConnectionManager.d.ts +25 -0
- package/build/dts/devicePair/DevicePair.d.ts +14 -10
- package/build/dts/devicePair/DevicePairPressureSensorDataManager.d.ts +8 -4
- package/build/dts/devicePair/DevicePairSensorDataManager.d.ts +2 -2
- package/build/dts/scanner/BaseScanner.d.ts +4 -1
- package/build/dts/scanner/NobleScanner.d.ts +2 -1
- package/build/dts/sensor/MotionSensorDataManager.d.ts +5 -2
- package/build/dts/sensor/SensorDataManager.d.ts +5 -4
- package/build/dts/server/BaseClient.d.ts +6 -3
- package/build/dts/server/ServerUtils.d.ts +1 -1
- package/build/dts/server/websocket/WebSocketUtils.d.ts +1 -1
- package/build/dts/utils/CenterOfPressureHelper.d.ts +2 -2
- package/build/dts/utils/Console.d.ts +2 -0
- package/build/dts/utils/MathUtils.d.ts +2 -0
- package/build/dts/utils/ThrottleUtils.d.ts +2 -0
- package/build/dts/vibration/VibrationManager.d.ts +19 -2
- package/build/index.d.ts +299 -113
- package/build/index.node.d.ts +292 -110
- package/examples/3d/scene.html +19 -5
- package/examples/3d/script.js +90 -17
- package/examples/3d-generic/index.html +144 -0
- package/examples/3d-generic/script.js +266 -0
- package/examples/balance/script.js +2 -1
- package/examples/basic/index.html +232 -18
- package/examples/basic/script.js +746 -106
- package/examples/bottango/index.html +11 -1
- package/examples/bottango/script.js +2 -2
- package/examples/center-of-pressure/index.html +114 -114
- package/examples/center-of-pressure/script.js +1 -1
- package/examples/device-pair/index.html +58 -58
- package/examples/device-pair/script.js +12 -8
- package/examples/edge-impulse/script.js +135 -44
- package/examples/edge-impulse-test/README.md +11 -0
- package/examples/edge-impulse-test/edge-impulse-standalone.js +7228 -0
- package/examples/edge-impulse-test/edge-impulse-standalone.wasm +0 -0
- package/examples/edge-impulse-test/index.html +75 -0
- package/examples/edge-impulse-test/run-impulse.js +135 -0
- package/examples/edge-impulse-test/script.js +200 -0
- package/examples/gloves/edge-impulse-standalone.js +7228 -0
- package/examples/gloves/edge-impulse-standalone.wasm +0 -0
- package/examples/gloves/index.html +119 -0
- package/examples/gloves/run-impulse.js +135 -0
- package/examples/gloves/scene.html +124 -0
- package/examples/gloves/script.js +931 -0
- package/examples/graph/index.html +11 -1
- package/examples/graph/script.js +94 -37
- package/examples/pressure/index.html +180 -12
- package/examples/pressure/script.js +144 -7
- package/examples/punch/index.html +135 -0
- package/examples/punch/punch.tflite +0 -0
- package/examples/punch/script.js +169 -0
- package/examples/recording/index.html +191 -183
- package/examples/server/index.html +109 -23
- package/examples/server/script.js +322 -111
- package/examples/ukaton-firmware-update/index.html +20 -0
- package/examples/ukaton-firmware-update/manifest.json +11 -0
- package/examples/ukaton-firmware-update/merged-firmware.bin +0 -0
- package/examples/utils/aframe/aframe-master.min.js +2 -0
- package/examples/utils/aframe/bs-vibration.js +150 -0
- package/examples/utils/aframe/force-pushable.js +80 -0
- package/examples/utils/aframe/grabbable-anchor.js +46 -0
- package/examples/utils/aframe/grabbable-listener.js +31 -0
- package/examples/utils/aframe/grabbable-physics-body.js +190 -0
- package/examples/utils/aframe/grow-shrink.js +25 -0
- package/examples/utils/aframe/hand-punch.js +119 -0
- package/examples/utils/aframe/my-obb-collider.js +293 -0
- package/examples/utils/aframe/occlude-hand-tracking-controls.js +47 -0
- package/examples/utils/aframe/occlude-mesh.js +42 -0
- package/examples/utils/aframe/palm-up-detector.js +47 -0
- package/examples/utils/aframe/shadow-material.js +20 -0
- package/examples/utils/aframe/soft-shadow-light.js +9 -0
- package/examples/webxr/script.js +3 -3
- package/examples/webxr-2/assets/3d/soccerBall.glb +0 -0
- package/examples/webxr-2/assets/audio/shellBounce.wav +0 -0
- package/examples/webxr-2/assets/audio/shellHit.wav +0 -0
- package/examples/webxr-2/assets/audio/shellKick.wav +0 -0
- package/examples/webxr-2/assets/audio/soccerBounce.wav +0 -0
- package/examples/webxr-2/assets/audio/soccerKick.mp3 +0 -0
- package/examples/webxr-2/assets/images/shellTexture.png +0 -0
- package/examples/webxr-2/components/bs-ankle.js +337 -0
- package/examples/webxr-2/components/coin.js +84 -0
- package/examples/webxr-2/components/custom-wrap.js +17 -0
- package/examples/webxr-2/components/goomba.js +3250 -0
- package/examples/webxr-2/components/init-shell-material.js +215 -0
- package/examples/webxr-2/components/platter.js +172 -0
- package/examples/webxr-2/components/shell.js +374 -0
- package/examples/webxr-2/components/soccer-ball.js +250 -0
- package/examples/webxr-2/components/squashed-goomba.js +249 -0
- package/examples/webxr-2/edge-impulse-standalone.js +7228 -0
- package/examples/webxr-2/edge-impulse-standalone.wasm +0 -0
- package/examples/webxr-2/index.html +996 -0
- package/examples/webxr-2/kick.tflite +0 -0
- package/examples/webxr-2/kick2.tflite +0 -0
- package/examples/webxr-2/run-impulse.js +135 -0
- package/examples/webxr-2/script.js +384 -0
- package/package.json +2 -1
- package/src/.prettierrc +4 -0
- package/src/BS.ts +66 -9
- package/src/CameraManager.ts +499 -0
- package/src/Device.ts +620 -92
- package/src/DeviceInformationManager.ts +22 -11
- package/src/DeviceManager.ts +94 -25
- package/src/FileTransferManager.ts +146 -21
- package/src/FirmwareManager.ts +1 -1
- package/src/InformationManager.ts +62 -20
- package/src/TfliteManager.ts +172 -26
- package/src/WifiManager.ts +323 -0
- package/src/connection/BaseConnectionManager.ts +145 -30
- package/src/connection/ClientConnectionManager.ts +47 -11
- package/src/connection/bluetooth/BluetoothConnectionManager.ts +14 -3
- package/src/connection/bluetooth/NobleConnectionManager.ts +155 -42
- package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +104 -35
- package/src/connection/bluetooth/bluetoothUUIDs.ts +40 -13
- package/src/connection/udp/UDPConnectionManager.ts +356 -0
- package/src/connection/websocket/WebSocketConnectionManager.ts +282 -0
- package/src/devicePair/DevicePair.ts +145 -49
- package/src/devicePair/DevicePairPressureSensorDataManager.ts +72 -24
- package/src/devicePair/DevicePairSensorDataManager.ts +5 -5
- package/src/scanner/BaseScanner.ts +49 -11
- package/src/scanner/NobleScanner.ts +81 -17
- package/src/sensor/BarometerSensorDataManager.ts +1 -1
- package/src/sensor/MotionSensorDataManager.ts +22 -7
- package/src/sensor/PressureSensorDataManager.ts +47 -13
- package/src/sensor/SensorConfigurationManager.ts +75 -24
- package/src/sensor/SensorDataManager.ts +107 -26
- package/src/server/BaseClient.ts +192 -37
- package/src/server/BaseServer.ts +201 -43
- package/src/server/ServerUtils.ts +39 -9
- package/src/server/udp/UDPServer.ts +74 -23
- package/src/server/udp/UDPUtils.ts +9 -2
- package/src/server/websocket/WebSocketClient.ts +30 -9
- package/src/server/websocket/WebSocketServer.ts +1 -1
- package/src/server/websocket/WebSocketUtils.ts +4 -2
- package/src/utils/CenterOfPressureHelper.ts +5 -5
- package/src/utils/Console.ts +62 -9
- package/src/utils/MathUtils.ts +31 -1
- package/src/utils/ParseUtils.ts +25 -6
- package/src/utils/ThrottleUtils.ts +62 -0
- package/src/utils/Timer.ts +1 -1
- package/src/utils/checksum.ts +1 -1
- package/src/utils/mcumgr.js +1 -1
- package/src/vibration/VibrationManager.ts +166 -40
package/src/server/BaseServer.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { createConsole } from "../utils/Console.ts";
|
|
2
|
-
import EventDispatcher, {
|
|
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, {
|
|
12
|
-
|
|
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 {
|
|
16
|
-
|
|
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, {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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<
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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(
|
|
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 =
|
|
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 (
|
|
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({
|
|
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({
|
|
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(
|
|
198
|
+
this.broadcastMessage(
|
|
199
|
+
this.#createDiscoveredDeviceMessage(discoveredDevice)
|
|
200
|
+
);
|
|
135
201
|
}
|
|
136
202
|
#createDiscoveredDeviceMessage(discoveredDevice: DiscoveredDevice) {
|
|
137
|
-
return createServerMessage({
|
|
203
|
+
return createServerMessage({
|
|
204
|
+
type: "discoveredDevice",
|
|
205
|
+
data: discoveredDevice,
|
|
206
|
+
});
|
|
138
207
|
}
|
|
139
208
|
|
|
140
|
-
#onExpiredDiscoveredDevice(
|
|
209
|
+
#onExpiredDiscoveredDevice(
|
|
210
|
+
event: ScannerEventMap["expiredDiscoveredDevice"]
|
|
211
|
+
) {
|
|
141
212
|
const { discoveredDevice } = event.message;
|
|
142
213
|
_console.log("expired", discoveredDevice);
|
|
143
|
-
this.broadcastMessage(
|
|
214
|
+
this.broadcastMessage(
|
|
215
|
+
this.#createExpiredDiscoveredDeviceMessage(discoveredDevice)
|
|
216
|
+
);
|
|
144
217
|
}
|
|
145
218
|
#createExpiredDiscoveredDeviceMessage(discoveredDevice: DiscoveredDevice) {
|
|
146
|
-
return createServerMessage({
|
|
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({
|
|
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(
|
|
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.
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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, {
|
|
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(
|
|
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(
|
|
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 } =
|
|
268
|
-
|
|
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(
|
|
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 } =
|
|
288
|
-
|
|
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(
|
|
294
|
-
|
|
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(
|
|
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(
|
|
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 {
|
|
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 = [
|
|
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 =
|
|
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(
|
|
63
|
-
|
|
64
|
-
|
|
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 =
|
|
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(
|
|
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 =
|
|
122
|
+
export const discoveredDevicesMessage =
|
|
123
|
+
createServerMessage("discoveredDevices");
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
concatenateArrayBuffers,
|
|
3
|
+
dataToArrayBuffer,
|
|
4
|
+
} from "../../utils/ArrayBufferUtils.ts";
|
|
2
5
|
import { createConsole } from "../../utils/Console.ts";
|
|
3
|
-
import {
|
|
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:
|
|
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(
|
|
47
|
+
#getClientByRemoteInfo(
|
|
48
|
+
remoteInfo: dgram.RemoteInfo,
|
|
49
|
+
createIfNotFound = false
|
|
50
|
+
) {
|
|
42
51
|
const { address, port } = remoteInfo;
|
|
43
|
-
let client = this.#clients.find(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
179
|
+
#onClientUDPMessage(
|
|
180
|
+
messageType: UDPServerMessageType,
|
|
181
|
+
dataView: DataView,
|
|
182
|
+
context: UDPClientContext
|
|
183
|
+
) {
|
|
157
184
|
const { client, responseMessages } = context;
|
|
158
|
-
_console.log(
|
|
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(
|
|
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(
|
|
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({
|
|
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(
|
|
237
|
+
_console.log(
|
|
238
|
+
`sending ${message.byteLength} bytes to ${this.#clientToString(
|
|
239
|
+
client
|
|
240
|
+
)}...`
|
|
241
|
+
);
|
|
199
242
|
try {
|
|
200
|
-
this.#socket!.send(
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
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(
|
|
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 = [
|
|
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 =
|
|
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);
|