brilliantsole 0.0.27 → 0.0.29
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/assets/3d/anchor.glb +0 -0
- package/assets/3d/coin.glb +0 -0
- package/assets/3d/glasses.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/build/brilliantsole.cjs +3091 -741
- package/build/brilliantsole.cjs.map +1 -1
- package/build/brilliantsole.js +2759 -709
- package/build/brilliantsole.js.map +1 -1
- package/build/brilliantsole.ls.js +2602 -543
- 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 +295 -65
- package/build/brilliantsole.module.js +2749 -710
- package/build/brilliantsole.module.js.map +1 -1
- package/build/brilliantsole.module.min.d.ts +295 -65
- package/build/brilliantsole.module.min.js +1 -1
- package/build/brilliantsole.module.min.js.map +1 -1
- package/build/brilliantsole.node.module.d.ts +289 -62
- package/build/brilliantsole.node.module.js +3080 -742
- 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 -8
- package/build/dts/CameraManager.d.ts +72 -0
- package/build/dts/Device.d.ts +64 -13
- package/build/dts/DeviceInformationManager.d.ts +4 -4
- package/build/dts/DeviceManager.d.ts +2 -0
- package/build/dts/FileTransferManager.d.ts +18 -8
- package/build/dts/InformationManager.d.ts +2 -0
- package/build/dts/MicrophoneManager.d.ts +88 -0
- package/build/dts/TfliteManager.d.ts +22 -2
- package/build/dts/WifiManager.d.ts +61 -0
- package/build/dts/connection/BaseConnectionManager.d.ts +35 -3
- package/build/dts/connection/ClientConnectionManager.d.ts +7 -2
- package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +2 -1
- package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +1 -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 +5 -5
- 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 +5 -3
- package/build/dts/server/ServerUtils.d.ts +1 -1
- package/build/dts/server/websocket/WebSocketUtils.d.ts +1 -1
- package/build/dts/utils/AudioUtils.d.ts +2 -0
- package/build/dts/utils/Console.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 +292 -62
- package/build/index.node.d.ts +286 -59
- package/examples/3d/scene.html +19 -5
- package/examples/3d-generic/index.html +144 -0
- package/examples/3d-generic/script.js +266 -0
- package/examples/basic/index.html +267 -17
- package/examples/basic/script.js +958 -105
- package/examples/camera/barcode-detector.js +109 -0
- package/examples/camera/depth-estimation.js +71 -0
- package/examples/camera/face-detector.js +119 -0
- package/examples/camera/face-landmark.js +111 -0
- package/examples/camera/gesture-recognition.js +97 -0
- package/examples/camera/hand-landmark.js +74 -0
- package/examples/camera/image-segmentation.js +98 -0
- package/examples/camera/image-to-text.js +43 -0
- package/examples/camera/image-upscale.js +75 -0
- package/examples/camera/index.html +129 -0
- package/examples/camera/object-detection.js +98 -0
- package/examples/camera/pose-landmark.js +60 -0
- package/examples/camera/script.js +316 -0
- package/examples/camera/utils.js +165 -0
- package/examples/camera/yolo-tiny.js +54 -0
- package/examples/camera/yolo.js +119 -0
- package/examples/edge-impulse/script.js +157 -48
- 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/glasses-gestures/README.md +11 -0
- package/examples/glasses-gestures/edge-impulse-standalone.js +7228 -0
- package/examples/glasses-gestures/edge-impulse-standalone.wasm +0 -0
- package/examples/glasses-gestures/index.html +69 -0
- package/examples/glasses-gestures/run-impulse.js +135 -0
- package/examples/glasses-gestures/script.js +226 -0
- package/examples/gloves/edge-impulse-standalone.js +7228 -0
- package/examples/gloves/edge-impulse-standalone.wasm +0 -0
- package/examples/gloves/index.html +4 -1
- package/examples/gloves/run-impulse.js +135 -0
- package/examples/gloves/script.js +367 -51
- package/examples/graph/script.js +94 -37
- package/examples/microphone/gender.js +54 -0
- package/examples/microphone/index.html +102 -0
- package/examples/microphone/script.js +394 -0
- package/examples/microphone/utils.js +45 -0
- package/examples/microphone/whisper-realtime.js +166 -0
- package/examples/microphone/whisper.js +132 -0
- package/examples/punch/index.html +135 -0
- package/examples/punch/punch.tflite +0 -0
- package/examples/punch/script.js +169 -0
- package/examples/server/index.html +98 -22
- package/examples/server/script.js +317 -109
- 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-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/examples/webxr-3/components/bs-camera.js +65 -0
- package/examples/webxr-3/index.html +134 -0
- package/examples/webxr-3/script.js +432 -0
- package/package.json +2 -1
- package/src/.prettierrc +4 -0
- package/src/BS.ts +79 -8
- package/src/CameraManager.ts +497 -0
- package/src/Device.ts +691 -86
- package/src/DeviceInformationManager.ts +19 -10
- package/src/DeviceManager.ts +85 -25
- package/src/FileTransferManager.ts +145 -20
- package/src/InformationManager.ts +40 -15
- package/src/MicrophoneManager.ts +599 -0
- package/src/TfliteManager.ts +171 -25
- package/src/WifiManager.ts +323 -0
- package/src/connection/BaseConnectionManager.ts +130 -30
- package/src/connection/ClientConnectionManager.ts +34 -10
- package/src/connection/bluetooth/BluetoothConnectionManager.ts +8 -2
- package/src/connection/bluetooth/NobleConnectionManager.ts +147 -41
- package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +99 -34
- 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 +95 -25
- package/src/devicePair/DevicePairPressureSensorDataManager.ts +27 -7
- package/src/scanner/BaseScanner.ts +49 -11
- package/src/scanner/NobleScanner.ts +76 -14
- package/src/sensor/MotionSensorDataManager.ts +21 -6
- package/src/sensor/PressureSensorDataManager.ts +37 -8
- package/src/sensor/SensorConfigurationManager.ts +73 -22
- package/src/sensor/SensorDataManager.ts +109 -23
- package/src/server/BaseClient.ts +150 -36
- package/src/server/BaseServer.ts +50 -2
- package/src/server/ServerUtils.ts +39 -9
- package/src/server/udp/UDPServer.ts +73 -22
- package/src/server/udp/UDPUtils.ts +9 -2
- package/src/server/websocket/WebSocketClient.ts +27 -7
- package/src/server/websocket/WebSocketUtils.ts +4 -2
- package/src/utils/AudioUtils.ts +65 -0
- package/src/utils/Console.ts +62 -9
- package/src/utils/ParseUtils.ts +24 -5
- package/src/utils/ThrottleUtils.ts +62 -0
- package/src/utils/Timer.ts +1 -1
- package/src/vibration/VibrationManager.ts +166 -40
package/src/server/BaseClient.ts
CHANGED
|
@@ -9,16 +9,36 @@ import {
|
|
|
9
9
|
ServerMessageType,
|
|
10
10
|
} from "./ServerUtils.ts";
|
|
11
11
|
import { parseMessage, parseStringFromDataView } from "../utils/ParseUtils.ts";
|
|
12
|
-
import EventDispatcher, {
|
|
12
|
+
import EventDispatcher, {
|
|
13
|
+
BoundEventListeners,
|
|
14
|
+
Event,
|
|
15
|
+
} from "../utils/EventDispatcher.ts";
|
|
13
16
|
import Device from "../Device.ts";
|
|
14
|
-
import {
|
|
15
|
-
|
|
17
|
+
import {
|
|
18
|
+
concatenateArrayBuffers,
|
|
19
|
+
sliceDataView,
|
|
20
|
+
stringToArrayBuffer,
|
|
21
|
+
} from "../utils/ArrayBufferUtils.ts";
|
|
22
|
+
import {
|
|
23
|
+
DiscoveredDevice,
|
|
24
|
+
DiscoveredDevicesMap,
|
|
25
|
+
ScannerEventMessages,
|
|
26
|
+
} from "../scanner/BaseScanner.ts";
|
|
16
27
|
import ClientConnectionManager from "../connection/ClientConnectionManager.ts";
|
|
17
28
|
import { DeviceManager } from "../BS.ts";
|
|
29
|
+
import {
|
|
30
|
+
ClientConnectionType,
|
|
31
|
+
ConnectionTypes,
|
|
32
|
+
} from "../connection/BaseConnectionManager.ts";
|
|
18
33
|
|
|
19
34
|
const _console = createConsole("BaseClient", { log: false });
|
|
20
35
|
|
|
21
|
-
export const ClientConnectionStatuses = [
|
|
36
|
+
export const ClientConnectionStatuses = [
|
|
37
|
+
"notConnected",
|
|
38
|
+
"connecting",
|
|
39
|
+
"connected",
|
|
40
|
+
"disconnecting",
|
|
41
|
+
] as const;
|
|
22
42
|
export type ClientConnectionStatus = (typeof ClientConnectionStatuses)[number];
|
|
23
43
|
|
|
24
44
|
export const ClientEventTypes = [
|
|
@@ -37,11 +57,24 @@ interface ClientConnectionEventMessages {
|
|
|
37
57
|
isConnected: { isConnected: boolean };
|
|
38
58
|
}
|
|
39
59
|
|
|
40
|
-
export type ClientEventMessages = ClientConnectionEventMessages &
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export type
|
|
44
|
-
|
|
60
|
+
export type ClientEventMessages = ClientConnectionEventMessages &
|
|
61
|
+
ScannerEventMessages;
|
|
62
|
+
|
|
63
|
+
export type ClientEventDispatcher = EventDispatcher<
|
|
64
|
+
BaseClient,
|
|
65
|
+
ClientEventType,
|
|
66
|
+
ClientEventMessages
|
|
67
|
+
>;
|
|
68
|
+
export type ClientEvent = Event<
|
|
69
|
+
BaseClient,
|
|
70
|
+
ClientEventType,
|
|
71
|
+
ClientEventMessages
|
|
72
|
+
>;
|
|
73
|
+
export type BoundClientEventListeners = BoundEventListeners<
|
|
74
|
+
BaseClient,
|
|
75
|
+
ClientEventType,
|
|
76
|
+
ClientEventMessages
|
|
77
|
+
>;
|
|
45
78
|
|
|
46
79
|
export type ServerURL = string | URL;
|
|
47
80
|
|
|
@@ -57,7 +90,8 @@ abstract class BaseClient {
|
|
|
57
90
|
this.#isScanning = false;
|
|
58
91
|
for (const id in this.#devices) {
|
|
59
92
|
const device = this.#devices[id];
|
|
60
|
-
const connectionManager =
|
|
93
|
+
const connectionManager =
|
|
94
|
+
device.connectionManager! as ClientConnectionManager;
|
|
61
95
|
connectionManager.isConnected = false;
|
|
62
96
|
//device.removeAllEventListeners();
|
|
63
97
|
}
|
|
@@ -71,7 +105,10 @@ abstract class BaseClient {
|
|
|
71
105
|
return this.#devices;
|
|
72
106
|
}
|
|
73
107
|
|
|
74
|
-
#eventDispatcher: ClientEventDispatcher = new EventDispatcher(
|
|
108
|
+
#eventDispatcher: ClientEventDispatcher = new EventDispatcher(
|
|
109
|
+
this as BaseClient,
|
|
110
|
+
ClientEventTypes
|
|
111
|
+
);
|
|
75
112
|
get addEventListener() {
|
|
76
113
|
return this.#eventDispatcher.addEventListener;
|
|
77
114
|
}
|
|
@@ -109,7 +146,8 @@ abstract class BaseClient {
|
|
|
109
146
|
this._reconnectOnDisconnection = newReconnectOnDisconnection;
|
|
110
147
|
}
|
|
111
148
|
|
|
112
|
-
protected _reconnectOnDisconnection =
|
|
149
|
+
protected _reconnectOnDisconnection =
|
|
150
|
+
this.baseConstructor.ReconnectOnDisconnection;
|
|
113
151
|
get reconnectOnDisconnection() {
|
|
114
152
|
return this._reconnectOnDisconnection;
|
|
115
153
|
}
|
|
@@ -130,7 +168,9 @@ abstract class BaseClient {
|
|
|
130
168
|
_console.log({ newConnectionStatus });
|
|
131
169
|
this.#_connectionStatus = newConnectionStatus;
|
|
132
170
|
|
|
133
|
-
this.dispatchEvent("connectionStatus", {
|
|
171
|
+
this.dispatchEvent("connectionStatus", {
|
|
172
|
+
connectionStatus: this.connectionStatus,
|
|
173
|
+
});
|
|
134
174
|
this.dispatchEvent(this.connectionStatus, {});
|
|
135
175
|
|
|
136
176
|
switch (newConnectionStatus) {
|
|
@@ -149,7 +189,11 @@ abstract class BaseClient {
|
|
|
149
189
|
return this._connectionStatus;
|
|
150
190
|
}
|
|
151
191
|
|
|
152
|
-
static #RequiredMessageTypes: ServerMessage[] = [
|
|
192
|
+
static #RequiredMessageTypes: ServerMessage[] = [
|
|
193
|
+
"isScanningAvailable",
|
|
194
|
+
"discoveredDevices",
|
|
195
|
+
"connectedDevices",
|
|
196
|
+
];
|
|
153
197
|
get #requiredMessageTypes(): ServerMessage[] {
|
|
154
198
|
return BaseClient.#RequiredMessageTypes;
|
|
155
199
|
}
|
|
@@ -183,7 +227,13 @@ abstract class BaseClient {
|
|
|
183
227
|
|
|
184
228
|
protected parseMessage(dataView: DataView) {
|
|
185
229
|
_console.log("parseMessage", { dataView });
|
|
186
|
-
parseMessage(
|
|
230
|
+
parseMessage(
|
|
231
|
+
dataView,
|
|
232
|
+
ServerMessageTypes,
|
|
233
|
+
this.#parseMessageCallback.bind(this),
|
|
234
|
+
null,
|
|
235
|
+
true
|
|
236
|
+
);
|
|
187
237
|
this.#checkIfFullyConnected();
|
|
188
238
|
}
|
|
189
239
|
|
|
@@ -209,10 +259,15 @@ abstract class BaseClient {
|
|
|
209
259
|
break;
|
|
210
260
|
case "discoveredDevice":
|
|
211
261
|
{
|
|
212
|
-
const { string: discoveredDeviceString } = parseStringFromDataView(
|
|
262
|
+
const { string: discoveredDeviceString } = parseStringFromDataView(
|
|
263
|
+
dataView,
|
|
264
|
+
byteOffset
|
|
265
|
+
);
|
|
213
266
|
_console.log({ discoveredDeviceString });
|
|
214
267
|
|
|
215
|
-
const discoveredDevice: DiscoveredDevice = JSON.parse(
|
|
268
|
+
const discoveredDevice: DiscoveredDevice = JSON.parse(
|
|
269
|
+
discoveredDeviceString
|
|
270
|
+
);
|
|
216
271
|
_console.log({ discoveredDevice });
|
|
217
272
|
|
|
218
273
|
this.onDiscoveredDevice(discoveredDevice);
|
|
@@ -220,7 +275,10 @@ abstract class BaseClient {
|
|
|
220
275
|
break;
|
|
221
276
|
case "expiredDiscoveredDevice":
|
|
222
277
|
{
|
|
223
|
-
const { string: bluetoothId } = parseStringFromDataView(
|
|
278
|
+
const { string: bluetoothId } = parseStringFromDataView(
|
|
279
|
+
dataView,
|
|
280
|
+
byteOffset
|
|
281
|
+
);
|
|
224
282
|
this.#onExpiredDiscoveredDevice(bluetoothId);
|
|
225
283
|
}
|
|
226
284
|
break;
|
|
@@ -229,20 +287,28 @@ abstract class BaseClient {
|
|
|
229
287
|
if (dataView.byteLength == 0) {
|
|
230
288
|
break;
|
|
231
289
|
}
|
|
232
|
-
const { string: connectedBluetoothDeviceIdStrings } =
|
|
290
|
+
const { string: connectedBluetoothDeviceIdStrings } =
|
|
291
|
+
parseStringFromDataView(dataView, byteOffset);
|
|
233
292
|
_console.log({ connectedBluetoothDeviceIdStrings });
|
|
234
|
-
const connectedBluetoothDeviceIds = JSON.parse(
|
|
293
|
+
const connectedBluetoothDeviceIds = JSON.parse(
|
|
294
|
+
connectedBluetoothDeviceIdStrings
|
|
295
|
+
).connectedDevices;
|
|
235
296
|
_console.log({ connectedBluetoothDeviceIds });
|
|
236
297
|
this.onConnectedBluetoothDeviceIds(connectedBluetoothDeviceIds);
|
|
237
298
|
}
|
|
238
299
|
break;
|
|
239
300
|
case "deviceMessage":
|
|
240
301
|
{
|
|
241
|
-
const { string: bluetoothId, byteOffset: _byteOffset } =
|
|
302
|
+
const { string: bluetoothId, byteOffset: _byteOffset } =
|
|
303
|
+
parseStringFromDataView(dataView, byteOffset);
|
|
242
304
|
byteOffset = _byteOffset;
|
|
243
305
|
const device = this.#devices[bluetoothId];
|
|
244
|
-
_console.assertWithError(
|
|
245
|
-
|
|
306
|
+
_console.assertWithError(
|
|
307
|
+
device,
|
|
308
|
+
`no device found for id ${bluetoothId}`
|
|
309
|
+
);
|
|
310
|
+
const connectionManager =
|
|
311
|
+
device.connectionManager! as ClientConnectionManager;
|
|
246
312
|
const _dataView = sliceDataView(dataView, byteOffset);
|
|
247
313
|
connectionManager.onClientMessage(_dataView);
|
|
248
314
|
}
|
|
@@ -265,7 +331,9 @@ abstract class BaseClient {
|
|
|
265
331
|
set #isScanningAvailable(newIsAvailable) {
|
|
266
332
|
_console.assertTypeWithError(newIsAvailable, "boolean");
|
|
267
333
|
this.#_isScanningAvailable = newIsAvailable;
|
|
268
|
-
this.dispatchEvent("isScanningAvailable", {
|
|
334
|
+
this.dispatchEvent("isScanningAvailable", {
|
|
335
|
+
isScanningAvailable: this.isScanningAvailable,
|
|
336
|
+
});
|
|
269
337
|
if (this.isScanningAvailable) {
|
|
270
338
|
this.#requestIsScanning();
|
|
271
339
|
}
|
|
@@ -275,7 +343,10 @@ abstract class BaseClient {
|
|
|
275
343
|
}
|
|
276
344
|
#assertIsScanningAvailable() {
|
|
277
345
|
this.assertConnection();
|
|
278
|
-
_console.assertWithError(
|
|
346
|
+
_console.assertWithError(
|
|
347
|
+
this.isScanningAvailable,
|
|
348
|
+
"scanning is not available"
|
|
349
|
+
);
|
|
279
350
|
}
|
|
280
351
|
protected requestIsScanningAvailable() {
|
|
281
352
|
this.sendServerMessage("isScanningAvailable");
|
|
@@ -349,29 +420,61 @@ abstract class BaseClient {
|
|
|
349
420
|
}
|
|
350
421
|
|
|
351
422
|
// DEVICE CONNECTION
|
|
352
|
-
connectToDevice(bluetoothId: string) {
|
|
353
|
-
return this.requestConnectionToDevice(bluetoothId);
|
|
423
|
+
connectToDevice(bluetoothId: string, connectionType?: ClientConnectionType) {
|
|
424
|
+
return this.requestConnectionToDevice(bluetoothId, connectionType);
|
|
354
425
|
}
|
|
355
|
-
protected requestConnectionToDevice(
|
|
426
|
+
protected requestConnectionToDevice(
|
|
427
|
+
bluetoothId: string,
|
|
428
|
+
connectionType?: ClientConnectionType
|
|
429
|
+
) {
|
|
356
430
|
this.assertConnection();
|
|
357
431
|
_console.assertTypeWithError(bluetoothId, "string");
|
|
358
432
|
const device = this.#getOrCreateDevice(bluetoothId);
|
|
359
|
-
|
|
433
|
+
if (connectionType) {
|
|
434
|
+
device.connect({ type: "client", subType: connectionType });
|
|
435
|
+
} else {
|
|
436
|
+
device.connect();
|
|
437
|
+
}
|
|
360
438
|
return device;
|
|
361
439
|
}
|
|
362
|
-
protected sendConnectToDeviceMessage(
|
|
363
|
-
|
|
440
|
+
protected sendConnectToDeviceMessage(
|
|
441
|
+
bluetoothId: string,
|
|
442
|
+
connectionType?: ClientConnectionType
|
|
443
|
+
) {
|
|
444
|
+
if (connectionType) {
|
|
445
|
+
this.sendServerMessage({
|
|
446
|
+
type: "connectToDevice",
|
|
447
|
+
data: concatenateArrayBuffers(
|
|
448
|
+
stringToArrayBuffer(bluetoothId),
|
|
449
|
+
ConnectionTypes.indexOf(connectionType)
|
|
450
|
+
),
|
|
451
|
+
});
|
|
452
|
+
} else {
|
|
453
|
+
this.sendServerMessage({ type: "connectToDevice", data: bluetoothId });
|
|
454
|
+
}
|
|
364
455
|
}
|
|
365
456
|
|
|
366
457
|
// DEVICE CONNECTION
|
|
367
458
|
createDevice(bluetoothId: string) {
|
|
368
459
|
const device = new Device();
|
|
460
|
+
const discoveredDevice = this.#discoveredDevices[bluetoothId];
|
|
369
461
|
const clientConnectionManager = new ClientConnectionManager();
|
|
462
|
+
clientConnectionManager.discoveredDevice = Object.assign(
|
|
463
|
+
{},
|
|
464
|
+
discoveredDevice
|
|
465
|
+
);
|
|
370
466
|
clientConnectionManager.client = this;
|
|
371
467
|
clientConnectionManager.bluetoothId = bluetoothId;
|
|
372
|
-
clientConnectionManager.sendClientMessage = this.sendDeviceMessage.bind(
|
|
373
|
-
|
|
374
|
-
|
|
468
|
+
clientConnectionManager.sendClientMessage = this.sendDeviceMessage.bind(
|
|
469
|
+
this,
|
|
470
|
+
bluetoothId
|
|
471
|
+
);
|
|
472
|
+
clientConnectionManager.sendRequiredDeviceInformationMessage =
|
|
473
|
+
this.sendRequiredDeviceInformationMessage.bind(this, bluetoothId);
|
|
474
|
+
clientConnectionManager.sendClientConnectMessage =
|
|
475
|
+
this.sendConnectToDeviceMessage.bind(this, bluetoothId);
|
|
476
|
+
clientConnectionManager.sendClientDisconnectMessage =
|
|
477
|
+
this.sendDisconnectFromDeviceMessage.bind(this, bluetoothId);
|
|
375
478
|
device.connectionManager = clientConnectionManager;
|
|
376
479
|
return device;
|
|
377
480
|
}
|
|
@@ -388,7 +491,8 @@ abstract class BaseClient {
|
|
|
388
491
|
_console.log({ bluetoothIds });
|
|
389
492
|
bluetoothIds.forEach((bluetoothId) => {
|
|
390
493
|
const device = this.#getOrCreateDevice(bluetoothId);
|
|
391
|
-
const connectionManager =
|
|
494
|
+
const connectionManager =
|
|
495
|
+
device.connectionManager! as ClientConnectionManager;
|
|
392
496
|
connectionManager.isConnected = true;
|
|
393
497
|
DeviceManager._CheckDeviceAvailability(device);
|
|
394
498
|
});
|
|
@@ -409,12 +513,22 @@ abstract class BaseClient {
|
|
|
409
513
|
this.sendServerMessage({ type: "disconnectFromDevice", data: bluetoothId });
|
|
410
514
|
}
|
|
411
515
|
|
|
412
|
-
protected sendDeviceMessage(
|
|
516
|
+
protected sendDeviceMessage(
|
|
517
|
+
bluetoothId: string,
|
|
518
|
+
...messages: ClientDeviceMessage[]
|
|
519
|
+
) {
|
|
413
520
|
this.sendServerMessage({
|
|
414
521
|
type: "deviceMessage",
|
|
415
522
|
data: [bluetoothId, createClientDeviceMessage(...messages)],
|
|
416
523
|
});
|
|
417
524
|
}
|
|
525
|
+
|
|
526
|
+
protected sendRequiredDeviceInformationMessage(bluetoothId: string) {
|
|
527
|
+
this.sendServerMessage({
|
|
528
|
+
type: "requiredDeviceInformation",
|
|
529
|
+
data: [bluetoothId],
|
|
530
|
+
});
|
|
531
|
+
}
|
|
418
532
|
}
|
|
419
533
|
|
|
420
534
|
export default BaseClient;
|
package/src/server/BaseServer.ts
CHANGED
|
@@ -16,6 +16,7 @@ import Device, {
|
|
|
16
16
|
BoundDeviceEventListeners,
|
|
17
17
|
DeviceEventMap,
|
|
18
18
|
DeviceEventType,
|
|
19
|
+
RequiredInformationConnectionMessages,
|
|
19
20
|
} from "../Device.ts";
|
|
20
21
|
import {
|
|
21
22
|
addEventListeners,
|
|
@@ -26,6 +27,8 @@ import { parseMessage, parseStringFromDataView } from "../utils/ParseUtils.ts";
|
|
|
26
27
|
import {
|
|
27
28
|
ConnectionMessageType,
|
|
28
29
|
ConnectionMessageTypes,
|
|
30
|
+
ConnectionType,
|
|
31
|
+
ConnectionTypes,
|
|
29
32
|
} from "../connection/BaseConnectionManager.ts";
|
|
30
33
|
import {
|
|
31
34
|
BoundScannerEventListeners,
|
|
@@ -37,6 +40,14 @@ import DeviceManager, {
|
|
|
37
40
|
DeviceManagerEventMap,
|
|
38
41
|
BoundDeviceManagerEventListeners,
|
|
39
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
|
+
];
|
|
40
51
|
|
|
41
52
|
const _console = createConsole("BaseServer", { log: false });
|
|
42
53
|
|
|
@@ -340,6 +351,9 @@ abstract class BaseServer {
|
|
|
340
351
|
dataView: DataView,
|
|
341
352
|
context: { responseMessages: ArrayBuffer[] }
|
|
342
353
|
) {
|
|
354
|
+
_console.log(
|
|
355
|
+
`onClientMessage "${messageType}" (${dataView.byteLength} bytes)`
|
|
356
|
+
);
|
|
343
357
|
const { responseMessages } = context;
|
|
344
358
|
switch (messageType) {
|
|
345
359
|
case "isScanningAvailable":
|
|
@@ -359,8 +373,14 @@ abstract class BaseServer {
|
|
|
359
373
|
break;
|
|
360
374
|
case "connectToDevice":
|
|
361
375
|
{
|
|
362
|
-
const { string: deviceId } =
|
|
363
|
-
|
|
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);
|
|
364
384
|
}
|
|
365
385
|
break;
|
|
366
386
|
case "disconnectFromDevice":
|
|
@@ -403,6 +423,34 @@ abstract class BaseServer {
|
|
|
403
423
|
}
|
|
404
424
|
}
|
|
405
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
|
+
);
|
|
449
|
+
if (responseMessage) {
|
|
450
|
+
responseMessages.push(responseMessage);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
break;
|
|
406
454
|
default:
|
|
407
455
|
_console.error(`uncaught messageType "${messageType}"`);
|
|
408
456
|
break;
|
|
@@ -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,10 +17,10 @@ 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
26
|
const _console = createConsole("UDPServer", { log: false });
|
|
@@ -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
|
|