@onekeyfe/hwk-adapter-core 1.1.26-alpha.9 → 1.1.27-alpha.30
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/index.d.mts +153 -122
- package/dist/index.d.ts +153 -122
- package/dist/index.js +102 -115
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +101 -115
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ declare enum HardwareErrorCode {
|
|
|
27
27
|
InvalidParams = 10002,
|
|
28
28
|
OperationTimeout = 10003,
|
|
29
29
|
MethodNotSupported = 10004,
|
|
30
|
+
/** User dismissed in-app cancel UI. Distinct from UserRejected (on-device). */
|
|
31
|
+
UserAborted = 10005,
|
|
30
32
|
DeviceNotFound = 10100,
|
|
31
33
|
DeviceDisconnected = 10101,
|
|
32
34
|
DeviceBusy = 10102,
|
|
@@ -34,6 +36,10 @@ declare enum HardwareErrorCode {
|
|
|
34
36
|
DeviceNotInitialized = 10104,
|
|
35
37
|
DeviceInBootloader = 10105,
|
|
36
38
|
DeviceMismatch = 10106,
|
|
39
|
+
/** Chain app wedged (e.g. Ledger BTC 0x6901). User must exit app on device. */
|
|
40
|
+
DeviceAppStuck = 10107,
|
|
41
|
+
/** Vendor (Ledger / Trezor) doesn't support the chain at all. */
|
|
42
|
+
ChainNotSupported = 10108,
|
|
37
43
|
FirmwareTooOld = 10200,
|
|
38
44
|
FirmwareUpdateRequired = 10201,
|
|
39
45
|
TransportError = 10300,
|
|
@@ -45,10 +51,19 @@ declare enum HardwareErrorCode {
|
|
|
45
51
|
* permission" toast and let the user retry manually.
|
|
46
52
|
*/
|
|
47
53
|
DevicePermissionDenied = 10303,
|
|
54
|
+
/**
|
|
55
|
+
* BLE SMP pairing did not complete within the GATT bonding window.
|
|
56
|
+
* GATT connected but the device didn't acknowledge SMP — typically
|
|
57
|
+
* because the user didn't confirm the passkey on the device, or the
|
|
58
|
+
* device went out of range mid-pairing. Distinct from OperationTimeout
|
|
59
|
+
* (generic) and from DeviceLocked (Secure Element actually locked).
|
|
60
|
+
*/
|
|
61
|
+
BlePairingTimeout = 10304,
|
|
48
62
|
PinInvalid = 10400,
|
|
49
63
|
PinCancelled = 10401,
|
|
50
64
|
PassphraseRejected = 10402,
|
|
51
|
-
|
|
65
|
+
/** Chain app NOT INSTALLED on device. User must install via Ledger Live. */
|
|
66
|
+
AppNotInstalled = 10500,
|
|
52
67
|
WrongApp = 10501,
|
|
53
68
|
/** 0x911c Command code not supported — app predates current SDK. */
|
|
54
69
|
AppTooOld = 10502,
|
|
@@ -74,6 +89,18 @@ declare enum HardwareErrorCode {
|
|
|
74
89
|
/** 0xb007 Aborted due to unexpected state (malformed PSBT / missing UTXO). */
|
|
75
90
|
BtcUnexpectedState = 11301
|
|
76
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Device-level failures the SDK cannot self-recover from — affect the entire
|
|
94
|
+
* batch (vs per-chain failures like AppNotInstalled / WrongApp which soft-
|
|
95
|
+
* skip in onboarding). Combined with `accounts.length === 0`, signals
|
|
96
|
+
* genuine orphan. Also reused as the batch-abort whitelist for HWK.
|
|
97
|
+
* Single source of truth.
|
|
98
|
+
*
|
|
99
|
+
* UserRejected (device-side reject) is included: pressing reject is an
|
|
100
|
+
* explicit "I don't consent" — continuing the batch to ask again on the
|
|
101
|
+
* next chain is harassment, not helpful.
|
|
102
|
+
*/
|
|
103
|
+
declare const ORPHAN_ELIGIBLE_ERROR_CODES: number[];
|
|
77
104
|
|
|
78
105
|
interface Success<T> {
|
|
79
106
|
success: true;
|
|
@@ -84,11 +111,12 @@ interface Failure {
|
|
|
84
111
|
payload: {
|
|
85
112
|
error: string;
|
|
86
113
|
code: HardwareErrorCode;
|
|
114
|
+
params?: Record<string, unknown>;
|
|
87
115
|
};
|
|
88
116
|
}
|
|
89
117
|
type Response<T> = Success<T> | Failure;
|
|
90
118
|
declare function success<T>(payload: T): Success<T>;
|
|
91
|
-
declare function failure(code: HardwareErrorCode, error: string): Failure;
|
|
119
|
+
declare function failure(code: HardwareErrorCode, error: string, params?: Record<string, unknown>): Failure;
|
|
92
120
|
|
|
93
121
|
type VendorType = 'trezor' | 'ledger';
|
|
94
122
|
type ConnectionType = 'usb' | 'ble';
|
|
@@ -211,13 +239,8 @@ interface EvmSignature {
|
|
|
211
239
|
signature: string;
|
|
212
240
|
address?: string;
|
|
213
241
|
}
|
|
214
|
-
type ProgressCallback = (progress: {
|
|
215
|
-
index: number;
|
|
216
|
-
total: number;
|
|
217
|
-
}) => void;
|
|
218
242
|
interface IEvmMethods {
|
|
219
243
|
evmGetAddress(connectId: string, deviceId: string, params: EvmGetAddressParams): Promise<Response<EvmAddress>>;
|
|
220
|
-
evmGetAddresses(connectId: string, deviceId: string, params: EvmGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<EvmAddress[]>>;
|
|
221
244
|
evmSignTransaction(connectId: string, deviceId: string, params: EvmSignTxParams): Promise<Response<EvmSignedTx>>;
|
|
222
245
|
evmSignMessage(connectId: string, deviceId: string, params: EvmSignMsgParams): Promise<Response<EvmSignature>>;
|
|
223
246
|
evmSignTypedData(connectId: string, deviceId: string, params: EvmSignTypedDataParams): Promise<Response<EvmSignature>>;
|
|
@@ -316,7 +339,6 @@ interface BtcSignature {
|
|
|
316
339
|
}
|
|
317
340
|
interface IBtcMethods {
|
|
318
341
|
btcGetAddress(connectId: string, deviceId: string, params: BtcGetAddressParams): Promise<Response<BtcAddress>>;
|
|
319
|
-
btcGetAddresses(connectId: string, deviceId: string, params: BtcGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<BtcAddress[]>>;
|
|
320
342
|
btcGetPublicKey(connectId: string, deviceId: string, params: BtcGetPublicKeyParams): Promise<Response<BtcPublicKey>>;
|
|
321
343
|
btcSignTransaction(connectId: string, deviceId: string, params: BtcSignTxParams): Promise<Response<BtcSignedTx>>;
|
|
322
344
|
btcSignPsbt(connectId: string, deviceId: string, params: BtcSignPsbtParams): Promise<Response<BtcSignedPsbt>>;
|
|
@@ -363,7 +385,6 @@ interface SolSignature {
|
|
|
363
385
|
}
|
|
364
386
|
interface ISolMethods {
|
|
365
387
|
solGetAddress(connectId: string, deviceId: string, params: SolGetAddressParams): Promise<Response<SolAddress>>;
|
|
366
|
-
solGetAddresses(connectId: string, deviceId: string, params: SolGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<SolAddress[]>>;
|
|
367
388
|
solSignTransaction(connectId: string, deviceId: string, params: SolSignTxParams): Promise<Response<SolSignedTx>>;
|
|
368
389
|
solSignMessage(connectId: string, deviceId: string, params: SolSignMsgParams): Promise<Response<SolSignature>>;
|
|
369
390
|
}
|
|
@@ -397,7 +418,6 @@ interface TronSignature {
|
|
|
397
418
|
}
|
|
398
419
|
interface ITronMethods {
|
|
399
420
|
tronGetAddress(connectId: string, deviceId: string, params: TronGetAddressParams): Promise<Response<TronAddress>>;
|
|
400
|
-
tronGetAddresses(connectId: string, deviceId: string, params: TronGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<TronAddress[]>>;
|
|
401
421
|
tronSignTransaction(connectId: string, deviceId: string, params: TronSignTxParams): Promise<Response<TronSignedTx>>;
|
|
402
422
|
tronSignMessage(connectId: string, deviceId: string, params: TronSignMsgParams): Promise<Response<TronSignature>>;
|
|
403
423
|
}
|
|
@@ -438,90 +458,6 @@ declare const DEVICE: {
|
|
|
438
458
|
readonly CHANGED: "device-changed";
|
|
439
459
|
};
|
|
440
460
|
|
|
441
|
-
/** 10 min — every UI request is human-in-the-loop; bias toward "wait long". */
|
|
442
|
-
declare const UI_REQUEST_DEFAULT_TIMEOUT_MS = 600000;
|
|
443
|
-
declare const UI_REQUEST_PREEMPTED_TAG = "UiRequestPreempted";
|
|
444
|
-
declare const UI_REQUEST_CANCELLED_TAG = "UiRequestCancelled";
|
|
445
|
-
declare const UI_REQUEST_TIMEOUT_TAG = "UiRequestTimeout";
|
|
446
|
-
/**
|
|
447
|
-
* Per-type single-slot registry for adapter-level UI requests. A new `wait`
|
|
448
|
-
* of the same type preempts (rejects) the prior one. Unknown response types
|
|
449
|
-
* are dropped silently so the public `uiResponse` entry never throws.
|
|
450
|
-
*/
|
|
451
|
-
declare class UiRequestRegistry {
|
|
452
|
-
private pending;
|
|
453
|
-
wait<T = unknown>(requestType: string, options?: {
|
|
454
|
-
timeoutMs?: number;
|
|
455
|
-
}): Promise<T>;
|
|
456
|
-
resolve(responseType: string, payload: unknown): void;
|
|
457
|
-
cancel(requestType?: string): void;
|
|
458
|
-
reset(): void;
|
|
459
|
-
hasPending(requestType: string): boolean;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
/**
|
|
463
|
-
* Per-device serial job queue with preemption support and stuck recovery.
|
|
464
|
-
* Ensures that only one operation runs at a time per device, with intelligent
|
|
465
|
-
* handling of conflicting operations.
|
|
466
|
-
*
|
|
467
|
-
* The 'confirm' level uses the standard UI request/response flow:
|
|
468
|
-
* emits REQUEST_PREEMPTION → waits for RECEIVE_PREEMPTION via UiRequestRegistry.
|
|
469
|
-
*/
|
|
470
|
-
|
|
471
|
-
type Interruptibility = 'none' | 'safe' | 'confirm';
|
|
472
|
-
type PreemptionDecision = 'cancel-current' | 'wait' | 'reject-new';
|
|
473
|
-
interface JobOptions {
|
|
474
|
-
interruptibility?: Interruptibility;
|
|
475
|
-
label?: string;
|
|
476
|
-
}
|
|
477
|
-
interface ActiveJobInfo {
|
|
478
|
-
label?: string;
|
|
479
|
-
interruptibility: Interruptibility;
|
|
480
|
-
startedAt: number;
|
|
481
|
-
}
|
|
482
|
-
interface PreemptionEvent {
|
|
483
|
-
deviceId: string;
|
|
484
|
-
currentJob: ActiveJobInfo;
|
|
485
|
-
newJob: {
|
|
486
|
-
label?: string;
|
|
487
|
-
interruptibility: Interruptibility;
|
|
488
|
-
};
|
|
489
|
-
}
|
|
490
|
-
interface DeviceJobQueueDeps {
|
|
491
|
-
/** Emit a UI request event to the frontend. */
|
|
492
|
-
emit: (event: string, data: unknown) => void;
|
|
493
|
-
/** Registry for waiting on UI responses. */
|
|
494
|
-
uiRegistry: UiRequestRegistry;
|
|
495
|
-
}
|
|
496
|
-
declare class DeviceJobQueue {
|
|
497
|
-
private readonly _queues;
|
|
498
|
-
private readonly _active;
|
|
499
|
-
private readonly _deps;
|
|
500
|
-
/** Incremented on clear() so stale queued jobs can detect invalidation. */
|
|
501
|
-
private _generation;
|
|
502
|
-
constructor(deps?: DeviceJobQueueDeps);
|
|
503
|
-
/**
|
|
504
|
-
* Enqueue a job for a specific device.
|
|
505
|
-
* If a job is already running for this device, behavior depends on interruptibility:
|
|
506
|
-
* - 'none': new job queues silently (no preemption possible)
|
|
507
|
-
* - 'safe': current job is auto-cancelled, new job runs immediately after
|
|
508
|
-
* - 'confirm': emits REQUEST_PREEMPTION and waits for UI response
|
|
509
|
-
*/
|
|
510
|
-
enqueue<T>(deviceId: string, job: (signal: AbortSignal) => Promise<T>, options?: JobOptions): Promise<T>;
|
|
511
|
-
/** Manually cancel the active job on a device. Returns false if job is non-interruptible. */
|
|
512
|
-
cancelActive(deviceId: string): boolean;
|
|
513
|
-
/** Force cancel regardless of interruptibility. Use for device stuck recovery. */
|
|
514
|
-
forceCancelActive(deviceId: string): boolean;
|
|
515
|
-
/** Get info about the currently active job for a device, or null if idle. */
|
|
516
|
-
getActiveJob(deviceId: string): ActiveJobInfo | null;
|
|
517
|
-
clear(): void;
|
|
518
|
-
/**
|
|
519
|
-
* Request preemption decision via UI request/response flow.
|
|
520
|
-
* Falls back to 'wait' if deps are not provided.
|
|
521
|
-
*/
|
|
522
|
-
private _requestPreemptionDecision;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
461
|
declare const UI_EVENT = "UI_EVENT";
|
|
526
462
|
declare const UI_REQUEST: {
|
|
527
463
|
readonly REQUEST_PIN: "ui-request-pin";
|
|
@@ -533,7 +469,7 @@ declare const UI_REQUEST: {
|
|
|
533
469
|
readonly REQUEST_DEVICE_PERMISSION: "ui-request-device-permission";
|
|
534
470
|
readonly REQUEST_SELECT_DEVICE: "ui-request-select-device";
|
|
535
471
|
readonly REQUEST_DEVICE_CONNECT: "ui-request-device-connect";
|
|
536
|
-
readonly
|
|
472
|
+
readonly REQUEST_BTC_HIGH_INDEX_CONFIRM: "ui-request-btc-high-index-confirm";
|
|
537
473
|
readonly CLOSE_UI_WINDOW: "ui-close";
|
|
538
474
|
readonly DEVICE_PROGRESS: "ui-device_progress";
|
|
539
475
|
readonly FIRMWARE_PROGRESS: "ui-firmware-progress";
|
|
@@ -547,9 +483,15 @@ declare const UI_RESPONSE: {
|
|
|
547
483
|
readonly RECEIVE_SELECT_DEVICE: "receive-select-device";
|
|
548
484
|
readonly RECEIVE_DEVICE_CONNECT: "receive-device-connect";
|
|
549
485
|
readonly RECEIVE_DEVICE_PERMISSION: "receive-device-permission";
|
|
550
|
-
readonly
|
|
486
|
+
readonly RECEIVE_BTC_HIGH_INDEX_CONFIRM: "receive-btc-high-index-confirm";
|
|
551
487
|
readonly CANCEL: "cancel";
|
|
552
488
|
};
|
|
489
|
+
type DevicePermissionDeniedReason = 'bluetoothTurnedOff' | 'permissionDenied' | (string & Record<never, never>);
|
|
490
|
+
type DevicePermissionResponse = {
|
|
491
|
+
granted: boolean;
|
|
492
|
+
reason?: DevicePermissionDeniedReason;
|
|
493
|
+
message?: string;
|
|
494
|
+
};
|
|
553
495
|
type UiResponseEvent = {
|
|
554
496
|
type: typeof UI_RESPONSE.RECEIVE_PIN;
|
|
555
497
|
payload: string;
|
|
@@ -578,13 +520,11 @@ type UiResponseEvent = {
|
|
|
578
520
|
};
|
|
579
521
|
} | {
|
|
580
522
|
type: typeof UI_RESPONSE.RECEIVE_DEVICE_PERMISSION;
|
|
581
|
-
payload:
|
|
582
|
-
granted: boolean;
|
|
583
|
-
};
|
|
523
|
+
payload: DevicePermissionResponse;
|
|
584
524
|
} | {
|
|
585
|
-
type: typeof UI_RESPONSE.
|
|
525
|
+
type: typeof UI_RESPONSE.RECEIVE_BTC_HIGH_INDEX_CONFIRM;
|
|
586
526
|
payload: {
|
|
587
|
-
|
|
527
|
+
confirmed: boolean;
|
|
588
528
|
};
|
|
589
529
|
} | {
|
|
590
530
|
type: typeof UI_RESPONSE.CANCEL;
|
|
@@ -621,6 +561,8 @@ type ConnectorEventType = 'device-connect' | 'device-disconnect' | 'ui-request'
|
|
|
621
561
|
* These map to user-facing prompts (confirm on device, open app, etc.).
|
|
622
562
|
*/
|
|
623
563
|
declare enum EConnectorInteraction {
|
|
564
|
+
/** Adapter is actively searching for the device (no session yet) */
|
|
565
|
+
Searching = "searching",
|
|
624
566
|
/** Device requires user to open a specific app */
|
|
625
567
|
ConfirmOpenApp = "confirm-open-app",
|
|
626
568
|
/** Device requires user to unlock */
|
|
@@ -631,6 +573,11 @@ declare enum EConnectorInteraction {
|
|
|
631
573
|
InteractionComplete = "interaction-complete"
|
|
632
574
|
}
|
|
633
575
|
type ConnectorUiEvent = {
|
|
576
|
+
type: EConnectorInteraction.Searching;
|
|
577
|
+
payload: {
|
|
578
|
+
sessionId: string;
|
|
579
|
+
};
|
|
580
|
+
} | {
|
|
634
581
|
type: EConnectorInteraction.ConfirmOpenApp;
|
|
635
582
|
payload: {
|
|
636
583
|
sessionId: string;
|
|
@@ -797,18 +744,23 @@ type UiRequestEvent = {
|
|
|
797
744
|
} | {
|
|
798
745
|
type: typeof UI_REQUEST.REQUEST_DEVICE_CONNECT;
|
|
799
746
|
payload: {
|
|
747
|
+
/** Vendor that emitted the request, e.g. 'ledger', 'trezor'. */
|
|
748
|
+
vendor: string;
|
|
749
|
+
/**
|
|
750
|
+
* Why the SDK is asking for a reconnect. Lets the app render
|
|
751
|
+
* vendor-aware copy without inspecting message strings.
|
|
752
|
+
* - 'device-not-found': search returned 0 / device not reachable.
|
|
753
|
+
* Future values can be added (e.g. 'pairing-failed') as new fallback
|
|
754
|
+
* causes are surfaced.
|
|
755
|
+
*/
|
|
756
|
+
reason: string;
|
|
757
|
+
/**
|
|
758
|
+
* Best-effort English fallback. Apps should prefer rendering via
|
|
759
|
+
* `vendor` + `reason` for i18n; fall back to this if the combination
|
|
760
|
+
* isn't recognized.
|
|
761
|
+
*/
|
|
800
762
|
message: string;
|
|
801
763
|
};
|
|
802
|
-
} | {
|
|
803
|
-
type: typeof UI_REQUEST.REQUEST_PREEMPTION;
|
|
804
|
-
payload: {
|
|
805
|
-
deviceId: string;
|
|
806
|
-
currentJob: ActiveJobInfo;
|
|
807
|
-
newJob: {
|
|
808
|
-
label?: string;
|
|
809
|
-
interruptibility: Interruptibility;
|
|
810
|
-
};
|
|
811
|
-
};
|
|
812
764
|
} | {
|
|
813
765
|
type: typeof UI_REQUEST.CLOSE_UI_WINDOW;
|
|
814
766
|
payload: Record<string, never>;
|
|
@@ -914,18 +866,17 @@ interface HardwareEventMap {
|
|
|
914
866
|
[UI_REQUEST.REQUEST_DEVICE_CONNECT]: {
|
|
915
867
|
type: typeof UI_REQUEST.REQUEST_DEVICE_CONNECT;
|
|
916
868
|
payload: {
|
|
869
|
+
vendor: string;
|
|
870
|
+
reason: string;
|
|
917
871
|
message: string;
|
|
918
872
|
};
|
|
919
873
|
};
|
|
920
|
-
[UI_REQUEST.
|
|
921
|
-
type: typeof UI_REQUEST.
|
|
874
|
+
[UI_REQUEST.REQUEST_BTC_HIGH_INDEX_CONFIRM]: {
|
|
875
|
+
type: typeof UI_REQUEST.REQUEST_BTC_HIGH_INDEX_CONFIRM;
|
|
922
876
|
payload: {
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
label?: string;
|
|
927
|
-
interruptibility: Interruptibility;
|
|
928
|
-
};
|
|
877
|
+
vendor: string;
|
|
878
|
+
path: string;
|
|
879
|
+
accountIndex: number;
|
|
929
880
|
};
|
|
930
881
|
};
|
|
931
882
|
[UI_REQUEST.CLOSE_UI_WINDOW]: {
|
|
@@ -970,7 +921,8 @@ interface IHardwareWallet<TConfig = unknown> extends IEvmMethods, IBtcMethods, I
|
|
|
970
921
|
disconnectDevice(connectId: string): Promise<void>;
|
|
971
922
|
getDeviceInfo(connectId: string, deviceId: string): Promise<Response<DeviceInfo>>;
|
|
972
923
|
getSupportedChains(): ChainCapability[];
|
|
973
|
-
|
|
924
|
+
/** Abort the in-flight call. Omit connectId to cancel whatever is active. */
|
|
925
|
+
cancel(connectId?: string): void;
|
|
974
926
|
/** Respond to any pending `ui-request-*`. */
|
|
975
927
|
uiResponse(response: UiResponseEvent): void;
|
|
976
928
|
/**
|
|
@@ -1002,10 +954,16 @@ interface DeviceDescriptor {
|
|
|
1002
954
|
vendor?: number;
|
|
1003
955
|
/** Device type/model identifier */
|
|
1004
956
|
type?: string;
|
|
1005
|
-
/**
|
|
957
|
+
/** Human-readable display name from the transport layer. */
|
|
1006
958
|
name?: string;
|
|
959
|
+
/** Stable Ledger BLE identifier from the raw RN BLE `Device.name` field. */
|
|
960
|
+
bleName?: string;
|
|
961
|
+
/** User-visible Ledger BLE local name from the raw RN BLE `Device.localName` field. */
|
|
962
|
+
localName?: string;
|
|
1007
963
|
/** Transport identifier (e.g., 'WEB-HID', 'BLE') */
|
|
1008
964
|
transport?: string;
|
|
965
|
+
/** BLE RSSI when provided by the transport scanner. */
|
|
966
|
+
rssi?: number | null;
|
|
1009
967
|
}
|
|
1010
968
|
interface DeviceConnectEvent {
|
|
1011
969
|
type: 'device-connected';
|
|
@@ -1017,6 +975,53 @@ interface DeviceDisconnectEvent {
|
|
|
1017
975
|
}
|
|
1018
976
|
type DeviceChangeEvent = DeviceConnectEvent | DeviceDisconnectEvent;
|
|
1019
977
|
|
|
978
|
+
/**
|
|
979
|
+
* Pure FIFO job queue. Every enqueue chains onto the tail; jobs run one at
|
|
980
|
+
* a time across all devices. The queue is intentionally passive — it does
|
|
981
|
+
* NOT decide whether to interrupt or ask the user. Those are application-
|
|
982
|
+
* layer concerns owned by the caller (e.g. a UI button handler that wants
|
|
983
|
+
* to ask "device is busy, interrupt current?" before submitting). The
|
|
984
|
+
* queue exposes inspection (`getActiveJob`) and explicit cancellation
|
|
985
|
+
* (`cancelActive` / `cancelAll`) so callers can implement those policies
|
|
986
|
+
* synchronously, without racing against in-flight enqueues.
|
|
987
|
+
*/
|
|
988
|
+
interface JobOptions {
|
|
989
|
+
label?: string;
|
|
990
|
+
rejectIfBusy?: boolean;
|
|
991
|
+
busyError?: Error;
|
|
992
|
+
}
|
|
993
|
+
interface ActiveJobInfo {
|
|
994
|
+
deviceId: string;
|
|
995
|
+
label?: string;
|
|
996
|
+
startedAt: number;
|
|
997
|
+
}
|
|
998
|
+
declare class DeviceJobQueue {
|
|
999
|
+
private _tail;
|
|
1000
|
+
private _active;
|
|
1001
|
+
private readonly _jobs;
|
|
1002
|
+
/** Incremented on clear() so queued-but-not-yet-running jobs detect invalidation. */
|
|
1003
|
+
private _generation;
|
|
1004
|
+
private readonly _generationCancelReasons;
|
|
1005
|
+
/**
|
|
1006
|
+
* Enqueue a job. Runs after every previously-enqueued job has settled.
|
|
1007
|
+
* `deviceId` is a label only — used by inspection / cancellation routing.
|
|
1008
|
+
*/
|
|
1009
|
+
enqueue<T>(deviceId: string, job: (signal: AbortSignal) => Promise<T>, options?: JobOptions): Promise<T>;
|
|
1010
|
+
/** Cancel the active job. If `deviceId` is given, only cancels when it matches. */
|
|
1011
|
+
cancelActive(deviceId?: string): boolean;
|
|
1012
|
+
/** Force cancel the active job. `reason` becomes signal.reason. */
|
|
1013
|
+
forceCancelActive(deviceId?: string, reason?: Error): boolean;
|
|
1014
|
+
/** Cancel the active job (alias for callers that previously needed multi-device cancel). */
|
|
1015
|
+
cancelAllActive(reason?: Error): void;
|
|
1016
|
+
/** Cancel the active job and invalidate queued jobs that have not started. */
|
|
1017
|
+
cancelActiveAndPending(deviceId?: string, reason?: Error): boolean;
|
|
1018
|
+
/** Get info about the currently active job, or null if idle. */
|
|
1019
|
+
getActiveJob(deviceId?: string): ActiveJobInfo | null;
|
|
1020
|
+
/** True if any job is currently running. */
|
|
1021
|
+
isBusy(): boolean;
|
|
1022
|
+
clear(reason?: Error): void;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1020
1025
|
/**
|
|
1021
1026
|
* Minimal typed event emitter using Map<string, Set<listener>>.
|
|
1022
1027
|
* Each adapter uses this for device events (connect, disconnect, pin, etc.).
|
|
@@ -1041,6 +1046,32 @@ declare class TypedEventEmitter<TMap extends Record<string, any> = Record<string
|
|
|
1041
1046
|
removeAllListeners(): void;
|
|
1042
1047
|
}
|
|
1043
1048
|
|
|
1049
|
+
/** 10 min — every UI request is human-in-the-loop; bias toward "wait long". */
|
|
1050
|
+
declare const UI_REQUEST_DEFAULT_TIMEOUT_MS = 600000;
|
|
1051
|
+
declare const UI_REQUEST_PREEMPTED_TAG = "UiRequestPreempted";
|
|
1052
|
+
declare const UI_REQUEST_CANCELLED_TAG = "UiRequestCancelled";
|
|
1053
|
+
declare const UI_REQUEST_TIMEOUT_TAG = "UiRequestTimeout";
|
|
1054
|
+
/**
|
|
1055
|
+
* Per-type single-slot registry for adapter-level UI requests. A new `wait`
|
|
1056
|
+
* of the same type supersedes (rejects) the prior pending entry. With the
|
|
1057
|
+
* job queue running globally serially, cross-type collisions don't occur in
|
|
1058
|
+
* normal flow — same-type preemption is a defensive measure for callers
|
|
1059
|
+
* that fire the same request twice without waiting on the first.
|
|
1060
|
+
*
|
|
1061
|
+
* Unknown response types are dropped silently so the public `uiResponse`
|
|
1062
|
+
* entry never throws.
|
|
1063
|
+
*/
|
|
1064
|
+
declare class UiRequestRegistry {
|
|
1065
|
+
private pending;
|
|
1066
|
+
wait<T = unknown>(requestType: string, options?: {
|
|
1067
|
+
timeoutMs?: number;
|
|
1068
|
+
}): Promise<T>;
|
|
1069
|
+
resolve(responseType: string, payload: unknown): void;
|
|
1070
|
+
cancel(requestType?: string): void;
|
|
1071
|
+
reset(): void;
|
|
1072
|
+
hasPending(requestType?: string): boolean;
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1044
1075
|
/**
|
|
1045
1076
|
* Compare two semver strings (e.g. "2.1.0" vs "2.3.1").
|
|
1046
1077
|
* Returns -1 if a < b, 0 if equal, 1 if a > b.
|
|
@@ -1076,4 +1107,4 @@ declare function batchCall<TParam, TResult>(params: TParam[], callFn: (p: TParam
|
|
|
1076
1107
|
total: number;
|
|
1077
1108
|
}) => void): Promise<Response<TResult[]>>;
|
|
1078
1109
|
|
|
1079
|
-
export { type ActiveJobInfo, type BtcAddress, type BtcGetAddressParams, type BtcGetPublicKeyParams, type BtcPublicKey, type BtcRefTransaction, type BtcSignMsgParams, type BtcSignPsbtParams, type BtcSignTxParams, type BtcSignature, type BtcSignedPsbt, type BtcSignedTx, type BtcTxInput, type BtcTxOutput, CHAIN_FINGERPRINT_PATHS, type ChainCapability, type ChainForFingerprint, type ConnectionType, type ConnectorDevice, type ConnectorEventMap, type ConnectorEventType, type ConnectorSession, type ConnectorUiEvent, DEVICE, DEVICE_EVENT, type DeviceCapabilities, type DeviceChangeEvent, type DeviceConnectEvent, type DeviceDescriptor, type DeviceDisconnectEvent, type DeviceEvent, type DeviceEventListener, type DeviceInfo, DeviceJobQueue, type
|
|
1110
|
+
export { type ActiveJobInfo, type BtcAddress, type BtcGetAddressParams, type BtcGetPublicKeyParams, type BtcPublicKey, type BtcRefTransaction, type BtcSignMsgParams, type BtcSignPsbtParams, type BtcSignTxParams, type BtcSignature, type BtcSignedPsbt, type BtcSignedTx, type BtcTxInput, type BtcTxOutput, CHAIN_FINGERPRINT_PATHS, type ChainCapability, type ChainForFingerprint, type ConnectionType, type ConnectorDevice, type ConnectorEventMap, type ConnectorEventType, type ConnectorSession, type ConnectorUiEvent, DEVICE, DEVICE_EVENT, type DeviceCapabilities, type DeviceChangeEvent, type DeviceConnectEvent, type DeviceDescriptor, type DeviceDisconnectEvent, type DeviceEvent, type DeviceEventListener, type DeviceInfo, DeviceJobQueue, type DevicePermissionDeniedReason, type DevicePermissionResponse, type DeviceTarget, EConnectorInteraction, type EIP712Domain, type EvmAddress, type EvmGetAddressParams, type EvmSignMsgParams, type EvmSignTxParams, type EvmSignTypedDataFull, type EvmSignTypedDataHash, type EvmSignTypedDataParams, type EvmSignature, type EvmSignedTx, type Failure, HardwareErrorCode, type HardwareEvent, type HardwareEventMap, type IBtcMethods, type IConnector, type IEvmMethods, type IHardwareBridge, type IHardwareWallet, type ISolMethods, type ITronMethods, type JobOptions, ORPHAN_ELIGIBLE_ERROR_CODES, type PassphraseResponse, type QrDisplayData, type QrResponseData, type Response, SDK, type SdkEvent, type SolAddress, type SolGetAddressParams, type SolSignMsgParams, type SolSignTxParams, type SolSignature, type SolSignedTx, type Success, type TransportType, type TronAddress, type TronGetAddressParams, type TronSignMsgParams, type TronSignTxParams, type TronSignature, type TronSignedTx, TypedEventEmitter, UI_EVENT, UI_REQUEST, UI_REQUEST_CANCELLED_TAG, UI_REQUEST_DEFAULT_TIMEOUT_MS, UI_REQUEST_PREEMPTED_TAG, UI_REQUEST_TIMEOUT_TAG, UI_RESPONSE, type UiRequestEvent, UiRequestRegistry, type UiResponseEvent, type VendorType, batchCall, bytesToHex, compareSemver, createBridgedConnector, deriveDeviceFingerprint, enrichErrorMessage, ensure0x, failure, hexToBytes, padHex64, stripHex, success };
|