@ledgerhq/device-transport-kit-react-native-ble 0.0.0-rn-hid-improvements-explorations-20250523153215 → 0.0.0-rn-ble-pairing-removed-while-reconnecting-20250731150808
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/lib/cjs/api/transport/RNBleApduSender.js +1 -1
- package/lib/cjs/api/transport/RNBleApduSender.js.map +2 -2
- package/lib/cjs/api/transport/RNBleTransport.js +1 -1
- package/lib/cjs/api/transport/RNBleTransport.js.map +3 -3
- package/lib/cjs/api/transport/RNBleTransport.test.js +1 -1
- package/lib/cjs/api/transport/RNBleTransport.test.js.map +2 -2
- package/lib/esm/api/transport/RNBleApduSender.js +1 -1
- package/lib/esm/api/transport/RNBleApduSender.js.map +2 -2
- package/lib/esm/api/transport/RNBleTransport.js +1 -1
- package/lib/esm/api/transport/RNBleTransport.js.map +3 -3
- package/lib/esm/api/transport/RNBleTransport.test.js +1 -1
- package/lib/esm/api/transport/RNBleTransport.test.js.map +2 -2
- package/lib/types/api/transport/RNBleApduSender.d.ts.map +1 -1
- package/lib/types/api/transport/RNBleTransport.d.ts +1 -0
- package/lib/types/api/transport/RNBleTransport.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/transport/RNBleTransport.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: off */\nimport { type PermissionsAndroid, type Platform } from \"react-native\";\nimport { type PermissionStatus } from \"react-native/Libraries/PermissionsAndroid/PermissionsAndroid\";\nimport { BleManager, type Device, State } from \"react-native-ble-plx\";\nimport {\n type ApduReceiverServiceFactory,\n type ApduSenderServiceFactory,\n BleDeviceInfos,\n DeviceConnectionStateMachine,\n type DeviceConnectionStateMachineParams,\n type DeviceModelDataSource,\n DeviceModelId,\n type DmkConfig,\n type LoggerPublisherService,\n OpeningConnectionError,\n TransportConnectedDevice,\n TransportDeviceModel,\n type TransportDiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { lastValueFrom, Subscription, take } from \"rxjs\";\nimport { beforeEach, expect, type Mock } from \"vitest\";\n\nimport { BleNotSupported } from \"@api/model/Errors\";\n\nimport { type RNBleApduSenderDependencies } from \"./RNBleApduSender\";\nimport { RNBleTransport, RNBleTransportFactory } from \"./RNBleTransport\";\n\nconst fakeLogger = {\n error: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n debug: vi.fn(),\n};\n\nvi.mock(\"react-native\", () => ({\n Platform: {},\n PermissionsAndroid: {},\n}));\n\nvi.mock(\"react-native-ble-plx\", () => ({\n Device: vi.fn(),\n State: {\n PoweredOn: \"PoweredOn\",\n Unknown: \"Unknown\",\n },\n BleError: vi.fn(),\n BleManager: vi.fn().mockReturnValue({\n onStateChange: vi.fn(),\n startDeviceScan: vi.fn(),\n stopDeviceScan: vi.fn(),\n connectToDevice: vi.fn(),\n disconnectFromDevice: vi.fn(),\n cancelDeviceConnection: vi.fn(),\n connectedDevices: vi.fn(),\n monitorCharacteristicForDevice: vi.fn(),\n writeCharacteristicWithoutResponseForDevice: vi.fn(),\n discoverAllServicesAndCharacteristicsForDevice: vi.fn(),\n onDeviceDisconnected: vi.fn(),\n isDeviceConnected: vi.fn(),\n }),\n}));\n\nconst expectAndroidSupportedResult = async (\n params: {\n version: number;\n permissions: Record<string, string>;\n requestPermissionResult: {\n \"android.permission.BLUETOOTH_CONNECT\": PermissionStatus;\n \"android.permission.BLUETOOTH_SCAN\": PermissionStatus;\n \"android.permission.ACCESS_FINE_LOCATION\": PermissionStatus;\n };\n accessFineLocationResult?: PermissionStatus;\n },\n expects: {\n isSupported: boolean;\n callRequestPermission: boolean;\n },\n) => {\n // given\n const platform = { OS: \"android\", Version: params.version };\n const permissionsAndroid = {\n request: vi.fn().mockImplementation((key: string) =>\n Promise.resolve(\n {\n ACCESS_FINE_LOCATION: params.accessFineLocationResult,\n }[key],\n ),\n ),\n PERMISSIONS: params.permissions,\n RESULTS: {\n GRANTED: \"granted\",\n },\n requestMultiple: vi\n .fn()\n .mockImplementation(() =>\n Promise.resolve(params.requestPermissionResult),\n ),\n };\n const transport = new RNBleTransport(\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n new BleManager(),\n platform as Platform,\n permissionsAndroid as unknown as PermissionsAndroid,\n );\n // when\n await transport.requestPermission();\n const isSupported = transport.isSupported();\n // then\n if (expects.callRequestPermission) {\n expect(permissionsAndroid.request).toHaveBeenCalledWith(\n \"ACCESS_FINE_LOCATION\",\n );\n }\n expect(isSupported).toBe(expects.isSupported);\n};\n\ndescribe(\"RNBleTransportFactory\", () => {\n it(\"should return a RNBleTransport\", () => {\n const fakeArgs = {\n deviceModelDataSource:\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n loggerServiceFactory: () =>\n fakeLogger as unknown as LoggerPublisherService,\n apduSenderServiceFactory:\n (() => {}) as unknown as ApduSenderServiceFactory,\n apduReceiverServiceFactory:\n (() => {}) as unknown as ApduReceiverServiceFactory,\n config: {} as DmkConfig,\n };\n // when\n const transport = RNBleTransportFactory(fakeArgs);\n // then\n expect(transport).toBeInstanceOf(RNBleTransport);\n });\n});\n\ndescribe(\"RNBleTransport\", () => {\n const fakePlaftorm = { OS: \"ios\" };\n const fakeDeviceModel = new TransportDeviceModel({\n id: DeviceModelId.FLEX,\n productName: \"Ledger Flex\",\n usbProductId: 0x70,\n bootloaderUsbProductId: 0x0007,\n usbOnly: false,\n memorySize: 1533 * 1024,\n blockSize: 32,\n masks: [0x33300000],\n });\n const getBluetoothServicesMock = vi.fn(() => [\"ledgerId\"]);\n const getBluetoothServicesInfosMock = vi.fn(() => ({\n ledgerId: new BleDeviceInfos(\n fakeDeviceModel,\n \"serviceUuid\",\n \"notifyUuid\",\n \"writeCmdUuid\",\n \"readCmdUuid\",\n ),\n }));\n const fakeDataSource = {\n getBluetoothServices: getBluetoothServicesMock,\n getBluetoothServicesInfos: getBluetoothServicesInfosMock,\n };\n\n let subscription: Subscription | undefined;\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n afterEach(() => {\n if (subscription) {\n subscription.unsubscribe();\n }\n });\n\n describe(\"getIdentifier\", () => {\n it(\"should return rnBleTransportIdentifier\", () => {\n // given\n const bleManager = new BleManager();\n const transport = new RNBleTransport(\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n );\n\n // when\n const identifier = transport.getIdentifier();\n\n // then\n expect(identifier).toStrictEqual(\"RN_BLE\");\n });\n });\n\n describe(\"isSupported\", () => {\n it(\"should return true if platform is ios\", async () => {\n // given\n const platform = { OS: \"ios\" };\n const bleManager = new BleManager();\n const transport = new RNBleTransport(\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n platform as Platform,\n );\n\n // when\n await transport.requestPermission();\n const isSupported = transport.isSupported();\n\n // then\n expect(isSupported).toBe(true);\n });\n\n it(\"should return true if platform is android and apiLevel < 31 with good permissions\", async () => {\n await expectAndroidSupportedResult(\n {\n version: 30,\n permissions: {\n ACCESS_FINE_LOCATION: \"ACCESS_FINE_LOCATION\",\n BLUETOOTH_SCAN: \"BLUETOOTH_SCAN\",\n BLUETOOTH_CONNECT: \"BLUETOOTH_CONNECT\",\n },\n requestPermissionResult: {\n \"android.permission.BLUETOOTH_CONNECT\": \"granted\",\n \"android.permission.BLUETOOTH_SCAN\": \"granted\",\n \"android.permission.ACCESS_FINE_LOCATION\": \"granted\",\n },\n },\n {\n isSupported: true,\n callRequestPermission: true,\n },\n );\n });\n\n it(\"should return true if platform is android and apiLevel >= 31 with good permissions\", async () => {\n await expectAndroidSupportedResult(\n {\n version: 31,\n permissions: {\n ACCESS_FINE_LOCATION: \"ACCESS_FINE_LOCATION\",\n BLUETOOTH_SCAN: \"BLUETOOTH_SCAN\",\n BLUETOOTH_CONNECT: \"BLUETOOTH_CONNECT\",\n },\n requestPermissionResult: {\n \"android.permission.BLUETOOTH_CONNECT\": \"granted\",\n \"android.permission.BLUETOOTH_SCAN\": \"granted\",\n \"android.permission.ACCESS_FINE_LOCATION\": \"granted\",\n },\n },\n {\n isSupported: true,\n callRequestPermission: false,\n },\n );\n });\n\n it(\"should return false if platform is android with bad permissions\", async () => {\n await expectAndroidSupportedResult(\n {\n version: 31,\n permissions: {\n ACCESS_FINE_LOCATION: \"\",\n BLUETOOTH_SCAN: \"\",\n BLUETOOTH_CONNECT: \"BLUETOOTH_CONNECT\",\n },\n requestPermissionResult: {\n \"android.permission.ACCESS_FINE_LOCATION\": \"denied\",\n \"android.permission.BLUETOOTH_CONNECT\": \"granted\",\n \"android.permission.BLUETOOTH_SCAN\": \"granted\",\n },\n },\n {\n isSupported: false,\n callRequestPermission: false,\n },\n );\n });\n\n it(\"should return false if platform is android and denied permissions\", async () => {\n await expectAndroidSupportedResult(\n {\n version: 31,\n permissions: {\n ACCESS_FINE_LOCATION: \"ACCESS_FINE_LOCATION\",\n BLUETOOTH_SCAN: \"BLUETOOTH_SCAN\",\n BLUETOOTH_CONNECT: \"BLUETOOTH_CONNECT\",\n },\n requestPermissionResult: {\n \"android.permission.BLUETOOTH_CONNECT\": \"denied\",\n \"android.permission.BLUETOOTH_SCAN\": \"denied\",\n \"android.permission.ACCESS_FINE_LOCATION\": \"denied\",\n },\n },\n {\n isSupported: false,\n callRequestPermission: false,\n },\n );\n });\n\n it(\"should return false if platform isn't android nor ios\", async () => {\n // given\n const bleManager = new BleManager();\n const transport = new RNBleTransport(\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n { OS: \"windows\" } as Platform,\n );\n\n // when\n await transport.requestPermission();\n const isSupported = transport.isSupported();\n\n // then\n expect(isSupported).toBe(false);\n });\n });\n\n // startDiscovering is not used / implemented anymore and just returns a from([])\n describe(\"startDiscovering\", () => {\n it(\"should throw error if transport is not supported\", () => {\n // given\n const platform = { OS: \"windows\" };\n const bleManager = new BleManager();\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n platform as Platform,\n );\n\n try {\n // when\n transport.startDiscovering();\n } catch (e) {\n // then\n expect(e).toBeInstanceOf(BleNotSupported);\n }\n });\n\n it(\"should emit an empty array\", () =>\n new Promise((done) => {\n // given\n const bleManager = new BleManager();\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n const observable = transport.startDiscovering();\n\n // then\n subscription = observable.subscribe({\n next: (discoveredDevice) => {\n expect(discoveredDevice).toStrictEqual([]);\n done(undefined);\n },\n error: (e) => {\n throw e;\n },\n complete: () => {\n // Will complete as we use from([])\n done(undefined);\n },\n });\n }));\n\n it.skip(\"should emit discovered new device\", () =>\n new Promise((done) => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n\n const bleManager = new BleManager();\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"id\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 500);\n\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n });\n\n return Promise.resolve();\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n return Promise.resolve();\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([]);\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n const observable = transport.startDiscovering();\n\n // then\n subscription = observable.subscribe({\n next: (discoveredDevice) => {\n expect(discoveredDevice).toStrictEqual([]);\n done(undefined);\n },\n error: (e) => {\n throw e;\n },\n complete: () => {\n throw new Error(\"complete should not be called\");\n },\n });\n }));\n\n it.skip(\"should emit both known and new device\", () =>\n new Promise((done) => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n\n const bleManager = new BleManager();\n const mockDevice = {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"newDeviceId\",\n localName: \"newDeviceName\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n } as unknown as Device);\n }, 500);\n\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n } as unknown as Device);\n\n return Promise.resolve();\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n return Promise.resolve();\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([\n mockDevice,\n ]);\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(\n vi.fn(),\n );\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n const obs = transport.startDiscovering();\n const discoveredDevices: Record<string, TransportDiscoveredDevice> = {};\n\n // then\n subscription = obs.subscribe({\n next: (device) => {\n discoveredDevices[device.id] = device;\n if (Object.values(discoveredDevices).length === 2) {\n expect(Object.values(discoveredDevices)).toStrictEqual([\n {\n id: \"knownDeviceId\",\n name: \"knownDeviceName\",\n deviceModel: fakeDeviceModel,\n transport: \"RN_BLE\",\n rssi: 64,\n },\n {\n id: \"newDeviceId\",\n name: \"newDeviceName\",\n deviceModel: fakeDeviceModel,\n transport: \"RN_BLE\",\n rssi: 42,\n },\n ]);\n done(undefined);\n }\n },\n });\n }));\n });\n\n describe(\"stopDiscovering\", () => {\n it(\"should call ble manager stop scan on stop discovering\", () => {\n // given\n const bleManager = new BleManager();\n const stopDeviceScan = vi.fn();\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([]);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopDeviceScan);\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n transport.stopDiscovering();\n\n // then\n expect(stopDeviceScan).toHaveBeenCalled();\n });\n\n it.skip(\"should call ble manager stop scan when unsubscribe startDiscovering obs\", () => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n\n const bleManager = new BleManager();\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"id\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 500);\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n });\n\n return Promise.resolve();\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n return Promise.resolve();\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([]);\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n transport.startDiscovering().subscribe().unsubscribe();\n\n // then\n expect(startScan).toHaveBeenCalled();\n expect(stopScan).toHaveBeenCalled();\n });\n });\n\n describe(\"listenToAvailableDevices\", () => {\n it(\"should call startScan and connectedDevices from ble manager\", () =>\n new Promise((done) => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n\n const bleManager = new BleManager();\n const mockDevice = {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"id\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 10);\n\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n });\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([\n mockDevice,\n ]);\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n subscription = transport.listenToAvailableDevices().subscribe({\n next: (devices) => {\n if (devices.length === 1) {\n // then\n expect(devices).toEqual([\n {\n id: \"id\",\n name: \"name\",\n deviceModel: fakeDeviceModel,\n transport: \"RN_BLE\",\n rssi: 42,\n },\n ]);\n done(undefined);\n }\n },\n });\n }));\n });\n\n describe(\"connect\", () => {\n let fakeConnectedDevices: Mock;\n\n beforeEach(() => {\n fakeConnectedDevices = vi.fn().mockResolvedValueOnce([\n {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"deviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n },\n ]);\n });\n\n it(\"should throw an error if device id is unknown\", async () => {\n // given\n const bleManager = new BleManager();\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockRejectedValueOnce(\n new Error(\"discoverAllServicesAndCharacteristicsForDevice error\"),\n );\n\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: vi.fn().mockResolvedValue(undefined),\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n vi.fn(),\n deviceApduSenderFactory,\n );\n\n // when\n const result = await transport.connect({\n // @ts-expect-error test case\n deviceId: null,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result).toEqual(\n Left(\n new OpeningConnectionError(\n `discoverAllServicesAndCharacteristicsForDevice error`,\n ),\n ),\n );\n });\n\n it(\"should connect to a discovered device with correct MTU and discover services and setup apdu sender\", async () => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n const bleManager = new BleManager();\n const mockDevice = {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi.fn().mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n services: vi.fn().mockResolvedValueOnce([\n {\n uuid: \"ledgerId\",\n },\n ]),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"deviceId\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 500);\n\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n });\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"connectToDevice\").mockResolvedValueOnce(mockDevice);\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockResolvedValueOnce(mockDevice);\n vi.spyOn(bleManager, \"monitorCharacteristicForDevice\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(\n bleManager,\n \"writeCharacteristicWithoutResponseForDevice\",\n ).mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n const fakeSetupConnection = vi.fn().mockResolvedValue(undefined);\n const deviceConnectionStateMachineFactory = vi.fn().mockReturnValue({\n sendApdu: vi.fn(),\n });\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: fakeSetupConnection,\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n deviceConnectionStateMachineFactory,\n deviceApduSenderFactory,\n );\n\n // when\n const [device] = await lastValueFrom(\n transport.listenToAvailableDevices().pipe(take(3)),\n );\n\n const result = await transport.connect({\n deviceId: device!.id,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result.isRight()).toBe(true);\n expect(bleManager.connectToDevice).toHaveBeenCalledWith(\"deviceId\", {\n requestMTU: 156,\n });\n expect(\n bleManager.discoverAllServicesAndCharacteristicsForDevice,\n ).toHaveBeenCalledWith(\"deviceId\");\n expect(fakeSetupConnection).toHaveBeenCalled();\n });\n\n it(\"should return a connected device which calls state machine sendApdu\", async () => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n const bleManager = new BleManager();\n const mockDevice = {\n id: \"deviceId\",\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi.fn().mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n services: vi.fn().mockResolvedValueOnce([\n {\n uuid: \"ledgerId\",\n },\n ]),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"deviceId\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 100);\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"connectToDevice\").mockResolvedValueOnce(mockDevice);\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockResolvedValueOnce(mockDevice);\n vi.spyOn(bleManager, \"monitorCharacteristicForDevice\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(\n bleManager,\n \"writeCharacteristicWithoutResponseForDevice\",\n ).mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n const fakeSendApdu = vi.fn();\n const deviceConnectionStateMachineFactory = vi.fn().mockReturnValue({\n sendApdu: fakeSendApdu,\n });\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: vi.fn().mockResolvedValue(undefined),\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n deviceConnectionStateMachineFactory,\n deviceApduSenderFactory,\n );\n\n // when\n const [device] = await lastValueFrom(\n transport.listenToAvailableDevices().pipe(take(3)),\n );\n\n const result = await transport.connect({\n deviceId: device!.id,\n onDisconnect: vi.fn(),\n });\n\n const connectedDevice = result.extract() as TransportConnectedDevice;\n connectedDevice.sendApdu(Uint8Array.from([0x43, 0x32]));\n // then\n expect(result).toEqual(\n Right(\n new TransportConnectedDevice({\n id: \"deviceId\",\n deviceModel: fakeDeviceModel,\n type: \"BLE\",\n transport: \"RN_BLE\",\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n sendApdu: expect.any(Function),\n }),\n ),\n );\n expect(fakeSendApdu).toHaveBeenCalledWith(Uint8Array.from([0x43, 0x32]));\n });\n });\n\n describe(\"disconnect\", () => {\n let fakeConnectedDevices: Mock;\n\n beforeEach(() => {\n fakeConnectedDevices = vi.fn().mockResolvedValue([\n {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"deviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n },\n ]);\n });\n\n it(\"should disconnect gracefully\", async () => {\n let scanInterval: NodeJS.Timeout | null = null;\n const bleManager = new BleManager();\n const mockDevice = {\n id: \"deviceId\",\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi.fn().mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n services: vi.fn().mockResolvedValueOnce([\n {\n uuid: \"ledgerId\",\n },\n ]),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"deviceId\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 100);\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n const onDeviceDisconnected = vi\n .fn()\n .mockImplementation((_id, callback) => {\n callback(null, {\n deviceId: \"deviceId\",\n connect: vi.fn().mockResolvedValue({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"deviceId\",\n localName: \"knownDeviceName\",\n }),\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"deviceId\",\n localName: \"knownDeviceName\",\n }),\n });\n return { remove: vi.fn() };\n });\n\n const fakeCloseConnection = vi.fn();\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"connectToDevice\").mockResolvedValueOnce(mockDevice);\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockResolvedValueOnce(mockDevice);\n vi.spyOn(bleManager, \"monitorCharacteristicForDevice\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(\n bleManager,\n \"writeCharacteristicWithoutResponseForDevice\",\n ).mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(\n onDeviceDisconnected,\n );\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n\n const deviceConnectionStateMachineFactory = (\n _args: DeviceConnectionStateMachineParams<RNBleApduSenderDependencies>,\n ) => {\n return new DeviceConnectionStateMachine({\n deviceId: \"deviceId\",\n deviceApduSender: _args.deviceApduSender,\n timeoutDuration: 1000,\n onTerminated: _args.onTerminated,\n });\n };\n\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: vi.fn().mockResolvedValue(undefined),\n closeConnection: fakeCloseConnection,\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n deviceConnectionStateMachineFactory,\n deviceApduSenderFactory,\n );\n\n const fakeOnDisconnect = vi.fn();\n\n // when\n const [device] = await lastValueFrom(\n transport.listenToAvailableDevices().pipe(take(3)),\n );\n\n const result = await transport.connect({\n deviceId: device!.id,\n onDisconnect: fakeOnDisconnect,\n });\n\n const res = await transport.disconnect({\n connectedDevice: result.extract() as TransportConnectedDevice,\n });\n\n // then\n expect(res).toEqual(Right(undefined));\n expect(fakeOnDisconnect).toHaveBeenCalled();\n expect(fakeCloseConnection).toHaveBeenCalled();\n });\n\n it(\"should handle error while disconnecting\", async () => {\n let scanInterval: NodeJS.Timeout | null = null;\n const bleManager = new BleManager();\n const mockDevice = {\n id: \"deviceId\",\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi.fn().mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n services: vi.fn().mockResolvedValueOnce([\n {\n uuid: \"ledgerId\",\n },\n ]),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"deviceId\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 100);\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n const onDeviceDisconnected = vi\n .fn()\n .mockImplementation((_id, callback) => {\n callback(new Error(\"yolo\"), null);\n return { remove: vi.fn() };\n });\n\n const fakeCloseConnection = vi.fn();\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"connectToDevice\").mockResolvedValueOnce(mockDevice);\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockResolvedValueOnce(mockDevice);\n vi.spyOn(bleManager, \"monitorCharacteristicForDevice\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(\n bleManager,\n \"writeCharacteristicWithoutResponseForDevice\",\n ).mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(\n onDeviceDisconnected,\n );\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n\n const deviceConnectionStateMachineFactory = (\n _args: DeviceConnectionStateMachineParams<RNBleApduSenderDependencies>,\n ) => {\n return new DeviceConnectionStateMachine({\n deviceId: \"deviceId\",\n deviceApduSender: _args.deviceApduSender,\n timeoutDuration: 1000,\n onTerminated: _args.onTerminated,\n });\n };\n\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: vi.fn().mockResolvedValue(undefined),\n closeConnection: fakeCloseConnection,\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n deviceConnectionStateMachineFactory,\n deviceApduSenderFactory,\n );\n\n const fakeOnDisconnect = vi.fn();\n\n // when\n const [device] = await lastValueFrom(\n transport.listenToAvailableDevices().pipe(take(3)),\n );\n const result = await transport.connect({\n deviceId: device!.id,\n onDisconnect: fakeOnDisconnect,\n });\n\n const res = await transport.disconnect({\n connectedDevice: result.extract() as TransportConnectedDevice,\n });\n\n // then\n expect(res).toEqual(Right(undefined));\n expect(fakeOnDisconnect).toHaveBeenCalled();\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: off */\nimport { type PermissionsAndroid, type Platform } from \"react-native\";\nimport { type PermissionStatus } from \"react-native/Libraries/PermissionsAndroid/PermissionsAndroid\";\nimport { BleManager, type Device, State } from \"react-native-ble-plx\";\nimport {\n type ApduReceiverServiceFactory,\n type ApduSenderServiceFactory,\n BleDeviceInfos,\n DeviceConnectionStateMachine,\n type DeviceConnectionStateMachineParams,\n type DeviceModelDataSource,\n DeviceModelId,\n type DmkConfig,\n type LoggerPublisherService,\n OpeningConnectionError,\n TransportConnectedDevice,\n TransportDeviceModel,\n type TransportDiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { lastValueFrom, Subscription, take } from \"rxjs\";\nimport { beforeEach, expect, type Mock } from \"vitest\";\n\nimport { BleNotSupported } from \"@api/model/Errors\";\n\nimport { type RNBleApduSenderDependencies } from \"./RNBleApduSender\";\nimport { RNBleTransport, RNBleTransportFactory } from \"./RNBleTransport\";\n\nconst fakeLogger = {\n error: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n debug: vi.fn(),\n};\n\nvi.mock(\"react-native\", () => ({\n Platform: {},\n PermissionsAndroid: {},\n}));\n\nvi.mock(\"react-native-ble-plx\", () => ({\n Device: vi.fn(),\n State: {\n PoweredOn: \"PoweredOn\",\n Unknown: \"Unknown\",\n },\n BleError: vi.fn(),\n BleManager: vi.fn().mockReturnValue({\n onStateChange: vi.fn(),\n startDeviceScan: vi.fn(),\n stopDeviceScan: vi.fn(),\n connectToDevice: vi.fn(),\n disconnectFromDevice: vi.fn(),\n cancelDeviceConnection: vi.fn(),\n connectedDevices: vi.fn(),\n monitorCharacteristicForDevice: vi.fn(),\n writeCharacteristicWithoutResponseForDevice: vi.fn(),\n discoverAllServicesAndCharacteristicsForDevice: vi.fn(),\n onDeviceDisconnected: vi.fn(),\n isDeviceConnected: vi.fn(),\n }),\n}));\n\nconst expectAndroidSupportedResult = async (\n params: {\n version: number;\n permissions: Record<string, string>;\n requestPermissionResult: {\n \"android.permission.BLUETOOTH_CONNECT\": PermissionStatus;\n \"android.permission.BLUETOOTH_SCAN\": PermissionStatus;\n \"android.permission.ACCESS_FINE_LOCATION\": PermissionStatus;\n };\n accessFineLocationResult?: PermissionStatus;\n },\n expects: {\n isSupported: boolean;\n callRequestPermission: boolean;\n },\n) => {\n // given\n const platform = { OS: \"android\", Version: params.version };\n const permissionsAndroid = {\n request: vi.fn().mockImplementation((key: string) =>\n Promise.resolve(\n {\n ACCESS_FINE_LOCATION: params.accessFineLocationResult,\n }[key],\n ),\n ),\n PERMISSIONS: params.permissions,\n RESULTS: {\n GRANTED: \"granted\",\n },\n requestMultiple: vi\n .fn()\n .mockImplementation(() =>\n Promise.resolve(params.requestPermissionResult),\n ),\n };\n const transport = new RNBleTransport(\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n new BleManager(),\n platform as Platform,\n permissionsAndroid as unknown as PermissionsAndroid,\n );\n // when\n await transport.requestPermission();\n const isSupported = transport.isSupported();\n // then\n if (expects.callRequestPermission) {\n expect(permissionsAndroid.request).toHaveBeenCalledWith(\n \"ACCESS_FINE_LOCATION\",\n );\n }\n expect(isSupported).toBe(expects.isSupported);\n};\n\ndescribe(\"RNBleTransportFactory\", () => {\n it(\"should return a RNBleTransport\", () => {\n const fakeArgs = {\n deviceModelDataSource:\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n loggerServiceFactory: () =>\n fakeLogger as unknown as LoggerPublisherService,\n apduSenderServiceFactory:\n (() => {}) as unknown as ApduSenderServiceFactory,\n apduReceiverServiceFactory:\n (() => {}) as unknown as ApduReceiverServiceFactory,\n config: {} as DmkConfig,\n };\n // when\n const transport = RNBleTransportFactory(fakeArgs);\n // then\n expect(transport).toBeInstanceOf(RNBleTransport);\n });\n});\n\ndescribe(\"RNBleTransport\", () => {\n const fakePlaftorm = { OS: \"ios\" };\n const fakeDeviceModel = new TransportDeviceModel({\n id: DeviceModelId.FLEX,\n productName: \"Ledger Flex\",\n usbProductId: 0x70,\n bootloaderUsbProductId: 0x0007,\n usbOnly: false,\n memorySize: 1533 * 1024,\n blockSize: 32,\n masks: [0x33300000],\n });\n const getBluetoothServicesMock = vi.fn(() => [\"ledgerId\"]);\n const getBluetoothServicesInfosMock = vi.fn(() => ({\n ledgerId: new BleDeviceInfos(\n fakeDeviceModel,\n \"serviceUuid\",\n \"notifyUuid\",\n \"writeCmdUuid\",\n \"readCmdUuid\",\n ),\n }));\n const fakeDataSource = {\n getBluetoothServices: getBluetoothServicesMock,\n getBluetoothServicesInfos: getBluetoothServicesInfosMock,\n };\n\n let subscription: Subscription | undefined;\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n afterEach(() => {\n if (subscription) {\n subscription.unsubscribe();\n }\n });\n\n describe(\"getIdentifier\", () => {\n it(\"should return rnBleTransportIdentifier\", () => {\n // given\n const bleManager = new BleManager();\n const transport = new RNBleTransport(\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n );\n\n // when\n const identifier = transport.getIdentifier();\n\n // then\n expect(identifier).toStrictEqual(\"RN_BLE\");\n });\n });\n\n describe(\"isSupported\", () => {\n it(\"should return true if platform is ios\", async () => {\n // given\n const platform = { OS: \"ios\" };\n const bleManager = new BleManager();\n const transport = new RNBleTransport(\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n platform as Platform,\n );\n\n // when\n await transport.requestPermission();\n const isSupported = transport.isSupported();\n\n // then\n expect(isSupported).toBe(true);\n });\n\n it(\"should return true if platform is android and apiLevel < 31 with good permissions\", async () => {\n await expectAndroidSupportedResult(\n {\n version: 30,\n permissions: {\n ACCESS_FINE_LOCATION: \"ACCESS_FINE_LOCATION\",\n BLUETOOTH_SCAN: \"BLUETOOTH_SCAN\",\n BLUETOOTH_CONNECT: \"BLUETOOTH_CONNECT\",\n },\n requestPermissionResult: {\n \"android.permission.BLUETOOTH_CONNECT\": \"granted\",\n \"android.permission.BLUETOOTH_SCAN\": \"granted\",\n \"android.permission.ACCESS_FINE_LOCATION\": \"granted\",\n },\n },\n {\n isSupported: true,\n callRequestPermission: true,\n },\n );\n });\n\n it(\"should return true if platform is android and apiLevel >= 31 with good permissions\", async () => {\n await expectAndroidSupportedResult(\n {\n version: 31,\n permissions: {\n ACCESS_FINE_LOCATION: \"ACCESS_FINE_LOCATION\",\n BLUETOOTH_SCAN: \"BLUETOOTH_SCAN\",\n BLUETOOTH_CONNECT: \"BLUETOOTH_CONNECT\",\n },\n requestPermissionResult: {\n \"android.permission.BLUETOOTH_CONNECT\": \"granted\",\n \"android.permission.BLUETOOTH_SCAN\": \"granted\",\n \"android.permission.ACCESS_FINE_LOCATION\": \"granted\",\n },\n },\n {\n isSupported: true,\n callRequestPermission: false,\n },\n );\n });\n\n it(\"should return false if platform is android with bad permissions\", async () => {\n await expectAndroidSupportedResult(\n {\n version: 31,\n permissions: {\n ACCESS_FINE_LOCATION: \"\",\n BLUETOOTH_SCAN: \"\",\n BLUETOOTH_CONNECT: \"BLUETOOTH_CONNECT\",\n },\n requestPermissionResult: {\n \"android.permission.ACCESS_FINE_LOCATION\": \"denied\",\n \"android.permission.BLUETOOTH_CONNECT\": \"granted\",\n \"android.permission.BLUETOOTH_SCAN\": \"granted\",\n },\n },\n {\n isSupported: false,\n callRequestPermission: false,\n },\n );\n });\n\n it(\"should return false if platform is android and denied permissions\", async () => {\n await expectAndroidSupportedResult(\n {\n version: 31,\n permissions: {\n ACCESS_FINE_LOCATION: \"ACCESS_FINE_LOCATION\",\n BLUETOOTH_SCAN: \"BLUETOOTH_SCAN\",\n BLUETOOTH_CONNECT: \"BLUETOOTH_CONNECT\",\n },\n requestPermissionResult: {\n \"android.permission.BLUETOOTH_CONNECT\": \"denied\",\n \"android.permission.BLUETOOTH_SCAN\": \"denied\",\n \"android.permission.ACCESS_FINE_LOCATION\": \"denied\",\n },\n },\n {\n isSupported: false,\n callRequestPermission: false,\n },\n );\n });\n\n it(\"should return false if platform isn't android nor ios\", async () => {\n // given\n const bleManager = new BleManager();\n const transport = new RNBleTransport(\n \"DeviceModelDataSource\" as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n { OS: \"windows\" } as Platform,\n );\n\n // when\n await transport.requestPermission();\n const isSupported = transport.isSupported();\n\n // then\n expect(isSupported).toBe(false);\n });\n });\n\n // startDiscovering is not used / implemented anymore and just returns a from([])\n describe(\"startDiscovering\", () => {\n it(\"should throw error if transport is not supported\", () => {\n // given\n const platform = { OS: \"windows\" };\n const bleManager = new BleManager();\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n platform as Platform,\n );\n\n try {\n // when\n transport.startDiscovering();\n } catch (e) {\n // then\n expect(e).toBeInstanceOf(BleNotSupported);\n }\n });\n\n it(\"should emit an empty array\", () =>\n new Promise((done) => {\n // given\n const bleManager = new BleManager();\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n const observable = transport.startDiscovering();\n\n // then\n subscription = observable.subscribe({\n next: (discoveredDevice) => {\n expect(discoveredDevice).toStrictEqual([]);\n done(undefined);\n },\n error: (e) => {\n throw e;\n },\n complete: () => {\n // Will complete as we use from([])\n done(undefined);\n },\n });\n }));\n\n it.skip(\"should emit discovered new device\", () =>\n new Promise((done) => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n\n const bleManager = new BleManager();\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"id\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 500);\n\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n });\n\n return Promise.resolve();\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n return Promise.resolve();\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([]);\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n const observable = transport.startDiscovering();\n\n // then\n subscription = observable.subscribe({\n next: (discoveredDevice) => {\n expect(discoveredDevice).toStrictEqual([]);\n done(undefined);\n },\n error: (e) => {\n throw e;\n },\n complete: () => {\n throw new Error(\"complete should not be called\");\n },\n });\n }));\n\n it.skip(\"should emit both known and new device\", () =>\n new Promise((done) => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n\n const bleManager = new BleManager();\n const mockDevice = {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"newDeviceId\",\n localName: \"newDeviceName\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n } as unknown as Device);\n }, 500);\n\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n } as unknown as Device);\n\n return Promise.resolve();\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n return Promise.resolve();\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([\n mockDevice,\n ]);\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(\n vi.fn(),\n );\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n const obs = transport.startDiscovering();\n const discoveredDevices: Record<string, TransportDiscoveredDevice> = {};\n\n // then\n subscription = obs.subscribe({\n next: (device) => {\n discoveredDevices[device.id] = device;\n if (Object.values(discoveredDevices).length === 2) {\n expect(Object.values(discoveredDevices)).toStrictEqual([\n {\n id: \"knownDeviceId\",\n name: \"knownDeviceName\",\n deviceModel: fakeDeviceModel,\n transport: \"RN_BLE\",\n rssi: 64,\n },\n {\n id: \"newDeviceId\",\n name: \"newDeviceName\",\n deviceModel: fakeDeviceModel,\n transport: \"RN_BLE\",\n rssi: 42,\n },\n ]);\n done(undefined);\n }\n },\n });\n }));\n });\n\n describe(\"stopDiscovering\", () => {\n it(\"should call ble manager stop scan on stop discovering\", () => {\n // given\n const bleManager = new BleManager();\n const stopDeviceScan = vi.fn();\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([]);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopDeviceScan);\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n transport.stopDiscovering();\n\n // then\n expect(stopDeviceScan).toHaveBeenCalled();\n });\n\n it.skip(\"should call ble manager stop scan when unsubscribe startDiscovering obs\", () => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n\n const bleManager = new BleManager();\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"id\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 500);\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n });\n\n return Promise.resolve();\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n return Promise.resolve();\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([]);\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n transport.startDiscovering().subscribe().unsubscribe();\n\n // then\n expect(startScan).toHaveBeenCalled();\n expect(stopScan).toHaveBeenCalled();\n });\n });\n\n describe(\"listenToAvailableDevices\", () => {\n it(\"should call startScan and connectedDevices from ble manager\", () =>\n new Promise((done) => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n\n const bleManager = new BleManager();\n const mockDevice = {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"id\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 10);\n\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n });\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockResolvedValueOnce([\n mockDevice,\n ]);\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n );\n\n // when\n subscription = transport.listenToAvailableDevices().subscribe({\n next: (devices) => {\n if (devices.length === 1) {\n // then\n expect(devices).toEqual([\n {\n id: \"id\",\n name: \"name\",\n deviceModel: fakeDeviceModel,\n transport: \"RN_BLE\",\n rssi: 42,\n },\n ]);\n done(undefined);\n }\n },\n });\n }));\n });\n\n describe(\"connect\", () => {\n let fakeConnectedDevices: Mock;\n\n beforeEach(() => {\n fakeConnectedDevices = vi.fn().mockResolvedValueOnce([\n {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"deviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n },\n ]);\n });\n\n it(\"should throw an error if device id is unknown\", async () => {\n // given\n const bleManager = new BleManager();\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockRejectedValueOnce(\n new Error(\"discoverAllServicesAndCharacteristicsForDevice error\"),\n );\n\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: vi.fn().mockResolvedValue(undefined),\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n vi.fn(),\n deviceApduSenderFactory,\n );\n\n // when\n const result = await transport.connect({\n // @ts-expect-error test case\n deviceId: null,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result).toEqual(\n Left(\n new OpeningConnectionError(\n `discoverAllServicesAndCharacteristicsForDevice error`,\n ),\n ),\n );\n });\n\n it(\"should connect to a discovered device with correct MTU and discover services and setup apdu sender\", async () => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n const bleManager = new BleManager();\n const mockDevice = {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi.fn().mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n services: vi.fn().mockResolvedValueOnce([\n {\n uuid: \"ledgerId\",\n },\n ]),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"deviceId\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 500);\n\n listener(null, {\n id: \"43\",\n localName: \"name43\",\n serviceUUIDs: [\"notLedgerId\"],\n rssi: 43,\n });\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"connectToDevice\").mockResolvedValueOnce(mockDevice);\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockResolvedValueOnce(mockDevice);\n vi.spyOn(bleManager, \"monitorCharacteristicForDevice\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(\n bleManager,\n \"writeCharacteristicWithoutResponseForDevice\",\n ).mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n const fakeSetupConnection = vi.fn().mockResolvedValue(undefined);\n const deviceConnectionStateMachineFactory = vi.fn().mockReturnValue({\n sendApdu: vi.fn(),\n });\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: fakeSetupConnection,\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n deviceConnectionStateMachineFactory,\n deviceApduSenderFactory,\n );\n\n // when\n const [device] = await lastValueFrom(\n transport.listenToAvailableDevices().pipe(take(3)),\n );\n\n const result = await transport.connect({\n deviceId: device!.id,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result.isRight()).toBe(true);\n expect(bleManager.connectToDevice).toHaveBeenCalledWith(\"deviceId\", {\n requestMTU: 156,\n });\n expect(\n bleManager.discoverAllServicesAndCharacteristicsForDevice,\n ).toHaveBeenCalledWith(\"deviceId\");\n expect(fakeSetupConnection).toHaveBeenCalled();\n });\n\n it(\"should return a connected device which calls state machine sendApdu\", async () => {\n // given\n let scanInterval: NodeJS.Timeout | null = null;\n const bleManager = new BleManager();\n const mockDevice = {\n id: \"deviceId\",\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi.fn().mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n services: vi.fn().mockResolvedValueOnce([\n {\n uuid: \"ledgerId\",\n },\n ]),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"deviceId\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 100);\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"connectToDevice\").mockResolvedValueOnce(mockDevice);\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockResolvedValueOnce(mockDevice);\n vi.spyOn(bleManager, \"monitorCharacteristicForDevice\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(\n bleManager,\n \"writeCharacteristicWithoutResponseForDevice\",\n ).mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n const fakeSendApdu = vi.fn();\n const deviceConnectionStateMachineFactory = vi.fn().mockReturnValue({\n sendApdu: fakeSendApdu,\n });\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: vi.fn().mockResolvedValue(undefined),\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n deviceConnectionStateMachineFactory,\n deviceApduSenderFactory,\n );\n\n // when\n const [device] = await lastValueFrom(\n transport.listenToAvailableDevices().pipe(take(3)),\n );\n\n const result = await transport.connect({\n deviceId: device!.id,\n onDisconnect: vi.fn(),\n });\n\n const connectedDevice = result.extract() as TransportConnectedDevice;\n connectedDevice.sendApdu(Uint8Array.from([0x43, 0x32]));\n // then\n expect(result).toEqual(\n Right(\n new TransportConnectedDevice({\n id: \"deviceId\",\n deviceModel: fakeDeviceModel,\n type: \"BLE\",\n transport: \"RN_BLE\",\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n sendApdu: expect.any(Function),\n }),\n ),\n );\n expect(fakeSendApdu).toHaveBeenCalledWith(Uint8Array.from([0x43, 0x32]));\n });\n });\n\n describe(\"disconnect\", () => {\n let fakeConnectedDevices: Mock;\n\n beforeEach(() => {\n fakeConnectedDevices = vi.fn().mockResolvedValue([\n {\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"deviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n },\n ]);\n });\n\n it(\"should disconnect gracefully\", async () => {\n let scanInterval: NodeJS.Timeout | null = null;\n const bleManager = new BleManager();\n const mockDevice = {\n id: \"deviceId\",\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi.fn().mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n services: vi.fn().mockResolvedValueOnce([\n {\n uuid: \"ledgerId\",\n },\n ]),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"deviceId\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 100);\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n const onDeviceDisconnected = vi\n .fn()\n .mockImplementation((_id, callback) => {\n callback(null, {\n deviceId: \"deviceId\",\n connect: vi.fn().mockResolvedValue({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"deviceId\",\n localName: \"knownDeviceName\",\n }),\n discoverAllServicesAndCharacteristics: vi\n .fn()\n .mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"deviceId\",\n localName: \"knownDeviceName\",\n }),\n });\n return { remove: vi.fn() };\n });\n\n const fakeCloseConnection = vi.fn();\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"connectToDevice\").mockResolvedValueOnce(mockDevice);\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockResolvedValueOnce(mockDevice);\n vi.spyOn(bleManager, \"monitorCharacteristicForDevice\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(\n bleManager,\n \"writeCharacteristicWithoutResponseForDevice\",\n ).mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(\n onDeviceDisconnected,\n );\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n\n const deviceConnectionStateMachineFactory = (\n _args: DeviceConnectionStateMachineParams<RNBleApduSenderDependencies>,\n ) => {\n return new DeviceConnectionStateMachine({\n deviceId: \"deviceId\",\n deviceApduSender: _args.deviceApduSender,\n timeoutDuration: 1000,\n onTerminated: _args.onTerminated,\n tryToReconnect: _args.tryToReconnect,\n });\n };\n\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: vi.fn().mockResolvedValue(undefined),\n closeConnection: fakeCloseConnection,\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n deviceConnectionStateMachineFactory,\n deviceApduSenderFactory,\n );\n\n const fakeOnDisconnect = vi.fn();\n\n // when\n const [device] = await lastValueFrom(\n transport.listenToAvailableDevices().pipe(take(3)),\n );\n\n const result = await transport.connect({\n deviceId: device!.id,\n onDisconnect: fakeOnDisconnect,\n });\n\n const res = await transport.disconnect({\n connectedDevice: result.extract() as TransportConnectedDevice,\n });\n\n // then\n expect(res).toEqual(Right(undefined));\n expect(fakeOnDisconnect).toHaveBeenCalled();\n expect(fakeCloseConnection).toHaveBeenCalled();\n });\n\n it(\"should handle error while disconnecting\", async () => {\n let scanInterval: NodeJS.Timeout | null = null;\n const bleManager = new BleManager();\n const mockDevice = {\n id: \"deviceId\",\n readRSSI: vi.fn().mockResolvedValueOnce({\n discoverAllServicesAndCharacteristics: vi.fn().mockResolvedValueOnce({\n services: vi.fn().mockResolvedValueOnce({}),\n serviceUUIDs: [\"ledgerId\"],\n rssi: 64,\n id: \"knownDeviceId\",\n localName: \"knownDeviceName\",\n }),\n }),\n services: vi.fn().mockResolvedValueOnce([\n {\n uuid: \"ledgerId\",\n },\n ]),\n } as unknown as Device;\n\n const startScan = vi\n .fn()\n .mockImplementation((_uuids, _options, listener) => {\n scanInterval = setInterval(() => {\n listener(null, {\n id: \"deviceId\",\n localName: \"name\",\n serviceUUIDs: [\"ledgerId\"],\n rssi: 42,\n });\n }, 100);\n });\n\n const stopScan = vi.fn().mockImplementation(() => {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n });\n\n const onDeviceDisconnected = vi\n .fn()\n .mockImplementation((_id, callback) => {\n callback(new Error(\"yolo\"), null);\n return { remove: vi.fn() };\n });\n\n const fakeCloseConnection = vi.fn();\n\n vi.spyOn(bleManager, \"connectedDevices\").mockImplementation(\n fakeConnectedDevices,\n );\n vi.spyOn(bleManager, \"startDeviceScan\").mockImplementation(startScan);\n vi.spyOn(bleManager, \"stopDeviceScan\").mockImplementation(stopScan);\n vi.spyOn(bleManager, \"connectToDevice\").mockResolvedValueOnce(mockDevice);\n vi.spyOn(\n bleManager,\n \"discoverAllServicesAndCharacteristicsForDevice\",\n ).mockResolvedValueOnce(mockDevice);\n vi.spyOn(bleManager, \"monitorCharacteristicForDevice\").mockImplementation(\n vi.fn(),\n );\n vi.spyOn(\n bleManager,\n \"writeCharacteristicWithoutResponseForDevice\",\n ).mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n vi.spyOn(bleManager, \"onStateChange\").mockImplementation(\n (listener: (state: State) => void) => {\n listener(State.PoweredOn);\n return {\n remove: vi.fn(),\n };\n },\n );\n\n vi.spyOn(bleManager, \"onDeviceDisconnected\").mockImplementation(\n onDeviceDisconnected,\n );\n vi.spyOn(bleManager, \"isDeviceConnected\").mockImplementation(vi.fn());\n\n const deviceConnectionStateMachineFactory = (\n _args: DeviceConnectionStateMachineParams<RNBleApduSenderDependencies>,\n ) => {\n return new DeviceConnectionStateMachine({\n deviceId: \"deviceId\",\n deviceApduSender: _args.deviceApduSender,\n timeoutDuration: 1000,\n onTerminated: _args.onTerminated,\n tryToReconnect: _args.tryToReconnect,\n });\n };\n\n const deviceApduSenderFactory = vi.fn().mockReturnValue({\n setupConnection: vi.fn().mockResolvedValue(undefined),\n closeConnection: fakeCloseConnection,\n });\n\n const transport = new RNBleTransport(\n fakeDataSource as unknown as DeviceModelDataSource,\n () => fakeLogger as unknown as LoggerPublisherService,\n (() => {}) as unknown as ApduSenderServiceFactory,\n (() => {}) as unknown as ApduReceiverServiceFactory,\n bleManager,\n fakePlaftorm as Platform,\n {} as unknown as PermissionsAndroid,\n deviceConnectionStateMachineFactory,\n deviceApduSenderFactory,\n );\n\n const fakeOnDisconnect = vi.fn();\n\n // when\n const [device] = await lastValueFrom(\n transport.listenToAvailableDevices().pipe(take(3)),\n );\n const result = await transport.connect({\n deviceId: device!.id,\n onDisconnect: fakeOnDisconnect,\n });\n\n const res = await transport.disconnect({\n connectedDevice: result.extract() as TransportConnectedDevice,\n });\n\n // then\n expect(res).toEqual(Right(undefined));\n expect(fakeOnDisconnect).toHaveBeenCalled();\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["BleManager", "State", "BleDeviceInfos", "DeviceConnectionStateMachine", "DeviceModelId", "OpeningConnectionError", "TransportConnectedDevice", "TransportDeviceModel", "Left", "Right", "lastValueFrom", "take", "beforeEach", "expect", "BleNotSupported", "RNBleTransport", "RNBleTransportFactory", "fakeLogger", "expectAndroidSupportedResult", "params", "expects", "platform", "permissionsAndroid", "key", "transport", "isSupported", "fakePlaftorm", "fakeDeviceModel", "getBluetoothServicesMock", "getBluetoothServicesInfosMock", "fakeDataSource", "subscription", "bleManager", "identifier", "e", "done", "discoveredDevice", "scanInterval", "startScan", "_uuids", "_options", "listener", "stopScan", "mockDevice", "obs", "discoveredDevices", "device", "stopDeviceScan", "devices", "fakeConnectedDevices", "deviceApduSenderFactory", "result", "fakeSetupConnection", "deviceConnectionStateMachineFactory", "fakeSendApdu", "onDeviceDisconnected", "_id", "callback", "fakeCloseConnection", "_args", "fakeOnDisconnect", "res"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RNBleApduSender.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/RNBleApduSender.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,MAAM,EAEZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,MAAM,EAA+B,MAAM,WAAW,CAAC;AAOrE,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,QAAQ,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,YAAY,EAAE,2BAA2B,CAAC;IAC1C,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,mBAAmB,EAAE,0BAA0B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,mBAAmB,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,qBAAa,eACX,YAAW,gBAAgB,CAAC,2BAA2B,CAAC;IAExD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2B;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,wBAAwB,CAE9B;IAEF,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,2BAA2B,CAET;gBAGxB,EACE,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,GACb,EAAE,8BAA8B,EACjC,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB;IAW/D,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,KAAK;IAQN,eAAe;IAIf,eAAe,CAAC,YAAY,EAAE,2BAA2B;IAYnD,eAAe;IAkFtB,QAAQ,CACZ,IAAI,EAAE,UAAU,EAChB,sBAAsB,CAAC,EAAE,OAAO,EAChC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"RNBleApduSender.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/RNBleApduSender.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,MAAM,EAEZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,MAAM,EAA+B,MAAM,WAAW,CAAC;AAOrE,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,QAAQ,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,YAAY,EAAE,2BAA2B,CAAC;IAC1C,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,mBAAmB,EAAE,0BAA0B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,mBAAmB,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,qBAAa,eACX,YAAW,gBAAgB,CAAC,2BAA2B,CAAC;IAExD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2B;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,wBAAwB,CAE9B;IAEF,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,2BAA2B,CAET;gBAGxB,EACE,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,GACb,EAAE,8BAA8B,EACjC,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB;IAW/D,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,KAAK;IAQN,eAAe;IAIf,eAAe,CAAC,YAAY,EAAE,2BAA2B;IAYnD,eAAe;IAkFtB,QAAQ,CACZ,IAAI,EAAE,UAAU,EAChB,sBAAsB,CAAC,EAAE,OAAO,EAChC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAgDnC,eAAe;CAGvB"}
|
|
@@ -104,6 +104,7 @@ export declare class RNBleTransport implements Transport {
|
|
|
104
104
|
* @return {void}
|
|
105
105
|
*/
|
|
106
106
|
private _handleDeviceDisconnected;
|
|
107
|
+
private tryToReconnect;
|
|
107
108
|
/**
|
|
108
109
|
* Handles the reconnection of a device. Configures the device connection and its corresponding
|
|
109
110
|
* internal device upon reconnection, including updating the connection state, registering
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RNBleTransport.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/RNBleTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAY,UAAU,EAAsB,MAAM,sBAAsB,CAAC;AAChF,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAE7B,KAAK,YAAY,EACjB,4BAA4B,EAC5B,KAAK,kCAAkC,EACvC,KAAK,QAAQ,EACb,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EACd,wBAAwB,EAExB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAEzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,MAAM,EAA4C,MAAM,WAAW,CAAC;AAC7E,OAAO,
|
|
1
|
+
{"version":3,"file":"RNBleTransport.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/RNBleTransport.ts"],"names":[],"mappings":"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"}
|