@opendatalabs/vana-sdk 0.1.0-alpha.d6bebb0 → 0.1.0-alpha.e2e45dd

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 (50) hide show
  1. package/README.md +43 -32
  2. package/dist/browser-cRpdLQ3-.d.ts +237 -0
  3. package/dist/browser.d.ts +1 -0
  4. package/dist/browser.js +294 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/chains.browser.cjs +2 -2
  7. package/dist/chains.browser.cjs.map +1 -1
  8. package/dist/chains.browser.js +2 -2
  9. package/dist/chains.browser.js.map +1 -1
  10. package/dist/chains.cjs +2 -2
  11. package/dist/chains.cjs.map +1 -1
  12. package/dist/chains.js +2 -2
  13. package/dist/chains.js.map +1 -1
  14. package/dist/chains.node.cjs +2 -2
  15. package/dist/chains.node.cjs.map +1 -1
  16. package/dist/chains.node.js +2 -2
  17. package/dist/chains.node.js.map +1 -1
  18. package/dist/index.browser.d.ts +8717 -5109
  19. package/dist/index.browser.js +17345 -12939
  20. package/dist/index.browser.js.map +1 -1
  21. package/dist/index.node.cjs +17440 -12982
  22. package/dist/index.node.cjs.map +1 -1
  23. package/dist/index.node.d.cts +8721 -5109
  24. package/dist/index.node.d.ts +8721 -5109
  25. package/dist/index.node.js +17392 -12936
  26. package/dist/index.node.js.map +1 -1
  27. package/dist/node-CkdgwBiv.d.cts +237 -0
  28. package/dist/node-CkdgwBiv.d.ts +237 -0
  29. package/dist/node.cjs +350 -0
  30. package/dist/node.cjs.map +1 -0
  31. package/dist/node.d.cts +1 -0
  32. package/dist/node.d.ts +1 -0
  33. package/dist/node.js +313 -0
  34. package/dist/node.js.map +1 -0
  35. package/dist/platform.browser.d.ts +3 -202
  36. package/dist/platform.browser.js +48 -1
  37. package/dist/platform.browser.js.map +1 -1
  38. package/dist/platform.cjs +76 -1
  39. package/dist/platform.cjs.map +1 -1
  40. package/dist/platform.d.cts +2 -1
  41. package/dist/platform.d.ts +2 -1
  42. package/dist/platform.js +76 -1
  43. package/dist/platform.js.map +1 -1
  44. package/dist/platform.node.cjs +76 -1
  45. package/dist/platform.node.cjs.map +1 -1
  46. package/dist/platform.node.d.cts +4 -202
  47. package/dist/platform.node.d.ts +4 -202
  48. package/dist/platform.node.js +76 -1
  49. package/dist/platform.node.js.map +1 -1
  50. package/package.json +2 -2
package/README.md CHANGED
@@ -116,11 +116,17 @@ const files = await vana.data.getUserFiles({
116
116
  owner: "0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36",
117
117
  });
118
118
 
119
- // Upload encrypted file
120
- const result = await vana.data.uploadEncryptedFile({
121
- data: encryptedBlob,
122
- schemaId: 123,
119
+ // Upload encrypted file with decryption permissions
120
+ const result = await vana.data.upload({
121
+ content: "Sensitive user data",
123
122
  filename: "user-data.json",
123
+ schemaId: 123,
124
+ permissions: [
125
+ {
126
+ account: "0xServerAddress...", // Who can decrypt
127
+ publicKey: "0x04ServerKey...", // Their public key
128
+ },
129
+ ],
124
130
  });
125
131
  ```
126
132
 
@@ -220,43 +226,42 @@ try {
220
226
 
221
227
  ## Examples
222
228
 
223
- ### Complete Permission Flow
229
+ ### Complete Data Sharing Flow
224
230
 
225
231
  ```typescript
226
- import {
227
- Vana,
228
- generateEncryptionKey,
229
- encryptBlobWithSignedKey,
230
- } from "@opendatalabs/vana-sdk/browser";
232
+ import { Vana } from "@opendatalabs/vana-sdk/browser";
231
233
  // OR for server-side applications
232
234
  // } from "@opendatalabs/vana-sdk/node";
233
235
 
234
- async function grantDataPermission() {
236
+ async function shareDataWithServer() {
235
237
  const vana = Vana({ walletClient });
236
238
 
237
- // 1. Encrypt user data
238
- const encryptionKey = await generateEncryptionKey(walletClient);
239
- const userData = new Blob([JSON.stringify({ data: "sensitive info" })]);
240
- const encryptedData = await encryptBlobWithSignedKey(userData, encryptionKey);
241
-
242
- // 2. Upload encrypted file
243
- const uploadResult = await vana.data.uploadEncryptedFile({
244
- data: encryptedData,
239
+ // Step 1: Upload encrypted file with decryption permissions
240
+ const uploadResult = await vana.data.upload({
241
+ content: { data: "sensitive medical records" },
242
+ filename: "health-data.json",
245
243
  schemaId: 123,
246
- filename: "user-data.json",
244
+ permissions: [
245
+ {
246
+ // Grant decryption access to the AI server
247
+ account: "0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36",
248
+ publicKey: "0x04abc...", // Server's public key for encryption
249
+ },
250
+ ],
247
251
  });
248
252
 
249
- // 3. Grant permission
250
- const permissionTx = await vana.permissions.grant({
253
+ // Step 2: Grant operation permissions for what the server can do
254
+ const permissionResult = await vana.permissions.grant({
251
255
  grantee: "0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36",
252
- operation: "ai_training",
256
+ fileIds: [BigInt(uploadResult.fileId)],
257
+ operation: "medical_analysis",
253
258
  parameters: {
254
- files: [uploadResult.fileId],
255
- model: "llm-v1",
259
+ model: "medical-ai-v2",
260
+ analysisType: "comprehensive",
256
261
  },
257
262
  });
258
263
 
259
- return permissionTx;
264
+ return { uploadResult, permissionResult };
260
265
  }
261
266
  ```
262
267
 
@@ -294,13 +299,14 @@ vana.data.validateDataAgainstSchema(userData, schema);
294
299
  ### Permissions
295
300
 
296
301
  ```typescript
297
- // Grant permission
302
+ // Grant operation permission
298
303
  await vana.permissions.grant({
299
304
  grantee: Address,
305
+ fileIds: bigint[],
300
306
  operation: string,
301
307
  parameters: object,
302
308
  expiresAt?: number
303
- }): Promise<Hash>
309
+ }): Promise<PermissionGrantResult>
304
310
 
305
311
  // Revoke permission
306
312
  await vana.permissions.revoke({
@@ -321,11 +327,16 @@ await vana.data.getUserFiles({
321
327
  owner: Address
322
328
  }): Promise<UserFile[]>
323
329
 
324
- // Upload encrypted file
325
- await vana.data.uploadEncryptedFile({
326
- data: Blob,
330
+ // Upload data with automatic encryption
331
+ await vana.data.upload({
332
+ content: string | Blob | Buffer,
333
+ filename?: string,
327
334
  schemaId?: number,
328
- filename?: string
335
+ permissions?: Array<{
336
+ account: Address, // Who can decrypt
337
+ publicKey: string // Their public key
338
+ }>,
339
+ encrypt?: boolean // Default: true
329
340
  }): Promise<UploadResult>
330
341
 
331
342
  // Validate schema
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Platform Adapter interface for environment-specific implementations
3
+ *
4
+ * This interface abstracts all environment-specific dependencies to ensure
5
+ * the SDK works seamlessly across Node.js and browser/SSR environments.
6
+ *
7
+ * **Implementation Context:**
8
+ * - Node.js: Uses native crypto modules and full OpenPGP support
9
+ * - Browser: Uses Web Crypto API and browser-compatible libraries
10
+ * - SSR: Automatically selects appropriate implementation based on runtime
11
+ *
12
+ * **Usage Notes:**
13
+ * Platform adapters are automatically selected by the SDK. Direct usage is only
14
+ * needed for custom implementations or testing.
15
+ */
16
+ /**
17
+ * Platform type identifier
18
+ */
19
+ type PlatformType = "node" | "browser";
20
+ /**
21
+ * Encryption operations that require different implementations per platform
22
+ */
23
+ interface VanaCryptoAdapter {
24
+ /**
25
+ * Encrypt data with a public key using asymmetric cryptography
26
+ *
27
+ * **Usage Context:**
28
+ * - Used internally for file encryption before storage
29
+ * - Public key format: Armored PGP public key string
30
+ * - Returns base64-encoded encrypted data
31
+ *
32
+ * @param data The data to encrypt
33
+ * @param publicKey The public key for encryption
34
+ * @returns Promise resolving to encrypted data
35
+ */
36
+ encryptWithPublicKey(data: string, publicKey: string): Promise<string>;
37
+ /**
38
+ * Decrypt data with a private key using asymmetric cryptography
39
+ *
40
+ * @param encryptedData The encrypted data
41
+ * @param privateKey The private key for decryption
42
+ * @returns Promise resolving to decrypted data
43
+ */
44
+ decryptWithPrivateKey(encryptedData: string, privateKey: string): Promise<string>;
45
+ /**
46
+ * Generate a new key pair for asymmetric cryptography
47
+ *
48
+ * @returns Promise resolving to public and private key pair
49
+ */
50
+ generateKeyPair(): Promise<{
51
+ publicKey: string;
52
+ privateKey: string;
53
+ }>;
54
+ /**
55
+ * Encrypt data with a wallet's public key using ECDH cryptography
56
+ * Uses platform-appropriate ECDH implementation (eccrypto vs eccrypto-js)
57
+ *
58
+ * **Usage Context:**
59
+ * - Used for sharing encryption keys with permission recipients
60
+ * - Public key format: Compressed or uncompressed secp256k1 hex string
61
+ * - Compatible with Ethereum wallet public keys
62
+ *
63
+ * @param data The data to encrypt (string)
64
+ * @param publicKey The wallet's public key (secp256k1)
65
+ * @returns Promise resolving to encrypted data as hex string
66
+ */
67
+ encryptWithWalletPublicKey(data: string, publicKey: string): Promise<string>;
68
+ /**
69
+ * Decrypt data with a wallet's private key using ECDH cryptography
70
+ * Uses platform-appropriate ECDH implementation (eccrypto vs eccrypto-js)
71
+ *
72
+ * @param encryptedData The encrypted data as hex string
73
+ * @param privateKey The wallet's private key (secp256k1)
74
+ * @returns Promise resolving to decrypted data as string
75
+ */
76
+ decryptWithWalletPrivateKey(encryptedData: string, privateKey: string): Promise<string>;
77
+ /**
78
+ * Encrypt data with a password using PGP password-based encryption
79
+ * Uses platform-appropriate OpenPGP implementation with consistent format
80
+ *
81
+ * @param data The data to encrypt as Uint8Array
82
+ * @param password The password for encryption (typically wallet signature)
83
+ * @returns Promise resolving to encrypted data as Uint8Array
84
+ */
85
+ encryptWithPassword(data: Uint8Array, password: string): Promise<Uint8Array>;
86
+ /**
87
+ * Decrypt data with a password using PGP password-based decryption
88
+ * Uses platform-appropriate OpenPGP implementation with consistent format
89
+ *
90
+ * @param encryptedData The encrypted data as Uint8Array
91
+ * @param password The password for decryption (typically wallet signature)
92
+ * @returns Promise resolving to decrypted data as Uint8Array
93
+ */
94
+ decryptWithPassword(encryptedData: Uint8Array, password: string): Promise<Uint8Array>;
95
+ }
96
+ /**
97
+ * PGP operations that require different configurations per platform
98
+ */
99
+ interface VanaPGPAdapter {
100
+ /**
101
+ * Encrypt data using PGP with proper platform configuration
102
+ *
103
+ * @param data The data to encrypt
104
+ * @param publicKey The PGP public key
105
+ * @returns Promise resolving to encrypted data
106
+ */
107
+ encrypt(data: string, publicKey: string): Promise<string>;
108
+ /**
109
+ * Decrypt data using PGP with proper platform configuration
110
+ *
111
+ * @param encryptedData The encrypted data
112
+ * @param privateKey The PGP private key
113
+ * @returns Promise resolving to decrypted data
114
+ */
115
+ decrypt(encryptedData: string, privateKey: string): Promise<string>;
116
+ /**
117
+ * Generate a new PGP key pair with platform-appropriate configuration
118
+ *
119
+ * @param options - Key generation options
120
+ * @param options.name - The name for the PGP key
121
+ * @param options.email - The email for the PGP key
122
+ * @param options.passphrase - Optional passphrase to protect the private key
123
+ * @returns Promise resolving to public and private key pair
124
+ */
125
+ generateKeyPair(options?: {
126
+ name?: string;
127
+ email?: string;
128
+ passphrase?: string;
129
+ }): Promise<{
130
+ publicKey: string;
131
+ privateKey: string;
132
+ }>;
133
+ }
134
+ /**
135
+ * HTTP operations that need consistent API across platforms
136
+ */
137
+ interface VanaHttpAdapter {
138
+ /**
139
+ * Perform HTTP request with platform-appropriate fetch implementation
140
+ *
141
+ * @param url The URL to request
142
+ * @param options Request options
143
+ * @returns Promise resolving to response
144
+ */
145
+ fetch(url: string, options?: RequestInit): Promise<Response>;
146
+ }
147
+ /**
148
+ * Simple cache operations that work across platforms
149
+ */
150
+ interface VanaCacheAdapter {
151
+ /**
152
+ * Get a value from the cache
153
+ *
154
+ * @param key The cache key
155
+ * @returns The cached value or null if not found/expired
156
+ */
157
+ get(key: string): string | null;
158
+ /**
159
+ * Set a value in the cache
160
+ *
161
+ * @param key The cache key
162
+ * @param value The value to cache
163
+ */
164
+ set(key: string, value: string): void;
165
+ /**
166
+ * Delete a value from the cache
167
+ *
168
+ * @param key The cache key
169
+ */
170
+ delete(key: string): void;
171
+ /**
172
+ * Clear all values from the cache
173
+ */
174
+ clear(): void;
175
+ }
176
+ /**
177
+ * Main platform adapter interface that combines all platform-specific functionality
178
+ *
179
+ * **Implementation Guidelines:**
180
+ * 1. All methods must maintain consistent behavior across platforms
181
+ * 2. Error types and messages should be unified
182
+ * 3. Data formats (encoding, serialization) must be identical
183
+ * 4. Performance characteristics can vary but API must be consistent
184
+ *
185
+ * **Custom Implementation Example:**
186
+ * ```typescript
187
+ * class CustomPlatformAdapter implements VanaPlatformAdapter {
188
+ * crypto = new CustomCryptoAdapter();
189
+ * pgp = new CustomPGPAdapter();
190
+ * http = new CustomHttpAdapter();
191
+ * platform = 'browser' as const;
192
+ * }
193
+ * ```
194
+ */
195
+ interface VanaPlatformAdapter {
196
+ /**
197
+ * Crypto operations adapter
198
+ */
199
+ crypto: VanaCryptoAdapter;
200
+ /**
201
+ * PGP operations adapter
202
+ */
203
+ pgp: VanaPGPAdapter;
204
+ /**
205
+ * HTTP operations adapter
206
+ */
207
+ http: VanaHttpAdapter;
208
+ /**
209
+ * Cache operations adapter
210
+ */
211
+ cache: VanaCacheAdapter;
212
+ /**
213
+ * Platform identifier for debugging/telemetry
214
+ */
215
+ readonly platform: PlatformType;
216
+ }
217
+
218
+ /**
219
+ * Browser implementation of the Vana Platform Adapter
220
+ *
221
+ * This implementation uses browser-compatible libraries and configurations
222
+ * to provide crypto, PGP, and HTTP functionality without Node.js dependencies.
223
+ */
224
+
225
+ /**
226
+ * Complete browser platform adapter implementation
227
+ */
228
+ declare class BrowserPlatformAdapter implements VanaPlatformAdapter {
229
+ crypto: VanaCryptoAdapter;
230
+ pgp: VanaPGPAdapter;
231
+ http: VanaHttpAdapter;
232
+ cache: VanaCacheAdapter;
233
+ platform: "browser";
234
+ constructor();
235
+ }
236
+
237
+ export { BrowserPlatformAdapter as B, type PlatformType as P, type VanaPlatformAdapter as V };
@@ -0,0 +1 @@
1
+ export { B as BrowserPlatformAdapter } from './browser-cRpdLQ3-.js';
@@ -0,0 +1,294 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+
5
+ // src/platform/browser.ts
6
+ import * as openpgp from "openpgp";
7
+
8
+ // src/platform/shared/crypto-utils.ts
9
+ function processWalletPublicKey(publicKey) {
10
+ const publicKeyHex = publicKey.startsWith("0x") ? publicKey.slice(2) : publicKey;
11
+ const publicKeyBytes = Buffer.from(publicKeyHex, "hex");
12
+ return publicKeyBytes.length === 64 ? Buffer.concat([Buffer.from([4]), publicKeyBytes]) : publicKeyBytes;
13
+ }
14
+ function processWalletPrivateKey(privateKey) {
15
+ const privateKeyHex = privateKey.startsWith("0x") ? privateKey.slice(2) : privateKey;
16
+ return Buffer.from(privateKeyHex, "hex");
17
+ }
18
+ function parseEncryptedDataBuffer(encryptedBuffer) {
19
+ return {
20
+ iv: encryptedBuffer.slice(0, 16),
21
+ ephemPublicKey: encryptedBuffer.slice(16, 81),
22
+ // 65 bytes for uncompressed public key
23
+ ciphertext: encryptedBuffer.slice(81, -32),
24
+ mac: encryptedBuffer.slice(-32)
25
+ };
26
+ }
27
+
28
+ // src/platform/shared/pgp-utils.ts
29
+ var STANDARD_PGP_CONFIG = {
30
+ preferredCompressionAlgorithm: 2,
31
+ // zlib (openpgp.enums.compression.zlib)
32
+ preferredSymmetricAlgorithm: 7
33
+ // aes256 (openpgp.enums.symmetric.aes256)
34
+ };
35
+ function processPGPKeyOptions(options) {
36
+ return {
37
+ name: options?.name || "Vana User",
38
+ email: options?.email || "user@vana.org",
39
+ passphrase: options?.passphrase
40
+ };
41
+ }
42
+ function getPGPKeyGenParams(options) {
43
+ const { name, email, passphrase } = processPGPKeyOptions(options);
44
+ return {
45
+ type: "rsa",
46
+ rsaBits: 2048,
47
+ userIDs: [{ name, email }],
48
+ passphrase,
49
+ config: STANDARD_PGP_CONFIG
50
+ };
51
+ }
52
+
53
+ // src/platform/shared/error-utils.ts
54
+ function wrapCryptoError(operation, error) {
55
+ const message = error instanceof Error ? error.message : "Unknown error";
56
+ return new Error(`${operation} failed: ${message}`);
57
+ }
58
+
59
+ // src/platform/browser.ts
60
+ var BrowserCryptoAdapter = class {
61
+ async encryptWithPublicKey(data, publicKeyHex) {
62
+ try {
63
+ const eccrypto = await import("eccrypto-js");
64
+ const publicKeyBuffer = Buffer.from(publicKeyHex, "hex");
65
+ const encrypted = await eccrypto.encrypt(
66
+ publicKeyBuffer,
67
+ Buffer.from(data, "utf8")
68
+ );
69
+ const result = Buffer.concat([
70
+ encrypted.iv,
71
+ encrypted.ephemPublicKey,
72
+ encrypted.ciphertext,
73
+ encrypted.mac
74
+ ]);
75
+ return result.toString("hex");
76
+ } catch (error) {
77
+ throw new Error(`Encryption failed: ${error}`);
78
+ }
79
+ }
80
+ async decryptWithPrivateKey(encryptedData, privateKeyHex) {
81
+ try {
82
+ const eccrypto = await import("eccrypto-js");
83
+ const privateKeyBuffer = processWalletPrivateKey(privateKeyHex);
84
+ const encryptedBuffer = Buffer.from(encryptedData, "hex");
85
+ const { iv, ephemPublicKey, ciphertext, mac } = parseEncryptedDataBuffer(encryptedBuffer);
86
+ const encryptedObj = { iv, ephemPublicKey, ciphertext, mac };
87
+ const decryptedBuffer = await eccrypto.decrypt(
88
+ privateKeyBuffer,
89
+ encryptedObj
90
+ );
91
+ return decryptedBuffer.toString("utf8");
92
+ } catch (error) {
93
+ throw new Error(`Decryption failed: ${error}`);
94
+ }
95
+ }
96
+ async generateKeyPair() {
97
+ try {
98
+ const eccrypto = await import("eccrypto-js");
99
+ const privateKeyBytes = new Uint8Array(32);
100
+ crypto.getRandomValues(privateKeyBytes);
101
+ const privateKey = Buffer.from(privateKeyBytes);
102
+ const publicKey = eccrypto.getPublicCompressed(privateKey);
103
+ return {
104
+ privateKey: privateKey.toString("hex"),
105
+ publicKey: publicKey.toString("hex")
106
+ };
107
+ } catch (error) {
108
+ throw wrapCryptoError("key generation", error);
109
+ }
110
+ }
111
+ async encryptWithWalletPublicKey(data, publicKey) {
112
+ try {
113
+ const eccrypto = await import("eccrypto-js");
114
+ const uncompressedKey = processWalletPublicKey(publicKey);
115
+ const encryptedBuffer = await eccrypto.encrypt(
116
+ uncompressedKey,
117
+ Buffer.from(data)
118
+ );
119
+ const result = Buffer.concat([
120
+ encryptedBuffer.iv,
121
+ encryptedBuffer.ephemPublicKey,
122
+ encryptedBuffer.ciphertext,
123
+ encryptedBuffer.mac
124
+ ]);
125
+ return result.toString("hex");
126
+ } catch (error) {
127
+ throw wrapCryptoError("encrypt with wallet public key", error);
128
+ }
129
+ }
130
+ async decryptWithWalletPrivateKey(encryptedData, privateKey) {
131
+ try {
132
+ const eccrypto = await import("eccrypto-js");
133
+ const privateKeyBuffer = processWalletPrivateKey(privateKey);
134
+ const encryptedBuffer = Buffer.from(encryptedData, "hex");
135
+ const { iv, ephemPublicKey, ciphertext, mac } = parseEncryptedDataBuffer(encryptedBuffer);
136
+ const encryptedObj = { iv, ephemPublicKey, ciphertext, mac };
137
+ const decryptedBuffer = await eccrypto.decrypt(
138
+ privateKeyBuffer,
139
+ encryptedObj
140
+ );
141
+ return decryptedBuffer.toString("utf8");
142
+ } catch (error) {
143
+ throw wrapCryptoError("decrypt with wallet private key", error);
144
+ }
145
+ }
146
+ async encryptWithPassword(data, password) {
147
+ try {
148
+ const openpgp2 = await import("openpgp");
149
+ const message = await openpgp2.createMessage({
150
+ binary: data
151
+ });
152
+ const encrypted = await openpgp2.encrypt({
153
+ message,
154
+ passwords: [password],
155
+ format: "binary"
156
+ });
157
+ const response = new Response(encrypted);
158
+ const arrayBuffer = await response.arrayBuffer();
159
+ return new Uint8Array(arrayBuffer);
160
+ } catch (error) {
161
+ throw new Error(`Failed to encrypt with password: ${error}`);
162
+ }
163
+ }
164
+ async decryptWithPassword(encryptedData, password) {
165
+ try {
166
+ const openpgp2 = await import("openpgp");
167
+ const message = await openpgp2.readMessage({
168
+ binaryMessage: encryptedData
169
+ });
170
+ const { data: decrypted } = await openpgp2.decrypt({
171
+ message,
172
+ passwords: [password],
173
+ format: "binary"
174
+ });
175
+ return new Uint8Array(decrypted);
176
+ } catch (error) {
177
+ throw new Error(`Failed to decrypt with password: ${error}`);
178
+ }
179
+ }
180
+ };
181
+ var BrowserPGPAdapter = class {
182
+ async encrypt(data, publicKeyArmored) {
183
+ try {
184
+ const publicKey = await openpgp.readKey({ armoredKey: publicKeyArmored });
185
+ const encrypted = await openpgp.encrypt({
186
+ message: await openpgp.createMessage({ text: data }),
187
+ encryptionKeys: publicKey,
188
+ config: {
189
+ preferredCompressionAlgorithm: openpgp.enums.compression.zlib
190
+ }
191
+ });
192
+ return encrypted;
193
+ } catch (error) {
194
+ throw new Error(`PGP encryption failed: ${error}`);
195
+ }
196
+ }
197
+ async decrypt(encryptedData, privateKeyArmored) {
198
+ try {
199
+ const privateKey = await openpgp.readPrivateKey({
200
+ armoredKey: privateKeyArmored
201
+ });
202
+ const message = await openpgp.readMessage({
203
+ armoredMessage: encryptedData
204
+ });
205
+ const { data: decrypted } = await openpgp.decrypt({
206
+ message,
207
+ decryptionKeys: privateKey
208
+ });
209
+ return decrypted;
210
+ } catch (error) {
211
+ throw new Error(`PGP decryption failed: ${error}`);
212
+ }
213
+ }
214
+ async generateKeyPair(options) {
215
+ try {
216
+ const keyGenParams = getPGPKeyGenParams(options);
217
+ const { privateKey, publicKey } = await openpgp.generateKey(keyGenParams);
218
+ return { publicKey, privateKey };
219
+ } catch (error) {
220
+ throw wrapCryptoError("PGP key generation", error);
221
+ }
222
+ }
223
+ };
224
+ var BrowserHttpAdapter = class {
225
+ async fetch(url, options) {
226
+ if (typeof fetch === "undefined") {
227
+ throw new Error("Fetch API not available in this browser environment");
228
+ }
229
+ return fetch(url, options);
230
+ }
231
+ };
232
+ var BrowserCacheAdapter = class {
233
+ constructor() {
234
+ __publicField(this, "prefix", "vana_cache_");
235
+ }
236
+ get(key) {
237
+ try {
238
+ if (typeof sessionStorage === "undefined") {
239
+ return null;
240
+ }
241
+ return sessionStorage.getItem(this.prefix + key);
242
+ } catch {
243
+ return null;
244
+ }
245
+ }
246
+ set(key, value) {
247
+ try {
248
+ if (typeof sessionStorage !== "undefined") {
249
+ sessionStorage.setItem(this.prefix + key, value);
250
+ }
251
+ } catch {
252
+ }
253
+ }
254
+ delete(key) {
255
+ try {
256
+ if (typeof sessionStorage !== "undefined") {
257
+ sessionStorage.removeItem(this.prefix + key);
258
+ }
259
+ } catch {
260
+ }
261
+ }
262
+ clear() {
263
+ try {
264
+ if (typeof sessionStorage === "undefined") {
265
+ return;
266
+ }
267
+ const keys = Object.keys(sessionStorage);
268
+ for (const key of keys) {
269
+ if (key.startsWith(this.prefix)) {
270
+ sessionStorage.removeItem(key);
271
+ }
272
+ }
273
+ } catch {
274
+ }
275
+ }
276
+ };
277
+ var BrowserPlatformAdapter = class {
278
+ constructor() {
279
+ __publicField(this, "crypto");
280
+ __publicField(this, "pgp");
281
+ __publicField(this, "http");
282
+ __publicField(this, "cache");
283
+ __publicField(this, "platform", "browser");
284
+ this.crypto = new BrowserCryptoAdapter();
285
+ this.pgp = new BrowserPGPAdapter();
286
+ this.http = new BrowserHttpAdapter();
287
+ this.cache = new BrowserCacheAdapter();
288
+ }
289
+ };
290
+ var browserPlatformAdapter = new BrowserPlatformAdapter();
291
+ export {
292
+ BrowserPlatformAdapter
293
+ };
294
+ //# sourceMappingURL=browser.js.map