@ledgerhq/device-transport-kit-node-hid 0.0.0-develop-20260212001325
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/LICENSE.MD +202 -0
- package/README.md +74 -0
- package/lib/cjs/api/data/NodeHidConfig.js +2 -0
- package/lib/cjs/api/data/NodeHidConfig.js.map +7 -0
- package/lib/cjs/api/index.js +2 -0
- package/lib/cjs/api/index.js.map +7 -0
- package/lib/cjs/api/model/Errors.js +2 -0
- package/lib/cjs/api/model/Errors.js.map +7 -0
- package/lib/cjs/api/model/HIDDevice.stub.js +2 -0
- package/lib/cjs/api/model/HIDDevice.stub.js.map +7 -0
- package/lib/cjs/api/transport/NodeHidApduSender.js +2 -0
- package/lib/cjs/api/transport/NodeHidApduSender.js.map +7 -0
- package/lib/cjs/api/transport/NodeHidApduSender.test.js +2 -0
- package/lib/cjs/api/transport/NodeHidApduSender.test.js.map +7 -0
- package/lib/cjs/api/transport/NodeHidTransport.js +2 -0
- package/lib/cjs/api/transport/NodeHidTransport.js.map +7 -0
- package/lib/cjs/api/transport/NodeHidTransport.test.js +2 -0
- package/lib/cjs/api/transport/NodeHidTransport.test.js.map +7 -0
- package/lib/cjs/index.js +2 -0
- package/lib/cjs/index.js.map +7 -0
- package/lib/cjs/package.json +59 -0
- package/lib/types/api/data/NodeHidConfig.d.ts +3 -0
- package/lib/types/api/data/NodeHidConfig.d.ts.map +1 -0
- package/lib/types/api/index.d.ts +3 -0
- package/lib/types/api/index.d.ts.map +1 -0
- package/lib/types/api/model/Errors.d.ts +12 -0
- package/lib/types/api/model/Errors.d.ts.map +1 -0
- package/lib/types/api/model/HIDDevice.stub.d.ts +3 -0
- package/lib/types/api/model/HIDDevice.stub.d.ts.map +1 -0
- package/lib/types/api/transport/NodeHidApduSender.d.ts +31 -0
- package/lib/types/api/transport/NodeHidApduSender.d.ts.map +1 -0
- package/lib/types/api/transport/NodeHidApduSender.test.d.ts +2 -0
- package/lib/types/api/transport/NodeHidApduSender.test.d.ts.map +1 -0
- package/lib/types/api/transport/NodeHidTransport.d.ts +79 -0
- package/lib/types/api/transport/NodeHidTransport.d.ts.map +1 -0
- package/lib/types/api/transport/NodeHidTransport.test.d.ts +2 -0
- package/lib/types/api/transport/NodeHidTransport.test.d.ts.map +1 -0
- package/lib/types/index.d.ts +2 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/api/transport/NodeHidTransport.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: off */\nimport {\n type ApduReceiverServiceFactory,\n type ApduResponse,\n type ApduSenderServiceFactory,\n connectedDeviceStubBuilder,\n DeviceConnectionStateMachine,\n type DeviceConnectionStateMachineParams,\n type DeviceModel,\n DeviceModelId,\n DeviceNotRecognizedError,\n type LoggerPublisherService,\n type LoggerSubscriberService,\n NoAccessibleDeviceError,\n OpeningConnectionError,\n StaticDeviceModelDataSource,\n type TransportDeviceModel,\n type TransportDiscoveredDevice,\n UnknownDeviceError,\n} from \"@ledgerhq/device-management-kit\";\nimport type { Device as NodeHIDDevice } from \"node-hid\";\nimport { Left, Right } from \"purify-ts\";\nimport { lastValueFrom, toArray } from \"rxjs\";\n\nimport { RECONNECT_DEVICE_TIMEOUT } from \"@api/data/NodeHidConfig\";\nimport { nodeHidDeviceStubBuilder } from \"@api/model/HIDDevice.stub\";\n\nimport {\n NodeHidApduSender,\n type NodeHidApduSenderDependencies,\n} from \"./NodeHidApduSender\";\nimport { NodeHidTransport } from \"./NodeHidTransport\";\n\n// Mock node-hid module\nconst mockDevicesAsync = vi.fn();\nvi.mock(\"node-hid\", () => ({\n devicesAsync: (...args: unknown[]) => mockDevicesAsync(...args),\n HIDAsync: {\n open: vi.fn(),\n },\n}));\n\n// Mock usb module\nconst mockUsbOn = vi.fn();\nconst mockUsbAttachCallbacks: ((device: unknown) => void)[] = [];\nconst mockUsbDetachCallbacks: ((device: unknown) => void)[] = [];\n\nvi.mock(\"usb\", () => ({\n usb: {\n on: (event: string, callback: (device: unknown) => void) => {\n mockUsbOn(event, callback);\n if (event === \"attach\") {\n mockUsbAttachCallbacks.push(callback);\n } else if (event === \"detach\") {\n mockUsbDetachCallbacks.push(callback);\n }\n },\n removeAllListeners: vi.fn(),\n unrefHotplugEvents: vi.fn(),\n },\n Device: class {},\n}));\n\nclass LoggerPublisherServiceStub implements LoggerPublisherService {\n constructor(subscribers: LoggerSubscriberService[], tag: string) {\n this.subscribers = subscribers;\n this.tag = tag;\n }\n subscribers: LoggerSubscriberService[] = [];\n tag: string = \"\";\n error = vi.fn();\n warn = vi.fn();\n info = vi.fn();\n debug = vi.fn();\n}\n\n// Our StaticDeviceModelDataSource can directly be used in our unit tests\nconst usbDeviceModelDataSource = new StaticDeviceModelDataSource();\nconst logger = new LoggerPublisherServiceStub([], \"node-hid\");\n\nconst stubDevice: NodeHIDDevice = nodeHidDeviceStubBuilder();\n\n/**\n * Flushes all pending promises\n */\nconst flushPromises = async () => {\n const timers = await vi.importActual<typeof import(\"timers\")>(\"timers\");\n return new Promise(timers.setImmediate);\n};\n\n/**\n * Helper to create a USB device event object matching the usb module's Device type\n */\nconst createUsbDevice = (vendorId: number, productId: number) => ({\n deviceDescriptor: {\n idVendor: vendorId,\n idProduct: productId,\n },\n});\n\n/**\n * Emit a USB attach event\n */\nconst emitUsbAttachEvent = (vendorId: number, productId: number) => {\n const device = createUsbDevice(vendorId, productId);\n mockUsbAttachCallbacks.forEach((callback) => callback(device));\n};\n\n/**\n * Emit a USB detach event\n */\nconst emitUsbDetachEvent = (vendorId: number, productId: number) => {\n const device = createUsbDevice(vendorId, productId);\n mockUsbDetachCallbacks.forEach((callback) => callback(device));\n};\n\ndescribe(\"NodeHidTransport\", () => {\n let transport: NodeHidTransport;\n let apduReceiverServiceFactoryStub: ApduReceiverServiceFactory;\n let apduSenderServiceFactoryStub: ApduSenderServiceFactory;\n\n let mockDeviceConnectionStateMachineFactory = vi.fn();\n const mockEventDeviceConnected = vi.fn();\n const mockEventDeviceDisconnected = vi.fn();\n\n const mockDeviceApduSender = {\n sendApdu: vi.fn().mockResolvedValue(\n Right({\n data: new Uint8Array(),\n statusCode: new Uint8Array([0x90, 0x00]),\n } as ApduResponse),\n ),\n getDependencies: vi.fn().mockReturnValue({ device: stubDevice }),\n setDependencies: vi.fn(),\n closeConnection: vi.fn(),\n setupConnection: vi.fn(),\n };\n\n const mockDeviceConnectionStateMachine = {\n getDependencies: vi.fn().mockReturnValue({ device: stubDevice }),\n setDependencies: vi.fn(),\n getDeviceId: vi.fn(),\n sendApdu: vi.fn().mockResolvedValue(\n Right({\n data: new Uint8Array(),\n statusCode: new Uint8Array([0x90, 0x00]),\n } as ApduResponse),\n ),\n setupConnection: vi.fn(),\n eventDeviceConnected: mockEventDeviceConnected,\n eventDeviceDisconnected: mockEventDeviceDisconnected,\n closeConnection: vi.fn(),\n };\n\n function initializeTransport() {\n // Clear callbacks before reinitializing\n mockUsbAttachCallbacks.length = 0;\n mockUsbDetachCallbacks.length = 0;\n\n apduReceiverServiceFactoryStub = vi.fn();\n apduSenderServiceFactoryStub = vi.fn();\n mockDeviceConnectionStateMachineFactory = vi.fn(\n (\n params: DeviceConnectionStateMachineParams<NodeHidApduSenderDependencies>,\n ) => {\n return {\n ...mockDeviceConnectionStateMachine,\n getDeviceId: vi.fn().mockReturnValue(params.deviceId),\n getDependencies: params.deviceApduSender.getDependencies,\n setDependencies: params.deviceApduSender.setDependencies,\n } as unknown as DeviceConnectionStateMachine<NodeHidApduSenderDependencies>;\n },\n );\n const mockDeviceApduSenderFactory = vi.fn((params) => {\n return {\n ...mockDeviceApduSender,\n getDependencies: () => params.dependencies,\n setDependencies: (dependencies: NodeHidApduSenderDependencies) =>\n (params.dependencies = dependencies),\n } as unknown as NodeHidApduSender;\n });\n transport = new NodeHidTransport(\n usbDeviceModelDataSource,\n () => logger,\n apduSenderServiceFactoryStub,\n apduReceiverServiceFactoryStub,\n mockDeviceConnectionStateMachineFactory,\n mockDeviceApduSenderFactory,\n );\n }\n\n beforeEach(() => {\n initializeTransport();\n vi.useFakeTimers();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n vi.clearAllMocks();\n vi.useRealTimers();\n });\n\n const discoverDevice = (\n onSuccess: (discoveredDevice: TransportDiscoveredDevice) => void,\n onError?: (error: unknown) => void,\n ) => {\n transport.startDiscovering().subscribe({\n next: onSuccess,\n error: onError,\n });\n };\n\n describe(\"isSupported\", () => {\n it(\"should always support the transport\", () => {\n expect(transport.isSupported()).toBe(true);\n });\n });\n\n describe(\"getIdentifier\", () => {\n it(\"should return NODE-HID identifier\", () => {\n expect(transport.getIdentifier()).toBe(\"NODE-HID\");\n });\n });\n\n describe(\"startDiscovering\", () => {\n const testCases = usbDeviceModelDataSource\n .getAllDeviceModels()\n .flatMap((deviceModel) => {\n return [\n {\n testTitle: `should emit device when discovered (${deviceModel.productName})`,\n hidDevice: nodeHidDeviceStubBuilder({\n productId: deviceModel.usbProductId << 8,\n product: deviceModel.productName,\n }),\n expectedDeviceModel: deviceModel,\n },\n {\n testTitle: `should emit device when discovered (${deviceModel.productName}, bootloader)`,\n hidDevice: nodeHidDeviceStubBuilder({\n productId: deviceModel.bootloaderUsbProductId,\n product: deviceModel.productName,\n }),\n expectedDeviceModel: deviceModel,\n },\n ];\n });\n\n testCases.forEach((testCase) => {\n it(\n testCase.testTitle,\n () =>\n new Promise<void>((resolve, reject) => {\n mockDevicesAsync.mockResolvedValueOnce([testCase.hidDevice]);\n\n discoverDevice(\n (discoveredDevice) => {\n try {\n expect(discoveredDevice).toEqual(\n expect.objectContaining({\n deviceModel: testCase.expectedDeviceModel,\n }),\n );\n\n resolve();\n } catch (expectError) {\n reject(expectError as Error);\n }\n },\n (error) => {\n reject(error as Error);\n },\n );\n }),\n );\n });\n\n it(\"should emit multiple devices if several are connected\", () =>\n new Promise<void>((resolve, reject) => {\n mockDevicesAsync.mockResolvedValueOnce([\n stubDevice,\n nodeHidDeviceStubBuilder({\n productId: 0x5011,\n product: \"Ledger Nano S Plus\",\n path: \"/dev/hidraw1\",\n }),\n ]);\n\n let count = 0;\n discoverDevice(\n (discoveredDevice) => {\n try {\n switch (count) {\n case 0:\n expect(discoveredDevice).toEqual(\n expect.objectContaining({\n deviceModel: expect.objectContaining({\n id: DeviceModelId.NANO_X,\n productName: \"Ledger Nano X\",\n usbProductId: 0x40,\n }) as DeviceModel,\n }),\n );\n break;\n case 1:\n expect(discoveredDevice).toEqual(\n expect.objectContaining({\n deviceModel: expect.objectContaining({\n id: DeviceModelId.NANO_SP,\n productName: \"Ledger Nano S Plus\",\n usbProductId: 0x50,\n }) as DeviceModel,\n }),\n );\n\n resolve();\n break;\n }\n\n count++;\n } catch (expectError) {\n reject(expectError as Error);\n }\n },\n (error) => {\n reject(error as Error);\n },\n );\n }));\n\n it(\"should throw DeviceNotRecognizedError if the device is not recognized\", () =>\n new Promise<void>((resolve, reject) => {\n mockDevicesAsync.mockResolvedValueOnce([\n nodeHidDeviceStubBuilder({\n productId: 0x4242,\n }),\n ]);\n\n discoverDevice(\n () => {\n reject(\"should not return a device\");\n },\n (error) => {\n expect(error).toBeInstanceOf(DeviceNotRecognizedError);\n resolve();\n },\n );\n }));\n\n it(\"should emit an error if devicesAsync throws\", () =>\n new Promise<void>((resolve, reject) => {\n const message = \"devices async error\";\n mockDevicesAsync.mockImplementationOnce(() => {\n throw new Error(message);\n });\n\n discoverDevice(\n () => {\n reject(\"should not return a device\");\n },\n (error) => {\n expect(error).toBeInstanceOf(NoAccessibleDeviceError);\n expect(error).toStrictEqual(\n new NoAccessibleDeviceError(new Error(message)),\n );\n resolve();\n },\n );\n }));\n\n it(\"should emit an error if no devices are found\", () =>\n new Promise<void>((resolve, reject) => {\n mockDevicesAsync.mockResolvedValueOnce([]);\n\n discoverDevice(\n (discoveredDevice) => {\n reject(\n `Should not emit any value, but emitted ${JSON.stringify(\n discoveredDevice,\n )}`,\n );\n },\n (error) => {\n try {\n expect(error).toBeInstanceOf(NoAccessibleDeviceError);\n resolve();\n } catch (expectError) {\n reject(expectError as Error);\n }\n },\n );\n }));\n\n it(\"should emit the same discoveredDevice object if discovered twice in a row\", async () => {\n mockDevicesAsync.mockResolvedValue([stubDevice]);\n\n const firstDiscoveredDevice = await new Promise<void>(\n (resolve, reject) => {\n discoverDevice(\n () => resolve(),\n (err) => reject(err),\n );\n },\n );\n const secondDiscoveredDevice = await new Promise<void>(\n (resolve, reject) => {\n discoverDevice(\n () => resolve(),\n (err) => reject(err),\n );\n },\n );\n expect(secondDiscoveredDevice).toBe(firstDiscoveredDevice);\n });\n });\n\n describe(\"destroy\", () => {\n it(\"should stop monitoring connections when destroyed\", () => {\n const abortSpy = vi.spyOn(AbortController.prototype, \"abort\");\n\n transport.destroy();\n\n expect(abortSpy).toHaveBeenCalled();\n });\n });\n\n describe(\"connect\", () => {\n it(\"should throw UnknownDeviceError if no internal device\", async () => {\n const connectParams = {\n deviceId: \"fake\",\n onDisconnect: vi.fn(),\n };\n\n const connect = await transport.connect(connectParams);\n\n expect(connect).toStrictEqual(\n Left(new UnknownDeviceError(\"Unknown device fake\")),\n );\n });\n\n it(\"should throw OpeningConnectionError if the device cannot be opened\", async () => {\n const message = \"cannot be opened\";\n // Mock the DeviceConnectionStateMachine's setupConnection to reject\n mockDeviceConnectionStateMachine.setupConnection.mockRejectedValueOnce(\n new Error(message),\n );\n mockDevicesAsync.mockResolvedValueOnce([stubDevice]);\n mockDevicesAsync.mockResolvedValue([stubDevice]);\n\n const discoveredDevice = await lastValueFrom(\n transport.startDiscovering(),\n );\n const connected = await transport.connect({\n deviceId: discoveredDevice.id,\n onDisconnect: vi.fn(),\n });\n expect(connected.isLeft()).toBe(true);\n expect(connected.extract()).toBeInstanceOf(OpeningConnectionError);\n });\n\n it(\"should return a device if available\", async () => {\n mockDevicesAsync.mockResolvedValueOnce([stubDevice]);\n mockDevicesAsync.mockResolvedValue([stubDevice]);\n\n const discoveredDevice = await lastValueFrom(\n transport.startDiscovering(),\n );\n const connected = await transport.connect({\n deviceId: discoveredDevice.id,\n onDisconnect: vi.fn(),\n });\n expect(connected.isRight()).toStrictEqual(true);\n expect(connected.extract()).toEqual(\n expect.objectContaining({ id: discoveredDevice.id }),\n );\n });\n\n it(\"should return an existing connected device\", async () => {\n mockDevicesAsync.mockResolvedValueOnce([stubDevice]);\n mockDevicesAsync.mockResolvedValue([stubDevice]);\n\n const discoveredDevice = await lastValueFrom(\n transport.startDiscovering(),\n );\n await transport.connect({\n deviceId: discoveredDevice.id,\n onDisconnect: vi.fn(),\n });\n const connected = await transport.connect({\n deviceId: discoveredDevice.id,\n onDisconnect: vi.fn(),\n });\n expect(connected.isRight()).toStrictEqual(true);\n expect(connected.extract()).toEqual(\n expect.objectContaining({ id: discoveredDevice.id }),\n );\n });\n });\n\n describe(\"disconnect\", () => {\n it(\"should throw an error if the device is not connected\", async () => {\n // given\n const connectedDevice = connectedDeviceStubBuilder();\n\n // when\n const disconnect = await transport.disconnect({\n connectedDevice,\n });\n\n expect(disconnect).toStrictEqual(\n Left(new UnknownDeviceError(`Unknown device ${connectedDevice.id}`)),\n );\n });\n\n it(\"should disconnect if the device is connected\", async () => {\n mockDevicesAsync.mockResolvedValueOnce([stubDevice]);\n mockDevicesAsync.mockResolvedValue([stubDevice]);\n\n const discoveredDevice = await lastValueFrom(\n transport.startDiscovering(),\n );\n const connected = await transport.connect({\n deviceId: discoveredDevice.id,\n onDisconnect: vi.fn(),\n });\n expect(connected.isRight()).toStrictEqual(true);\n const result = await transport.disconnect({\n connectedDevice: connected.unsafeCoerce(),\n });\n expect(result).toStrictEqual(Right(undefined));\n });\n\n it(\"should call disconnect handler if a connected device is unplugged\", async () => {\n // Get onTerminated for the first connection only\n let onTerminated1 = vi.fn();\n mockDeviceConnectionStateMachineFactory.mockImplementationOnce(\n (params) => {\n onTerminated1 = params.onTerminated;\n return {\n ...mockDeviceConnectionStateMachine,\n getDeviceId: vi.fn().mockReturnValue(params.deviceId),\n } as unknown as DeviceConnectionStateMachine<NodeHidApduSenderDependencies>;\n },\n );\n\n // Add 2 discoverable devices\n const hidDevice1 = nodeHidDeviceStubBuilder({ path: \"/dev/hidraw0\" });\n const hidDevice2 = nodeHidDeviceStubBuilder({\n path: \"/dev/hidraw1\",\n productId: 0x5011,\n });\n mockDevicesAsync.mockResolvedValueOnce([hidDevice1, hidDevice2]);\n mockDevicesAsync.mockResolvedValue([hidDevice1, hidDevice2]);\n\n // Connect the 2 devices\n const discoveredDevices = await lastValueFrom(\n transport.startDiscovering().pipe(toArray()),\n );\n expect(discoveredDevices.length).toStrictEqual(2);\n const onDisconnect1 = vi.fn();\n const connected1 = await transport.connect({\n deviceId: discoveredDevices[0]!.id,\n onDisconnect: onDisconnect1,\n });\n const onDisconnect2 = vi.fn();\n const connected2 = await transport.connect({\n deviceId: discoveredDevices[1]!.id,\n onDisconnect: onDisconnect2,\n });\n expect(connected1.isRight()).toStrictEqual(true);\n expect(connected2.isRight()).toStrictEqual(true);\n\n // unplug the first device\n onTerminated1();\n expect(onDisconnect1).toHaveBeenCalled();\n expect(onDisconnect2).not.toHaveBeenCalled();\n });\n\n it(\"should call disconnect handler if a connected device is unplugged while reconnecting\", async () => {\n // Get onTerminated for the first connection only\n let onTerminated1 = vi.fn();\n let tryToReconnect1 = vi.fn();\n mockDeviceConnectionStateMachineFactory.mockImplementationOnce(\n (params) => {\n onTerminated1 = params.onTerminated;\n tryToReconnect1 = params.tryToReconnect;\n return {\n ...mockDeviceConnectionStateMachine,\n getDeviceId: vi.fn().mockReturnValue(params.deviceId),\n } as unknown as DeviceConnectionStateMachine<NodeHidApduSenderDependencies>;\n },\n );\n\n // Add 2 discoverable devices\n const hidDevice1 = nodeHidDeviceStubBuilder({ path: \"/dev/hidraw0\" });\n const hidDevice2 = nodeHidDeviceStubBuilder({\n path: \"/dev/hidraw1\",\n productId: 0x5011,\n });\n mockDevicesAsync.mockResolvedValueOnce([hidDevice1, hidDevice2]);\n mockDevicesAsync.mockResolvedValue([hidDevice1, hidDevice2]);\n\n // Connect the 2 devices\n const discoveredDevices = await lastValueFrom(\n transport.startDiscovering().pipe(toArray()),\n );\n expect(discoveredDevices.length).toStrictEqual(2);\n const onDisconnect1 = vi.fn();\n const connected1 = await transport.connect({\n deviceId: discoveredDevices[0]!.id,\n onDisconnect: onDisconnect1,\n });\n const onDisconnect2 = vi.fn();\n const connected2 = await transport.connect({\n deviceId: discoveredDevices[1]!.id,\n onDisconnect: onDisconnect2,\n });\n expect(connected1.isRight()).toStrictEqual(true);\n expect(connected2.isRight()).toStrictEqual(true);\n\n // Try to reconnect the first device\n tryToReconnect1();\n\n // unplug the first device\n onTerminated1();\n expect(onDisconnect1).toHaveBeenCalled();\n expect(onDisconnect2).not.toHaveBeenCalled();\n });\n });\n\n describe(\"reconnect\", () => {\n it(\"should stop disconnection if reconnection happens\", () =>\n new Promise<void>((resolve, reject) => {\n // given\n const onDisconnect = vi.fn();\n let tryToReconnect = vi.fn();\n\n const hidDevice1 = nodeHidDeviceStubBuilder({ path: \"/dev/hidraw0\" });\n const hidDevice2 = nodeHidDeviceStubBuilder({ path: \"/dev/hidraw1\" });\n\n mockDevicesAsync.mockResolvedValueOnce([hidDevice1]);\n mockDevicesAsync.mockResolvedValue([hidDevice1, hidDevice2]);\n mockDeviceConnectionStateMachineFactory.mockImplementationOnce(\n (params) => {\n tryToReconnect = params.tryToReconnect;\n return {\n ...mockDeviceConnectionStateMachine,\n getDeviceId: vi.fn().mockReturnValue(params.deviceId),\n getDependencies: params.deviceApduSender.getDependencies,\n setDependencies: params.deviceApduSender.setDependencies,\n } as unknown as DeviceConnectionStateMachine<NodeHidApduSenderDependencies>;\n },\n );\n\n discoverDevice(async (discoveredDevice) => {\n try {\n await transport.connect({\n deviceId: discoveredDevice.id,\n onDisconnect,\n });\n\n /* Disconnection */\n emitUsbDetachEvent(0x2c97, 0x40);\n await flushPromises();\n expect(mockEventDeviceDisconnected).toHaveBeenCalled();\n\n tryToReconnect();\n vi.advanceTimersByTime(RECONNECT_DEVICE_TIMEOUT / 3);\n\n /* Reconnection */\n emitUsbAttachEvent(0x2c97, 0x40);\n\n await flushPromises();\n expect(mockEventDeviceConnected).toHaveBeenCalled();\n\n vi.advanceTimersByTime(RECONNECT_DEVICE_TIMEOUT);\n expect(onDisconnect).not.toHaveBeenCalled();\n resolve();\n } catch (error) {\n reject(error as Error);\n }\n });\n }));\n\n it(\"should be able to reconnect twice in a row if the device is unplugged and replugged twice\", () =>\n new Promise<void>((resolve, reject) => {\n // given\n const onDisconnect = vi.fn();\n let tryToReconnect = vi.fn();\n\n const hidDevice1 = nodeHidDeviceStubBuilder({ path: \"/dev/hidraw0\" });\n const hidDevice2 = nodeHidDeviceStubBuilder({ path: \"/dev/hidraw1\" });\n const hidDevice3 = nodeHidDeviceStubBuilder({ path: \"/dev/hidraw2\" });\n\n mockDevicesAsync.mockResolvedValueOnce([hidDevice1]);\n mockDevicesAsync.mockResolvedValue([\n hidDevice1,\n hidDevice2,\n hidDevice3,\n ]);\n mockDeviceConnectionStateMachineFactory.mockImplementationOnce(\n (params) => {\n tryToReconnect = params.tryToReconnect;\n return {\n ...mockDeviceConnectionStateMachine,\n getDeviceId: vi.fn().mockReturnValue(params.deviceId),\n getDependencies: params.deviceApduSender.getDependencies,\n setDependencies: params.deviceApduSender.setDependencies,\n } as unknown as DeviceConnectionStateMachine<NodeHidApduSenderDependencies>;\n },\n );\n\n // when\n discoverDevice(async (discoveredDevice) => {\n await transport.connect({\n deviceId: discoveredDevice.id,\n onDisconnect,\n });\n try {\n /* First disconnection */\n emitUsbDetachEvent(0x2c97, 0x40);\n await flushPromises();\n expect(mockEventDeviceDisconnected).toHaveBeenCalled();\n tryToReconnect();\n vi.advanceTimersByTime(RECONNECT_DEVICE_TIMEOUT / 3);\n\n /* First reconnection */\n emitUsbAttachEvent(0x2c97, 0x40);\n\n await flushPromises();\n expect(mockEventDeviceConnected).toHaveBeenCalled();\n vi.advanceTimersByTime(RECONNECT_DEVICE_TIMEOUT);\n expect(onDisconnect).not.toHaveBeenCalled();\n\n /* Second disconnection */\n emitUsbDetachEvent(0x2c97, 0x40);\n await flushPromises();\n expect(mockEventDeviceDisconnected).toHaveBeenCalled();\n tryToReconnect();\n vi.advanceTimersByTime(RECONNECT_DEVICE_TIMEOUT / 3);\n\n /* Second reconnection */\n emitUsbAttachEvent(0x2c97, 0x40);\n\n await flushPromises();\n expect(mockEventDeviceConnected).toHaveBeenCalled();\n vi.advanceTimersByTime(RECONNECT_DEVICE_TIMEOUT);\n expect(onDisconnect).not.toHaveBeenCalled();\n\n resolve();\n } catch (error) {\n reject(error as Error);\n }\n });\n }));\n });\n\n describe(\"listenToAvailableDevices\", () => {\n it(\"should emit the devices already connected before listening\", async () => {\n // given\n const hidDevice = nodeHidDeviceStubBuilder();\n mockDevicesAsync.mockResolvedValue([hidDevice]);\n\n const onComplete = vi.fn();\n const onError = vi.fn();\n\n let observedDevices: TransportDiscoveredDevice[] = [];\n // when\n transport.listenToAvailableDevices().subscribe({\n next: (knownDevices) => {\n observedDevices = knownDevices;\n },\n complete: onComplete,\n error: onError,\n });\n\n await flushPromises();\n\n expect(observedDevices).toEqual([\n expect.objectContaining({\n deviceModel: expect.objectContaining({\n id: DeviceModelId.NANO_X,\n }) as TransportDeviceModel,\n }),\n ]);\n expect(onComplete).not.toHaveBeenCalled();\n expect(onError).not.toHaveBeenCalled();\n });\n\n it(\"should emit the new list of devices after connection and disconnection events\", async () => {\n initializeTransport();\n // given\n const hidDevice1 = nodeHidDeviceStubBuilder({\n productId:\n usbDeviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_X,\n }).usbProductId << 8,\n path: \"/dev/hidraw0\",\n });\n const hidDevice2 = nodeHidDeviceStubBuilder({\n productId:\n usbDeviceModelDataSource.getDeviceModel({ id: DeviceModelId.STAX })\n .usbProductId << 8,\n path: \"/dev/hidraw1\",\n });\n mockDevicesAsync.mockResolvedValue([hidDevice1]);\n\n const onComplete = vi.fn();\n const onError = vi.fn();\n\n let observedDevices: TransportDiscoveredDevice[] = [];\n // when\n transport.listenToAvailableDevices().subscribe({\n next: (knownDevices) => {\n observedDevices = knownDevices;\n },\n complete: onComplete,\n error: onError,\n });\n\n await flushPromises();\n\n expect(observedDevices).toEqual([\n expect.objectContaining({\n deviceModel: expect.objectContaining({\n id: DeviceModelId.NANO_X,\n }) as TransportDeviceModel,\n }),\n ]);\n\n // When a new device is connected\n mockDevicesAsync.mockResolvedValue([hidDevice1, hidDevice2]);\n emitUsbAttachEvent(0x2c97, 0x60);\n await flushPromises();\n\n expect(observedDevices).toEqual([\n expect.objectContaining({\n deviceModel: expect.objectContaining({\n id: DeviceModelId.NANO_X,\n }) as TransportDeviceModel,\n }),\n expect.objectContaining({\n deviceModel: expect.objectContaining({\n id: DeviceModelId.STAX,\n }) as TransportDeviceModel,\n }),\n ]);\n\n // When a device is disconnected\n mockDevicesAsync.mockResolvedValue([hidDevice2]);\n emitUsbDetachEvent(0x2c97, 0x40);\n await flushPromises();\n\n expect(observedDevices).toEqual([\n expect.objectContaining({\n deviceModel: expect.objectContaining({\n id: DeviceModelId.STAX,\n }) as TransportDeviceModel,\n }),\n ]);\n\n expect(onComplete).not.toHaveBeenCalled();\n expect(onError).not.toHaveBeenCalled();\n });\n\n it(\"should preserve DeviceId in case the device has been disconnected and reconnected before the timeout\", async () => {\n // given\n const hidDevice = nodeHidDeviceStubBuilder();\n\n mockDevicesAsync.mockResolvedValue([hidDevice]);\n\n const onComplete = vi.fn();\n const onError = vi.fn();\n let observedDevices: TransportDiscoveredDevice[] = [];\n // when\n transport.listenToAvailableDevices().subscribe({\n next: (knownDevices) => {\n observedDevices = knownDevices;\n },\n complete: onComplete,\n error: onError,\n });\n\n await flushPromises();\n\n const firstObservedDeviceId = observedDevices[0]?.id;\n expect(firstObservedDeviceId).toBeTruthy();\n expect(observedDevices[0]?.deviceModel?.id).toBe(DeviceModelId.NANO_X);\n\n // Start a connection with the device\n await transport.connect({\n deviceId: observedDevices[0]!.id,\n onDisconnect: vi.fn(),\n });\n await flushPromises();\n\n // When the device is disconnected\n mockDevicesAsync.mockResolvedValue([]);\n emitUsbDetachEvent(0x2c97, 0x40);\n await flushPromises();\n\n expect(observedDevices).toEqual([]);\n\n // When the device is reconnected\n mockDevicesAsync.mockResolvedValue([hidDevice]);\n emitUsbAttachEvent(0x2c97, 0x40);\n await flushPromises();\n\n expect(observedDevices).toEqual([\n expect.objectContaining({\n deviceModel: expect.objectContaining({\n id: DeviceModelId.NANO_X,\n }) as TransportDeviceModel,\n }),\n ]);\n\n expect(observedDevices[0]?.id).toBeTruthy();\n expect(observedDevices[0]?.id).toBe(firstObservedDeviceId);\n });\n });\n\n describe(\"USB connection events\", () => {\n it(\"should register usb attach and detach listeners on construction\", () => {\n expect(mockUsbOn).toHaveBeenCalledWith(\"attach\", expect.any(Function));\n expect(mockUsbOn).toHaveBeenCalledWith(\"detach\", expect.any(Function));\n });\n\n it(\"should ignore non-Ledger USB devices\", async () => {\n mockDevicesAsync.mockResolvedValue([stubDevice]);\n\n let observedDevices: TransportDiscoveredDevice[] = [];\n transport.listenToAvailableDevices().subscribe({\n next: (knownDevices) => {\n observedDevices = knownDevices;\n },\n });\n\n await flushPromises();\n expect(observedDevices.length).toBe(1);\n\n // Emit attach event for non-Ledger device\n emitUsbAttachEvent(0x1234, 0x5678);\n await flushPromises();\n\n // Should still be 1 device\n expect(observedDevices.length).toBe(1);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_rxjs", "import_NodeHidConfig", "import_HIDDevice", "import_NodeHidTransport", "mockDevicesAsync", "args", "mockUsbOn", "mockUsbAttachCallbacks", "mockUsbDetachCallbacks", "event", "callback", "LoggerPublisherServiceStub", "subscribers", "tag", "usbDeviceModelDataSource", "logger", "stubDevice", "flushPromises", "timers", "createUsbDevice", "vendorId", "productId", "emitUsbAttachEvent", "device", "emitUsbDetachEvent", "transport", "apduReceiverServiceFactoryStub", "apduSenderServiceFactoryStub", "mockDeviceConnectionStateMachineFactory", "mockEventDeviceConnected", "mockEventDeviceDisconnected", "mockDeviceApduSender", "mockDeviceConnectionStateMachine", "initializeTransport", "params", "mockDeviceApduSenderFactory", "dependencies", "discoverDevice", "onSuccess", "onError", "deviceModel", "testCase", "resolve", "reject", "discoveredDevice", "expectError", "error", "count", "message", "firstDiscoveredDevice", "err", "secondDiscoveredDevice", "abortSpy", "connectParams", "connect", "connected", "connectedDevice", "disconnect", "result", "onTerminated1", "hidDevice1", "hidDevice2", "discoveredDevices", "onDisconnect1", "connected1", "onDisconnect2", "connected2", "tryToReconnect1", "onDisconnect", "tryToReconnect", "hidDevice3", "hidDevice", "onComplete", "observedDevices", "knownDevices", "firstObservedDeviceId"]
|
|
7
|
+
}
|
package/lib/cjs/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./api"),module.exports);0&&(module.exports={...require("./api")});
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"dependencies": {
|
|
3
|
+
"node-hid": "catalog:",
|
|
4
|
+
"purify-ts": "catalog:",
|
|
5
|
+
"usb": "catalog:",
|
|
6
|
+
"uuid": "catalog:"
|
|
7
|
+
},
|
|
8
|
+
"devDependencies": {
|
|
9
|
+
"@ledgerhq/device-management-kit": "workspace:*",
|
|
10
|
+
"@ledgerhq/eslint-config-dsdk": "workspace:*",
|
|
11
|
+
"@ledgerhq/ldmk-tool": "workspace:*",
|
|
12
|
+
"@ledgerhq/prettier-config-dsdk": "workspace:*",
|
|
13
|
+
"@ledgerhq/tsconfig-dsdk": "workspace:*",
|
|
14
|
+
"@ledgerhq/vitest-config-dmk": "workspace:*",
|
|
15
|
+
"@types/uuid": "catalog:",
|
|
16
|
+
"@types/w3c-web-hid": "catalog:",
|
|
17
|
+
"rxjs": "catalog:",
|
|
18
|
+
"ts-node": "catalog:"
|
|
19
|
+
},
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"import": "./lib/cjs/index.js",
|
|
23
|
+
"require": "./lib/cjs/index.js",
|
|
24
|
+
"types": "./lib/types/index.d.ts"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"./lib",
|
|
29
|
+
"package.json"
|
|
30
|
+
],
|
|
31
|
+
"license": "Apache-2.0",
|
|
32
|
+
"name": "@ledgerhq/device-transport-kit-node-hid",
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@ledgerhq/device-management-kit": "workspace:*",
|
|
35
|
+
"rxjs": "catalog:"
|
|
36
|
+
},
|
|
37
|
+
"private": false,
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/LedgerHQ/device-sdk-ts.git"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json --platform node",
|
|
44
|
+
"dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
|
|
45
|
+
"lint": "eslint",
|
|
46
|
+
"lint:fix": "pnpm lint --fix",
|
|
47
|
+
"postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
|
|
48
|
+
"prebuild": "rimraf lib",
|
|
49
|
+
"prettier": "prettier . --check",
|
|
50
|
+
"prettier:fix": "prettier . --write",
|
|
51
|
+
"test": "vitest run",
|
|
52
|
+
"test:coverage": "vitest run --coverage",
|
|
53
|
+
"test:watch": "vitest",
|
|
54
|
+
"typecheck": "tsc --noEmit",
|
|
55
|
+
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json --platform node",
|
|
56
|
+
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
57
|
+
},
|
|
58
|
+
"version": "0.0.0-develop-20260212001325"
|
|
59
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHidConfig.d.ts","sourceRoot":"","sources":["../../../../src/api/data/NodeHidConfig.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,wBAAwB,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { GeneralDmkError } from "@ledgerhq/device-management-kit";
|
|
2
|
+
export declare class NodeHidTransportNotSupportedError extends GeneralDmkError {
|
|
3
|
+
readonly err?: unknown | undefined;
|
|
4
|
+
readonly _tag = "NodeHidTransportNotSupportedError";
|
|
5
|
+
constructor(err?: unknown | undefined);
|
|
6
|
+
}
|
|
7
|
+
export declare class NodeHidSendReportError extends GeneralDmkError {
|
|
8
|
+
readonly err?: unknown | undefined;
|
|
9
|
+
readonly _tag = "NodeHidSendReportError";
|
|
10
|
+
constructor(err?: unknown | undefined);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=Errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../../src/api/model/Errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,qBAAa,iCAAkC,SAAQ,eAAe;IAExD,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO;IADlC,SAAkB,IAAI,uCAAuC;gBACxC,GAAG,CAAC,EAAE,OAAO,YAAA;CAGnC;AACD,qBAAa,sBAAuB,SAAQ,eAAe;IAE7C,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO;IADlC,SAAkB,IAAI,4BAA4B;gBAC7B,GAAG,CAAC,EAAE,OAAO,YAAA;CAGnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HIDDevice.stub.d.ts","sourceRoot":"","sources":["../../../../src/api/model/HIDDevice.stub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,eAAO,MAAM,wBAAwB,GACnC,QAAO,OAAO,CAAC,aAAa,CAAM,KACjC,aAWD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ApduReceiverServiceFactory, type ApduSenderServiceFactory, type DeviceApduSender, type LoggerPublisherService, type SendApduResult } from "@ledgerhq/device-management-kit";
|
|
2
|
+
import { type Device as NodeHIDDevice } from "node-hid";
|
|
3
|
+
export type NodeHidApduSenderDependencies = {
|
|
4
|
+
device: NodeHIDDevice;
|
|
5
|
+
};
|
|
6
|
+
export type NodeHidApduSenderConstructorArgs = {
|
|
7
|
+
dependencies: NodeHidApduSenderDependencies;
|
|
8
|
+
apduSenderFactory: ApduSenderServiceFactory;
|
|
9
|
+
apduReceiverFactory: ApduReceiverServiceFactory;
|
|
10
|
+
loggerFactory: (tag: string) => LoggerPublisherService;
|
|
11
|
+
};
|
|
12
|
+
export declare class NodeHidApduSender implements DeviceApduSender<NodeHidApduSenderDependencies> {
|
|
13
|
+
private dependencies;
|
|
14
|
+
private readonly apduSenderFactory;
|
|
15
|
+
private apduSender;
|
|
16
|
+
private readonly apduReceiverFactory;
|
|
17
|
+
private apduReceiver;
|
|
18
|
+
private readonly logger;
|
|
19
|
+
private hidAsync;
|
|
20
|
+
private sendApduPromiseResolver;
|
|
21
|
+
private abortTimeout;
|
|
22
|
+
constructor({ dependencies, apduSenderFactory, apduReceiverFactory, loggerFactory, }: NodeHidApduSenderConstructorArgs);
|
|
23
|
+
sendApdu(apdu: Uint8Array, _triggersDisconnection?: boolean, abortTimeout?: number): Promise<SendApduResult>;
|
|
24
|
+
getDependencies(): NodeHidApduSenderDependencies;
|
|
25
|
+
setDependencies(dependencies: NodeHidApduSenderDependencies): void;
|
|
26
|
+
setupConnection(): Promise<void>;
|
|
27
|
+
closeConnection(): Promise<void>;
|
|
28
|
+
private receiveHidInputReport;
|
|
29
|
+
private resolvePendingApdu;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=NodeHidApduSender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHidApduSender.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/NodeHidApduSender.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,0BAA0B,EAG/B,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EAKrB,KAAK,sBAAsB,EAE3B,KAAK,cAAc,EAEpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,MAAM,IAAI,aAAa,EAAY,MAAM,UAAU,CAAC;AAMlE,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,YAAY,EAAE,6BAA6B,CAAC;IAC5C,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,mBAAmB,EAAE,0BAA0B,CAAC;IAChD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,CAAC;CACxD,CAAC;AAEF,qBAAa,iBACX,YAAW,gBAAgB,CAAC,6BAA6B,CAAC;IAE1D,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;IAC7D,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IACjE,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,uBAAuB,CAE7B;IACF,OAAO,CAAC,YAAY,CAAuC;gBAE/C,EACV,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,EAAE,gCAAgC;IAmBtB,QAAQ,CACnB,IAAI,EAAE,UAAU,EAChB,sBAAsB,CAAC,EAAE,OAAO,EAChC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC;IA4CnB,eAAe,IAAI,6BAA6B;IAIhD,eAAe,CAAC,YAAY,EAAE,6BAA6B,GAAG,IAAI;IAI5D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA+ChC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB7C,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,kBAAkB;CAU3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHidApduSender.test.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/NodeHidApduSender.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type ApduReceiverServiceFactory, type ApduSenderServiceFactory, type ConnectError, DeviceConnectionStateMachine, type DeviceConnectionStateMachineParams, type DeviceId, type DeviceModelDataSource, type DisconnectHandler, type DmkError, type LoggerPublisherService, type Transport, TransportConnectedDevice, type TransportDiscoveredDevice, type TransportFactory, type TransportIdentifier } from "@ledgerhq/device-management-kit";
|
|
2
|
+
import { type Either } from "purify-ts";
|
|
3
|
+
import { type Observable } from "rxjs";
|
|
4
|
+
import { NodeHidApduSender, type NodeHidApduSenderConstructorArgs, type NodeHidApduSenderDependencies } from "../transport/NodeHidApduSender";
|
|
5
|
+
export declare const nodeHidIdentifier: TransportIdentifier;
|
|
6
|
+
export declare class NodeHidTransport implements Transport {
|
|
7
|
+
private readonly _deviceModelDataSource;
|
|
8
|
+
private readonly _loggerServiceFactory;
|
|
9
|
+
private readonly _apduSenderFactory;
|
|
10
|
+
private readonly _apduReceiverFactory;
|
|
11
|
+
private readonly _deviceConnectionStateMachineFactory;
|
|
12
|
+
private readonly _deviceApduSenderFactory;
|
|
13
|
+
/** List of HID devices that have been discovered */
|
|
14
|
+
private _transportDiscoveredDevices;
|
|
15
|
+
/** Map of *connected* HIDDevice to their NodeHidDeviceConnection */
|
|
16
|
+
private _deviceConnectionsByHidDevice;
|
|
17
|
+
/**
|
|
18
|
+
* Set of NodeHidDeviceConnection for which the HIDDevice has been
|
|
19
|
+
* disconnected, so they are waiting for a reconnection
|
|
20
|
+
*/
|
|
21
|
+
private _deviceConnectionsPendingReconnection;
|
|
22
|
+
/** AbortController to stop listening to HID connection events */
|
|
23
|
+
private _connectionListenersAbortController;
|
|
24
|
+
private _logger;
|
|
25
|
+
private readonly connectionType;
|
|
26
|
+
private readonly identifier;
|
|
27
|
+
constructor(_deviceModelDataSource: DeviceModelDataSource, _loggerServiceFactory: (tag: string) => LoggerPublisherService, _apduSenderFactory: ApduSenderServiceFactory, _apduReceiverFactory: ApduReceiverServiceFactory, _deviceConnectionStateMachineFactory?: (args: DeviceConnectionStateMachineParams<NodeHidApduSenderDependencies>) => DeviceConnectionStateMachine<NodeHidApduSenderDependencies>, _deviceApduSenderFactory?: (args: NodeHidApduSenderConstructorArgs) => NodeHidApduSender);
|
|
28
|
+
/**
|
|
29
|
+
* Get the NodeHID API if supported or error
|
|
30
|
+
* @returns `Either<NodeHidTransportNotSupportedError, HID>`
|
|
31
|
+
*/
|
|
32
|
+
private get hidApi();
|
|
33
|
+
isSupported(): boolean;
|
|
34
|
+
getIdentifier(): TransportIdentifier;
|
|
35
|
+
private getDevices;
|
|
36
|
+
/**
|
|
37
|
+
* Map a HIDDevice to an TransportDiscoveredDevice, either by creating a new one or returning an existing one
|
|
38
|
+
*/
|
|
39
|
+
private mapHIDDeviceToTransportDiscoveredDevice;
|
|
40
|
+
/**
|
|
41
|
+
* Listen to known devices (devices to which the user has granted access)
|
|
42
|
+
*/
|
|
43
|
+
listenToAvailableDevices(): Observable<TransportDiscoveredDevice[]>;
|
|
44
|
+
private updateTransportDiscoveredDevices;
|
|
45
|
+
private promptDeviceAccess;
|
|
46
|
+
startDiscovering(): Observable<TransportDiscoveredDevice>;
|
|
47
|
+
stopDiscovering(): void;
|
|
48
|
+
private startListeningToConnectionEvents;
|
|
49
|
+
private stopListeningToConnectionEvents;
|
|
50
|
+
/**
|
|
51
|
+
* Connect to a HID USB device and update the internal state of the associated device
|
|
52
|
+
*/
|
|
53
|
+
connect({ deviceId, onDisconnect, }: {
|
|
54
|
+
deviceId: DeviceId;
|
|
55
|
+
onDisconnect: DisconnectHandler;
|
|
56
|
+
}): Promise<Either<ConnectError, TransportConnectedDevice>>;
|
|
57
|
+
private getDeviceModel;
|
|
58
|
+
private getHidUsbProductId;
|
|
59
|
+
/**
|
|
60
|
+
* Disconnect from a HID USB device
|
|
61
|
+
*/
|
|
62
|
+
disconnect(params: {
|
|
63
|
+
connectedDevice: TransportConnectedDevice;
|
|
64
|
+
}): Promise<Either<DmkError, void>>;
|
|
65
|
+
/**
|
|
66
|
+
* Handle the disconnection event of a HID device
|
|
67
|
+
* @param device USB device that was detached
|
|
68
|
+
*/
|
|
69
|
+
private handleDeviceDisconnection;
|
|
70
|
+
private handleDeviceReconnection;
|
|
71
|
+
/**
|
|
72
|
+
* Handle the connection event of a HID device
|
|
73
|
+
* @param device USB device that was attached
|
|
74
|
+
*/
|
|
75
|
+
private handleDeviceConnection;
|
|
76
|
+
destroy(): void;
|
|
77
|
+
}
|
|
78
|
+
export declare const nodeHidTransportFactory: TransportFactory;
|
|
79
|
+
//# sourceMappingURL=NodeHidTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHidTransport.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/NodeHidTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHidTransport.test.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/NodeHidTransport.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC"}
|