@onekeyfe/hwk-adapter-core 1.2.2-alpha.8 → 1.2.3-alpha.1
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/dist/chunk-3M3GMF64.mjs +68 -0
- package/dist/chunk-3M3GMF64.mjs.map +1 -0
- package/dist/{chunk-67BP77GT.mjs → chunk-72KOSYTH.mjs} +145 -56
- package/dist/chunk-72KOSYTH.mjs.map +1 -0
- package/dist/chunk-7SFFS2NL.js +68 -0
- package/dist/chunk-7SFFS2NL.js.map +1 -0
- package/dist/{chunk-SK7ZF33J.js → chunk-IZEVYMJK.js} +145 -56
- package/dist/chunk-IZEVYMJK.js.map +1 -0
- package/dist/{chunk-U63HTLGJ.mjs → chunk-KCIK56B5.mjs} +31 -2
- package/dist/chunk-KCIK56B5.mjs.map +1 -0
- package/dist/{chunk-BAGEFFFY.js → chunk-RRCFH7X6.js} +32 -3
- package/dist/chunk-RRCFH7X6.js.map +1 -0
- package/dist/errors-ChA_YEZY.d.mts +296 -0
- package/dist/errors-ChA_YEZY.d.ts +296 -0
- package/dist/errors.d.mts +1 -205
- package/dist/errors.d.ts +1 -205
- package/dist/errors.js +8 -2
- package/dist/errors.js.map +1 -1
- package/dist/errors.mjs +9 -3
- package/dist/index.d.mts +530 -57
- package/dist/index.d.ts +530 -57
- package/dist/index.js +600 -58
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +591 -49
- package/dist/index.mjs.map +1 -1
- package/dist/{ui-events-Cb7haAeE.d.ts → ui-events-BXI9BBpx.d.mts} +19 -3
- package/dist/{ui-events-Cb7haAeE.d.mts → ui-events-BXI9BBpx.d.ts} +19 -3
- package/dist/ui-events.d.mts +1 -1
- package/dist/ui-events.d.ts +1 -1
- package/dist/ui-events.js +3 -2
- package/dist/ui-events.js.map +1 -1
- package/dist/ui-events.mjs +2 -1
- package/package.json +2 -2
- package/dist/chunk-67BP77GT.mjs.map +0 -1
- package/dist/chunk-BAGEFFFY.js.map +0 -1
- package/dist/chunk-SK7ZF33J.js.map +0 -1
- package/dist/chunk-U63HTLGJ.mjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,31 +1,49 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
+
var _chunk7SFFS2NLjs = require('./chunk-7SFFS2NL.js');
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
|
|
6
|
-
var _chunkSK7ZF33Jjs = require('./chunk-SK7ZF33J.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
var _chunkRRCFH7X6js = require('./chunk-RRCFH7X6.js');
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
var _chunkIZEVYMJKjs = require('./chunk-IZEVYMJK.js');
|
|
17
23
|
|
|
18
24
|
// src/types/response.ts
|
|
19
25
|
function success(payload) {
|
|
20
26
|
return { success: true, payload };
|
|
21
27
|
}
|
|
22
|
-
function failure(code, error, params) {
|
|
28
|
+
function failure(code, error, params, origin, recovery) {
|
|
23
29
|
return {
|
|
24
30
|
success: false,
|
|
25
|
-
payload: {
|
|
31
|
+
payload: {
|
|
32
|
+
error,
|
|
33
|
+
code,
|
|
34
|
+
...origin !== void 0 ? { origin } : {},
|
|
35
|
+
recovery: _nullishCoalesce(recovery, () => ( _chunkIZEVYMJKjs.defaultRecoveryForCode.call(void 0, code))),
|
|
36
|
+
...params ? { params } : {}
|
|
37
|
+
}
|
|
26
38
|
};
|
|
27
39
|
}
|
|
28
40
|
|
|
41
|
+
// src/types/device.ts
|
|
42
|
+
function resolveSearchTargetReusePolicy(device) {
|
|
43
|
+
if (_optionalChain([device, 'access', _ => _.capabilities, 'optionalAccess', _2 => _2.persistentDeviceIdentity])) return "reconnectable";
|
|
44
|
+
return "current-discovery";
|
|
45
|
+
}
|
|
46
|
+
|
|
29
47
|
// src/types/fingerprint.ts
|
|
30
48
|
var _sha256 = require('@noble/hashes/sha256');
|
|
31
49
|
var _utils = require('@noble/hashes/utils');
|
|
@@ -35,11 +53,21 @@ var CHAIN_FINGERPRINT_PATHS = {
|
|
|
35
53
|
// Cointype 1 (testnet) is rejected by some Ledger BTC App configurations.
|
|
36
54
|
btc: "m/44'/0'/0'",
|
|
37
55
|
sol: "m/44'/501'/0'",
|
|
38
|
-
tron: "m/44'/195'/0'/0/0"
|
|
56
|
+
tron: "m/44'/195'/0'/0/0",
|
|
57
|
+
// Shielded UA (single Orchard receiver) derived from the transparent path.
|
|
58
|
+
zcash: "m/44'/133'/0'/0/0"
|
|
39
59
|
};
|
|
60
|
+
function parseBip32MasterFingerprint(value) {
|
|
61
|
+
if (typeof value !== "string") return void 0;
|
|
62
|
+
const normalized = value.trim().toLowerCase();
|
|
63
|
+
return /^[0-9a-f]{8}$/.test(normalized) ? normalized : void 0;
|
|
64
|
+
}
|
|
40
65
|
function deriveDeviceFingerprint(value) {
|
|
41
66
|
return _utils.bytesToHex.call(void 0, _sha256.sha256.call(void 0, _utils.utf8ToBytes.call(void 0, value))).slice(0, 16);
|
|
42
67
|
}
|
|
68
|
+
function deriveWalletId(canonicalPublicMaterial) {
|
|
69
|
+
return _utils.bytesToHex.call(void 0, _sha256.sha256.call(void 0, _utils.utf8ToBytes.call(void 0, `onekey-hwk-wallet-id:v1:${canonicalPublicMaterial}`)));
|
|
70
|
+
}
|
|
43
71
|
|
|
44
72
|
// src/events/device.ts
|
|
45
73
|
var DEVICE_EVENT = "DEVICE_EVENT";
|
|
@@ -48,6 +76,10 @@ var DEVICE = {
|
|
|
48
76
|
DISCONNECT: "device-disconnect",
|
|
49
77
|
CHANGED: "device-changed",
|
|
50
78
|
FEATURES: "features",
|
|
79
|
+
/** Trezor transport binding, emitted only after matching the expected firmware device_id. */
|
|
80
|
+
TREZOR_CONNECTION_VERIFIED: "device-trezor-connection-verified",
|
|
81
|
+
/** Ledger BLE address repair, emitted only after matching the stored chain fingerprint. */
|
|
82
|
+
LEDGER_CONNECTION_VERIFIED: "device-ledger-connection-verified",
|
|
51
83
|
/**
|
|
52
84
|
* Trezor-only. Emitted after a successful THP handshake that minted or
|
|
53
85
|
* refreshed pairing credentials. The host should persist `credentials`
|
|
@@ -66,7 +98,8 @@ var SDK = {
|
|
|
66
98
|
DEVICE_STUCK: "device-stuck",
|
|
67
99
|
DEVICE_UNRESPONSIVE: "device-unresponsive",
|
|
68
100
|
DEVICE_RECOVERED: "device-recovered",
|
|
69
|
-
DEVICE_INTERACTION: "device-interaction"
|
|
101
|
+
DEVICE_INTERACTION: "device-interaction",
|
|
102
|
+
INTERACTION_ENDED: "interaction-ended"
|
|
70
103
|
};
|
|
71
104
|
|
|
72
105
|
// src/utils/DeviceJobQueue.ts
|
|
@@ -175,6 +208,236 @@ var DeviceJobQueue = class {
|
|
|
175
208
|
}
|
|
176
209
|
};
|
|
177
210
|
|
|
211
|
+
// src/utils/hardwareRuntimeId.ts
|
|
212
|
+
|
|
213
|
+
var HARDWARE_RUNTIME_ID_PREFIX = "hwk:runtime:v1";
|
|
214
|
+
var RANDOM_ID_BYTES = 16;
|
|
215
|
+
var RANDOM_ID_PATTERN = /^[0-9a-f]{32}$/;
|
|
216
|
+
var VENDORS = /* @__PURE__ */ new Set(["trezor", "ledger", "keystone"]);
|
|
217
|
+
var CONNECTION_TYPES = /* @__PURE__ */ new Set(["usb", "ble", "qr"]);
|
|
218
|
+
function createNonce() {
|
|
219
|
+
return _utils.bytesToHex.call(void 0, _utils.randomBytes.call(void 0, RANDOM_ID_BYTES));
|
|
220
|
+
}
|
|
221
|
+
function createHardwareInteractionId(vendor) {
|
|
222
|
+
return `${HARDWARE_RUNTIME_ID_PREFIX}:interaction:${vendor}:${createNonce()}`;
|
|
223
|
+
}
|
|
224
|
+
function createHardwareSearchTargetId(params) {
|
|
225
|
+
return `${HARDWARE_RUNTIME_ID_PREFIX}:search-target:${params.vendor}:${params.connectionType}:${createNonce()}`;
|
|
226
|
+
}
|
|
227
|
+
function createHardwareConnectorSessionId(params) {
|
|
228
|
+
return `${HARDWARE_RUNTIME_ID_PREFIX}:connector-session:${params.vendor}:${params.connectionType}:${createNonce()}`;
|
|
229
|
+
}
|
|
230
|
+
function hasHardwareRuntimeIdPrefix(value) {
|
|
231
|
+
return typeof value === "string" && value.startsWith(`${HARDWARE_RUNTIME_ID_PREFIX}:`);
|
|
232
|
+
}
|
|
233
|
+
function parseHardwareRuntimeId(value) {
|
|
234
|
+
if (!hasHardwareRuntimeIdPrefix(value)) return void 0;
|
|
235
|
+
const parts = value.split(":");
|
|
236
|
+
const kind = parts[3];
|
|
237
|
+
const vendor = parts[4];
|
|
238
|
+
if (!VENDORS.has(vendor)) return void 0;
|
|
239
|
+
if (kind === "interaction" && parts.length === 6 && RANDOM_ID_PATTERN.test(parts[5])) {
|
|
240
|
+
return {
|
|
241
|
+
kind,
|
|
242
|
+
vendor,
|
|
243
|
+
nonce: parts[5]
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const connectionType = parts[5];
|
|
247
|
+
if ((kind === "search-target" || kind === "connector-session") && parts.length === 7 && CONNECTION_TYPES.has(connectionType) && RANDOM_ID_PATTERN.test(parts[6])) {
|
|
248
|
+
return {
|
|
249
|
+
kind,
|
|
250
|
+
vendor,
|
|
251
|
+
connectionType,
|
|
252
|
+
nonce: parts[6]
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
return void 0;
|
|
256
|
+
}
|
|
257
|
+
function isHardwareInteractionId(value) {
|
|
258
|
+
return _optionalChain([parseHardwareRuntimeId, 'call', _3 => _3(value), 'optionalAccess', _4 => _4.kind]) === "interaction";
|
|
259
|
+
}
|
|
260
|
+
function isHardwareSearchTargetId(value) {
|
|
261
|
+
return _optionalChain([parseHardwareRuntimeId, 'call', _5 => _5(value), 'optionalAccess', _6 => _6.kind]) === "search-target";
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// src/utils/InteractionRegistry.ts
|
|
265
|
+
var INTERACTION_DEFAULT_TTL_MS = 6e5;
|
|
266
|
+
var InteractionRegistry = class {
|
|
267
|
+
constructor(options) {
|
|
268
|
+
this._active = /* @__PURE__ */ new Map();
|
|
269
|
+
this._ended = /* @__PURE__ */ new Map();
|
|
270
|
+
this._vendor = options.vendor;
|
|
271
|
+
this._ttlMs = _nullishCoalesce(options.ttlMs, () => ( INTERACTION_DEFAULT_TTL_MS));
|
|
272
|
+
this._onEnded = options.onEnded;
|
|
273
|
+
}
|
|
274
|
+
create(params) {
|
|
275
|
+
const now = Date.now();
|
|
276
|
+
const interactionId = createHardwareInteractionId(this._vendor);
|
|
277
|
+
const interaction = {
|
|
278
|
+
interactionId,
|
|
279
|
+
searchTargetId: params.searchTargetId,
|
|
280
|
+
connectId: params.connectId,
|
|
281
|
+
device: params.device,
|
|
282
|
+
connectionKeys: Array.from(
|
|
283
|
+
new Set(
|
|
284
|
+
[params.searchTargetId, params.connectId, ..._nullishCoalesce(params.connectionKeys, () => ( []))].filter(
|
|
285
|
+
Boolean
|
|
286
|
+
)
|
|
287
|
+
)
|
|
288
|
+
),
|
|
289
|
+
createdAt: now,
|
|
290
|
+
lastActiveAt: now
|
|
291
|
+
};
|
|
292
|
+
const timer = this._createTimer(interactionId);
|
|
293
|
+
this._active.set(interactionId, { ...interaction, timer, retainCount: 0 });
|
|
294
|
+
return interaction;
|
|
295
|
+
}
|
|
296
|
+
resolve(interactionId) {
|
|
297
|
+
const active = this._active.get(interactionId);
|
|
298
|
+
if (!active) {
|
|
299
|
+
const ended = this._ended.get(interactionId);
|
|
300
|
+
if (ended) {
|
|
301
|
+
throw _chunkIZEVYMJKjs.createHwkError.call(void 0, {
|
|
302
|
+
code: 10113 /* InteractionEnded */,
|
|
303
|
+
message: `Hardware interaction has ended (${ended.reason})`,
|
|
304
|
+
params: { interactionId, reason: ended.reason }
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
throw _chunkIZEVYMJKjs.createHwkError.call(void 0, {
|
|
308
|
+
code: 10112 /* InteractionNotFound */,
|
|
309
|
+
message: "Hardware interaction was not found",
|
|
310
|
+
params: { interactionId }
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
if (active.timer) clearTimeout(active.timer);
|
|
314
|
+
active.lastActiveAt = Date.now();
|
|
315
|
+
active.timer = active.retainCount === 0 ? this._createTimer(interactionId) : void 0;
|
|
316
|
+
return active;
|
|
317
|
+
}
|
|
318
|
+
/** Keep an interaction alive while one device job is actively using it. */
|
|
319
|
+
retain(interactionId) {
|
|
320
|
+
const active = this.resolve(interactionId);
|
|
321
|
+
if (active.timer) clearTimeout(active.timer);
|
|
322
|
+
active.timer = void 0;
|
|
323
|
+
active.retainCount += 1;
|
|
324
|
+
let released = false;
|
|
325
|
+
return () => {
|
|
326
|
+
if (released) return;
|
|
327
|
+
released = true;
|
|
328
|
+
const current = this._active.get(interactionId);
|
|
329
|
+
if (!current) return;
|
|
330
|
+
current.retainCount = Math.max(0, current.retainCount - 1);
|
|
331
|
+
current.lastActiveAt = Date.now();
|
|
332
|
+
if (current.retainCount === 0) {
|
|
333
|
+
current.timer = this._createTimer(interactionId);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/** Return active or tombstoned binding data without refreshing its TTL. */
|
|
338
|
+
find(interactionId) {
|
|
339
|
+
return _nullishCoalesce(this._active.get(interactionId), () => ( _optionalChain([this, 'access', _7 => _7._ended, 'access', _8 => _8.get, 'call', _9 => _9(interactionId), 'optionalAccess', _10 => _10.interaction])));
|
|
340
|
+
}
|
|
341
|
+
findActiveByConnectionKey(connectionKey) {
|
|
342
|
+
if (!connectionKey) return void 0;
|
|
343
|
+
return [...this._active.values()].find(
|
|
344
|
+
(interaction) => interaction.connectionKeys.includes(connectionKey)
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
/** Replace the live transport binding after the same target was reconnected. */
|
|
348
|
+
rebind(interactionId, params) {
|
|
349
|
+
const active = this._active.get(interactionId);
|
|
350
|
+
if (!active) {
|
|
351
|
+
this.resolve(interactionId);
|
|
352
|
+
throw new Error("Unreachable interaction rebind");
|
|
353
|
+
}
|
|
354
|
+
if (active.timer) clearTimeout(active.timer);
|
|
355
|
+
active.connectId = params.connectId;
|
|
356
|
+
active.device = params.device;
|
|
357
|
+
active.connectionKeys = Array.from(
|
|
358
|
+
new Set([params.connectId, ..._nullishCoalesce(params.connectionKeys, () => ( []))].filter(Boolean))
|
|
359
|
+
);
|
|
360
|
+
active.lastActiveAt = Date.now();
|
|
361
|
+
active.timer = active.retainCount === 0 ? this._createTimer(interactionId) : void 0;
|
|
362
|
+
return active;
|
|
363
|
+
}
|
|
364
|
+
end(interactionId, reason) {
|
|
365
|
+
const active = this._active.get(interactionId);
|
|
366
|
+
if (!active) return void 0;
|
|
367
|
+
if (active.timer) clearTimeout(active.timer);
|
|
368
|
+
this._active.delete(interactionId);
|
|
369
|
+
this._rememberEnded(active, reason);
|
|
370
|
+
_optionalChain([this, 'access', _11 => _11._onEnded, 'optionalCall', _12 => _12(active, reason)]);
|
|
371
|
+
return active;
|
|
372
|
+
}
|
|
373
|
+
endByConnectionKey(connectionKey, reason, exceptInteractionId) {
|
|
374
|
+
if (!connectionKey) return;
|
|
375
|
+
for (const interaction of [...this._active.values()]) {
|
|
376
|
+
if (interaction.interactionId === exceptInteractionId) continue;
|
|
377
|
+
if (interaction.connectionKeys.includes(connectionKey)) {
|
|
378
|
+
this.end(interaction.interactionId, reason);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
endAll(reason, exceptInteractionId) {
|
|
383
|
+
for (const interactionId of [...this._active.keys()]) {
|
|
384
|
+
if (interactionId === exceptInteractionId) continue;
|
|
385
|
+
this.end(interactionId, reason);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
_createTimer(interactionId) {
|
|
389
|
+
const timer = setTimeout(() => {
|
|
390
|
+
this.end(interactionId, "timeout");
|
|
391
|
+
}, this._ttlMs);
|
|
392
|
+
_optionalChain([timer, 'access', _13 => _13.unref, 'optionalCall', _14 => _14()]);
|
|
393
|
+
return timer;
|
|
394
|
+
}
|
|
395
|
+
_rememberEnded(interaction, reason) {
|
|
396
|
+
this._ended.set(interaction.interactionId, { reason, interaction });
|
|
397
|
+
if (this._ended.size <= 100) return;
|
|
398
|
+
const oldest = this._ended.keys().next().value;
|
|
399
|
+
if (oldest) this._ended.delete(oldest);
|
|
400
|
+
}
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
// src/utils/hardwareOperationTarget.ts
|
|
404
|
+
function resolveHardwareOperationTarget(positionalTargetId, commonInteractionId, expectedVendor) {
|
|
405
|
+
const normalizedPositionalTargetId = _nullishCoalesce(positionalTargetId, () => ( void 0));
|
|
406
|
+
const normalizedCommonInteractionId = commonInteractionId || void 0;
|
|
407
|
+
const positionalInteractionId = isHardwareInteractionId(normalizedPositionalTargetId) ? normalizedPositionalTargetId : void 0;
|
|
408
|
+
const parsedPositionalTarget = parseHardwareRuntimeId(normalizedPositionalTargetId);
|
|
409
|
+
const parsedCommonInteraction = parseHardwareRuntimeId(normalizedCommonInteractionId);
|
|
410
|
+
if (normalizedPositionalTargetId && hasHardwareRuntimeIdPrefix(normalizedPositionalTargetId) && !parsedPositionalTarget) {
|
|
411
|
+
return failure(10002 /* InvalidParams */, "Invalid hardware operation target id");
|
|
412
|
+
}
|
|
413
|
+
if (_optionalChain([parsedPositionalTarget, 'optionalAccess', _15 => _15.kind]) === "connector-session") {
|
|
414
|
+
return failure(
|
|
415
|
+
10002 /* InvalidParams */,
|
|
416
|
+
"Hardware connector session id cannot be used as an operation target"
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
if (normalizedCommonInteractionId && _optionalChain([parsedCommonInteraction, 'optionalAccess', _16 => _16.kind]) !== "interaction") {
|
|
420
|
+
return failure(10002 /* InvalidParams */, "Invalid hardware interaction id");
|
|
421
|
+
}
|
|
422
|
+
if (expectedVendor && (parsedPositionalTarget && parsedPositionalTarget.vendor !== expectedVendor || parsedCommonInteraction && parsedCommonInteraction.vendor !== expectedVendor)) {
|
|
423
|
+
return failure(
|
|
424
|
+
10002 /* InvalidParams */,
|
|
425
|
+
`Hardware interaction does not belong to ${expectedVendor}`
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
if (positionalInteractionId && normalizedCommonInteractionId && positionalInteractionId !== normalizedCommonInteractionId) {
|
|
429
|
+
return failure(10002 /* InvalidParams */, "Conflicting hardware interaction ids", {
|
|
430
|
+
positionalInteractionId,
|
|
431
|
+
commonInteractionId: normalizedCommonInteractionId
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
const interactionId = _nullishCoalesce(normalizedCommonInteractionId, () => ( positionalInteractionId));
|
|
435
|
+
return success({
|
|
436
|
+
interactionId,
|
|
437
|
+
targetId: _nullishCoalesce(interactionId, () => ( normalizedPositionalTargetId))
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
|
|
178
441
|
// src/types/connector.ts
|
|
179
442
|
var EConnectorInteraction = /* @__PURE__ */ ((EConnectorInteraction2) => {
|
|
180
443
|
EConnectorInteraction2["Searching"] = "searching";
|
|
@@ -190,7 +453,7 @@ function createBridgedConnector(vendor, connectionType, bridge) {
|
|
|
190
453
|
return {
|
|
191
454
|
connectionType,
|
|
192
455
|
searchDevices: (options) => bridge.searchDevices({ vendor, options }),
|
|
193
|
-
connect: (deviceId) => bridge.connect({ vendor, deviceId }),
|
|
456
|
+
connect: (deviceId, options) => bridge.connect({ vendor, deviceId, ...options ? { options } : {} }),
|
|
194
457
|
disconnect: (sessionId) => bridge.disconnect({ vendor, sessionId }),
|
|
195
458
|
call: (sessionId, method, callParams) => bridge.call({ vendor, sessionId, method, callParams }),
|
|
196
459
|
cancel: (sessionId) => bridge.cancel({ vendor, sessionId }),
|
|
@@ -211,14 +474,14 @@ function createBridgedConnector(vendor, connectionType, bridge) {
|
|
|
211
474
|
},
|
|
212
475
|
off: (event, handler) => {
|
|
213
476
|
const inner = handlerMap.get(event);
|
|
214
|
-
const bridgeHandler = _optionalChain([inner, 'optionalAccess',
|
|
477
|
+
const bridgeHandler = _optionalChain([inner, 'optionalAccess', _17 => _17.get, 'call', _18 => _18(handler)]);
|
|
215
478
|
if (!bridgeHandler || !inner) return;
|
|
216
479
|
bridge.offEvent({ vendor }, bridgeHandler);
|
|
217
480
|
inner.delete(handler);
|
|
218
481
|
if (inner.size === 0) handlerMap.delete(event);
|
|
219
482
|
},
|
|
220
483
|
reset: () => bridge.reset({ vendor }),
|
|
221
|
-
configure: bridge.configure ? (config) => _optionalChain([bridge, 'access',
|
|
484
|
+
configure: bridge.configure ? (config) => _optionalChain([bridge, 'access', _19 => _19.configure, 'optionalCall', _20 => _20({ vendor, config })]) : void 0,
|
|
222
485
|
setKnownCredentials: bridge.setKnownCredentials ? (credentials) => bridge.setKnownCredentials({ vendor, credentials }) : void 0
|
|
223
486
|
};
|
|
224
487
|
}
|
|
@@ -287,13 +550,13 @@ function isDeviceUnavailableError(error) {
|
|
|
287
550
|
return false;
|
|
288
551
|
}
|
|
289
552
|
function combinedDeviceNotFoundError(message) {
|
|
290
|
-
return
|
|
553
|
+
return _chunkIZEVYMJKjs.createHwkError.call(void 0, {
|
|
291
554
|
code: 10100 /* DeviceNotFound */,
|
|
292
555
|
message
|
|
293
556
|
});
|
|
294
557
|
}
|
|
295
558
|
function combinedSessionNotFoundError(message) {
|
|
296
|
-
return
|
|
559
|
+
return _chunkIZEVYMJKjs.createHwkError.call(void 0, {
|
|
297
560
|
code: 10101 /* DeviceDisconnected */,
|
|
298
561
|
message
|
|
299
562
|
});
|
|
@@ -322,7 +585,7 @@ function createCombinedConnector(connectors) {
|
|
|
322
585
|
};
|
|
323
586
|
const broadcastCredentials = async () => {
|
|
324
587
|
await Promise.all(
|
|
325
|
-
connectors.map((child) => Promise.resolve(_optionalChain([child, 'access',
|
|
588
|
+
connectors.map((child) => Promise.resolve(_optionalChain([child, 'access', _21 => _21.setKnownCredentials, 'optionalCall', _22 => _22(sharedCredentials)])))
|
|
326
589
|
);
|
|
327
590
|
};
|
|
328
591
|
for (const child of connectors) {
|
|
@@ -331,10 +594,14 @@ function createCombinedConnector(connectors) {
|
|
|
331
594
|
});
|
|
332
595
|
}
|
|
333
596
|
const searchDevices = async (options = {}) => {
|
|
597
|
+
const selectedConnectors = connectors.map((child, index) => ({ child, index })).filter(
|
|
598
|
+
({ child }) => !options.transportType || child.connectionType === options.transportType
|
|
599
|
+
);
|
|
600
|
+
if (!selectedConnectors.length) return [];
|
|
334
601
|
const perConnector = [];
|
|
335
|
-
await new Promise((resolve) => {
|
|
602
|
+
await new Promise((resolve, reject) => {
|
|
336
603
|
let finished = false;
|
|
337
|
-
let remaining =
|
|
604
|
+
let remaining = selectedConnectors.length;
|
|
338
605
|
let settleTimer;
|
|
339
606
|
const finish = () => {
|
|
340
607
|
if (finished) return;
|
|
@@ -342,19 +609,20 @@ function createCombinedConnector(connectors) {
|
|
|
342
609
|
if (settleTimer) clearTimeout(settleTimer);
|
|
343
610
|
resolve();
|
|
344
611
|
};
|
|
345
|
-
|
|
346
|
-
void child.searchDevices().then(
|
|
612
|
+
selectedConnectors.forEach(({ child, index }) => {
|
|
613
|
+
void child.searchDevices(options.purpose ? { purpose: options.purpose } : void 0).then(
|
|
347
614
|
(devices) => devices.map((device) => ({
|
|
348
615
|
...device,
|
|
349
616
|
connectionType: _nullishCoalesce(device.connectionType, () => ( child.connectionType))
|
|
350
617
|
}))
|
|
351
|
-
).catch(
|
|
352
|
-
()
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
618
|
+
).catch((error) => {
|
|
619
|
+
if (options.transportType) {
|
|
620
|
+
finished = true;
|
|
621
|
+
if (settleTimer) clearTimeout(settleTimer);
|
|
622
|
+
reject(error);
|
|
623
|
+
}
|
|
624
|
+
return [];
|
|
625
|
+
}).then((devices) => {
|
|
358
626
|
remaining -= 1;
|
|
359
627
|
if (!finished) {
|
|
360
628
|
perConnector.push({ index, devices });
|
|
@@ -371,7 +639,12 @@ function createCombinedConnector(connectors) {
|
|
|
371
639
|
});
|
|
372
640
|
});
|
|
373
641
|
perConnector.sort((a, b) => a.index - b.index);
|
|
374
|
-
deviceOwner.clear();
|
|
642
|
+
if (!options.transportType) deviceOwner.clear();
|
|
643
|
+
else {
|
|
644
|
+
for (const [id, owner] of deviceOwner) {
|
|
645
|
+
if (owner.connectionType === options.transportType) deviceOwner.delete(id);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
375
648
|
const merged = [];
|
|
376
649
|
perConnector.forEach(({ index, devices }) => {
|
|
377
650
|
for (const device of devices) {
|
|
@@ -381,11 +654,11 @@ function createCombinedConnector(connectors) {
|
|
|
381
654
|
});
|
|
382
655
|
return merged.sort((a, b) => rank(a) - rank(b));
|
|
383
656
|
};
|
|
384
|
-
const resolveOwner = async (deviceId) => {
|
|
385
|
-
if (deviceId && deviceOwner.has(deviceId)) {
|
|
657
|
+
const resolveOwner = async (deviceId, transportType) => {
|
|
658
|
+
if (deviceId && deviceOwner.has(deviceId) && (!transportType || _optionalChain([deviceOwner, 'access', _23 => _23.get, 'call', _24 => _24(deviceId), 'optionalAccess', _25 => _25.connectionType]) === transportType)) {
|
|
386
659
|
return { owner: deviceOwner.get(deviceId), deviceId };
|
|
387
660
|
}
|
|
388
|
-
const devices = await searchDevices({ waitForAll: Boolean(deviceId) });
|
|
661
|
+
const devices = await searchDevices({ waitForAll: Boolean(deviceId), transportType });
|
|
389
662
|
if (deviceId) {
|
|
390
663
|
const owner = deviceOwner.get(deviceId);
|
|
391
664
|
if (!owner)
|
|
@@ -396,13 +669,14 @@ function createCombinedConnector(connectors) {
|
|
|
396
669
|
if (!first) throw combinedDeviceNotFoundError("Combined connector: no devices found");
|
|
397
670
|
return { owner: deviceOwner.get(first.connectId), deviceId: first.connectId };
|
|
398
671
|
};
|
|
399
|
-
const connectByExplicitId = async (deviceId) => {
|
|
672
|
+
const connectByExplicitId = async (deviceId, transportType) => {
|
|
400
673
|
const cachedOwner = deviceOwner.get(deviceId);
|
|
401
|
-
if (cachedOwner) {
|
|
674
|
+
if (cachedOwner && (!transportType || cachedOwner.connectionType === transportType)) {
|
|
402
675
|
return { session: await cachedOwner.connect(deviceId), owner: cachedOwner };
|
|
403
676
|
}
|
|
404
677
|
let lastError;
|
|
405
678
|
for (const child of connectors) {
|
|
679
|
+
if (transportType && child.connectionType !== transportType) continue;
|
|
406
680
|
try {
|
|
407
681
|
const session = await child.connect(deviceId);
|
|
408
682
|
deviceOwner.set(deviceId, child);
|
|
@@ -415,7 +689,7 @@ function createCombinedConnector(connectors) {
|
|
|
415
689
|
}
|
|
416
690
|
}
|
|
417
691
|
const message = lastError instanceof Error ? lastError.message : `Combined connector: device not found: ${deviceId}`;
|
|
418
|
-
throw
|
|
692
|
+
throw _chunkIZEVYMJKjs.createHwkError.call(void 0, {
|
|
419
693
|
code: 10100 /* DeviceNotFound */,
|
|
420
694
|
message
|
|
421
695
|
});
|
|
@@ -424,14 +698,15 @@ function createCombinedConnector(connectors) {
|
|
|
424
698
|
// Nominal value only — the per-device `connectionType` is authoritative
|
|
425
699
|
// for a fused connector.
|
|
426
700
|
connectionType: connectors[0].connectionType,
|
|
427
|
-
|
|
428
|
-
|
|
701
|
+
availableTransports: [...new Set(connectors.map((child) => child.connectionType))],
|
|
702
|
+
searchDevices: (options) => searchDevices(options),
|
|
703
|
+
connect: async (deviceId, options) => {
|
|
429
704
|
let owner;
|
|
430
705
|
let session;
|
|
431
706
|
if (deviceId) {
|
|
432
|
-
({ session, owner } = await connectByExplicitId(deviceId));
|
|
707
|
+
({ session, owner } = await connectByExplicitId(deviceId, _optionalChain([options, 'optionalAccess', _26 => _26.transportType])));
|
|
433
708
|
} else {
|
|
434
|
-
const resolved = await resolveOwner();
|
|
709
|
+
const resolved = await resolveOwner(void 0, _optionalChain([options, 'optionalAccess', _27 => _27.transportType]));
|
|
435
710
|
owner = resolved.owner;
|
|
436
711
|
session = await owner.connect(resolved.deviceId);
|
|
437
712
|
}
|
|
@@ -474,7 +749,7 @@ function createCombinedConnector(connectors) {
|
|
|
474
749
|
},
|
|
475
750
|
off: (event, handler) => {
|
|
476
751
|
const inner = forwarders.get(event);
|
|
477
|
-
const attached = _optionalChain([inner, 'optionalAccess',
|
|
752
|
+
const attached = _optionalChain([inner, 'optionalAccess', _28 => _28.get, 'call', _29 => _29(handler)]);
|
|
478
753
|
if (!attached || !inner) return;
|
|
479
754
|
for (const { child, handler: forward } of attached) {
|
|
480
755
|
child.off(event, forward);
|
|
@@ -489,7 +764,7 @@ function createCombinedConnector(connectors) {
|
|
|
489
764
|
forwarders.clear();
|
|
490
765
|
},
|
|
491
766
|
configure: connectors.some((c) => c.configure) ? async (config) => {
|
|
492
|
-
await Promise.all(connectors.map((child) => Promise.resolve(_optionalChain([child, 'access',
|
|
767
|
+
await Promise.all(connectors.map((child) => Promise.resolve(_optionalChain([child, 'access', _30 => _30.configure, 'optionalCall', _31 => _31(config)]))));
|
|
493
768
|
deviceOwner.clear();
|
|
494
769
|
sessionOwner.clear();
|
|
495
770
|
} : void 0,
|
|
@@ -533,10 +808,134 @@ var TypedEventEmitter = class {
|
|
|
533
808
|
}
|
|
534
809
|
/** Number of listeners registered for `event`. 0 if none. */
|
|
535
810
|
listenerCount(event) {
|
|
536
|
-
return _nullishCoalesce(_optionalChain([this, 'access',
|
|
811
|
+
return _nullishCoalesce(_optionalChain([this, 'access', _32 => _32._listeners, 'access', _33 => _33.get, 'call', _34 => _34(event), 'optionalAccess', _35 => _35.size]), () => ( 0));
|
|
537
812
|
}
|
|
538
813
|
};
|
|
539
814
|
|
|
815
|
+
// src/utils/requestSaveDeviceBinding.ts
|
|
816
|
+
async function requestSaveDeviceBinding(emitter, registry, binding, signal) {
|
|
817
|
+
const type = _chunkRRCFH7X6js.UI_REQUEST.REQUEST_SAVE_DEVICE_BINDING;
|
|
818
|
+
if (!emitter.listenerCount(type)) return false;
|
|
819
|
+
if (_optionalChain([signal, 'optionalAccess', _36 => _36.aborted])) throw signal.reason;
|
|
820
|
+
const requestId = registry.createRequestId();
|
|
821
|
+
const pending = registry.wait(type, { requestId });
|
|
822
|
+
void pending.catch(() => void 0);
|
|
823
|
+
const cancel = () => registry.cancel(type, requestId);
|
|
824
|
+
_optionalChain([signal, 'optionalAccess', _37 => _37.addEventListener, 'call', _38 => _38("abort", cancel, { once: true })]);
|
|
825
|
+
try {
|
|
826
|
+
emitter.emit(type, { type, payload: { ...binding, requestId } });
|
|
827
|
+
const response = await pending;
|
|
828
|
+
if (_optionalChain([signal, 'optionalAccess', _39 => _39.aborted])) throw signal.reason;
|
|
829
|
+
if (_optionalChain([response, 'optionalAccess', _40 => _40.saved]) !== true) {
|
|
830
|
+
throw _chunkIZEVYMJKjs.createHwkError.call(void 0, {
|
|
831
|
+
code: 1e4 /* UnknownError */,
|
|
832
|
+
message: "Verified device binding could not be saved"
|
|
833
|
+
});
|
|
834
|
+
}
|
|
835
|
+
emitter.emit(_chunkRRCFH7X6js.UI_REQUEST.DEVICE_BINDING_STATUS, {
|
|
836
|
+
type: _chunkRRCFH7X6js.UI_REQUEST.DEVICE_BINDING_STATUS,
|
|
837
|
+
payload: { selectionRequestId: binding.selectionRequestId, status: "saved" }
|
|
838
|
+
});
|
|
839
|
+
return true;
|
|
840
|
+
} catch (error) {
|
|
841
|
+
emitter.emit(_chunkRRCFH7X6js.UI_REQUEST.DEVICE_BINDING_STATUS, {
|
|
842
|
+
type: _chunkRRCFH7X6js.UI_REQUEST.DEVICE_BINDING_STATUS,
|
|
843
|
+
payload: {
|
|
844
|
+
selectionRequestId: binding.selectionRequestId,
|
|
845
|
+
status: _optionalChain([signal, 'optionalAccess', _41 => _41.aborted]) ? "cancelled" : "failed"
|
|
846
|
+
}
|
|
847
|
+
});
|
|
848
|
+
throw error;
|
|
849
|
+
} finally {
|
|
850
|
+
_optionalChain([signal, 'optionalAccess', _42 => _42.removeEventListener, 'call', _43 => _43("abort", cancel)]);
|
|
851
|
+
registry.cancel(type, requestId);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
// src/utils/requestBleDeviceSelection.ts
|
|
856
|
+
async function requestBleDeviceSelection({
|
|
857
|
+
emitter,
|
|
858
|
+
registry,
|
|
859
|
+
request,
|
|
860
|
+
scan,
|
|
861
|
+
signal,
|
|
862
|
+
pollIntervalMs = 1500
|
|
863
|
+
}) {
|
|
864
|
+
const type = _chunkRRCFH7X6js.UI_REQUEST.REQUEST_SELECT_DEVICE;
|
|
865
|
+
if (signal.aborted) throw signal.reason;
|
|
866
|
+
if (!emitter.listenerCount(type)) {
|
|
867
|
+
throw _chunkIZEVYMJKjs.createHwkError.call(void 0, {
|
|
868
|
+
code: 10100 /* DeviceNotFound */,
|
|
869
|
+
message: "Select a Bluetooth device before continuing"
|
|
870
|
+
});
|
|
871
|
+
}
|
|
872
|
+
const requestId = registry.createRequestId();
|
|
873
|
+
let { devices } = request;
|
|
874
|
+
let stopped = false;
|
|
875
|
+
let timer;
|
|
876
|
+
let wake;
|
|
877
|
+
const stop = () => {
|
|
878
|
+
stopped = true;
|
|
879
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
880
|
+
_optionalChain([wake, 'optionalCall', _44 => _44()]);
|
|
881
|
+
};
|
|
882
|
+
const waitForNextScan = () => new Promise((resolve) => {
|
|
883
|
+
wake = resolve;
|
|
884
|
+
timer = setTimeout(resolve, pollIntervalMs);
|
|
885
|
+
if (stopped) resolve();
|
|
886
|
+
});
|
|
887
|
+
const cancel = () => registry.cancel(type, requestId);
|
|
888
|
+
const reply = registry.wait(type, { requestId }).finally(stop);
|
|
889
|
+
void reply.catch(() => void 0);
|
|
890
|
+
const publish = () => emitter.emit(type, {
|
|
891
|
+
type,
|
|
892
|
+
payload: { ...request, devices, requestId, scanning: true }
|
|
893
|
+
});
|
|
894
|
+
signal.addEventListener("abort", cancel, { once: true });
|
|
895
|
+
let polling;
|
|
896
|
+
try {
|
|
897
|
+
publish();
|
|
898
|
+
polling = (async () => {
|
|
899
|
+
await Promise.resolve();
|
|
900
|
+
while (!stopped) {
|
|
901
|
+
const snapshot = await scan();
|
|
902
|
+
if (stopped || signal.aborted) return;
|
|
903
|
+
devices = snapshot;
|
|
904
|
+
publish();
|
|
905
|
+
if (stopped) return;
|
|
906
|
+
await waitForNextScan();
|
|
907
|
+
}
|
|
908
|
+
})();
|
|
909
|
+
const selected = await Promise.race([reply, polling.then(() => reply)]);
|
|
910
|
+
stop();
|
|
911
|
+
await polling;
|
|
912
|
+
if (signal.aborted) throw signal.reason;
|
|
913
|
+
const device = devices.find((candidate) => candidate.connectId === selected.sdkConnectId);
|
|
914
|
+
if (!device) {
|
|
915
|
+
throw _chunkIZEVYMJKjs.createHwkError.call(void 0, {
|
|
916
|
+
code: 10100 /* DeviceNotFound */,
|
|
917
|
+
message: "Selected Bluetooth device is no longer available"
|
|
918
|
+
});
|
|
919
|
+
}
|
|
920
|
+
emitter.emit(_chunkRRCFH7X6js.UI_REQUEST.DEVICE_BINDING_STATUS, {
|
|
921
|
+
type: _chunkRRCFH7X6js.UI_REQUEST.DEVICE_BINDING_STATUS,
|
|
922
|
+
payload: { selectionRequestId: requestId, status: "verifying" }
|
|
923
|
+
});
|
|
924
|
+
return { device, requestId };
|
|
925
|
+
} catch (error) {
|
|
926
|
+
emitter.emit(_chunkRRCFH7X6js.UI_REQUEST.DEVICE_BINDING_STATUS, {
|
|
927
|
+
type: _chunkRRCFH7X6js.UI_REQUEST.DEVICE_BINDING_STATUS,
|
|
928
|
+
payload: { selectionRequestId: requestId, status: signal.aborted ? "cancelled" : "failed" }
|
|
929
|
+
});
|
|
930
|
+
throw error;
|
|
931
|
+
} finally {
|
|
932
|
+
stop();
|
|
933
|
+
signal.removeEventListener("abort", cancel);
|
|
934
|
+
registry.cancel(type, requestId);
|
|
935
|
+
await _optionalChain([polling, 'optionalAccess', _45 => _45.catch, 'call', _46 => _46(() => void 0)]);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
|
|
540
939
|
// src/utils/semver.ts
|
|
541
940
|
function compareSemver(a, b) {
|
|
542
941
|
const pa = a.split(".").map(Number);
|
|
@@ -564,15 +963,97 @@ function padHex64(hex) {
|
|
|
564
963
|
function hexToBytes(hex) {
|
|
565
964
|
return _utils.hexToBytes.call(void 0, stripHex(hex));
|
|
566
965
|
}
|
|
567
|
-
function
|
|
966
|
+
function bytesToHex3(bytes) {
|
|
568
967
|
return _utils.bytesToHex.call(void 0, bytes);
|
|
569
968
|
}
|
|
570
969
|
|
|
970
|
+
// src/utils/solanaOffchainMessage.ts
|
|
971
|
+
var SOLANA_OFFCHAIN_SIGNING_DOMAIN = Uint8Array.of(
|
|
972
|
+
255,
|
|
973
|
+
...Array.from("solana offchain", (character) => character.charCodeAt(0))
|
|
974
|
+
);
|
|
975
|
+
var SOLANA_PUBLIC_KEY_LENGTH = 32;
|
|
976
|
+
var MAX_SOLANA_OFFCHAIN_SIGNERS = 255;
|
|
977
|
+
function compareBytes(a, b) {
|
|
978
|
+
for (let index = 0; index < a.length; index += 1) {
|
|
979
|
+
const difference = (_nullishCoalesce(a[index], () => ( 0))) - (_nullishCoalesce(b[index], () => ( 0)));
|
|
980
|
+
if (difference !== 0) return difference;
|
|
981
|
+
}
|
|
982
|
+
return a.length - b.length;
|
|
983
|
+
}
|
|
984
|
+
function bytesEqual(a, b) {
|
|
985
|
+
return a.length === b.length && a.every((value, index) => value === b[index]);
|
|
986
|
+
}
|
|
987
|
+
function decodeUtf8Strict(bytes) {
|
|
988
|
+
let encoded = "";
|
|
989
|
+
for (const value of bytes) {
|
|
990
|
+
encoded += `%${value.toString(16).padStart(2, "0")}`;
|
|
991
|
+
}
|
|
992
|
+
return decodeURIComponent(encoded);
|
|
993
|
+
}
|
|
994
|
+
function prepareSolanaOffchainMessageV1({
|
|
995
|
+
message,
|
|
996
|
+
requiredSigners
|
|
997
|
+
}) {
|
|
998
|
+
if (message.length === 0) {
|
|
999
|
+
throw new Error("Solana off-chain message cannot be empty");
|
|
1000
|
+
}
|
|
1001
|
+
if (requiredSigners.length === 0 || requiredSigners.length > MAX_SOLANA_OFFCHAIN_SIGNERS) {
|
|
1002
|
+
throw new Error("Solana off-chain message requires between 1 and 255 signers");
|
|
1003
|
+
}
|
|
1004
|
+
let messageText;
|
|
1005
|
+
try {
|
|
1006
|
+
messageText = decodeUtf8Strict(message);
|
|
1007
|
+
} catch (e3) {
|
|
1008
|
+
throw new Error("Solana off-chain message must contain valid UTF-8");
|
|
1009
|
+
}
|
|
1010
|
+
const signerBytes = requiredSigners.map((signer, index) => {
|
|
1011
|
+
let bytes;
|
|
1012
|
+
try {
|
|
1013
|
+
bytes = hexToBytes(signer);
|
|
1014
|
+
} catch (e4) {
|
|
1015
|
+
throw new Error(`Solana off-chain signer ${index} must be a hex public key`);
|
|
1016
|
+
}
|
|
1017
|
+
if (bytes.length !== SOLANA_PUBLIC_KEY_LENGTH) {
|
|
1018
|
+
throw new Error(`Solana off-chain signer ${index} must be 32 bytes`);
|
|
1019
|
+
}
|
|
1020
|
+
return bytes;
|
|
1021
|
+
});
|
|
1022
|
+
signerBytes.sort(compareBytes);
|
|
1023
|
+
for (let index = 1; index < signerBytes.length; index += 1) {
|
|
1024
|
+
if (bytesEqual(signerBytes[index - 1], signerBytes[index])) {
|
|
1025
|
+
throw new Error("Solana off-chain signers must be unique");
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
const serializedMessage = new Uint8Array(
|
|
1029
|
+
SOLANA_OFFCHAIN_SIGNING_DOMAIN.length + 2 + signerBytes.length * SOLANA_PUBLIC_KEY_LENGTH + message.length
|
|
1030
|
+
);
|
|
1031
|
+
let offset = 0;
|
|
1032
|
+
serializedMessage.set(SOLANA_OFFCHAIN_SIGNING_DOMAIN, offset);
|
|
1033
|
+
offset += SOLANA_OFFCHAIN_SIGNING_DOMAIN.length;
|
|
1034
|
+
serializedMessage[offset] = 1;
|
|
1035
|
+
offset += 1;
|
|
1036
|
+
serializedMessage[offset] = signerBytes.length;
|
|
1037
|
+
offset += 1;
|
|
1038
|
+
for (const signer of signerBytes) {
|
|
1039
|
+
serializedMessage.set(signer, offset);
|
|
1040
|
+
offset += SOLANA_PUBLIC_KEY_LENGTH;
|
|
1041
|
+
}
|
|
1042
|
+
serializedMessage.set(message, offset);
|
|
1043
|
+
return {
|
|
1044
|
+
messageText,
|
|
1045
|
+
requiredSigners: signerBytes.map(bytesToHex3),
|
|
1046
|
+
serializedMessage
|
|
1047
|
+
};
|
|
1048
|
+
}
|
|
1049
|
+
|
|
571
1050
|
// src/utils/deviceIdentity.ts
|
|
572
1051
|
var ONEKEY_BLE_SERVICE_UUID = "00000001-0000-1000-8000-00805f9b34fb";
|
|
573
1052
|
var TREZOR_BLE_SERVICE_UUID = "8c000001-a59b-4d58-a9ad-073df69fa1b1";
|
|
574
1053
|
var LEDGER_USB_VENDOR_ID = 11415;
|
|
575
|
-
var
|
|
1054
|
+
var KEYSTONE_USB_VENDOR_ID = 4617;
|
|
1055
|
+
var KEYSTONE_USB_PRODUCT_ID = 12289;
|
|
1056
|
+
var lower = (value) => _nullishCoalesce(_optionalChain([value, 'optionalAccess', _47 => _47.trim, 'call', _48 => _48(), 'access', _49 => _49.toLowerCase, 'call', _50 => _50()]), () => ( ""));
|
|
576
1057
|
var hasServiceUuid = (input, uuid) => {
|
|
577
1058
|
const expected = uuid.toLowerCase();
|
|
578
1059
|
const values = [
|
|
@@ -594,6 +1075,11 @@ function detectHardwareVendorFromDescriptor(input) {
|
|
|
594
1075
|
if (typeof input.vendor === "number" && input.vendor === LEDGER_USB_VENDOR_ID || input.vendorId === LEDGER_USB_VENDOR_ID || manufacturerName.includes("ledger")) {
|
|
595
1076
|
return "ledger";
|
|
596
1077
|
}
|
|
1078
|
+
const usbVendorId = typeof input.vendor === "number" ? input.vendor : input.vendorId;
|
|
1079
|
+
const usbProductId = typeof input.product === "number" ? input.product : input.productId;
|
|
1080
|
+
if (usbVendorId === KEYSTONE_USB_VENDOR_ID && usbProductId === KEYSTONE_USB_PRODUCT_ID || manufacturerName.includes("keystone")) {
|
|
1081
|
+
return "keystone";
|
|
1082
|
+
}
|
|
597
1083
|
return void 0;
|
|
598
1084
|
}
|
|
599
1085
|
function isKnownNonTargetHardwareVendor(input, targetVendor) {
|
|
@@ -610,35 +1096,69 @@ async function batchCall(params, callFn, onProgress) {
|
|
|
610
1096
|
return result;
|
|
611
1097
|
}
|
|
612
1098
|
results.push(result.payload);
|
|
613
|
-
_optionalChain([onProgress, 'optionalCall',
|
|
1099
|
+
_optionalChain([onProgress, 'optionalCall', _51 => _51({ index: i, total: params.length })]);
|
|
614
1100
|
}
|
|
615
1101
|
return { success: true, payload: results };
|
|
616
1102
|
}
|
|
617
1103
|
|
|
618
1104
|
// src/utils/methodCatalog.ts
|
|
619
1105
|
var HARDWARE_METHOD_CATALOG = {
|
|
620
|
-
evmGetAddress: { chain: "evm", allNetwork: true },
|
|
621
|
-
evmSignTransaction: {
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
1106
|
+
evmGetAddress: { chain: "evm", allNetwork: true, replayAfterTransportFailure: "safe" },
|
|
1107
|
+
evmSignTransaction: {
|
|
1108
|
+
chain: "evm",
|
|
1109
|
+
allNetwork: false,
|
|
1110
|
+
replayAfterTransportFailure: "unsafe"
|
|
1111
|
+
},
|
|
1112
|
+
evmSignMessage: { chain: "evm", allNetwork: false, replayAfterTransportFailure: "unsafe" },
|
|
1113
|
+
evmSignTypedData: { chain: "evm", allNetwork: false, replayAfterTransportFailure: "unsafe" },
|
|
1114
|
+
btcGetAddress: { chain: "btc", allNetwork: true, replayAfterTransportFailure: "safe" },
|
|
1115
|
+
btcGetPublicKey: { chain: "btc", allNetwork: true, replayAfterTransportFailure: "safe" },
|
|
1116
|
+
btcSignTransaction: {
|
|
1117
|
+
chain: "btc",
|
|
1118
|
+
allNetwork: false,
|
|
1119
|
+
replayAfterTransportFailure: "unsafe"
|
|
1120
|
+
},
|
|
1121
|
+
btcSignPsbt: { chain: "btc", allNetwork: false, replayAfterTransportFailure: "unsafe" },
|
|
1122
|
+
btcSignMessage: { chain: "btc", allNetwork: false, replayAfterTransportFailure: "unsafe" },
|
|
1123
|
+
btcGetMasterFingerprint: {
|
|
1124
|
+
chain: "btc",
|
|
1125
|
+
allNetwork: false,
|
|
1126
|
+
replayAfterTransportFailure: "safe"
|
|
1127
|
+
},
|
|
1128
|
+
solGetAddress: { chain: "sol", allNetwork: true, replayAfterTransportFailure: "safe" },
|
|
1129
|
+
solSignTransaction: {
|
|
1130
|
+
chain: "sol",
|
|
1131
|
+
allNetwork: false,
|
|
1132
|
+
replayAfterTransportFailure: "unsafe"
|
|
1133
|
+
},
|
|
1134
|
+
solSignMessage: { chain: "sol", allNetwork: false, replayAfterTransportFailure: "unsafe" },
|
|
1135
|
+
tronGetAddress: { chain: "tron", allNetwork: true, replayAfterTransportFailure: "safe" },
|
|
1136
|
+
tronSignTransaction: {
|
|
1137
|
+
chain: "tron",
|
|
1138
|
+
allNetwork: false,
|
|
1139
|
+
replayAfterTransportFailure: "unsafe"
|
|
1140
|
+
},
|
|
1141
|
+
tronSignMessage: { chain: "tron", allNetwork: false, replayAfterTransportFailure: "unsafe" },
|
|
1142
|
+
zcashGetFullViewingKey: {
|
|
1143
|
+
chain: "zcash",
|
|
1144
|
+
allNetwork: false,
|
|
1145
|
+
replayAfterTransportFailure: "safe"
|
|
1146
|
+
},
|
|
1147
|
+
zcashGetShieldedAddress: {
|
|
1148
|
+
chain: "zcash",
|
|
1149
|
+
allNetwork: false,
|
|
1150
|
+
replayAfterTransportFailure: "safe"
|
|
1151
|
+
}
|
|
636
1152
|
};
|
|
637
1153
|
var ALL_NETWORK_METHOD_NAMES = Object.entries(HARDWARE_METHOD_CATALOG).filter(([, metadata]) => metadata.allNetwork).map(([method]) => method);
|
|
638
1154
|
var ALL_NETWORK_METHOD_SET = new Set(ALL_NETWORK_METHOD_NAMES);
|
|
639
1155
|
function getHardwareMethodMetadata(method) {
|
|
640
1156
|
return HARDWARE_METHOD_CATALOG[method];
|
|
641
1157
|
}
|
|
1158
|
+
var SAFE_NON_CHAIN_METHODS = /* @__PURE__ */ new Set(["getFeatures", "authenticateDevice"]);
|
|
1159
|
+
function canReplayHardwareMethodAfterTransportFailure(method) {
|
|
1160
|
+
return _optionalChain([getHardwareMethodMetadata, 'call', _52 => _52(method), 'optionalAccess', _53 => _53.replayAfterTransportFailure]) === "safe" || SAFE_NON_CHAIN_METHODS.has(method);
|
|
1161
|
+
}
|
|
642
1162
|
function isAllNetworkMethodName(method) {
|
|
643
1163
|
return ALL_NETWORK_METHOD_SET.has(method);
|
|
644
1164
|
}
|
|
@@ -666,7 +1186,7 @@ async function runAllNetworkGetAddress({
|
|
|
666
1186
|
continue;
|
|
667
1187
|
}
|
|
668
1188
|
const method = item.methodName;
|
|
669
|
-
const unsupportedNetwork = _optionalChain([buildUnsupportedNetworkResponse, 'optionalCall',
|
|
1189
|
+
const unsupportedNetwork = _optionalChain([buildUnsupportedNetworkResponse, 'optionalCall', _54 => _54(item, method)]);
|
|
670
1190
|
if (unsupportedNetwork) {
|
|
671
1191
|
responses.push(unsupportedNetwork);
|
|
672
1192
|
continue;
|
|
@@ -766,5 +1286,27 @@ var DEVICE_CONNECT_RETRY_DELAY_MS = 1e3;
|
|
|
766
1286
|
|
|
767
1287
|
|
|
768
1288
|
|
|
769
|
-
|
|
1289
|
+
|
|
1290
|
+
|
|
1291
|
+
|
|
1292
|
+
|
|
1293
|
+
|
|
1294
|
+
|
|
1295
|
+
|
|
1296
|
+
|
|
1297
|
+
|
|
1298
|
+
|
|
1299
|
+
|
|
1300
|
+
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
|
|
1306
|
+
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
exports.ALL_NETWORK_METHOD_NAMES = ALL_NETWORK_METHOD_NAMES; exports.CHAIN_FINGERPRINT_PATHS = CHAIN_FINGERPRINT_PATHS; exports.DEVICE = DEVICE; exports.DEVICE_CONNECT_RETRY_DELAY_MS = DEVICE_CONNECT_RETRY_DELAY_MS; exports.DEVICE_EVENT = DEVICE_EVENT; exports.DeviceJobQueue = DeviceJobQueue; exports.EConnectorInteraction = EConnectorInteraction; exports.HARDWARE_METHOD_CATALOG = HARDWARE_METHOD_CATALOG; exports.HARDWARE_RUNTIME_ID_PREFIX = HARDWARE_RUNTIME_ID_PREFIX; exports.HardwareErrorCode = _chunkIZEVYMJKjs.HardwareErrorCode; exports.INTERACTION_DEFAULT_TTL_MS = INTERACTION_DEFAULT_TTL_MS; exports.InteractionRegistry = InteractionRegistry; exports.ORPHAN_ELIGIBLE_ERROR_CODES = _chunkIZEVYMJKjs.ORPHAN_ELIGIBLE_ERROR_CODES; exports.SDK = SDK; exports.TypedEventEmitter = TypedEventEmitter; exports.UI_EVENT = _chunkRRCFH7X6js.UI_EVENT; exports.UI_REQUEST = _chunkRRCFH7X6js.UI_REQUEST; exports.UI_REQUEST_CANCELLED_TAG = _chunkRRCFH7X6js.UI_REQUEST_CANCELLED_TAG; exports.UI_REQUEST_DEFAULT_TIMEOUT_MS = _chunkRRCFH7X6js.UI_REQUEST_DEFAULT_TIMEOUT_MS; exports.UI_REQUEST_PREEMPTED_TAG = _chunkRRCFH7X6js.UI_REQUEST_PREEMPTED_TAG; exports.UI_REQUEST_TIMEOUT_TAG = _chunkRRCFH7X6js.UI_REQUEST_TIMEOUT_TAG; exports.UI_RESPONSE = _chunkRRCFH7X6js.UI_RESPONSE; exports.UiRequestRegistry = _chunkRRCFH7X6js.UiRequestRegistry; exports.batchCall = batchCall; exports.buildUnsupportedMethodResponse = buildUnsupportedMethodResponse; exports.bytesToHex = bytesToHex3; exports.canReplayHardwareMethodAfterTransportFailure = canReplayHardwareMethodAfterTransportFailure; exports.compareSemver = compareSemver; exports.createBridgedConnector = createBridgedConnector; exports.createCombinedConnector = createCombinedConnector; exports.createHardwareConnectorSessionId = createHardwareConnectorSessionId; exports.createHardwareInteractionId = createHardwareInteractionId; exports.createHardwareSearchTargetId = createHardwareSearchTargetId; exports.createHwkError = _chunkIZEVYMJKjs.createHwkError; exports.defaultOriginForCode = _chunkIZEVYMJKjs.defaultOriginForCode; exports.defaultRecoveryForCode = _chunkIZEVYMJKjs.defaultRecoveryForCode; exports.deriveDeviceFingerprint = deriveDeviceFingerprint; exports.deriveWalletId = deriveWalletId; exports.detectHardwareVendorFromDescriptor = detectHardwareVendorFromDescriptor; exports.enrichErrorMessage = _chunk7SFFS2NLjs.enrichErrorMessage; exports.ensure0x = ensure0x; exports.failure = failure; exports.getAllNetworkMethodChain = getAllNetworkMethodChain; exports.getHardwareMethodMetadata = getHardwareMethodMetadata; exports.hasHardwareRuntimeIdPrefix = hasHardwareRuntimeIdPrefix; exports.hexToBytes = hexToBytes; exports.isAllNetworkMethodName = isAllNetworkMethodName; exports.isHardwareInteractionId = isHardwareInteractionId; exports.isHardwareSearchTargetId = isHardwareSearchTargetId; exports.isHwkRecoveryHint = _chunkIZEVYMJKjs.isHwkRecoveryHint; exports.isKnownNonTargetHardwareVendor = isKnownNonTargetHardwareVendor; exports.operationMayHaveCompletedParams = _chunkIZEVYMJKjs.operationMayHaveCompletedParams; exports.padHex64 = padHex64; exports.parseBip32MasterFingerprint = parseBip32MasterFingerprint; exports.parseHardwareRuntimeId = parseHardwareRuntimeId; exports.prepareSolanaOffchainMessageV1 = prepareSolanaOffchainMessageV1; exports.rehydrateConnectorError = rehydrateConnectorError; exports.requestBleDeviceSelection = requestBleDeviceSelection; exports.requestSaveDeviceBinding = requestSaveDeviceBinding; exports.resolveHardwareOperationTarget = resolveHardwareOperationTarget; exports.resolveSearchTargetReusePolicy = resolveSearchTargetReusePolicy; exports.runAllNetworkGetAddress = runAllNetworkGetAddress; exports.serializeConnectorError = serializeConnectorError; exports.stripHex = stripHex; exports.success = success;
|
|
770
1312
|
//# sourceMappingURL=index.js.map
|