@ledgerhq/device-transport-kit-react-native-hid 0.0.0-hid-candidate-3-20250528083456 → 0.0.0-intent-queue-1-20251112094350
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/android/src/main/kotlin/com/ledger/androidtransporthid/TransportHidModule.kt +45 -14
- package/android/src/main/kotlin/com/ledger/devicesdk/shared/androidMain/transport/usb/DefaultAndroidUsbTransport.kt +59 -23
- package/android/src/main/kotlin/com/ledger/devicesdk/shared/androidMain/transport/usb/utils/UsbDeviceMapper.kt +3 -0
- package/android/src/main/kotlin/com/ledger/devicesdk/shared/androidMainInternal/transport/deviceconnection/DeviceConnectionStateMachine.kt +93 -21
- package/android/src/main/kotlin/com/ledger/devicesdk/shared/api/device/LedgerDevice.kt +16 -0
- package/android/src/test/kotlin/com/ledger/devicesdk/shared/androidMainInternal/transport/deviceconnection/DeviceConnectionStateMachineTest.kt +142 -15
- package/lib/cjs/api/bridge/mapper.js +1 -1
- package/lib/cjs/api/bridge/mapper.js.map +2 -2
- package/lib/cjs/api/bridge/mapper.test.js +1 -1
- package/lib/cjs/api/bridge/mapper.test.js.map +2 -2
- package/lib/cjs/index.js +1 -1
- package/lib/cjs/index.js.map +3 -3
- package/lib/cjs/package.json +2 -2
- package/lib/esm/api/bridge/mapper.js +1 -1
- package/lib/esm/api/bridge/mapper.js.map +3 -3
- package/lib/esm/api/bridge/mapper.test.js +1 -1
- package/lib/esm/api/bridge/mapper.test.js.map +3 -3
- package/lib/esm/index.js +1 -1
- package/lib/esm/index.js.map +3 -3
- package/lib/esm/package.json +2 -2
- package/lib/types/api/bridge/mapper.d.ts.map +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +8 -8
|
@@ -2,6 +2,7 @@ package com.ledger.devicesdk.shared.androidMainInternal.transport.deviceconnecti
|
|
|
2
2
|
|
|
3
3
|
import com.ledger.devicesdk.shared.api.apdu.SendApduFailureReason
|
|
4
4
|
import com.ledger.devicesdk.shared.api.apdu.SendApduResult
|
|
5
|
+
import com.ledger.devicesdk.shared.api.utils.fromHexStringToBytesOrThrow
|
|
5
6
|
import com.ledger.devicesdk.shared.internal.service.logger.LogInfo
|
|
6
7
|
import com.ledger.devicesdk.shared.internal.service.logger.LoggerService
|
|
7
8
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
@@ -12,6 +13,7 @@ import kotlin.time.Duration
|
|
|
12
13
|
import kotlin.time.Duration.Companion.seconds
|
|
13
14
|
import kotlin.test.Test
|
|
14
15
|
import org.junit.Assert.*
|
|
16
|
+
import kotlin.test.assertIs
|
|
15
17
|
import kotlin.time.Duration.Companion.milliseconds
|
|
16
18
|
|
|
17
19
|
@OptIn(ExperimentalCoroutinesApi::class)
|
|
@@ -88,7 +90,7 @@ class DeviceConnectionStateMachineTest {
|
|
|
88
90
|
stateMachine.handleApduResult(mockedFailureResult)
|
|
89
91
|
|
|
90
92
|
// Then
|
|
91
|
-
assertEquals(
|
|
93
|
+
assertEquals(mockedFailureResult, sendApduResult)
|
|
92
94
|
assertTrue(terminated)
|
|
93
95
|
assertNull(error)
|
|
94
96
|
}
|
|
@@ -134,14 +136,13 @@ class DeviceConnectionStateMachineTest {
|
|
|
134
136
|
}
|
|
135
137
|
|
|
136
138
|
@Test
|
|
137
|
-
fun `GIVEN the device connection state machine WHEN an APDU with triggersDisconnection is sent THEN the machine moves to WaitingForReconnection and recovers when device reconnects`() =
|
|
139
|
+
fun `GIVEN the device connection state machine WHEN an APDU with triggersDisconnection is sent and triggers a disconnection THEN the machine moves to WaitingForReconnection and recovers when device reconnects`() =
|
|
138
140
|
runTest {
|
|
139
141
|
var sendApduCalled: ByteArray? = null
|
|
140
142
|
var sendApduResult: SendApduResult? = null
|
|
141
143
|
var terminated = false
|
|
142
144
|
var error: Throwable? = null
|
|
143
145
|
|
|
144
|
-
val dispatcher = StandardTestDispatcher(testScheduler)
|
|
145
146
|
val stateMachine = DeviceConnectionStateMachine(
|
|
146
147
|
sendApduFn = { apdu, _ -> sendApduCalled = apdu },
|
|
147
148
|
onTerminated = { terminated = true },
|
|
@@ -167,6 +168,10 @@ class DeviceConnectionStateMachineTest {
|
|
|
167
168
|
val mockedSuccessApduResult = SendApduResult.Success(mockedResultApduSuccessA)
|
|
168
169
|
stateMachine.handleApduResult(mockedSuccessApduResult)
|
|
169
170
|
|
|
171
|
+
assertNull(sendApduResult)
|
|
172
|
+
// Simulate a disconnection
|
|
173
|
+
stateMachine.handleDeviceDisconnected()
|
|
174
|
+
|
|
170
175
|
// Result should have been returned
|
|
171
176
|
assertEquals(mockedSuccessApduResult, sendApduResult)
|
|
172
177
|
|
|
@@ -203,7 +208,118 @@ class DeviceConnectionStateMachineTest {
|
|
|
203
208
|
}
|
|
204
209
|
|
|
205
210
|
@Test
|
|
206
|
-
fun `GIVEN the device connection state machine WHEN an APDU with triggersDisconnection is sent
|
|
211
|
+
fun `GIVEN the device connection state machine WHEN an APDU with triggersDisconnection is sent and device does not disconnect THEN the machine moves to Connected`() =
|
|
212
|
+
runTest {
|
|
213
|
+
var sendApduCalled: ByteArray? = null
|
|
214
|
+
var sendApduResult: SendApduResult? = null
|
|
215
|
+
var terminated = false
|
|
216
|
+
var error: Throwable? = null
|
|
217
|
+
|
|
218
|
+
val stateMachine = DeviceConnectionStateMachine(
|
|
219
|
+
sendApduFn = { apdu, _ -> sendApduCalled = apdu },
|
|
220
|
+
onTerminated = { terminated = true },
|
|
221
|
+
isFatalSendApduFailure = { false },
|
|
222
|
+
reconnectionTimeoutDuration = reconnectionTimeout,
|
|
223
|
+
onError = { error = it },
|
|
224
|
+
loggerService = FakeLoggerService(),
|
|
225
|
+
coroutineDispatcher = StandardTestDispatcher(testScheduler)
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
// Request sending an APDU (with triggersDisconnection = true)
|
|
229
|
+
stateMachine.requestSendApdu(DeviceConnectionStateMachine.SendApduRequestContent(
|
|
230
|
+
apdu = mockedRequestApduA,
|
|
231
|
+
triggersDisconnection = true,
|
|
232
|
+
resultCallback = { result -> sendApduResult = result },
|
|
233
|
+
abortTimeoutDuration = Duration.INFINITE
|
|
234
|
+
))
|
|
235
|
+
|
|
236
|
+
// Send APDU should have been called
|
|
237
|
+
assertArrayEquals(mockedRequestApduA, sendApduCalled)
|
|
238
|
+
|
|
239
|
+
// Simulate a successful response
|
|
240
|
+
val mockedSuccessApduResult = SendApduResult.Success(mockedResultApduSuccessA)
|
|
241
|
+
stateMachine.handleApduResult(mockedSuccessApduResult)
|
|
242
|
+
|
|
243
|
+
assertNull(sendApduResult)
|
|
244
|
+
|
|
245
|
+
// Simulate Response from GetAppAndVersion
|
|
246
|
+
val mockedSuccessApduResultGetAppAndVersion = SendApduResult.Success(mockedGetAppAndVersionSuccessfulResponse)
|
|
247
|
+
stateMachine.handleApduResult(mockedSuccessApduResultGetAppAndVersion)
|
|
248
|
+
|
|
249
|
+
// Should be in Connected state
|
|
250
|
+
assertEquals(
|
|
251
|
+
DeviceConnectionStateMachine.State.Connected,
|
|
252
|
+
stateMachine.getState()
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
// Response should have been returned
|
|
256
|
+
assertEquals(mockedSuccessApduResult, sendApduResult)
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@Test
|
|
260
|
+
fun `GIVEN the device connection state machine WHEN an APDU with triggersDisconnection is sent and device does not disconnect but is first busy THEN the machine retries and moves to Connected`() =
|
|
261
|
+
runTest {
|
|
262
|
+
var sendApduCalled: ByteArray? = null
|
|
263
|
+
var sendApduResult: SendApduResult? = null
|
|
264
|
+
var terminated = false
|
|
265
|
+
var error: Throwable? = null
|
|
266
|
+
|
|
267
|
+
val stateMachine = DeviceConnectionStateMachine(
|
|
268
|
+
sendApduFn = { apdu, _ -> sendApduCalled = apdu },
|
|
269
|
+
onTerminated = { terminated = true },
|
|
270
|
+
isFatalSendApduFailure = { false },
|
|
271
|
+
reconnectionTimeoutDuration = reconnectionTimeout,
|
|
272
|
+
onError = { error = it },
|
|
273
|
+
loggerService = FakeLoggerService(),
|
|
274
|
+
coroutineDispatcher = StandardTestDispatcher(testScheduler)
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
// Request sending an APDU (with triggersDisconnection = true)
|
|
278
|
+
stateMachine.requestSendApdu(DeviceConnectionStateMachine.SendApduRequestContent(
|
|
279
|
+
apdu = mockedRequestApduA,
|
|
280
|
+
triggersDisconnection = true,
|
|
281
|
+
resultCallback = { result -> sendApduResult = result },
|
|
282
|
+
abortTimeoutDuration = Duration.INFINITE
|
|
283
|
+
))
|
|
284
|
+
|
|
285
|
+
// Send APDU should have been called
|
|
286
|
+
assertArrayEquals(mockedRequestApduA, sendApduCalled)
|
|
287
|
+
|
|
288
|
+
// Simulate a successful response
|
|
289
|
+
val mockedSuccessApduResult = SendApduResult.Success(mockedResultApduSuccessA)
|
|
290
|
+
stateMachine.handleApduResult(mockedSuccessApduResult)
|
|
291
|
+
|
|
292
|
+
assertNull(sendApduResult)
|
|
293
|
+
|
|
294
|
+
assertIs<DeviceConnectionStateMachine.State.WaitingForDisconnection>(
|
|
295
|
+
stateMachine.getState()
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
// Simulate Busy Response from GetAppAndVersion
|
|
299
|
+
val mockedBusyApduResultGetAppAndVersion = SendApduResult.Success(mockedGetAppAndVersionBusyResponse)
|
|
300
|
+
stateMachine.handleApduResult(mockedBusyApduResultGetAppAndVersion)
|
|
301
|
+
|
|
302
|
+
assertIs<DeviceConnectionStateMachine.State.WaitingForDisconnection>(
|
|
303
|
+
stateMachine.getState()
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
// Simulate Successful Response from GetAppAndVersion
|
|
307
|
+
val mockedSuccessApduResultGetAppAndVersion = SendApduResult.Success(mockedGetAppAndVersionSuccessfulResponse)
|
|
308
|
+
stateMachine.handleApduResult(mockedSuccessApduResultGetAppAndVersion)
|
|
309
|
+
|
|
310
|
+
// Should be in Connected state
|
|
311
|
+
assertEquals(
|
|
312
|
+
DeviceConnectionStateMachine.State.Connected,
|
|
313
|
+
stateMachine.getState()
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
// Response should have been returned
|
|
317
|
+
assertEquals(mockedSuccessApduResult, sendApduResult)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
@Test
|
|
322
|
+
fun `GIVEN the device connection state machine WHEN an APDU with triggersDisconnection is sent and triggers a disconnection THEN the machine moves to WaitingForReconnection and the next APDU is queued until reconnection`() =
|
|
207
323
|
runTest {
|
|
208
324
|
val sendApduCalled: MutableList<ByteArray> = mutableListOf()
|
|
209
325
|
var terminated = false
|
|
@@ -231,10 +347,19 @@ class DeviceConnectionStateMachineTest {
|
|
|
231
347
|
val mockedSuccessApduResult = SendApduResult.Success(mockedResultApduSuccessA)
|
|
232
348
|
stateMachine.handleApduResult(mockedSuccessApduResult)
|
|
233
349
|
|
|
234
|
-
// sendApduFn should have been called
|
|
235
|
-
assertEquals(
|
|
350
|
+
// sendApduFn should have been called twice (for the mockedRequestApduA and an extra call for the getAppAndVersion APDU)
|
|
351
|
+
assertEquals(2, sendApduCalled.size)
|
|
352
|
+
|
|
353
|
+
// Should be in WaitingForDisconnection state
|
|
354
|
+
assertIs<DeviceConnectionStateMachine.State.WaitingForDisconnection>(
|
|
355
|
+
stateMachine.getState()
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
// Simulate disconnection
|
|
359
|
+
stateMachine.handleDeviceDisconnected()
|
|
360
|
+
|
|
361
|
+
// Should be in WaitingForReconnection state
|
|
236
362
|
|
|
237
|
-
// Should be in waiting state
|
|
238
363
|
assertEquals(
|
|
239
364
|
DeviceConnectionStateMachine.State.WaitingForReconnection,
|
|
240
365
|
stateMachine.getState()
|
|
@@ -256,7 +381,7 @@ class DeviceConnectionStateMachineTest {
|
|
|
256
381
|
)
|
|
257
382
|
|
|
258
383
|
// sendApduFn should not have been called one more time
|
|
259
|
-
assertEquals(
|
|
384
|
+
assertEquals(2, sendApduCalled.size)
|
|
260
385
|
|
|
261
386
|
// Simulate reconnection
|
|
262
387
|
stateMachine.handleDeviceConnected()
|
|
@@ -267,9 +392,9 @@ class DeviceConnectionStateMachineTest {
|
|
|
267
392
|
stateMachine.getState()::class
|
|
268
393
|
)
|
|
269
394
|
|
|
270
|
-
// Send APDU should have been called a
|
|
271
|
-
assertEquals(
|
|
272
|
-
assertArrayEquals(mockedRequestApduB, sendApduCalled[
|
|
395
|
+
// Send APDU should have been called a 3rd time, and the result should have been returned
|
|
396
|
+
assertEquals(3, sendApduCalled.size)
|
|
397
|
+
assertArrayEquals(mockedRequestApduB, sendApduCalled[2])
|
|
273
398
|
|
|
274
399
|
// Simulate a successful response
|
|
275
400
|
val mockedSuccessApduResultB = SendApduResult.Success(mockedResultApduSuccessB)
|
|
@@ -721,9 +846,11 @@ class DeviceConnectionStateMachineTest {
|
|
|
721
846
|
}
|
|
722
847
|
|
|
723
848
|
val reconnectionTimeout: Duration = 5.seconds
|
|
724
|
-
val mockedRequestApduA: ByteArray =
|
|
725
|
-
val mockedRequestApduB: ByteArray =
|
|
726
|
-
val
|
|
727
|
-
val
|
|
849
|
+
val mockedRequestApduA: ByteArray = "1234".fromHexStringToBytesOrThrow()
|
|
850
|
+
val mockedRequestApduB: ByteArray = "5678".fromHexStringToBytesOrThrow()
|
|
851
|
+
val mockedGetAppAndVersionSuccessfulResponse: ByteArray = "12349000".fromHexStringToBytesOrThrow()
|
|
852
|
+
val mockedGetAppAndVersionBusyResponse: ByteArray = "12346601".fromHexStringToBytesOrThrow()
|
|
853
|
+
val mockedResultApduSuccessA: ByteArray = "56789000".fromHexStringToBytesOrThrow()
|
|
854
|
+
val mockedResultApduSuccessB: ByteArray = "abcd9000".fromHexStringToBytesOrThrow()
|
|
728
855
|
}
|
|
729
856
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var m=(e,t)=>{for(var o in t)s(e,o,{get:t[o],enumerable:!0})},f=(e,t,o,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of l(t))!D.call(e,i)&&i!==o&&s(e,i,{get:()=>t[i],enumerable:!(c=v(t,i))||c.enumerable});return e};var N=e=>f(s({},"__esModule",{value:!0}),e);var b={};m(b,{mapNativeConnectionResultToConnectionResult:()=>R,mapNativeDeviceConnectionLostToDeviceDisconnected:()=>L,mapNativeDiscoveryDeviceToTransportDiscoveredDevice:()=>y,mapNativeLedgerDeviceToDeviceModel:()=>a,mapNativeSendApduResultToSendApduResult:()=>T,mapNativeTransportLogToLog:()=>g});module.exports=N(b);var n=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),d=require("../helpers/base64Utils"),u=require("../transport/Errors"),p=require("../transport/rnHidTransportIdentifier");function a(e,t){return t.filterDeviceModels({usbProductId:Number.parseInt(e.usbProductIdMask,16)})[0]??null}function y(e,t){const o=a(e.ledgerDevice,t);return o==null?null:{id:e.uid,deviceModel:o,transport:p.TRANSPORT_IDENTIFIER,name:e.name}}function g(e){let t;switch(e.level){case"error":t=n.LogLevel.Error;break;case"warning":t=n.LogLevel.Warning;break;case"info":t=n.LogLevel.Info;break;case"debug":t=n.LogLevel.Debug;break;default:I(e.level),t=n.LogLevel.Info;break}return[t,e.message,{tag:e.tag,data:e.jsonPayload,timestamp:Number.parseInt(e.timestamp,10)}]}function I(e){throw new Error("Unexpected object: "+e)}function R(e,t){if(e.success){const o=a(e.ledgerDevice,t);return o?(0,r.Right)({sessionId:e.sessionId,transportDeviceModel:o}):(0,r.Left)(new n.OpeningConnectionError(`Could not find device model for the connected device with usbProductIdMask: ${e.ledgerDevice.usbProductIdMask}`))}else return(0,r.Left)(new n.OpeningConnectionError(e.error))}function T(e){if(e.success){const t=(0,d.base64ToUint8Array)(e.apdu),o=n.FramerUtils.getFirstBytesFrom(t,t.length-2),c=n.FramerUtils.getLastBytesFrom(t,2);return(0,r.Right)(new n.ApduResponse({data:o,statusCode:c}))}else switch(e.error){case"SendApduTimeout":return(0,r.Left)(new n.SendApduTimeoutError("Abort timeout"));case"EmptyResponse":return(0,r.Left)(new n.SendApduEmptyResponseError("Empty response"));case"DeviceDisconnected":return(0,r.Left)(new n.DeviceDisconnectedWhileSendingError("Device disconnected"));case"DeviceNotFound":case"NoUsbEndpointFound":return(0,r.Left)(new n.DeviceDisconnectedBeforeSendingApdu);default:return(0,r.Left)(new u.HidTransportSendApduUnknownError(e.error))}}function L(e){return{sessionId:e.id}}0&&(module.exports={mapNativeConnectionResultToConnectionResult,mapNativeDeviceConnectionLostToDeviceDisconnected,mapNativeDiscoveryDeviceToTransportDiscoveredDevice,mapNativeLedgerDeviceToDeviceModel,mapNativeSendApduResultToSendApduResult,mapNativeTransportLogToLog});
|
|
2
2
|
//# sourceMappingURL=mapper.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/bridge/mapper.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ApduResponse,\n DeviceDisconnectedWhileSendingError,\n type DeviceModelDataSource,\n FramerUtils,\n LogLevel,\n type LogParams,\n OpeningConnectionError,\n SendApduEmptyResponseError,\n type SendApduResult,\n SendApduTimeoutError,\n type TransportDeviceModel,\n type TransportDiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { base64ToUint8Array } from \"@api/helpers/base64Utils\";\nimport { HidTransportSendApduUnknownError } from \"@api/transport/Errors\";\nimport { TRANSPORT_IDENTIFIER } from \"@api/transport/rnHidTransportIdentifier\";\nimport {\n type InternalConnectionResult,\n type InternalDeviceDisconnected,\n} from \"@api/transport/types\";\n\nimport {\n type NativeDeviceConnectionLost,\n type NativeDiscoveryDevice,\n type NativeInternalConnectionResult,\n type NativeLedgerDevice,\n type NativeLog,\n type NativeSendApduResult,\n} from \"./types\";\n\nexport function mapNativeLedgerDeviceToDeviceModel(\n nativeLedgerDevice: NativeLedgerDevice,\n deviceModelDataSource: DeviceModelDataSource,\n): TransportDeviceModel | null {\n return (\n deviceModelDataSource.filterDeviceModels({\n usbProductId: Number.parseInt(nativeLedgerDevice.usbProductIdMask, 16),\n })[0] ?? null\n );\n}\n\nexport function mapNativeDiscoveryDeviceToTransportDiscoveredDevice(\n nativeDevice: NativeDiscoveryDevice,\n deviceModelDataSource: DeviceModelDataSource,\n): TransportDiscoveredDevice | null {\n const deviceModel = mapNativeLedgerDeviceToDeviceModel(\n nativeDevice.ledgerDevice,\n deviceModelDataSource,\n );\n if (deviceModel == null) return null;\n\n return {\n id: nativeDevice.uid,\n deviceModel,\n transport: TRANSPORT_IDENTIFIER,\n name: nativeDevice.name,\n };\n}\n\nexport function mapNativeTransportLogToLog(log: NativeLog): LogParams {\n let level: LogLevel;\n switch (log.level) {\n case \"error\":\n level = LogLevel.Error;\n break;\n case \"warning\":\n level = LogLevel.Warning;\n break;\n case \"info\":\n level = LogLevel.Info;\n break;\n case \"debug\":\n level = LogLevel.Debug;\n break;\n default:\n assertNever(log.level);\n level = LogLevel.Info;\n break;\n }\n\n return [\n level,\n log.message,\n {\n tag: log.tag,\n data: log.jsonPayload,\n timestamp: Number.parseInt(log.timestamp, 10),\n },\n ];\n}\n\nfunction assertNever(x: never) {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function mapNativeConnectionResultToConnectionResult(\n result: NativeInternalConnectionResult,\n deviceModelDataSource: DeviceModelDataSource,\n): InternalConnectionResult {\n if (result.success) {\n const transportDeviceModel = mapNativeLedgerDeviceToDeviceModel(\n result.ledgerDevice,\n deviceModelDataSource,\n );\n if (!transportDeviceModel)\n return Left(\n new OpeningConnectionError(\n `Could not find device model for the connected device with usbProductIdMask: ${result.ledgerDevice.usbProductIdMask}`,\n ),\n );\n return Right({ sessionId: result.sessionId, transportDeviceModel });\n } else {\n return Left(new OpeningConnectionError(result.error));\n }\n}\n\nexport function mapNativeSendApduResultToSendApduResult(\n result: NativeSendApduResult,\n): SendApduResult {\n if (result.success) {\n const responseBytes = base64ToUint8Array(result.apdu);\n const data = FramerUtils.getFirstBytesFrom(\n responseBytes,\n responseBytes.length - 2,\n );\n const statusCode = FramerUtils.getLastBytesFrom(responseBytes, 2);\n return Right(new ApduResponse({ data, statusCode }));\n } else
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iDAAAE,EAAA,sDAAAC,EAAA,wDAAAC,EAAA,uCAAAC,EAAA,4CAAAC,EAAA,+BAAAC,IAAA,eAAAC,EAAAR,GAAA,IAAAS,
|
|
4
|
+
"sourcesContent": ["import {\n ApduResponse,\n DeviceDisconnectedBeforeSendingApdu,\n DeviceDisconnectedWhileSendingError,\n type DeviceModelDataSource,\n FramerUtils,\n LogLevel,\n type LogParams,\n OpeningConnectionError,\n SendApduEmptyResponseError,\n type SendApduResult,\n SendApduTimeoutError,\n type TransportDeviceModel,\n type TransportDiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { base64ToUint8Array } from \"@api/helpers/base64Utils\";\nimport { HidTransportSendApduUnknownError } from \"@api/transport/Errors\";\nimport { TRANSPORT_IDENTIFIER } from \"@api/transport/rnHidTransportIdentifier\";\nimport {\n type InternalConnectionResult,\n type InternalDeviceDisconnected,\n} from \"@api/transport/types\";\n\nimport {\n type NativeDeviceConnectionLost,\n type NativeDiscoveryDevice,\n type NativeInternalConnectionResult,\n type NativeLedgerDevice,\n type NativeLog,\n type NativeSendApduResult,\n} from \"./types\";\n\nexport function mapNativeLedgerDeviceToDeviceModel(\n nativeLedgerDevice: NativeLedgerDevice,\n deviceModelDataSource: DeviceModelDataSource,\n): TransportDeviceModel | null {\n return (\n deviceModelDataSource.filterDeviceModels({\n usbProductId: Number.parseInt(nativeLedgerDevice.usbProductIdMask, 16),\n })[0] ?? null\n );\n}\n\nexport function mapNativeDiscoveryDeviceToTransportDiscoveredDevice(\n nativeDevice: NativeDiscoveryDevice,\n deviceModelDataSource: DeviceModelDataSource,\n): TransportDiscoveredDevice | null {\n const deviceModel = mapNativeLedgerDeviceToDeviceModel(\n nativeDevice.ledgerDevice,\n deviceModelDataSource,\n );\n if (deviceModel == null) return null;\n\n return {\n id: nativeDevice.uid,\n deviceModel,\n transport: TRANSPORT_IDENTIFIER,\n name: nativeDevice.name,\n };\n}\n\nexport function mapNativeTransportLogToLog(log: NativeLog): LogParams {\n let level: LogLevel;\n switch (log.level) {\n case \"error\":\n level = LogLevel.Error;\n break;\n case \"warning\":\n level = LogLevel.Warning;\n break;\n case \"info\":\n level = LogLevel.Info;\n break;\n case \"debug\":\n level = LogLevel.Debug;\n break;\n default:\n assertNever(log.level);\n level = LogLevel.Info;\n break;\n }\n\n return [\n level,\n log.message,\n {\n tag: log.tag,\n data: log.jsonPayload,\n timestamp: Number.parseInt(log.timestamp, 10),\n },\n ];\n}\n\nfunction assertNever(x: never) {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function mapNativeConnectionResultToConnectionResult(\n result: NativeInternalConnectionResult,\n deviceModelDataSource: DeviceModelDataSource,\n): InternalConnectionResult {\n if (result.success) {\n const transportDeviceModel = mapNativeLedgerDeviceToDeviceModel(\n result.ledgerDevice,\n deviceModelDataSource,\n );\n if (!transportDeviceModel)\n return Left(\n new OpeningConnectionError(\n `Could not find device model for the connected device with usbProductIdMask: ${result.ledgerDevice.usbProductIdMask}`,\n ),\n );\n return Right({ sessionId: result.sessionId, transportDeviceModel });\n } else {\n return Left(new OpeningConnectionError(result.error));\n }\n}\n\nexport function mapNativeSendApduResultToSendApduResult(\n result: NativeSendApduResult,\n): SendApduResult {\n if (result.success) {\n const responseBytes = base64ToUint8Array(result.apdu);\n const data = FramerUtils.getFirstBytesFrom(\n responseBytes,\n responseBytes.length - 2,\n );\n const statusCode = FramerUtils.getLastBytesFrom(responseBytes, 2);\n return Right(new ApduResponse({ data, statusCode }));\n } else {\n switch (result.error) {\n case \"SendApduTimeout\":\n return Left(new SendApduTimeoutError(\"Abort timeout\"));\n case \"EmptyResponse\":\n return Left(new SendApduEmptyResponseError(\"Empty response\"));\n case \"DeviceDisconnected\":\n return Left(\n new DeviceDisconnectedWhileSendingError(\"Device disconnected\"),\n );\n case \"DeviceNotFound\":\n case \"NoUsbEndpointFound\":\n return Left(new DeviceDisconnectedBeforeSendingApdu());\n default:\n return Left(new HidTransportSendApduUnknownError(result.error));\n }\n }\n}\n\nexport function mapNativeDeviceConnectionLostToDeviceDisconnected(\n nativeDeviceConnectionLost: NativeDeviceConnectionLost,\n): InternalDeviceDisconnected {\n return {\n sessionId: nativeDeviceConnectionLost.id,\n };\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iDAAAE,EAAA,sDAAAC,EAAA,wDAAAC,EAAA,uCAAAC,EAAA,4CAAAC,EAAA,+BAAAC,IAAA,eAAAC,EAAAR,GAAA,IAAAS,EAcO,2CACPC,EAA4B,qBAE5BC,EAAmC,oCACnCC,EAAiD,iCACjDC,EAAqC,mDAe9B,SAASR,EACdS,EACAC,EAC6B,CAC7B,OACEA,EAAsB,mBAAmB,CACvC,aAAc,OAAO,SAASD,EAAmB,iBAAkB,EAAE,CACvE,CAAC,EAAE,CAAC,GAAK,IAEb,CAEO,SAASV,EACdY,EACAD,EACkC,CAClC,MAAME,EAAcZ,EAClBW,EAAa,aACbD,CACF,EACA,OAAIE,GAAe,KAAa,KAEzB,CACL,GAAID,EAAa,IACjB,YAAAC,EACA,UAAW,uBACX,KAAMD,EAAa,IACrB,CACF,CAEO,SAAST,EAA2BW,EAA2B,CACpE,IAAIC,EACJ,OAAQD,EAAI,MAAO,CACjB,IAAK,QACHC,EAAQ,WAAS,MACjB,MACF,IAAK,UACHA,EAAQ,WAAS,QACjB,MACF,IAAK,OACHA,EAAQ,WAAS,KACjB,MACF,IAAK,QACHA,EAAQ,WAAS,MACjB,MACF,QACEC,EAAYF,EAAI,KAAK,EACrBC,EAAQ,WAAS,KACjB,KACJ,CAEA,MAAO,CACLA,EACAD,EAAI,QACJ,CACE,IAAKA,EAAI,IACT,KAAMA,EAAI,YACV,UAAW,OAAO,SAASA,EAAI,UAAW,EAAE,CAC9C,CACF,CACF,CAEA,SAASE,EAAYC,EAAU,CAC7B,MAAM,IAAI,MAAM,sBAAwBA,CAAC,CAC3C,CAEO,SAASnB,EACdoB,EACAP,EAC0B,CAC1B,GAAIO,EAAO,QAAS,CAClB,MAAMC,EAAuBlB,EAC3BiB,EAAO,aACPP,CACF,EACA,OAAKQ,KAME,SAAM,CAAE,UAAWD,EAAO,UAAW,qBAAAC,CAAqB,CAAC,KALzD,QACL,IAAI,yBACF,+EAA+ED,EAAO,aAAa,gBAAgB,EACrH,CACF,CAEJ,KACE,UAAO,QAAK,IAAI,yBAAuBA,EAAO,KAAK,CAAC,CAExD,CAEO,SAAShB,EACdgB,EACgB,CAChB,GAAIA,EAAO,QAAS,CAClB,MAAME,KAAgB,sBAAmBF,EAAO,IAAI,EAC9CG,EAAO,cAAY,kBACvBD,EACAA,EAAc,OAAS,CACzB,EACME,EAAa,cAAY,iBAAiBF,EAAe,CAAC,EAChE,SAAO,SAAM,IAAI,eAAa,CAAE,KAAAC,EAAM,WAAAC,CAAW,CAAC,CAAC,CACrD,KACE,QAAQJ,EAAO,MAAO,CACpB,IAAK,kBACH,SAAO,QAAK,IAAI,uBAAqB,eAAe,CAAC,EACvD,IAAK,gBACH,SAAO,QAAK,IAAI,6BAA2B,gBAAgB,CAAC,EAC9D,IAAK,qBACH,SAAO,QACL,IAAI,sCAAoC,qBAAqB,CAC/D,EACF,IAAK,iBACL,IAAK,qBACH,SAAO,QAAK,IAAI,qCAAqC,EACvD,QACE,SAAO,QAAK,IAAI,mCAAiCA,EAAO,KAAK,CAAC,CAClE,CAEJ,CAEO,SAASnB,EACdwB,EAC4B,CAC5B,MAAO,CACL,UAAWA,EAA2B,EACxC,CACF",
|
|
6
6
|
"names": ["mapper_exports", "__export", "mapNativeConnectionResultToConnectionResult", "mapNativeDeviceConnectionLostToDeviceDisconnected", "mapNativeDiscoveryDeviceToTransportDiscoveredDevice", "mapNativeLedgerDeviceToDeviceModel", "mapNativeSendApduResultToSendApduResult", "mapNativeTransportLogToLog", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_base64Utils", "import_Errors", "import_rnHidTransportIdentifier", "nativeLedgerDevice", "deviceModelDataSource", "nativeDevice", "deviceModel", "log", "level", "assertNever", "x", "result", "transportDeviceModel", "responseBytes", "data", "statusCode", "nativeDeviceConnectionLost"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("@ledgerhq/device-management-kit"),
|
|
1
|
+
"use strict";var e=require("@ledgerhq/device-management-kit"),n=require("purify-ts"),d=require("../transport/Errors"),c=require("../transport/rnHidTransportIdentifier"),s=require("./mapper");describe("mapper",()=>{const a=new e.StaticDeviceModelDataSource;describe("mapNativeLedgerDeviceToDeviceModel",()=>{[{nativeLedgerDevice:{name:"NanoS",usbProductIdMask:"0x10"},deviceModel:a.getDeviceModel({id:e.DeviceModelId.NANO_S})},{nativeLedgerDevice:{name:"NanoX",usbProductIdMask:"0x40"},deviceModel:a.getDeviceModel({id:e.DeviceModelId.NANO_X})},{nativeLedgerDevice:{name:"NanoSPlus",usbProductIdMask:"0x50"},deviceModel:a.getDeviceModel({id:e.DeviceModelId.NANO_SP})},{nativeLedgerDevice:{name:"Stax",usbProductIdMask:"0x60"},deviceModel:a.getDeviceModel({id:e.DeviceModelId.STAX})},{nativeLedgerDevice:{name:"Flex",usbProductIdMask:"0x70"},deviceModel:a.getDeviceModel({id:e.DeviceModelId.FLEX})},{nativeLedgerDevice:{name:"NanoX",usbProductIdMask:"0x12345678"},deviceModel:null}].forEach(({nativeLedgerDevice:t,deviceModel:i})=>{it(`should map USB device with usbProductIdMask ${t.usbProductIdMask} to ${i?.productName??"null"}`,()=>{expect((0,s.mapNativeLedgerDeviceToDeviceModel)(t,a)).toEqual(i)})})}),describe("mapNativeDiscoveryDeviceToTransportDiscoveredDevice",()=>{it("should map NativeDiscoveryDevice to TransportDiscoveredDevice",()=>{const o={name:"NanoS",uid:"abcd",ledgerDevice:{name:"NanoS",usbProductIdMask:"0x10"}},t={id:"abcd",deviceModel:a.getDeviceModel({id:e.DeviceModelId.NANO_S}),transport:c.TRANSPORT_IDENTIFIER,name:"NanoS"};expect((0,s.mapNativeDiscoveryDeviceToTransportDiscoveredDevice)(o,a)).toEqual(t)}),it("should return null if the device model is not recognized",()=>{const o={name:"NanoX",uid:"efgh",ledgerDevice:{name:"NanoX",usbProductIdMask:"0x4567890"}};expect((0,s.mapNativeDiscoveryDeviceToTransportDiscoveredDevice)(o,a)).toEqual(null)})}),describe("mapNativeTransportLogToLog",()=>{[{nativeLog:{level:"debug",tag:"tag",message:"debug message",jsonPayload:{key:"value"},timestamp:"123456789"},log:[e.LogLevel.Debug,"debug message",{timestamp:123456789,tag:"tag",data:{key:"value"}}]},{nativeLog:{level:"info",tag:"tag",message:"info message",jsonPayload:{key:"value"},timestamp:"123456789"},log:[e.LogLevel.Info,"info message",{timestamp:123456789,tag:"tag",data:{key:"value"}}]},{nativeLog:{level:"error",tag:"tag",message:"error message",jsonPayload:{key:"value"},timestamp:"123456789"},log:[e.LogLevel.Error,"error message",{timestamp:123456789,tag:"tag",data:{key:"value"}}]},{nativeLog:{level:"warning",tag:"tag",message:"warning message",jsonPayload:{key:"value"},timestamp:"123456789"},log:[e.LogLevel.Warning,"warning message",{timestamp:123456789,tag:"tag",data:{key:"value"}}]}].forEach(({nativeLog:t,log:i})=>{it(`should map NativeLog with level "${t.level}" to Log`,()=>{expect((0,s.mapNativeTransportLogToLog)(t)).toEqual(i)})})}),describe("mapNativeConnectionResultToConnectionResult",()=>{[{testTitle:"Success",nativeConnectionResult:{success:!0,sessionId:"1234",ledgerDevice:{name:"NanoS",usbProductIdMask:"0x10"},deviceName:"NanoS"},connectionResult:(0,n.Right)({sessionId:"1234",transportDeviceModel:a.getDeviceModel({id:e.DeviceModelId.NANO_S})})},{testTitle:"Failure",nativeConnectionResult:{success:!1,error:"error message"},connectionResult:(0,n.Left)(new e.OpeningConnectionError("error message"))},{testTitle:"Unknown device model",nativeConnectionResult:{success:!0,sessionId:"1234",ledgerDevice:{name:"NanoX",usbProductIdMask:"0x12345678"},deviceName:"NanoX"},connectionResult:(0,n.Left)(new e.OpeningConnectionError("Could not find device model for the connected device with usbProductIdMask: 0x12345678"))}].forEach(({testTitle:t,nativeConnectionResult:i,connectionResult:r})=>{it(t,()=>{expect((0,s.mapNativeConnectionResultToConnectionResult)(i,a)).toEqual(r)})})}),describe("mapNativeSendApduResultToSendApduResult",()=>{test("success",()=>{const t={success:!0,apdu:"AQIDkAA="},i=(0,n.Right)(new e.ApduResponse({data:new Uint8Array([1,2,3]),statusCode:new Uint8Array([144,0])}));expect((0,s.mapNativeSendApduResultToSendApduResult)(t)).toEqual(i)}),test("failure",()=>{const o={success:!1,error:"error message"},t=(0,n.Left)(new d.HidTransportSendApduUnknownError("error message"));expect((0,s.mapNativeSendApduResultToSendApduResult)(o)).toEqual(t)}),test("timeout error",()=>{const o={success:!1,error:"SendApduTimeout"},t=(0,n.Left)(new e.SendApduTimeoutError("Abort timeout"));expect((0,s.mapNativeSendApduResultToSendApduResult)(o)).toEqual(t)}),test("empty response error",()=>{const o={success:!1,error:"EmptyResponse"},t=(0,n.Left)(new e.SendApduEmptyResponseError("Empty response"));expect((0,s.mapNativeSendApduResultToSendApduResult)(o)).toEqual(t)}),test("device not found error",()=>{const o={success:!1,error:"DeviceNotFound"},t=(0,n.Left)(new e.DeviceDisconnectedBeforeSendingApdu);expect((0,s.mapNativeSendApduResultToSendApduResult)(o)).toEqual(t)}),test("no usb endpoint found error",()=>{const o={success:!1,error:"NoUsbEndpointFound"},t=(0,n.Left)(new e.DeviceDisconnectedBeforeSendingApdu);expect((0,s.mapNativeSendApduResultToSendApduResult)(o)).toEqual(t)}),test("unknown error",()=>{const o={success:!1,error:"unknown error"},t=(0,n.Left)(new d.HidTransportSendApduUnknownError("unknown error"));expect((0,s.mapNativeSendApduResultToSendApduResult)(o)).toEqual(t)})}),describe("mapNativeDeviceConnectionLostToDeviceDisconnected",()=>{it("should map NativeDeviceConnectionLost to DeviceDisconnected",()=>{const o={id:"1234"},t={sessionId:"1234"};expect((0,s.mapNativeDeviceConnectionLostToDeviceDisconnected)(o)).toEqual(t)})})});
|
|
2
2
|
//# sourceMappingURL=mapper.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/bridge/mapper.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ApduResponse,\n DeviceModelId,\n LogLevel,\n type LogParams,\n OpeningConnectionError,\n SendApduEmptyResponseError,\n type SendApduResult,\n SendApduTimeoutError,\n StaticDeviceModelDataSource,\n type TransportDeviceModel,\n type TransportDiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { HidTransportSendApduUnknownError } from \"@api/transport/Errors\";\nimport { TRANSPORT_IDENTIFIER } from \"@api/transport/rnHidTransportIdentifier\";\nimport { type InternalConnectionResult } from \"@api/transport/types\";\n\nimport {\n mapNativeConnectionResultToConnectionResult,\n mapNativeDeviceConnectionLostToDeviceDisconnected,\n mapNativeDiscoveryDeviceToTransportDiscoveredDevice,\n mapNativeLedgerDeviceToDeviceModel,\n mapNativeSendApduResultToSendApduResult,\n mapNativeTransportLogToLog,\n} from \"./mapper\";\nimport {\n type NativeDiscoveryDevice,\n type NativeInternalConnectionResult,\n type NativeLedgerDevice,\n type NativeLog,\n type NativeSendApduResult,\n} from \"./types\";\n\ndescribe(\"mapper\", () => {\n const deviceModelDataSource = new StaticDeviceModelDataSource();\n\n describe(\"mapNativeLedgerDeviceToDeviceModel\", () => {\n const testCases: Array<{\n nativeLedgerDevice: NativeLedgerDevice;\n deviceModel: TransportDeviceModel | null;\n }> = [\n {\n nativeLedgerDevice: {\n name: \"NanoS\",\n usbProductIdMask: \"0x10\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_S,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"NanoX\",\n usbProductIdMask: \"0x40\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_X,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"NanoSPlus\",\n usbProductIdMask: \"0x50\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_SP,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"Stax\",\n usbProductIdMask: \"0x60\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.STAX,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"Flex\",\n usbProductIdMask: \"0x70\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.FLEX,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"NanoX\",\n usbProductIdMask: \"0x12345678\",\n },\n deviceModel: null, // because the usbProductIdMask is not recognized\n },\n ];\n testCases.forEach(({ nativeLedgerDevice, deviceModel }) => {\n it(`should map USB device with usbProductIdMask ${nativeLedgerDevice.usbProductIdMask} to ${\n deviceModel?.productName ?? \"null\"\n }`, () => {\n expect(\n mapNativeLedgerDeviceToDeviceModel(\n nativeLedgerDevice,\n deviceModelDataSource,\n ),\n ).toEqual(deviceModel);\n });\n });\n });\n\n describe(\"mapNativeDiscoveryDeviceToTransportDiscoveredDevice\", () => {\n it(\"should map NativeDiscoveryDevice to TransportDiscoveredDevice\", () => {\n const nativeDevice: NativeDiscoveryDevice = {\n name: \"NanoS\",\n uid: \"abcd\",\n ledgerDevice: {\n name: \"NanoS\",\n usbProductIdMask: \"0x10\",\n },\n };\n const expectedDiscoveredDevice: TransportDiscoveredDevice = {\n id: \"abcd\",\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_S,\n }),\n transport: TRANSPORT_IDENTIFIER,\n name: \"NanoS\",\n };\n expect(\n mapNativeDiscoveryDeviceToTransportDiscoveredDevice(\n nativeDevice,\n deviceModelDataSource,\n ),\n ).toEqual(expectedDiscoveredDevice);\n });\n\n it(\"should return null if the device model is not recognized\", () => {\n const nativeDevice: NativeDiscoveryDevice = {\n name: \"NanoX\",\n uid: \"efgh\",\n ledgerDevice: {\n name: \"NanoX\",\n usbProductIdMask: \"0x4567890\", // some invalid value\n },\n };\n const expectedDiscoveredDevice = null; // because the usbProductIdMask is not recognized\n expect(\n mapNativeDiscoveryDeviceToTransportDiscoveredDevice(\n nativeDevice,\n deviceModelDataSource,\n ),\n ).toEqual(expectedDiscoveredDevice);\n });\n });\n\n describe(\"mapNativeTransportLogToLog\", () => {\n const testCases: Array<{\n nativeLog: NativeLog;\n log: LogParams;\n }> = [\n {\n // debug\n nativeLog: {\n level: \"debug\",\n tag: \"tag\",\n message: \"debug message\",\n jsonPayload: { key: \"value\" },\n timestamp: \"123456789\",\n },\n log: [\n LogLevel.Debug,\n \"debug message\",\n {\n timestamp: 123456789,\n tag: \"tag\",\n data: { key: \"value\" },\n },\n ],\n },\n // info\n {\n nativeLog: {\n level: \"info\",\n tag: \"tag\",\n message: \"info message\",\n jsonPayload: { key: \"value\" },\n timestamp: \"123456789\",\n },\n log: [\n LogLevel.Info,\n \"info message\",\n {\n timestamp: 123456789,\n tag: \"tag\",\n data: { key: \"value\" },\n },\n ],\n },\n // error\n {\n nativeLog: {\n level: \"error\",\n tag: \"tag\",\n message: \"error message\",\n jsonPayload: { key: \"value\" },\n timestamp: \"123456789\",\n },\n log: [\n LogLevel.Error,\n \"error message\",\n {\n timestamp: 123456789,\n tag: \"tag\",\n data: { key: \"value\" },\n },\n ],\n },\n // warning\n {\n nativeLog: {\n level: \"warning\",\n tag: \"tag\",\n message: \"warning message\",\n jsonPayload: { key: \"value\" },\n timestamp: \"123456789\",\n },\n log: [\n LogLevel.Warning,\n \"warning message\",\n {\n timestamp: 123456789,\n tag: \"tag\",\n data: { key: \"value\" },\n },\n ],\n },\n ];\n\n testCases.forEach(({ nativeLog, log }) => {\n it(`should map NativeLog with level \"${nativeLog.level}\" to Log`, () => {\n expect(mapNativeTransportLogToLog(nativeLog)).toEqual(log);\n });\n });\n });\n\n describe(\"mapNativeConnectionResultToConnectionResult\", () => {\n const testCases: Array<{\n nativeConnectionResult: NativeInternalConnectionResult;\n connectionResult: InternalConnectionResult;\n testTitle: string;\n }> = [\n {\n testTitle: \"Success\",\n nativeConnectionResult: {\n success: true,\n sessionId: \"1234\",\n ledgerDevice: {\n name: \"NanoS\",\n usbProductIdMask: \"0x10\",\n },\n deviceName: \"NanoS\",\n },\n connectionResult: Right({\n sessionId: \"1234\",\n transportDeviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_S,\n }),\n }),\n },\n {\n testTitle: \"Failure\",\n nativeConnectionResult: {\n success: false,\n error: \"error message\",\n },\n connectionResult: Left(new OpeningConnectionError(\"error message\")),\n },\n {\n testTitle: \"Unknown device model\",\n nativeConnectionResult: {\n success: true,\n sessionId: \"1234\",\n ledgerDevice: {\n name: \"NanoX\",\n usbProductIdMask: \"0x12345678\",\n },\n deviceName: \"NanoX\",\n },\n connectionResult: Left(\n new OpeningConnectionError(\n \"Could not find device model for the connected device with usbProductIdMask: 0x12345678\",\n ),\n ),\n },\n ];\n\n testCases.forEach(\n ({ testTitle, nativeConnectionResult, connectionResult }) => {\n it(testTitle, () => {\n expect(\n mapNativeConnectionResultToConnectionResult(\n nativeConnectionResult,\n deviceModelDataSource,\n ),\n ).toEqual(connectionResult);\n });\n },\n );\n });\n\n describe(\"mapNativeSendApduResultToSendApduResult\", () => {\n test(\"success\", () => {\n const resultApduString = \"AQIDkAA=\";\n const nativeSendApduResult: NativeSendApduResult = {\n success: true,\n apdu: resultApduString,\n };\n const expectedSendApduResult: SendApduResult = Right(\n new ApduResponse({\n data: new Uint8Array([0x01, 0x02, 0x03]),\n statusCode: new Uint8Array([0x90, 0x00]),\n }),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"failure\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"error message\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new HidTransportSendApduUnknownError(\"error message\"),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"timeout error\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"SendApduTimeout\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new SendApduTimeoutError(\"Abort timeout\"),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"empty response error\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"EmptyResponse\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new SendApduEmptyResponseError(\"Empty response\"),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n });\n\n describe(\"mapNativeDeviceConnectionLostToDeviceDisconnected\", () => {\n it(\"should map NativeDeviceConnectionLost to DeviceDisconnected\", () => {\n const nativeDeviceConnectionLost = {\n id: \"1234\",\n };\n const expectedDeviceDisconnected = {\n sessionId: \"1234\",\n };\n expect(\n mapNativeDeviceConnectionLostToDeviceDisconnected(\n nativeDeviceConnectionLost,\n ),\n ).toEqual(expectedDeviceDisconnected);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "aAAA,IAAAA,
|
|
4
|
+
"sourcesContent": ["import {\n ApduResponse,\n DeviceDisconnectedBeforeSendingApdu,\n DeviceModelId,\n LogLevel,\n type LogParams,\n OpeningConnectionError,\n SendApduEmptyResponseError,\n type SendApduResult,\n SendApduTimeoutError,\n StaticDeviceModelDataSource,\n type TransportDeviceModel,\n type TransportDiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { HidTransportSendApduUnknownError } from \"@api/transport/Errors\";\nimport { TRANSPORT_IDENTIFIER } from \"@api/transport/rnHidTransportIdentifier\";\nimport { type InternalConnectionResult } from \"@api/transport/types\";\n\nimport {\n mapNativeConnectionResultToConnectionResult,\n mapNativeDeviceConnectionLostToDeviceDisconnected,\n mapNativeDiscoveryDeviceToTransportDiscoveredDevice,\n mapNativeLedgerDeviceToDeviceModel,\n mapNativeSendApduResultToSendApduResult,\n mapNativeTransportLogToLog,\n} from \"./mapper\";\nimport {\n type NativeDiscoveryDevice,\n type NativeInternalConnectionResult,\n type NativeLedgerDevice,\n type NativeLog,\n type NativeSendApduResult,\n} from \"./types\";\n\ndescribe(\"mapper\", () => {\n const deviceModelDataSource = new StaticDeviceModelDataSource();\n\n describe(\"mapNativeLedgerDeviceToDeviceModel\", () => {\n const testCases: Array<{\n nativeLedgerDevice: NativeLedgerDevice;\n deviceModel: TransportDeviceModel | null;\n }> = [\n {\n nativeLedgerDevice: {\n name: \"NanoS\",\n usbProductIdMask: \"0x10\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_S,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"NanoX\",\n usbProductIdMask: \"0x40\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_X,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"NanoSPlus\",\n usbProductIdMask: \"0x50\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_SP,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"Stax\",\n usbProductIdMask: \"0x60\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.STAX,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"Flex\",\n usbProductIdMask: \"0x70\",\n },\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.FLEX,\n }),\n },\n {\n nativeLedgerDevice: {\n name: \"NanoX\",\n usbProductIdMask: \"0x12345678\",\n },\n deviceModel: null, // because the usbProductIdMask is not recognized\n },\n ];\n testCases.forEach(({ nativeLedgerDevice, deviceModel }) => {\n it(`should map USB device with usbProductIdMask ${nativeLedgerDevice.usbProductIdMask} to ${\n deviceModel?.productName ?? \"null\"\n }`, () => {\n expect(\n mapNativeLedgerDeviceToDeviceModel(\n nativeLedgerDevice,\n deviceModelDataSource,\n ),\n ).toEqual(deviceModel);\n });\n });\n });\n\n describe(\"mapNativeDiscoveryDeviceToTransportDiscoveredDevice\", () => {\n it(\"should map NativeDiscoveryDevice to TransportDiscoveredDevice\", () => {\n const nativeDevice: NativeDiscoveryDevice = {\n name: \"NanoS\",\n uid: \"abcd\",\n ledgerDevice: {\n name: \"NanoS\",\n usbProductIdMask: \"0x10\",\n },\n };\n const expectedDiscoveredDevice: TransportDiscoveredDevice = {\n id: \"abcd\",\n deviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_S,\n }),\n transport: TRANSPORT_IDENTIFIER,\n name: \"NanoS\",\n };\n expect(\n mapNativeDiscoveryDeviceToTransportDiscoveredDevice(\n nativeDevice,\n deviceModelDataSource,\n ),\n ).toEqual(expectedDiscoveredDevice);\n });\n\n it(\"should return null if the device model is not recognized\", () => {\n const nativeDevice: NativeDiscoveryDevice = {\n name: \"NanoX\",\n uid: \"efgh\",\n ledgerDevice: {\n name: \"NanoX\",\n usbProductIdMask: \"0x4567890\", // some invalid value\n },\n };\n const expectedDiscoveredDevice = null; // because the usbProductIdMask is not recognized\n expect(\n mapNativeDiscoveryDeviceToTransportDiscoveredDevice(\n nativeDevice,\n deviceModelDataSource,\n ),\n ).toEqual(expectedDiscoveredDevice);\n });\n });\n\n describe(\"mapNativeTransportLogToLog\", () => {\n const testCases: Array<{\n nativeLog: NativeLog;\n log: LogParams;\n }> = [\n {\n // debug\n nativeLog: {\n level: \"debug\",\n tag: \"tag\",\n message: \"debug message\",\n jsonPayload: { key: \"value\" },\n timestamp: \"123456789\",\n },\n log: [\n LogLevel.Debug,\n \"debug message\",\n {\n timestamp: 123456789,\n tag: \"tag\",\n data: { key: \"value\" },\n },\n ],\n },\n // info\n {\n nativeLog: {\n level: \"info\",\n tag: \"tag\",\n message: \"info message\",\n jsonPayload: { key: \"value\" },\n timestamp: \"123456789\",\n },\n log: [\n LogLevel.Info,\n \"info message\",\n {\n timestamp: 123456789,\n tag: \"tag\",\n data: { key: \"value\" },\n },\n ],\n },\n // error\n {\n nativeLog: {\n level: \"error\",\n tag: \"tag\",\n message: \"error message\",\n jsonPayload: { key: \"value\" },\n timestamp: \"123456789\",\n },\n log: [\n LogLevel.Error,\n \"error message\",\n {\n timestamp: 123456789,\n tag: \"tag\",\n data: { key: \"value\" },\n },\n ],\n },\n // warning\n {\n nativeLog: {\n level: \"warning\",\n tag: \"tag\",\n message: \"warning message\",\n jsonPayload: { key: \"value\" },\n timestamp: \"123456789\",\n },\n log: [\n LogLevel.Warning,\n \"warning message\",\n {\n timestamp: 123456789,\n tag: \"tag\",\n data: { key: \"value\" },\n },\n ],\n },\n ];\n\n testCases.forEach(({ nativeLog, log }) => {\n it(`should map NativeLog with level \"${nativeLog.level}\" to Log`, () => {\n expect(mapNativeTransportLogToLog(nativeLog)).toEqual(log);\n });\n });\n });\n\n describe(\"mapNativeConnectionResultToConnectionResult\", () => {\n const testCases: Array<{\n nativeConnectionResult: NativeInternalConnectionResult;\n connectionResult: InternalConnectionResult;\n testTitle: string;\n }> = [\n {\n testTitle: \"Success\",\n nativeConnectionResult: {\n success: true,\n sessionId: \"1234\",\n ledgerDevice: {\n name: \"NanoS\",\n usbProductIdMask: \"0x10\",\n },\n deviceName: \"NanoS\",\n },\n connectionResult: Right({\n sessionId: \"1234\",\n transportDeviceModel: deviceModelDataSource.getDeviceModel({\n id: DeviceModelId.NANO_S,\n }),\n }),\n },\n {\n testTitle: \"Failure\",\n nativeConnectionResult: {\n success: false,\n error: \"error message\",\n },\n connectionResult: Left(new OpeningConnectionError(\"error message\")),\n },\n {\n testTitle: \"Unknown device model\",\n nativeConnectionResult: {\n success: true,\n sessionId: \"1234\",\n ledgerDevice: {\n name: \"NanoX\",\n usbProductIdMask: \"0x12345678\",\n },\n deviceName: \"NanoX\",\n },\n connectionResult: Left(\n new OpeningConnectionError(\n \"Could not find device model for the connected device with usbProductIdMask: 0x12345678\",\n ),\n ),\n },\n ];\n\n testCases.forEach(\n ({ testTitle, nativeConnectionResult, connectionResult }) => {\n it(testTitle, () => {\n expect(\n mapNativeConnectionResultToConnectionResult(\n nativeConnectionResult,\n deviceModelDataSource,\n ),\n ).toEqual(connectionResult);\n });\n },\n );\n });\n\n describe(\"mapNativeSendApduResultToSendApduResult\", () => {\n test(\"success\", () => {\n const resultApduString = \"AQIDkAA=\";\n const nativeSendApduResult: NativeSendApduResult = {\n success: true,\n apdu: resultApduString,\n };\n const expectedSendApduResult: SendApduResult = Right(\n new ApduResponse({\n data: new Uint8Array([0x01, 0x02, 0x03]),\n statusCode: new Uint8Array([0x90, 0x00]),\n }),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"failure\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"error message\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new HidTransportSendApduUnknownError(\"error message\"),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"timeout error\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"SendApduTimeout\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new SendApduTimeoutError(\"Abort timeout\"),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"empty response error\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"EmptyResponse\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new SendApduEmptyResponseError(\"Empty response\"),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"device not found error\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"DeviceNotFound\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new DeviceDisconnectedBeforeSendingApdu(),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"no usb endpoint found error\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"NoUsbEndpointFound\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new DeviceDisconnectedBeforeSendingApdu(),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n\n test(\"unknown error\", () => {\n const nativeSendApduResult: NativeSendApduResult = {\n success: false,\n error: \"unknown error\",\n };\n const expectedSendApduResult: SendApduResult = Left(\n new HidTransportSendApduUnknownError(\"unknown error\"),\n );\n expect(\n mapNativeSendApduResultToSendApduResult(nativeSendApduResult),\n ).toEqual(expectedSendApduResult);\n });\n });\n\n describe(\"mapNativeDeviceConnectionLostToDeviceDisconnected\", () => {\n it(\"should map NativeDeviceConnectionLost to DeviceDisconnected\", () => {\n const nativeDeviceConnectionLost = {\n id: \"1234\",\n };\n const expectedDeviceDisconnected = {\n sessionId: \"1234\",\n };\n expect(\n mapNativeDeviceConnectionLostToDeviceDisconnected(\n nativeDeviceConnectionLost,\n ),\n ).toEqual(expectedDeviceDisconnected);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_device_management_kit", "import_purify_ts", "import_Errors", "import_rnHidTransportIdentifier", "import_mapper", "deviceModelDataSource", "nativeLedgerDevice", "deviceModel", "nativeDevice", "expectedDiscoveredDevice", "nativeLog", "log", "testTitle", "nativeConnectionResult", "connectionResult", "nativeSendApduResult", "expectedSendApduResult", "nativeDeviceConnectionLost", "expectedDeviceDisconnected"]
|
|
7
7
|
}
|
package/lib/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var I=(o,r)=>{for(var t in r)p(o,t,{get:r[t],enumerable:!0})},R=(o,r,t,d)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of f(r))!s.call(o,n)&&n!==t&&p(o,n,{get:()=>r[n],enumerable:!(d=i(r,n))||d.enumerable});return o};var m=o=>R(p({},"__esModule",{value:!0}),o);var x={};I(x,{HidTransportSendApduUnknownError:()=>T.HidTransportSendApduUnknownError,RNHidTransportFactory:()=>e.RNHidTransportFactory,rnHidTransportIdentifier:()=>a.TRANSPORT_IDENTIFIER});module.exports=m(x);var e=require("./api/RNHidTransportFactory"),T=require("./api/transport/Errors"),a=require("./api/transport/rnHidTransportIdentifier");0&&(module.exports={HidTransportSendApduUnknownError,RNHidTransportFactory,rnHidTransportIdentifier});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export { RNHidTransportFactory } from \"@api/RNHidTransportFactory\";\nexport { TRANSPORT_IDENTIFIER as rnHidTransportIdentifier } from \"@api/transport/rnHidTransportIdentifier\";\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,
|
|
6
|
-
"names": ["index_exports", "__export", "__toCommonJS", "import_RNHidTransportFactory", "import_rnHidTransportIdentifier"]
|
|
4
|
+
"sourcesContent": ["export { RNHidTransportFactory } from \"@api/RNHidTransportFactory\";\nexport { HidTransportSendApduUnknownError } from \"@api/transport/Errors\";\nexport { TRANSPORT_IDENTIFIER as rnHidTransportIdentifier } from \"@api/transport/rnHidTransportIdentifier\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gMAAAE,EAAAF,GAAA,IAAAG,EAAsC,sCACtCC,EAAiD,iCACjDC,EAAiE",
|
|
6
|
+
"names": ["index_exports", "__export", "__toCommonJS", "import_RNHidTransportFactory", "import_Errors", "import_rnHidTransportIdentifier"]
|
|
7
7
|
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/device-transport-kit-react-native-hid",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"private": false,
|
|
6
6
|
"react-native": "src/index.ts",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
|
|
33
33
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
34
34
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\"",
|
|
35
|
-
"lint": "eslint",
|
|
35
|
+
"lint": "eslint src/**/*.ts",
|
|
36
36
|
"lint:fix": "pnpm lint --fix",
|
|
37
37
|
"postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
|
|
38
38
|
"prettier": "prettier . --check",
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as p,DeviceDisconnectedWhileSendingError as
|
|
1
|
+
import{ApduResponse as u,DeviceDisconnectedBeforeSendingApdu as p,DeviceDisconnectedWhileSendingError as v,FramerUtils as i,LogLevel as r,OpeningConnectionError as c,SendApduEmptyResponseError as l,SendApduTimeoutError as D}from"@ledgerhq/device-management-kit";import{Left as o,Right as s}from"purify-ts";import{base64ToUint8Array as m}from"../helpers/base64Utils";import{HidTransportSendApduUnknownError as f}from"../transport/Errors";import{TRANSPORT_IDENTIFIER as N}from"../transport/rnHidTransportIdentifier";function a(e,t){return t.filterDeviceModels({usbProductId:Number.parseInt(e.usbProductIdMask,16)})[0]??null}function b(e,t){const n=a(e.ledgerDevice,t);return n==null?null:{id:e.uid,deviceModel:n,transport:N,name:e.name}}function S(e){let t;switch(e.level){case"error":t=r.Error;break;case"warning":t=r.Warning;break;case"info":t=r.Info;break;case"debug":t=r.Debug;break;default:y(e.level),t=r.Info;break}return[t,e.message,{tag:e.tag,data:e.jsonPayload,timestamp:Number.parseInt(e.timestamp,10)}]}function y(e){throw new Error("Unexpected object: "+e)}function w(e,t){if(e.success){const n=a(e.ledgerDevice,t);return n?s({sessionId:e.sessionId,transportDeviceModel:n}):o(new c(`Could not find device model for the connected device with usbProductIdMask: ${e.ledgerDevice.usbProductIdMask}`))}else return o(new c(e.error))}function A(e){if(e.success){const t=m(e.apdu),n=i.getFirstBytesFrom(t,t.length-2),d=i.getLastBytesFrom(t,2);return s(new u({data:n,statusCode:d}))}else switch(e.error){case"SendApduTimeout":return o(new D("Abort timeout"));case"EmptyResponse":return o(new l("Empty response"));case"DeviceDisconnected":return o(new v("Device disconnected"));case"DeviceNotFound":case"NoUsbEndpointFound":return o(new p);default:return o(new f(e.error))}}function E(e){return{sessionId:e.id}}export{w as mapNativeConnectionResultToConnectionResult,E as mapNativeDeviceConnectionLostToDeviceDisconnected,b as mapNativeDiscoveryDeviceToTransportDiscoveredDevice,a as mapNativeLedgerDeviceToDeviceModel,A as mapNativeSendApduResultToSendApduResult,S as mapNativeTransportLogToLog};
|
|
2
2
|
//# sourceMappingURL=mapper.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/bridge/mapper.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ApduResponse,\n DeviceDisconnectedWhileSendingError,\n type DeviceModelDataSource,\n FramerUtils,\n LogLevel,\n type LogParams,\n OpeningConnectionError,\n SendApduEmptyResponseError,\n type SendApduResult,\n SendApduTimeoutError,\n type TransportDeviceModel,\n type TransportDiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { base64ToUint8Array } from \"@api/helpers/base64Utils\";\nimport { HidTransportSendApduUnknownError } from \"@api/transport/Errors\";\nimport { TRANSPORT_IDENTIFIER } from \"@api/transport/rnHidTransportIdentifier\";\nimport {\n type InternalConnectionResult,\n type InternalDeviceDisconnected,\n} from \"@api/transport/types\";\n\nimport {\n type NativeDeviceConnectionLost,\n type NativeDiscoveryDevice,\n type NativeInternalConnectionResult,\n type NativeLedgerDevice,\n type NativeLog,\n type NativeSendApduResult,\n} from \"./types\";\n\nexport function mapNativeLedgerDeviceToDeviceModel(\n nativeLedgerDevice: NativeLedgerDevice,\n deviceModelDataSource: DeviceModelDataSource,\n): TransportDeviceModel | null {\n return (\n deviceModelDataSource.filterDeviceModels({\n usbProductId: Number.parseInt(nativeLedgerDevice.usbProductIdMask, 16),\n })[0] ?? null\n );\n}\n\nexport function mapNativeDiscoveryDeviceToTransportDiscoveredDevice(\n nativeDevice: NativeDiscoveryDevice,\n deviceModelDataSource: DeviceModelDataSource,\n): TransportDiscoveredDevice | null {\n const deviceModel = mapNativeLedgerDeviceToDeviceModel(\n nativeDevice.ledgerDevice,\n deviceModelDataSource,\n );\n if (deviceModel == null) return null;\n\n return {\n id: nativeDevice.uid,\n deviceModel,\n transport: TRANSPORT_IDENTIFIER,\n name: nativeDevice.name,\n };\n}\n\nexport function mapNativeTransportLogToLog(log: NativeLog): LogParams {\n let level: LogLevel;\n switch (log.level) {\n case \"error\":\n level = LogLevel.Error;\n break;\n case \"warning\":\n level = LogLevel.Warning;\n break;\n case \"info\":\n level = LogLevel.Info;\n break;\n case \"debug\":\n level = LogLevel.Debug;\n break;\n default:\n assertNever(log.level);\n level = LogLevel.Info;\n break;\n }\n\n return [\n level,\n log.message,\n {\n tag: log.tag,\n data: log.jsonPayload,\n timestamp: Number.parseInt(log.timestamp, 10),\n },\n ];\n}\n\nfunction assertNever(x: never) {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function mapNativeConnectionResultToConnectionResult(\n result: NativeInternalConnectionResult,\n deviceModelDataSource: DeviceModelDataSource,\n): InternalConnectionResult {\n if (result.success) {\n const transportDeviceModel = mapNativeLedgerDeviceToDeviceModel(\n result.ledgerDevice,\n deviceModelDataSource,\n );\n if (!transportDeviceModel)\n return Left(\n new OpeningConnectionError(\n `Could not find device model for the connected device with usbProductIdMask: ${result.ledgerDevice.usbProductIdMask}`,\n ),\n );\n return Right({ sessionId: result.sessionId, transportDeviceModel });\n } else {\n return Left(new OpeningConnectionError(result.error));\n }\n}\n\nexport function mapNativeSendApduResultToSendApduResult(\n result: NativeSendApduResult,\n): SendApduResult {\n if (result.success) {\n const responseBytes = base64ToUint8Array(result.apdu);\n const data = FramerUtils.getFirstBytesFrom(\n responseBytes,\n responseBytes.length - 2,\n );\n const statusCode = FramerUtils.getLastBytesFrom(responseBytes, 2);\n return Right(new ApduResponse({ data, statusCode }));\n } else
|
|
5
|
-
"mappings": "AAAA,OACE,gBAAAA,EACA,uCAAAC,EAEA,eAAAC,EACA,YAAAC,EAEA,0BAAAC,EACA,8BAAAC,EAEA,wBAAAC,MAGK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAE5B,OAAS,sBAAAC,MAA0B,2BACnC,OAAS,oCAAAC,MAAwC,wBACjD,OAAS,wBAAAC,MAA4B,0CAe9B,SAASC,EACdC,EACAC,EAC6B,CAC7B,OACEA,EAAsB,mBAAmB,CACvC,aAAc,OAAO,SAASD,EAAmB,iBAAkB,EAAE,CACvE,CAAC,EAAE,CAAC,GAAK,IAEb,CAEO,SAASE,EACdC,EACAF,EACkC,CAClC,MAAMG,EAAcL,EAClBI,EAAa,aACbF,CACF,EACA,OAAIG,GAAe,KAAa,KAEzB,CACL,GAAID,EAAa,IACjB,YAAAC,EACA,UAAWN,EACX,KAAMK,EAAa,IACrB,CACF,CAEO,SAASE,EAA2BC,EAA2B,CACpE,IAAIC,EACJ,OAAQD,EAAI,MAAO,CACjB,IAAK,QACHC,EAAQjB,EAAS,MACjB,MACF,IAAK,UACHiB,EAAQjB,EAAS,QACjB,MACF,IAAK,OACHiB,EAAQjB,EAAS,KACjB,MACF,IAAK,QACHiB,EAAQjB,EAAS,MACjB,MACF,QACEkB,EAAYF,EAAI,KAAK,EACrBC,EAAQjB,EAAS,KACjB,KACJ,CAEA,MAAO,CACLiB,EACAD,EAAI,QACJ,CACE,IAAKA,EAAI,IACT,KAAMA,EAAI,YACV,UAAW,OAAO,SAASA,EAAI,UAAW,EAAE,CAC9C,CACF,CACF,CAEA,SAASE,EAAYC,EAAU,CAC7B,MAAM,IAAI,MAAM,sBAAwBA,CAAC,CAC3C,CAEO,SAASC,EACdC,EACAV,EAC0B,CAC1B,GAAIU,EAAO,QAAS,CAClB,MAAMC,EAAuBb,EAC3BY,EAAO,aACPV,CACF,EACA,OAAKW,EAMEjB,EAAM,CAAE,UAAWgB,EAAO,UAAW,qBAAAC,CAAqB,CAAC,EALzDlB,EACL,IAAIH,EACF,+EAA+EoB,EAAO,aAAa,gBAAgB,EACrH,CACF,CAEJ,KACE,QAAOjB,EAAK,IAAIH,EAAuBoB,EAAO,KAAK,CAAC,CAExD,CAEO,SAASE,EACdF,EACgB,CAChB,GAAIA,EAAO,QAAS,CAClB,MAAMG,EAAgBlB,EAAmBe,EAAO,IAAI,EAC9CI,EAAO1B,EAAY,kBACvByB,EACAA,EAAc,OAAS,CACzB,EACME,EAAa3B,EAAY,iBAAiByB,EAAe,CAAC,EAChE,OAAOnB,EAAM,
|
|
6
|
-
"names": ["ApduResponse", "DeviceDisconnectedWhileSendingError", "FramerUtils", "LogLevel", "OpeningConnectionError", "SendApduEmptyResponseError", "SendApduTimeoutError", "Left", "Right", "base64ToUint8Array", "HidTransportSendApduUnknownError", "TRANSPORT_IDENTIFIER", "mapNativeLedgerDeviceToDeviceModel", "nativeLedgerDevice", "deviceModelDataSource", "mapNativeDiscoveryDeviceToTransportDiscoveredDevice", "nativeDevice", "deviceModel", "mapNativeTransportLogToLog", "log", "level", "assertNever", "x", "mapNativeConnectionResultToConnectionResult", "result", "transportDeviceModel", "mapNativeSendApduResultToSendApduResult", "responseBytes", "data", "statusCode", "mapNativeDeviceConnectionLostToDeviceDisconnected", "nativeDeviceConnectionLost"]
|
|
4
|
+
"sourcesContent": ["import {\n ApduResponse,\n DeviceDisconnectedBeforeSendingApdu,\n DeviceDisconnectedWhileSendingError,\n type DeviceModelDataSource,\n FramerUtils,\n LogLevel,\n type LogParams,\n OpeningConnectionError,\n SendApduEmptyResponseError,\n type SendApduResult,\n SendApduTimeoutError,\n type TransportDeviceModel,\n type TransportDiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { base64ToUint8Array } from \"@api/helpers/base64Utils\";\nimport { HidTransportSendApduUnknownError } from \"@api/transport/Errors\";\nimport { TRANSPORT_IDENTIFIER } from \"@api/transport/rnHidTransportIdentifier\";\nimport {\n type InternalConnectionResult,\n type InternalDeviceDisconnected,\n} from \"@api/transport/types\";\n\nimport {\n type NativeDeviceConnectionLost,\n type NativeDiscoveryDevice,\n type NativeInternalConnectionResult,\n type NativeLedgerDevice,\n type NativeLog,\n type NativeSendApduResult,\n} from \"./types\";\n\nexport function mapNativeLedgerDeviceToDeviceModel(\n nativeLedgerDevice: NativeLedgerDevice,\n deviceModelDataSource: DeviceModelDataSource,\n): TransportDeviceModel | null {\n return (\n deviceModelDataSource.filterDeviceModels({\n usbProductId: Number.parseInt(nativeLedgerDevice.usbProductIdMask, 16),\n })[0] ?? null\n );\n}\n\nexport function mapNativeDiscoveryDeviceToTransportDiscoveredDevice(\n nativeDevice: NativeDiscoveryDevice,\n deviceModelDataSource: DeviceModelDataSource,\n): TransportDiscoveredDevice | null {\n const deviceModel = mapNativeLedgerDeviceToDeviceModel(\n nativeDevice.ledgerDevice,\n deviceModelDataSource,\n );\n if (deviceModel == null) return null;\n\n return {\n id: nativeDevice.uid,\n deviceModel,\n transport: TRANSPORT_IDENTIFIER,\n name: nativeDevice.name,\n };\n}\n\nexport function mapNativeTransportLogToLog(log: NativeLog): LogParams {\n let level: LogLevel;\n switch (log.level) {\n case \"error\":\n level = LogLevel.Error;\n break;\n case \"warning\":\n level = LogLevel.Warning;\n break;\n case \"info\":\n level = LogLevel.Info;\n break;\n case \"debug\":\n level = LogLevel.Debug;\n break;\n default:\n assertNever(log.level);\n level = LogLevel.Info;\n break;\n }\n\n return [\n level,\n log.message,\n {\n tag: log.tag,\n data: log.jsonPayload,\n timestamp: Number.parseInt(log.timestamp, 10),\n },\n ];\n}\n\nfunction assertNever(x: never) {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function mapNativeConnectionResultToConnectionResult(\n result: NativeInternalConnectionResult,\n deviceModelDataSource: DeviceModelDataSource,\n): InternalConnectionResult {\n if (result.success) {\n const transportDeviceModel = mapNativeLedgerDeviceToDeviceModel(\n result.ledgerDevice,\n deviceModelDataSource,\n );\n if (!transportDeviceModel)\n return Left(\n new OpeningConnectionError(\n `Could not find device model for the connected device with usbProductIdMask: ${result.ledgerDevice.usbProductIdMask}`,\n ),\n );\n return Right({ sessionId: result.sessionId, transportDeviceModel });\n } else {\n return Left(new OpeningConnectionError(result.error));\n }\n}\n\nexport function mapNativeSendApduResultToSendApduResult(\n result: NativeSendApduResult,\n): SendApduResult {\n if (result.success) {\n const responseBytes = base64ToUint8Array(result.apdu);\n const data = FramerUtils.getFirstBytesFrom(\n responseBytes,\n responseBytes.length - 2,\n );\n const statusCode = FramerUtils.getLastBytesFrom(responseBytes, 2);\n return Right(new ApduResponse({ data, statusCode }));\n } else {\n switch (result.error) {\n case \"SendApduTimeout\":\n return Left(new SendApduTimeoutError(\"Abort timeout\"));\n case \"EmptyResponse\":\n return Left(new SendApduEmptyResponseError(\"Empty response\"));\n case \"DeviceDisconnected\":\n return Left(\n new DeviceDisconnectedWhileSendingError(\"Device disconnected\"),\n );\n case \"DeviceNotFound\":\n case \"NoUsbEndpointFound\":\n return Left(new DeviceDisconnectedBeforeSendingApdu());\n default:\n return Left(new HidTransportSendApduUnknownError(result.error));\n }\n }\n}\n\nexport function mapNativeDeviceConnectionLostToDeviceDisconnected(\n nativeDeviceConnectionLost: NativeDeviceConnectionLost,\n): InternalDeviceDisconnected {\n return {\n sessionId: nativeDeviceConnectionLost.id,\n };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,gBAAAA,EACA,uCAAAC,EACA,uCAAAC,EAEA,eAAAC,EACA,YAAAC,EAEA,0BAAAC,EACA,8BAAAC,EAEA,wBAAAC,MAGK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAE5B,OAAS,sBAAAC,MAA0B,2BACnC,OAAS,oCAAAC,MAAwC,wBACjD,OAAS,wBAAAC,MAA4B,0CAe9B,SAASC,EACdC,EACAC,EAC6B,CAC7B,OACEA,EAAsB,mBAAmB,CACvC,aAAc,OAAO,SAASD,EAAmB,iBAAkB,EAAE,CACvE,CAAC,EAAE,CAAC,GAAK,IAEb,CAEO,SAASE,EACdC,EACAF,EACkC,CAClC,MAAMG,EAAcL,EAClBI,EAAa,aACbF,CACF,EACA,OAAIG,GAAe,KAAa,KAEzB,CACL,GAAID,EAAa,IACjB,YAAAC,EACA,UAAWN,EACX,KAAMK,EAAa,IACrB,CACF,CAEO,SAASE,EAA2BC,EAA2B,CACpE,IAAIC,EACJ,OAAQD,EAAI,MAAO,CACjB,IAAK,QACHC,EAAQjB,EAAS,MACjB,MACF,IAAK,UACHiB,EAAQjB,EAAS,QACjB,MACF,IAAK,OACHiB,EAAQjB,EAAS,KACjB,MACF,IAAK,QACHiB,EAAQjB,EAAS,MACjB,MACF,QACEkB,EAAYF,EAAI,KAAK,EACrBC,EAAQjB,EAAS,KACjB,KACJ,CAEA,MAAO,CACLiB,EACAD,EAAI,QACJ,CACE,IAAKA,EAAI,IACT,KAAMA,EAAI,YACV,UAAW,OAAO,SAASA,EAAI,UAAW,EAAE,CAC9C,CACF,CACF,CAEA,SAASE,EAAYC,EAAU,CAC7B,MAAM,IAAI,MAAM,sBAAwBA,CAAC,CAC3C,CAEO,SAASC,EACdC,EACAV,EAC0B,CAC1B,GAAIU,EAAO,QAAS,CAClB,MAAMC,EAAuBb,EAC3BY,EAAO,aACPV,CACF,EACA,OAAKW,EAMEjB,EAAM,CAAE,UAAWgB,EAAO,UAAW,qBAAAC,CAAqB,CAAC,EALzDlB,EACL,IAAIH,EACF,+EAA+EoB,EAAO,aAAa,gBAAgB,EACrH,CACF,CAEJ,KACE,QAAOjB,EAAK,IAAIH,EAAuBoB,EAAO,KAAK,CAAC,CAExD,CAEO,SAASE,EACdF,EACgB,CAChB,GAAIA,EAAO,QAAS,CAClB,MAAMG,EAAgBlB,EAAmBe,EAAO,IAAI,EAC9CI,EAAO1B,EAAY,kBACvByB,EACAA,EAAc,OAAS,CACzB,EACME,EAAa3B,EAAY,iBAAiByB,EAAe,CAAC,EAChE,OAAOnB,EAAM,IAAIT,EAAa,CAAE,KAAA6B,EAAM,WAAAC,CAAW,CAAC,CAAC,CACrD,KACE,QAAQL,EAAO,MAAO,CACpB,IAAK,kBACH,OAAOjB,EAAK,IAAID,EAAqB,eAAe,CAAC,EACvD,IAAK,gBACH,OAAOC,EAAK,IAAIF,EAA2B,gBAAgB,CAAC,EAC9D,IAAK,qBACH,OAAOE,EACL,IAAIN,EAAoC,qBAAqB,CAC/D,EACF,IAAK,iBACL,IAAK,qBACH,OAAOM,EAAK,IAAIP,CAAqC,EACvD,QACE,OAAOO,EAAK,IAAIG,EAAiCc,EAAO,KAAK,CAAC,CAClE,CAEJ,CAEO,SAASM,EACdC,EAC4B,CAC5B,MAAO,CACL,UAAWA,EAA2B,EACxC,CACF",
|
|
6
|
+
"names": ["ApduResponse", "DeviceDisconnectedBeforeSendingApdu", "DeviceDisconnectedWhileSendingError", "FramerUtils", "LogLevel", "OpeningConnectionError", "SendApduEmptyResponseError", "SendApduTimeoutError", "Left", "Right", "base64ToUint8Array", "HidTransportSendApduUnknownError", "TRANSPORT_IDENTIFIER", "mapNativeLedgerDeviceToDeviceModel", "nativeLedgerDevice", "deviceModelDataSource", "mapNativeDiscoveryDeviceToTransportDiscoveredDevice", "nativeDevice", "deviceModel", "mapNativeTransportLogToLog", "log", "level", "assertNever", "x", "mapNativeConnectionResultToConnectionResult", "result", "transportDeviceModel", "mapNativeSendApduResultToSendApduResult", "responseBytes", "data", "statusCode", "mapNativeDeviceConnectionLostToDeviceDisconnected", "nativeDeviceConnectionLost"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as
|
|
1
|
+
import{ApduResponse as m,DeviceDisconnectedBeforeSendingApdu as c,DeviceModelId as a,LogLevel as d,OpeningConnectionError as r,SendApduEmptyResponseError as g,SendApduTimeoutError as D,StaticDeviceModelDataSource as N}from"@ledgerhq/device-management-kit";import{Left as n,Right as u}from"purify-ts";import{HidTransportSendApduUnknownError as l}from"../transport/Errors";import{TRANSPORT_IDENTIFIER as S}from"../transport/rnHidTransportIdentifier";import{mapNativeConnectionResultToConnectionResult as A,mapNativeDeviceConnectionLostToDeviceDisconnected as R,mapNativeDiscoveryDeviceToTransportDiscoveredDevice as v,mapNativeLedgerDeviceToDeviceModel as x,mapNativeSendApduResultToSendApduResult as i,mapNativeTransportLogToLog as y}from"./mapper";describe("mapper",()=>{const o=new N;describe("mapNativeLedgerDeviceToDeviceModel",()=>{[{nativeLedgerDevice:{name:"NanoS",usbProductIdMask:"0x10"},deviceModel:o.getDeviceModel({id:a.NANO_S})},{nativeLedgerDevice:{name:"NanoX",usbProductIdMask:"0x40"},deviceModel:o.getDeviceModel({id:a.NANO_X})},{nativeLedgerDevice:{name:"NanoSPlus",usbProductIdMask:"0x50"},deviceModel:o.getDeviceModel({id:a.NANO_SP})},{nativeLedgerDevice:{name:"Stax",usbProductIdMask:"0x60"},deviceModel:o.getDeviceModel({id:a.STAX})},{nativeLedgerDevice:{name:"Flex",usbProductIdMask:"0x70"},deviceModel:o.getDeviceModel({id:a.FLEX})},{nativeLedgerDevice:{name:"NanoX",usbProductIdMask:"0x12345678"},deviceModel:null}].forEach(({nativeLedgerDevice:e,deviceModel:s})=>{it(`should map USB device with usbProductIdMask ${e.usbProductIdMask} to ${s?.productName??"null"}`,()=>{expect(x(e,o)).toEqual(s)})})}),describe("mapNativeDiscoveryDeviceToTransportDiscoveredDevice",()=>{it("should map NativeDiscoveryDevice to TransportDiscoveredDevice",()=>{const t={name:"NanoS",uid:"abcd",ledgerDevice:{name:"NanoS",usbProductIdMask:"0x10"}},e={id:"abcd",deviceModel:o.getDeviceModel({id:a.NANO_S}),transport:S,name:"NanoS"};expect(v(t,o)).toEqual(e)}),it("should return null if the device model is not recognized",()=>{const t={name:"NanoX",uid:"efgh",ledgerDevice:{name:"NanoX",usbProductIdMask:"0x4567890"}};expect(v(t,o)).toEqual(null)})}),describe("mapNativeTransportLogToLog",()=>{[{nativeLog:{level:"debug",tag:"tag",message:"debug message",jsonPayload:{key:"value"},timestamp:"123456789"},log:[d.Debug,"debug message",{timestamp:123456789,tag:"tag",data:{key:"value"}}]},{nativeLog:{level:"info",tag:"tag",message:"info message",jsonPayload:{key:"value"},timestamp:"123456789"},log:[d.Info,"info message",{timestamp:123456789,tag:"tag",data:{key:"value"}}]},{nativeLog:{level:"error",tag:"tag",message:"error message",jsonPayload:{key:"value"},timestamp:"123456789"},log:[d.Error,"error message",{timestamp:123456789,tag:"tag",data:{key:"value"}}]},{nativeLog:{level:"warning",tag:"tag",message:"warning message",jsonPayload:{key:"value"},timestamp:"123456789"},log:[d.Warning,"warning message",{timestamp:123456789,tag:"tag",data:{key:"value"}}]}].forEach(({nativeLog:e,log:s})=>{it(`should map NativeLog with level "${e.level}" to Log`,()=>{expect(y(e)).toEqual(s)})})}),describe("mapNativeConnectionResultToConnectionResult",()=>{[{testTitle:"Success",nativeConnectionResult:{success:!0,sessionId:"1234",ledgerDevice:{name:"NanoS",usbProductIdMask:"0x10"},deviceName:"NanoS"},connectionResult:u({sessionId:"1234",transportDeviceModel:o.getDeviceModel({id:a.NANO_S})})},{testTitle:"Failure",nativeConnectionResult:{success:!1,error:"error message"},connectionResult:n(new r("error message"))},{testTitle:"Unknown device model",nativeConnectionResult:{success:!0,sessionId:"1234",ledgerDevice:{name:"NanoX",usbProductIdMask:"0x12345678"},deviceName:"NanoX"},connectionResult:n(new r("Could not find device model for the connected device with usbProductIdMask: 0x12345678"))}].forEach(({testTitle:e,nativeConnectionResult:s,connectionResult:p})=>{it(e,()=>{expect(A(s,o)).toEqual(p)})})}),describe("mapNativeSendApduResultToSendApduResult",()=>{test("success",()=>{const e={success:!0,apdu:"AQIDkAA="},s=u(new m({data:new Uint8Array([1,2,3]),statusCode:new Uint8Array([144,0])}));expect(i(e)).toEqual(s)}),test("failure",()=>{const t={success:!1,error:"error message"},e=n(new l("error message"));expect(i(t)).toEqual(e)}),test("timeout error",()=>{const t={success:!1,error:"SendApduTimeout"},e=n(new D("Abort timeout"));expect(i(t)).toEqual(e)}),test("empty response error",()=>{const t={success:!1,error:"EmptyResponse"},e=n(new g("Empty response"));expect(i(t)).toEqual(e)}),test("device not found error",()=>{const t={success:!1,error:"DeviceNotFound"},e=n(new c);expect(i(t)).toEqual(e)}),test("no usb endpoint found error",()=>{const t={success:!1,error:"NoUsbEndpointFound"},e=n(new c);expect(i(t)).toEqual(e)}),test("unknown error",()=>{const t={success:!1,error:"unknown error"},e=n(new l("unknown error"));expect(i(t)).toEqual(e)})}),describe("mapNativeDeviceConnectionLostToDeviceDisconnected",()=>{it("should map NativeDeviceConnectionLost to DeviceDisconnected",()=>{const t={id:"1234"},e={sessionId:"1234"};expect(R(t)).toEqual(e)})})});
|
|
2
2
|
//# sourceMappingURL=mapper.test.js.map
|