@metamask-previews/hw-wallet-sdk 0.8.0-e5bc458 → 0.9.0-e51c895
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/CHANGELOG.md +5 -0
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/user-rejection.cjs +116 -0
- package/dist/user-rejection.cjs.map +1 -0
- package/dist/user-rejection.d.cts +18 -0
- package/dist/user-rejection.d.cts.map +1 -0
- package/dist/user-rejection.d.mts +18 -0
- package/dist/user-rejection.d.mts.map +1 -0
- package/dist/user-rejection.mjs +111 -0
- package/dist/user-rejection.mjs.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Add shared user-rejection detection helpers so hardware wallet libraries can classify cancellation-like errors consistently ([#576](https://github.com/MetaMask/accounts/pull/576))
|
|
13
|
+
- Provider-style `4001` codes are distinguished from this SDK's `ConnectionClosed` error code.
|
|
14
|
+
|
|
10
15
|
## [0.8.0]
|
|
11
16
|
|
|
12
17
|
### Added
|
package/dist/index.cjs
CHANGED
|
@@ -18,4 +18,5 @@ __exportStar(require("./hardware-errors-enums.cjs"), exports);
|
|
|
18
18
|
__exportStar(require("./hardware-error-mappings.cjs"), exports);
|
|
19
19
|
__exportStar(require("./hardware-error.cjs"), exports);
|
|
20
20
|
__exportStar(require("./types.cjs"), exports);
|
|
21
|
+
__exportStar(require("./user-rejection.cjs"), exports);
|
|
21
22
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAAwC;AACxC,gEAA0C;AAC1C,uDAAiC;AACjC,8CAAwB","sourcesContent":["export * from './hardware-errors-enums';\nexport * from './hardware-error-mappings';\nexport * from './hardware-error';\nexport * from './types';\n"]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAAwC;AACxC,gEAA0C;AAC1C,uDAAiC;AACjC,8CAAwB;AACxB,uDAAiC","sourcesContent":["export * from './hardware-errors-enums';\nexport * from './hardware-error-mappings';\nexport * from './hardware-error';\nexport * from './types';\nexport * from './user-rejection';\n"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAAwC;AACxC,8CAA0C;AAC1C,qCAAiC;AACjC,4BAAwB"}
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAAwC;AACxC,8CAA0C;AAC1C,qCAAiC;AACjC,4BAAwB;AACxB,qCAAiC"}
|
package/dist/index.d.mts
CHANGED
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAAwC;AACxC,8CAA0C;AAC1C,qCAAiC;AACjC,4BAAwB"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAAwC;AACxC,8CAA0C;AAC1C,qCAAiC;AACjC,4BAAwB;AACxB,qCAAiC"}
|
package/dist/index.mjs
CHANGED
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAAwC;AACxC,8CAA0C;AAC1C,qCAAiC;AACjC,4BAAwB","sourcesContent":["export * from './hardware-errors-enums';\nexport * from './hardware-error-mappings';\nexport * from './hardware-error';\nexport * from './types';\n"]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAAwC;AACxC,8CAA0C;AAC1C,qCAAiC;AACjC,4BAAwB;AACxB,qCAAiC","sourcesContent":["export * from './hardware-errors-enums';\nexport * from './hardware-error-mappings';\nexport * from './hardware-error';\nexport * from './types';\nexport * from './user-rejection';\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveUserRejectionErrorCode = exports.isUserRejectionLikeError = void 0;
|
|
4
|
+
const hardware_error_1 = require("./hardware-error.cjs");
|
|
5
|
+
const hardware_errors_enums_1 = require("./hardware-errors-enums.cjs");
|
|
6
|
+
const PROVIDER_USER_REJECTED_CODE = 4001;
|
|
7
|
+
const USER_REJECTION_PATTERN = /(?:\buser rejected\b|\baction cancelled\b|\bcancelled\b|\bcanceled\b|failure_actioncancelled)/iu;
|
|
8
|
+
const USER_REJECTED_PATTERN = /\buser rejected\b/iu;
|
|
9
|
+
const PERMISSIONS_NOT_GRANTED_PATTERN = /\bpermissions? not granted\b/iu;
|
|
10
|
+
const USER_REJECTION_CODES = new Set([
|
|
11
|
+
'Method_PermissionsNotGranted',
|
|
12
|
+
'Method_Cancel',
|
|
13
|
+
'Failure_ActionCancelled',
|
|
14
|
+
]);
|
|
15
|
+
function isUserRejectionString(value) {
|
|
16
|
+
return (USER_REJECTION_PATTERN.test(value) ||
|
|
17
|
+
PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||
|
|
18
|
+
USER_REJECTION_CODES.has(value));
|
|
19
|
+
}
|
|
20
|
+
function isUserRejectedString(value) {
|
|
21
|
+
return (USER_REJECTED_PATTERN.test(value) ||
|
|
22
|
+
PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||
|
|
23
|
+
value === 'Method_PermissionsNotGranted');
|
|
24
|
+
}
|
|
25
|
+
function isHardwareWalletConnectionClosedError(error) {
|
|
26
|
+
if (error instanceof hardware_error_1.HardwareWalletError) {
|
|
27
|
+
return error.code === hardware_errors_enums_1.ErrorCode.ConnectionClosed;
|
|
28
|
+
}
|
|
29
|
+
const errorObject = error;
|
|
30
|
+
return (errorObject.name === 'HardwareWalletError' &&
|
|
31
|
+
errorObject.code === hardware_errors_enums_1.ErrorCode.ConnectionClosed);
|
|
32
|
+
}
|
|
33
|
+
function isProviderUserRejectedCode(code) {
|
|
34
|
+
return code === PROVIDER_USER_REJECTED_CODE;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Recursively checks whether an error value represents a user rejection or
|
|
38
|
+
* cancellation, mirroring detection used in MetaMask core signing flows.
|
|
39
|
+
*
|
|
40
|
+
* @param error - The error value to inspect.
|
|
41
|
+
* @param visited - Set of already-visited objects to avoid infinite recursion.
|
|
42
|
+
* @returns True when the error looks like a user rejection or cancellation.
|
|
43
|
+
*/
|
|
44
|
+
function isUserRejectionLikeError(error, visited = new Set()) {
|
|
45
|
+
if (!error || visited.has(error)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
visited.add(error);
|
|
49
|
+
if (typeof error === 'string') {
|
|
50
|
+
return isUserRejectionString(error);
|
|
51
|
+
}
|
|
52
|
+
if (typeof error !== 'object') {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
const errorObject = error;
|
|
56
|
+
if (isHardwareWalletConnectionClosedError(error)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (isProviderUserRejectedCode(errorObject.code)) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return (isUserRejectionLikeError(errorObject.code, visited) ||
|
|
63
|
+
isUserRejectionLikeError(errorObject.message, visited) ||
|
|
64
|
+
isUserRejectionLikeError(errorObject.stack, visited) ||
|
|
65
|
+
isUserRejectionLikeError(errorObject.cause, visited) ||
|
|
66
|
+
isUserRejectionLikeError(errorObject.originalError, visited));
|
|
67
|
+
}
|
|
68
|
+
exports.isUserRejectionLikeError = isUserRejectionLikeError;
|
|
69
|
+
/**
|
|
70
|
+
* Resolves a hardware-wallet error code for user rejection-like errors.
|
|
71
|
+
*
|
|
72
|
+
* @param error - The error value to inspect.
|
|
73
|
+
* @returns `UserRejected` or `UserCancelled` when detected, otherwise `undefined`.
|
|
74
|
+
*/
|
|
75
|
+
function resolveUserRejectionErrorCode(error) {
|
|
76
|
+
if (!isUserRejectionLikeError(error)) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
if (typeof error === 'string') {
|
|
80
|
+
return isUserRejectedString(error)
|
|
81
|
+
? hardware_errors_enums_1.ErrorCode.UserRejected
|
|
82
|
+
: hardware_errors_enums_1.ErrorCode.UserCancelled;
|
|
83
|
+
}
|
|
84
|
+
const errorObject = error;
|
|
85
|
+
if (typeof errorObject.message === 'string') {
|
|
86
|
+
if (isUserRejectedString(errorObject.message)) {
|
|
87
|
+
return hardware_errors_enums_1.ErrorCode.UserRejected;
|
|
88
|
+
}
|
|
89
|
+
if (isUserRejectionString(errorObject.message)) {
|
|
90
|
+
return hardware_errors_enums_1.ErrorCode.UserCancelled;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (typeof errorObject.code === 'string') {
|
|
94
|
+
if (isUserRejectedString(errorObject.code)) {
|
|
95
|
+
return hardware_errors_enums_1.ErrorCode.UserRejected;
|
|
96
|
+
}
|
|
97
|
+
if (isUserRejectionString(errorObject.code)) {
|
|
98
|
+
return hardware_errors_enums_1.ErrorCode.UserCancelled;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (errorObject.cause !== undefined) {
|
|
102
|
+
const causeCode = resolveUserRejectionErrorCode(errorObject.cause);
|
|
103
|
+
if (causeCode !== undefined) {
|
|
104
|
+
return causeCode;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (errorObject.originalError !== undefined) {
|
|
108
|
+
const originalCode = resolveUserRejectionErrorCode(errorObject.originalError);
|
|
109
|
+
if (originalCode !== undefined) {
|
|
110
|
+
return originalCode;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return hardware_errors_enums_1.ErrorCode.UserCancelled;
|
|
114
|
+
}
|
|
115
|
+
exports.resolveUserRejectionErrorCode = resolveUserRejectionErrorCode;
|
|
116
|
+
//# sourceMappingURL=user-rejection.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-rejection.cjs","sourceRoot":"","sources":["../src/user-rejection.ts"],"names":[],"mappings":"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","sourcesContent":["import { HardwareWalletError } from './hardware-error';\nimport { ErrorCode } from './hardware-errors-enums';\n\nconst PROVIDER_USER_REJECTED_CODE = 4001;\n\nconst USER_REJECTION_PATTERN =\n /(?:\\buser rejected\\b|\\baction cancelled\\b|\\bcancelled\\b|\\bcanceled\\b|failure_actioncancelled)/iu;\n\nconst USER_REJECTED_PATTERN = /\\buser rejected\\b/iu;\nconst PERMISSIONS_NOT_GRANTED_PATTERN = /\\bpermissions? not granted\\b/iu;\n\nconst USER_REJECTION_CODES = new Set<string>([\n 'Method_PermissionsNotGranted',\n 'Method_Cancel',\n 'Failure_ActionCancelled',\n]);\n\nfunction isUserRejectionString(value: string): boolean {\n return (\n USER_REJECTION_PATTERN.test(value) ||\n PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||\n USER_REJECTION_CODES.has(value)\n );\n}\n\nfunction isUserRejectedString(value: string): boolean {\n return (\n USER_REJECTED_PATTERN.test(value) ||\n PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||\n value === 'Method_PermissionsNotGranted'\n );\n}\n\ntype ErrorLikeObject = {\n code?: unknown;\n message?: unknown;\n name?: unknown;\n stack?: unknown;\n cause?: unknown;\n originalError?: unknown;\n};\n\nfunction isHardwareWalletConnectionClosedError(error: object): boolean {\n if (error instanceof HardwareWalletError) {\n return error.code === ErrorCode.ConnectionClosed;\n }\n\n const errorObject = error as ErrorLikeObject;\n return (\n errorObject.name === 'HardwareWalletError' &&\n errorObject.code === ErrorCode.ConnectionClosed\n );\n}\n\nfunction isProviderUserRejectedCode(code: unknown): boolean {\n return code === PROVIDER_USER_REJECTED_CODE;\n}\n\n/**\n * Recursively checks whether an error value represents a user rejection or\n * cancellation, mirroring detection used in MetaMask core signing flows.\n *\n * @param error - The error value to inspect.\n * @param visited - Set of already-visited objects to avoid infinite recursion.\n * @returns True when the error looks like a user rejection or cancellation.\n */\nexport function isUserRejectionLikeError(\n error: unknown,\n visited = new Set<unknown>(),\n): boolean {\n if (!error || visited.has(error)) {\n return false;\n }\n visited.add(error);\n\n if (typeof error === 'string') {\n return isUserRejectionString(error);\n }\n\n if (typeof error !== 'object') {\n return false;\n }\n\n const errorObject = error as ErrorLikeObject;\n\n if (isHardwareWalletConnectionClosedError(error)) {\n return false;\n }\n\n if (isProviderUserRejectedCode(errorObject.code)) {\n return true;\n }\n\n return (\n isUserRejectionLikeError(errorObject.code, visited) ||\n isUserRejectionLikeError(errorObject.message, visited) ||\n isUserRejectionLikeError(errorObject.stack, visited) ||\n isUserRejectionLikeError(errorObject.cause, visited) ||\n isUserRejectionLikeError(errorObject.originalError, visited)\n );\n}\n\n/**\n * Resolves a hardware-wallet error code for user rejection-like errors.\n *\n * @param error - The error value to inspect.\n * @returns `UserRejected` or `UserCancelled` when detected, otherwise `undefined`.\n */\nexport function resolveUserRejectionErrorCode(\n error: unknown,\n): ErrorCode.UserCancelled | ErrorCode.UserRejected | undefined {\n if (!isUserRejectionLikeError(error)) {\n return undefined;\n }\n\n if (typeof error === 'string') {\n return isUserRejectedString(error)\n ? ErrorCode.UserRejected\n : ErrorCode.UserCancelled;\n }\n\n const errorObject = error as ErrorLikeObject;\n\n if (typeof errorObject.message === 'string') {\n if (isUserRejectedString(errorObject.message)) {\n return ErrorCode.UserRejected;\n }\n if (isUserRejectionString(errorObject.message)) {\n return ErrorCode.UserCancelled;\n }\n }\n\n if (typeof errorObject.code === 'string') {\n if (isUserRejectedString(errorObject.code)) {\n return ErrorCode.UserRejected;\n }\n if (isUserRejectionString(errorObject.code)) {\n return ErrorCode.UserCancelled;\n }\n }\n\n if (errorObject.cause !== undefined) {\n const causeCode = resolveUserRejectionErrorCode(errorObject.cause);\n if (causeCode !== undefined) {\n return causeCode;\n }\n }\n\n if (errorObject.originalError !== undefined) {\n const originalCode = resolveUserRejectionErrorCode(\n errorObject.originalError,\n );\n if (originalCode !== undefined) {\n return originalCode;\n }\n }\n\n return ErrorCode.UserCancelled;\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ErrorCode } from "./hardware-errors-enums.cjs";
|
|
2
|
+
/**
|
|
3
|
+
* Recursively checks whether an error value represents a user rejection or
|
|
4
|
+
* cancellation, mirroring detection used in MetaMask core signing flows.
|
|
5
|
+
*
|
|
6
|
+
* @param error - The error value to inspect.
|
|
7
|
+
* @param visited - Set of already-visited objects to avoid infinite recursion.
|
|
8
|
+
* @returns True when the error looks like a user rejection or cancellation.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isUserRejectionLikeError(error: unknown, visited?: Set<unknown>): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Resolves a hardware-wallet error code for user rejection-like errors.
|
|
13
|
+
*
|
|
14
|
+
* @param error - The error value to inspect.
|
|
15
|
+
* @returns `UserRejected` or `UserCancelled` when detected, otherwise `undefined`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveUserRejectionErrorCode(error: unknown): ErrorCode.UserCancelled | ErrorCode.UserRejected | undefined;
|
|
18
|
+
//# sourceMappingURL=user-rejection.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-rejection.d.cts","sourceRoot":"","sources":["../src/user-rejection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,oCAAgC;AAyDpD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,eAAqB,GAC3B,OAAO,CA+BT;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,YAAY,GAAG,SAAS,CAgD9D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ErrorCode } from "./hardware-errors-enums.mjs";
|
|
2
|
+
/**
|
|
3
|
+
* Recursively checks whether an error value represents a user rejection or
|
|
4
|
+
* cancellation, mirroring detection used in MetaMask core signing flows.
|
|
5
|
+
*
|
|
6
|
+
* @param error - The error value to inspect.
|
|
7
|
+
* @param visited - Set of already-visited objects to avoid infinite recursion.
|
|
8
|
+
* @returns True when the error looks like a user rejection or cancellation.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isUserRejectionLikeError(error: unknown, visited?: Set<unknown>): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Resolves a hardware-wallet error code for user rejection-like errors.
|
|
13
|
+
*
|
|
14
|
+
* @param error - The error value to inspect.
|
|
15
|
+
* @returns `UserRejected` or `UserCancelled` when detected, otherwise `undefined`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveUserRejectionErrorCode(error: unknown): ErrorCode.UserCancelled | ErrorCode.UserRejected | undefined;
|
|
18
|
+
//# sourceMappingURL=user-rejection.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-rejection.d.mts","sourceRoot":"","sources":["../src/user-rejection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,oCAAgC;AAyDpD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,eAAqB,GAC3B,OAAO,CA+BT;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,YAAY,GAAG,SAAS,CAgD9D"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { HardwareWalletError } from "./hardware-error.mjs";
|
|
2
|
+
import { ErrorCode } from "./hardware-errors-enums.mjs";
|
|
3
|
+
const PROVIDER_USER_REJECTED_CODE = 4001;
|
|
4
|
+
const USER_REJECTION_PATTERN = /(?:\buser rejected\b|\baction cancelled\b|\bcancelled\b|\bcanceled\b|failure_actioncancelled)/iu;
|
|
5
|
+
const USER_REJECTED_PATTERN = /\buser rejected\b/iu;
|
|
6
|
+
const PERMISSIONS_NOT_GRANTED_PATTERN = /\bpermissions? not granted\b/iu;
|
|
7
|
+
const USER_REJECTION_CODES = new Set([
|
|
8
|
+
'Method_PermissionsNotGranted',
|
|
9
|
+
'Method_Cancel',
|
|
10
|
+
'Failure_ActionCancelled',
|
|
11
|
+
]);
|
|
12
|
+
function isUserRejectionString(value) {
|
|
13
|
+
return (USER_REJECTION_PATTERN.test(value) ||
|
|
14
|
+
PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||
|
|
15
|
+
USER_REJECTION_CODES.has(value));
|
|
16
|
+
}
|
|
17
|
+
function isUserRejectedString(value) {
|
|
18
|
+
return (USER_REJECTED_PATTERN.test(value) ||
|
|
19
|
+
PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||
|
|
20
|
+
value === 'Method_PermissionsNotGranted');
|
|
21
|
+
}
|
|
22
|
+
function isHardwareWalletConnectionClosedError(error) {
|
|
23
|
+
if (error instanceof HardwareWalletError) {
|
|
24
|
+
return error.code === ErrorCode.ConnectionClosed;
|
|
25
|
+
}
|
|
26
|
+
const errorObject = error;
|
|
27
|
+
return (errorObject.name === 'HardwareWalletError' &&
|
|
28
|
+
errorObject.code === ErrorCode.ConnectionClosed);
|
|
29
|
+
}
|
|
30
|
+
function isProviderUserRejectedCode(code) {
|
|
31
|
+
return code === PROVIDER_USER_REJECTED_CODE;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Recursively checks whether an error value represents a user rejection or
|
|
35
|
+
* cancellation, mirroring detection used in MetaMask core signing flows.
|
|
36
|
+
*
|
|
37
|
+
* @param error - The error value to inspect.
|
|
38
|
+
* @param visited - Set of already-visited objects to avoid infinite recursion.
|
|
39
|
+
* @returns True when the error looks like a user rejection or cancellation.
|
|
40
|
+
*/
|
|
41
|
+
export function isUserRejectionLikeError(error, visited = new Set()) {
|
|
42
|
+
if (!error || visited.has(error)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
visited.add(error);
|
|
46
|
+
if (typeof error === 'string') {
|
|
47
|
+
return isUserRejectionString(error);
|
|
48
|
+
}
|
|
49
|
+
if (typeof error !== 'object') {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const errorObject = error;
|
|
53
|
+
if (isHardwareWalletConnectionClosedError(error)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (isProviderUserRejectedCode(errorObject.code)) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return (isUserRejectionLikeError(errorObject.code, visited) ||
|
|
60
|
+
isUserRejectionLikeError(errorObject.message, visited) ||
|
|
61
|
+
isUserRejectionLikeError(errorObject.stack, visited) ||
|
|
62
|
+
isUserRejectionLikeError(errorObject.cause, visited) ||
|
|
63
|
+
isUserRejectionLikeError(errorObject.originalError, visited));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Resolves a hardware-wallet error code for user rejection-like errors.
|
|
67
|
+
*
|
|
68
|
+
* @param error - The error value to inspect.
|
|
69
|
+
* @returns `UserRejected` or `UserCancelled` when detected, otherwise `undefined`.
|
|
70
|
+
*/
|
|
71
|
+
export function resolveUserRejectionErrorCode(error) {
|
|
72
|
+
if (!isUserRejectionLikeError(error)) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
if (typeof error === 'string') {
|
|
76
|
+
return isUserRejectedString(error)
|
|
77
|
+
? ErrorCode.UserRejected
|
|
78
|
+
: ErrorCode.UserCancelled;
|
|
79
|
+
}
|
|
80
|
+
const errorObject = error;
|
|
81
|
+
if (typeof errorObject.message === 'string') {
|
|
82
|
+
if (isUserRejectedString(errorObject.message)) {
|
|
83
|
+
return ErrorCode.UserRejected;
|
|
84
|
+
}
|
|
85
|
+
if (isUserRejectionString(errorObject.message)) {
|
|
86
|
+
return ErrorCode.UserCancelled;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (typeof errorObject.code === 'string') {
|
|
90
|
+
if (isUserRejectedString(errorObject.code)) {
|
|
91
|
+
return ErrorCode.UserRejected;
|
|
92
|
+
}
|
|
93
|
+
if (isUserRejectionString(errorObject.code)) {
|
|
94
|
+
return ErrorCode.UserCancelled;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (errorObject.cause !== undefined) {
|
|
98
|
+
const causeCode = resolveUserRejectionErrorCode(errorObject.cause);
|
|
99
|
+
if (causeCode !== undefined) {
|
|
100
|
+
return causeCode;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (errorObject.originalError !== undefined) {
|
|
104
|
+
const originalCode = resolveUserRejectionErrorCode(errorObject.originalError);
|
|
105
|
+
if (originalCode !== undefined) {
|
|
106
|
+
return originalCode;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return ErrorCode.UserCancelled;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=user-rejection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-rejection.mjs","sourceRoot":"","sources":["../src/user-rejection.ts"],"names":[],"mappings":"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","sourcesContent":["import { HardwareWalletError } from './hardware-error';\nimport { ErrorCode } from './hardware-errors-enums';\n\nconst PROVIDER_USER_REJECTED_CODE = 4001;\n\nconst USER_REJECTION_PATTERN =\n /(?:\\buser rejected\\b|\\baction cancelled\\b|\\bcancelled\\b|\\bcanceled\\b|failure_actioncancelled)/iu;\n\nconst USER_REJECTED_PATTERN = /\\buser rejected\\b/iu;\nconst PERMISSIONS_NOT_GRANTED_PATTERN = /\\bpermissions? not granted\\b/iu;\n\nconst USER_REJECTION_CODES = new Set<string>([\n 'Method_PermissionsNotGranted',\n 'Method_Cancel',\n 'Failure_ActionCancelled',\n]);\n\nfunction isUserRejectionString(value: string): boolean {\n return (\n USER_REJECTION_PATTERN.test(value) ||\n PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||\n USER_REJECTION_CODES.has(value)\n );\n}\n\nfunction isUserRejectedString(value: string): boolean {\n return (\n USER_REJECTED_PATTERN.test(value) ||\n PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||\n value === 'Method_PermissionsNotGranted'\n );\n}\n\ntype ErrorLikeObject = {\n code?: unknown;\n message?: unknown;\n name?: unknown;\n stack?: unknown;\n cause?: unknown;\n originalError?: unknown;\n};\n\nfunction isHardwareWalletConnectionClosedError(error: object): boolean {\n if (error instanceof HardwareWalletError) {\n return error.code === ErrorCode.ConnectionClosed;\n }\n\n const errorObject = error as ErrorLikeObject;\n return (\n errorObject.name === 'HardwareWalletError' &&\n errorObject.code === ErrorCode.ConnectionClosed\n );\n}\n\nfunction isProviderUserRejectedCode(code: unknown): boolean {\n return code === PROVIDER_USER_REJECTED_CODE;\n}\n\n/**\n * Recursively checks whether an error value represents a user rejection or\n * cancellation, mirroring detection used in MetaMask core signing flows.\n *\n * @param error - The error value to inspect.\n * @param visited - Set of already-visited objects to avoid infinite recursion.\n * @returns True when the error looks like a user rejection or cancellation.\n */\nexport function isUserRejectionLikeError(\n error: unknown,\n visited = new Set<unknown>(),\n): boolean {\n if (!error || visited.has(error)) {\n return false;\n }\n visited.add(error);\n\n if (typeof error === 'string') {\n return isUserRejectionString(error);\n }\n\n if (typeof error !== 'object') {\n return false;\n }\n\n const errorObject = error as ErrorLikeObject;\n\n if (isHardwareWalletConnectionClosedError(error)) {\n return false;\n }\n\n if (isProviderUserRejectedCode(errorObject.code)) {\n return true;\n }\n\n return (\n isUserRejectionLikeError(errorObject.code, visited) ||\n isUserRejectionLikeError(errorObject.message, visited) ||\n isUserRejectionLikeError(errorObject.stack, visited) ||\n isUserRejectionLikeError(errorObject.cause, visited) ||\n isUserRejectionLikeError(errorObject.originalError, visited)\n );\n}\n\n/**\n * Resolves a hardware-wallet error code for user rejection-like errors.\n *\n * @param error - The error value to inspect.\n * @returns `UserRejected` or `UserCancelled` when detected, otherwise `undefined`.\n */\nexport function resolveUserRejectionErrorCode(\n error: unknown,\n): ErrorCode.UserCancelled | ErrorCode.UserRejected | undefined {\n if (!isUserRejectionLikeError(error)) {\n return undefined;\n }\n\n if (typeof error === 'string') {\n return isUserRejectedString(error)\n ? ErrorCode.UserRejected\n : ErrorCode.UserCancelled;\n }\n\n const errorObject = error as ErrorLikeObject;\n\n if (typeof errorObject.message === 'string') {\n if (isUserRejectedString(errorObject.message)) {\n return ErrorCode.UserRejected;\n }\n if (isUserRejectionString(errorObject.message)) {\n return ErrorCode.UserCancelled;\n }\n }\n\n if (typeof errorObject.code === 'string') {\n if (isUserRejectedString(errorObject.code)) {\n return ErrorCode.UserRejected;\n }\n if (isUserRejectionString(errorObject.code)) {\n return ErrorCode.UserCancelled;\n }\n }\n\n if (errorObject.cause !== undefined) {\n const causeCode = resolveUserRejectionErrorCode(errorObject.cause);\n if (causeCode !== undefined) {\n return causeCode;\n }\n }\n\n if (errorObject.originalError !== undefined) {\n const originalCode = resolveUserRejectionErrorCode(\n errorObject.originalError,\n );\n if (originalCode !== undefined) {\n return originalCode;\n }\n }\n\n return ErrorCode.UserCancelled;\n}\n"]}
|