@ledgerhq/revault-sdk 0.25.0 → 0.26.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.
- package/lib/bake.cjs +1214 -1361
- package/lib/bake.cjs.map +1 -1
- package/lib/bake.d.cts +564 -562
- package/lib/bake.d.ts +564 -562
- package/lib/bake.js +1204 -1359
- package/lib/bake.js.map +1 -1
- package/lib/chunk-CKQMccvm.cjs +28 -0
- package/lib/crypto-BDBF_rfw.cjs +266 -0
- package/lib/crypto-BDBF_rfw.cjs.map +1 -0
- package/lib/crypto-CPCBrCSZ.js +245 -0
- package/lib/crypto-CPCBrCSZ.js.map +1 -0
- package/lib/crypto.cjs +5 -11
- package/lib/crypto.d.cts +10 -7
- package/lib/crypto.d.ts +10 -7
- package/lib/crypto.js +2 -11
- package/lib/device-0lcfYGHr.cjs +791 -0
- package/lib/device-0lcfYGHr.cjs.map +1 -0
- package/lib/device-B8Fww8_6.js +719 -0
- package/lib/device-B8Fww8_6.js.map +1 -0
- package/lib/device.cjs +6 -13
- package/lib/device.d.cts +2 -50
- package/lib/device.d.ts +2 -50
- package/lib/device.js +2 -13
- package/lib/engine.cjs +851 -888
- package/lib/engine.cjs.map +1 -1
- package/lib/engine.d.cts +3 -25
- package/lib/engine.d.ts +3 -25
- package/lib/engine.js +844 -885
- package/lib/engine.js.map +1 -1
- package/lib/index--fscLDTT.d.ts +237 -0
- package/lib/index-BE7oUpCb.d.cts +237 -0
- package/lib/index-DOn7RPPt.d.cts +23 -0
- package/lib/index-U0iFMp3g.d.ts +23 -0
- package/lib/index.cjs +0 -1
- package/lib/index.d.cts +10 -5
- package/lib/index.d.ts +10 -5
- package/lib/index.js +1 -1
- package/lib/logger-Cme0iL1f.d.cts +10 -0
- package/lib/logger-DWLViq7U.d.ts +10 -0
- package/lib/onboarding.cjs +215 -183
- package/lib/onboarding.cjs.map +1 -1
- package/lib/onboarding.d.cts +1918 -1722
- package/lib/onboarding.d.ts +1918 -1722
- package/lib/onboarding.js +211 -181
- package/lib/onboarding.js.map +1 -1
- package/lib/trpc-CWGPr8Ox.d.ts +20 -0
- package/lib/trpc-C_dUOB1u.d.cts +20 -0
- package/lib/types-BXkDuD6i.d.ts +207 -0
- package/lib/types-CQROu0nu.d.cts +6 -0
- package/lib/types-Ngwgtu_U.d.cts +207 -0
- package/lib/types-_QeBv1U4.d.ts +6 -0
- package/lib/types.cjs +0 -1
- package/lib/types.d.cts +3 -4
- package/lib/types.d.ts +3 -4
- package/lib/types.js +1 -1
- package/lib/utils-BGbdjOP9.js +61 -0
- package/lib/utils-BGbdjOP9.js.map +1 -0
- package/lib/utils-DbSFXp4c.cjs +84 -0
- package/lib/utils-DbSFXp4c.cjs.map +1 -0
- package/package.json +6 -6
- package/lib/chunk-2WGM7EWA.cjs +0 -282
- package/lib/chunk-2WGM7EWA.cjs.map +0 -1
- package/lib/chunk-AXI72NFY.js +0 -50
- package/lib/chunk-AXI72NFY.js.map +0 -1
- package/lib/chunk-DRMYBKL3.cjs +0 -820
- package/lib/chunk-DRMYBKL3.cjs.map +0 -1
- package/lib/chunk-KV5FO7N5.js +0 -282
- package/lib/chunk-KV5FO7N5.js.map +0 -1
- package/lib/chunk-LH4QQXUH.cjs +0 -50
- package/lib/chunk-LH4QQXUH.cjs.map +0 -1
- package/lib/chunk-PFZIW6UP.js +0 -820
- package/lib/chunk-PFZIW6UP.js.map +0 -1
- package/lib/crypto.cjs.map +0 -1
- package/lib/crypto.js.map +0 -1
- package/lib/device.cjs.map +0 -1
- package/lib/device.js.map +0 -1
- package/lib/index.cjs.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/logger-C-TPbnjv.d.cts +0 -9
- package/lib/logger-C-TPbnjv.d.ts +0 -9
- package/lib/types-C-ngtI5m.d.ts +0 -202
- package/lib/types-CpGEbAxh.d.cts +0 -19
- package/lib/types-CpGEbAxh.d.ts +0 -19
- package/lib/types-CryvY9pW.d.cts +0 -202
- package/lib/types-DJfbanPz.d.cts +0 -167
- package/lib/types-DJfbanPz.d.ts +0 -167
- package/lib/types.cjs.map +0 -1
- package/lib/types.js.map +0 -1
package/lib/chunk-PFZIW6UP.js
DELETED
|
@@ -1,820 +0,0 @@
|
|
|
1
|
-
// src/device/api-device.ts
|
|
2
|
-
import axios from "axios";
|
|
3
|
-
import axiosRetry from "axios-retry";
|
|
4
|
-
import { v4 as uuidv4 } from "uuid";
|
|
5
|
-
|
|
6
|
-
// src/device/constants.ts
|
|
7
|
-
var PATHS = {
|
|
8
|
-
U2F: "5655636'/5583430'",
|
|
9
|
-
CONFIDENTIALITY: "5655636'/4410950'",
|
|
10
|
-
KEY_MATERIAL: "5655636'/4932953'",
|
|
11
|
-
VALIDATION: "5655636'/5652812'"
|
|
12
|
-
};
|
|
13
|
-
var STATUS_LENGTH = 2;
|
|
14
|
-
var SCRIPT_IDS = {
|
|
15
|
-
INIT_SESSION: 3,
|
|
16
|
-
ACCOUNT_MANAGER_SESSION: 2
|
|
17
|
-
};
|
|
18
|
-
var STR_ROLES = {
|
|
19
|
-
OPERATOR: "00",
|
|
20
|
-
ADMIN: "01",
|
|
21
|
-
SHARED_OWNER: "02"
|
|
22
|
-
};
|
|
23
|
-
var APPID_VAULT_ADMINISTRATOR = "ad5be1a1fe011ce7f53ae081a22ae000a42021f3f94106a3bac9f76e8230e4b9";
|
|
24
|
-
var all61xxStatus = [];
|
|
25
|
-
for (let i = 24832; i <= 25087; i++) {
|
|
26
|
-
all61xxStatus.push(i);
|
|
27
|
-
}
|
|
28
|
-
var PAGINATED_STATUS = all61xxStatus;
|
|
29
|
-
var STREAMING_RESPONSE = 2;
|
|
30
|
-
var STREAMING_NEXT_ACTION = 1;
|
|
31
|
-
|
|
32
|
-
// src/device/api-device.ts
|
|
33
|
-
function createApiDevice(options, logger) {
|
|
34
|
-
const { genSeed } = options;
|
|
35
|
-
const sessionId = uuidv4();
|
|
36
|
-
const deviceApi = axios.create({ baseURL: options.deviceApiUrl });
|
|
37
|
-
axiosRetry(deviceApi, {
|
|
38
|
-
retryDelay: axiosRetry.linearDelay(1e3),
|
|
39
|
-
retries: 3,
|
|
40
|
-
retryCondition: (
|
|
41
|
-
/* v8 ignore next -- @preserve */
|
|
42
|
-
() => true
|
|
43
|
-
),
|
|
44
|
-
onRetry: (
|
|
45
|
-
/* v8 ignore next -- @preserve */
|
|
46
|
-
(retryCount, err) => {
|
|
47
|
-
const formattedErr = `${err.code ?? `UNKNOWN`} on ${err.config?.method?.toUpperCase() ?? "UNKNOWN_METHOD"} ${err.config?.url ?? "UNKNOWN_URL"}`;
|
|
48
|
-
logger.warning(
|
|
49
|
-
`Retrying request to device-api (attempt ${retryCount}) - Cause: ${formattedErr}`
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
)
|
|
53
|
-
});
|
|
54
|
-
deviceApi.interceptors.request.use(
|
|
55
|
-
(config) => {
|
|
56
|
-
logger.debug(
|
|
57
|
-
`[device-api] ${config.method?.toUpperCase()} ${config.url}${config.data ? ` ${JSON.stringify(config.data)}` : ""}`
|
|
58
|
-
);
|
|
59
|
-
if (["post", "put"].includes(config.method)) {
|
|
60
|
-
const isStringMode = typeof config.data === "string";
|
|
61
|
-
const data = isStringMode ? JSON.parse(config.data) : config.data;
|
|
62
|
-
const enhancedData = {
|
|
63
|
-
sessionID: sessionId,
|
|
64
|
-
// Used to ensure dedicated session if someones else uses same seed
|
|
65
|
-
psd_model: "02",
|
|
66
|
-
// Stax
|
|
67
|
-
version: 3,
|
|
68
|
-
// Used to properly enable noise channel
|
|
69
|
-
...data
|
|
70
|
-
};
|
|
71
|
-
config.data = isStringMode ? JSON.stringify(enhancedData) : enhancedData;
|
|
72
|
-
}
|
|
73
|
-
return config;
|
|
74
|
-
},
|
|
75
|
-
(error) => Promise.reject(error)
|
|
76
|
-
);
|
|
77
|
-
return {
|
|
78
|
-
with: (index) => {
|
|
79
|
-
const __seed = genSeed({ salt: options.salt, index });
|
|
80
|
-
const getSeed = async () => {
|
|
81
|
-
if (typeof __seed === "string") return Promise.resolve(__seed);
|
|
82
|
-
return __seed;
|
|
83
|
-
};
|
|
84
|
-
const authenticate = async ({
|
|
85
|
-
challenge,
|
|
86
|
-
workspaceName
|
|
87
|
-
}) => {
|
|
88
|
-
const role = challenge.role;
|
|
89
|
-
if (role === "READ_ONLY_API_KEY")
|
|
90
|
-
throw new Error("Invalid role for authenticate: READ_ONLY_API_KEY");
|
|
91
|
-
const { data } = await deviceApi.post("/authenticate", {
|
|
92
|
-
seed: await getSeed(),
|
|
93
|
-
challenge: Buffer.from(challenge.challenge, "base64").toString("hex"),
|
|
94
|
-
application: APPID_VAULT_ADMINISTRATOR,
|
|
95
|
-
key_handle: challenge.keyHandle,
|
|
96
|
-
name: challenge.name,
|
|
97
|
-
role: STR_ROLES[role],
|
|
98
|
-
type: "02",
|
|
99
|
-
// Stax
|
|
100
|
-
workspaceName
|
|
101
|
-
});
|
|
102
|
-
return data;
|
|
103
|
-
};
|
|
104
|
-
const finalizePairingHandshake = async (params) => {
|
|
105
|
-
const { handshake, partitionId } = params;
|
|
106
|
-
const payload = { seed: await getSeed(), handshake, ciphertext: partitionId };
|
|
107
|
-
const res = await deviceApi.post("/finalize-pairing-handshake", payload);
|
|
108
|
-
return res.data;
|
|
109
|
-
};
|
|
110
|
-
const generateSeedFragment = async () => {
|
|
111
|
-
const payload = {
|
|
112
|
-
seed: await getSeed(),
|
|
113
|
-
path: PATHS.KEY_MATERIAL,
|
|
114
|
-
goal: 0
|
|
115
|
-
// seed fragment
|
|
116
|
-
};
|
|
117
|
-
const { data } = await deviceApi.post("/generate-key-component", payload);
|
|
118
|
-
return data;
|
|
119
|
-
};
|
|
120
|
-
const generateWrappingKeyFragment = async () => {
|
|
121
|
-
const goal = 1;
|
|
122
|
-
const payload = { seed: await getSeed(), goal, path: PATHS.KEY_MATERIAL };
|
|
123
|
-
const res = await deviceApi.post("/generate-key-fragments", payload);
|
|
124
|
-
return Buffer.from(res.data, "hex").toString("base64");
|
|
125
|
-
};
|
|
126
|
-
const getAttestation = async () => {
|
|
127
|
-
const { data: attestationStr } = await deviceApi.post("/get-attestation", {
|
|
128
|
-
seed: await getSeed()
|
|
129
|
-
});
|
|
130
|
-
const attestationBuffer = Buffer.from(attestationStr, "hex");
|
|
131
|
-
const certLen = attestationBuffer.readInt8(32 + 65 + 1);
|
|
132
|
-
return {
|
|
133
|
-
attestation: {
|
|
134
|
-
codeHash: attestationBuffer.slice(0, 32).toString("base64"),
|
|
135
|
-
attestationPub: attestationBuffer.slice(32, 32 + 65).toString("base64"),
|
|
136
|
-
certificate: attestationBuffer.slice(32 + 65, 32 + 65 + 2 + certLen).toString("base64")
|
|
137
|
-
},
|
|
138
|
-
buffer: attestationBuffer
|
|
139
|
-
};
|
|
140
|
-
};
|
|
141
|
-
const getConfidentialityKey = async () => {
|
|
142
|
-
const res = await deviceApi.post("/get-confidentiality-key", { seed: await getSeed() });
|
|
143
|
-
return {
|
|
144
|
-
confidentialityKeyCurve25519: res.data.confidentiality_key_curve25519,
|
|
145
|
-
confidentialityKeySignature: res.data.confidentiality_key_signature
|
|
146
|
-
};
|
|
147
|
-
};
|
|
148
|
-
const getConfidentialityPubKey = async () => {
|
|
149
|
-
return getPublicKey({ path: PATHS.CONFIDENTIALITY });
|
|
150
|
-
};
|
|
151
|
-
const getDeviceUserId = async () => {
|
|
152
|
-
const res = await deviceApi.post("/blue-device-id", {
|
|
153
|
-
seed: await getSeed()
|
|
154
|
-
});
|
|
155
|
-
return res.data.blue_device_id.toUpperCase();
|
|
156
|
-
};
|
|
157
|
-
const getU2FPubKey = async () => {
|
|
158
|
-
return getPublicKey({ path: PATHS.U2F });
|
|
159
|
-
};
|
|
160
|
-
const getValidationPubKey = async () => {
|
|
161
|
-
return getPublicKey({ path: PATHS.VALIDATION });
|
|
162
|
-
};
|
|
163
|
-
const hasPairing = async () => {
|
|
164
|
-
const res = await deviceApi.post("/get-partition-ids", { seed: await getSeed() });
|
|
165
|
-
return res.data.length > 0;
|
|
166
|
-
};
|
|
167
|
-
const initPairingHandshake = async () => {
|
|
168
|
-
const { data } = await deviceApi.post(
|
|
169
|
-
"/initiate-pairing-handshake",
|
|
170
|
-
{ seed: await getSeed() }
|
|
171
|
-
);
|
|
172
|
-
return {
|
|
173
|
-
pubKey: data.pubKey,
|
|
174
|
-
signature: Buffer.from(data.attestation, "hex").toString("base64")
|
|
175
|
-
};
|
|
176
|
-
};
|
|
177
|
-
const openSession = async (params) => {
|
|
178
|
-
const { secureChannel } = params;
|
|
179
|
-
const signature = Buffer.from(secureChannel.certificate.signature, "base64");
|
|
180
|
-
const attestationPubKey = Buffer.from(secureChannel.certificate.attestationPub, "base64");
|
|
181
|
-
const attestationCertificate = Buffer.from(secureChannel.certificate.certificate, "base64");
|
|
182
|
-
const attestation = Buffer.concat([
|
|
183
|
-
Buffer.from([signature.length]),
|
|
184
|
-
signature,
|
|
185
|
-
attestationPubKey,
|
|
186
|
-
Buffer.from([attestationCertificate.length]),
|
|
187
|
-
attestationCertificate
|
|
188
|
-
]);
|
|
189
|
-
const payload = {
|
|
190
|
-
seed: await getSeed(),
|
|
191
|
-
path: PATHS.CONFIDENTIALITY,
|
|
192
|
-
pubKey: secureChannel.pubKey,
|
|
193
|
-
attestation: attestation.toString("hex"),
|
|
194
|
-
scriptId: SCRIPT_IDS.INIT_SESSION
|
|
195
|
-
};
|
|
196
|
-
const { data: deviceResponse } = await deviceApi.post("/open-session", payload);
|
|
197
|
-
if (deviceResponse !== "9000") {
|
|
198
|
-
throw new Error(`device-api device failed with code: ${deviceResponse}`);
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
const register = async (params) => {
|
|
202
|
-
const { challenge, u2fRegisterData, name, role } = params;
|
|
203
|
-
const payload = {
|
|
204
|
-
seed: await getSeed(),
|
|
205
|
-
challenge,
|
|
206
|
-
name,
|
|
207
|
-
role: STR_ROLES[role],
|
|
208
|
-
hsm_data: u2fRegisterData,
|
|
209
|
-
type: "02",
|
|
210
|
-
// Stax
|
|
211
|
-
application: APPID_VAULT_ADMINISTRATOR
|
|
212
|
-
};
|
|
213
|
-
const { data } = await deviceApi.post("/register", payload);
|
|
214
|
-
const response = Buffer.from(data, "hex");
|
|
215
|
-
let i = 0;
|
|
216
|
-
const rfu = response.slice(i, i + 1)[0];
|
|
217
|
-
i += 1;
|
|
218
|
-
const pubKey = response.slice(i, i + 65).toString("hex");
|
|
219
|
-
i += 65;
|
|
220
|
-
const keyHandleLength = response.slice(i, i + 1)[0];
|
|
221
|
-
i++;
|
|
222
|
-
const keyHandle = response.slice(i, i + keyHandleLength);
|
|
223
|
-
i += keyHandleLength;
|
|
224
|
-
return {
|
|
225
|
-
u2fRegister: response.slice(0, response.length - 2),
|
|
226
|
-
keyHandle,
|
|
227
|
-
rfu,
|
|
228
|
-
pubKey
|
|
229
|
-
};
|
|
230
|
-
};
|
|
231
|
-
const registerData = async (params) => {
|
|
232
|
-
const { challenge } = params;
|
|
233
|
-
const payload = { seed: await getSeed(), challenge };
|
|
234
|
-
const res = await deviceApi.post("/u2f-register-data", payload);
|
|
235
|
-
return res.data;
|
|
236
|
-
};
|
|
237
|
-
const setPairing = async ({ pairing }) => {
|
|
238
|
-
const payload = {
|
|
239
|
-
seed: await getSeed(),
|
|
240
|
-
blob: pairing.blob,
|
|
241
|
-
pairing: {
|
|
242
|
-
bootstrap_enabled: pairing.pairing.bootstrapEnabled,
|
|
243
|
-
partition_key: pairing.pairing.partitionKey,
|
|
244
|
-
workspace_name: pairing.pairing.workspaceName
|
|
245
|
-
},
|
|
246
|
-
partition_key_attestation: {
|
|
247
|
-
code_hash: pairing.partitionKeyAttestation.codeHash,
|
|
248
|
-
attestation_pub: pairing.partitionKeyAttestation.attestationPub,
|
|
249
|
-
certificate: pairing.partitionKeyAttestation.certificate,
|
|
250
|
-
signature: pairing.partitionKeyAttestation.signature
|
|
251
|
-
}
|
|
252
|
-
};
|
|
253
|
-
await deviceApi.post("/set-partition-key", payload);
|
|
254
|
-
};
|
|
255
|
-
const startKKPatternAsResponder = async (params) => {
|
|
256
|
-
const payload = {
|
|
257
|
-
seed: await getSeed(),
|
|
258
|
-
script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,
|
|
259
|
-
handshake: params.handshake,
|
|
260
|
-
// for device-api it's normal to have empty string as handshake_attestation
|
|
261
|
-
handshake_attestation: "",
|
|
262
|
-
partition_id: params.partitionId
|
|
263
|
-
};
|
|
264
|
-
const { data } = await deviceApi.post("/start-kk-pattern-as-responder", payload);
|
|
265
|
-
const buffer = Buffer.from(data, "hex");
|
|
266
|
-
const dataLength = buffer.readInt8(0);
|
|
267
|
-
return {
|
|
268
|
-
handshake: buffer.slice(1, dataLength + 1).toString("base64"),
|
|
269
|
-
signature: buffer.slice(dataLength + 1).toString("base64")
|
|
270
|
-
};
|
|
271
|
-
};
|
|
272
|
-
const startKPatternAsResponder = async (params) => {
|
|
273
|
-
const { handshake, partitionId } = params;
|
|
274
|
-
const payload = {
|
|
275
|
-
seed: await getSeed(),
|
|
276
|
-
script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,
|
|
277
|
-
handshake,
|
|
278
|
-
// for device-api it's normal to have empty string as handshake_attestation
|
|
279
|
-
handshake_attestation: "",
|
|
280
|
-
partition_id: partitionId
|
|
281
|
-
};
|
|
282
|
-
const { data: deviceResponse } = await deviceApi.post(
|
|
283
|
-
"/start-k-pattern-as-responder",
|
|
284
|
-
payload
|
|
285
|
-
);
|
|
286
|
-
if (deviceResponse !== "9000") {
|
|
287
|
-
throw new Error(`device-api device failed with code: ${deviceResponse}`);
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
const getPublicKey = async (params) => {
|
|
291
|
-
const { path } = params;
|
|
292
|
-
const payload = { seed: await getSeed(), secp256k1: true, path };
|
|
293
|
-
const res = await deviceApi.post("/get-public-key", payload);
|
|
294
|
-
return {
|
|
295
|
-
pubKey: res.data.pubKey,
|
|
296
|
-
signature: Buffer.from(res.data.attestation, "hex").toString("base64")
|
|
297
|
-
};
|
|
298
|
-
};
|
|
299
|
-
const validateVaultOperation = async (params) => {
|
|
300
|
-
const { actions } = params;
|
|
301
|
-
const payload = {
|
|
302
|
-
seed: await getSeed(),
|
|
303
|
-
path: PATHS.VALIDATION,
|
|
304
|
-
actions
|
|
305
|
-
};
|
|
306
|
-
const { data: signature } = await deviceApi.post("/validate-op", payload);
|
|
307
|
-
return signature;
|
|
308
|
-
};
|
|
309
|
-
const sendAPDU = (_apdu) => {
|
|
310
|
-
logger.info("Can't send arbitrary APDU to software device");
|
|
311
|
-
return Promise.resolve("9000");
|
|
312
|
-
};
|
|
313
|
-
const getVersion = async () => {
|
|
314
|
-
return "1.2.3";
|
|
315
|
-
};
|
|
316
|
-
const poll = async () => {
|
|
317
|
-
await new Promise((r) => setTimeout(r, 1e3));
|
|
318
|
-
return { isAppOpened: true };
|
|
319
|
-
};
|
|
320
|
-
const pollApp = async () => {
|
|
321
|
-
await new Promise((r) => setTimeout(r, 1e3));
|
|
322
|
-
return "9000";
|
|
323
|
-
};
|
|
324
|
-
return {
|
|
325
|
-
authenticate,
|
|
326
|
-
finalizePairingHandshake,
|
|
327
|
-
generateSeedFragment,
|
|
328
|
-
generateWrappingKeyFragment,
|
|
329
|
-
getAttestation,
|
|
330
|
-
getConfidentialityKey,
|
|
331
|
-
getConfidentialityPubKey,
|
|
332
|
-
getDeviceUserId,
|
|
333
|
-
getU2FPubKey,
|
|
334
|
-
getValidationPubKey,
|
|
335
|
-
hasPairing,
|
|
336
|
-
initPairingHandshake,
|
|
337
|
-
openSession,
|
|
338
|
-
register,
|
|
339
|
-
registerData,
|
|
340
|
-
setPairing,
|
|
341
|
-
startKKPatternAsResponder,
|
|
342
|
-
startKPatternAsResponder,
|
|
343
|
-
validateVaultOperation,
|
|
344
|
-
getVersion,
|
|
345
|
-
sendAPDU,
|
|
346
|
-
poll,
|
|
347
|
-
pollApp
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// ../../node_modules/.pnpm/@ledgerhq+errors@6.32.0/node_modules/@ledgerhq/errors/lib-es/helpers.js
|
|
354
|
-
var errorClasses = {};
|
|
355
|
-
var deserializers = {};
|
|
356
|
-
var addCustomErrorDeserializer = (name, deserializer) => {
|
|
357
|
-
deserializers[name] = deserializer;
|
|
358
|
-
};
|
|
359
|
-
var createCustomErrorClass = (name) => {
|
|
360
|
-
class CustomErrorClass extends Error {
|
|
361
|
-
cause;
|
|
362
|
-
constructor(message, fields, options) {
|
|
363
|
-
super(message || name, options);
|
|
364
|
-
Object.setPrototypeOf(this, CustomErrorClass.prototype);
|
|
365
|
-
this.name = name;
|
|
366
|
-
if (fields) {
|
|
367
|
-
for (const k in fields) {
|
|
368
|
-
this[k] = fields[k];
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
if (options && isObject(options) && "cause" in options && !this.cause) {
|
|
372
|
-
const cause = options.cause;
|
|
373
|
-
this.cause = cause;
|
|
374
|
-
if ("stack" in cause) {
|
|
375
|
-
this.stack = this.stack + "\nCAUSE: " + cause.stack;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
errorClasses[name] = CustomErrorClass;
|
|
381
|
-
return CustomErrorClass;
|
|
382
|
-
};
|
|
383
|
-
function isObject(value) {
|
|
384
|
-
return typeof value === "object";
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// ../../node_modules/.pnpm/@ledgerhq+errors@6.32.0/node_modules/@ledgerhq/errors/lib-es/index.js
|
|
388
|
-
var AccountNameRequiredError = createCustomErrorClass("AccountNameRequired");
|
|
389
|
-
var AccountNotSupported = createCustomErrorClass("AccountNotSupported");
|
|
390
|
-
var AccountAwaitingSendPendingOperations = createCustomErrorClass("AccountAwaitingSendPendingOperations");
|
|
391
|
-
var AmountRequired = createCustomErrorClass("AmountRequired");
|
|
392
|
-
var BluetoothRequired = createCustomErrorClass("BluetoothRequired");
|
|
393
|
-
var BtcUnmatchedApp = createCustomErrorClass("BtcUnmatchedApp");
|
|
394
|
-
var CantOpenDevice = createCustomErrorClass("CantOpenDevice");
|
|
395
|
-
var CashAddrNotSupported = createCustomErrorClass("CashAddrNotSupported");
|
|
396
|
-
var ClaimRewardsFeesWarning = createCustomErrorClass("ClaimRewardsFeesWarning");
|
|
397
|
-
var CurrencyNotSupported = createCustomErrorClass("CurrencyNotSupported");
|
|
398
|
-
var DeviceAppVerifyNotSupported = createCustomErrorClass("DeviceAppVerifyNotSupported");
|
|
399
|
-
var DeviceGenuineSocketEarlyClose = createCustomErrorClass("DeviceGenuineSocketEarlyClose");
|
|
400
|
-
var DeviceNotGenuineError = createCustomErrorClass("DeviceNotGenuine");
|
|
401
|
-
var DeviceOnDashboardExpected = createCustomErrorClass("DeviceOnDashboardExpected");
|
|
402
|
-
var DeviceOnDashboardUnexpected = createCustomErrorClass("DeviceOnDashboardUnexpected");
|
|
403
|
-
var DeviceInOSUExpected = createCustomErrorClass("DeviceInOSUExpected");
|
|
404
|
-
var DeviceHalted = createCustomErrorClass("DeviceHalted");
|
|
405
|
-
var DeviceNameInvalid = createCustomErrorClass("DeviceNameInvalid");
|
|
406
|
-
var DeviceSocketFail = createCustomErrorClass("DeviceSocketFail");
|
|
407
|
-
var DeviceSocketNoBulkStatus = createCustomErrorClass("DeviceSocketNoBulkStatus");
|
|
408
|
-
var DeviceNeedsRestart = createCustomErrorClass("DeviceSocketNoBulkStatus");
|
|
409
|
-
var UnresponsiveDeviceError = createCustomErrorClass("UnresponsiveDeviceError");
|
|
410
|
-
var DisconnectedDevice = createCustomErrorClass("DisconnectedDevice");
|
|
411
|
-
var DisconnectedDeviceDuringOperation = createCustomErrorClass("DisconnectedDeviceDuringOperation");
|
|
412
|
-
var DeviceExtractOnboardingStateError = createCustomErrorClass("DeviceExtractOnboardingStateError");
|
|
413
|
-
var DeviceOnboardingStatePollingError = createCustomErrorClass("DeviceOnboardingStatePollingError");
|
|
414
|
-
var EnpointConfigError = createCustomErrorClass("EnpointConfig");
|
|
415
|
-
var EthAppPleaseEnableContractData = createCustomErrorClass("EthAppPleaseEnableContractData");
|
|
416
|
-
var SolAppPleaseEnableContractData = createCustomErrorClass("SolAppPleaseEnableContractData");
|
|
417
|
-
var CeloAppPleaseEnableContractData = createCustomErrorClass("CeloAppPleaseEnableContractData");
|
|
418
|
-
var FeeEstimationFailed = createCustomErrorClass("FeeEstimationFailed");
|
|
419
|
-
var FirmwareNotRecognized = createCustomErrorClass("FirmwareNotRecognized");
|
|
420
|
-
var HardResetFail = createCustomErrorClass("HardResetFail");
|
|
421
|
-
var InvalidXRPTag = createCustomErrorClass("InvalidXRPTag");
|
|
422
|
-
var InvalidAddress = createCustomErrorClass("InvalidAddress");
|
|
423
|
-
var InvalidTransactionError = createCustomErrorClass("InvalidTransactionError");
|
|
424
|
-
var InvalidNonce = createCustomErrorClass("InvalidNonce");
|
|
425
|
-
var InvalidAddressBecauseDestinationIsAlsoSource = createCustomErrorClass("InvalidAddressBecauseDestinationIsAlsoSource");
|
|
426
|
-
var LatestMCUInstalledError = createCustomErrorClass("LatestMCUInstalledError");
|
|
427
|
-
var LatestFirmwareVersionRequired = createCustomErrorClass("LatestFirmwareVersionRequired");
|
|
428
|
-
var UnsupportedFeatureError = createCustomErrorClass("UnsupportedFeatureError");
|
|
429
|
-
var NanoSNotSupported = createCustomErrorClass("NanoSNotSupported");
|
|
430
|
-
var UnknownMCU = createCustomErrorClass("UnknownMCU");
|
|
431
|
-
var LedgerAPIError = createCustomErrorClass("LedgerAPIError");
|
|
432
|
-
var LedgerAPIErrorWithMessage = createCustomErrorClass("LedgerAPIErrorWithMessage");
|
|
433
|
-
var LedgerAPINotAvailable = createCustomErrorClass("LedgerAPINotAvailable");
|
|
434
|
-
var ManagerAppAlreadyInstalledError = createCustomErrorClass("ManagerAppAlreadyInstalled");
|
|
435
|
-
var ManagerAppRelyOnBTCError = createCustomErrorClass("ManagerAppRelyOnBTC");
|
|
436
|
-
var ManagerAppDepInstallRequired = createCustomErrorClass("ManagerAppDepInstallRequired");
|
|
437
|
-
var ManagerAppDepUninstallRequired = createCustomErrorClass("ManagerAppDepUninstallRequired");
|
|
438
|
-
var ManagerDeviceLockedError = createCustomErrorClass("ManagerDeviceLocked");
|
|
439
|
-
var ManagerFirmwareNotEnoughSpaceError = createCustomErrorClass("ManagerFirmwareNotEnoughSpace");
|
|
440
|
-
var ManagerNotEnoughSpaceError = createCustomErrorClass("ManagerNotEnoughSpace");
|
|
441
|
-
var ManagerUninstallBTCDep = createCustomErrorClass("ManagerUninstallBTCDep");
|
|
442
|
-
var NetworkDown = createCustomErrorClass("NetworkDown");
|
|
443
|
-
var NetworkError = createCustomErrorClass("NetworkError");
|
|
444
|
-
var NoAddressesFound = createCustomErrorClass("NoAddressesFound");
|
|
445
|
-
var NotEnoughBalance = createCustomErrorClass("NotEnoughBalance");
|
|
446
|
-
var NotEnoughBalanceFees = createCustomErrorClass("NotEnoughBalanceFees");
|
|
447
|
-
var NotEnoughBalanceSwap = createCustomErrorClass("NotEnoughBalanceSwap");
|
|
448
|
-
var NotEnoughBalanceToDelegate = createCustomErrorClass("NotEnoughBalanceToDelegate");
|
|
449
|
-
var UnstakeNotEnoughStakedBalanceLeft = createCustomErrorClass("UnstakeNotEnoughStakedBalanceLeft");
|
|
450
|
-
var RestakeNotEnoughStakedBalanceLeft = createCustomErrorClass("RestakeNotEnoughStakedBalanceLeft");
|
|
451
|
-
var NotEnoughToRestake = createCustomErrorClass("NotEnoughToRestake");
|
|
452
|
-
var NotEnoughToUnstake = createCustomErrorClass("NotEnoughToUnstake");
|
|
453
|
-
var NotEnoughBalanceInParentAccount = createCustomErrorClass("NotEnoughBalanceInParentAccount");
|
|
454
|
-
var NotEnoughSpendableBalance = createCustomErrorClass("NotEnoughSpendableBalance");
|
|
455
|
-
var NotEnoughBalanceBecauseDestinationNotCreated = createCustomErrorClass("NotEnoughBalanceBecauseDestinationNotCreated");
|
|
456
|
-
var NotEnoughToStake = createCustomErrorClass("NotEnoughToStake");
|
|
457
|
-
var NoAccessToCamera = createCustomErrorClass("NoAccessToCamera");
|
|
458
|
-
var NotEnoughGas = createCustomErrorClass("NotEnoughGas");
|
|
459
|
-
var NotEnoughGasSwap = createCustomErrorClass("NotEnoughGasSwap");
|
|
460
|
-
var TronEmptyAccount = createCustomErrorClass("TronEmptyAccount");
|
|
461
|
-
var MaybeKeepTronAccountAlive = createCustomErrorClass("MaybeKeepTronAccountAlive");
|
|
462
|
-
var NotSupportedLegacyAddress = createCustomErrorClass("NotSupportedLegacyAddress");
|
|
463
|
-
var GasLessThanEstimate = createCustomErrorClass("GasLessThanEstimate");
|
|
464
|
-
var PriorityFeeTooLow = createCustomErrorClass("PriorityFeeTooLow");
|
|
465
|
-
var PriorityFeeTooHigh = createCustomErrorClass("PriorityFeeTooHigh");
|
|
466
|
-
var PriorityFeeHigherThanMaxFee = createCustomErrorClass("PriorityFeeHigherThanMaxFee");
|
|
467
|
-
var MaxFeeTooLow = createCustomErrorClass("MaxFeeTooLow");
|
|
468
|
-
var PasswordsDontMatchError = createCustomErrorClass("PasswordsDontMatch");
|
|
469
|
-
var PasswordIncorrectError = createCustomErrorClass("PasswordIncorrect");
|
|
470
|
-
var RecommendSubAccountsToEmpty = createCustomErrorClass("RecommendSubAccountsToEmpty");
|
|
471
|
-
var RecommendUndelegation = createCustomErrorClass("RecommendUndelegation");
|
|
472
|
-
var TimeoutTagged = createCustomErrorClass("TimeoutTagged");
|
|
473
|
-
var UnexpectedBootloader = createCustomErrorClass("UnexpectedBootloader");
|
|
474
|
-
var MCUNotGenuineToDashboard = createCustomErrorClass("MCUNotGenuineToDashboard");
|
|
475
|
-
var RecipientRequired = createCustomErrorClass("RecipientRequired");
|
|
476
|
-
var UnavailableTezosOriginatedAccountReceive = createCustomErrorClass("UnavailableTezosOriginatedAccountReceive");
|
|
477
|
-
var UnavailableTezosOriginatedAccountSend = createCustomErrorClass("UnavailableTezosOriginatedAccountSend");
|
|
478
|
-
var UpdateFetchFileFail = createCustomErrorClass("UpdateFetchFileFail");
|
|
479
|
-
var UpdateIncorrectHash = createCustomErrorClass("UpdateIncorrectHash");
|
|
480
|
-
var UpdateIncorrectSig = createCustomErrorClass("UpdateIncorrectSig");
|
|
481
|
-
var UpdateYourApp = createCustomErrorClass("UpdateYourApp");
|
|
482
|
-
var UserRefusedDeviceNameChange = createCustomErrorClass("UserRefusedDeviceNameChange");
|
|
483
|
-
var UserRefusedAddress = createCustomErrorClass("UserRefusedAddress");
|
|
484
|
-
var UserRefusedFirmwareUpdate = createCustomErrorClass("UserRefusedFirmwareUpdate");
|
|
485
|
-
var UserRefusedAllowManager = createCustomErrorClass("UserRefusedAllowManager");
|
|
486
|
-
var UserRefusedOnDevice = createCustomErrorClass("UserRefusedOnDevice");
|
|
487
|
-
var PinNotSet = createCustomErrorClass("PinNotSet");
|
|
488
|
-
var ExpertModeRequired = createCustomErrorClass("ExpertModeRequired");
|
|
489
|
-
var TransportOpenUserCancelled = createCustomErrorClass("TransportOpenUserCancelled");
|
|
490
|
-
var TransportInterfaceNotAvailable = createCustomErrorClass("TransportInterfaceNotAvailable");
|
|
491
|
-
var TransportRaceCondition = createCustomErrorClass("TransportRaceCondition");
|
|
492
|
-
var TransportWebUSBGestureRequired = createCustomErrorClass("TransportWebUSBGestureRequired");
|
|
493
|
-
var TransactionHasBeenValidatedError = createCustomErrorClass("TransactionHasBeenValidatedError");
|
|
494
|
-
var TransportExchangeTimeoutError = createCustomErrorClass("TransportExchangeTimeoutError");
|
|
495
|
-
var DeviceShouldStayInApp = createCustomErrorClass("DeviceShouldStayInApp");
|
|
496
|
-
var WebsocketConnectionError = createCustomErrorClass("WebsocketConnectionError");
|
|
497
|
-
var WebsocketConnectionFailed = createCustomErrorClass("WebsocketConnectionFailed");
|
|
498
|
-
var WrongDeviceForAccount = createCustomErrorClass("WrongDeviceForAccount");
|
|
499
|
-
var WrongDeviceForAccountPayout = createCustomErrorClass("WrongDeviceForAccountPayout");
|
|
500
|
-
var MissingSwapPayloadParamaters = createCustomErrorClass("MissingSwapPayloadParamaters");
|
|
501
|
-
var WrongDeviceForAccountRefund = createCustomErrorClass("WrongDeviceForAccountRefund");
|
|
502
|
-
var WrongAppForCurrency = createCustomErrorClass("WrongAppForCurrency");
|
|
503
|
-
var ETHAddressNonEIP = createCustomErrorClass("ETHAddressNonEIP");
|
|
504
|
-
var CantScanQRCode = createCustomErrorClass("CantScanQRCode");
|
|
505
|
-
var FeeNotLoaded = createCustomErrorClass("FeeNotLoaded");
|
|
506
|
-
var FeeNotLoadedSwap = createCustomErrorClass("FeeNotLoadedSwap");
|
|
507
|
-
var FeeRequired = createCustomErrorClass("FeeRequired");
|
|
508
|
-
var FeeTooHigh = createCustomErrorClass("FeeTooHigh");
|
|
509
|
-
var PendingOperation = createCustomErrorClass("PendingOperation");
|
|
510
|
-
var SyncError = createCustomErrorClass("SyncError");
|
|
511
|
-
var PairingFailed = createCustomErrorClass("PairingFailed");
|
|
512
|
-
var PeerRemovedPairing = createCustomErrorClass("PeerRemovedPairing");
|
|
513
|
-
var GenuineCheckFailed = createCustomErrorClass("GenuineCheckFailed");
|
|
514
|
-
var LedgerAPI4xx = createCustomErrorClass("LedgerAPI4xx");
|
|
515
|
-
var LedgerAPI5xx = createCustomErrorClass("LedgerAPI5xx");
|
|
516
|
-
var FirmwareOrAppUpdateRequired = createCustomErrorClass("FirmwareOrAppUpdateRequired");
|
|
517
|
-
var ReplacementTransactionUnderpriced = createCustomErrorClass("ReplacementTransactionUnderpriced");
|
|
518
|
-
var OpReturnDataSizeLimit = createCustomErrorClass("OpReturnSizeLimit");
|
|
519
|
-
var DustLimit = createCustomErrorClass("DustLimit");
|
|
520
|
-
var ConcordiumInsufficientFunds = createCustomErrorClass("ConcordiumInsufficientFunds");
|
|
521
|
-
var ConcordiumMemoTooLong = createCustomErrorClass("ConcordiumMemoTooLong");
|
|
522
|
-
var ConcordiumPairingExpiredError = createCustomErrorClass("ConcordiumPairingExpiredError");
|
|
523
|
-
var ConcordiumSessionExpiredError = createCustomErrorClass("ConcordiumSessionExpiredError");
|
|
524
|
-
var LanguageNotFound = createCustomErrorClass("LanguageNotFound");
|
|
525
|
-
var NoDBPathGiven = createCustomErrorClass("NoDBPathGiven");
|
|
526
|
-
var DBWrongPassword = createCustomErrorClass("DBWrongPassword");
|
|
527
|
-
var DBNotReset = createCustomErrorClass("DBNotReset");
|
|
528
|
-
var SequenceNumberError = createCustomErrorClass("SequenceNumberError");
|
|
529
|
-
var DisabledTransactionBroadcastError = createCustomErrorClass("DisabledTransactionBroadcastError");
|
|
530
|
-
var HwTransportErrorType;
|
|
531
|
-
(function(HwTransportErrorType2) {
|
|
532
|
-
HwTransportErrorType2["Unknown"] = "Unknown";
|
|
533
|
-
HwTransportErrorType2["LocationServicesDisabled"] = "LocationServicesDisabled";
|
|
534
|
-
HwTransportErrorType2["LocationServicesUnauthorized"] = "LocationServicesUnauthorized";
|
|
535
|
-
HwTransportErrorType2["BluetoothScanStartFailed"] = "BluetoothScanStartFailed";
|
|
536
|
-
})(HwTransportErrorType || (HwTransportErrorType = {}));
|
|
537
|
-
var TransportError = class extends Error {
|
|
538
|
-
id;
|
|
539
|
-
constructor(message, id) {
|
|
540
|
-
const name = "TransportError";
|
|
541
|
-
super(message || name);
|
|
542
|
-
this.name = name;
|
|
543
|
-
this.message = message;
|
|
544
|
-
this.stack = new Error(message).stack;
|
|
545
|
-
this.id = id;
|
|
546
|
-
}
|
|
547
|
-
};
|
|
548
|
-
addCustomErrorDeserializer("TransportError", (e) => new TransportError(e.message, e.id));
|
|
549
|
-
var StatusCodes = {
|
|
550
|
-
ACCESS_CONDITION_NOT_FULFILLED: 38916,
|
|
551
|
-
ALGORITHM_NOT_SUPPORTED: 38020,
|
|
552
|
-
CLA_NOT_SUPPORTED: 28160,
|
|
553
|
-
CODE_BLOCKED: 38976,
|
|
554
|
-
CODE_NOT_INITIALIZED: 38914,
|
|
555
|
-
COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 27009,
|
|
556
|
-
CONDITIONS_OF_USE_NOT_SATISFIED: 27013,
|
|
557
|
-
CONTRADICTION_INVALIDATION: 38928,
|
|
558
|
-
CONTRADICTION_SECRET_CODE_STATUS: 38920,
|
|
559
|
-
DEVICE_IN_RECOVERY_MODE: 26159,
|
|
560
|
-
CUSTOM_IMAGE_EMPTY: 26158,
|
|
561
|
-
FILE_ALREADY_EXISTS: 27273,
|
|
562
|
-
FILE_NOT_FOUND: 37892,
|
|
563
|
-
GP_AUTH_FAILED: 25344,
|
|
564
|
-
HALTED: 28586,
|
|
565
|
-
INCONSISTENT_FILE: 37896,
|
|
566
|
-
INCORRECT_DATA: 27264,
|
|
567
|
-
INCORRECT_LENGTH: 26368,
|
|
568
|
-
INCORRECT_P1_P2: 27392,
|
|
569
|
-
INS_NOT_SUPPORTED: 27904,
|
|
570
|
-
DEVICE_NOT_ONBOARDED: 27911,
|
|
571
|
-
DEVICE_NOT_ONBOARDED_2: 26129,
|
|
572
|
-
INVALID_KCV: 38021,
|
|
573
|
-
INVALID_OFFSET: 37890,
|
|
574
|
-
LICENSING: 28482,
|
|
575
|
-
LOCKED_DEVICE: 21781,
|
|
576
|
-
MAX_VALUE_REACHED: 38992,
|
|
577
|
-
MEMORY_PROBLEM: 37440,
|
|
578
|
-
MISSING_CRITICAL_PARAMETER: 26624,
|
|
579
|
-
NO_EF_SELECTED: 37888,
|
|
580
|
-
NOT_ENOUGH_MEMORY_SPACE: 27268,
|
|
581
|
-
OK: 36864,
|
|
582
|
-
PIN_REMAINING_ATTEMPTS: 25536,
|
|
583
|
-
REFERENCED_DATA_NOT_FOUND: 27272,
|
|
584
|
-
SECURITY_STATUS_NOT_SATISFIED: 27010,
|
|
585
|
-
TECHNICAL_PROBLEM: 28416,
|
|
586
|
-
UNKNOWN_APDU: 27906,
|
|
587
|
-
USER_REFUSED_ON_DEVICE: 21761,
|
|
588
|
-
NOT_ENOUGH_SPACE: 20738,
|
|
589
|
-
APP_NOT_FOUND_OR_INVALID_CONTEXT: 20771,
|
|
590
|
-
INVALID_APP_NAME_LENGTH: 26378,
|
|
591
|
-
GEN_AES_KEY_FAILED: 21529,
|
|
592
|
-
INTERNAL_CRYPTO_OPERATION_FAILED: 21530,
|
|
593
|
-
INTERNAL_COMPUTE_AES_CMAC_FAILED: 21531,
|
|
594
|
-
ENCRYPT_APP_STORAGE_FAILED: 21532,
|
|
595
|
-
INVALID_BACKUP_STATE: 26178,
|
|
596
|
-
PIN_NOT_SET: 21762,
|
|
597
|
-
INVALID_BACKUP_LENGTH: 26419,
|
|
598
|
-
INVALID_RESTORE_STATE: 26179,
|
|
599
|
-
INVALID_CHUNK_LENGTH: 26420,
|
|
600
|
-
INVALID_BACKUP_HEADER: 26698,
|
|
601
|
-
SW_BAD_STATE: 45063
|
|
602
|
-
};
|
|
603
|
-
function getAltStatusMessage(code) {
|
|
604
|
-
switch (code) {
|
|
605
|
-
// improve text of most common errors
|
|
606
|
-
case 26368:
|
|
607
|
-
return "Incorrect length";
|
|
608
|
-
case 26624:
|
|
609
|
-
return "Missing critical parameter";
|
|
610
|
-
case 27010:
|
|
611
|
-
return "Security not satisfied (dongle locked or have invalid access rights)";
|
|
612
|
-
case 27013:
|
|
613
|
-
return "Condition of use not satisfied (denied by the user?)";
|
|
614
|
-
case 27264:
|
|
615
|
-
return "Invalid data received";
|
|
616
|
-
case 27392:
|
|
617
|
-
return "Invalid parameter received";
|
|
618
|
-
case 21781:
|
|
619
|
-
return "Locked device";
|
|
620
|
-
case 45063:
|
|
621
|
-
return "Unexpected state on the device";
|
|
622
|
-
}
|
|
623
|
-
if (28416 <= code && code <= 28671) {
|
|
624
|
-
return "Internal error, please report";
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
var TransportStatusError = class _TransportStatusError extends Error {
|
|
628
|
-
statusCode;
|
|
629
|
-
statusText;
|
|
630
|
-
/**
|
|
631
|
-
* @param statusCode The error status code coming from a Transport implementation
|
|
632
|
-
* @param options containing:
|
|
633
|
-
* - canBeMappedToChildError: enable the mapping of TransportStatusError to an error extending/inheriting from it
|
|
634
|
-
* . Ex: LockedDeviceError. Default to true.
|
|
635
|
-
*/
|
|
636
|
-
constructor(statusCode, { canBeMappedToChildError = true } = {}) {
|
|
637
|
-
const statusText = Object.keys(StatusCodes).find((k) => StatusCodes[k] === statusCode) || "UNKNOWN_ERROR";
|
|
638
|
-
const smsg = getAltStatusMessage(statusCode) || statusText;
|
|
639
|
-
const statusCodeStr = statusCode.toString(16);
|
|
640
|
-
const message = `Ledger device: ${smsg} (0x${statusCodeStr})`;
|
|
641
|
-
super(message);
|
|
642
|
-
this.name = "TransportStatusError";
|
|
643
|
-
this.statusCode = statusCode;
|
|
644
|
-
this.statusText = statusText;
|
|
645
|
-
Object.setPrototypeOf(this, _TransportStatusError.prototype);
|
|
646
|
-
if (canBeMappedToChildError && statusCode === StatusCodes.LOCKED_DEVICE) {
|
|
647
|
-
return new LockedDeviceError(message);
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
};
|
|
651
|
-
var LockedDeviceError = class _LockedDeviceError extends TransportStatusError {
|
|
652
|
-
constructor(message) {
|
|
653
|
-
super(StatusCodes.LOCKED_DEVICE, { canBeMappedToChildError: false });
|
|
654
|
-
if (message) {
|
|
655
|
-
this.message = message;
|
|
656
|
-
}
|
|
657
|
-
this.name = "LockedDeviceError";
|
|
658
|
-
Object.setPrototypeOf(this, _LockedDeviceError.prototype);
|
|
659
|
-
}
|
|
660
|
-
};
|
|
661
|
-
addCustomErrorDeserializer("TransportStatusError", (e) => new TransportStatusError(e.statusCode));
|
|
662
|
-
|
|
663
|
-
// src/device/device-access.ts
|
|
664
|
-
import { Observable, throwError, timer } from "rxjs";
|
|
665
|
-
import { catchError, mergeMap, retryWhen } from "rxjs/operators";
|
|
666
|
-
var initialErrorRemapping = (error) => throwError(
|
|
667
|
-
error && error instanceof TransportStatusError && error.statusCode === 28586 ? new DeviceHalted(error.message) : error instanceof TransportStatusError && error.statusCode === 27392 ? new FirmwareOrAppUpdateRequired(error.message) : error
|
|
668
|
-
);
|
|
669
|
-
var never = new Promise(() => {
|
|
670
|
-
});
|
|
671
|
-
var modules = [];
|
|
672
|
-
var registerTransportModule = (module) => {
|
|
673
|
-
modules.push(module);
|
|
674
|
-
};
|
|
675
|
-
var close = (transport, deviceId) => {
|
|
676
|
-
for (const m of modules) {
|
|
677
|
-
const p = m.close?.(transport, deviceId);
|
|
678
|
-
if (p) return p;
|
|
679
|
-
}
|
|
680
|
-
return transport.close();
|
|
681
|
-
};
|
|
682
|
-
var open = (deviceId) => {
|
|
683
|
-
for (const m of modules) {
|
|
684
|
-
const p = m.open(deviceId);
|
|
685
|
-
if (p) return p;
|
|
686
|
-
}
|
|
687
|
-
return Promise.reject(new Error(`Can't find handler to open ${deviceId}`));
|
|
688
|
-
};
|
|
689
|
-
var transportFinally = (cleanup) => (observable) => (
|
|
690
|
-
// @ts-expect-error typescript not checking against the instanceof
|
|
691
|
-
Observable.create((o) => {
|
|
692
|
-
let done = false;
|
|
693
|
-
const finalize = () => {
|
|
694
|
-
if (done) return never;
|
|
695
|
-
done = true;
|
|
696
|
-
return cleanup();
|
|
697
|
-
};
|
|
698
|
-
const sub = observable.subscribe({
|
|
699
|
-
next: (e) => o.next(e),
|
|
700
|
-
complete: () => {
|
|
701
|
-
void finalize().then(() => o.complete());
|
|
702
|
-
},
|
|
703
|
-
error: (e) => {
|
|
704
|
-
void finalize().then(() => o.error(e));
|
|
705
|
-
}
|
|
706
|
-
});
|
|
707
|
-
return () => {
|
|
708
|
-
sub.unsubscribe();
|
|
709
|
-
void finalize();
|
|
710
|
-
};
|
|
711
|
-
})
|
|
712
|
-
);
|
|
713
|
-
var accessHooks = [];
|
|
714
|
-
var deviceQueues = {};
|
|
715
|
-
var withDevice = (deviceId) => (job) => new Observable((o) => {
|
|
716
|
-
let unsubscribed;
|
|
717
|
-
let sub;
|
|
718
|
-
const deviceQueue = deviceQueues[deviceId] ?? Promise.resolve();
|
|
719
|
-
const finalize = (transport, cleanups) => close(transport, deviceId).catch(() => {
|
|
720
|
-
}).then(() => {
|
|
721
|
-
cleanups.forEach((c) => c());
|
|
722
|
-
});
|
|
723
|
-
let finish;
|
|
724
|
-
deviceQueues[deviceId] = new Promise((resolve) => {
|
|
725
|
-
finish = resolve;
|
|
726
|
-
});
|
|
727
|
-
deviceQueue.then(() => open(deviceId)).then(async (transport) => {
|
|
728
|
-
if (unsubscribed) {
|
|
729
|
-
return finalize(transport, [finish]);
|
|
730
|
-
}
|
|
731
|
-
if (transport.requestConnectionPriority && typeof transport.requestConnectionPriority === "function") {
|
|
732
|
-
await transport.requestConnectionPriority("High");
|
|
733
|
-
}
|
|
734
|
-
return transport;
|
|
735
|
-
}).catch((e) => {
|
|
736
|
-
finish();
|
|
737
|
-
if (e instanceof BluetoothRequired) throw e;
|
|
738
|
-
if (e instanceof TransportWebUSBGestureRequired) throw e;
|
|
739
|
-
if (e instanceof TransportInterfaceNotAvailable) throw e;
|
|
740
|
-
throw new CantOpenDevice(e.message);
|
|
741
|
-
}).then((transport) => {
|
|
742
|
-
if (!transport) return;
|
|
743
|
-
if (unsubscribed) {
|
|
744
|
-
return finalize(transport, [finish]);
|
|
745
|
-
}
|
|
746
|
-
const cleanups = accessHooks.map((hook) => hook());
|
|
747
|
-
sub = job(transport).pipe(
|
|
748
|
-
catchError(initialErrorRemapping),
|
|
749
|
-
// $FlowFixMe
|
|
750
|
-
transportFinally(
|
|
751
|
-
() => (
|
|
752
|
-
// @ts-expect-error typescript not checking against the instanceof
|
|
753
|
-
finalize(transport, [...cleanups, finish])
|
|
754
|
-
)
|
|
755
|
-
)
|
|
756
|
-
).subscribe(o);
|
|
757
|
-
}).catch((error) => o.error(error));
|
|
758
|
-
return () => {
|
|
759
|
-
unsubscribed = true;
|
|
760
|
-
if (sub) sub.unsubscribe();
|
|
761
|
-
};
|
|
762
|
-
});
|
|
763
|
-
var WITH_DEVICE_POLLING_DELAY = 500;
|
|
764
|
-
var retryWhileErrors = (acceptError) => (
|
|
765
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
766
|
-
(attempts) => attempts.pipe(
|
|
767
|
-
mergeMap((error) => {
|
|
768
|
-
if (!acceptError(error)) {
|
|
769
|
-
return throwError(error);
|
|
770
|
-
}
|
|
771
|
-
return timer(WITH_DEVICE_POLLING_DELAY);
|
|
772
|
-
})
|
|
773
|
-
)
|
|
774
|
-
);
|
|
775
|
-
var withDevicePolling = (deviceId) => (job, acceptError = () => false) => withDevice(deviceId)(job).pipe(retryWhen(retryWhileErrors(acceptError)));
|
|
776
|
-
|
|
777
|
-
// src/device/utils.ts
|
|
778
|
-
var isTransportStatusError = (error) => {
|
|
779
|
-
return error instanceof TransportStatusError || error instanceof Error && "statusCode" in error && error.message.startsWith("Ledger device:");
|
|
780
|
-
};
|
|
781
|
-
var CANCEL_STATUS_CODES = [
|
|
782
|
-
27013,
|
|
783
|
-
// cancel on Ledger Blue
|
|
784
|
-
// STAX
|
|
785
|
-
45068,
|
|
786
|
-
// cancel collect wk fragment
|
|
787
|
-
45069,
|
|
788
|
-
// cancel user registration
|
|
789
|
-
45072,
|
|
790
|
-
// cancel review
|
|
791
|
-
45074,
|
|
792
|
-
// cancel master seed generation
|
|
793
|
-
45075,
|
|
794
|
-
// cancel login
|
|
795
|
-
21761
|
|
796
|
-
// cancel openApp
|
|
797
|
-
];
|
|
798
|
-
var isDeviceCancelError = (error) => {
|
|
799
|
-
return isTransportStatusError(error) && CANCEL_STATUS_CODES.includes(error.statusCode);
|
|
800
|
-
};
|
|
801
|
-
|
|
802
|
-
export {
|
|
803
|
-
PATHS,
|
|
804
|
-
STATUS_LENGTH,
|
|
805
|
-
SCRIPT_IDS,
|
|
806
|
-
STR_ROLES,
|
|
807
|
-
APPID_VAULT_ADMINISTRATOR,
|
|
808
|
-
PAGINATED_STATUS,
|
|
809
|
-
STREAMING_RESPONSE,
|
|
810
|
-
STREAMING_NEXT_ACTION,
|
|
811
|
-
createApiDevice,
|
|
812
|
-
DisconnectedDevice,
|
|
813
|
-
LockedDeviceError,
|
|
814
|
-
registerTransportModule,
|
|
815
|
-
withDevicePolling,
|
|
816
|
-
isTransportStatusError,
|
|
817
|
-
isDeviceCancelError
|
|
818
|
-
};
|
|
819
|
-
/* v8 ignore next -- @preserve */
|
|
820
|
-
//# sourceMappingURL=chunk-PFZIW6UP.js.map
|