@ledgerhq/live-common 26.0.0 → 26.1.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.
Files changed (101) hide show
  1. package/README.md +1 -1
  2. package/lib/ble/hooks/useBleDevicePairing.d.ts +18 -0
  3. package/lib/ble/hooks/useBleDevicePairing.d.ts.map +1 -0
  4. package/lib/ble/hooks/useBleDevicePairing.js +57 -0
  5. package/lib/ble/hooks/useBleDevicePairing.js.map +1 -0
  6. package/lib/ble/hooks/useBleDevicePairing.test.d.ts +2 -0
  7. package/lib/ble/hooks/useBleDevicePairing.test.d.ts.map +1 -0
  8. package/lib/ble/hooks/useBleDevicePairing.test.js +159 -0
  9. package/lib/ble/hooks/useBleDevicePairing.test.js.map +1 -0
  10. package/lib/ble/hooks/useBleDevicesScanning.d.ts +25 -0
  11. package/lib/ble/hooks/useBleDevicesScanning.d.ts.map +1 -0
  12. package/lib/ble/hooks/useBleDevicesScanning.js +117 -0
  13. package/lib/ble/hooks/useBleDevicesScanning.js.map +1 -0
  14. package/lib/ble/hooks/useBleDevicesScanning.test.d.ts +2 -0
  15. package/lib/ble/hooks/useBleDevicesScanning.test.d.ts.map +1 -0
  16. package/lib/ble/hooks/useBleDevicesScanning.test.js +281 -0
  17. package/lib/ble/hooks/useBleDevicesScanning.test.js.map +1 -0
  18. package/lib/ble/types.d.ts +21 -0
  19. package/lib/ble/types.d.ts.map +1 -0
  20. package/lib/ble/types.js +3 -0
  21. package/lib/ble/types.js.map +1 -0
  22. package/lib/families/cardano/js-estimateMaxSpendable.d.ts.map +1 -1
  23. package/lib/families/cardano/js-estimateMaxSpendable.js +2 -0
  24. package/lib/families/cardano/js-estimateMaxSpendable.js.map +1 -1
  25. package/lib/families/cosmos/specs.js +2 -2
  26. package/lib/families/cosmos/specs.js.map +1 -1
  27. package/lib/families/elrond/specs.js +1 -1
  28. package/lib/families/elrond/specs.js.map +1 -1
  29. package/lib/families/polkadot/bridge.integration.test.js +3 -3
  30. package/lib/families/polkadot/bridge.integration.test.js.map +1 -1
  31. package/lib/families/polkadot/specs.d.ts.map +1 -1
  32. package/lib/families/polkadot/specs.js +4 -3
  33. package/lib/families/polkadot/specs.js.map +1 -1
  34. package/lib/featureFlags/provider.d.ts +5 -1
  35. package/lib/featureFlags/provider.d.ts.map +1 -1
  36. package/lib/featureFlags/provider.js +6 -4
  37. package/lib/featureFlags/provider.js.map +1 -1
  38. package/lib/featureFlags/useFeature.d.ts.map +1 -1
  39. package/lib/featureFlags/useFeature.js +3 -1
  40. package/lib/featureFlags/useFeature.js.map +1 -1
  41. package/lib/generated/account.d.ts.map +1 -1
  42. package/lib/generated/account.js.map +1 -1
  43. package/lib/generated/bridge/js.d.ts.map +1 -1
  44. package/lib/generated/bridge/js.js.map +1 -1
  45. package/lib/generated/bridge/mock.d.ts.map +1 -1
  46. package/lib/generated/bridge/mock.js.map +1 -1
  47. package/lib/generated/cli-transaction.d.ts.map +1 -1
  48. package/lib/generated/cli-transaction.js.map +1 -1
  49. package/lib/generated/deviceTransactionConfig.d.ts.map +1 -1
  50. package/lib/generated/deviceTransactionConfig.js.map +1 -1
  51. package/lib/generated/exchange.d.ts.map +1 -1
  52. package/lib/generated/exchange.js.map +1 -1
  53. package/lib/generated/hw-getAddress.d.ts.map +1 -1
  54. package/lib/generated/hw-getAddress.js.map +1 -1
  55. package/lib/generated/hw-signMessage.d.ts.map +1 -1
  56. package/lib/generated/hw-signMessage.js.map +1 -1
  57. package/lib/generated/mock.d.ts.map +1 -1
  58. package/lib/generated/mock.js.map +1 -1
  59. package/lib/generated/platformAdapter.d.ts.map +1 -1
  60. package/lib/generated/platformAdapter.js.map +1 -1
  61. package/lib/generated/presync.d.ts.map +1 -1
  62. package/lib/generated/presync.js.map +1 -1
  63. package/lib/generated/specs.d.ts.map +1 -1
  64. package/lib/generated/specs.js.map +1 -1
  65. package/lib/generated/speculos-deviceActions.d.ts.map +1 -1
  66. package/lib/generated/speculos-deviceActions.js.map +1 -1
  67. package/lib/generated/transaction.d.ts.map +1 -1
  68. package/lib/generated/transaction.js.map +1 -1
  69. package/lib/generated/types.d.ts.map +1 -1
  70. package/lib/platform/react.d.ts.map +1 -1
  71. package/lib/platform/react.js +6 -3
  72. package/lib/platform/react.js.map +1 -1
  73. package/package.json +18 -18
  74. package/src/ble/hooks/useBleDevicePairing.test.ts +91 -0
  75. package/src/ble/hooks/useBleDevicePairing.ts +51 -0
  76. package/src/ble/hooks/useBleDevicesScanning.test.ts +252 -0
  77. package/src/ble/hooks/useBleDevicesScanning.ts +147 -0
  78. package/src/ble/types.ts +42 -0
  79. package/src/families/cardano/js-estimateMaxSpendable.ts +2 -0
  80. package/src/families/cosmos/specs.ts +2 -2
  81. package/src/families/elrond/specs.ts +1 -1
  82. package/src/families/polkadot/bridge.integration.test.ts +3 -3
  83. package/src/families/polkadot/specs.ts +4 -3
  84. package/src/featureFlags/provider.tsx +11 -1
  85. package/src/featureFlags/useFeature.ts +6 -2
  86. package/src/generated/account.ts +0 -8
  87. package/src/generated/bridge/js.ts +0 -18
  88. package/src/generated/bridge/mock.ts +0 -8
  89. package/src/generated/cli-transaction.ts +0 -17
  90. package/src/generated/deviceTransactionConfig.ts +15 -31
  91. package/src/generated/exchange.ts +0 -5
  92. package/src/generated/hw-getAddress.ts +0 -18
  93. package/src/generated/hw-signMessage.ts +0 -3
  94. package/src/generated/mock.ts +0 -3
  95. package/src/generated/platformAdapter.ts +0 -4
  96. package/src/generated/presync.ts +0 -1
  97. package/src/generated/specs.ts +0 -17
  98. package/src/generated/speculos-deviceActions.ts +0 -17
  99. package/src/generated/transaction.ts +0 -18
  100. package/src/generated/types.ts +7 -4
  101. package/src/platform/react.ts +7 -3
package/README.md CHANGED
@@ -79,6 +79,6 @@ This part of the repository is where you will add most of your code.
79
79
 
80
80
  For a smooth and quick integration:
81
81
  - See the developers’ documentation on the [Developer Portal](https://developers.ledger.com/docs/coin/general-process/) and
82
- - Go on Discord to chat with developer support and the developer community. See you there! If you are new to Ledger OP3N Discord server [click here](https://discord.gg/Ledger), otherwise directly join [the Blockchain channel](https://discord.com/channels/885256081289379850/907623688759803935).
82
+ - Go on [Discord](https://developers.ledger.com/discord-pro/) to chat with developer support and the developer community.
83
83
 
84
84
  ---
@@ -0,0 +1,18 @@
1
+ import { BleError } from "../types";
2
+ export declare type useBleDevicePairingArgs = {
3
+ deviceId: string;
4
+ };
5
+ export declare type PairingError = BleError | null;
6
+ export declare type useBleDevicePairingResult = {
7
+ isPaired: boolean;
8
+ pairingError: PairingError;
9
+ };
10
+ /**
11
+ * Triggers a BLE pairing with a device
12
+ * @param deviceId A BLE device id
13
+ * @returns An object containing:
14
+ * - isPaired: a boolean set to true if the device has been paired, false otherwise
15
+ * - pairingError: any PairingError that occurred, null otherwise
16
+ */
17
+ export declare const useBleDevicePairing: ({ deviceId, }: useBleDevicePairingArgs) => useBleDevicePairingResult;
18
+ //# sourceMappingURL=useBleDevicePairing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBleDevicePairing.d.ts","sourceRoot":"","sources":["../../../src/ble/hooks/useBleDevicePairing.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,oBAAY,uBAAuB,GAAG;IACpC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,oBAAY,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE3C,oBAAY,yBAAyB,GAAG;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,kBAE7B,uBAAuB,KAAG,yBAsB5B,CAAC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __read = (this && this.__read) || function (o, n) {
3
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
4
+ if (!m) return o;
5
+ var i = m.call(o), r, ar = [], e;
6
+ try {
7
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
+ }
9
+ catch (error) { e = { error: error }; }
10
+ finally {
11
+ try {
12
+ if (r && !r.done && (m = i["return"])) m.call(i);
13
+ }
14
+ finally { if (e) throw e.error; }
15
+ }
16
+ return ar;
17
+ };
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ exports.__esModule = true;
22
+ exports.useBleDevicePairing = void 0;
23
+ var react_1 = require("react");
24
+ var rxjs_1 = require("rxjs");
25
+ var operators_1 = require("rxjs/operators");
26
+ var deviceAccess_1 = require("../../hw/deviceAccess");
27
+ var getVersion_1 = __importDefault(require("../../hw/getVersion"));
28
+ /**
29
+ * Triggers a BLE pairing with a device
30
+ * @param deviceId A BLE device id
31
+ * @returns An object containing:
32
+ * - isPaired: a boolean set to true if the device has been paired, false otherwise
33
+ * - pairingError: any PairingError that occurred, null otherwise
34
+ */
35
+ var useBleDevicePairing = function (_a) {
36
+ var deviceId = _a.deviceId;
37
+ var _b = __read((0, react_1.useState)(false), 2), isPaired = _b[0], setIsPaired = _b[1];
38
+ var _c = __read((0, react_1.useState)(null), 2), pairingError = _c[0], setPairingError = _c[1];
39
+ (0, react_1.useEffect)(function () {
40
+ var requestObservable = (0, deviceAccess_1.withDevice)(deviceId)(function (t) {
41
+ return (0, rxjs_1.from)((0, getVersion_1["default"])(t));
42
+ }).pipe((0, operators_1.first)());
43
+ requestObservable.subscribe({
44
+ next: function (_value) {
45
+ setIsPaired(true);
46
+ setPairingError(null);
47
+ },
48
+ error: function (error) {
49
+ setIsPaired(false);
50
+ setPairingError(error);
51
+ }
52
+ });
53
+ }, [deviceId]);
54
+ return { isPaired: isPaired, pairingError: pairingError };
55
+ };
56
+ exports.useBleDevicePairing = useBleDevicePairing;
57
+ //# sourceMappingURL=useBleDevicePairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBleDevicePairing.js","sourceRoot":"","sources":["../../../src/ble/hooks/useBleDevicePairing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA4C;AAC5C,6BAA4B;AAC5B,4CAAuC;AAEvC,sDAAmD;AACnD,mEAA6C;AAc7C;;;;;;GAMG;AACI,IAAM,mBAAmB,GAAG,UAAC,EAEV;QADxB,QAAQ,cAAA;IAEF,IAAA,KAAA,OAA0B,IAAA,gBAAQ,EAAU,KAAK,CAAC,IAAA,EAAjD,QAAQ,QAAA,EAAE,WAAW,QAA4B,CAAC;IACnD,IAAA,KAAA,OAAkC,IAAA,gBAAQ,EAAe,IAAI,CAAC,IAAA,EAA7D,YAAY,QAAA,EAAE,eAAe,QAAgC,CAAC;IAErE,IAAA,iBAAS,EAAC;QACR,IAAM,iBAAiB,GAAG,IAAA,yBAAU,EAAC,QAAQ,CAAC,CAAC,UAAC,CAAC;YAC/C,OAAA,IAAA,WAAI,EAAC,IAAA,uBAAU,EAAC,CAAC,CAAC,CAAC;QAAnB,CAAmB,CACpB,CAAC,IAAI,CAAC,IAAA,iBAAK,GAAE,CAAC,CAAC;QAEhB,iBAAiB,CAAC,SAAS,CAAC;YAC1B,IAAI,EAAE,UAAC,MAAoB;gBACzB,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,eAAe,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YACD,KAAK,EAAE,UAAC,KAAe;gBACrB,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,eAAe,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;SACF,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,EAAE,QAAQ,UAAA,EAAE,YAAY,cAAA,EAAE,CAAC;AACpC,CAAC,CAAC;AAxBW,QAAA,mBAAmB,uBAwB9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useBleDevicePairing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBleDevicePairing.test.d.ts","sourceRoot":"","sources":["../../../src/ble/hooks/useBleDevicePairing.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (_) try {
33
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ var __importDefault = (this && this.__importDefault) || function (mod) {
54
+ return (mod && mod.__esModule) ? mod : { "default": mod };
55
+ };
56
+ exports.__esModule = true;
57
+ var react_hooks_1 = require("@testing-library/react-hooks");
58
+ var rxjs_1 = require("rxjs");
59
+ var devices_1 = require("@ledgerhq/devices");
60
+ var hw_transport_1 = __importDefault(require("@ledgerhq/hw-transport"));
61
+ var deviceAccess_1 = require("../../hw/deviceAccess");
62
+ var getVersion_1 = __importDefault(require("../../hw/getVersion"));
63
+ var useBleDevicePairing_1 = require("./useBleDevicePairing");
64
+ jest.mock("../../hw/deviceAccess");
65
+ jest.mock("../../hw/getVersion");
66
+ jest.mock("@ledgerhq/hw-transport");
67
+ jest.useFakeTimers();
68
+ var mockedGetVersion = jest.mocked(getVersion_1["default"]);
69
+ var mockedWithDevice = jest.mocked(deviceAccess_1.withDevice);
70
+ mockedWithDevice.mockReturnValue(function (job) { return (0, rxjs_1.from)(job(new hw_transport_1["default"]())); });
71
+ var aFirmwareInfo = {
72
+ isBootloader: false,
73
+ rawVersion: "",
74
+ targetId: 0,
75
+ mcuVersion: "",
76
+ flags: Buffer.from([])
77
+ };
78
+ var aDevice = {
79
+ deviceId: "DEVICE_ID_A",
80
+ deviceName: "DEVICE_NAME_A",
81
+ modelId: devices_1.DeviceModelId.nanoFTS,
82
+ wired: false
83
+ };
84
+ // FIXME: once we have our own definition of BleError class, this won't be needed
85
+ var BleError = /** @class */ (function (_super) {
86
+ __extends(BleError, _super);
87
+ function BleError(message, errorCode) {
88
+ var _this = _super.call(this, message) || this;
89
+ _this.errorCode = errorCode;
90
+ return _this;
91
+ }
92
+ return BleError;
93
+ }(Error));
94
+ describe("useBleDevicePairing", function () {
95
+ afterEach(function () {
96
+ mockedGetVersion.mockClear();
97
+ jest.clearAllTimers();
98
+ });
99
+ describe("When the request sent with the BLE transport to the device gets a success response", function () {
100
+ beforeEach(function () {
101
+ mockedGetVersion.mockResolvedValue(aFirmwareInfo);
102
+ });
103
+ it("should inform the hook consumer that the device is paired", function () { return __awaiter(void 0, void 0, void 0, function () {
104
+ var result;
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ result = (0, react_hooks_1.renderHook)(function () {
109
+ return (0, useBleDevicePairing_1.useBleDevicePairing)({
110
+ deviceId: aDevice.deviceId
111
+ });
112
+ }).result;
113
+ return [4 /*yield*/, (0, react_hooks_1.act)(function () { return __awaiter(void 0, void 0, void 0, function () {
114
+ return __generator(this, function (_a) {
115
+ jest.advanceTimersByTime(1);
116
+ return [2 /*return*/];
117
+ });
118
+ }); })];
119
+ case 1:
120
+ _a.sent();
121
+ expect(result.current.isPaired).toBe(true);
122
+ expect(result.current.pairingError).toBeNull();
123
+ return [2 /*return*/];
124
+ }
125
+ });
126
+ }); });
127
+ });
128
+ describe("When the request sent with the BLE transport is rejected with an error", function () {
129
+ beforeEach(function () {
130
+ var bleError = new BleError("An error during pairing", 201);
131
+ mockedGetVersion.mockRejectedValue(bleError);
132
+ });
133
+ it("should inform the hook consumer an error occurred", function () { return __awaiter(void 0, void 0, void 0, function () {
134
+ var result;
135
+ return __generator(this, function (_a) {
136
+ switch (_a.label) {
137
+ case 0:
138
+ result = (0, react_hooks_1.renderHook)(function () {
139
+ return (0, useBleDevicePairing_1.useBleDevicePairing)({
140
+ deviceId: aDevice.deviceId
141
+ });
142
+ }).result;
143
+ return [4 /*yield*/, (0, react_hooks_1.act)(function () { return __awaiter(void 0, void 0, void 0, function () {
144
+ return __generator(this, function (_a) {
145
+ jest.advanceTimersByTime(1);
146
+ return [2 /*return*/];
147
+ });
148
+ }); })];
149
+ case 1:
150
+ _a.sent();
151
+ expect(result.current.isPaired).toBe(false);
152
+ expect(result.current.pairingError).not.toBeNull();
153
+ return [2 /*return*/];
154
+ }
155
+ });
156
+ }); });
157
+ });
158
+ });
159
+ //# sourceMappingURL=useBleDevicePairing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBleDevicePairing.test.js","sourceRoot":"","sources":["../../../src/ble/hooks/useBleDevicePairing.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { DeviceModelId } from "@ledgerhq/types-devices";
2
+ import type { Observer as TransportObserver, Subscription as TransportSubscription, DescriptorEvent } from "@ledgerhq/hw-transport";
3
+ import { TransportBleDevice, ScannedDevice, BleError } from "../types";
4
+ export declare type ScanningBleError = BleError | null;
5
+ export declare type UseBleDevicesScanningResult = {
6
+ scannedDevices: ScannedDevice[];
7
+ scanningBleError: ScanningBleError;
8
+ };
9
+ export declare type UseBleDevicesScanningDependencies = {
10
+ bleTransportListen: (observer: TransportObserver<DescriptorEvent<TransportBleDevice | null>>) => TransportSubscription;
11
+ };
12
+ export declare type UseBleDevicesScanningOptions = {
13
+ stopBleScanning?: boolean;
14
+ filterByModelIds?: DeviceModelId[];
15
+ };
16
+ /**
17
+ * Scans the BLE devices around the user
18
+ * @param filterByModelIds An array of model ids to filter on
19
+ * @param stopBleScanning Flag to stop or continue the scanning
20
+ * @returns An object containing:
21
+ * - scannedDevices: list of ScannedDevice found by the scanning
22
+ * - scanningBleError: if an error occurred, a BleError, otherwise null
23
+ */
24
+ export declare const useBleDevicesScanning: ({ bleTransportListen, stopBleScanning, filterByModelIds, }: UseBleDevicesScanningDependencies & UseBleDevicesScanningOptions) => UseBleDevicesScanningResult;
25
+ //# sourceMappingURL=useBleDevicesScanning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBleDevicesScanning.d.ts","sourceRoot":"","sources":["../../../src/ble/hooks/useBleDevicesScanning.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EACV,QAAQ,IAAI,iBAAiB,EAC7B,YAAY,IAAI,qBAAqB,EACrC,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEvE,oBAAY,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE/C,oBAAY,2BAA2B,GAAG;IACxC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAEF,oBAAY,iCAAiC,GAAG;IAC9C,kBAAkB,EAAE,CAClB,QAAQ,EAAE,iBAAiB,CAAC,eAAe,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC,KACpE,qBAAqB,CAAC;CAC5B,CAAC;AAEF,oBAAY,4BAA4B,GAAG;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAC;CACpC,CAAC;AAIF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,+DAI/B,iCAAiC,GAClC,4BAA4B,KAAG,2BAoGhC,CAAC"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __read = (this && this.__read) || function (o, n) {
3
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
4
+ if (!m) return o;
5
+ var i = m.call(o), r, ar = [], e;
6
+ try {
7
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
+ }
9
+ catch (error) { e = { error: error }; }
10
+ finally {
11
+ try {
12
+ if (r && !r.done && (m = i["return"])) m.call(i);
13
+ }
14
+ finally { if (e) throw e.error; }
15
+ }
16
+ return ar;
17
+ };
18
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
19
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
20
+ if (ar || !(i in from)) {
21
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
22
+ ar[i] = from[i];
23
+ }
24
+ }
25
+ return to.concat(ar || Array.prototype.slice.call(from));
26
+ };
27
+ exports.__esModule = true;
28
+ exports.useBleDevicesScanning = void 0;
29
+ var react_1 = require("react");
30
+ var rxjs_1 = require("rxjs");
31
+ var operators_1 = require("rxjs/operators");
32
+ var devices_1 = require("@ledgerhq/devices");
33
+ var DEFAULT_DEVICE_NAME = "Device";
34
+ /**
35
+ * Scans the BLE devices around the user
36
+ * @param filterByModelIds An array of model ids to filter on
37
+ * @param stopBleScanning Flag to stop or continue the scanning
38
+ * @returns An object containing:
39
+ * - scannedDevices: list of ScannedDevice found by the scanning
40
+ * - scanningBleError: if an error occurred, a BleError, otherwise null
41
+ */
42
+ var useBleDevicesScanning = function (_a) {
43
+ var bleTransportListen = _a.bleTransportListen, stopBleScanning = _a.stopBleScanning, filterByModelIds = _a.filterByModelIds;
44
+ var _b = __read((0, react_1.useState)(null), 2), scanningBleError = _b[0], setScanningBleError = _b[1];
45
+ var _c = __read((0, react_1.useState)([]), 2), scannedDevices = _c[0], setScannedDevices = _c[1];
46
+ // To check for duplicates. The ref will persist for the full lifetime of the component
47
+ // in which the hook is called.
48
+ // We could use the current value of scannedDevices inside setScannedDevices
49
+ // but the check would only be done at the end of the process when calling setScannedDevices.
50
+ var scannedDevicesRef = (0, react_1.useRef)([]);
51
+ (0, react_1.useEffect)(function () {
52
+ if (stopBleScanning) {
53
+ return;
54
+ }
55
+ var bleScanningSource = new rxjs_1.Observable(bleTransportListen);
56
+ // Concat to flatten the events emitted by the scanning, that could arrive too fast
57
+ var sub = (0, rxjs_1.of)(bleScanningSource)
58
+ .pipe((0, operators_1.concatAll)())
59
+ .subscribe({
60
+ next: function (event) {
61
+ var _a, _b;
62
+ setScanningBleError(null);
63
+ var type = event.type, descriptor = event.descriptor;
64
+ if (type === "add" && descriptor) {
65
+ var transportDevice_1 = descriptor;
66
+ var isScannedDeviceDuplicate = scannedDevicesRef.current.some(function (d) { return d.deviceId === transportDevice_1.id; });
67
+ // Avoiding duplicates
68
+ if (isScannedDeviceDuplicate) {
69
+ return;
70
+ }
71
+ if (transportDevice_1.serviceUUIDs &&
72
+ transportDevice_1.serviceUUIDs.length > 0) {
73
+ var bleInfo = (0, devices_1.getInfosForServiceUuid)(transportDevice_1.serviceUUIDs[0]);
74
+ if (!bleInfo) {
75
+ return;
76
+ }
77
+ // Filters on the model ids, if asked
78
+ if (filterByModelIds &&
79
+ !filterByModelIds.includes(bleInfo.deviceModel.id)) {
80
+ return;
81
+ }
82
+ var newScannedDevice_1 = {
83
+ deviceModel: bleInfo.deviceModel,
84
+ deviceName: (_b = (_a = transportDevice_1.localName) !== null && _a !== void 0 ? _a : transportDevice_1.name) !== null && _b !== void 0 ? _b : DEFAULT_DEVICE_NAME,
85
+ deviceId: transportDevice_1.id,
86
+ bleRssi: transportDevice_1.rssi
87
+ };
88
+ setScannedDevices(function (scannedDevices) { return __spreadArray(__spreadArray([], __read(scannedDevices), false), [
89
+ newScannedDevice_1,
90
+ ], false); });
91
+ scannedDevicesRef.current.push(newScannedDevice_1);
92
+ }
93
+ }
94
+ },
95
+ error: function (error) {
96
+ // TODO: we should be sure to have a BleError
97
+ if (error.errorCode) {
98
+ setScanningBleError(error);
99
+ }
100
+ }
101
+ });
102
+ return function () {
103
+ sub.unsubscribe();
104
+ };
105
+ }, [
106
+ bleTransportListen,
107
+ stopBleScanning,
108
+ filterByModelIds,
109
+ setScannedDevices,
110
+ ]);
111
+ return {
112
+ scannedDevices: scannedDevices,
113
+ scanningBleError: scanningBleError
114
+ };
115
+ };
116
+ exports.useBleDevicesScanning = useBleDevicesScanning;
117
+ //# sourceMappingURL=useBleDevicesScanning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBleDevicesScanning.js","sourceRoot":"","sources":["../../../src/ble/hooks/useBleDevicesScanning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useBleDevicesScanning.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBleDevicesScanning.test.d.ts","sourceRoot":"","sources":["../../../src/ble/hooks/useBleDevicesScanning.test.ts"],"names":[],"mappings":""}