@dg-kit/transport-webbluetooth 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +14 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +20 -4
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/picker.d.ts +31 -0
- package/dist/picker.d.ts.map +1 -0
- package/dist/picker.js +55 -0
- package/dist/picker.js.map +1 -0
- package/package.json +3 -3
package/dist/client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DeviceClient } from '@dg-kit/core';
|
|
2
2
|
import type { DeviceCommand, DeviceCommandResult, DeviceState } from '@dg-kit/core';
|
|
3
|
-
import { type NavigatorBluetoothLike, type RequestDeviceOptionsLike, type WebBluetoothProtocolAdapter } from '@dg-kit/protocol';
|
|
3
|
+
import { type BluetoothDeviceLike, type BluetoothRemoteGATTServerLike, type NavigatorBluetoothLike, type RequestDeviceOptionsLike, type WebBluetoothProtocolAdapter } from '@dg-kit/protocol';
|
|
4
4
|
export type ReconnectState = 'reconnecting' | 'reconnected' | 'failed';
|
|
5
5
|
export interface WebBluetoothDeviceClientOptions {
|
|
6
6
|
protocol: WebBluetoothProtocolAdapter;
|
|
@@ -34,6 +34,19 @@ export declare class WebBluetoothDeviceClient implements DeviceClient {
|
|
|
34
34
|
private reconnecting;
|
|
35
35
|
constructor(options: WebBluetoothDeviceClientOptions);
|
|
36
36
|
connect(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Attach to an already-obtained `(device, server)` pair instead of running
|
|
39
|
+
* this client's own `bluetooth.requestDevice()` chooser prompt.
|
|
40
|
+
*
|
|
41
|
+
* Lets a caller that already ran ONE shared chooser scoped to every DG-Lab
|
|
42
|
+
* device kind (Coyote + sensors + Opossum — see `DG_LAB_REQUEST_DEVICE_OPTIONS`)
|
|
43
|
+
* and identified the picked device as a Coyote via `detectDeviceKind()`
|
|
44
|
+
* hand the device straight to this client, rather than needing a second,
|
|
45
|
+
* Coyote-only chooser prompt. `gatt.connect()` must already have been
|
|
46
|
+
* called by the caller; this method only runs the protocol handshake and
|
|
47
|
+
* the same replace-previous-device bookkeeping `connect()` does.
|
|
48
|
+
*/
|
|
49
|
+
connectDevice(nextDevice: BluetoothDeviceLike, server: BluetoothRemoteGATTServerLike): Promise<void>;
|
|
37
50
|
disconnect(): Promise<void>;
|
|
38
51
|
getState(): Promise<DeviceState>;
|
|
39
52
|
execute(command: DeviceCommand): Promise<DeviceCommandResult>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EAClC,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EACjC,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,QAAQ,CAAC;AAKvE,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,2BAA2B,CAAC;IACtC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;IAChD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,6DAA6D;IAC7D,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CAC1D;AAED,qBAAa,wBAAyB,YAAW,YAAY;IAQ/C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqC;IACzD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,YAAY,CAAS;gBAEA,OAAO,EAAE,+BAA+B;IAY/D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B9B;;;;;;;;;;;OAWG;IACG,aAAa,CACjB,UAAU,EAAE,mBAAmB,EAC/B,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAAC,IAAI,CAAC;IA6BV,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAIhC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI7D,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAsB7B;IAEF,OAAO,CAAC,iBAAiB;YAuBX,YAAY;IAuC1B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,IAAI;CAKb"}
|
package/dist/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DG_LAB_REQUEST_DEVICE_OPTIONS, } from '@dg-kit/protocol';
|
|
2
2
|
import { getWebBluetoothAvailability } from './availability.js';
|
|
3
3
|
const DEFAULT_RECONNECT_ATTEMPTS = 3;
|
|
4
4
|
const DEFAULT_RECONNECT_BACKOFF_MS = [500, 1500, 4000];
|
|
@@ -31,12 +31,28 @@ export class WebBluetoothDeviceClient {
|
|
|
31
31
|
if (!bluetooth) {
|
|
32
32
|
throw new Error('当前环境不支持 Web Bluetooth');
|
|
33
33
|
}
|
|
34
|
-
const nextDevice = await bluetooth.requestDevice(this.options.requestDeviceOptions ??
|
|
34
|
+
const nextDevice = await bluetooth.requestDevice(this.options.requestDeviceOptions ?? DG_LAB_REQUEST_DEVICE_OPTIONS);
|
|
35
35
|
const gatt = nextDevice.gatt;
|
|
36
36
|
if (!gatt) {
|
|
37
37
|
throw new Error('所选蓝牙设备不支持 GATT');
|
|
38
38
|
}
|
|
39
39
|
const server = await gatt.connect();
|
|
40
|
+
await this.connectDevice(nextDevice, server);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Attach to an already-obtained `(device, server)` pair instead of running
|
|
44
|
+
* this client's own `bluetooth.requestDevice()` chooser prompt.
|
|
45
|
+
*
|
|
46
|
+
* Lets a caller that already ran ONE shared chooser scoped to every DG-Lab
|
|
47
|
+
* device kind (Coyote + sensors + Opossum — see `DG_LAB_REQUEST_DEVICE_OPTIONS`)
|
|
48
|
+
* and identified the picked device as a Coyote via `detectDeviceKind()`
|
|
49
|
+
* hand the device straight to this client, rather than needing a second,
|
|
50
|
+
* Coyote-only chooser prompt. `gatt.connect()` must already have been
|
|
51
|
+
* called by the caller; this method only runs the protocol handshake and
|
|
52
|
+
* the same replace-previous-device bookkeeping `connect()` does.
|
|
53
|
+
*/
|
|
54
|
+
async connectDevice(nextDevice, server) {
|
|
55
|
+
this.cancelReconnect();
|
|
40
56
|
const previousDevice = this.device;
|
|
41
57
|
const shouldReplacePrevious = !!previousDevice && previousDevice !== nextDevice;
|
|
42
58
|
if (shouldReplacePrevious) {
|
|
@@ -49,8 +65,8 @@ export class WebBluetoothDeviceClient {
|
|
|
49
65
|
if (shouldReplacePrevious && isGattConnected(previousDevice)) {
|
|
50
66
|
previousDevice.addEventListener('gattserverdisconnected', this.onDisconnected);
|
|
51
67
|
}
|
|
52
|
-
if (gatt
|
|
53
|
-
gatt.disconnect();
|
|
68
|
+
if (nextDevice.gatt?.connected) {
|
|
69
|
+
nextDevice.gatt.disconnect();
|
|
54
70
|
}
|
|
55
71
|
throw error;
|
|
56
72
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,6BAA6B,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { getWebBluetoothAvailability } from './availability.js';
|
|
2
2
|
export { WebBluetoothDeviceClient, type WebBluetoothDeviceClientOptions, type ReconnectState, } from './client.js';
|
|
3
|
+
export { requestDgLabDevice, type RequestDgLabDeviceOptions, type RequestedDgLabDevice, } from './picker.js';
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EACpC,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EACpC,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,wBAAwB,GAGzB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,wBAAwB,GAGzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,GAGnB,MAAM,aAAa,CAAC"}
|
package/dist/picker.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DeviceKind } from '@dg-kit/core';
|
|
2
|
+
import { type BluetoothDeviceLike, type BluetoothRemoteGATTServerLike, type NavigatorBluetoothLike, type RequestDeviceOptionsLike } from '@dg-kit/protocol';
|
|
3
|
+
export interface RequestDgLabDeviceOptions {
|
|
4
|
+
navigatorRef?: NavigatorBluetoothLike;
|
|
5
|
+
requestDeviceOptions?: RequestDeviceOptionsLike;
|
|
6
|
+
}
|
|
7
|
+
export interface RequestedDgLabDevice {
|
|
8
|
+
kind: DeviceKind;
|
|
9
|
+
device: BluetoothDeviceLike;
|
|
10
|
+
server: BluetoothRemoteGATTServerLike;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Open ONE shared Web Bluetooth chooser scoped to every known DG-Lab device
|
|
14
|
+
* kind (Coyote V2/V3, paw-prints, civet-edging, Opossum — see
|
|
15
|
+
* `DG_LAB_REQUEST_DEVICE_OPTIONS`), connect its GATT server, and identify
|
|
16
|
+
* which kind was picked via `detectDeviceKind()`.
|
|
17
|
+
*
|
|
18
|
+
* This is the shared foundation for a single "连接设备" entry point that can
|
|
19
|
+
* pick up any of the four device kinds, auto-detected by name, instead of a
|
|
20
|
+
* separate chooser per kind. Callers route the returned `(kind, device,
|
|
21
|
+
* server)` to the right adapter/client themselves — e.g. a Coyote pick goes
|
|
22
|
+
* to `WebBluetoothDeviceClient.connectDevice()`, a sensor/Opossum pick goes
|
|
23
|
+
* straight to that device's own protocol adapter's `onConnected()`.
|
|
24
|
+
*
|
|
25
|
+
* Rejects (and disconnects) on an unrecognized device name — the chooser's
|
|
26
|
+
* `filters` already scope results to DG-Lab prefixes, so this should only
|
|
27
|
+
* trigger if a device happens to advertise a matching prefix without
|
|
28
|
+
* actually being a DG-Lab device.
|
|
29
|
+
*/
|
|
30
|
+
export declare function requestDgLabDevice(options?: RequestDgLabDeviceOptions): Promise<RequestedDgLabDevice>;
|
|
31
|
+
//# sourceMappingURL=picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EAClC,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC9B,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,6BAA6B,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,oBAAoB,CAAC,CAyC/B"}
|
package/dist/picker.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { DG_LAB_REQUEST_DEVICE_OPTIONS, detectDeviceKind, } from '@dg-kit/protocol';
|
|
2
|
+
import { getWebBluetoothAvailability } from './availability.js';
|
|
3
|
+
/**
|
|
4
|
+
* Open ONE shared Web Bluetooth chooser scoped to every known DG-Lab device
|
|
5
|
+
* kind (Coyote V2/V3, paw-prints, civet-edging, Opossum — see
|
|
6
|
+
* `DG_LAB_REQUEST_DEVICE_OPTIONS`), connect its GATT server, and identify
|
|
7
|
+
* which kind was picked via `detectDeviceKind()`.
|
|
8
|
+
*
|
|
9
|
+
* This is the shared foundation for a single "连接设备" entry point that can
|
|
10
|
+
* pick up any of the four device kinds, auto-detected by name, instead of a
|
|
11
|
+
* separate chooser per kind. Callers route the returned `(kind, device,
|
|
12
|
+
* server)` to the right adapter/client themselves — e.g. a Coyote pick goes
|
|
13
|
+
* to `WebBluetoothDeviceClient.connectDevice()`, a sensor/Opossum pick goes
|
|
14
|
+
* straight to that device's own protocol adapter's `onConnected()`.
|
|
15
|
+
*
|
|
16
|
+
* Rejects (and disconnects) on an unrecognized device name — the chooser's
|
|
17
|
+
* `filters` already scope results to DG-Lab prefixes, so this should only
|
|
18
|
+
* trigger if a device happens to advertise a matching prefix without
|
|
19
|
+
* actually being a DG-Lab device.
|
|
20
|
+
*/
|
|
21
|
+
export async function requestDgLabDevice(options = {}) {
|
|
22
|
+
const nav = options.navigatorRef ??
|
|
23
|
+
(typeof navigator === 'undefined' ? undefined : navigator);
|
|
24
|
+
const availability = getWebBluetoothAvailability(nav);
|
|
25
|
+
if (!availability.supported) {
|
|
26
|
+
throw new Error(availability.reason);
|
|
27
|
+
}
|
|
28
|
+
const bluetooth = nav?.bluetooth;
|
|
29
|
+
if (!bluetooth) {
|
|
30
|
+
throw new Error('当前环境不支持 Web Bluetooth');
|
|
31
|
+
}
|
|
32
|
+
const device = await bluetooth.requestDevice(options.requestDeviceOptions ?? DG_LAB_REQUEST_DEVICE_OPTIONS);
|
|
33
|
+
const kind = detectDeviceKind(device.name);
|
|
34
|
+
if (kind === 'unknown') {
|
|
35
|
+
if (device.gatt?.connected) {
|
|
36
|
+
device.gatt.disconnect();
|
|
37
|
+
}
|
|
38
|
+
throw new Error('未识别的设备,请确认选择了正确的 DG-Lab 设备');
|
|
39
|
+
}
|
|
40
|
+
const gatt = device.gatt;
|
|
41
|
+
if (!gatt) {
|
|
42
|
+
throw new Error('所选蓝牙设备不支持 GATT');
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const server = await gatt.connect();
|
|
46
|
+
return { kind, device, server };
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (gatt.connected) {
|
|
50
|
+
gatt.disconnect();
|
|
51
|
+
}
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AACA,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,GAKjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAahE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAqC,EAAE;IAEvC,MAAM,GAAG,GACP,OAAO,CAAC,YAAY;QACpB,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,SAA+C,CAAC,CAAC;IAEpG,MAAM,YAAY,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAC1C,OAAO,CAAC,oBAAoB,IAAI,6BAA6B,CAC9D,CAAC;IACF,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dg-kit/transport-webbluetooth",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Web Bluetooth DeviceClient for DG-Lab Coyote (browser-only)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "0xNullAI",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@dg-kit/core": "1.
|
|
31
|
-
"@dg-kit/protocol": "1.
|
|
30
|
+
"@dg-kit/core": "1.5.0",
|
|
31
|
+
"@dg-kit/protocol": "1.5.0"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsc -p tsconfig.json",
|