@ledgerhq/react-native-hw-transport-ble 6.31.0 → 6.32.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,8 +7,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
+ import { TransportExchangeTimeoutError } from "@ledgerhq/errors";
10
11
  import BleTransport from "../src/BleTransport";
11
- import { Subscription } from "rxjs";
12
+ import { Subscription, VirtualTimeScheduler } from "rxjs";
13
+ let mockNoResponseFromDevice = false;
14
+ const mockCancelTransaction = jest.fn();
15
+ let mockNegotiatedMtu;
12
16
  /**
13
17
  * It is essential to mock the BLE component of a BLE transport to verify
14
18
  * the reliability of the connect/reconnect/disconnect logic, which is decoupled
@@ -132,6 +136,12 @@ jest.mock("react-native-ble-plx", () => {
132
136
  serviceUUID: "13d63400-2c97-6004-0000-4c6564676572",
133
137
  serviceID: 105553179758272,
134
138
  writeWithoutResponse: (raw) => __awaiter(this, void 0, void 0, function* () {
139
+ // No response are sent back from the device (using `onDeviceResponse`)
140
+ // Imitates the case where the device is still connected but does not responds
141
+ // when saving the newly confirmed seed.
142
+ if (mockNoResponseFromDevice) {
143
+ return;
144
+ }
135
145
  if (!dynamicProps.isConnected)
136
146
  throw new BleError(22, "Device is not connected");
137
147
  const hex = Buffer.from(raw, "base64").toString("hex");
@@ -139,7 +149,7 @@ jest.mock("react-native-ble-plx", () => {
139
149
  switch (hex) {
140
150
  // MTU handshake
141
151
  case "0800000000":
142
- value = Buffer.from("080000000199", "hex");
152
+ value = mockNegotiatedMtu;
143
153
  break;
144
154
  // getAppAndVersion - returning BOLOS on 1.0.0-rc9
145
155
  case "0500000005b010000000":
@@ -168,12 +178,19 @@ jest.mock("react-native-ble-plx", () => {
168
178
  },
169
179
  };
170
180
  },
181
+ cancelTransaction: mockCancelTransaction,
171
182
  };
172
183
  },
173
184
  };
174
185
  });
175
186
  describe("BleTransport connectivity test coverage", () => {
176
187
  const deviceId = "20EDD96F-7430-6E33-AB22-DD8AAB857CD4";
188
+ beforeEach(() => {
189
+ mockNoResponseFromDevice = false;
190
+ // MTU of 153 bytes
191
+ mockNegotiatedMtu = Buffer.from("080000000099", "hex");
192
+ mockCancelTransaction.mockClear();
193
+ });
177
194
  describe("Device available and already paired", () => {
178
195
  it("should find the device, connect, negotiate MTU", () => __awaiter(void 0, void 0, void 0, function* () {
179
196
  const transport = yield BleTransport.open(deviceId);
@@ -181,7 +198,7 @@ describe("BleTransport connectivity test coverage", () => {
181
198
  }));
182
199
  it("should be disconnectable, and cleanup", () => __awaiter(void 0, void 0, void 0, function* () {
183
200
  const transport = yield BleTransport.open(deviceId);
184
- yield BleTransport.disconnect(deviceId);
201
+ yield BleTransport.disconnectDevice(deviceId);
185
202
  expect(transport.isConnected).toBe(false);
186
203
  }));
187
204
  it("should disconnect in 500ms (5s default) after calling close", () => __awaiter(void 0, void 0, void 0, function* () {
@@ -222,21 +239,92 @@ describe("BleTransport connectivity test coverage", () => {
222
239
  // Nb due to the different environments, the timeout behaves differently here
223
240
  // and I can't check against a number for it to be cleared or not.
224
241
  expect(transport.disconnectTimeout._destroyed).toBe(false);
225
- yield BleTransport.disconnect(deviceId);
242
+ yield BleTransport.disconnectDevice(deviceId);
226
243
  expect(transport.disconnectTimeout._destroyed).toBe(true);
227
244
  }));
228
- it("should handle exchanges if all goes well", () => __awaiter(void 0, void 0, void 0, function* () {
229
- const transport = yield BleTransport.open(deviceId);
230
- expect(transport.isConnected).toBe(true);
231
- const response = yield transport.exchange(Buffer.from("b010000000", "hex"));
232
- expect(response.toString("hex")).toBe("0105424f4c4f5309312e302e302d7263399000");
233
- }));
234
- it("should throw on exchanges if disconnected", () => __awaiter(void 0, void 0, void 0, function* () {
235
- const transport = yield BleTransport.open(deviceId);
236
- expect(transport.isConnected).toBe(true);
237
- yield BleTransport.disconnect(deviceId);
238
- yield expect(transport.exchange(Buffer.from("b010000000", "hex"))).rejects.toThrow(); // More specific errors some day.
239
- }));
245
+ describe("When the message to exchange fits in 1 frame", () => {
246
+ it("should handle exchanges if all goes well", () => __awaiter(void 0, void 0, void 0, function* () {
247
+ const transport = yield BleTransport.open(deviceId);
248
+ expect(transport.isConnected).toBe(true);
249
+ const response = yield transport.exchange(Buffer.from("b010000000", "hex"));
250
+ expect(response.toString("hex")).toBe("0105424f4c4f5309312e302e302d7263399000");
251
+ }));
252
+ it("should throw on exchanges if disconnected", () => __awaiter(void 0, void 0, void 0, function* () {
253
+ const transport = yield BleTransport.open(deviceId);
254
+ expect(transport.isConnected).toBe(true);
255
+ yield BleTransport.disconnectDevice(deviceId);
256
+ yield expect(transport.exchange(Buffer.from("b010000000", "hex"))).rejects.toThrow(); // More specific errors some day.
257
+ }));
258
+ describe("And when an abort timeout is set", () => {
259
+ const abortTimeoutMs = 1000;
260
+ it("should throw an error and cancel the transaction if the abort timeout was reached", done => {
261
+ const rxjsScheduler = new VirtualTimeScheduler();
262
+ function asyncFn() {
263
+ return __awaiter(this, void 0, void 0, function* () {
264
+ const transport = yield BleTransport.open(deviceId);
265
+ expect(transport.isConnected).toBe(true);
266
+ // Once we got the transport (MTU exchanged), we stop the communication
267
+ mockNoResponseFromDevice = true;
268
+ transport
269
+ .exchange(Buffer.from("b010000000", "hex"), { abortTimeoutMs })
270
+ .then(() => {
271
+ done("It should not succeed");
272
+ })
273
+ .catch(error => {
274
+ expect(error).toBeInstanceOf(TransportExchangeTimeoutError);
275
+ expect(mockCancelTransaction).toHaveBeenCalledTimes(1);
276
+ done();
277
+ });
278
+ rxjsScheduler.flush();
279
+ });
280
+ }
281
+ asyncFn();
282
+ });
283
+ });
284
+ });
285
+ // Multi-frames message response is not handled by our current mocked react-native-ble-plx
286
+ // The logic of encoding a message into several frames is tested directly with unit tests on ledgerhq/devices/lib/ble/sendAPDU
287
+ describe("When the message to exchange needs more than 1 frame", () => {
288
+ beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
289
+ // Triggering a disconnection and clearing the transport cache
290
+ yield BleTransport.disconnectDevice(deviceId);
291
+ // MTU of 25 bytes
292
+ mockNegotiatedMtu = Buffer.from("080000000019", "hex");
293
+ }));
294
+ afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
295
+ // Triggering a disconnection and clearing the transport cache
296
+ yield BleTransport.disconnectDevice(deviceId);
297
+ }));
298
+ describe("And when an abort timeout is set", () => {
299
+ const abortTimeoutMs = 1000;
300
+ it("should throw an error and cancel the transactions of all operations if the abort timeout was reached", done => {
301
+ const rxjsScheduler = new VirtualTimeScheduler();
302
+ function asyncFn() {
303
+ return __awaiter(this, void 0, void 0, function* () {
304
+ const transport = yield BleTransport.open(deviceId);
305
+ expect(transport.isConnected).toBe(true);
306
+ // Once we got the transport (MTU exchanged), we stop the communication
307
+ mockNoResponseFromDevice = true;
308
+ // Imaginary APDU that will create an encoded message longer than MTU = 25 bytes
309
+ transport
310
+ .exchange(Buffer.from("b010000000b010000000b010000000b010000000b010000000", "hex"), {
311
+ abortTimeoutMs,
312
+ })
313
+ .then(() => {
314
+ done("It should not succeed");
315
+ })
316
+ .catch(error => {
317
+ expect(error).toBeInstanceOf(TransportExchangeTimeoutError);
318
+ expect(mockCancelTransaction).toHaveBeenCalledTimes(2);
319
+ done();
320
+ });
321
+ rxjsScheduler.flush();
322
+ });
323
+ }
324
+ asyncFn();
325
+ });
326
+ });
327
+ });
240
328
  it("should disconnect if close is called, even if pending response", done => {
241
329
  // This is actually a very important test, if we have an ongoing apdu response,
242
330
  // as in, the device never replied, but we expressed the intention of disconnecting
@@ -1 +1 @@
1
- {"version":3,"file":"BleTransport.test.js","sourceRoot":"","sources":["../src/BleTransport.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BleTransport.test.js","sourceRoot":"","sources":["../src/BleTransport.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  import { HwTransportError, HwTransportErrorType } from "@ledgerhq/errors";
2
2
  import { BleError, BleErrorCode } from "react-native-ble-plx";
3
- type IOBleErrorRemap = Error | BleError | null | undefined;
3
+ export type IOBleErrorRemap = Error | BleError | null | undefined;
4
4
  export declare const remapError: (error: IOBleErrorRemap) => IOBleErrorRemap;
5
5
  export declare const rethrowError: (e: Error | null | undefined) => never;
6
6
  export declare const decoratePromiseErrors: <A>(promise: Promise<A>) => Promise<A>;
7
7
  export declare const bleErrorToHwTransportError: Map<BleErrorCode, HwTransportErrorType>;
8
8
  export declare const mapBleErrorToHwTransportError: (bleError: BleError) => HwTransportError;
9
- export {};
10
9
  //# sourceMappingURL=remapErrors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"remapErrors.d.ts","sourceRoot":"","sources":["../src/remapErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAmB,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/E,KAAK,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;AAC3D,eAAO,MAAM,UAAU,UAAW,eAAe,KAAG,eAqBnD,CAAC;AAEF,eAAO,MAAM,YAAY,MAAO,KAAK,GAAG,IAAI,GAAG,SAAS,KAAG,KAE1D,CAAC;AAEF,eAAO,MAAM,qBAAqB,wCACL,CAAC;AAE9B,eAAO,MAAM,0BAA0B,yCAQrC,CAAC;AAEH,eAAO,MAAM,6BAA6B,aAAc,QAAQ,KAAG,gBAOlE,CAAC"}
1
+ {"version":3,"file":"remapErrors.d.ts","sourceRoot":"","sources":["../src/remapErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAmB,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/E,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;AAElE,eAAO,MAAM,UAAU,UAAW,eAAe,KAAG,eAqBnD,CAAC;AAEF,eAAO,MAAM,YAAY,MAAO,KAAK,GAAG,IAAI,GAAG,SAAS,KAAG,KAE1D,CAAC;AAEF,eAAO,MAAM,qBAAqB,wCACL,CAAC;AAE9B,eAAO,MAAM,0BAA0B,yCAQrC,CAAC;AAEH,eAAO,MAAM,6BAA6B,aAAc,QAAQ,KAAG,gBAOlE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"remapErrors.js","sourceRoot":"","sources":["../src/remapErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG/E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAsB,EAAmB,EAAE;IACpE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3C,IAAI,KAAK,YAAY,QAAQ,EAAE;QAC7B,IACE,KAAK,CAAC,YAAY,KAAK,eAAe,CAAC,aAAa;YACpD,KAAK,CAAC,MAAM,KAAK,kCAAkC,EACnD;YACA,OAAO,IAAI,kBAAkB,EAAE,CAAC;YAChC,6DAA6D;YAC7D,iFAAiF;SAClF;aAAM,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,YAAY,MAAK,EAAE,EAAE;YACrC,OAAO,IAAI,aAAa,EAAE,CAAC;SAC5B;KACF;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrF,OAAO,IAAI,kBAAkB,EAAE,CAAC;KACjC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAA2B,EAAS,EAAE;IACjE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAI,OAAmB,EAAc,EAAE,CAC1E,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IAChD,CAAC,YAAY,CAAC,eAAe,EAAE,oBAAoB,CAAC,wBAAwB,CAAC;IAC7E,CAAC,YAAY,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,wBAAwB,CAAC;IACtF;QACE,kFAAkF;QAClF,YAAY,CAAC,qBAAqB;QAClC,oBAAoB,CAAC,4BAA4B;KAClD;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,QAAkB,EAAoB,EAAE;IACpF,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,OAAO,aAAa,QAAQ,CAAC,SAAS,EAAE,CAAC;IAErE,MAAM,WAAW,GAAG,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAEvE,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC"}
1
+ {"version":3,"file":"remapErrors.js","sourceRoot":"","sources":["../src/remapErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI/E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAsB,EAAmB,EAAE;IACpE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3C,IAAI,KAAK,YAAY,QAAQ,EAAE;QAC7B,IACE,KAAK,CAAC,YAAY,KAAK,eAAe,CAAC,aAAa;YACpD,KAAK,CAAC,MAAM,KAAK,kCAAkC,EACnD;YACA,OAAO,IAAI,kBAAkB,EAAE,CAAC;YAChC,6DAA6D;YAC7D,iFAAiF;SAClF;aAAM,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,YAAY,MAAK,EAAE,EAAE;YACrC,OAAO,IAAI,aAAa,EAAE,CAAC;SAC5B;KACF;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrF,OAAO,IAAI,kBAAkB,EAAE,CAAC;KACjC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAA2B,EAAS,EAAE;IACjE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAI,OAAmB,EAAc,EAAE,CAC1E,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IAChD,CAAC,YAAY,CAAC,eAAe,EAAE,oBAAoB,CAAC,wBAAwB,CAAC;IAC7E,CAAC,YAAY,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,wBAAwB,CAAC;IACtF;QACE,kFAAkF;QAClF,YAAY,CAAC,qBAAqB;QAClC,oBAAoB,CAAC,4BAA4B;KAClD;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,QAAkB,EAAoB,EAAE;IACpF,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,OAAO,aAAa,QAAQ,CAAC,SAAS,EAAE,CAAC;IAErE,MAAM,WAAW,GAAG,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAEvE,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/react-native-hw-transport-ble",
3
- "version": "6.31.0",
3
+ "version": "6.32.0-next.0",
4
4
  "description": "Ledger Hardware Wallet Bluetooth BLE transport for React Native",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -27,20 +27,22 @@
27
27
  "dependencies": {
28
28
  "react-native-ble-plx": "2.0.3",
29
29
  "rxjs": "^7.8.1",
30
- "@ledgerhq/devices": "^8.1.0",
31
- "@ledgerhq/errors": "^6.16.0",
32
- "@ledgerhq/hw-transport": "^6.30.0",
30
+ "uuid": "^9.0.1",
31
+ "@ledgerhq/devices": "^8.2.0-next.0",
32
+ "@ledgerhq/errors": "^6.16.1-next.0",
33
+ "@ledgerhq/hw-transport": "^6.30.1-next.0",
33
34
  "@ledgerhq/logs": "^6.12.0"
34
35
  },
35
36
  "gitHead": "dd0dea64b58e5a9125c8a422dcffd29e5ef6abec",
36
37
  "devDependencies": {
37
- "@types/jest": "^29.5.0",
38
+ "@types/jest": "^29.5.10",
38
39
  "@types/node": "^20.8.10",
40
+ "@types/uuid": "^9.0.5",
39
41
  "documentation": "14.0.2",
40
- "jest": "^28.1.1",
42
+ "jest": "^29.7.0",
41
43
  "rimraf": "^4.4.1",
42
44
  "source-map-support": "^0.5.21",
43
- "ts-jest": "^28.0.5",
45
+ "ts-jest": "^29.1.1",
44
46
  "ts-node": "^10.4.0"
45
47
  },
46
48
  "scripts": {
@@ -1,5 +1,10 @@
1
+ import { TransportExchangeTimeoutError } from "@ledgerhq/errors";
1
2
  import BleTransport from "../src/BleTransport";
2
- import { Subscription } from "rxjs";
3
+ import { Subscription, VirtualTimeScheduler } from "rxjs";
4
+
5
+ let mockNoResponseFromDevice = false;
6
+ const mockCancelTransaction = jest.fn();
7
+ let mockNegotiatedMtu: Buffer;
3
8
 
4
9
  /**
5
10
  * It is essential to mock the BLE component of a BLE transport to verify
@@ -12,7 +17,6 @@ import { Subscription } from "rxjs";
12
17
  * to cover test cases. It should be noted that this mock is not comprehensive
13
18
  * and may require further refinement to meet all requirements.
14
19
  */
15
-
16
20
  jest.mock("react-native-ble-plx", () => {
17
21
  class BleError {
18
22
  iosErrorCode: number;
@@ -134,6 +138,13 @@ jest.mock("react-native-ble-plx", () => {
134
138
  serviceUUID: "13d63400-2c97-6004-0000-4c6564676572",
135
139
  serviceID: 105553179758272,
136
140
  writeWithoutResponse: async raw => {
141
+ // No response are sent back from the device (using `onDeviceResponse`)
142
+ // Imitates the case where the device is still connected but does not responds
143
+ // when saving the newly confirmed seed.
144
+ if (mockNoResponseFromDevice) {
145
+ return;
146
+ }
147
+
137
148
  if (!dynamicProps.isConnected)
138
149
  throw new BleError(22, "Device is not connected");
139
150
 
@@ -143,7 +154,7 @@ jest.mock("react-native-ble-plx", () => {
143
154
  switch (hex) {
144
155
  // MTU handshake
145
156
  case "0800000000":
146
- value = Buffer.from("080000000199", "hex");
157
+ value = mockNegotiatedMtu;
147
158
  break;
148
159
  // getAppAndVersion - returning BOLOS on 1.0.0-rc9
149
160
  case "0500000005b010000000":
@@ -175,6 +186,7 @@ jest.mock("react-native-ble-plx", () => {
175
186
  },
176
187
  };
177
188
  },
189
+ cancelTransaction: mockCancelTransaction,
178
190
  };
179
191
  },
180
192
  };
@@ -183,6 +195,13 @@ jest.mock("react-native-ble-plx", () => {
183
195
  describe("BleTransport connectivity test coverage", () => {
184
196
  const deviceId = "20EDD96F-7430-6E33-AB22-DD8AAB857CD4";
185
197
 
198
+ beforeEach(() => {
199
+ mockNoResponseFromDevice = false;
200
+ // MTU of 153 bytes
201
+ mockNegotiatedMtu = Buffer.from("080000000099", "hex");
202
+ mockCancelTransaction.mockClear();
203
+ });
204
+
186
205
  describe("Device available and already paired", () => {
187
206
  it("should find the device, connect, negotiate MTU", async () => {
188
207
  const transport = await BleTransport.open(deviceId);
@@ -191,7 +210,7 @@ describe("BleTransport connectivity test coverage", () => {
191
210
 
192
211
  it("should be disconnectable, and cleanup", async () => {
193
212
  const transport = await BleTransport.open(deviceId);
194
- await BleTransport.disconnect(deviceId);
213
+ await BleTransport.disconnectDevice(deviceId);
195
214
  expect(transport.isConnected).toBe(false);
196
215
  });
197
216
 
@@ -243,23 +262,105 @@ describe("BleTransport connectivity test coverage", () => {
243
262
  // Nb due to the different environments, the timeout behaves differently here
244
263
  // and I can't check against a number for it to be cleared or not.
245
264
  expect((transport.disconnectTimeout as any)._destroyed).toBe(false);
246
- await BleTransport.disconnect(deviceId);
265
+ await BleTransport.disconnectDevice(deviceId);
247
266
  expect((transport.disconnectTimeout as any)._destroyed).toBe(true);
248
267
  });
249
268
 
250
- it("should handle exchanges if all goes well", async () => {
251
- const transport = await BleTransport.open(deviceId);
252
- expect(transport.isConnected).toBe(true);
269
+ describe("When the message to exchange fits in 1 frame", () => {
270
+ it("should handle exchanges if all goes well", async () => {
271
+ const transport = await BleTransport.open(deviceId);
272
+ expect(transport.isConnected).toBe(true);
253
273
 
254
- const response = await transport.exchange(Buffer.from("b010000000", "hex"));
255
- expect(response.toString("hex")).toBe("0105424f4c4f5309312e302e302d7263399000");
274
+ const response = await transport.exchange(Buffer.from("b010000000", "hex"));
275
+ expect(response.toString("hex")).toBe("0105424f4c4f5309312e302e302d7263399000");
276
+ });
277
+
278
+ it("should throw on exchanges if disconnected", async () => {
279
+ const transport = await BleTransport.open(deviceId);
280
+ expect(transport.isConnected).toBe(true);
281
+ await BleTransport.disconnectDevice(deviceId);
282
+ await expect(transport.exchange(Buffer.from("b010000000", "hex"))).rejects.toThrow(); // More specific errors some day.
283
+ });
284
+
285
+ describe("And when an abort timeout is set", () => {
286
+ const abortTimeoutMs = 1000;
287
+
288
+ it("should throw an error and cancel the transaction if the abort timeout was reached", done => {
289
+ const rxjsScheduler = new VirtualTimeScheduler();
290
+
291
+ async function asyncFn() {
292
+ const transport = await BleTransport.open(deviceId);
293
+ expect(transport.isConnected).toBe(true);
294
+ // Once we got the transport (MTU exchanged), we stop the communication
295
+ mockNoResponseFromDevice = true;
296
+
297
+ transport
298
+ .exchange(Buffer.from("b010000000", "hex"), { abortTimeoutMs })
299
+ .then(() => {
300
+ done("It should not succeed");
301
+ })
302
+ .catch(error => {
303
+ expect(error).toBeInstanceOf(TransportExchangeTimeoutError);
304
+ expect(mockCancelTransaction).toHaveBeenCalledTimes(1);
305
+ done();
306
+ });
307
+
308
+ rxjsScheduler.flush();
309
+ }
310
+
311
+ asyncFn();
312
+ });
313
+ });
256
314
  });
257
315
 
258
- it("should throw on exchanges if disconnected", async () => {
259
- const transport = await BleTransport.open(deviceId);
260
- expect(transport.isConnected).toBe(true);
261
- await BleTransport.disconnect(deviceId);
262
- await expect(transport.exchange(Buffer.from("b010000000", "hex"))).rejects.toThrow(); // More specific errors some day.
316
+ // Multi-frames message response is not handled by our current mocked react-native-ble-plx
317
+ // The logic of encoding a message into several frames is tested directly with unit tests on ledgerhq/devices/lib/ble/sendAPDU
318
+ describe("When the message to exchange needs more than 1 frame", () => {
319
+ beforeEach(async () => {
320
+ // Triggering a disconnection and clearing the transport cache
321
+ await BleTransport.disconnectDevice(deviceId);
322
+
323
+ // MTU of 25 bytes
324
+ mockNegotiatedMtu = Buffer.from("080000000019", "hex");
325
+ });
326
+
327
+ afterEach(async () => {
328
+ // Triggering a disconnection and clearing the transport cache
329
+ await BleTransport.disconnectDevice(deviceId);
330
+ });
331
+
332
+ describe("And when an abort timeout is set", () => {
333
+ const abortTimeoutMs = 1000;
334
+
335
+ it("should throw an error and cancel the transactions of all operations if the abort timeout was reached", done => {
336
+ const rxjsScheduler = new VirtualTimeScheduler();
337
+
338
+ async function asyncFn() {
339
+ const transport = await BleTransport.open(deviceId);
340
+ expect(transport.isConnected).toBe(true);
341
+ // Once we got the transport (MTU exchanged), we stop the communication
342
+ mockNoResponseFromDevice = true;
343
+
344
+ // Imaginary APDU that will create an encoded message longer than MTU = 25 bytes
345
+ transport
346
+ .exchange(Buffer.from("b010000000b010000000b010000000b010000000b010000000", "hex"), {
347
+ abortTimeoutMs,
348
+ })
349
+ .then(() => {
350
+ done("It should not succeed");
351
+ })
352
+ .catch(error => {
353
+ expect(error).toBeInstanceOf(TransportExchangeTimeoutError);
354
+ expect(mockCancelTransaction).toHaveBeenCalledTimes(2);
355
+ done();
356
+ });
357
+
358
+ rxjsScheduler.flush();
359
+ }
360
+
361
+ asyncFn();
362
+ });
363
+ });
263
364
  });
264
365
 
265
366
  it("should disconnect if close is called, even if pending response", done => {