@bananalink-sdk/protocol 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-KNGZKGRS.cjs → chunk-RZPN2GDJ.cjs} +13 -4
- package/dist/chunk-RZPN2GDJ.cjs.map +1 -0
- package/dist/{chunk-7KYDLL3B.js → chunk-XCMAKN3P.js} +13 -5
- package/dist/chunk-XCMAKN3P.js.map +1 -0
- package/dist/{client-session-claim-C4lUik3b.d.cts → client-session-claim-CkRKTG50.d.cts} +12 -2
- package/dist/{client-session-claim-3QF3noOr.d.ts → client-session-claim-CrIDASkZ.d.ts} +12 -2
- package/dist/{crypto-BUS06Qz-.d.cts → crypto-BK0Ile6V.d.cts} +1 -1
- package/dist/{crypto-BUS06Qz-.d.ts → crypto-BK0Ile6V.d.ts} +1 -1
- package/dist/crypto-export.d.cts +1 -1
- package/dist/crypto-export.d.ts +1 -1
- package/dist/index.cjs +6 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -4
- package/dist/index.d.ts +31 -4
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/schemas-export.cjs +76 -72
- package/dist/schemas-export.d.cts +116 -1
- package/dist/schemas-export.d.ts +116 -1
- package/dist/schemas-export.js +1 -1
- package/dist/testing.d.cts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/validation-export.cjs +76 -72
- package/dist/validation-export.d.cts +1 -1
- package/dist/validation-export.d.ts +1 -1
- package/dist/validation-export.js +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/schemas/client-messages.ts +14 -0
- package/src/schemas/wallet-messages.ts +4 -0
- package/src/types/client-messages.ts +26 -1
- package/src/types/index.ts +9 -0
- package/src/types/persistence.ts +32 -0
- package/src/types/wallet-messages.ts +6 -2
- package/dist/chunk-7KYDLL3B.js.map +0 -1
- package/dist/chunk-KNGZKGRS.cjs.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { DAppMetadata, DisplayInfo, EncryptedPayload, QRPayload, RelayMessage, SIWEFields, SecurityPolicy, SessionInfo, authenticateConnectionPayloadSchema, authenticationDataSchema, bananaLinkErrorSchema, base64Schema, claimSessionPayloadSchema, clientMessageEnvelopeSchema, clientMessagePayloadSchema, clientReconnectPayloadSchema, clientSessionClaimSchema, closeSessionPayloadSchema, connectionAuthenticatedMessageSchema, connectionRejectedMessageSchema, connectionRejectedPayloadSchema, coreDAppMetadataSchema, coreSecurityPolicySchema, createSessionRequestSchema, createSessionResponseSchema, dAppMetadataSchema, displayInfoSchema, encryptedPayloadSchema, errorCodeSchema, frutiLinkSchema, originProofSchema, prefetchMetadataPayloadSchema, prefetchMetadataResponseSchema, publicKeySchema, qrPayloadSchema, reconnectedMessageSchema, rejectionDataSchema, relayMessageSchema, relayMessageTypeSchema, relayNotificationMessageSchema, relayToDAppMessageSchema, safeValidateClientMessage, safeValidateClientSessionClaim, safeValidateFrutiLink, safeValidateQRPayload, safeValidateRelayMessage, safeValidateRelayNotificationMessage, safeValidateRelayToDAppMessage, safeValidateSessionInfo, safeValidateWalletMessage, safeValidateWalletSessionClaim, securityPolicySchema, sessionClosedAckSchema, sessionClosedNotificationSchema, sessionConfigSchema, sessionIdSchema, sessionInfoSchema, sessionMetadataSchema, sessionOptionsSchema, sessionStateSchema, siweFieldsSchema, supportedChainIdSchema, validateClientMessage, validateClientSessionClaim, validateFrutiLink, validateQRPayload, validateRelayMessage, validateRelayNotificationMessage, validateRelayToDAppMessage, validateSessionInfo, validateTimestamp, validateWalletMessage, validateWalletSessionClaim, walletHandshakeMessageSchema, walletMessageEnvelopeSchema, walletMessagePayloadSchema, walletMetadataSchema, walletReconnectPayloadSchema, walletSessionClaimSchema } from './schemas-export.cjs';
|
|
1
|
+
export { DAppMetadata, DisplayInfo, EncryptedPayload, QRPayload, RelayMessage, SIWEFields, SecurityPolicy, SessionInfo, authenticateConnectionPayloadSchema, authenticationDataSchema, bananaLinkErrorSchema, base64Schema, claimSessionPayloadSchema, clientHandshakeMessageSchema, clientMessageEnvelopeSchema, clientMessagePayloadSchema, clientReconnectPayloadSchema, clientSessionClaimSchema, closeSessionPayloadSchema, connectionAuthenticatedMessageSchema, connectionRejectedMessageSchema, connectionRejectedPayloadSchema, coreDAppMetadataSchema, coreSecurityPolicySchema, createSessionRequestSchema, createSessionResponseSchema, dAppMetadataSchema, displayInfoSchema, encryptedPayloadSchema, errorCodeSchema, frutiLinkSchema, originProofSchema, prefetchMetadataPayloadSchema, prefetchMetadataResponseSchema, publicKeySchema, qrPayloadSchema, reconnectedMessageSchema, rejectionDataSchema, relayMessageSchema, relayMessageTypeSchema, relayNotificationMessageSchema, relayToDAppMessageSchema, safeValidateClientMessage, safeValidateClientSessionClaim, safeValidateFrutiLink, safeValidateQRPayload, safeValidateRelayMessage, safeValidateRelayNotificationMessage, safeValidateRelayToDAppMessage, safeValidateSessionInfo, safeValidateWalletMessage, safeValidateWalletSessionClaim, securityPolicySchema, sessionClosedAckSchema, sessionClosedNotificationSchema, sessionConfigSchema, sessionIdSchema, sessionInfoSchema, sessionMetadataSchema, sessionOptionsSchema, sessionStateSchema, siweFieldsSchema, supportedChainIdSchema, validateClientMessage, validateClientSessionClaim, validateFrutiLink, validateQRPayload, validateRelayMessage, validateRelayNotificationMessage, validateRelayToDAppMessage, validateSessionInfo, validateTimestamp, validateWalletMessage, validateWalletSessionClaim, walletHandshakeMessageSchema, walletMessageEnvelopeSchema, walletMessagePayloadSchema, walletMetadataSchema, walletReconnectPayloadSchema, walletSessionClaimSchema } from './schemas-export.cjs';
|
|
2
2
|
export { SIWEMessage, ValidationResult, createValidationResult, hasRequiredFields, isValidAddress, isValidBase64, isValidChainId, isValidDomain, isValidEncryptedPayload, isValidEncryptionAlgorithm, isValidHex, isValidMessageType, isValidNonce, isValidPublicKey, isValidSIWEMessage, isValidSessionId, isValidTimestamp, isValidUrl } from './validators-export.cjs';
|
|
3
3
|
import 'zod';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { DAppMetadata, DisplayInfo, EncryptedPayload, QRPayload, RelayMessage, SIWEFields, SecurityPolicy, SessionInfo, authenticateConnectionPayloadSchema, authenticationDataSchema, bananaLinkErrorSchema, base64Schema, claimSessionPayloadSchema, clientMessageEnvelopeSchema, clientMessagePayloadSchema, clientReconnectPayloadSchema, clientSessionClaimSchema, closeSessionPayloadSchema, connectionAuthenticatedMessageSchema, connectionRejectedMessageSchema, connectionRejectedPayloadSchema, coreDAppMetadataSchema, coreSecurityPolicySchema, createSessionRequestSchema, createSessionResponseSchema, dAppMetadataSchema, displayInfoSchema, encryptedPayloadSchema, errorCodeSchema, frutiLinkSchema, originProofSchema, prefetchMetadataPayloadSchema, prefetchMetadataResponseSchema, publicKeySchema, qrPayloadSchema, reconnectedMessageSchema, rejectionDataSchema, relayMessageSchema, relayMessageTypeSchema, relayNotificationMessageSchema, relayToDAppMessageSchema, safeValidateClientMessage, safeValidateClientSessionClaim, safeValidateFrutiLink, safeValidateQRPayload, safeValidateRelayMessage, safeValidateRelayNotificationMessage, safeValidateRelayToDAppMessage, safeValidateSessionInfo, safeValidateWalletMessage, safeValidateWalletSessionClaim, securityPolicySchema, sessionClosedAckSchema, sessionClosedNotificationSchema, sessionConfigSchema, sessionIdSchema, sessionInfoSchema, sessionMetadataSchema, sessionOptionsSchema, sessionStateSchema, siweFieldsSchema, supportedChainIdSchema, validateClientMessage, validateClientSessionClaim, validateFrutiLink, validateQRPayload, validateRelayMessage, validateRelayNotificationMessage, validateRelayToDAppMessage, validateSessionInfo, validateTimestamp, validateWalletMessage, validateWalletSessionClaim, walletHandshakeMessageSchema, walletMessageEnvelopeSchema, walletMessagePayloadSchema, walletMetadataSchema, walletReconnectPayloadSchema, walletSessionClaimSchema } from './schemas-export.js';
|
|
1
|
+
export { DAppMetadata, DisplayInfo, EncryptedPayload, QRPayload, RelayMessage, SIWEFields, SecurityPolicy, SessionInfo, authenticateConnectionPayloadSchema, authenticationDataSchema, bananaLinkErrorSchema, base64Schema, claimSessionPayloadSchema, clientHandshakeMessageSchema, clientMessageEnvelopeSchema, clientMessagePayloadSchema, clientReconnectPayloadSchema, clientSessionClaimSchema, closeSessionPayloadSchema, connectionAuthenticatedMessageSchema, connectionRejectedMessageSchema, connectionRejectedPayloadSchema, coreDAppMetadataSchema, coreSecurityPolicySchema, createSessionRequestSchema, createSessionResponseSchema, dAppMetadataSchema, displayInfoSchema, encryptedPayloadSchema, errorCodeSchema, frutiLinkSchema, originProofSchema, prefetchMetadataPayloadSchema, prefetchMetadataResponseSchema, publicKeySchema, qrPayloadSchema, reconnectedMessageSchema, rejectionDataSchema, relayMessageSchema, relayMessageTypeSchema, relayNotificationMessageSchema, relayToDAppMessageSchema, safeValidateClientMessage, safeValidateClientSessionClaim, safeValidateFrutiLink, safeValidateQRPayload, safeValidateRelayMessage, safeValidateRelayNotificationMessage, safeValidateRelayToDAppMessage, safeValidateSessionInfo, safeValidateWalletMessage, safeValidateWalletSessionClaim, securityPolicySchema, sessionClosedAckSchema, sessionClosedNotificationSchema, sessionConfigSchema, sessionIdSchema, sessionInfoSchema, sessionMetadataSchema, sessionOptionsSchema, sessionStateSchema, siweFieldsSchema, supportedChainIdSchema, validateClientMessage, validateClientSessionClaim, validateFrutiLink, validateQRPayload, validateRelayMessage, validateRelayNotificationMessage, validateRelayToDAppMessage, validateSessionInfo, validateTimestamp, validateWalletMessage, validateWalletSessionClaim, walletHandshakeMessageSchema, walletMessageEnvelopeSchema, walletMessagePayloadSchema, walletMetadataSchema, walletReconnectPayloadSchema, walletSessionClaimSchema } from './schemas-export.js';
|
|
2
2
|
export { SIWEMessage, ValidationResult, createValidationResult, hasRequiredFields, isValidAddress, isValidBase64, isValidChainId, isValidDomain, isValidEncryptedPayload, isValidEncryptionAlgorithm, isValidHex, isValidMessageType, isValidNonce, isValidPublicKey, isValidSIWEMessage, isValidSessionId, isValidTimestamp, isValidUrl } from './validators-export.js';
|
|
3
3
|
import 'zod';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { authenticateConnectionPayloadSchema, authenticationDataSchema, bananaLinkErrorSchema, base64Schema, claimSessionPayloadSchema, clientMessageEnvelopeSchema, clientMessagePayloadSchema, clientReconnectPayloadSchema, clientSessionClaimSchema, closeSessionPayloadSchema, connectionAuthenticatedMessageSchema, connectionRejectedMessageSchema, connectionRejectedPayloadSchema, dAppMetadataSchema as coreDAppMetadataSchema, securityPolicySchema as coreSecurityPolicySchema, createSessionRequestSchema, createSessionResponseSchema, dAppMetadataSchema2 as dAppMetadataSchema, displayInfoSchema, encryptedPayloadSchema, errorCodeSchema, frutiLinkSchema, originProofSchema, prefetchMetadataPayloadSchema, prefetchMetadataResponseSchema, publicKeySchema, qrPayloadSchema, reconnectedMessageSchema, rejectionDataSchema, relayMessageSchema, relayMessageTypeSchema, relayNotificationMessageSchema, relayToDAppMessageSchema, safeValidateClientMessage, safeValidateClientSessionClaim, safeValidateFrutiLink, safeValidateQRPayload, safeValidateRelayMessage, safeValidateRelayNotificationMessage, safeValidateRelayToDAppMessage, safeValidateSessionInfo, safeValidateWalletMessage, safeValidateWalletSessionClaim, securityPolicySchema2 as securityPolicySchema, sessionClosedAckSchema, sessionClosedNotificationSchema, sessionConfigSchema, sessionIdSchema, sessionInfoSchema, sessionMetadataSchema, sessionOptionsSchema, sessionStateSchema, siweFieldsSchema, supportedChainIdSchema, validateClientMessage, validateClientSessionClaim, validateFrutiLink, validateQRPayload, validateRelayMessage, validateRelayNotificationMessage, validateRelayToDAppMessage, validateSessionInfo, validateTimestamp, validateWalletMessage, validateWalletSessionClaim, walletHandshakeMessageSchema, walletMessageEnvelopeSchema, walletMessagePayloadSchema, walletMetadataSchema, walletReconnectPayloadSchema, walletSessionClaimSchema } from './chunk-
|
|
1
|
+
export { authenticateConnectionPayloadSchema, authenticationDataSchema, bananaLinkErrorSchema, base64Schema, claimSessionPayloadSchema, clientHandshakeMessageSchema, clientMessageEnvelopeSchema, clientMessagePayloadSchema, clientReconnectPayloadSchema, clientSessionClaimSchema, closeSessionPayloadSchema, connectionAuthenticatedMessageSchema, connectionRejectedMessageSchema, connectionRejectedPayloadSchema, dAppMetadataSchema as coreDAppMetadataSchema, securityPolicySchema as coreSecurityPolicySchema, createSessionRequestSchema, createSessionResponseSchema, dAppMetadataSchema2 as dAppMetadataSchema, displayInfoSchema, encryptedPayloadSchema, errorCodeSchema, frutiLinkSchema, originProofSchema, prefetchMetadataPayloadSchema, prefetchMetadataResponseSchema, publicKeySchema, qrPayloadSchema, reconnectedMessageSchema, rejectionDataSchema, relayMessageSchema, relayMessageTypeSchema, relayNotificationMessageSchema, relayToDAppMessageSchema, safeValidateClientMessage, safeValidateClientSessionClaim, safeValidateFrutiLink, safeValidateQRPayload, safeValidateRelayMessage, safeValidateRelayNotificationMessage, safeValidateRelayToDAppMessage, safeValidateSessionInfo, safeValidateWalletMessage, safeValidateWalletSessionClaim, securityPolicySchema2 as securityPolicySchema, sessionClosedAckSchema, sessionClosedNotificationSchema, sessionConfigSchema, sessionIdSchema, sessionInfoSchema, sessionMetadataSchema, sessionOptionsSchema, sessionStateSchema, siweFieldsSchema, supportedChainIdSchema, validateClientMessage, validateClientSessionClaim, validateFrutiLink, validateQRPayload, validateRelayMessage, validateRelayNotificationMessage, validateRelayToDAppMessage, validateSessionInfo, validateTimestamp, validateWalletMessage, validateWalletSessionClaim, walletHandshakeMessageSchema, walletMessageEnvelopeSchema, walletMessagePayloadSchema, walletMetadataSchema, walletReconnectPayloadSchema, walletSessionClaimSchema } from './chunk-XCMAKN3P.js';
|
|
2
2
|
import './chunk-CUJK7ZTS.js';
|
|
3
3
|
export { createValidationResult, hasRequiredFields, isValidAddress, isValidBase64, isValidChainId, isValidDomain, isValidEncryptedPayload, isValidEncryptionAlgorithm, isValidHex, isValidMessageType, isValidNonce, isValidPublicKey, isValidSIWEMessage, isValidSessionId, isValidTimestamp, isValidUrl } from './chunk-JXHV66Q4.js';
|
|
4
4
|
import './chunk-WCQVDF3K.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bananalink-sdk/protocol",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Core protocol definitions for BananaLink. Provides TypeScript types, Zod validation schemas, cryptographic utilities, and shared constants for wallet connections.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
package/src/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ export * from './types/providers';
|
|
|
17
17
|
export * from './types/wallet-messages';
|
|
18
18
|
export * from './types/client-messages';
|
|
19
19
|
export * from './types/relay-messages';
|
|
20
|
+
export * from './types/persistence';
|
|
20
21
|
|
|
21
22
|
// Note: Zod validation schemas have been moved to '@bananalink-sdk/protocol/schemas'
|
|
22
23
|
// For runtime validation, import from '@bananalink-sdk/protocol/schemas'
|
|
@@ -15,6 +15,20 @@ export const clientSessionClaimSchema = z.object({
|
|
|
15
15
|
// Client message payload schemas
|
|
16
16
|
export const clientReconnectPayloadSchema = z.object({
|
|
17
17
|
type: z.literal('client_reconnect'),
|
|
18
|
+
sessionClaim: clientSessionClaimSchema,
|
|
19
|
+
clientPublicKey: z
|
|
20
|
+
.string()
|
|
21
|
+
.min(1, 'Client public key cannot be empty')
|
|
22
|
+
.regex(/^(AES-GCM:|cleartext:)/, 'Client public key must start with "AES-GCM:" or "cleartext:"'),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export const clientHandshakeMessageSchema = z.object({
|
|
26
|
+
type: z.literal('client_handshake'),
|
|
27
|
+
clientPublicKey: z
|
|
28
|
+
.string()
|
|
29
|
+
.min(1, 'Client public key cannot be empty')
|
|
30
|
+
.regex(/^(AES-GCM:|cleartext:)/, 'Client public key must start with "AES-GCM:" or "cleartext:"'),
|
|
31
|
+
timestamp: z.number().int().positive('Timestamp must be a positive integer'),
|
|
18
32
|
});
|
|
19
33
|
|
|
20
34
|
export const closeSessionPayloadSchema = z.object({
|
|
@@ -46,6 +46,10 @@ export const authenticateConnectionPayloadSchema = z.object({
|
|
|
46
46
|
|
|
47
47
|
export const walletReconnectPayloadSchema = z.object({
|
|
48
48
|
type: z.literal('wallet_reconnect'),
|
|
49
|
+
walletPublicKey: z
|
|
50
|
+
.string()
|
|
51
|
+
.min(1, 'Wallet public key cannot be empty')
|
|
52
|
+
.regex(/^(AES-GCM:|cleartext:)/, 'Wallet public key must start with "AES-GCM:" or "cleartext:"'),
|
|
49
53
|
});
|
|
50
54
|
|
|
51
55
|
// Union of all wallet message payloads
|
|
@@ -29,10 +29,26 @@ export interface ClientSessionClaim {
|
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Client reconnect payload
|
|
32
|
-
* Used to reconnect after network interruption
|
|
32
|
+
* Used to reconnect after network interruption with re-handshake support
|
|
33
33
|
*/
|
|
34
34
|
export interface ClientReconnectPayload {
|
|
35
35
|
type: 'client_reconnect';
|
|
36
|
+
/** Client session claim for authentication */
|
|
37
|
+
sessionClaim: ClientSessionClaim;
|
|
38
|
+
/** Client's public key for ECDH key exchange in format "algorithm:base64_public_key" (e.g., "AES-GCM:...") */
|
|
39
|
+
clientPublicKey: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Client handshake message
|
|
44
|
+
* Sent during re-handshake when client is the connected party responding to wallet reconnect
|
|
45
|
+
*/
|
|
46
|
+
export interface ClientHandshakeMessage {
|
|
47
|
+
type: 'client_handshake';
|
|
48
|
+
/** Client's public key for ECDH key exchange in format "algorithm:base64_public_key" (e.g., "AES-GCM:...") */
|
|
49
|
+
clientPublicKey: string;
|
|
50
|
+
/** Message timestamp */
|
|
51
|
+
timestamp: number;
|
|
36
52
|
}
|
|
37
53
|
|
|
38
54
|
/**
|
|
@@ -52,6 +68,8 @@ export type ClientMessagePayload =
|
|
|
52
68
|
// Session management payloads
|
|
53
69
|
| ClientReconnectPayload
|
|
54
70
|
| CloseSessionPayload
|
|
71
|
+
// Re-handshake payload (sent by connected client when wallet reconnects)
|
|
72
|
+
| ClientHandshakeMessage
|
|
55
73
|
// Post-authentication operation request payloads (v2.1+)
|
|
56
74
|
| SignMessageRequestPayload
|
|
57
75
|
| SignTypedDataRequestPayload
|
|
@@ -82,3 +100,10 @@ export function isClientReconnectPayload(payload: ClientMessagePayload): payload
|
|
|
82
100
|
export function isCloseSessionPayload(payload: ClientMessagePayload): payload is CloseSessionPayload {
|
|
83
101
|
return payload?.type === 'close_session';
|
|
84
102
|
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Type guard for client handshake message (used during re-handshake)
|
|
106
|
+
*/
|
|
107
|
+
export function isClientHandshakeMessage(message: unknown): message is ClientHandshakeMessage {
|
|
108
|
+
return (message as ClientHandshakeMessage)?.type === 'client_handshake';
|
|
109
|
+
}
|
package/src/types/index.ts
CHANGED
|
@@ -32,6 +32,7 @@ export type {
|
|
|
32
32
|
ConnectionRejectedMessage,
|
|
33
33
|
ConnectionAuthenticatedMessage,
|
|
34
34
|
RelayToDAppMessage,
|
|
35
|
+
RelayToWalletMessage,
|
|
35
36
|
PrefetchMetadataResponse,
|
|
36
37
|
} from './wallet-messages';
|
|
37
38
|
|
|
@@ -115,12 +116,14 @@ export type {
|
|
|
115
116
|
ClientReconnectPayload,
|
|
116
117
|
CloseSessionPayload,
|
|
117
118
|
ClientMessagePayload,
|
|
119
|
+
ClientHandshakeMessage,
|
|
118
120
|
} from './client-messages';
|
|
119
121
|
|
|
120
122
|
// Re-export client message type guards
|
|
121
123
|
export {
|
|
122
124
|
isClientReconnectPayload,
|
|
123
125
|
isCloseSessionPayload,
|
|
126
|
+
isClientHandshakeMessage,
|
|
124
127
|
} from './client-messages';
|
|
125
128
|
|
|
126
129
|
// Re-export v2.0 relay notification message types
|
|
@@ -195,3 +198,9 @@ export type {
|
|
|
195
198
|
KeyDerivation,
|
|
196
199
|
CryptoPayload,
|
|
197
200
|
} from './crypto';
|
|
201
|
+
|
|
202
|
+
export type {
|
|
203
|
+
PersistedClientSession,
|
|
204
|
+
PersistedWalletSession,
|
|
205
|
+
SessionStorage,
|
|
206
|
+
} from './persistence';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ClientSessionClaim } from './client-messages';
|
|
2
|
+
import type { WalletSessionClaim } from './wallet-messages';
|
|
3
|
+
import type { DAppMetadata } from './core';
|
|
4
|
+
|
|
5
|
+
export interface PersistedClientSession {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
clientSessionClaim: ClientSessionClaim;
|
|
8
|
+
peerPublicKey: string;
|
|
9
|
+
createdAt: number;
|
|
10
|
+
lastConnectedAt: number;
|
|
11
|
+
dAppMetadata?: {
|
|
12
|
+
name: string;
|
|
13
|
+
url: string;
|
|
14
|
+
icon?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface PersistedWalletSession {
|
|
19
|
+
sessionId: string;
|
|
20
|
+
walletSessionClaim: WalletSessionClaim;
|
|
21
|
+
peerPublicKey: string;
|
|
22
|
+
createdAt: number;
|
|
23
|
+
lastConnectedAt: number;
|
|
24
|
+
dAppMetadata?: DAppMetadata;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface SessionStorage {
|
|
28
|
+
get(key: string): Promise<string | null>;
|
|
29
|
+
set(key: string, value: string): Promise<void>;
|
|
30
|
+
remove(key: string): Promise<void>;
|
|
31
|
+
getAllKeys(): Promise<string[]>;
|
|
32
|
+
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import type { EncryptedPayload } from './discovery';
|
|
7
7
|
import type { DAppMetadata, SessionConfig } from './core';
|
|
8
|
-
import type { CloseSessionPayload } from './client-messages';
|
|
8
|
+
import type { CloseSessionPayload, ClientHandshakeMessage } from './client-messages';
|
|
9
9
|
import type {
|
|
10
10
|
RequestFulfilledPayload,
|
|
11
11
|
RequestRejectedPayload,
|
|
@@ -82,10 +82,12 @@ export interface AuthenticateConnectionPayload {
|
|
|
82
82
|
|
|
83
83
|
/**
|
|
84
84
|
* Wallet reconnect payload
|
|
85
|
-
* Used to reconnect after network interruption
|
|
85
|
+
* Used to reconnect after network interruption with re-handshake support
|
|
86
86
|
*/
|
|
87
87
|
export interface WalletReconnectPayload {
|
|
88
88
|
type: 'wallet_reconnect';
|
|
89
|
+
/** Wallet's public key for ECDH key exchange in format "algorithm:base64_public_key" (e.g., "AES-GCM:...") */
|
|
90
|
+
walletPublicKey: string;
|
|
89
91
|
}
|
|
90
92
|
|
|
91
93
|
/**
|
|
@@ -212,6 +214,8 @@ export type RelayToDAppMessage =
|
|
|
212
214
|
| ConnectionRejectedMessage
|
|
213
215
|
| ConnectionAuthenticatedMessage;
|
|
214
216
|
|
|
217
|
+
export type RelayToWalletMessage = ClientHandshakeMessage;
|
|
218
|
+
|
|
215
219
|
/**
|
|
216
220
|
* Type guards for wallet messages
|
|
217
221
|
*/
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/core.ts","../src/schemas/discovery.ts","../src/schemas/wallet-messages.ts","../src/schemas/client-messages.ts","../src/schemas/relay-messages.ts","../src/schemas/index.ts"],"names":["urlSchema","z","clientSessionClaimSchema","ethereumAddressSchema","iso8601Schema","domainSchema","nonceSchema","siweFieldsSchema","dAppMetadataSchema","qrPayloadSchema","encryptedPayloadSchema","relayMessageTypeSchema","relayMessageSchema","securityPolicySchema","displayInfoSchema","frutiLinkSchema","publicKeySchema"],"mappings":"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","file":"chunk-7KYDLL3B.js","sourcesContent":["/**\n * Core validation schemas for BananaLink protocol types\n */\n\nimport { z } from 'zod';\n\n// Base validation schemas\nconst ethereumAddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address');\nconst hexStringSchema = z.string().regex(/^0x[a-fA-F0-9]*$/, 'Invalid hex string');\nconst iso8601Schema = z.string().datetime({ message: 'Invalid ISO 8601 datetime' });\nconst urlSchema = z.string().url('Invalid URL');\nconst domainSchema = z.string().min(1, 'Domain cannot be empty');\n// Protocol v2.0: 32-byte nonces = 64 hex characters\nconst nonceSchema = z\n .string()\n .length(64, 'Nonce must be exactly 64 characters (32 bytes hex-encoded)')\n .regex(/^[a-fA-F0-9]{64}$/, 'Nonce must be a valid 64-character hexadecimal string');\n\n// SIWE base schema\nexport const siweFieldsSchema = z.object({\n scheme: z.string().optional(),\n domain: domainSchema,\n address: ethereumAddressSchema,\n statement: z.string().optional(),\n uri: urlSchema,\n version: z.literal('1'),\n chainId: z.number().int().positive(),\n nonce: nonceSchema,\n issuedAt: iso8601Schema,\n expirationTime: iso8601Schema.optional(),\n notBefore: iso8601Schema.optional(),\n requestId: z.string().optional(),\n resources: z.array(urlSchema).optional(),\n});\n\n// Transaction payload schema\nexport const transactionPayloadSchema = z.object({\n to: ethereumAddressSchema,\n value: z.string().regex(/^\\d+$/, 'Value must be a numeric string').optional(),\n data: hexStringSchema.optional(),\n gas: z.string().regex(/^\\d+$/, 'Gas must be a numeric string').optional(),\n gasPrice: z.string().regex(/^\\d+$/, 'Gas price must be a numeric string').optional(),\n maxFeePerGas: z.string().regex(/^\\d+$/, 'Max fee per gas must be a numeric string').optional(),\n maxPriorityFeePerGas: z.string().regex(/^\\d+$/, 'Max priority fee per gas must be a numeric string').optional(),\n});\n\n// Sign payload schema\nexport const signPayloadSchema = z.object({\n message: z.string().min(1, 'Message cannot be empty'),\n encoding: z.enum(['utf8', 'hex']).default('utf8'),\n});\n\n// BananaLink message type schema\nexport const messageTypeSchema = z.enum(['auth', 'tx', 'sign']);\n\n// Main BananaLink message schema\nexport const bananaLinkMessageSchema = siweFieldsSchema.extend({\n type: messageTypeSchema,\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n payload: z.union([transactionPayloadSchema, signPayloadSchema]).optional(),\n});\n\n// DApp metadata schema\nexport const dAppMetadataSchema = z.object({\n dappId: z.string().optional(),\n name: z.string().min(1, 'Name cannot be empty'),\n description: z.string().optional(),\n url: urlSchema,\n icons: z.array(urlSchema).optional(),\n});\n\n// Session configuration schema\nexport const sessionConfigSchema = z.object({\n returnUrl: urlSchema.optional(),\n sessionName: z.string().optional(),\n expiresAt: iso8601Schema.optional(),\n customData: z.record(z.unknown()).optional(),\n});\n\n// BananaLink response schema\nexport const bananaLinkResponseSchema = z.object({\n success: z.boolean(),\n data: z.unknown().optional(),\n error: z.string().optional(),\n requestId: z.string().optional(),\n});\n\n// Security policy schema\nexport const securityPolicySchema = z.object({\n sessionTimeout: z.number().int().positive(),\n requestTimeout: z.number().int().positive(),\n maxConcurrentSessions: z.number().int().positive(),\n requireOriginProof: z.boolean(),\n allowedDomains: z.array(domainSchema).optional(),\n blockedDomains: z.array(domainSchema).optional(),\n});\n\n// Session options schema\nexport const sessionOptionsSchema = z.object({\n config: sessionConfigSchema.optional(),\n securityPolicy: securityPolicySchema.partial().optional(),\n relayUrl: urlSchema.optional(),\n});\n\n// Session metadata schema (for session creation)\nexport const sessionMetadataSchema = z.object({\n encryptionAlgorithm: z.enum(['AES-GCM', 'plaintext']),\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n publicKey: z.string().optional(),\n timestamp: iso8601Schema,\n});\n\n// Session creation request schema (Client → API Gateway)\nexport const createSessionRequestSchema = z.object({\n dappId: z.string().uuid('Invalid DApp ID format'),\n metadata: sessionMetadataSchema,\n sessionConfig: sessionConfigSchema.optional(),\n});\n\n// Client session claim schema\nexport const clientSessionClaimSchema = z.object({\n /** Unique nonce for client session claim (32 bytes hex-encoded = 64 characters) */\n claimNonce: z\n .string()\n .length(64, 'Claim nonce must be exactly 64 characters (32 bytes hex-encoded)')\n .regex(/^[0-9a-f]{64}$/, 'Claim nonce must be lowercase hexadecimal'),\n timestamp: z.number().int().positive(),\n});\n\n// Session creation response schema (API Gateway → Client)\nexport const createSessionResponseSchema = z.object({\n sessionId: z.string().uuid('Invalid session ID format'),\n clientSessionClaim: clientSessionClaimSchema,\n ttl: z.number().int().positive(),\n});\n\n// Validation helper functions\nexport const validateMessage = (message: unknown) => bananaLinkMessageSchema.parse(message);\n\n// Safe parsing functions\nexport const safeValidateMessage = (message: unknown) => bananaLinkMessageSchema.safeParse(message);\n\n// Note: Types are exported from ./types/core to avoid conflicts\n// Use z.infer<typeof schemaName> if you need to infer types from schemas\n","/**\n * Discovery validation schemas for BananaLink protocol\n */\n\nimport { z } from 'zod';\nimport { FRUITS } from '../constants';\n\n// Base validation schemas\nconst urlSchema = z.string().url('Invalid URL');\n\n\n// QR payload schema\nexport const qrPayloadSchema = z.object({\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n publicKey: z.string().min(1, 'Public key cannot be empty'),\n relayUrl: z.string().url().optional(),\n providerId: z.string().optional(),\n});\n\n// Encrypted payload schema\nexport const encryptedPayloadSchema = z.object({\n iv: z.string().min(1, 'IV cannot be empty'),\n ciphertext: z.string().min(1, 'Ciphertext cannot be empty'),\n mac: z.string().min(1, 'MAC cannot be empty'),\n});\n\n// Relay message type schema\nexport const relayMessageTypeSchema = z.enum(['pub', 'sub', 'ack', 'error']);\n\n// Relay message schema\nexport const relayMessageSchema = z.object({\n topic: z.string().min(1, 'Topic cannot be empty'),\n type: relayMessageTypeSchema,\n payload: encryptedPayloadSchema.optional(),\n id: z.string().min(1, 'Message ID cannot be empty'),\n});\n\n// Display info schema\nexport const displayInfoSchema = z.object({\n qrCode: z.string().min(1, 'QR code cannot be empty'),\n frutiLink: z.string().regex(/^[🍌🍎🍊🍇🍓🍑🍒🍉🥝🍍🥭🥥🫐🍈🍋🥑]{8}$/u, 'Invalid FrutiLink format'),\n deepLink: urlSchema,\n});\n\n// FrutiLink validation\nexport const frutiLinkSchema = z.string()\n .length(8, 'FrutiLink must be exactly 8 characters')\n .refine(\n (value) => value.split('').every(char => FRUITS.includes(char as typeof FRUITS[number])),\n 'FrutiLink contains invalid fruits'\n );\n\n// Public key validation (base64 encoded)\nexport const publicKeySchema = z.string()\n .min(1, 'Public key cannot be empty')\n .refine(\n (key) => {\n try {\n atob(key);\n return true;\n } catch {\n return false;\n }\n },\n 'Public key must be valid Base64'\n );\n\n// Validation helper functions\nexport const validateQRPayload = (payload: unknown) => qrPayloadSchema.parse(payload);\nexport const validateRelayMessage = (message: unknown) => relayMessageSchema.parse(message);\nexport const validateFrutiLink = (frutiLink: unknown) => frutiLinkSchema.parse(frutiLink);\n\n// Safe parsing functions\nexport const safeValidateQRPayload = (payload: unknown) => qrPayloadSchema.safeParse(payload);\nexport const safeValidateRelayMessage = (message: unknown) => relayMessageSchema.safeParse(message);\nexport const safeValidateFrutiLink = (frutiLink: unknown) => frutiLinkSchema.safeParse(frutiLink);\n\n// Note: Types are exported from ./types/discovery to avoid conflicts\n// Use z.infer<typeof schemaName> if you need to infer types from schemas\n","/**\n * Validation schemas for wallet message types\n */\n\nimport { z } from 'zod';\nimport { dAppMetadataSchema, sessionConfigSchema } from './core';\nimport { encryptedPayloadSchema } from './discovery';\n\n// Re-export encryptedPayloadSchema for convenience\nexport { encryptedPayloadSchema };\n\n// Wallet session claim schema\nexport const walletSessionClaimSchema = z.object({\n /** Unique nonce for this session claim (32 bytes hex-encoded = 64 characters) */\n sessionNonce: z\n .string()\n .length(64, 'Session nonce must be exactly 64 characters (32 bytes hex-encoded)')\n .regex(/^[0-9a-f]{64}$/, 'Session nonce must be lowercase hexadecimal'),\n /** Claim timestamp */\n timestamp: z.number().int().positive('Timestamp must be a positive integer'),\n});\n\n// Wallet message payload schemas\nexport const claimSessionPayloadSchema = z.object({\n type: z.literal('claim_session'),\n /** Wallet's public key for ECDH key exchange - format: \"algorithm:key_data\" (e.g., \"AES-GCM:base64...\" or \"cleartext:none\") */\n walletPublicKey: z\n .string()\n .min(1, 'Wallet public key cannot be empty')\n .regex(/^(AES-GCM:|cleartext:)/, 'Wallet public key must start with \"AES-GCM:\" or \"cleartext:\"'),\n});\n\nexport const prefetchMetadataPayloadSchema = z.object({\n type: z.literal('prefetch_metadata'),\n});\n\nexport const connectionRejectedPayloadSchema = z.object({\n type: z.literal('connection_rejected'),\n encrypted: encryptedPayloadSchema,\n});\n\nexport const authenticateConnectionPayloadSchema = z.object({\n type: z.literal('authenticate_connection'),\n encrypted: encryptedPayloadSchema,\n});\n\nexport const walletReconnectPayloadSchema = z.object({\n type: z.literal('wallet_reconnect'),\n});\n\n// Union of all wallet message payloads\nexport const walletMessagePayloadSchema = z.discriminatedUnion('type', [\n claimSessionPayloadSchema,\n prefetchMetadataPayloadSchema,\n connectionRejectedPayloadSchema,\n authenticateConnectionPayloadSchema,\n walletReconnectPayloadSchema,\n]);\n\n// Wallet message envelope schema\nexport const walletMessageEnvelopeSchema = z.object({\n /** Session identifier */\n sessionId: z.string().uuid('Session ID must be a valid UUID'),\n /** Wallet session claim credential */\n walletSessionClaim: walletSessionClaimSchema,\n /** Message payload */\n payload: walletMessagePayloadSchema,\n});\n\n// Decrypted data schemas\nexport const rejectionDataSchema = z.object({\n reason: z.string().optional(),\n timestamp: z.number().int().positive(),\n});\n\nexport const walletMetadataSchema = z.object({\n /** Wallet name */\n name: z.string().min(1, 'Wallet name cannot be empty'),\n /** Wallet version */\n version: z.string().optional(),\n /** Wallet icon URL */\n icon: z.string().url('Invalid icon URL').optional(),\n /** Wallet description */\n description: z.string().optional(),\n /** Wallet website URL */\n url: z.string().url('Invalid wallet URL').optional(),\n /** Wallet provider type */\n provider: z.string().optional(),\n});\n\nexport const authenticationDataSchema = z.object({\n /** Wallet address */\n address: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address'),\n /** Signature of the SIWE message */\n signature: z.string().regex(/^0x[a-fA-F0-9]+$/, 'Invalid signature format'),\n /** Full SIWE message that was signed */\n message: z.string().min(1, 'Message cannot be empty'),\n /** Chain ID (EIP-155) */\n chainId: z.number().int().positive('Chain ID must be a positive integer'),\n /** Network identifier */\n network: z.string().optional(),\n /** Signing algorithm */\n signingAlgo: z.string().optional(),\n /** Optional wallet metadata */\n walletMetadata: walletMetadataSchema.optional(),\n});\n\n// Relay-to-dApp message schemas\nexport const walletHandshakeMessageSchema = z.object({\n type: z.literal('wallet_handshake'),\n status: z.literal('reviewing'),\n /** Wallet's public key in format \"algorithm:base64_public_key\" */\n walletPublicKey: z.string(),\n timestamp: z.number().int().positive(),\n});\n\nexport const connectionRejectedMessageSchema = z.object({\n type: z.literal('connection_rejected'),\n encrypted: encryptedPayloadSchema,\n});\n\nexport const connectionAuthenticatedMessageSchema = z.object({\n type: z.literal('connection_authenticated'),\n encrypted: encryptedPayloadSchema,\n});\n\n// Union of relay-to-dApp messages\nexport const relayToDAppMessageSchema = z.discriminatedUnion('type', [\n walletHandshakeMessageSchema,\n connectionRejectedMessageSchema,\n connectionAuthenticatedMessageSchema,\n]);\n\n// Prefetch metadata response schema\nexport const prefetchMetadataResponseSchema = z.object({\n dappMetadata: dAppMetadataSchema,\n sessionConfig: sessionConfigSchema.optional(),\n});\n\n// Validation helper functions\nexport const validateWalletMessage = (message: unknown) => {\n return walletMessageEnvelopeSchema.parse(message);\n};\n\nexport const safeValidateWalletMessage = (message: unknown) => {\n return walletMessageEnvelopeSchema.safeParse(message);\n};\n\nexport const validateRelayToDAppMessage = (message: unknown) => {\n return relayToDAppMessageSchema.parse(message);\n};\n\nexport const safeValidateRelayToDAppMessage = (message: unknown) => {\n return relayToDAppMessageSchema.safeParse(message);\n};\n\nexport const validateWalletSessionClaim = (claim: unknown) => {\n return walletSessionClaimSchema.parse(claim);\n};\n\nexport const safeValidateWalletSessionClaim = (claim: unknown) => {\n return walletSessionClaimSchema.safeParse(claim);\n};\n\n/**\n * Validate timestamp for replay attack prevention\n * @param timestamp - Timestamp to validate\n * @param maxAge - Maximum age in milliseconds (default: 5 minutes)\n */\nexport function validateTimestamp(timestamp: number, maxAge: number = 5 * 60 * 1000): boolean {\n const now = Date.now();\n const age = Math.abs(now - timestamp);\n return age <= maxAge;\n}\n\n// NOTE: Nonce generation moved to @bananalink-sdk/crypto package to avoid circular dependencies\n// SDKs should use crypto.generateSessionNonce() before validating session claims\n","/**\n * Validation schemas for client message types\n */\n\nimport { z } from 'zod';\n\n// Client session claim schema\nexport const clientSessionClaimSchema = z.object({\n /** Unique nonce for this client session */\n claimNonce: z.string().min(32, 'Client claim nonce must be at least 32 characters'),\n /** Claim generation timestamp */\n timestamp: z.number().int().positive('Timestamp must be a positive integer'),\n});\n\n// Client message payload schemas\nexport const clientReconnectPayloadSchema = z.object({\n type: z.literal('client_reconnect'),\n});\n\nexport const closeSessionPayloadSchema = z.object({\n type: z.literal('close_session'),\n /** Optional reason for closing the session */\n reason: z.string().optional(),\n});\n\n// Union of all client message payloads\nexport const clientMessagePayloadSchema = z.discriminatedUnion('type', [\n clientReconnectPayloadSchema,\n closeSessionPayloadSchema,\n]);\n\n// Client message envelope schema\nexport const clientMessageEnvelopeSchema = z.object({\n /** Session identifier */\n sessionId: z.string().uuid('Session ID must be a valid UUID'),\n /** Client session claim */\n clientSessionClaim: clientSessionClaimSchema,\n /** Message payload */\n payload: clientMessagePayloadSchema,\n});\n\n// Validation helper functions\nexport const validateClientMessage = (message: unknown) => {\n return clientMessageEnvelopeSchema.parse(message);\n};\n\nexport const safeValidateClientMessage = (message: unknown) => {\n return clientMessageEnvelopeSchema.safeParse(message);\n};\n\nexport const validateClientSessionClaim = (claim: unknown) => {\n return clientSessionClaimSchema.parse(claim);\n};\n\nexport const safeValidateClientSessionClaim = (claim: unknown) => {\n return clientSessionClaimSchema.safeParse(claim);\n};\n","/**\n * Validation schemas for relay notification message types\n */\n\nimport { z } from 'zod';\n\n// Session closed acknowledgment schema\nexport const sessionClosedAckSchema = z.object({\n type: z.literal('session_closed_ack'),\n timestamp: z.number().int().positive(),\n});\n\n// Session closed notification schema\nexport const sessionClosedNotificationSchema = z.object({\n type: z.literal('session_closed_notification'),\n /** Which party closed the session */\n closedBy: z.enum(['client', 'wallet']),\n /** Optional reason for closure */\n reason: z.string().optional(),\n timestamp: z.number().int().positive(),\n});\n\n// Reconnected message schema\nexport const reconnectedMessageSchema = z.object({\n type: z.literal('reconnected'),\n /** Number of messages that were queued during disconnection */\n queuedMessages: z.number().int().nonnegative(),\n timestamp: z.number().int().positive(),\n});\n\n// Union of all relay notification messages\nexport const relayNotificationMessageSchema = z.discriminatedUnion('type', [\n sessionClosedAckSchema,\n sessionClosedNotificationSchema,\n reconnectedMessageSchema,\n]);\n\n// Validation helper functions\nexport const validateRelayNotificationMessage = (message: unknown) => {\n return relayNotificationMessageSchema.parse(message);\n};\n\nexport const safeValidateRelayNotificationMessage = (message: unknown) => {\n return relayNotificationMessageSchema.safeParse(message);\n};\n","/**\n * Zod validation schemas for BananaLink protocol types\n * Provides runtime type validation for all protocol messages\n */\n\nimport { z } from 'zod';\nimport { FRUITS, NETWORK_CONFIG } from '../constants';\n\n// Base validation schemas\nconst ethereumAddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address');\nconst iso8601Schema = z.string().datetime({ message: 'Invalid ISO 8601 datetime' });\nconst urlSchema = z.string().url('Invalid URL');\nconst domainSchema = z.string().min(1, 'Domain cannot be empty');\n// Protocol v2.0: 32-byte nonces = 64 hex characters\nconst nonceSchema = z\n .string()\n .length(64, 'Nonce must be exactly 64 characters (32 bytes hex-encoded)')\n .regex(/^[a-fA-F0-9]{64}$/, 'Nonce must be a valid 64-character hexadecimal string');\n\n// SIWE base schema\nexport const siweFieldsSchema = z.object({\n scheme: z.string().optional(),\n domain: domainSchema,\n address: ethereumAddressSchema,\n statement: z.string().optional(),\n uri: urlSchema,\n version: z.literal('1'),\n chainId: z.number().int().positive(),\n nonce: nonceSchema,\n issuedAt: iso8601Schema,\n expirationTime: iso8601Schema.optional(),\n notBefore: iso8601Schema.optional(),\n requestId: z.string().optional(),\n resources: z.array(urlSchema).optional(),\n});\n\n// DApp metadata schema\nexport const dAppMetadataSchema = z.object({\n returnUrl: urlSchema.optional(),\n});\n\n// QR payload schema\nexport const qrPayloadSchema = z.object({\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n publicKey: z.string().min(1, 'Public key cannot be empty'),\n providerId: z.string().optional(),\n relayUrl: z.string().url().optional(),\n});\n\n// Encrypted payload schema\nexport const encryptedPayloadSchema = z.object({\n iv: z.string().min(1, 'IV cannot be empty'),\n ciphertext: z.string().min(1, 'Ciphertext cannot be empty'),\n mac: z.string().min(1, 'MAC cannot be empty'),\n});\n\n// Relay message type schema\nexport const relayMessageTypeSchema = z.enum(['pub', 'sub', 'ack', 'error']);\n\n// Relay message schema\nexport const relayMessageSchema = z.object({\n topic: z.string().min(1, 'Topic cannot be empty'),\n type: relayMessageTypeSchema,\n payload: encryptedPayloadSchema.optional(),\n id: z.string().min(1, 'Message ID cannot be empty'),\n});\n\n// Security policy schema\nexport const securityPolicySchema = z.object({\n sessionTimeout: z.number().int().positive(),\n requestTimeout: z.number().int().positive(),\n maxConcurrentSessions: z.number().int().positive(),\n requireOriginProof: z.boolean(),\n allowedDomains: z.array(domainSchema).optional(),\n blockedDomains: z.array(domainSchema).optional(),\n});\n\n// Origin proof schema\nexport const originProofSchema = z.object({\n domain: domainSchema,\n timestamp: z.number().int().positive(),\n signature: z.string().min(1, 'Signature cannot be empty'),\n});\n\n// Session state schema (Protocol v2.0)\nexport const sessionStateSchema = z.enum([\n 'created',\n 'claimed',\n 'authenticated',\n 'active',\n 'disconnected',\n 'closed',\n 'expired',\n 'rejected',\n]);\n\n// Session info schema\nexport const sessionInfoSchema = z.object({\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n state: sessionStateSchema,\n address: ethereumAddressSchema.optional(),\n metadata: dAppMetadataSchema,\n createdAt: iso8601Schema,\n lastActivity: iso8601Schema,\n expiresAt: iso8601Schema.optional(),\n});\n\n// Display info schema\nexport const displayInfoSchema = z.object({\n qrCode: z.string().min(1, 'QR code cannot be empty'),\n frutiLink: z.string().regex(/^[🍌🍎🍊🍇🍓🍑🍒🍉🥝🍍🥭🥥🫐🍈🍋🥑]{8}$/u, 'Invalid FrutiLink format'),\n deepLink: urlSchema,\n});\n\n// Error code schema (Protocol v2.0+)\nexport const errorCodeSchema = z.enum([\n // Session errors\n 'SESSION_EXPIRED',\n 'SESSION_NOT_FOUND',\n 'SESSION_ALREADY_CLAIMED',\n 'INVALID_SESSION_CLAIM',\n 'INVALID_CLIENT_CLAIM',\n 'SESSION_TOKEN_EXPIRED',\n 'SESSION_CLOSED',\n // Encryption errors\n 'ENCRYPTION_FAILED',\n 'DECRYPTION_FAILED',\n 'INVALID_SIGNATURE',\n // Network errors\n 'NETWORK_ERROR',\n 'RELAY_ERROR',\n 'MESSAGE_QUEUE_FULL',\n 'RATE_LIMIT_EXCEEDED',\n 'ORIGIN_MISMATCH',\n // Request lifecycle errors (v2.1+)\n 'REQUEST_PENDING',\n 'REQUEST_NOT_FOUND',\n 'REQUEST_EXPIRED',\n 'REQUEST_INVALID',\n 'REQUEST_TIMEOUT',\n // Operation-specific errors (v2.1+)\n 'SIGNING_FAILED',\n 'SIGNING_REJECTED',\n 'TRANSACTION_INVALID',\n 'CHAIN_MISMATCH',\n]);\n\n// BananaLink error schema\nexport const bananaLinkErrorSchema = z.object({\n code: errorCodeSchema,\n message: z.string().min(1, 'Error message cannot be empty'),\n details: z.unknown().optional(),\n});\n\n// FrutiLink validation\nexport const frutiLinkSchema = z.string()\n .length(8, 'FrutiLink must be exactly 8 characters')\n .refine(\n (value) => value.split('').every(char => FRUITS.includes(char as typeof FRUITS[number])),\n 'FrutiLink contains invalid fruits'\n );\n\n// Supported chain ID validation\nexport const supportedChainIdSchema = z.number()\n .int()\n .refine(\n (chainId) => NETWORK_CONFIG.SUPPORTED_CHAINS.includes(chainId as typeof NETWORK_CONFIG.SUPPORTED_CHAINS[number]),\n 'Unsupported chain ID'\n );\n\n// Base64 string validation\nexport const base64Schema = z.string().regex(\n /^[A-Za-z0-9+/]*={0,2}$/,\n 'Invalid Base64 string'\n);\n\n// Session ID validation (UUID v4)\nexport const sessionIdSchema = z.string().regex(\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,\n 'Invalid session ID format'\n);\n\n// Public key validation (base64 encoded)\nexport const publicKeySchema = z.string()\n .min(1, 'Public key cannot be empty')\n .refine(\n (key) => {\n try {\n atob(key);\n return true;\n } catch {\n return false;\n }\n },\n 'Public key must be valid Base64'\n );\n\n// Validation helper functions (Protocol v2.0)\nexport const validateQRPayload = (payload: unknown) => qrPayloadSchema.parse(payload);\nexport const validateRelayMessage = (message: unknown) => relayMessageSchema.parse(message);\nexport const validateSessionInfo = (info: unknown) => sessionInfoSchema.parse(info);\nexport const validateFrutiLink = (frutiLink: unknown) => frutiLinkSchema.parse(frutiLink);\n\n// Safe parsing functions (returns { success: boolean, data?: T, error?: ZodError })\nexport const safeValidateQRPayload = (payload: unknown) => qrPayloadSchema.safeParse(payload);\nexport const safeValidateRelayMessage = (message: unknown) => relayMessageSchema.safeParse(message);\nexport const safeValidateSessionInfo = (info: unknown) => sessionInfoSchema.safeParse(info);\nexport const safeValidateFrutiLink = (frutiLink: unknown) => frutiLinkSchema.safeParse(frutiLink);\n\n// Type inference from schemas (Protocol v2.0)\nexport type SIWEFields = z.infer<typeof siweFieldsSchema>;\nexport type DAppMetadata = z.infer<typeof dAppMetadataSchema>;\nexport type QRPayload = z.infer<typeof qrPayloadSchema>;\nexport type EncryptedPayload = z.infer<typeof encryptedPayloadSchema>;\nexport type RelayMessage = z.infer<typeof relayMessageSchema>;\nexport type SecurityPolicy = z.infer<typeof securityPolicySchema>;\nexport type SessionInfo = z.infer<typeof sessionInfoSchema>;\nexport type DisplayInfo = z.infer<typeof displayInfoSchema>;\n\n// Re-export core schemas (Protocol v2.0)\nexport {\n dAppMetadataSchema as coreDAppMetadataSchema,\n sessionConfigSchema,\n sessionOptionsSchema,\n sessionMetadataSchema,\n createSessionRequestSchema,\n createSessionResponseSchema,\n clientSessionClaimSchema,\n securityPolicySchema as coreSecurityPolicySchema,\n} from './core';\n\n// Re-export v2.0 wallet message schemas\nexport * from './wallet-messages';\n\n// Re-export v2.0 client message schemas\nexport * from './client-messages';\n\n// Re-export v2.0 relay message schemas\nexport * from './relay-messages';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/core.ts","../src/schemas/discovery.ts","../src/schemas/wallet-messages.ts","../src/schemas/client-messages.ts","../src/schemas/relay-messages.ts","../src/schemas/index.ts"],"names":["z","urlSchema","FRUITS","__name","clientSessionClaimSchema","ethereumAddressSchema","iso8601Schema","domainSchema","nonceSchema","siweFieldsSchema","dAppMetadataSchema","qrPayloadSchema","encryptedPayloadSchema","relayMessageTypeSchema","relayMessageSchema","securityPolicySchema","displayInfoSchema","frutiLinkSchema","NETWORK_CONFIG","publicKeySchema"],"mappings":"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","file":"chunk-KNGZKGRS.cjs","sourcesContent":["/**\n * Core validation schemas for BananaLink protocol types\n */\n\nimport { z } from 'zod';\n\n// Base validation schemas\nconst ethereumAddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address');\nconst hexStringSchema = z.string().regex(/^0x[a-fA-F0-9]*$/, 'Invalid hex string');\nconst iso8601Schema = z.string().datetime({ message: 'Invalid ISO 8601 datetime' });\nconst urlSchema = z.string().url('Invalid URL');\nconst domainSchema = z.string().min(1, 'Domain cannot be empty');\n// Protocol v2.0: 32-byte nonces = 64 hex characters\nconst nonceSchema = z\n .string()\n .length(64, 'Nonce must be exactly 64 characters (32 bytes hex-encoded)')\n .regex(/^[a-fA-F0-9]{64}$/, 'Nonce must be a valid 64-character hexadecimal string');\n\n// SIWE base schema\nexport const siweFieldsSchema = z.object({\n scheme: z.string().optional(),\n domain: domainSchema,\n address: ethereumAddressSchema,\n statement: z.string().optional(),\n uri: urlSchema,\n version: z.literal('1'),\n chainId: z.number().int().positive(),\n nonce: nonceSchema,\n issuedAt: iso8601Schema,\n expirationTime: iso8601Schema.optional(),\n notBefore: iso8601Schema.optional(),\n requestId: z.string().optional(),\n resources: z.array(urlSchema).optional(),\n});\n\n// Transaction payload schema\nexport const transactionPayloadSchema = z.object({\n to: ethereumAddressSchema,\n value: z.string().regex(/^\\d+$/, 'Value must be a numeric string').optional(),\n data: hexStringSchema.optional(),\n gas: z.string().regex(/^\\d+$/, 'Gas must be a numeric string').optional(),\n gasPrice: z.string().regex(/^\\d+$/, 'Gas price must be a numeric string').optional(),\n maxFeePerGas: z.string().regex(/^\\d+$/, 'Max fee per gas must be a numeric string').optional(),\n maxPriorityFeePerGas: z.string().regex(/^\\d+$/, 'Max priority fee per gas must be a numeric string').optional(),\n});\n\n// Sign payload schema\nexport const signPayloadSchema = z.object({\n message: z.string().min(1, 'Message cannot be empty'),\n encoding: z.enum(['utf8', 'hex']).default('utf8'),\n});\n\n// BananaLink message type schema\nexport const messageTypeSchema = z.enum(['auth', 'tx', 'sign']);\n\n// Main BananaLink message schema\nexport const bananaLinkMessageSchema = siweFieldsSchema.extend({\n type: messageTypeSchema,\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n payload: z.union([transactionPayloadSchema, signPayloadSchema]).optional(),\n});\n\n// DApp metadata schema\nexport const dAppMetadataSchema = z.object({\n dappId: z.string().optional(),\n name: z.string().min(1, 'Name cannot be empty'),\n description: z.string().optional(),\n url: urlSchema,\n icons: z.array(urlSchema).optional(),\n});\n\n// Session configuration schema\nexport const sessionConfigSchema = z.object({\n returnUrl: urlSchema.optional(),\n sessionName: z.string().optional(),\n expiresAt: iso8601Schema.optional(),\n customData: z.record(z.unknown()).optional(),\n});\n\n// BananaLink response schema\nexport const bananaLinkResponseSchema = z.object({\n success: z.boolean(),\n data: z.unknown().optional(),\n error: z.string().optional(),\n requestId: z.string().optional(),\n});\n\n// Security policy schema\nexport const securityPolicySchema = z.object({\n sessionTimeout: z.number().int().positive(),\n requestTimeout: z.number().int().positive(),\n maxConcurrentSessions: z.number().int().positive(),\n requireOriginProof: z.boolean(),\n allowedDomains: z.array(domainSchema).optional(),\n blockedDomains: z.array(domainSchema).optional(),\n});\n\n// Session options schema\nexport const sessionOptionsSchema = z.object({\n config: sessionConfigSchema.optional(),\n securityPolicy: securityPolicySchema.partial().optional(),\n relayUrl: urlSchema.optional(),\n});\n\n// Session metadata schema (for session creation)\nexport const sessionMetadataSchema = z.object({\n encryptionAlgorithm: z.enum(['AES-GCM', 'plaintext']),\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n publicKey: z.string().optional(),\n timestamp: iso8601Schema,\n});\n\n// Session creation request schema (Client → API Gateway)\nexport const createSessionRequestSchema = z.object({\n dappId: z.string().uuid('Invalid DApp ID format'),\n metadata: sessionMetadataSchema,\n sessionConfig: sessionConfigSchema.optional(),\n});\n\n// Client session claim schema\nexport const clientSessionClaimSchema = z.object({\n /** Unique nonce for client session claim (32 bytes hex-encoded = 64 characters) */\n claimNonce: z\n .string()\n .length(64, 'Claim nonce must be exactly 64 characters (32 bytes hex-encoded)')\n .regex(/^[0-9a-f]{64}$/, 'Claim nonce must be lowercase hexadecimal'),\n timestamp: z.number().int().positive(),\n});\n\n// Session creation response schema (API Gateway → Client)\nexport const createSessionResponseSchema = z.object({\n sessionId: z.string().uuid('Invalid session ID format'),\n clientSessionClaim: clientSessionClaimSchema,\n ttl: z.number().int().positive(),\n});\n\n// Validation helper functions\nexport const validateMessage = (message: unknown) => bananaLinkMessageSchema.parse(message);\n\n// Safe parsing functions\nexport const safeValidateMessage = (message: unknown) => bananaLinkMessageSchema.safeParse(message);\n\n// Note: Types are exported from ./types/core to avoid conflicts\n// Use z.infer<typeof schemaName> if you need to infer types from schemas\n","/**\n * Discovery validation schemas for BananaLink protocol\n */\n\nimport { z } from 'zod';\nimport { FRUITS } from '../constants';\n\n// Base validation schemas\nconst urlSchema = z.string().url('Invalid URL');\n\n\n// QR payload schema\nexport const qrPayloadSchema = z.object({\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n publicKey: z.string().min(1, 'Public key cannot be empty'),\n relayUrl: z.string().url().optional(),\n providerId: z.string().optional(),\n});\n\n// Encrypted payload schema\nexport const encryptedPayloadSchema = z.object({\n iv: z.string().min(1, 'IV cannot be empty'),\n ciphertext: z.string().min(1, 'Ciphertext cannot be empty'),\n mac: z.string().min(1, 'MAC cannot be empty'),\n});\n\n// Relay message type schema\nexport const relayMessageTypeSchema = z.enum(['pub', 'sub', 'ack', 'error']);\n\n// Relay message schema\nexport const relayMessageSchema = z.object({\n topic: z.string().min(1, 'Topic cannot be empty'),\n type: relayMessageTypeSchema,\n payload: encryptedPayloadSchema.optional(),\n id: z.string().min(1, 'Message ID cannot be empty'),\n});\n\n// Display info schema\nexport const displayInfoSchema = z.object({\n qrCode: z.string().min(1, 'QR code cannot be empty'),\n frutiLink: z.string().regex(/^[🍌🍎🍊🍇🍓🍑🍒🍉🥝🍍🥭🥥🫐🍈🍋🥑]{8}$/u, 'Invalid FrutiLink format'),\n deepLink: urlSchema,\n});\n\n// FrutiLink validation\nexport const frutiLinkSchema = z.string()\n .length(8, 'FrutiLink must be exactly 8 characters')\n .refine(\n (value) => value.split('').every(char => FRUITS.includes(char as typeof FRUITS[number])),\n 'FrutiLink contains invalid fruits'\n );\n\n// Public key validation (base64 encoded)\nexport const publicKeySchema = z.string()\n .min(1, 'Public key cannot be empty')\n .refine(\n (key) => {\n try {\n atob(key);\n return true;\n } catch {\n return false;\n }\n },\n 'Public key must be valid Base64'\n );\n\n// Validation helper functions\nexport const validateQRPayload = (payload: unknown) => qrPayloadSchema.parse(payload);\nexport const validateRelayMessage = (message: unknown) => relayMessageSchema.parse(message);\nexport const validateFrutiLink = (frutiLink: unknown) => frutiLinkSchema.parse(frutiLink);\n\n// Safe parsing functions\nexport const safeValidateQRPayload = (payload: unknown) => qrPayloadSchema.safeParse(payload);\nexport const safeValidateRelayMessage = (message: unknown) => relayMessageSchema.safeParse(message);\nexport const safeValidateFrutiLink = (frutiLink: unknown) => frutiLinkSchema.safeParse(frutiLink);\n\n// Note: Types are exported from ./types/discovery to avoid conflicts\n// Use z.infer<typeof schemaName> if you need to infer types from schemas\n","/**\n * Validation schemas for wallet message types\n */\n\nimport { z } from 'zod';\nimport { dAppMetadataSchema, sessionConfigSchema } from './core';\nimport { encryptedPayloadSchema } from './discovery';\n\n// Re-export encryptedPayloadSchema for convenience\nexport { encryptedPayloadSchema };\n\n// Wallet session claim schema\nexport const walletSessionClaimSchema = z.object({\n /** Unique nonce for this session claim (32 bytes hex-encoded = 64 characters) */\n sessionNonce: z\n .string()\n .length(64, 'Session nonce must be exactly 64 characters (32 bytes hex-encoded)')\n .regex(/^[0-9a-f]{64}$/, 'Session nonce must be lowercase hexadecimal'),\n /** Claim timestamp */\n timestamp: z.number().int().positive('Timestamp must be a positive integer'),\n});\n\n// Wallet message payload schemas\nexport const claimSessionPayloadSchema = z.object({\n type: z.literal('claim_session'),\n /** Wallet's public key for ECDH key exchange - format: \"algorithm:key_data\" (e.g., \"AES-GCM:base64...\" or \"cleartext:none\") */\n walletPublicKey: z\n .string()\n .min(1, 'Wallet public key cannot be empty')\n .regex(/^(AES-GCM:|cleartext:)/, 'Wallet public key must start with \"AES-GCM:\" or \"cleartext:\"'),\n});\n\nexport const prefetchMetadataPayloadSchema = z.object({\n type: z.literal('prefetch_metadata'),\n});\n\nexport const connectionRejectedPayloadSchema = z.object({\n type: z.literal('connection_rejected'),\n encrypted: encryptedPayloadSchema,\n});\n\nexport const authenticateConnectionPayloadSchema = z.object({\n type: z.literal('authenticate_connection'),\n encrypted: encryptedPayloadSchema,\n});\n\nexport const walletReconnectPayloadSchema = z.object({\n type: z.literal('wallet_reconnect'),\n});\n\n// Union of all wallet message payloads\nexport const walletMessagePayloadSchema = z.discriminatedUnion('type', [\n claimSessionPayloadSchema,\n prefetchMetadataPayloadSchema,\n connectionRejectedPayloadSchema,\n authenticateConnectionPayloadSchema,\n walletReconnectPayloadSchema,\n]);\n\n// Wallet message envelope schema\nexport const walletMessageEnvelopeSchema = z.object({\n /** Session identifier */\n sessionId: z.string().uuid('Session ID must be a valid UUID'),\n /** Wallet session claim credential */\n walletSessionClaim: walletSessionClaimSchema,\n /** Message payload */\n payload: walletMessagePayloadSchema,\n});\n\n// Decrypted data schemas\nexport const rejectionDataSchema = z.object({\n reason: z.string().optional(),\n timestamp: z.number().int().positive(),\n});\n\nexport const walletMetadataSchema = z.object({\n /** Wallet name */\n name: z.string().min(1, 'Wallet name cannot be empty'),\n /** Wallet version */\n version: z.string().optional(),\n /** Wallet icon URL */\n icon: z.string().url('Invalid icon URL').optional(),\n /** Wallet description */\n description: z.string().optional(),\n /** Wallet website URL */\n url: z.string().url('Invalid wallet URL').optional(),\n /** Wallet provider type */\n provider: z.string().optional(),\n});\n\nexport const authenticationDataSchema = z.object({\n /** Wallet address */\n address: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address'),\n /** Signature of the SIWE message */\n signature: z.string().regex(/^0x[a-fA-F0-9]+$/, 'Invalid signature format'),\n /** Full SIWE message that was signed */\n message: z.string().min(1, 'Message cannot be empty'),\n /** Chain ID (EIP-155) */\n chainId: z.number().int().positive('Chain ID must be a positive integer'),\n /** Network identifier */\n network: z.string().optional(),\n /** Signing algorithm */\n signingAlgo: z.string().optional(),\n /** Optional wallet metadata */\n walletMetadata: walletMetadataSchema.optional(),\n});\n\n// Relay-to-dApp message schemas\nexport const walletHandshakeMessageSchema = z.object({\n type: z.literal('wallet_handshake'),\n status: z.literal('reviewing'),\n /** Wallet's public key in format \"algorithm:base64_public_key\" */\n walletPublicKey: z.string(),\n timestamp: z.number().int().positive(),\n});\n\nexport const connectionRejectedMessageSchema = z.object({\n type: z.literal('connection_rejected'),\n encrypted: encryptedPayloadSchema,\n});\n\nexport const connectionAuthenticatedMessageSchema = z.object({\n type: z.literal('connection_authenticated'),\n encrypted: encryptedPayloadSchema,\n});\n\n// Union of relay-to-dApp messages\nexport const relayToDAppMessageSchema = z.discriminatedUnion('type', [\n walletHandshakeMessageSchema,\n connectionRejectedMessageSchema,\n connectionAuthenticatedMessageSchema,\n]);\n\n// Prefetch metadata response schema\nexport const prefetchMetadataResponseSchema = z.object({\n dappMetadata: dAppMetadataSchema,\n sessionConfig: sessionConfigSchema.optional(),\n});\n\n// Validation helper functions\nexport const validateWalletMessage = (message: unknown) => {\n return walletMessageEnvelopeSchema.parse(message);\n};\n\nexport const safeValidateWalletMessage = (message: unknown) => {\n return walletMessageEnvelopeSchema.safeParse(message);\n};\n\nexport const validateRelayToDAppMessage = (message: unknown) => {\n return relayToDAppMessageSchema.parse(message);\n};\n\nexport const safeValidateRelayToDAppMessage = (message: unknown) => {\n return relayToDAppMessageSchema.safeParse(message);\n};\n\nexport const validateWalletSessionClaim = (claim: unknown) => {\n return walletSessionClaimSchema.parse(claim);\n};\n\nexport const safeValidateWalletSessionClaim = (claim: unknown) => {\n return walletSessionClaimSchema.safeParse(claim);\n};\n\n/**\n * Validate timestamp for replay attack prevention\n * @param timestamp - Timestamp to validate\n * @param maxAge - Maximum age in milliseconds (default: 5 minutes)\n */\nexport function validateTimestamp(timestamp: number, maxAge: number = 5 * 60 * 1000): boolean {\n const now = Date.now();\n const age = Math.abs(now - timestamp);\n return age <= maxAge;\n}\n\n// NOTE: Nonce generation moved to @bananalink-sdk/crypto package to avoid circular dependencies\n// SDKs should use crypto.generateSessionNonce() before validating session claims\n","/**\n * Validation schemas for client message types\n */\n\nimport { z } from 'zod';\n\n// Client session claim schema\nexport const clientSessionClaimSchema = z.object({\n /** Unique nonce for this client session */\n claimNonce: z.string().min(32, 'Client claim nonce must be at least 32 characters'),\n /** Claim generation timestamp */\n timestamp: z.number().int().positive('Timestamp must be a positive integer'),\n});\n\n// Client message payload schemas\nexport const clientReconnectPayloadSchema = z.object({\n type: z.literal('client_reconnect'),\n});\n\nexport const closeSessionPayloadSchema = z.object({\n type: z.literal('close_session'),\n /** Optional reason for closing the session */\n reason: z.string().optional(),\n});\n\n// Union of all client message payloads\nexport const clientMessagePayloadSchema = z.discriminatedUnion('type', [\n clientReconnectPayloadSchema,\n closeSessionPayloadSchema,\n]);\n\n// Client message envelope schema\nexport const clientMessageEnvelopeSchema = z.object({\n /** Session identifier */\n sessionId: z.string().uuid('Session ID must be a valid UUID'),\n /** Client session claim */\n clientSessionClaim: clientSessionClaimSchema,\n /** Message payload */\n payload: clientMessagePayloadSchema,\n});\n\n// Validation helper functions\nexport const validateClientMessage = (message: unknown) => {\n return clientMessageEnvelopeSchema.parse(message);\n};\n\nexport const safeValidateClientMessage = (message: unknown) => {\n return clientMessageEnvelopeSchema.safeParse(message);\n};\n\nexport const validateClientSessionClaim = (claim: unknown) => {\n return clientSessionClaimSchema.parse(claim);\n};\n\nexport const safeValidateClientSessionClaim = (claim: unknown) => {\n return clientSessionClaimSchema.safeParse(claim);\n};\n","/**\n * Validation schemas for relay notification message types\n */\n\nimport { z } from 'zod';\n\n// Session closed acknowledgment schema\nexport const sessionClosedAckSchema = z.object({\n type: z.literal('session_closed_ack'),\n timestamp: z.number().int().positive(),\n});\n\n// Session closed notification schema\nexport const sessionClosedNotificationSchema = z.object({\n type: z.literal('session_closed_notification'),\n /** Which party closed the session */\n closedBy: z.enum(['client', 'wallet']),\n /** Optional reason for closure */\n reason: z.string().optional(),\n timestamp: z.number().int().positive(),\n});\n\n// Reconnected message schema\nexport const reconnectedMessageSchema = z.object({\n type: z.literal('reconnected'),\n /** Number of messages that were queued during disconnection */\n queuedMessages: z.number().int().nonnegative(),\n timestamp: z.number().int().positive(),\n});\n\n// Union of all relay notification messages\nexport const relayNotificationMessageSchema = z.discriminatedUnion('type', [\n sessionClosedAckSchema,\n sessionClosedNotificationSchema,\n reconnectedMessageSchema,\n]);\n\n// Validation helper functions\nexport const validateRelayNotificationMessage = (message: unknown) => {\n return relayNotificationMessageSchema.parse(message);\n};\n\nexport const safeValidateRelayNotificationMessage = (message: unknown) => {\n return relayNotificationMessageSchema.safeParse(message);\n};\n","/**\n * Zod validation schemas for BananaLink protocol types\n * Provides runtime type validation for all protocol messages\n */\n\nimport { z } from 'zod';\nimport { FRUITS, NETWORK_CONFIG } from '../constants';\n\n// Base validation schemas\nconst ethereumAddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address');\nconst iso8601Schema = z.string().datetime({ message: 'Invalid ISO 8601 datetime' });\nconst urlSchema = z.string().url('Invalid URL');\nconst domainSchema = z.string().min(1, 'Domain cannot be empty');\n// Protocol v2.0: 32-byte nonces = 64 hex characters\nconst nonceSchema = z\n .string()\n .length(64, 'Nonce must be exactly 64 characters (32 bytes hex-encoded)')\n .regex(/^[a-fA-F0-9]{64}$/, 'Nonce must be a valid 64-character hexadecimal string');\n\n// SIWE base schema\nexport const siweFieldsSchema = z.object({\n scheme: z.string().optional(),\n domain: domainSchema,\n address: ethereumAddressSchema,\n statement: z.string().optional(),\n uri: urlSchema,\n version: z.literal('1'),\n chainId: z.number().int().positive(),\n nonce: nonceSchema,\n issuedAt: iso8601Schema,\n expirationTime: iso8601Schema.optional(),\n notBefore: iso8601Schema.optional(),\n requestId: z.string().optional(),\n resources: z.array(urlSchema).optional(),\n});\n\n// DApp metadata schema\nexport const dAppMetadataSchema = z.object({\n returnUrl: urlSchema.optional(),\n});\n\n// QR payload schema\nexport const qrPayloadSchema = z.object({\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n publicKey: z.string().min(1, 'Public key cannot be empty'),\n providerId: z.string().optional(),\n relayUrl: z.string().url().optional(),\n});\n\n// Encrypted payload schema\nexport const encryptedPayloadSchema = z.object({\n iv: z.string().min(1, 'IV cannot be empty'),\n ciphertext: z.string().min(1, 'Ciphertext cannot be empty'),\n mac: z.string().min(1, 'MAC cannot be empty'),\n});\n\n// Relay message type schema\nexport const relayMessageTypeSchema = z.enum(['pub', 'sub', 'ack', 'error']);\n\n// Relay message schema\nexport const relayMessageSchema = z.object({\n topic: z.string().min(1, 'Topic cannot be empty'),\n type: relayMessageTypeSchema,\n payload: encryptedPayloadSchema.optional(),\n id: z.string().min(1, 'Message ID cannot be empty'),\n});\n\n// Security policy schema\nexport const securityPolicySchema = z.object({\n sessionTimeout: z.number().int().positive(),\n requestTimeout: z.number().int().positive(),\n maxConcurrentSessions: z.number().int().positive(),\n requireOriginProof: z.boolean(),\n allowedDomains: z.array(domainSchema).optional(),\n blockedDomains: z.array(domainSchema).optional(),\n});\n\n// Origin proof schema\nexport const originProofSchema = z.object({\n domain: domainSchema,\n timestamp: z.number().int().positive(),\n signature: z.string().min(1, 'Signature cannot be empty'),\n});\n\n// Session state schema (Protocol v2.0)\nexport const sessionStateSchema = z.enum([\n 'created',\n 'claimed',\n 'authenticated',\n 'active',\n 'disconnected',\n 'closed',\n 'expired',\n 'rejected',\n]);\n\n// Session info schema\nexport const sessionInfoSchema = z.object({\n sessionId: z.string().min(1, 'Session ID cannot be empty'),\n state: sessionStateSchema,\n address: ethereumAddressSchema.optional(),\n metadata: dAppMetadataSchema,\n createdAt: iso8601Schema,\n lastActivity: iso8601Schema,\n expiresAt: iso8601Schema.optional(),\n});\n\n// Display info schema\nexport const displayInfoSchema = z.object({\n qrCode: z.string().min(1, 'QR code cannot be empty'),\n frutiLink: z.string().regex(/^[🍌🍎🍊🍇🍓🍑🍒🍉🥝🍍🥭🥥🫐🍈🍋🥑]{8}$/u, 'Invalid FrutiLink format'),\n deepLink: urlSchema,\n});\n\n// Error code schema (Protocol v2.0+)\nexport const errorCodeSchema = z.enum([\n // Session errors\n 'SESSION_EXPIRED',\n 'SESSION_NOT_FOUND',\n 'SESSION_ALREADY_CLAIMED',\n 'INVALID_SESSION_CLAIM',\n 'INVALID_CLIENT_CLAIM',\n 'SESSION_TOKEN_EXPIRED',\n 'SESSION_CLOSED',\n // Encryption errors\n 'ENCRYPTION_FAILED',\n 'DECRYPTION_FAILED',\n 'INVALID_SIGNATURE',\n // Network errors\n 'NETWORK_ERROR',\n 'RELAY_ERROR',\n 'MESSAGE_QUEUE_FULL',\n 'RATE_LIMIT_EXCEEDED',\n 'ORIGIN_MISMATCH',\n // Request lifecycle errors (v2.1+)\n 'REQUEST_PENDING',\n 'REQUEST_NOT_FOUND',\n 'REQUEST_EXPIRED',\n 'REQUEST_INVALID',\n 'REQUEST_TIMEOUT',\n // Operation-specific errors (v2.1+)\n 'SIGNING_FAILED',\n 'SIGNING_REJECTED',\n 'TRANSACTION_INVALID',\n 'CHAIN_MISMATCH',\n]);\n\n// BananaLink error schema\nexport const bananaLinkErrorSchema = z.object({\n code: errorCodeSchema,\n message: z.string().min(1, 'Error message cannot be empty'),\n details: z.unknown().optional(),\n});\n\n// FrutiLink validation\nexport const frutiLinkSchema = z.string()\n .length(8, 'FrutiLink must be exactly 8 characters')\n .refine(\n (value) => value.split('').every(char => FRUITS.includes(char as typeof FRUITS[number])),\n 'FrutiLink contains invalid fruits'\n );\n\n// Supported chain ID validation\nexport const supportedChainIdSchema = z.number()\n .int()\n .refine(\n (chainId) => NETWORK_CONFIG.SUPPORTED_CHAINS.includes(chainId as typeof NETWORK_CONFIG.SUPPORTED_CHAINS[number]),\n 'Unsupported chain ID'\n );\n\n// Base64 string validation\nexport const base64Schema = z.string().regex(\n /^[A-Za-z0-9+/]*={0,2}$/,\n 'Invalid Base64 string'\n);\n\n// Session ID validation (UUID v4)\nexport const sessionIdSchema = z.string().regex(\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,\n 'Invalid session ID format'\n);\n\n// Public key validation (base64 encoded)\nexport const publicKeySchema = z.string()\n .min(1, 'Public key cannot be empty')\n .refine(\n (key) => {\n try {\n atob(key);\n return true;\n } catch {\n return false;\n }\n },\n 'Public key must be valid Base64'\n );\n\n// Validation helper functions (Protocol v2.0)\nexport const validateQRPayload = (payload: unknown) => qrPayloadSchema.parse(payload);\nexport const validateRelayMessage = (message: unknown) => relayMessageSchema.parse(message);\nexport const validateSessionInfo = (info: unknown) => sessionInfoSchema.parse(info);\nexport const validateFrutiLink = (frutiLink: unknown) => frutiLinkSchema.parse(frutiLink);\n\n// Safe parsing functions (returns { success: boolean, data?: T, error?: ZodError })\nexport const safeValidateQRPayload = (payload: unknown) => qrPayloadSchema.safeParse(payload);\nexport const safeValidateRelayMessage = (message: unknown) => relayMessageSchema.safeParse(message);\nexport const safeValidateSessionInfo = (info: unknown) => sessionInfoSchema.safeParse(info);\nexport const safeValidateFrutiLink = (frutiLink: unknown) => frutiLinkSchema.safeParse(frutiLink);\n\n// Type inference from schemas (Protocol v2.0)\nexport type SIWEFields = z.infer<typeof siweFieldsSchema>;\nexport type DAppMetadata = z.infer<typeof dAppMetadataSchema>;\nexport type QRPayload = z.infer<typeof qrPayloadSchema>;\nexport type EncryptedPayload = z.infer<typeof encryptedPayloadSchema>;\nexport type RelayMessage = z.infer<typeof relayMessageSchema>;\nexport type SecurityPolicy = z.infer<typeof securityPolicySchema>;\nexport type SessionInfo = z.infer<typeof sessionInfoSchema>;\nexport type DisplayInfo = z.infer<typeof displayInfoSchema>;\n\n// Re-export core schemas (Protocol v2.0)\nexport {\n dAppMetadataSchema as coreDAppMetadataSchema,\n sessionConfigSchema,\n sessionOptionsSchema,\n sessionMetadataSchema,\n createSessionRequestSchema,\n createSessionResponseSchema,\n clientSessionClaimSchema,\n securityPolicySchema as coreSecurityPolicySchema,\n} from './core';\n\n// Re-export v2.0 wallet message schemas\nexport * from './wallet-messages';\n\n// Re-export v2.0 client message schemas\nexport * from './client-messages';\n\n// Re-export v2.0 relay message schemas\nexport * from './relay-messages';\n"]}
|