@dynamic-labs-wallet/forward-mpc-client 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,180 @@
1
+ import { WebSocketError } from '@dynamic-labs-wallet/forward-mpc-shared';
2
+
3
+ declare const ErrorCode: {
4
+ readonly CONNECTION_FAILED: "CONNECTION_FAILED";
5
+ readonly CONNECTION_TIMEOUT: "CONNECTION_TIMEOUT";
6
+ readonly NOT_CONNECTED: "NOT_CONNECTED";
7
+ readonly HANDSHAKE_FAILED: "HANDSHAKE_FAILED";
8
+ readonly HANDSHAKE_INVALID_RESPONSE: "HANDSHAKE_INVALID_RESPONSE";
9
+ readonly ATTESTATION_FAILED: "ATTESTATION_FAILED";
10
+ readonly ATTESTATION_PCR_MISMATCH: "ATTESTATION_PCR_MISMATCH";
11
+ readonly ATTESTATION_CHALLENGE_MISMATCH: "ATTESTATION_CHALLENGE_MISMATCH";
12
+ readonly ATTESTATION_NONCE_MISMATCH: "ATTESTATION_NONCE_MISMATCH";
13
+ readonly ATTESTATION_NONCE_MISSING: "ATTESTATION_NONCE_MISSING";
14
+ readonly ATTESTATION_DOCUMENT_MISSING: "ATTESTATION_DOCUMENT_MISSING";
15
+ readonly REQUEST_TIMEOUT: "REQUEST_TIMEOUT";
16
+ readonly SESSION_DISPOSED: "SESSION_DISPOSED";
17
+ readonly SERVER_ERROR: "SERVER_ERROR";
18
+ readonly MESSAGE_PARSE_FAILED: "MESSAGE_PARSE_FAILED";
19
+ readonly SESSION_ESTABLISH_FAILED: "SESSION_ESTABLISH_FAILED";
20
+ readonly UNSUPPORTED_ALGORITHM: "UNSUPPORTED_ALGORITHM";
21
+ };
22
+ type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];
23
+ /**
24
+ * Focused subset of ErrorCode for attestation verification failures.
25
+ * Use with `error.code` to distinguish failure modes on SessionAttestationError.
26
+ */
27
+ declare const AttestationErrorCode: {
28
+ /** Generic / unrecognised attestation failure */
29
+ readonly FAILED: "ATTESTATION_FAILED";
30
+ /** PCR8 hash mismatch — enclave measurement changed */
31
+ readonly PCR_MISMATCH: "ATTESTATION_PCR_MISMATCH";
32
+ /** Challenge / ciphertext binding mismatch */
33
+ readonly CHALLENGE_MISMATCH: "ATTESTATION_CHALLENGE_MISMATCH";
34
+ /** Nonce value mismatch — possible tampering */
35
+ readonly NONCE_MISMATCH: "ATTESTATION_NONCE_MISMATCH";
36
+ /** Nonce field missing from attestation document */
37
+ readonly NONCE_MISSING: "ATTESTATION_NONCE_MISSING";
38
+ /** Server did not return an attestation document */
39
+ readonly DOCUMENT_MISSING: "ATTESTATION_DOCUMENT_MISSING";
40
+ };
41
+ type AttestationErrorCode = (typeof AttestationErrorCode)[keyof typeof AttestationErrorCode];
42
+ declare const ForwardMPCErrorType: {
43
+ readonly TRANSPORT: "transport";
44
+ readonly SESSION: "session";
45
+ readonly CLIENT: "client";
46
+ };
47
+ type ForwardMPCErrorType = (typeof ForwardMPCErrorType)[keyof typeof ForwardMPCErrorType];
48
+ /**
49
+ * Abstract root for all Forward MPC errors.
50
+ * `instanceof ForwardMPCError` is true for every error thrown by this library.
51
+ */
52
+ declare abstract class ForwardMPCError extends Error {
53
+ readonly code: ErrorCode;
54
+ readonly type: ForwardMPCErrorType;
55
+ readonly context?: Record<string, unknown>;
56
+ constructor(message: string, code: ErrorCode, type: ForwardMPCErrorType, context?: Record<string, unknown>);
57
+ toJSON(): Record<string, unknown>;
58
+ }
59
+ /** Abstract base for errors originating from the WebSocket / transport layer. */
60
+ declare abstract class TransportError extends ForwardMPCError {
61
+ constructor(message: string, code: ErrorCode, context?: Record<string, unknown>);
62
+ }
63
+ /** Abstract base for errors originating from the session / crypto / protocol layer. */
64
+ declare abstract class SessionError extends ForwardMPCError {
65
+ constructor(message: string, code: ErrorCode, context?: Record<string, unknown>);
66
+ }
67
+ /** Abstract base for errors originating from the client / application layer. */
68
+ declare abstract class ClientError extends ForwardMPCError {
69
+ constructor(message: string, code: ErrorCode, context?: Record<string, unknown>);
70
+ }
71
+ declare class TransportConnectionError extends TransportError {
72
+ constructor(context?: Record<string, unknown>);
73
+ }
74
+ declare class TransportConnectionTimeoutError extends TransportError {
75
+ constructor(context?: Record<string, unknown>);
76
+ }
77
+ declare class TransportNotConnectedError extends TransportError {
78
+ constructor(context?: Record<string, unknown>);
79
+ }
80
+ declare class SessionHandshakeError extends SessionError {
81
+ constructor(reason: string, context?: Record<string, unknown>);
82
+ }
83
+ declare class SessionHandshakeInvalidResponseError extends SessionError {
84
+ constructor(context?: Record<string, unknown>);
85
+ }
86
+ /**
87
+ * Attestation verification failure.
88
+ * Use `error.code` to distinguish failure reasons (e.g. ATTESTATION_PCR_MISMATCH)
89
+ * and `error.cause` to inspect the original verifier error.
90
+ */
91
+ declare class SessionAttestationError extends SessionError {
92
+ readonly cause?: unknown;
93
+ constructor(message?: string, code?: ErrorCode, context?: Record<string, unknown>, cause?: unknown);
94
+ }
95
+ declare class SessionRequestTimeoutError extends SessionError {
96
+ constructor(context?: Record<string, unknown>);
97
+ }
98
+ declare class SessionDisposedError extends SessionError {
99
+ constructor(context?: Record<string, unknown>);
100
+ }
101
+ declare class SessionServerError extends SessionError {
102
+ constructor(reason: string, context?: Record<string, unknown>);
103
+ }
104
+ declare class SessionMessageParseError extends SessionError {
105
+ constructor(context?: Record<string, unknown>);
106
+ }
107
+ /**
108
+ * The remote server returned an explicit error response.
109
+ * Carries the full WebSocketError payload so callers can inspect
110
+ * `serverError.type` and `serverError.details`.
111
+ */
112
+ declare class SessionRemoteError extends SessionError {
113
+ readonly serverError: WebSocketError;
114
+ constructor(serverError: WebSocketError, context?: Record<string, unknown>);
115
+ }
116
+ declare class ClientUnsupportedAlgorithmError extends ClientError {
117
+ constructor(context?: Record<string, unknown>);
118
+ }
119
+ declare class ClientSessionEstablishFailedError extends ClientError {
120
+ constructor(context?: Record<string, unknown>);
121
+ }
122
+
123
+ /**
124
+ * Error classification result from Forward MPC operations.
125
+ */
126
+ type ForwardMpcErrorType = 'ATTESTATION_FAILURE' | 'FORWARD_MPC_TIMEOUT' | 'FORWARD_MPC_ERROR';
127
+ /**
128
+ * Result of classifying a Forward MPC error.
129
+ */
130
+ interface ForwardMpcErrorClassification {
131
+ /** The type of error encountered */
132
+ errorType: ForwardMpcErrorType;
133
+ /** Error code from ForwardMPCError, if available */
134
+ errorCode: string | undefined;
135
+ /** Error message */
136
+ errorMessage: string;
137
+ /** Attestation verification errors, if this is an attestation failure */
138
+ attestationErrors?: unknown[];
139
+ /** Whether the session was established before the error occurred */
140
+ sessionEstablished: boolean;
141
+ /** Whether this error should trigger a fallback to relay-based MPC */
142
+ shouldFallback: boolean;
143
+ }
144
+ /**
145
+ * Classifies a Forward MPC error and returns structured data for logging.
146
+ * Use this to standardize error handling across keygen, signing, and connect operations.
147
+ *
148
+ * @param error - The error to classify
149
+ * @returns Classification result with error details and recommended action
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * try {
154
+ * await forwardMpcClient.sign(...);
155
+ * } catch (error) {
156
+ * const classification = classifyForwardMpcError(error);
157
+ * logger.warn(`Forward MPC ${operation} failed`, {
158
+ * ...classification,
159
+ * chainName,
160
+ * environmentId,
161
+ * });
162
+ * if (classification.shouldFallback) {
163
+ * // Fall through to relay-based MPC
164
+ * } else {
165
+ * throw error;
166
+ * }
167
+ * }
168
+ * ```
169
+ */
170
+ declare function classifyForwardMpcError(error: unknown): ForwardMpcErrorClassification;
171
+ /**
172
+ * Type guard to check if an error is a Forward MPC error that should be handled.
173
+ */
174
+ declare function isForwardMpcError(error: unknown): error is ForwardMPCError;
175
+ /**
176
+ * Type guard to check if an error is an attestation failure.
177
+ */
178
+ declare function isAttestationError(error: unknown): error is SessionAttestationError;
179
+
180
+ export { AttestationErrorCode as A, ClientError as C, ErrorCode as E, ForwardMPCError as F, SessionAttestationError as S, TransportConnectionError as T, ClientSessionEstablishFailedError as a, ClientUnsupportedAlgorithmError as b, ForwardMPCErrorType as c, type ForwardMpcErrorClassification as d, type ForwardMpcErrorType as e, SessionDisposedError as f, SessionError as g, SessionHandshakeError as h, SessionHandshakeInvalidResponseError as i, SessionMessageParseError as j, SessionRemoteError as k, SessionRequestTimeoutError as l, SessionServerError as m, TransportConnectionTimeoutError as n, TransportError as o, TransportNotConnectedError as p, classifyForwardMpcError as q, isAttestationError as r, isForwardMpcError as s };
@@ -0,0 +1,180 @@
1
+ import { WebSocketError } from '@dynamic-labs-wallet/forward-mpc-shared';
2
+
3
+ declare const ErrorCode: {
4
+ readonly CONNECTION_FAILED: "CONNECTION_FAILED";
5
+ readonly CONNECTION_TIMEOUT: "CONNECTION_TIMEOUT";
6
+ readonly NOT_CONNECTED: "NOT_CONNECTED";
7
+ readonly HANDSHAKE_FAILED: "HANDSHAKE_FAILED";
8
+ readonly HANDSHAKE_INVALID_RESPONSE: "HANDSHAKE_INVALID_RESPONSE";
9
+ readonly ATTESTATION_FAILED: "ATTESTATION_FAILED";
10
+ readonly ATTESTATION_PCR_MISMATCH: "ATTESTATION_PCR_MISMATCH";
11
+ readonly ATTESTATION_CHALLENGE_MISMATCH: "ATTESTATION_CHALLENGE_MISMATCH";
12
+ readonly ATTESTATION_NONCE_MISMATCH: "ATTESTATION_NONCE_MISMATCH";
13
+ readonly ATTESTATION_NONCE_MISSING: "ATTESTATION_NONCE_MISSING";
14
+ readonly ATTESTATION_DOCUMENT_MISSING: "ATTESTATION_DOCUMENT_MISSING";
15
+ readonly REQUEST_TIMEOUT: "REQUEST_TIMEOUT";
16
+ readonly SESSION_DISPOSED: "SESSION_DISPOSED";
17
+ readonly SERVER_ERROR: "SERVER_ERROR";
18
+ readonly MESSAGE_PARSE_FAILED: "MESSAGE_PARSE_FAILED";
19
+ readonly SESSION_ESTABLISH_FAILED: "SESSION_ESTABLISH_FAILED";
20
+ readonly UNSUPPORTED_ALGORITHM: "UNSUPPORTED_ALGORITHM";
21
+ };
22
+ type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];
23
+ /**
24
+ * Focused subset of ErrorCode for attestation verification failures.
25
+ * Use with `error.code` to distinguish failure modes on SessionAttestationError.
26
+ */
27
+ declare const AttestationErrorCode: {
28
+ /** Generic / unrecognised attestation failure */
29
+ readonly FAILED: "ATTESTATION_FAILED";
30
+ /** PCR8 hash mismatch — enclave measurement changed */
31
+ readonly PCR_MISMATCH: "ATTESTATION_PCR_MISMATCH";
32
+ /** Challenge / ciphertext binding mismatch */
33
+ readonly CHALLENGE_MISMATCH: "ATTESTATION_CHALLENGE_MISMATCH";
34
+ /** Nonce value mismatch — possible tampering */
35
+ readonly NONCE_MISMATCH: "ATTESTATION_NONCE_MISMATCH";
36
+ /** Nonce field missing from attestation document */
37
+ readonly NONCE_MISSING: "ATTESTATION_NONCE_MISSING";
38
+ /** Server did not return an attestation document */
39
+ readonly DOCUMENT_MISSING: "ATTESTATION_DOCUMENT_MISSING";
40
+ };
41
+ type AttestationErrorCode = (typeof AttestationErrorCode)[keyof typeof AttestationErrorCode];
42
+ declare const ForwardMPCErrorType: {
43
+ readonly TRANSPORT: "transport";
44
+ readonly SESSION: "session";
45
+ readonly CLIENT: "client";
46
+ };
47
+ type ForwardMPCErrorType = (typeof ForwardMPCErrorType)[keyof typeof ForwardMPCErrorType];
48
+ /**
49
+ * Abstract root for all Forward MPC errors.
50
+ * `instanceof ForwardMPCError` is true for every error thrown by this library.
51
+ */
52
+ declare abstract class ForwardMPCError extends Error {
53
+ readonly code: ErrorCode;
54
+ readonly type: ForwardMPCErrorType;
55
+ readonly context?: Record<string, unknown>;
56
+ constructor(message: string, code: ErrorCode, type: ForwardMPCErrorType, context?: Record<string, unknown>);
57
+ toJSON(): Record<string, unknown>;
58
+ }
59
+ /** Abstract base for errors originating from the WebSocket / transport layer. */
60
+ declare abstract class TransportError extends ForwardMPCError {
61
+ constructor(message: string, code: ErrorCode, context?: Record<string, unknown>);
62
+ }
63
+ /** Abstract base for errors originating from the session / crypto / protocol layer. */
64
+ declare abstract class SessionError extends ForwardMPCError {
65
+ constructor(message: string, code: ErrorCode, context?: Record<string, unknown>);
66
+ }
67
+ /** Abstract base for errors originating from the client / application layer. */
68
+ declare abstract class ClientError extends ForwardMPCError {
69
+ constructor(message: string, code: ErrorCode, context?: Record<string, unknown>);
70
+ }
71
+ declare class TransportConnectionError extends TransportError {
72
+ constructor(context?: Record<string, unknown>);
73
+ }
74
+ declare class TransportConnectionTimeoutError extends TransportError {
75
+ constructor(context?: Record<string, unknown>);
76
+ }
77
+ declare class TransportNotConnectedError extends TransportError {
78
+ constructor(context?: Record<string, unknown>);
79
+ }
80
+ declare class SessionHandshakeError extends SessionError {
81
+ constructor(reason: string, context?: Record<string, unknown>);
82
+ }
83
+ declare class SessionHandshakeInvalidResponseError extends SessionError {
84
+ constructor(context?: Record<string, unknown>);
85
+ }
86
+ /**
87
+ * Attestation verification failure.
88
+ * Use `error.code` to distinguish failure reasons (e.g. ATTESTATION_PCR_MISMATCH)
89
+ * and `error.cause` to inspect the original verifier error.
90
+ */
91
+ declare class SessionAttestationError extends SessionError {
92
+ readonly cause?: unknown;
93
+ constructor(message?: string, code?: ErrorCode, context?: Record<string, unknown>, cause?: unknown);
94
+ }
95
+ declare class SessionRequestTimeoutError extends SessionError {
96
+ constructor(context?: Record<string, unknown>);
97
+ }
98
+ declare class SessionDisposedError extends SessionError {
99
+ constructor(context?: Record<string, unknown>);
100
+ }
101
+ declare class SessionServerError extends SessionError {
102
+ constructor(reason: string, context?: Record<string, unknown>);
103
+ }
104
+ declare class SessionMessageParseError extends SessionError {
105
+ constructor(context?: Record<string, unknown>);
106
+ }
107
+ /**
108
+ * The remote server returned an explicit error response.
109
+ * Carries the full WebSocketError payload so callers can inspect
110
+ * `serverError.type` and `serverError.details`.
111
+ */
112
+ declare class SessionRemoteError extends SessionError {
113
+ readonly serverError: WebSocketError;
114
+ constructor(serverError: WebSocketError, context?: Record<string, unknown>);
115
+ }
116
+ declare class ClientUnsupportedAlgorithmError extends ClientError {
117
+ constructor(context?: Record<string, unknown>);
118
+ }
119
+ declare class ClientSessionEstablishFailedError extends ClientError {
120
+ constructor(context?: Record<string, unknown>);
121
+ }
122
+
123
+ /**
124
+ * Error classification result from Forward MPC operations.
125
+ */
126
+ type ForwardMpcErrorType = 'ATTESTATION_FAILURE' | 'FORWARD_MPC_TIMEOUT' | 'FORWARD_MPC_ERROR';
127
+ /**
128
+ * Result of classifying a Forward MPC error.
129
+ */
130
+ interface ForwardMpcErrorClassification {
131
+ /** The type of error encountered */
132
+ errorType: ForwardMpcErrorType;
133
+ /** Error code from ForwardMPCError, if available */
134
+ errorCode: string | undefined;
135
+ /** Error message */
136
+ errorMessage: string;
137
+ /** Attestation verification errors, if this is an attestation failure */
138
+ attestationErrors?: unknown[];
139
+ /** Whether the session was established before the error occurred */
140
+ sessionEstablished: boolean;
141
+ /** Whether this error should trigger a fallback to relay-based MPC */
142
+ shouldFallback: boolean;
143
+ }
144
+ /**
145
+ * Classifies a Forward MPC error and returns structured data for logging.
146
+ * Use this to standardize error handling across keygen, signing, and connect operations.
147
+ *
148
+ * @param error - The error to classify
149
+ * @returns Classification result with error details and recommended action
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * try {
154
+ * await forwardMpcClient.sign(...);
155
+ * } catch (error) {
156
+ * const classification = classifyForwardMpcError(error);
157
+ * logger.warn(`Forward MPC ${operation} failed`, {
158
+ * ...classification,
159
+ * chainName,
160
+ * environmentId,
161
+ * });
162
+ * if (classification.shouldFallback) {
163
+ * // Fall through to relay-based MPC
164
+ * } else {
165
+ * throw error;
166
+ * }
167
+ * }
168
+ * ```
169
+ */
170
+ declare function classifyForwardMpcError(error: unknown): ForwardMpcErrorClassification;
171
+ /**
172
+ * Type guard to check if an error is a Forward MPC error that should be handled.
173
+ */
174
+ declare function isForwardMpcError(error: unknown): error is ForwardMPCError;
175
+ /**
176
+ * Type guard to check if an error is an attestation failure.
177
+ */
178
+ declare function isAttestationError(error: unknown): error is SessionAttestationError;
179
+
180
+ export { AttestationErrorCode as A, ClientError as C, ErrorCode as E, ForwardMPCError as F, SessionAttestationError as S, TransportConnectionError as T, ClientSessionEstablishFailedError as a, ClientUnsupportedAlgorithmError as b, ForwardMPCErrorType as c, type ForwardMpcErrorClassification as d, type ForwardMpcErrorType as e, SessionDisposedError as f, SessionError as g, SessionHandshakeError as h, SessionHandshakeInvalidResponseError as i, SessionMessageParseError as j, SessionRemoteError as k, SessionRequestTimeoutError as l, SessionServerError as m, TransportConnectionTimeoutError as n, TransportError as o, TransportNotConnectedError as p, classifyForwardMpcError as q, isAttestationError as r, isForwardMpcError as s };
package/dist/utils.cjs ADDED
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
+
6
+ // src/client-v2/errors.ts
7
+ var ErrorCode = {
8
+ ATTESTATION_FAILED: "ATTESTATION_FAILED",
9
+ REQUEST_TIMEOUT: "REQUEST_TIMEOUT"};
10
+ var ForwardMPCErrorType = {
11
+ SESSION: "session"};
12
+ var ForwardMPCError = class extends Error {
13
+ static {
14
+ __name(this, "ForwardMPCError");
15
+ }
16
+ code;
17
+ type;
18
+ context;
19
+ constructor(message, code, type, context) {
20
+ super(message);
21
+ this.name = this.constructor.name;
22
+ this.code = code;
23
+ this.type = type;
24
+ this.context = context;
25
+ Object.setPrototypeOf(this, new.target.prototype);
26
+ }
27
+ toJSON() {
28
+ return {
29
+ name: this.name,
30
+ message: this.message,
31
+ code: this.code,
32
+ type: this.type,
33
+ stack: this.stack,
34
+ context: this.context
35
+ };
36
+ }
37
+ };
38
+ var SessionError = class extends ForwardMPCError {
39
+ static {
40
+ __name(this, "SessionError");
41
+ }
42
+ constructor(message, code, context) {
43
+ super(message, code, ForwardMPCErrorType.SESSION, context);
44
+ }
45
+ };
46
+ var SessionAttestationError = class extends SessionError {
47
+ static {
48
+ __name(this, "SessionAttestationError");
49
+ }
50
+ cause;
51
+ constructor(message = "Attestation verification failed", code = ErrorCode.ATTESTATION_FAILED, context, cause) {
52
+ super(message, code, context);
53
+ if (cause !== void 0) {
54
+ this.cause = cause;
55
+ }
56
+ }
57
+ };
58
+ var SessionRequestTimeoutError = class extends SessionError {
59
+ static {
60
+ __name(this, "SessionRequestTimeoutError");
61
+ }
62
+ constructor(context) {
63
+ super("Request timed out waiting for server response", ErrorCode.REQUEST_TIMEOUT, context);
64
+ }
65
+ };
66
+
67
+ // src/client-v2/error-classification.ts
68
+ function classifyForwardMpcError(error) {
69
+ if (error instanceof SessionAttestationError) {
70
+ return {
71
+ errorType: "ATTESTATION_FAILURE",
72
+ errorCode: error.code,
73
+ errorMessage: error.message,
74
+ attestationErrors: error.context?.["errors"],
75
+ sessionEstablished: false,
76
+ shouldFallback: true
77
+ };
78
+ }
79
+ if (error instanceof SessionRequestTimeoutError) {
80
+ return {
81
+ errorType: "FORWARD_MPC_TIMEOUT",
82
+ errorCode: error.code,
83
+ errorMessage: error.message,
84
+ sessionEstablished: true,
85
+ shouldFallback: false
86
+ };
87
+ }
88
+ if (error instanceof ForwardMPCError) {
89
+ return {
90
+ errorType: "FORWARD_MPC_ERROR",
91
+ errorCode: error.code,
92
+ errorMessage: error.message,
93
+ sessionEstablished: true,
94
+ shouldFallback: false
95
+ };
96
+ }
97
+ return {
98
+ errorType: "FORWARD_MPC_ERROR",
99
+ errorCode: void 0,
100
+ errorMessage: error instanceof Error ? error.message : String(error),
101
+ sessionEstablished: false,
102
+ shouldFallback: false
103
+ };
104
+ }
105
+ __name(classifyForwardMpcError, "classifyForwardMpcError");
106
+ function isForwardMpcError(error) {
107
+ return error instanceof ForwardMPCError;
108
+ }
109
+ __name(isForwardMpcError, "isForwardMpcError");
110
+ function isAttestationError(error) {
111
+ return error instanceof SessionAttestationError;
112
+ }
113
+ __name(isAttestationError, "isAttestationError");
114
+
115
+ exports.classifyForwardMpcError = classifyForwardMpcError;
116
+ exports.isAttestationError = isAttestationError;
117
+ exports.isForwardMpcError = isForwardMpcError;
118
+ //# sourceMappingURL=utils.cjs.map
119
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client-v2/errors.ts","../src/client-v2/error-classification.ts"],"names":["ErrorCode","ATTESTATION_FAILED","REQUEST_TIMEOUT","ForwardMPCErrorType","SESSION","ForwardMPCError","Error","code","type","context","message","name","Object","setPrototypeOf","prototype","toJSON","stack","SessionError","SessionAttestationError","cause","undefined","SessionRequestTimeoutError","classifyForwardMpcError","error","errorType","errorCode","errorMessage","attestationErrors","sessionEstablished","shouldFallback","String","isForwardMpcError","isAttestationError"],"mappings":"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","file":"utils.cjs","sourcesContent":["import { type WebSocketError } from '@dynamic-labs-wallet/forward-mpc-shared';\n\n// ─── Error codes ──────────────────────────────────────────────────────────────\n\nexport const ErrorCode = {\n // Transport\n CONNECTION_FAILED: 'CONNECTION_FAILED',\n CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',\n NOT_CONNECTED: 'NOT_CONNECTED',\n // Session\n HANDSHAKE_FAILED: 'HANDSHAKE_FAILED',\n HANDSHAKE_INVALID_RESPONSE: 'HANDSHAKE_INVALID_RESPONSE',\n ATTESTATION_FAILED: 'ATTESTATION_FAILED',\n ATTESTATION_PCR_MISMATCH: 'ATTESTATION_PCR_MISMATCH',\n ATTESTATION_CHALLENGE_MISMATCH: 'ATTESTATION_CHALLENGE_MISMATCH',\n ATTESTATION_NONCE_MISMATCH: 'ATTESTATION_NONCE_MISMATCH',\n ATTESTATION_NONCE_MISSING: 'ATTESTATION_NONCE_MISSING',\n ATTESTATION_DOCUMENT_MISSING: 'ATTESTATION_DOCUMENT_MISSING',\n REQUEST_TIMEOUT: 'REQUEST_TIMEOUT',\n SESSION_DISPOSED: 'SESSION_DISPOSED',\n SERVER_ERROR: 'SERVER_ERROR',\n MESSAGE_PARSE_FAILED: 'MESSAGE_PARSE_FAILED',\n // Client\n SESSION_ESTABLISH_FAILED: 'SESSION_ESTABLISH_FAILED',\n UNSUPPORTED_ALGORITHM: 'UNSUPPORTED_ALGORITHM',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Focused subset of ErrorCode for attestation verification failures.\n * Use with `error.code` to distinguish failure modes on SessionAttestationError.\n */\nexport const AttestationErrorCode = {\n /** Generic / unrecognised attestation failure */\n FAILED: ErrorCode.ATTESTATION_FAILED,\n /** PCR8 hash mismatch — enclave measurement changed */\n PCR_MISMATCH: ErrorCode.ATTESTATION_PCR_MISMATCH,\n /** Challenge / ciphertext binding mismatch */\n CHALLENGE_MISMATCH: ErrorCode.ATTESTATION_CHALLENGE_MISMATCH,\n /** Nonce value mismatch — possible tampering */\n NONCE_MISMATCH: ErrorCode.ATTESTATION_NONCE_MISMATCH,\n /** Nonce field missing from attestation document */\n NONCE_MISSING: ErrorCode.ATTESTATION_NONCE_MISSING,\n /** Server did not return an attestation document */\n DOCUMENT_MISSING: ErrorCode.ATTESTATION_DOCUMENT_MISSING,\n} as const;\n\nexport type AttestationErrorCode =\n (typeof AttestationErrorCode)[keyof typeof AttestationErrorCode];\n\n// ─── Error types ──────────────────────────────────────────────────────────────\n\nexport const ForwardMPCErrorType = {\n TRANSPORT: 'transport',\n SESSION: 'session',\n CLIENT: 'client',\n} as const;\n\nexport type ForwardMPCErrorType =\n (typeof ForwardMPCErrorType)[keyof typeof ForwardMPCErrorType];\n\n// ─── Root base class ──────────────────────────────────────────────────────────\n\n/**\n * Abstract root for all Forward MPC errors.\n * `instanceof ForwardMPCError` is true for every error thrown by this library.\n */\nexport abstract class ForwardMPCError extends Error {\n public readonly code: ErrorCode;\n public readonly type: ForwardMPCErrorType;\n public readonly context?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: ErrorCode,\n type: ForwardMPCErrorType,\n context?: Record<string, unknown>\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n this.type = type;\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n type: this.type,\n stack: this.stack,\n context: this.context,\n };\n }\n}\n\n// ─── Layer base classes ───────────────────────────────────────────────────────\n\n/** Abstract base for errors originating from the WebSocket / transport layer. */\nexport abstract class TransportError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.TRANSPORT, context);\n }\n}\n\n/** Abstract base for errors originating from the session / crypto / protocol layer. */\nexport abstract class SessionError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.SESSION, context);\n }\n}\n\n/** Abstract base for errors originating from the client / application layer. */\nexport abstract class ClientError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.CLIENT, context);\n }\n}\n\n// ─── Transport errors ─────────────────────────────────────────────────────────\n\nexport class TransportConnectionError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super('WebSocket connection failed', ErrorCode.CONNECTION_FAILED, context);\n }\n}\n\nexport class TransportConnectionTimeoutError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'WebSocket connection timed out',\n ErrorCode.CONNECTION_TIMEOUT,\n context\n );\n }\n}\n\nexport class TransportNotConnectedError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super('WebSocket is not connected', ErrorCode.NOT_CONNECTED, context);\n }\n}\n\n// ─── Session errors ───────────────────────────────────────────────────────────\n\nexport class SessionHandshakeError extends SessionError {\n constructor(reason: string, context?: Record<string, unknown>) {\n super(\n `ML-KEM-768 handshake failed: ${reason}`,\n ErrorCode.HANDSHAKE_FAILED,\n { reason, ...context }\n );\n }\n}\n\nexport class SessionHandshakeInvalidResponseError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Handshake response was invalid or incomplete',\n ErrorCode.HANDSHAKE_INVALID_RESPONSE,\n context\n );\n }\n}\n\n/**\n * Attestation verification failure.\n * Use `error.code` to distinguish failure reasons (e.g. ATTESTATION_PCR_MISMATCH)\n * and `error.cause` to inspect the original verifier error.\n */\nexport class SessionAttestationError extends SessionError {\n public readonly cause?: unknown;\n\n constructor(\n message: string = 'Attestation verification failed',\n code: ErrorCode = ErrorCode.ATTESTATION_FAILED,\n context?: Record<string, unknown>,\n cause?: unknown\n ) {\n super(message, code, context);\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n\nexport class SessionRequestTimeoutError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Request timed out waiting for server response',\n ErrorCode.REQUEST_TIMEOUT,\n context\n );\n }\n}\n\nexport class SessionDisposedError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super('Session has been disposed', ErrorCode.SESSION_DISPOSED, context);\n }\n}\n\nexport class SessionServerError extends SessionError {\n constructor(reason: string, context?: Record<string, unknown>) {\n super(\n `Server returned an error response: ${reason}`,\n ErrorCode.SERVER_ERROR,\n { reason, ...context }\n );\n }\n}\n\nexport class SessionMessageParseError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Failed to parse server message',\n ErrorCode.MESSAGE_PARSE_FAILED,\n context\n );\n }\n}\n\n/**\n * The remote server returned an explicit error response.\n * Carries the full WebSocketError payload so callers can inspect\n * `serverError.type` and `serverError.details`.\n */\nexport class SessionRemoteError extends SessionError {\n constructor(\n public readonly serverError: WebSocketError,\n context?: Record<string, unknown>\n ) {\n super(serverError.message, ErrorCode.SERVER_ERROR, context);\n }\n}\n\n// ─── Client errors ────────────────────────────────────────────────────────────\n\nexport class ClientUnsupportedAlgorithmError extends ClientError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Signing algorithm is not supported',\n ErrorCode.UNSUPPORTED_ALGORITHM,\n context\n );\n }\n}\n\nexport class ClientSessionEstablishFailedError extends ClientError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Failed to establish session',\n ErrorCode.SESSION_ESTABLISH_FAILED,\n context\n );\n }\n}\n","import {\n ForwardMPCError,\n SessionAttestationError,\n SessionRequestTimeoutError,\n} from './errors';\n\n/**\n * Error classification result from Forward MPC operations.\n */\nexport type ForwardMpcErrorType =\n | 'ATTESTATION_FAILURE'\n | 'FORWARD_MPC_TIMEOUT'\n | 'FORWARD_MPC_ERROR';\n\n/**\n * Result of classifying a Forward MPC error.\n */\nexport interface ForwardMpcErrorClassification {\n /** The type of error encountered */\n errorType: ForwardMpcErrorType;\n /** Error code from ForwardMPCError, if available */\n errorCode: string | undefined;\n /** Error message */\n errorMessage: string;\n /** Attestation verification errors, if this is an attestation failure */\n attestationErrors?: unknown[];\n /** Whether the session was established before the error occurred */\n sessionEstablished: boolean;\n /** Whether this error should trigger a fallback to relay-based MPC */\n shouldFallback: boolean;\n}\n\n/**\n * Classifies a Forward MPC error and returns structured data for logging.\n * Use this to standardize error handling across keygen, signing, and connect operations.\n *\n * @param error - The error to classify\n * @returns Classification result with error details and recommended action\n *\n * @example\n * ```typescript\n * try {\n * await forwardMpcClient.sign(...);\n * } catch (error) {\n * const classification = classifyForwardMpcError(error);\n * logger.warn(`Forward MPC ${operation} failed`, {\n * ...classification,\n * chainName,\n * environmentId,\n * });\n * if (classification.shouldFallback) {\n * // Fall through to relay-based MPC\n * } else {\n * throw error;\n * }\n * }\n * ```\n */\nexport function classifyForwardMpcError(\n error: unknown\n): ForwardMpcErrorClassification {\n if (error instanceof SessionAttestationError) {\n return {\n errorType: 'ATTESTATION_FAILURE',\n errorCode: error.code,\n errorMessage: error.message,\n attestationErrors: error.context?.['errors'] as unknown[] | undefined,\n sessionEstablished: false,\n shouldFallback: true,\n };\n }\n\n if (error instanceof SessionRequestTimeoutError) {\n return {\n errorType: 'FORWARD_MPC_TIMEOUT',\n errorCode: error.code,\n errorMessage: error.message,\n sessionEstablished: true,\n shouldFallback: false,\n };\n }\n\n if (error instanceof ForwardMPCError) {\n return {\n errorType: 'FORWARD_MPC_ERROR',\n errorCode: error.code,\n errorMessage: error.message,\n sessionEstablished: true,\n shouldFallback: false,\n };\n }\n\n // Unknown error type\n return {\n errorType: 'FORWARD_MPC_ERROR',\n errorCode: undefined,\n errorMessage: error instanceof Error ? error.message : String(error),\n sessionEstablished: false,\n shouldFallback: false,\n };\n}\n\n/**\n * Type guard to check if an error is a Forward MPC error that should be handled.\n */\nexport function isForwardMpcError(error: unknown): error is ForwardMPCError {\n return error instanceof ForwardMPCError;\n}\n\n/**\n * Type guard to check if an error is an attestation failure.\n */\nexport function isAttestationError(\n error: unknown\n): error is SessionAttestationError {\n return error instanceof SessionAttestationError;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export { d as ForwardMpcErrorClassification, e as ForwardMpcErrorType, q as classifyForwardMpcError, r as isAttestationError, s as isForwardMpcError } from './utils-pzTJsc5g.cjs';
2
+ import '@dynamic-labs-wallet/forward-mpc-shared';
@@ -0,0 +1,2 @@
1
+ export { d as ForwardMpcErrorClassification, e as ForwardMpcErrorType, q as classifyForwardMpcError, r as isAttestationError, s as isForwardMpcError } from './utils-pzTJsc5g.js';
2
+ import '@dynamic-labs-wallet/forward-mpc-shared';
package/dist/utils.js ADDED
@@ -0,0 +1,115 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/client-v2/errors.ts
5
+ var ErrorCode = {
6
+ ATTESTATION_FAILED: "ATTESTATION_FAILED",
7
+ REQUEST_TIMEOUT: "REQUEST_TIMEOUT"};
8
+ var ForwardMPCErrorType = {
9
+ SESSION: "session"};
10
+ var ForwardMPCError = class extends Error {
11
+ static {
12
+ __name(this, "ForwardMPCError");
13
+ }
14
+ code;
15
+ type;
16
+ context;
17
+ constructor(message, code, type, context) {
18
+ super(message);
19
+ this.name = this.constructor.name;
20
+ this.code = code;
21
+ this.type = type;
22
+ this.context = context;
23
+ Object.setPrototypeOf(this, new.target.prototype);
24
+ }
25
+ toJSON() {
26
+ return {
27
+ name: this.name,
28
+ message: this.message,
29
+ code: this.code,
30
+ type: this.type,
31
+ stack: this.stack,
32
+ context: this.context
33
+ };
34
+ }
35
+ };
36
+ var SessionError = class extends ForwardMPCError {
37
+ static {
38
+ __name(this, "SessionError");
39
+ }
40
+ constructor(message, code, context) {
41
+ super(message, code, ForwardMPCErrorType.SESSION, context);
42
+ }
43
+ };
44
+ var SessionAttestationError = class extends SessionError {
45
+ static {
46
+ __name(this, "SessionAttestationError");
47
+ }
48
+ cause;
49
+ constructor(message = "Attestation verification failed", code = ErrorCode.ATTESTATION_FAILED, context, cause) {
50
+ super(message, code, context);
51
+ if (cause !== void 0) {
52
+ this.cause = cause;
53
+ }
54
+ }
55
+ };
56
+ var SessionRequestTimeoutError = class extends SessionError {
57
+ static {
58
+ __name(this, "SessionRequestTimeoutError");
59
+ }
60
+ constructor(context) {
61
+ super("Request timed out waiting for server response", ErrorCode.REQUEST_TIMEOUT, context);
62
+ }
63
+ };
64
+
65
+ // src/client-v2/error-classification.ts
66
+ function classifyForwardMpcError(error) {
67
+ if (error instanceof SessionAttestationError) {
68
+ return {
69
+ errorType: "ATTESTATION_FAILURE",
70
+ errorCode: error.code,
71
+ errorMessage: error.message,
72
+ attestationErrors: error.context?.["errors"],
73
+ sessionEstablished: false,
74
+ shouldFallback: true
75
+ };
76
+ }
77
+ if (error instanceof SessionRequestTimeoutError) {
78
+ return {
79
+ errorType: "FORWARD_MPC_TIMEOUT",
80
+ errorCode: error.code,
81
+ errorMessage: error.message,
82
+ sessionEstablished: true,
83
+ shouldFallback: false
84
+ };
85
+ }
86
+ if (error instanceof ForwardMPCError) {
87
+ return {
88
+ errorType: "FORWARD_MPC_ERROR",
89
+ errorCode: error.code,
90
+ errorMessage: error.message,
91
+ sessionEstablished: true,
92
+ shouldFallback: false
93
+ };
94
+ }
95
+ return {
96
+ errorType: "FORWARD_MPC_ERROR",
97
+ errorCode: void 0,
98
+ errorMessage: error instanceof Error ? error.message : String(error),
99
+ sessionEstablished: false,
100
+ shouldFallback: false
101
+ };
102
+ }
103
+ __name(classifyForwardMpcError, "classifyForwardMpcError");
104
+ function isForwardMpcError(error) {
105
+ return error instanceof ForwardMPCError;
106
+ }
107
+ __name(isForwardMpcError, "isForwardMpcError");
108
+ function isAttestationError(error) {
109
+ return error instanceof SessionAttestationError;
110
+ }
111
+ __name(isAttestationError, "isAttestationError");
112
+
113
+ export { classifyForwardMpcError, isAttestationError, isForwardMpcError };
114
+ //# sourceMappingURL=utils.js.map
115
+ //# sourceMappingURL=utils.js.map