@bananalink-sdk/protocol 1.2.7

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 (158) hide show
  1. package/README.md +604 -0
  2. package/dist/chunk-32OWUOZ3.js +308 -0
  3. package/dist/chunk-32OWUOZ3.js.map +1 -0
  4. package/dist/chunk-65HNHRJK.cjs +123 -0
  5. package/dist/chunk-65HNHRJK.cjs.map +1 -0
  6. package/dist/chunk-7KYDLL3B.js +480 -0
  7. package/dist/chunk-7KYDLL3B.js.map +1 -0
  8. package/dist/chunk-A6FLEJ7R.cjs +62 -0
  9. package/dist/chunk-A6FLEJ7R.cjs.map +1 -0
  10. package/dist/chunk-CUJK7ZTS.js +217 -0
  11. package/dist/chunk-CUJK7ZTS.js.map +1 -0
  12. package/dist/chunk-GI3BUPIH.cjs +236 -0
  13. package/dist/chunk-GI3BUPIH.cjs.map +1 -0
  14. package/dist/chunk-JXHV66Q4.js +106 -0
  15. package/dist/chunk-JXHV66Q4.js.map +1 -0
  16. package/dist/chunk-KNGZKGRS.cjs +552 -0
  17. package/dist/chunk-KNGZKGRS.cjs.map +1 -0
  18. package/dist/chunk-LELPCIE7.js +840 -0
  19. package/dist/chunk-LELPCIE7.js.map +1 -0
  20. package/dist/chunk-MCZG7QEM.cjs +310 -0
  21. package/dist/chunk-MCZG7QEM.cjs.map +1 -0
  22. package/dist/chunk-TCVKC227.js +56 -0
  23. package/dist/chunk-TCVKC227.js.map +1 -0
  24. package/dist/chunk-VXLUSU5B.cjs +856 -0
  25. package/dist/chunk-VXLUSU5B.cjs.map +1 -0
  26. package/dist/chunk-WCQVDF3K.js +12 -0
  27. package/dist/chunk-WCQVDF3K.js.map +1 -0
  28. package/dist/chunk-WGEGR3DF.cjs +15 -0
  29. package/dist/chunk-WGEGR3DF.cjs.map +1 -0
  30. package/dist/client-session-claim-3QF3noOr.d.ts +197 -0
  31. package/dist/client-session-claim-C4lUik3b.d.cts +197 -0
  32. package/dist/core-DMhuNfoz.d.cts +62 -0
  33. package/dist/core-DMhuNfoz.d.ts +62 -0
  34. package/dist/crypto/providers/noble-provider.cjs +14 -0
  35. package/dist/crypto/providers/noble-provider.cjs.map +1 -0
  36. package/dist/crypto/providers/noble-provider.d.cts +30 -0
  37. package/dist/crypto/providers/noble-provider.d.ts +30 -0
  38. package/dist/crypto/providers/noble-provider.js +5 -0
  39. package/dist/crypto/providers/noble-provider.js.map +1 -0
  40. package/dist/crypto/providers/node-provider.cjs +308 -0
  41. package/dist/crypto/providers/node-provider.cjs.map +1 -0
  42. package/dist/crypto/providers/node-provider.d.cts +32 -0
  43. package/dist/crypto/providers/node-provider.d.ts +32 -0
  44. package/dist/crypto/providers/node-provider.js +306 -0
  45. package/dist/crypto/providers/node-provider.js.map +1 -0
  46. package/dist/crypto/providers/quickcrypto-provider.cjs +339 -0
  47. package/dist/crypto/providers/quickcrypto-provider.cjs.map +1 -0
  48. package/dist/crypto/providers/quickcrypto-provider.d.cts +34 -0
  49. package/dist/crypto/providers/quickcrypto-provider.d.ts +34 -0
  50. package/dist/crypto/providers/quickcrypto-provider.js +337 -0
  51. package/dist/crypto/providers/quickcrypto-provider.js.map +1 -0
  52. package/dist/crypto/providers/webcrypto-provider.cjs +310 -0
  53. package/dist/crypto/providers/webcrypto-provider.cjs.map +1 -0
  54. package/dist/crypto/providers/webcrypto-provider.d.cts +30 -0
  55. package/dist/crypto/providers/webcrypto-provider.d.ts +30 -0
  56. package/dist/crypto/providers/webcrypto-provider.js +308 -0
  57. package/dist/crypto/providers/webcrypto-provider.js.map +1 -0
  58. package/dist/crypto-BUS06Qz-.d.cts +40 -0
  59. package/dist/crypto-BUS06Qz-.d.ts +40 -0
  60. package/dist/crypto-export.cjs +790 -0
  61. package/dist/crypto-export.cjs.map +1 -0
  62. package/dist/crypto-export.d.cts +257 -0
  63. package/dist/crypto-export.d.ts +257 -0
  64. package/dist/crypto-export.js +709 -0
  65. package/dist/crypto-export.js.map +1 -0
  66. package/dist/crypto-provider-deYoVIxi.d.cts +36 -0
  67. package/dist/crypto-provider-deYoVIxi.d.ts +36 -0
  68. package/dist/index.cjs +615 -0
  69. package/dist/index.cjs.map +1 -0
  70. package/dist/index.d.cts +379 -0
  71. package/dist/index.d.ts +379 -0
  72. package/dist/index.js +504 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/schemas-export.cjs +294 -0
  75. package/dist/schemas-export.cjs.map +1 -0
  76. package/dist/schemas-export.d.cts +1598 -0
  77. package/dist/schemas-export.d.ts +1598 -0
  78. package/dist/schemas-export.js +5 -0
  79. package/dist/schemas-export.js.map +1 -0
  80. package/dist/siwe-export.cjs +237 -0
  81. package/dist/siwe-export.cjs.map +1 -0
  82. package/dist/siwe-export.d.cts +27 -0
  83. package/dist/siwe-export.d.ts +27 -0
  84. package/dist/siwe-export.js +228 -0
  85. package/dist/siwe-export.js.map +1 -0
  86. package/dist/testing.cjs +54 -0
  87. package/dist/testing.cjs.map +1 -0
  88. package/dist/testing.d.cts +20 -0
  89. package/dist/testing.d.ts +20 -0
  90. package/dist/testing.js +51 -0
  91. package/dist/testing.js.map +1 -0
  92. package/dist/validation-export.cjs +359 -0
  93. package/dist/validation-export.cjs.map +1 -0
  94. package/dist/validation-export.d.cts +3 -0
  95. package/dist/validation-export.d.ts +3 -0
  96. package/dist/validation-export.js +6 -0
  97. package/dist/validation-export.js.map +1 -0
  98. package/dist/validators-export.cjs +73 -0
  99. package/dist/validators-export.cjs.map +1 -0
  100. package/dist/validators-export.d.cts +37 -0
  101. package/dist/validators-export.d.ts +37 -0
  102. package/dist/validators-export.js +4 -0
  103. package/dist/validators-export.js.map +1 -0
  104. package/package.json +140 -0
  105. package/src/constants/index.ts +205 -0
  106. package/src/crypto/context.ts +228 -0
  107. package/src/crypto/diagnostics.ts +772 -0
  108. package/src/crypto/errors.ts +114 -0
  109. package/src/crypto/index.ts +89 -0
  110. package/src/crypto/payload-handler.ts +102 -0
  111. package/src/crypto/providers/compliance-provider.ts +579 -0
  112. package/src/crypto/providers/factory.ts +204 -0
  113. package/src/crypto/providers/index.ts +44 -0
  114. package/src/crypto/providers/noble-provider.ts +392 -0
  115. package/src/crypto/providers/node-provider.ts +433 -0
  116. package/src/crypto/providers/quickcrypto-provider.ts +483 -0
  117. package/src/crypto/providers/registry.ts +129 -0
  118. package/src/crypto/providers/webcrypto-provider.ts +364 -0
  119. package/src/crypto/session-security.ts +185 -0
  120. package/src/crypto/types.ts +93 -0
  121. package/src/crypto/utils.ts +190 -0
  122. package/src/crypto-export.ts +21 -0
  123. package/src/index.ts +38 -0
  124. package/src/schemas/auth.ts +60 -0
  125. package/src/schemas/client-messages.ts +57 -0
  126. package/src/schemas/core.ts +144 -0
  127. package/src/schemas/crypto.ts +65 -0
  128. package/src/schemas/discovery.ts +79 -0
  129. package/src/schemas/index.ts +239 -0
  130. package/src/schemas/relay-messages.ts +45 -0
  131. package/src/schemas/wallet-messages.ts +177 -0
  132. package/src/schemas-export.ts +23 -0
  133. package/src/siwe-export.ts +27 -0
  134. package/src/testing.ts +71 -0
  135. package/src/types/auth.ts +60 -0
  136. package/src/types/client-messages.ts +84 -0
  137. package/src/types/core.ts +131 -0
  138. package/src/types/crypto-provider.ts +264 -0
  139. package/src/types/crypto.ts +90 -0
  140. package/src/types/discovery.ts +50 -0
  141. package/src/types/errors.ts +87 -0
  142. package/src/types/index.ts +197 -0
  143. package/src/types/post-auth-operations.ts +363 -0
  144. package/src/types/providers.ts +72 -0
  145. package/src/types/relay-messages.ts +60 -0
  146. package/src/types/request-lifecycle.ts +161 -0
  147. package/src/types/signing-operations.ts +99 -0
  148. package/src/types/wallet-messages.ts +251 -0
  149. package/src/utils/client-session-claim.ts +188 -0
  150. package/src/utils/index.ts +54 -0
  151. package/src/utils/public-keys.ts +49 -0
  152. package/src/utils/siwe.ts +362 -0
  153. package/src/utils/url-decoding.ts +126 -0
  154. package/src/utils/url-encoding.ts +144 -0
  155. package/src/utils/wallet-session-claim.ts +188 -0
  156. package/src/validation-export.ts +32 -0
  157. package/src/validators/index.ts +222 -0
  158. package/src/validators-export.ts +8 -0
@@ -0,0 +1,552 @@
1
+ 'use strict';
2
+
3
+ var chunkGI3BUPIH_cjs = require('./chunk-GI3BUPIH.cjs');
4
+ var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
5
+ var zod = require('zod');
6
+
7
+ var ethereumAddressSchema = zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address");
8
+ var hexStringSchema = zod.z.string().regex(/^0x[a-fA-F0-9]*$/, "Invalid hex string");
9
+ var iso8601Schema = zod.z.string().datetime({ message: "Invalid ISO 8601 datetime" });
10
+ var urlSchema = zod.z.string().url("Invalid URL");
11
+ var domainSchema = zod.z.string().min(1, "Domain cannot be empty");
12
+ var nonceSchema = zod.z.string().length(64, "Nonce must be exactly 64 characters (32 bytes hex-encoded)").regex(/^[a-fA-F0-9]{64}$/, "Nonce must be a valid 64-character hexadecimal string");
13
+ var siweFieldsSchema = zod.z.object({
14
+ scheme: zod.z.string().optional(),
15
+ domain: domainSchema,
16
+ address: ethereumAddressSchema,
17
+ statement: zod.z.string().optional(),
18
+ uri: urlSchema,
19
+ version: zod.z.literal("1"),
20
+ chainId: zod.z.number().int().positive(),
21
+ nonce: nonceSchema,
22
+ issuedAt: iso8601Schema,
23
+ expirationTime: iso8601Schema.optional(),
24
+ notBefore: iso8601Schema.optional(),
25
+ requestId: zod.z.string().optional(),
26
+ resources: zod.z.array(urlSchema).optional()
27
+ });
28
+ var transactionPayloadSchema = zod.z.object({
29
+ to: ethereumAddressSchema,
30
+ value: zod.z.string().regex(/^\d+$/, "Value must be a numeric string").optional(),
31
+ data: hexStringSchema.optional(),
32
+ gas: zod.z.string().regex(/^\d+$/, "Gas must be a numeric string").optional(),
33
+ gasPrice: zod.z.string().regex(/^\d+$/, "Gas price must be a numeric string").optional(),
34
+ maxFeePerGas: zod.z.string().regex(/^\d+$/, "Max fee per gas must be a numeric string").optional(),
35
+ maxPriorityFeePerGas: zod.z.string().regex(/^\d+$/, "Max priority fee per gas must be a numeric string").optional()
36
+ });
37
+ var signPayloadSchema = zod.z.object({
38
+ message: zod.z.string().min(1, "Message cannot be empty"),
39
+ encoding: zod.z.enum(["utf8", "hex"]).default("utf8")
40
+ });
41
+ var messageTypeSchema = zod.z.enum(["auth", "tx", "sign"]);
42
+ siweFieldsSchema.extend({
43
+ type: messageTypeSchema,
44
+ sessionId: zod.z.string().min(1, "Session ID cannot be empty"),
45
+ payload: zod.z.union([transactionPayloadSchema, signPayloadSchema]).optional()
46
+ });
47
+ var dAppMetadataSchema = zod.z.object({
48
+ dappId: zod.z.string().optional(),
49
+ name: zod.z.string().min(1, "Name cannot be empty"),
50
+ description: zod.z.string().optional(),
51
+ url: urlSchema,
52
+ icons: zod.z.array(urlSchema).optional()
53
+ });
54
+ var sessionConfigSchema = zod.z.object({
55
+ returnUrl: urlSchema.optional(),
56
+ sessionName: zod.z.string().optional(),
57
+ expiresAt: iso8601Schema.optional(),
58
+ customData: zod.z.record(zod.z.unknown()).optional()
59
+ });
60
+ zod.z.object({
61
+ success: zod.z.boolean(),
62
+ data: zod.z.unknown().optional(),
63
+ error: zod.z.string().optional(),
64
+ requestId: zod.z.string().optional()
65
+ });
66
+ var securityPolicySchema = zod.z.object({
67
+ sessionTimeout: zod.z.number().int().positive(),
68
+ requestTimeout: zod.z.number().int().positive(),
69
+ maxConcurrentSessions: zod.z.number().int().positive(),
70
+ requireOriginProof: zod.z.boolean(),
71
+ allowedDomains: zod.z.array(domainSchema).optional(),
72
+ blockedDomains: zod.z.array(domainSchema).optional()
73
+ });
74
+ var sessionOptionsSchema = zod.z.object({
75
+ config: sessionConfigSchema.optional(),
76
+ securityPolicy: securityPolicySchema.partial().optional(),
77
+ relayUrl: urlSchema.optional()
78
+ });
79
+ var sessionMetadataSchema = zod.z.object({
80
+ encryptionAlgorithm: zod.z.enum(["AES-GCM", "plaintext"]),
81
+ sessionId: zod.z.string().min(1, "Session ID cannot be empty"),
82
+ publicKey: zod.z.string().optional(),
83
+ timestamp: iso8601Schema
84
+ });
85
+ var createSessionRequestSchema = zod.z.object({
86
+ dappId: zod.z.string().uuid("Invalid DApp ID format"),
87
+ metadata: sessionMetadataSchema,
88
+ sessionConfig: sessionConfigSchema.optional()
89
+ });
90
+ var clientSessionClaimSchema = zod.z.object({
91
+ /** Unique nonce for client session claim (32 bytes hex-encoded = 64 characters) */
92
+ claimNonce: zod.z.string().length(64, "Claim nonce must be exactly 64 characters (32 bytes hex-encoded)").regex(/^[0-9a-f]{64}$/, "Claim nonce must be lowercase hexadecimal"),
93
+ timestamp: zod.z.number().int().positive()
94
+ });
95
+ var createSessionResponseSchema = zod.z.object({
96
+ sessionId: zod.z.string().uuid("Invalid session ID format"),
97
+ clientSessionClaim: clientSessionClaimSchema,
98
+ ttl: zod.z.number().int().positive()
99
+ });
100
+ var urlSchema2 = zod.z.string().url("Invalid URL");
101
+ zod.z.object({
102
+ sessionId: zod.z.string().min(1, "Session ID cannot be empty"),
103
+ publicKey: zod.z.string().min(1, "Public key cannot be empty"),
104
+ relayUrl: zod.z.string().url().optional(),
105
+ providerId: zod.z.string().optional()
106
+ });
107
+ var encryptedPayloadSchema = zod.z.object({
108
+ iv: zod.z.string().min(1, "IV cannot be empty"),
109
+ ciphertext: zod.z.string().min(1, "Ciphertext cannot be empty"),
110
+ mac: zod.z.string().min(1, "MAC cannot be empty")
111
+ });
112
+ var relayMessageTypeSchema = zod.z.enum(["pub", "sub", "ack", "error"]);
113
+ zod.z.object({
114
+ topic: zod.z.string().min(1, "Topic cannot be empty"),
115
+ type: relayMessageTypeSchema,
116
+ payload: encryptedPayloadSchema.optional(),
117
+ id: zod.z.string().min(1, "Message ID cannot be empty")
118
+ });
119
+ zod.z.object({
120
+ qrCode: zod.z.string().min(1, "QR code cannot be empty"),
121
+ frutiLink: zod.z.string().regex(/^[🍌🍎🍊🍇🍓🍑🍒🍉🥝🍍🥭🥥🫐🍈🍋🥑]{8}$/u, "Invalid FrutiLink format"),
122
+ deepLink: urlSchema2
123
+ });
124
+ zod.z.string().length(8, "FrutiLink must be exactly 8 characters").refine(
125
+ (value) => value.split("").every((char) => chunkGI3BUPIH_cjs.FRUITS.includes(char)),
126
+ "FrutiLink contains invalid fruits"
127
+ );
128
+ zod.z.string().min(1, "Public key cannot be empty").refine(
129
+ (key) => {
130
+ try {
131
+ atob(key);
132
+ return true;
133
+ } catch {
134
+ return false;
135
+ }
136
+ },
137
+ "Public key must be valid Base64"
138
+ );
139
+
140
+ // src/schemas/wallet-messages.ts
141
+ var walletSessionClaimSchema = zod.z.object({
142
+ /** Unique nonce for this session claim (32 bytes hex-encoded = 64 characters) */
143
+ sessionNonce: zod.z.string().length(64, "Session nonce must be exactly 64 characters (32 bytes hex-encoded)").regex(/^[0-9a-f]{64}$/, "Session nonce must be lowercase hexadecimal"),
144
+ /** Claim timestamp */
145
+ timestamp: zod.z.number().int().positive("Timestamp must be a positive integer")
146
+ });
147
+ var claimSessionPayloadSchema = zod.z.object({
148
+ type: zod.z.literal("claim_session"),
149
+ /** Wallet's public key for ECDH key exchange - format: "algorithm:key_data" (e.g., "AES-GCM:base64..." or "cleartext:none") */
150
+ walletPublicKey: zod.z.string().min(1, "Wallet public key cannot be empty").regex(/^(AES-GCM:|cleartext:)/, 'Wallet public key must start with "AES-GCM:" or "cleartext:"')
151
+ });
152
+ var prefetchMetadataPayloadSchema = zod.z.object({
153
+ type: zod.z.literal("prefetch_metadata")
154
+ });
155
+ var connectionRejectedPayloadSchema = zod.z.object({
156
+ type: zod.z.literal("connection_rejected"),
157
+ encrypted: encryptedPayloadSchema
158
+ });
159
+ var authenticateConnectionPayloadSchema = zod.z.object({
160
+ type: zod.z.literal("authenticate_connection"),
161
+ encrypted: encryptedPayloadSchema
162
+ });
163
+ var walletReconnectPayloadSchema = zod.z.object({
164
+ type: zod.z.literal("wallet_reconnect")
165
+ });
166
+ var walletMessagePayloadSchema = zod.z.discriminatedUnion("type", [
167
+ claimSessionPayloadSchema,
168
+ prefetchMetadataPayloadSchema,
169
+ connectionRejectedPayloadSchema,
170
+ authenticateConnectionPayloadSchema,
171
+ walletReconnectPayloadSchema
172
+ ]);
173
+ var walletMessageEnvelopeSchema = zod.z.object({
174
+ /** Session identifier */
175
+ sessionId: zod.z.string().uuid("Session ID must be a valid UUID"),
176
+ /** Wallet session claim credential */
177
+ walletSessionClaim: walletSessionClaimSchema,
178
+ /** Message payload */
179
+ payload: walletMessagePayloadSchema
180
+ });
181
+ var rejectionDataSchema = zod.z.object({
182
+ reason: zod.z.string().optional(),
183
+ timestamp: zod.z.number().int().positive()
184
+ });
185
+ var walletMetadataSchema = zod.z.object({
186
+ /** Wallet name */
187
+ name: zod.z.string().min(1, "Wallet name cannot be empty"),
188
+ /** Wallet version */
189
+ version: zod.z.string().optional(),
190
+ /** Wallet icon URL */
191
+ icon: zod.z.string().url("Invalid icon URL").optional(),
192
+ /** Wallet description */
193
+ description: zod.z.string().optional(),
194
+ /** Wallet website URL */
195
+ url: zod.z.string().url("Invalid wallet URL").optional(),
196
+ /** Wallet provider type */
197
+ provider: zod.z.string().optional()
198
+ });
199
+ var authenticationDataSchema = zod.z.object({
200
+ /** Wallet address */
201
+ address: zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address"),
202
+ /** Signature of the SIWE message */
203
+ signature: zod.z.string().regex(/^0x[a-fA-F0-9]+$/, "Invalid signature format"),
204
+ /** Full SIWE message that was signed */
205
+ message: zod.z.string().min(1, "Message cannot be empty"),
206
+ /** Chain ID (EIP-155) */
207
+ chainId: zod.z.number().int().positive("Chain ID must be a positive integer"),
208
+ /** Network identifier */
209
+ network: zod.z.string().optional(),
210
+ /** Signing algorithm */
211
+ signingAlgo: zod.z.string().optional(),
212
+ /** Optional wallet metadata */
213
+ walletMetadata: walletMetadataSchema.optional()
214
+ });
215
+ var walletHandshakeMessageSchema = zod.z.object({
216
+ type: zod.z.literal("wallet_handshake"),
217
+ status: zod.z.literal("reviewing"),
218
+ /** Wallet's public key in format "algorithm:base64_public_key" */
219
+ walletPublicKey: zod.z.string(),
220
+ timestamp: zod.z.number().int().positive()
221
+ });
222
+ var connectionRejectedMessageSchema = zod.z.object({
223
+ type: zod.z.literal("connection_rejected"),
224
+ encrypted: encryptedPayloadSchema
225
+ });
226
+ var connectionAuthenticatedMessageSchema = zod.z.object({
227
+ type: zod.z.literal("connection_authenticated"),
228
+ encrypted: encryptedPayloadSchema
229
+ });
230
+ var relayToDAppMessageSchema = zod.z.discriminatedUnion("type", [
231
+ walletHandshakeMessageSchema,
232
+ connectionRejectedMessageSchema,
233
+ connectionAuthenticatedMessageSchema
234
+ ]);
235
+ var prefetchMetadataResponseSchema = zod.z.object({
236
+ dappMetadata: dAppMetadataSchema,
237
+ sessionConfig: sessionConfigSchema.optional()
238
+ });
239
+ var validateWalletMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => {
240
+ return walletMessageEnvelopeSchema.parse(message);
241
+ }, "validateWalletMessage");
242
+ var safeValidateWalletMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => {
243
+ return walletMessageEnvelopeSchema.safeParse(message);
244
+ }, "safeValidateWalletMessage");
245
+ var validateRelayToDAppMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => {
246
+ return relayToDAppMessageSchema.parse(message);
247
+ }, "validateRelayToDAppMessage");
248
+ var safeValidateRelayToDAppMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => {
249
+ return relayToDAppMessageSchema.safeParse(message);
250
+ }, "safeValidateRelayToDAppMessage");
251
+ var validateWalletSessionClaim = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((claim) => {
252
+ return walletSessionClaimSchema.parse(claim);
253
+ }, "validateWalletSessionClaim");
254
+ var safeValidateWalletSessionClaim = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((claim) => {
255
+ return walletSessionClaimSchema.safeParse(claim);
256
+ }, "safeValidateWalletSessionClaim");
257
+ function validateTimestamp(timestamp, maxAge = 5 * 60 * 1e3) {
258
+ const now = Date.now();
259
+ const age = Math.abs(now - timestamp);
260
+ return age <= maxAge;
261
+ }
262
+ chunkWGEGR3DF_cjs.__name(validateTimestamp, "validateTimestamp");
263
+ var clientSessionClaimSchema2 = zod.z.object({
264
+ /** Unique nonce for this client session */
265
+ claimNonce: zod.z.string().min(32, "Client claim nonce must be at least 32 characters"),
266
+ /** Claim generation timestamp */
267
+ timestamp: zod.z.number().int().positive("Timestamp must be a positive integer")
268
+ });
269
+ var clientReconnectPayloadSchema = zod.z.object({
270
+ type: zod.z.literal("client_reconnect")
271
+ });
272
+ var closeSessionPayloadSchema = zod.z.object({
273
+ type: zod.z.literal("close_session"),
274
+ /** Optional reason for closing the session */
275
+ reason: zod.z.string().optional()
276
+ });
277
+ var clientMessagePayloadSchema = zod.z.discriminatedUnion("type", [
278
+ clientReconnectPayloadSchema,
279
+ closeSessionPayloadSchema
280
+ ]);
281
+ var clientMessageEnvelopeSchema = zod.z.object({
282
+ /** Session identifier */
283
+ sessionId: zod.z.string().uuid("Session ID must be a valid UUID"),
284
+ /** Client session claim */
285
+ clientSessionClaim: clientSessionClaimSchema2,
286
+ /** Message payload */
287
+ payload: clientMessagePayloadSchema
288
+ });
289
+ var validateClientMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => {
290
+ return clientMessageEnvelopeSchema.parse(message);
291
+ }, "validateClientMessage");
292
+ var safeValidateClientMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => {
293
+ return clientMessageEnvelopeSchema.safeParse(message);
294
+ }, "safeValidateClientMessage");
295
+ var validateClientSessionClaim = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((claim) => {
296
+ return clientSessionClaimSchema2.parse(claim);
297
+ }, "validateClientSessionClaim");
298
+ var safeValidateClientSessionClaim = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((claim) => {
299
+ return clientSessionClaimSchema2.safeParse(claim);
300
+ }, "safeValidateClientSessionClaim");
301
+ var sessionClosedAckSchema = zod.z.object({
302
+ type: zod.z.literal("session_closed_ack"),
303
+ timestamp: zod.z.number().int().positive()
304
+ });
305
+ var sessionClosedNotificationSchema = zod.z.object({
306
+ type: zod.z.literal("session_closed_notification"),
307
+ /** Which party closed the session */
308
+ closedBy: zod.z.enum(["client", "wallet"]),
309
+ /** Optional reason for closure */
310
+ reason: zod.z.string().optional(),
311
+ timestamp: zod.z.number().int().positive()
312
+ });
313
+ var reconnectedMessageSchema = zod.z.object({
314
+ type: zod.z.literal("reconnected"),
315
+ /** Number of messages that were queued during disconnection */
316
+ queuedMessages: zod.z.number().int().nonnegative(),
317
+ timestamp: zod.z.number().int().positive()
318
+ });
319
+ var relayNotificationMessageSchema = zod.z.discriminatedUnion("type", [
320
+ sessionClosedAckSchema,
321
+ sessionClosedNotificationSchema,
322
+ reconnectedMessageSchema
323
+ ]);
324
+ var validateRelayNotificationMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => {
325
+ return relayNotificationMessageSchema.parse(message);
326
+ }, "validateRelayNotificationMessage");
327
+ var safeValidateRelayNotificationMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => {
328
+ return relayNotificationMessageSchema.safeParse(message);
329
+ }, "safeValidateRelayNotificationMessage");
330
+ var ethereumAddressSchema2 = zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address");
331
+ var iso8601Schema2 = zod.z.string().datetime({ message: "Invalid ISO 8601 datetime" });
332
+ var urlSchema3 = zod.z.string().url("Invalid URL");
333
+ var domainSchema2 = zod.z.string().min(1, "Domain cannot be empty");
334
+ var nonceSchema2 = zod.z.string().length(64, "Nonce must be exactly 64 characters (32 bytes hex-encoded)").regex(/^[a-fA-F0-9]{64}$/, "Nonce must be a valid 64-character hexadecimal string");
335
+ var siweFieldsSchema2 = zod.z.object({
336
+ scheme: zod.z.string().optional(),
337
+ domain: domainSchema2,
338
+ address: ethereumAddressSchema2,
339
+ statement: zod.z.string().optional(),
340
+ uri: urlSchema3,
341
+ version: zod.z.literal("1"),
342
+ chainId: zod.z.number().int().positive(),
343
+ nonce: nonceSchema2,
344
+ issuedAt: iso8601Schema2,
345
+ expirationTime: iso8601Schema2.optional(),
346
+ notBefore: iso8601Schema2.optional(),
347
+ requestId: zod.z.string().optional(),
348
+ resources: zod.z.array(urlSchema3).optional()
349
+ });
350
+ var dAppMetadataSchema2 = zod.z.object({
351
+ returnUrl: urlSchema3.optional()
352
+ });
353
+ var qrPayloadSchema2 = zod.z.object({
354
+ sessionId: zod.z.string().min(1, "Session ID cannot be empty"),
355
+ publicKey: zod.z.string().min(1, "Public key cannot be empty"),
356
+ providerId: zod.z.string().optional(),
357
+ relayUrl: zod.z.string().url().optional()
358
+ });
359
+ var encryptedPayloadSchema2 = zod.z.object({
360
+ iv: zod.z.string().min(1, "IV cannot be empty"),
361
+ ciphertext: zod.z.string().min(1, "Ciphertext cannot be empty"),
362
+ mac: zod.z.string().min(1, "MAC cannot be empty")
363
+ });
364
+ var relayMessageTypeSchema2 = zod.z.enum(["pub", "sub", "ack", "error"]);
365
+ var relayMessageSchema2 = zod.z.object({
366
+ topic: zod.z.string().min(1, "Topic cannot be empty"),
367
+ type: relayMessageTypeSchema2,
368
+ payload: encryptedPayloadSchema2.optional(),
369
+ id: zod.z.string().min(1, "Message ID cannot be empty")
370
+ });
371
+ var securityPolicySchema2 = zod.z.object({
372
+ sessionTimeout: zod.z.number().int().positive(),
373
+ requestTimeout: zod.z.number().int().positive(),
374
+ maxConcurrentSessions: zod.z.number().int().positive(),
375
+ requireOriginProof: zod.z.boolean(),
376
+ allowedDomains: zod.z.array(domainSchema2).optional(),
377
+ blockedDomains: zod.z.array(domainSchema2).optional()
378
+ });
379
+ var originProofSchema = zod.z.object({
380
+ domain: domainSchema2,
381
+ timestamp: zod.z.number().int().positive(),
382
+ signature: zod.z.string().min(1, "Signature cannot be empty")
383
+ });
384
+ var sessionStateSchema = zod.z.enum([
385
+ "created",
386
+ "claimed",
387
+ "authenticated",
388
+ "active",
389
+ "disconnected",
390
+ "closed",
391
+ "expired",
392
+ "rejected"
393
+ ]);
394
+ var sessionInfoSchema = zod.z.object({
395
+ sessionId: zod.z.string().min(1, "Session ID cannot be empty"),
396
+ state: sessionStateSchema,
397
+ address: ethereumAddressSchema2.optional(),
398
+ metadata: dAppMetadataSchema2,
399
+ createdAt: iso8601Schema2,
400
+ lastActivity: iso8601Schema2,
401
+ expiresAt: iso8601Schema2.optional()
402
+ });
403
+ var displayInfoSchema2 = zod.z.object({
404
+ qrCode: zod.z.string().min(1, "QR code cannot be empty"),
405
+ frutiLink: zod.z.string().regex(/^[🍌🍎🍊🍇🍓🍑🍒🍉🥝🍍🥭🥥🫐🍈🍋🥑]{8}$/u, "Invalid FrutiLink format"),
406
+ deepLink: urlSchema3
407
+ });
408
+ var errorCodeSchema = zod.z.enum([
409
+ // Session errors
410
+ "SESSION_EXPIRED",
411
+ "SESSION_NOT_FOUND",
412
+ "SESSION_ALREADY_CLAIMED",
413
+ "INVALID_SESSION_CLAIM",
414
+ "INVALID_CLIENT_CLAIM",
415
+ "SESSION_TOKEN_EXPIRED",
416
+ "SESSION_CLOSED",
417
+ // Encryption errors
418
+ "ENCRYPTION_FAILED",
419
+ "DECRYPTION_FAILED",
420
+ "INVALID_SIGNATURE",
421
+ // Network errors
422
+ "NETWORK_ERROR",
423
+ "RELAY_ERROR",
424
+ "MESSAGE_QUEUE_FULL",
425
+ "RATE_LIMIT_EXCEEDED",
426
+ "ORIGIN_MISMATCH",
427
+ // Request lifecycle errors (v2.1+)
428
+ "REQUEST_PENDING",
429
+ "REQUEST_NOT_FOUND",
430
+ "REQUEST_EXPIRED",
431
+ "REQUEST_INVALID",
432
+ "REQUEST_TIMEOUT",
433
+ // Operation-specific errors (v2.1+)
434
+ "SIGNING_FAILED",
435
+ "SIGNING_REJECTED",
436
+ "TRANSACTION_INVALID",
437
+ "CHAIN_MISMATCH"
438
+ ]);
439
+ var bananaLinkErrorSchema = zod.z.object({
440
+ code: errorCodeSchema,
441
+ message: zod.z.string().min(1, "Error message cannot be empty"),
442
+ details: zod.z.unknown().optional()
443
+ });
444
+ var frutiLinkSchema2 = zod.z.string().length(8, "FrutiLink must be exactly 8 characters").refine(
445
+ (value) => value.split("").every((char) => chunkGI3BUPIH_cjs.FRUITS.includes(char)),
446
+ "FrutiLink contains invalid fruits"
447
+ );
448
+ var supportedChainIdSchema = zod.z.number().int().refine(
449
+ (chainId) => chunkGI3BUPIH_cjs.NETWORK_CONFIG.SUPPORTED_CHAINS.includes(chainId),
450
+ "Unsupported chain ID"
451
+ );
452
+ var base64Schema = zod.z.string().regex(
453
+ /^[A-Za-z0-9+/]*={0,2}$/,
454
+ "Invalid Base64 string"
455
+ );
456
+ var sessionIdSchema = zod.z.string().regex(
457
+ /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,
458
+ "Invalid session ID format"
459
+ );
460
+ var publicKeySchema2 = zod.z.string().min(1, "Public key cannot be empty").refine(
461
+ (key) => {
462
+ try {
463
+ atob(key);
464
+ return true;
465
+ } catch {
466
+ return false;
467
+ }
468
+ },
469
+ "Public key must be valid Base64"
470
+ );
471
+ var validateQRPayload = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((payload) => qrPayloadSchema2.parse(payload), "validateQRPayload");
472
+ var validateRelayMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => relayMessageSchema2.parse(message), "validateRelayMessage");
473
+ var validateSessionInfo = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((info) => sessionInfoSchema.parse(info), "validateSessionInfo");
474
+ var validateFrutiLink = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((frutiLink) => frutiLinkSchema2.parse(frutiLink), "validateFrutiLink");
475
+ var safeValidateQRPayload = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((payload) => qrPayloadSchema2.safeParse(payload), "safeValidateQRPayload");
476
+ var safeValidateRelayMessage = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((message) => relayMessageSchema2.safeParse(message), "safeValidateRelayMessage");
477
+ var safeValidateSessionInfo = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((info) => sessionInfoSchema.safeParse(info), "safeValidateSessionInfo");
478
+ var safeValidateFrutiLink = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((frutiLink) => frutiLinkSchema2.safeParse(frutiLink), "safeValidateFrutiLink");
479
+
480
+ exports.authenticateConnectionPayloadSchema = authenticateConnectionPayloadSchema;
481
+ exports.authenticationDataSchema = authenticationDataSchema;
482
+ exports.bananaLinkErrorSchema = bananaLinkErrorSchema;
483
+ exports.base64Schema = base64Schema;
484
+ exports.claimSessionPayloadSchema = claimSessionPayloadSchema;
485
+ exports.clientMessageEnvelopeSchema = clientMessageEnvelopeSchema;
486
+ exports.clientMessagePayloadSchema = clientMessagePayloadSchema;
487
+ exports.clientReconnectPayloadSchema = clientReconnectPayloadSchema;
488
+ exports.clientSessionClaimSchema = clientSessionClaimSchema;
489
+ exports.closeSessionPayloadSchema = closeSessionPayloadSchema;
490
+ exports.connectionAuthenticatedMessageSchema = connectionAuthenticatedMessageSchema;
491
+ exports.connectionRejectedMessageSchema = connectionRejectedMessageSchema;
492
+ exports.connectionRejectedPayloadSchema = connectionRejectedPayloadSchema;
493
+ exports.createSessionRequestSchema = createSessionRequestSchema;
494
+ exports.createSessionResponseSchema = createSessionResponseSchema;
495
+ exports.dAppMetadataSchema = dAppMetadataSchema;
496
+ exports.dAppMetadataSchema2 = dAppMetadataSchema2;
497
+ exports.displayInfoSchema = displayInfoSchema2;
498
+ exports.encryptedPayloadSchema = encryptedPayloadSchema2;
499
+ exports.errorCodeSchema = errorCodeSchema;
500
+ exports.frutiLinkSchema = frutiLinkSchema2;
501
+ exports.originProofSchema = originProofSchema;
502
+ exports.prefetchMetadataPayloadSchema = prefetchMetadataPayloadSchema;
503
+ exports.prefetchMetadataResponseSchema = prefetchMetadataResponseSchema;
504
+ exports.publicKeySchema = publicKeySchema2;
505
+ exports.qrPayloadSchema = qrPayloadSchema2;
506
+ exports.reconnectedMessageSchema = reconnectedMessageSchema;
507
+ exports.rejectionDataSchema = rejectionDataSchema;
508
+ exports.relayMessageSchema = relayMessageSchema2;
509
+ exports.relayMessageTypeSchema = relayMessageTypeSchema2;
510
+ exports.relayNotificationMessageSchema = relayNotificationMessageSchema;
511
+ exports.relayToDAppMessageSchema = relayToDAppMessageSchema;
512
+ exports.safeValidateClientMessage = safeValidateClientMessage;
513
+ exports.safeValidateClientSessionClaim = safeValidateClientSessionClaim;
514
+ exports.safeValidateFrutiLink = safeValidateFrutiLink;
515
+ exports.safeValidateQRPayload = safeValidateQRPayload;
516
+ exports.safeValidateRelayMessage = safeValidateRelayMessage;
517
+ exports.safeValidateRelayNotificationMessage = safeValidateRelayNotificationMessage;
518
+ exports.safeValidateRelayToDAppMessage = safeValidateRelayToDAppMessage;
519
+ exports.safeValidateSessionInfo = safeValidateSessionInfo;
520
+ exports.safeValidateWalletMessage = safeValidateWalletMessage;
521
+ exports.safeValidateWalletSessionClaim = safeValidateWalletSessionClaim;
522
+ exports.securityPolicySchema = securityPolicySchema;
523
+ exports.securityPolicySchema2 = securityPolicySchema2;
524
+ exports.sessionClosedAckSchema = sessionClosedAckSchema;
525
+ exports.sessionClosedNotificationSchema = sessionClosedNotificationSchema;
526
+ exports.sessionConfigSchema = sessionConfigSchema;
527
+ exports.sessionIdSchema = sessionIdSchema;
528
+ exports.sessionInfoSchema = sessionInfoSchema;
529
+ exports.sessionMetadataSchema = sessionMetadataSchema;
530
+ exports.sessionOptionsSchema = sessionOptionsSchema;
531
+ exports.sessionStateSchema = sessionStateSchema;
532
+ exports.siweFieldsSchema = siweFieldsSchema2;
533
+ exports.supportedChainIdSchema = supportedChainIdSchema;
534
+ exports.validateClientMessage = validateClientMessage;
535
+ exports.validateClientSessionClaim = validateClientSessionClaim;
536
+ exports.validateFrutiLink = validateFrutiLink;
537
+ exports.validateQRPayload = validateQRPayload;
538
+ exports.validateRelayMessage = validateRelayMessage;
539
+ exports.validateRelayNotificationMessage = validateRelayNotificationMessage;
540
+ exports.validateRelayToDAppMessage = validateRelayToDAppMessage;
541
+ exports.validateSessionInfo = validateSessionInfo;
542
+ exports.validateTimestamp = validateTimestamp;
543
+ exports.validateWalletMessage = validateWalletMessage;
544
+ exports.validateWalletSessionClaim = validateWalletSessionClaim;
545
+ exports.walletHandshakeMessageSchema = walletHandshakeMessageSchema;
546
+ exports.walletMessageEnvelopeSchema = walletMessageEnvelopeSchema;
547
+ exports.walletMessagePayloadSchema = walletMessagePayloadSchema;
548
+ exports.walletMetadataSchema = walletMetadataSchema;
549
+ exports.walletReconnectPayloadSchema = walletReconnectPayloadSchema;
550
+ exports.walletSessionClaimSchema = walletSessionClaimSchema;
551
+ //# sourceMappingURL=chunk-KNGZKGRS.cjs.map
552
+ //# sourceMappingURL=chunk-KNGZKGRS.cjs.map
@@ -0,0 +1 @@
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"]}