@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.
Files changed (36) hide show
  1. package/dist/{chunk-KNGZKGRS.cjs → chunk-RZPN2GDJ.cjs} +13 -4
  2. package/dist/chunk-RZPN2GDJ.cjs.map +1 -0
  3. package/dist/{chunk-7KYDLL3B.js → chunk-XCMAKN3P.js} +13 -5
  4. package/dist/chunk-XCMAKN3P.js.map +1 -0
  5. package/dist/{client-session-claim-C4lUik3b.d.cts → client-session-claim-CkRKTG50.d.cts} +12 -2
  6. package/dist/{client-session-claim-3QF3noOr.d.ts → client-session-claim-CrIDASkZ.d.ts} +12 -2
  7. package/dist/{crypto-BUS06Qz-.d.cts → crypto-BK0Ile6V.d.cts} +1 -1
  8. package/dist/{crypto-BUS06Qz-.d.ts → crypto-BK0Ile6V.d.ts} +1 -1
  9. package/dist/crypto-export.d.cts +1 -1
  10. package/dist/crypto-export.d.ts +1 -1
  11. package/dist/index.cjs +6 -1
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +31 -4
  14. package/dist/index.d.ts +31 -4
  15. package/dist/index.js +6 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/schemas-export.cjs +76 -72
  18. package/dist/schemas-export.d.cts +116 -1
  19. package/dist/schemas-export.d.ts +116 -1
  20. package/dist/schemas-export.js +1 -1
  21. package/dist/testing.d.cts +2 -2
  22. package/dist/testing.d.ts +2 -2
  23. package/dist/validation-export.cjs +76 -72
  24. package/dist/validation-export.d.cts +1 -1
  25. package/dist/validation-export.d.ts +1 -1
  26. package/dist/validation-export.js +1 -1
  27. package/package.json +1 -1
  28. package/src/index.ts +1 -0
  29. package/src/schemas/client-messages.ts +14 -0
  30. package/src/schemas/wallet-messages.ts +4 -0
  31. package/src/types/client-messages.ts +26 -1
  32. package/src/types/index.ts +9 -0
  33. package/src/types/persistence.ts +32 -0
  34. package/src/types/wallet-messages.ts +6 -2
  35. package/dist/chunk-7KYDLL3B.js.map +0 -1
  36. 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-7KYDLL3B.js';
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.0",
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
+ }
@@ -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"]}