@ukeyfe/hardware-transport-react-native 1.1.25 → 1.1.26

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 CHANGED
@@ -26,4 +26,4 @@ yar update:protobuf to generate new ./messages.json and ./src/types/messages.ts
26
26
 
27
27
  ## Docs
28
28
 
29
- Documentation is available [hardware-js-sdk](https://developer.ukey.com/connect-to-hardware/hardware-sdk/start)
29
+ Documentation is available [hardware-js-sdk](https://developer.ukey.io/connect-to-hardware/hardware-sdk/start)
@@ -1,4 +1,4 @@
1
- import { Peripheral } from '@ukeyfe/react-native-ble-utils';
1
+ import type { Peripheral } from '@ukeyfe/react-native-ble-utils';
2
2
  export declare const getConnectedDeviceIds: (serviceUuids: string[]) => Promise<Peripheral[]>;
3
3
  export declare const getBondedDevices: () => Promise<Peripheral[]>;
4
4
  export declare const pairDevice: (macAddress: string) => Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"BleManager.d.ts","sourceRoot":"","sources":["../src/BleManager.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAWtE,eAAO,MAAM,qBAAqB,iBAAkB,MAAM,EAAE,0BACZ,CAAC;AAEjD,eAAO,MAAM,gBAAgB,6BAAwC,CAAC;AAEtE,eAAO,MAAM,UAAU,eAAgB,MAAM;;;EAAoC,CAAC;AAElF,eAAO,MAAM,iBAAiB,kBAAmB,MAAM,KAAG,QAAQ,UAAU,GAAG,SAAS,CAmCpF,CAAC"}
1
+ {"version":3,"file":"BleManager.d.ts","sourceRoot":"","sources":["../src/BleManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AASjE,eAAO,MAAM,qBAAqB,iBAAkB,MAAM,EAAE,0BACZ,CAAC;AAEjD,eAAO,MAAM,gBAAgB,6BAAwC,CAAC;AAEtE,eAAO,MAAM,UAAU,eAAgB,MAAM;;;EAAoC,CAAC;AAElF,eAAO,MAAM,iBAAiB,kBAAmB,MAAM,KAAG,QAAQ,UAAU,GAAG,SAAS,CAmCpF,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Device, Characteristic } from 'react-native-ble-plx';
1
+ import type { Characteristic, Device } from 'react-native-ble-plx';
2
2
  export default class BleTransport {
3
3
  id: string;
4
4
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"BleTransport.d.ts","sourceRoot":"","sources":["../src/BleTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAC;AAM5E,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,EAAE,EAAE,MAAM,CAAC;IAEX,IAAI,SAA6B;IAEjC,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,SAAM;IAEb,mBAAmB,EAAE,cAAc,CAAC;IAEpC,oBAAoB,EAAE,cAAc,CAAC;IAErC,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAEhC,MAAM,CAAC,WAAW,SAAK;IAEvB,MAAM,CAAC,WAAW,SAAQ;gBAGxB,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,cAAc,EACnC,oBAAoB,EAAE,cAAc;IAehC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,SAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BzF"}
1
+ {"version":3,"file":"BleTransport.d.ts","sourceRoot":"","sources":["../src/BleTransport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAKnE,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,EAAE,EAAE,MAAM,CAAC;IAEX,IAAI,SAA6B;IAEjC,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,SAAM;IAEb,mBAAmB,EAAE,cAAc,CAAC;IAEpC,oBAAoB,EAAE,cAAc,CAAC;IAErC,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAEhC,MAAM,CAAC,WAAW,SAAK;IAEvB,MAAM,CAAC,WAAW,SAAQ;gBAGxB,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,cAAc,EACnC,oBAAoB,EAAE,cAAc;IAehC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,SAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BzF"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as transport from '@ukeyfe/hardware-transport';
2
- import transport__default from '@ukeyfe/hardware-transport';
3
- import { BleManager, Device, Characteristic } from 'react-native-ble-plx';
2
+ import transport__default, { UKeyDeviceInfoBase } from '@ukeyfe/hardware-transport';
3
+ import { Device, BleManager, Characteristic } from 'react-native-ble-plx';
4
4
  import { Deferred } from '@ukeyfe/hardware-shared';
5
5
  import EventEmitter from 'events';
6
6
 
@@ -12,6 +12,7 @@ type BleAcquireInput = {
12
12
  forceCleanRunPromise?: boolean;
13
13
  };
14
14
 
15
+ type IUKeyDevice = UKeyDeviceInfoBase & Device;
15
16
  declare class ReactNativeBleTransport {
16
17
  blePlxManager: BleManager | undefined;
17
18
  _messages: ReturnType<typeof transport__default.parseConfigure> | undefined;
@@ -27,16 +28,17 @@ declare class ReactNativeBleTransport {
27
28
  configure(signedData: any): void;
28
29
  listen(): void;
29
30
  getPlxManager(): Promise<BleManager>;
30
- enumerate(): Promise<Device[]>;
31
+ enumerate(): Promise<IUKeyDevice[]>;
31
32
  acquire(input: BleAcquireInput): Promise<{
32
33
  uuid: string;
33
34
  }>;
34
- _monitorCharacteristic(characteristic: Characteristic): () => void;
35
+ _monitorCharacteristic(characteristic: Characteristic, uuid: string): () => void;
35
36
  release(uuid: string): Promise<boolean>;
36
37
  post(session: string, name: string, data: Record<string, unknown>): Promise<void>;
37
38
  call(uuid: string, name: string, data: Record<string, unknown>): Promise<transport.MessageFromUKey>;
38
39
  stop(): void;
40
+ disconnect(session: string): Promise<void>;
39
41
  cancel(): void;
40
42
  }
41
43
 
42
- export { ReactNativeBleTransport as default };
44
+ export { IUKeyDevice, ReactNativeBleTransport as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,UAAU,IAAI,aAAa,EAC3B,MAAM,EAEN,cAAc,EAIf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,SAAkD,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAEL,QAAQ,EAIT,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAYvC,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAoDjE,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAC1C,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IAEzC,SAAS,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;IAEnE,IAAI,SAA6B;IAEjC,UAAU,UAAS;IAEnB,OAAO,UAAS;IAEhB,WAAW,SAAQ;IAEnB,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAExC,GAAG,CAAC,EAAE,GAAG,CAAC;IAEV,OAAO,CAAC,EAAE,YAAY,CAAC;gBAEX,OAAO,EAAE,gBAAgB;IAIrC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY;IAKvC,SAAS,CAAC,UAAU,EAAE,GAAG;IAMzB,MAAM;IAIN,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAWjC,SAAS;IA6FT,OAAO,CAAC,KAAK,EAAE,eAAe;;;IAkNpC,sBAAsB,CAAC,cAAc,EAAE,cAAc;IAkF/C,OAAO,CAAC,IAAI,EAAE,MAAM;IAepB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIjE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA2HpE,IAAI;IAIJ,MAAM;CAOP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAIL,UAAU,IAAI,aAAa,EAE5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,SAAS,EAAE,EAGhB,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAepC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAYjE,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,MAAM,CAAC;AA0CtD,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAC1C,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IAEzC,SAAS,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;IAEnE,IAAI,SAA6B;IAEjC,UAAU,UAAS;IAEnB,OAAO,UAAS;IAEhB,WAAW,SAAQ;IAEnB,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAExC,GAAG,CAAC,EAAE,GAAG,CAAC;IAEV,OAAO,CAAC,EAAE,YAAY,CAAC;gBAEX,OAAO,EAAE,gBAAgB;IAIrC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY;IAKvC,SAAS,CAAC,UAAU,EAAE,GAAG;IAMzB,MAAM;IAIN,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAWjC,SAAS;IA6FT,OAAO,CAAC,KAAK,EAAE,eAAe;;;IAqNpC,sBAAsB,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM;IAkF7D,OAAO,CAAC,IAAI,EAAE,MAAM;IAepB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIjE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA2HpE,IAAI;IAIE,UAAU,CAAC,OAAO,EAAE,MAAM;IA6DhC,MAAM;CAOP"}
package/dist/index.js CHANGED
@@ -338,7 +338,7 @@ class ReactNativeBleTransport {
338
338
  });
339
339
  const addDevice = (device) => {
340
340
  if (deviceList.every(d => d.id !== device.id)) {
341
- deviceList.push(device);
341
+ deviceList.push(Object.assign(Object.assign({}, device), { commType: 'ble' }));
342
342
  }
343
343
  };
344
344
  timer.timeout(() => {
@@ -497,7 +497,7 @@ class ReactNativeBleTransport {
497
497
  }
498
498
  yield this.release(uuid);
499
499
  const transport = new BleTransport(device, writeCharacteristic, notifyCharacteristic);
500
- transport.nofitySubscription = this._monitorCharacteristic(transport.notifyCharacteristic);
500
+ transport.nofitySubscription = this._monitorCharacteristic(transport.notifyCharacteristic, uuid);
501
501
  transportCache[uuid] = transport;
502
502
  (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit('device-connect', {
503
503
  name: device.name,
@@ -528,7 +528,7 @@ class ReactNativeBleTransport {
528
528
  return { uuid };
529
529
  });
530
530
  }
531
- _monitorCharacteristic(characteristic) {
531
+ _monitorCharacteristic(characteristic, uuid) {
532
532
  let bufferLength = 0;
533
533
  let buffer$1 = [];
534
534
  const subscription = characteristic.monitor((error, c) => {
@@ -580,7 +580,7 @@ class ReactNativeBleTransport {
580
580
  this.Log.debug('monitor data error: ', error);
581
581
  (_j = this.runPromise) === null || _j === void 0 ? void 0 : _j.reject(hardwareShared.ERRORS.TypedError(hardwareShared.HardwareErrorCode.BleWriteCharacteristicError));
582
582
  }
583
- });
583
+ }, uuid);
584
584
  return () => {
585
585
  this.Log.debug('remove characteristic monitor: ', characteristic.uuid);
586
586
  subscription.remove();
@@ -714,6 +714,58 @@ class ReactNativeBleTransport {
714
714
  stop() {
715
715
  this.stopped = true;
716
716
  }
717
+ disconnect(session) {
718
+ var _a, _b, _c, _d;
719
+ return __awaiter(this, void 0, void 0, function* () {
720
+ this.Log.debug('transport-react-native transport resetSession: ', session);
721
+ const transport = transportCache[session];
722
+ if (transport === null || transport === void 0 ? void 0 : transport.nofitySubscription) {
723
+ try {
724
+ transport.nofitySubscription();
725
+ transport.nofitySubscription = undefined;
726
+ }
727
+ catch (e) {
728
+ this.Log.error('resetSession: remove notify subscription error: ', e);
729
+ }
730
+ }
731
+ if (session) {
732
+ try {
733
+ yield ((_a = this.blePlxManager) === null || _a === void 0 ? void 0 : _a.cancelTransaction(session));
734
+ }
735
+ catch (e) {
736
+ this.Log.debug('resetSession: cancel transaction error (ignored): ', (e === null || e === void 0 ? void 0 : e.message) || e);
737
+ }
738
+ }
739
+ if (transport === null || transport === void 0 ? void 0 : transport.device) {
740
+ try {
741
+ yield transport.device.cancelConnection();
742
+ }
743
+ catch (e) {
744
+ this.Log.debug('resetSession: device.cancelConnection error (ignored): ', (e === null || e === void 0 ? void 0 : e.message) || e);
745
+ }
746
+ }
747
+ try {
748
+ yield ((_b = this.blePlxManager) === null || _b === void 0 ? void 0 : _b.cancelDeviceConnection(session));
749
+ }
750
+ catch (e) {
751
+ this.Log.debug('resetSession: manager.cancelDeviceConnection error (ignored): ', (e === null || e === void 0 ? void 0 : e.message) || e);
752
+ }
753
+ if (transportCache[session]) {
754
+ delete transportCache[session];
755
+ }
756
+ try {
757
+ (_c = this.emitter) === null || _c === void 0 ? void 0 : _c.emit('device-disconnect', {
758
+ name: (_d = transport === null || transport === void 0 ? void 0 : transport.device) === null || _d === void 0 ? void 0 : _d.name,
759
+ id: session,
760
+ connectId: session,
761
+ });
762
+ }
763
+ catch (e) {
764
+ this.Log.error('resetSession: emit disconnect event error: ', e);
765
+ }
766
+ yield new Promise(resolve => setTimeout(() => resolve(), 100));
767
+ });
768
+ }
717
769
  cancel() {
718
770
  this.Log.debug('transport-react-native transport cancel');
719
771
  if (this.runPromise) ;
@@ -1,3 +1,3 @@
1
- import { BlePlxManager } from './types';
1
+ import type { BlePlxManager } from './types';
2
2
  export declare const subscribeBleOn: (bleManager: BlePlxManager, ms?: number) => Promise<void>;
3
3
  //# sourceMappingURL=subscribeBleOn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscribeBleOn.d.ts","sourceRoot":"","sources":["../src/subscribeBleOn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,eAAO,MAAM,cAAc,eAAgB,aAAa,kBAAc,QAAQ,IAAI,CAqB9E,CAAC"}
1
+ {"version":3,"file":"subscribeBleOn.d.ts","sourceRoot":"","sources":["../src/subscribeBleOn.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,eAAO,MAAM,cAAc,eAAgB,aAAa,kBAAc,QAAQ,IAAI,CAqB9E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ukeyfe/hardware-transport-react-native",
3
- "version": "1.1.25",
3
+ "version": "1.1.26",
4
4
  "homepage": "https://github.com/UKeyHQ/hardware-js-sdk#readme",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "repository": {
12
12
  "type": "git",
13
- "url": "git+https://github.com/bestyourwallet/hardware-js-sdk"
13
+ "url": "git+https://github.com/UKeyHQ/hardware-js-sdk.git"
14
14
  },
15
15
  "scripts": {
16
16
  "dev": "rimraf dist && rollup -c ../../build/rollup.config.js -w",
@@ -19,10 +19,10 @@
19
19
  "lint:fix": "eslint . --fix"
20
20
  },
21
21
  "dependencies": {
22
- "@ukeyfe/hardware-shared": "1.1.25",
23
- "@ukeyfe/hardware-transport": "1.1.25",
22
+ "@ukeyfe/hardware-shared": "1.1.26",
23
+ "@ukeyfe/hardware-transport": "1.1.26",
24
24
  "@ukeyfe/react-native-ble-utils": "^0.1.5",
25
25
  "react-native-ble-plx": "3.5.0"
26
26
  },
27
- "gitHead": "8f4ecd5e78a8cade44224204c4cf102e6e2a1712"
27
+ "gitHead": "ca0b502d1ac83fdd0883d5e278e20bd80ac08f29"
28
28
  }
package/src/BleManager.ts CHANGED
@@ -1,6 +1,8 @@
1
- import BleUtils, { Peripheral } from '@ukeyfe/react-native-ble-utils';
1
+ import BleUtils from '@ukeyfe/react-native-ble-utils';
2
2
  import { ERRORS, HardwareErrorCode } from '@ukeyfe/hardware-shared';
3
- import { getLogger, LoggerNames } from '@ukeyfe/hardware-core';
3
+ import { LoggerNames, getLogger } from '@ukeyfe/hardware-core';
4
+
5
+ import type { Peripheral } from '@ukeyfe/react-native-ble-utils';
4
6
 
5
7
  const Logger = getLogger(LoggerNames.HdBleTransport);
6
8
 
@@ -1,5 +1,7 @@
1
- import { Device, Characteristic, BleErrorCode } from 'react-native-ble-plx';
2
- import { getLogger, LoggerNames, wait } from '@ukeyfe/hardware-core';
1
+ import { BleErrorCode } from 'react-native-ble-plx';
2
+ import { LoggerNames, getLogger, wait } from '@ukeyfe/hardware-core';
3
+
4
+ import type { Characteristic, Device } from 'react-native-ble-plx';
3
5
  // import { wait } from '@ukeyfe/hardware-core/src/utils';
4
6
 
5
7
  const Log = getLogger(LoggerNames.HdBleTransport);
package/src/index.ts CHANGED
@@ -1,35 +1,35 @@
1
- import { Platform, PermissionsAndroid } from 'react-native';
1
+ import { PermissionsAndroid, Platform } from 'react-native';
2
2
  import { Buffer } from 'buffer';
3
3
  import {
4
- BleManager as BlePlxManager,
5
- Device,
6
- BleErrorCode,
7
- Characteristic,
8
- ScanMode,
9
4
  BleATTErrorCode,
10
5
  BleError,
6
+ BleErrorCode,
7
+ BleManager as BlePlxManager,
8
+ ScanMode,
11
9
  } from 'react-native-ble-plx';
12
10
  import ByteBuffer from 'bytebuffer';
13
- import transport, { COMMON_HEADER_SIZE, LogBlockCommand } from '@ukeyfe/hardware-transport';
14
- import {
15
- createDeferred,
16
- Deferred,
17
- ERRORS,
18
- HardwareErrorCode,
19
- isUkeyDevice,
20
- } from '@ukeyfe/hardware-shared';
21
- import type EventEmitter from 'events';
11
+ import transport, {
12
+ COMMON_HEADER_SIZE,
13
+ LogBlockCommand,
14
+ type UKeyDeviceInfoBase,
15
+ } from '@ukeyfe/hardware-transport';
16
+ import { ERRORS, HardwareErrorCode, createDeferred, isUkeyDevice } from '@ukeyfe/hardware-shared';
17
+
22
18
  import { getConnectedDeviceIds, onDeviceBondState, pairDevice } from './BleManager';
23
19
  import { subscribeBleOn } from './subscribeBleOn';
24
20
  import {
21
+ ANDROID_PACKET_LENGTH,
22
+ IOS_PACKET_LENGTH,
25
23
  getBluetoothServiceUuids,
26
24
  getInfosForServiceUuid,
27
- IOS_PACKET_LENGTH,
28
- ANDROID_PACKET_LENGTH,
29
25
  } from './constants';
30
26
  import { isHeaderChunk } from './utils/validateNotify';
31
27
  import BleTransport from './BleTransport';
32
28
  import timer from './utils/timer';
29
+
30
+ import type { Deferred } from '@ukeyfe/hardware-shared';
31
+ import type { Characteristic, Device } from 'react-native-ble-plx';
32
+ import type EventEmitter from 'events';
33
33
  import type { BleAcquireInput, TransportOptions } from './types';
34
34
 
35
35
  const { check, buildBuffers, receiveOne, parseConfigure } = transport;
@@ -42,6 +42,8 @@ let connectOptions: Record<string, unknown> = {
42
42
  refreshGatt: 'OnConnected',
43
43
  };
44
44
 
45
+ export type IUKeyDevice = UKeyDeviceInfoBase & Device;
46
+
45
47
  const tryToGetConfiguration = (device: Device) => {
46
48
  if (!device || !device.serviceUUIDs) return null;
47
49
  const [serviceUUID] = device.serviceUUIDs;
@@ -133,8 +135,8 @@ export default class ReactNativeBleTransport {
133
135
  */
134
136
  async enumerate() {
135
137
  // eslint-disable-next-line no-async-promise-executor
136
- return new Promise<Device[]>(async (resolve, reject) => {
137
- const deviceList: Device[] = [];
138
+ return new Promise<IUKeyDevice[]>(async (resolve, reject) => {
139
+ const deviceList: IUKeyDevice[] = [];
138
140
  const blePlxManager = await this.getPlxManager();
139
141
  try {
140
142
  await subscribeBleOn(blePlxManager);
@@ -213,7 +215,7 @@ export default class ReactNativeBleTransport {
213
215
 
214
216
  const addDevice = (device: Device) => {
215
217
  if (deviceList.every(d => d.id !== device.id)) {
216
- deviceList.push(device);
218
+ deviceList.push({ ...device, commType: 'ble' } as IUKeyDevice);
217
219
  }
218
220
  };
219
221
 
@@ -403,7 +405,10 @@ export default class ReactNativeBleTransport {
403
405
  await this.release(uuid);
404
406
 
405
407
  const transport = new BleTransport(device, writeCharacteristic, notifyCharacteristic);
406
- transport.nofitySubscription = this._monitorCharacteristic(transport.notifyCharacteristic);
408
+ transport.nofitySubscription = this._monitorCharacteristic(
409
+ transport.notifyCharacteristic,
410
+ uuid
411
+ );
407
412
  transportCache[uuid] = transport;
408
413
 
409
414
  this.emitter?.emit('device-connect', {
@@ -434,7 +439,7 @@ export default class ReactNativeBleTransport {
434
439
  return { uuid };
435
440
  }
436
441
 
437
- _monitorCharacteristic(characteristic: Characteristic) {
442
+ _monitorCharacteristic(characteristic: Characteristic, uuid: string) {
438
443
  let bufferLength = 0;
439
444
  let buffer: any[] = [];
440
445
  const subscription = characteristic.monitor((error, c) => {
@@ -508,7 +513,7 @@ export default class ReactNativeBleTransport {
508
513
  this.Log.debug('monitor data error: ', error);
509
514
  this.runPromise?.reject(ERRORS.TypedError(HardwareErrorCode.BleWriteCharacteristicError));
510
515
  }
511
- });
516
+ }, uuid);
512
517
 
513
518
  return () => {
514
519
  this.Log.debug('remove characteristic monitor: ', characteristic.uuid);
@@ -662,6 +667,67 @@ export default class ReactNativeBleTransport {
662
667
  this.stopped = true;
663
668
  }
664
669
 
670
+ async disconnect(session: string) {
671
+ this.Log.debug('transport-react-native transport resetSession: ', session);
672
+ const transport = transportCache[session] as BleTransport;
673
+
674
+ // cancel the notify subscription
675
+ if (transport?.nofitySubscription) {
676
+ try {
677
+ transport.nofitySubscription();
678
+ transport.nofitySubscription = undefined;
679
+ } catch (e) {
680
+ this.Log.error('resetSession: remove notify subscription error: ', e);
681
+ }
682
+ }
683
+
684
+ // cancel the ble transaction
685
+ if (session) {
686
+ try {
687
+ await this.blePlxManager?.cancelTransaction(session);
688
+ } catch (e) {
689
+ this.Log.debug('resetSession: cancel transaction error (ignored): ', e?.message || e);
690
+ }
691
+ }
692
+
693
+ // disconnect the device via the device object
694
+ if (transport?.device) {
695
+ try {
696
+ await transport.device.cancelConnection();
697
+ } catch (e) {
698
+ this.Log.debug('resetSession: device.cancelConnection error (ignored): ', e?.message || e);
699
+ }
700
+ }
701
+
702
+ // disconnect the device via the ble manager
703
+ try {
704
+ await this.blePlxManager?.cancelDeviceConnection(session);
705
+ } catch (e) {
706
+ this.Log.debug(
707
+ 'resetSession: manager.cancelDeviceConnection error (ignored): ',
708
+ e?.message || e
709
+ );
710
+ }
711
+
712
+ // clear the transport cache
713
+ if (transportCache[session]) {
714
+ delete transportCache[session];
715
+ }
716
+
717
+ // emit the disconnect event
718
+ try {
719
+ this.emitter?.emit('device-disconnect', {
720
+ name: transport?.device?.name,
721
+ id: session,
722
+ connectId: session,
723
+ });
724
+ } catch (e) {
725
+ this.Log.error('resetSession: emit disconnect event error: ', e);
726
+ }
727
+ // eslint-disable-next-line no-promise-executor-return
728
+ await new Promise<void>(resolve => setTimeout(() => resolve(), 100));
729
+ }
730
+
665
731
  cancel() {
666
732
  this.Log.debug('transport-react-native transport cancel');
667
733
  if (this.runPromise) {
@@ -1,7 +1,9 @@
1
1
  import { ERRORS, HardwareErrorCode } from '@ukeyfe/hardware-shared';
2
- import { BlePlxManager } from './types';
2
+
3
3
  import timer from './utils/timer';
4
4
 
5
+ import type { BlePlxManager } from './types';
6
+
5
7
  export const subscribeBleOn = (bleManager: BlePlxManager, ms = 1000): Promise<void> =>
6
8
  new Promise((resolve, reject) => {
7
9
  let done = false;
@@ -1,4 +1,4 @@
1
- import { MESSAGE_TOP_CHAR, MESSAGE_HEADER_BYTE } from '@ukeyfe/hardware-transport';
1
+ import { MESSAGE_HEADER_BYTE, MESSAGE_TOP_CHAR } from '@ukeyfe/hardware-transport';
2
2
 
3
3
  export const isHeaderChunk = (chunk: Buffer): boolean => {
4
4
  if (chunk.length < 9) return false;