dop-wallet-v6 1.3.0 → 1.3.1

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.
@@ -22,6 +22,8 @@ export declare class ReactNativeLevelDB {
22
22
  iterator(options?: any): any;
23
23
  private _schedulePersistence;
24
24
  private _persistData;
25
+ private _cleanupExtraChunks;
26
+ private _cleanupAllChunks;
25
27
  private _cleanupOldChunks;
26
28
  }
27
29
  /**
@@ -358,7 +358,10 @@ class ReactNativeLevelDB {
358
358
  this.persistTimeout = setTimeout(() => {
359
359
  if (this.isDirty) {
360
360
  this.isDirty = false;
361
- void this._persistData().catch(console.warn);
361
+ void this._persistData().catch((error) => {
362
+ console.error('⚠️ Scheduled persistence failed:', error?.message || error);
363
+ // Don't log full stack trace to avoid cluttering console
364
+ });
362
365
  }
363
366
  }, 30000); // Increased from 5s to 30s
364
367
  }
@@ -413,8 +416,6 @@ class ReactNativeLevelDB {
413
416
  }
414
417
  const serializeTime = Date.now() - startTime;
415
418
  const dataSizeMB = jsonData.length / 1024 / 1024;
416
- // Clean up old chunks before writing new data
417
- await this._cleanupOldChunks();
418
419
  // React Native AsyncStorage has a 6MB per-item limit and total quota limits
419
420
  // Use 500KB chunks to stay well within limits and avoid SQLITE_FULL errors
420
421
  const chunkSize = 512 * 1024; // 500KB chunks (conservative for Android)
@@ -436,40 +437,95 @@ class ReactNativeLevelDB {
436
437
  await this.AsyncStorage.setItem(`${this.storageKey}_chunk_${i}`, chunks[i]);
437
438
  }
438
439
  catch (chunkError) {
439
- // If we hit storage quota, clean up and throw
440
+ // If we hit storage quota, clean up partial writes and throw
440
441
  console.error(`❌ Failed to write chunk ${i}/${chunks.length}:`, chunkError);
441
442
  if (chunkError?.message?.includes('full') || chunkError?.code === 13) {
442
443
  console.error('💥 Storage quota exceeded! Cleaning up partial writes...');
443
- await this._cleanupOldChunks();
444
+ // Only clean up the chunks we just tried to write
445
+ for (let j = 0; j <= i; j += 1) {
446
+ await this.AsyncStorage.removeItem(`${this.storageKey}_chunk_${j}`).catch(() => { });
447
+ }
444
448
  throw new Error('AsyncStorage quota exceeded. Please clear app data or restart the app.');
445
449
  }
446
450
  throw chunkError;
447
451
  }
448
452
  }
453
+ // Clean up any extra chunks from previous saves (if we had more chunks before)
454
+ await this._cleanupExtraChunks(chunks.length);
449
455
  // Only update chunk count after all chunks are written successfully
450
456
  await this.AsyncStorage.setItem(`${this.storageKey}_chunks`, chunks.length.toString());
457
+ // Remove direct storage if it exists (migrating from direct to chunked)
458
+ await this.AsyncStorage.removeItem(this.storageKey).catch(() => { });
451
459
  const totalTime = Date.now() - startTime;
452
460
  console.log(`✅ Persisted ${entryCount} entries (${dataSizeMB.toFixed(2)}MB in ${chunks.length} chunks) in ${totalTime}ms (serialize: ${serializeTime}ms)`);
453
461
  }
454
462
  else {
455
463
  // Small data, store directly
456
464
  await this.AsyncStorage.setItem(this.storageKey, jsonData);
465
+ // Clean up chunked storage if it exists (migrating from chunked to direct)
466
+ await this._cleanupAllChunks();
457
467
  const totalTime = Date.now() - startTime;
458
468
  console.log(`✅ Persisted ${entryCount} entries (${(jsonData.length / 1024).toFixed(2)}KB) in ${totalTime}ms (serialize: ${serializeTime}ms)`);
459
469
  }
460
470
  }
461
471
  catch (error) {
462
472
  console.error('❌ Failed to persist data to AsyncStorage:', error);
473
+ console.error('Error details:', {
474
+ message: error?.message,
475
+ code: error?.code,
476
+ stack: error?.stack?.split('\n')[0]
477
+ });
463
478
  // If quota exceeded, clear everything to recover
464
479
  if (error?.message?.includes('quota') || error?.message?.includes('full')) {
465
480
  console.error('💥 Storage full! Clearing all AsyncStorage data for recovery...');
466
- await this._cleanupOldChunks();
481
+ await this._cleanupAllChunks();
482
+ }
483
+ // Don't mark as dirty - if persistence fails, we don't want to retry infinitely
484
+ // The data is still in memory (memdown) so the app can continue working
485
+ // this.isDirty = true;
486
+ // Don't throw - this allows the app to continue even if persistence fails
487
+ // throw error;
488
+ }
489
+ }
490
+ async _cleanupExtraChunks(keepChunkCount) {
491
+ if (!this.AsyncStorage)
492
+ return;
493
+ try {
494
+ // Remove chunks beyond the new count (cleanup old data)
495
+ for (let i = keepChunkCount; i < 200; i += 1) {
496
+ const chunkKey = `${this.storageKey}_chunk_${i}`;
497
+ const exists = await this.AsyncStorage.getItem(chunkKey);
498
+ if (!exists) {
499
+ break; // No more chunks to clean
500
+ }
501
+ await this.AsyncStorage.removeItem(chunkKey);
467
502
  }
468
- // Mark as dirty again so we retry on next schedule
469
- this.isDirty = true;
470
- throw error;
503
+ }
504
+ catch (cleanupError) {
505
+ console.warn('⚠️ Error during extra chunk cleanup:', cleanupError);
471
506
  }
472
507
  }
508
+ async _cleanupAllChunks() {
509
+ if (!this.AsyncStorage)
510
+ return;
511
+ try {
512
+ // Remove chunk metadata
513
+ await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);
514
+ // Remove all chunk entries (try up to 200 chunks)
515
+ for (let i = 0; i < 200; i += 1) {
516
+ const chunkKey = `${this.storageKey}_chunk_${i}`;
517
+ const exists = await this.AsyncStorage.getItem(chunkKey);
518
+ if (!exists) {
519
+ break; // No more chunks to clean
520
+ }
521
+ await this.AsyncStorage.removeItem(chunkKey);
522
+ }
523
+ }
524
+ catch (cleanupError) {
525
+ console.warn('⚠️ Error during chunk cleanup:', cleanupError);
526
+ }
527
+ }
528
+ // Keep old method for clearing persisted data (full cleanup)
473
529
  async _cleanupOldChunks() {
474
530
  if (!this.AsyncStorage)
475
531
  return;
@@ -481,18 +537,11 @@ class ReactNativeLevelDB {
481
537
  // Remove all chunk entries (try up to 200 chunks)
482
538
  for (let i = 0; i < 200; i += 1) {
483
539
  const chunkKey = `${this.storageKey}_chunk_${i}`;
484
- try {
485
- await this.AsyncStorage.removeItem(chunkKey);
486
- }
487
- catch {
488
- // Ignore errors, chunk may not exist
489
- break;
490
- }
540
+ await this.AsyncStorage.removeItem(chunkKey).catch(() => { });
491
541
  }
492
542
  }
493
543
  catch (cleanupError) {
494
- console.warn('⚠️ Error during chunk cleanup:', cleanupError);
495
- // Don't throw, continue with persistence
544
+ console.warn('⚠️ Error during full cleanup:', cleanupError);
496
545
  }
497
546
  }
498
547
  }
@@ -1 +1 @@
1
- {"version":3,"file":"react-native-init.js","sourceRoot":"","sources":["../../../../src/services/dop/core/react-native-init.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/strict-boolean-expressions */\n/* eslint-disable no-underscore-dangle */\n/* eslint-disable no-console */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n/* eslint-disable global-require */\n/* eslint-disable no-void */\nimport { ArtifactStore } from '../../artifacts/artifact-store';\nimport { startDopEngine } from './init';\n\n// Use memdown for React Native database - with error handling\nlet memdown: any;\ntry {\n memdown = require('memdown');\n} catch (error) {\n throw new Error(\n 'memdown dependency is required for React Native support. ' +\n 'Please install it with: npm install memdown@^6.1.1'\n );\n}\n\n/**\n * React Native compatible LevelDB implementation using memdown with AsyncStorage persistence.\n * This provides a persistent database solution that works reliably in React Native environments.\n */\nexport class ReactNativeLevelDB {\n private db: any;\n private storageKey: string;\n private AsyncStorage: any;\n private persistTimeout: ReturnType<typeof setTimeout> | null = null;\n private isDirty = false;\n\n constructor(name: string) {\n this.storageKey = `leveldb_${name}`;\n this.db = memdown();\n \n // Dynamically import AsyncStorage to avoid bundling issues\n try {\n // Try to require AsyncStorage - this will work in React Native\n this.AsyncStorage = require('@react-native-async-storage/async-storage').default;\n } catch (error) {\n // AsyncStorage not available - this is expected in Node.js test environment\n this.AsyncStorage = null;\n }\n }\n\n // Implement AbstractLevelDOWN interface\n async open(callbackOrOptions?: any, callback?: (error?: Error) => void): Promise<void> {\n // Handle both open(callback) and open(options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof callbackOrOptions === 'function') {\n // open(callback) signature\n cb = callbackOrOptions;\n } else if (typeof callback === 'function') {\n // open(options, callback) signature\n cb = callback;\n } else {\n // No callback provided - this shouldn't happen in AbstractLevelDOWN\n throw new Error('No callback provided to open method');\n }\n\n try {\n // Load persisted data from AsyncStorage (only if available)\n if (this.AsyncStorage) {\n try {\n let persistedData: string | null = null;\n \n // Check if data is stored in chunks\n const chunksCount = await this.AsyncStorage.getItem(`${this.storageKey}_chunks`);\n \n if (chunksCount) {\n console.log(`📦 Loading database from ${String(chunksCount)} chunks...`);\n // Reassemble from chunks\n const chunks: string[] = [];\n const count = parseInt(chunksCount, 10);\n \n if (Number.isNaN(count) || count < 0 || count > 1000) {\n throw new Error(`Invalid chunk count: ${String(chunksCount)}`);\n }\n \n for (let i = 0; i < count; i += 1) {\n const chunk = await this.AsyncStorage.getItem(`${this.storageKey}_chunk_${i}`);\n if (chunk) {\n chunks.push(chunk);\n } else {\n console.warn(`⚠️ Missing chunk ${i} of ${count}, data may be incomplete`);\n }\n }\n \n if (chunks.length === 0) {\n throw new Error('No chunks found, but chunk count was set');\n }\n \n persistedData = chunks.join('');\n console.log(`📦 Reassembled ${chunks.length}/${count} chunks (${(persistedData.length / 1024 / 1024).toFixed(2)}MB)`);\n } else {\n // Try to get data directly\n persistedData = await this.AsyncStorage.getItem(this.storageKey);\n if (persistedData) {\n console.log(`📦 Loading database directly (${(persistedData.length / 1024).toFixed(2)}KB)`);\n }\n }\n \n if (persistedData) {\n // Validate JSON before parsing\n if (!persistedData.trim().startsWith('{') || !persistedData.trim().endsWith('}')) {\n throw new Error('Persisted data does not look like valid JSON (missing braces)');\n }\n \n let data: Record<string, any>;\n try {\n data = JSON.parse(persistedData);\n } catch (jsonError) {\n throw new Error(`JSON parse failed: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`);\n }\n \n // Restore data to memdown instance\n const keys = Object.keys(data);\n console.log(`📦 Restoring ${keys.length} entries to database...`);\n \n for (const [key, value] of Object.entries(data)) {\n await new Promise<void>((resolve, reject) => {\n // Restore Buffer/Uint8Array types from base64 with type marker\n let restoredValue = value;\n if (value && typeof value === 'object' && '__type' in value) {\n const typedValue = value as { __type: string; data: string };\n if (typedValue.__type === 'Buffer' && typeof typedValue.data === 'string') {\n restoredValue = Buffer.from(typedValue.data, 'base64');\n } else if (typedValue.__type === 'Uint8Array' && typeof typedValue.data === 'string') {\n restoredValue = new Uint8Array(Buffer.from(typedValue.data, 'base64'));\n }\n }\n \n this.db.put(key, restoredValue, (err: any) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n console.log('✅ Successfully restored database from AsyncStorage');\n } else {\n console.log('ℹ️ No persisted data found, starting with empty database');\n }\n } catch (asyncStorageError) {\n console.error('❌ Failed to load from AsyncStorage, clearing corrupted data and starting fresh:', asyncStorageError);\n \n // Clear corrupted data\n try {\n await this.AsyncStorage.removeItem(this.storageKey);\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Try to remove chunks (up to 100 chunks max)\n for (let i = 0; i < 100; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (exists) {\n await this.AsyncStorage.removeItem(chunkKey);\n } else {\n break; // No more chunks\n }\n }\n console.log('🧹 Cleared corrupted AsyncStorage data');\n } catch (clearError) {\n console.warn('⚠️ Failed to clear corrupted data:', clearError);\n }\n }\n }\n \n // Open the memdown database\n this.db.open(cb);\n } catch (error) {\n cb(error as Error);\n }\n }\n\n close(callback: (error?: Error) => void): void {\n // Clear pending persistence timeout\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n this.persistTimeout = null;\n }\n \n // Force immediate persistence before closing if dirty\n if (this.isDirty && this.AsyncStorage) {\n console.log('💾 Persisting database before close...');\n this.isDirty = false;\n this._persistData()\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .then(() => {\n console.log('✅ Database persisted, closing...');\n this.db.close(callback);\n })\n .catch((error) => {\n console.warn('⚠️ Failed to persist on close:', error);\n this.db.close(callback);\n });\n } else {\n this.db.close(callback);\n }\n }\n\n // Public method to force immediate persistence (useful after scan completes)\n async forcePersist(): Promise<void> {\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n this.persistTimeout = null;\n }\n if (this.isDirty && this.AsyncStorage) {\n this.isDirty = false;\n await this._persistData();\n }\n }\n\n // Public method to clear all persisted data (use when recovering from storage full errors)\n async clearPersistedData(): Promise<void> {\n console.log('🧹 Clearing all persisted database data from AsyncStorage...');\n await this._cleanupOldChunks();\n console.log('✅ Cleared all persisted data');\n }\n\n put(key: any, value: any, optionsOrCallback?: any, callback?: (error?: Error) => void): void {\n // Handle both put(key, value, callback) and put(key, value, options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // put(key, value, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // put(key, value, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to put method');\n }\n\n this.db.put(key, value, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n get(key: any, optionsOrCallback?: any, callback?: (error?: Error, value?: any) => void): void {\n // Handle both get(key, callback) and get(key, options, callback) signatures\n let cb: (error?: Error, value?: any) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // get(key, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // get(key, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to get method');\n }\n\n this.db.get(key, cb);\n }\n\n del(key: any, optionsOrCallback?: any, callback?: (error?: Error) => void): void {\n // Handle both del(key, callback) and del(key, options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // del(key, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // del(key, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to del method');\n }\n\n this.db.del(key, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n clear(options: any, callback: (error?: Error) => void): void {\n // Handle clear operation for deleting ranges of keys\n // This is required by dop-engine-v3's clearNamespace function\n const { gte, lte, gt, lt } = options || {};\n \n if (!gte && !gt) {\n callback(new Error('clear() requires gte or gt option'));\n return;\n }\n\n // Use iterator to find all keys in the range and delete them\n const keysToDelete: any[] = [];\n const iterator = this.db.iterator({\n gte,\n lte,\n gt,\n lt,\n keys: true,\n values: false,\n });\n\n const processNext = () => {\n iterator.next((err: any, key: any) => {\n if (err) {\n iterator.end(() => {\n callback(err);\n });\n return;\n }\n\n if (key === undefined) {\n // No more keys - now delete all collected keys\n iterator.end(() => {\n if (keysToDelete.length === 0) {\n callback();\n return;\n }\n\n // Delete keys in batch\n const operations = keysToDelete.map(k => ({ type: 'del', key: k }));\n this.db.batch(operations, (batchErr: any) => {\n if (!batchErr && this.AsyncStorage) {\n this._schedulePersistence();\n }\n callback(batchErr);\n });\n });\n return;\n }\n\n keysToDelete.push(key);\n processNext();\n });\n };\n\n processNext();\n }\n\n batch(operationsOrCallback?: any, optionsOrCallback?: any, callback?: (error?: Error) => void): any {\n // Handle multiple batch signatures:\n // batch() - returns chained batch\n // batch(operations, callback)\n // batch(operations, options, callback)\n \n if (arguments.length === 0) {\n // batch() - return chained batch (not commonly used in LevelUp)\n return this.db.batch();\n }\n\n // Handle batch operations with callback\n const operations = operationsOrCallback;\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // batch(operations, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // batch(operations, options, callback) signature \n cb = callback;\n } else {\n throw new Error('No callback provided to batch method');\n }\n\n this.db.batch(operations, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n iterator(options?: any): any {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.db.iterator(options);\n }\n\n private _schedulePersistence(): void {\n this.isDirty = true;\n \n // Clear existing timeout\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n }\n \n // Schedule persistence with longer throttling during heavy writes (every 30 seconds)\n // This dramatically improves scan performance by reducing serialization overhead\n this.persistTimeout = setTimeout(() => {\n if (this.isDirty) {\n this.isDirty = false;\n void this._persistData().catch(console.warn);\n }\n }, 30000); // Increased from 5s to 30s\n }\n\n private async _persistData(): Promise<void> {\n if (!this.AsyncStorage) return;\n\n const startTime = Date.now();\n let entryCount = 0;\n\n try {\n const data: Record<string, any> = {};\n const iterator = this.db.iterator();\n \n await new Promise<void>((resolve, reject) => {\n const processNext = () => {\n iterator.next((err: any, key: any, value: any) => {\n if (err) {\n iterator.end(() => reject(err));\n return;\n }\n \n if (key === undefined) {\n iterator.end(() => resolve());\n return;\n }\n \n entryCount += 1;\n \n // Preserve Buffer/Uint8Array types by converting to base64 with type marker\n if (Buffer.isBuffer(value)) {\n data[key.toString()] = {\n __type: 'Buffer',\n data: value.toString('base64'),\n };\n } else if (value instanceof Uint8Array) {\n data[key.toString()] = {\n __type: 'Uint8Array',\n data: Buffer.from(value).toString('base64'),\n };\n } else {\n data[key.toString()] = value;\n }\n processNext();\n });\n };\n processNext();\n });\n\n // Serialize data\n let jsonData: string;\n try {\n jsonData = JSON.stringify(data);\n } catch (stringifyError) {\n throw new Error(`Failed to stringify data: ${stringifyError instanceof Error ? stringifyError.message : String(stringifyError)}`);\n }\n \n const serializeTime = Date.now() - startTime;\n const dataSizeMB = jsonData.length / 1024 / 1024;\n \n // Clean up old chunks before writing new data\n await this._cleanupOldChunks();\n \n // React Native AsyncStorage has a 6MB per-item limit and total quota limits\n // Use 500KB chunks to stay well within limits and avoid SQLITE_FULL errors\n const chunkSize = 512 * 1024; // 500KB chunks (conservative for Android)\n \n if (jsonData.length > chunkSize) {\n // Split large data into chunks\n const chunks: string[] = [];\n for (let i = 0; i < jsonData.length; i += chunkSize) {\n chunks.push(jsonData.slice(i, i + chunkSize));\n }\n \n console.log(`💾 Writing ${chunks.length} chunks (${dataSizeMB.toFixed(2)}MB)...`);\n \n // Check if data is too large (warn if over 50MB)\n if (dataSizeMB > 50) {\n console.warn(`⚠️ Database is very large (${dataSizeMB.toFixed(2)}MB). Consider clearing old data.`);\n }\n \n // Write chunks sequentially to avoid overwhelming AsyncStorage\n // Parallel writes can cause SQLITE_FULL errors\n for (let i = 0; i < chunks.length; i += 1) {\n try {\n await this.AsyncStorage.setItem(`${this.storageKey}_chunk_${i}`, chunks[i]);\n } catch (chunkError: any) {\n // If we hit storage quota, clean up and throw\n console.error(`❌ Failed to write chunk ${i}/${chunks.length}:`, chunkError);\n if (chunkError?.message?.includes('full') || chunkError?.code === 13) {\n console.error('💥 Storage quota exceeded! Cleaning up partial writes...');\n await this._cleanupOldChunks();\n throw new Error('AsyncStorage quota exceeded. Please clear app data or restart the app.');\n }\n throw chunkError;\n }\n }\n \n // Only update chunk count after all chunks are written successfully\n await this.AsyncStorage.setItem(`${this.storageKey}_chunks`, chunks.length.toString());\n \n const totalTime = Date.now() - startTime;\n console.log(`✅ Persisted ${entryCount} entries (${dataSizeMB.toFixed(2)}MB in ${chunks.length} chunks) in ${totalTime}ms (serialize: ${serializeTime}ms)`);\n } else {\n // Small data, store directly\n await this.AsyncStorage.setItem(this.storageKey, jsonData);\n \n const totalTime = Date.now() - startTime;\n console.log(`✅ Persisted ${entryCount} entries (${(jsonData.length / 1024).toFixed(2)}KB) in ${totalTime}ms (serialize: ${serializeTime}ms)`);\n }\n } catch (error: any) {\n console.error('❌ Failed to persist data to AsyncStorage:', error);\n \n // If quota exceeded, clear everything to recover\n if (error?.message?.includes('quota') || error?.message?.includes('full')) {\n console.error('💥 Storage full! Clearing all AsyncStorage data for recovery...');\n await this._cleanupOldChunks();\n }\n \n // Mark as dirty again so we retry on next schedule\n this.isDirty = true;\n throw error;\n }\n }\n\n private async _cleanupOldChunks(): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunk metadata\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Remove old direct storage (if exists)\n await this.AsyncStorage.removeItem(this.storageKey);\n \n // Remove all chunk entries (try up to 200 chunks)\n for (let i = 0; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n try {\n await this.AsyncStorage.removeItem(chunkKey);\n } catch {\n // Ignore errors, chunk may not exist\n break;\n }\n }\n } catch (cleanupError) {\n console.warn('⚠️ Error during chunk cleanup:', cleanupError);\n // Don't throw, continue with persistence\n }\n }\n}\n\n/**\n * Initialize DOP Engine specifically for React Native environments.\n * Uses a custom LevelDB implementation that persists data to AsyncStorage.\n * This provides full database persistence while being compatible with React Native.\n * \n * @param walletSource - Name for your wallet implementation (max 16 chars, lowercase)\n * @param shouldDebug - Whether to forward Engine debug logs to Logger\n * @param artifactStore - Persistent store for downloading large artifact files\n * @param useNativeArtifacts - Whether to download native C++ artifacts (should be TRUE for mobile)\n * @param skipMerkletreeScans - Whether to skip merkletree syncs and private balance scans\n * @param verboseScanLogging - Enable verbose logging for scanning operations\n * @param databaseName - Name for the database (used as prefix in AsyncStorage)\n */\nexport const startDopEngineReactNative = async (\n walletSource: string,\n shouldDebug: boolean,\n artifactStore: ArtifactStore,\n useNativeArtifacts = true,\n skipMerkletreeScans = false,\n verboseScanLogging = false,\n databaseName = 'dop-wallet-db'\n): Promise<void> => {\n // Create React Native compatible database instance with AsyncStorage persistence\n const db = new ReactNativeLevelDB(databaseName);\n \n // Ensure database is opened before proceeding\n await new Promise<void>((resolve, reject) => {\n db.open((error?: Error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n\n // Initialize the DOP Engine with the React Native database\n return startDopEngine(\n walletSource,\n db as any, // Cast to any since TypeScript doesn't know about our custom implementation\n shouldDebug,\n artifactStore,\n useNativeArtifacts,\n skipMerkletreeScans,\n verboseScanLogging\n );\n};\n"]}
1
+ {"version":3,"file":"react-native-init.js","sourceRoot":"","sources":["../../../../src/services/dop/core/react-native-init.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/strict-boolean-expressions */\n/* eslint-disable no-underscore-dangle */\n/* eslint-disable no-console */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n/* eslint-disable global-require */\n/* eslint-disable no-void */\nimport { ArtifactStore } from '../../artifacts/artifact-store';\nimport { startDopEngine } from './init';\n\n// Use memdown for React Native database - with error handling\nlet memdown: any;\ntry {\n memdown = require('memdown');\n} catch (error) {\n throw new Error(\n 'memdown dependency is required for React Native support. ' +\n 'Please install it with: npm install memdown@^6.1.1'\n );\n}\n\n/**\n * React Native compatible LevelDB implementation using memdown with AsyncStorage persistence.\n * This provides a persistent database solution that works reliably in React Native environments.\n */\nexport class ReactNativeLevelDB {\n private db: any;\n private storageKey: string;\n private AsyncStorage: any;\n private persistTimeout: ReturnType<typeof setTimeout> | null = null;\n private isDirty = false;\n\n constructor(name: string) {\n this.storageKey = `leveldb_${name}`;\n this.db = memdown();\n \n // Dynamically import AsyncStorage to avoid bundling issues\n try {\n // Try to require AsyncStorage - this will work in React Native\n this.AsyncStorage = require('@react-native-async-storage/async-storage').default;\n } catch (error) {\n // AsyncStorage not available - this is expected in Node.js test environment\n this.AsyncStorage = null;\n }\n }\n\n // Implement AbstractLevelDOWN interface\n async open(callbackOrOptions?: any, callback?: (error?: Error) => void): Promise<void> {\n // Handle both open(callback) and open(options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof callbackOrOptions === 'function') {\n // open(callback) signature\n cb = callbackOrOptions;\n } else if (typeof callback === 'function') {\n // open(options, callback) signature\n cb = callback;\n } else {\n // No callback provided - this shouldn't happen in AbstractLevelDOWN\n throw new Error('No callback provided to open method');\n }\n\n try {\n // Load persisted data from AsyncStorage (only if available)\n if (this.AsyncStorage) {\n try {\n let persistedData: string | null = null;\n \n // Check if data is stored in chunks\n const chunksCount = await this.AsyncStorage.getItem(`${this.storageKey}_chunks`);\n \n if (chunksCount) {\n console.log(`📦 Loading database from ${String(chunksCount)} chunks...`);\n // Reassemble from chunks\n const chunks: string[] = [];\n const count = parseInt(chunksCount, 10);\n \n if (Number.isNaN(count) || count < 0 || count > 1000) {\n throw new Error(`Invalid chunk count: ${String(chunksCount)}`);\n }\n \n for (let i = 0; i < count; i += 1) {\n const chunk = await this.AsyncStorage.getItem(`${this.storageKey}_chunk_${i}`);\n if (chunk) {\n chunks.push(chunk);\n } else {\n console.warn(`⚠️ Missing chunk ${i} of ${count}, data may be incomplete`);\n }\n }\n \n if (chunks.length === 0) {\n throw new Error('No chunks found, but chunk count was set');\n }\n \n persistedData = chunks.join('');\n console.log(`📦 Reassembled ${chunks.length}/${count} chunks (${(persistedData.length / 1024 / 1024).toFixed(2)}MB)`);\n } else {\n // Try to get data directly\n persistedData = await this.AsyncStorage.getItem(this.storageKey);\n if (persistedData) {\n console.log(`📦 Loading database directly (${(persistedData.length / 1024).toFixed(2)}KB)`);\n }\n }\n \n if (persistedData) {\n // Validate JSON before parsing\n if (!persistedData.trim().startsWith('{') || !persistedData.trim().endsWith('}')) {\n throw new Error('Persisted data does not look like valid JSON (missing braces)');\n }\n \n let data: Record<string, any>;\n try {\n data = JSON.parse(persistedData);\n } catch (jsonError) {\n throw new Error(`JSON parse failed: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`);\n }\n \n // Restore data to memdown instance\n const keys = Object.keys(data);\n console.log(`📦 Restoring ${keys.length} entries to database...`);\n \n for (const [key, value] of Object.entries(data)) {\n await new Promise<void>((resolve, reject) => {\n // Restore Buffer/Uint8Array types from base64 with type marker\n let restoredValue = value;\n if (value && typeof value === 'object' && '__type' in value) {\n const typedValue = value as { __type: string; data: string };\n if (typedValue.__type === 'Buffer' && typeof typedValue.data === 'string') {\n restoredValue = Buffer.from(typedValue.data, 'base64');\n } else if (typedValue.__type === 'Uint8Array' && typeof typedValue.data === 'string') {\n restoredValue = new Uint8Array(Buffer.from(typedValue.data, 'base64'));\n }\n }\n \n this.db.put(key, restoredValue, (err: any) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n console.log('✅ Successfully restored database from AsyncStorage');\n } else {\n console.log('ℹ️ No persisted data found, starting with empty database');\n }\n } catch (asyncStorageError) {\n console.error('❌ Failed to load from AsyncStorage, clearing corrupted data and starting fresh:', asyncStorageError);\n \n // Clear corrupted data\n try {\n await this.AsyncStorage.removeItem(this.storageKey);\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Try to remove chunks (up to 100 chunks max)\n for (let i = 0; i < 100; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (exists) {\n await this.AsyncStorage.removeItem(chunkKey);\n } else {\n break; // No more chunks\n }\n }\n console.log('🧹 Cleared corrupted AsyncStorage data');\n } catch (clearError) {\n console.warn('⚠️ Failed to clear corrupted data:', clearError);\n }\n }\n }\n \n // Open the memdown database\n this.db.open(cb);\n } catch (error) {\n cb(error as Error);\n }\n }\n\n close(callback: (error?: Error) => void): void {\n // Clear pending persistence timeout\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n this.persistTimeout = null;\n }\n \n // Force immediate persistence before closing if dirty\n if (this.isDirty && this.AsyncStorage) {\n console.log('💾 Persisting database before close...');\n this.isDirty = false;\n this._persistData()\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .then(() => {\n console.log('✅ Database persisted, closing...');\n this.db.close(callback);\n })\n .catch((error) => {\n console.warn('⚠️ Failed to persist on close:', error);\n this.db.close(callback);\n });\n } else {\n this.db.close(callback);\n }\n }\n\n // Public method to force immediate persistence (useful after scan completes)\n async forcePersist(): Promise<void> {\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n this.persistTimeout = null;\n }\n if (this.isDirty && this.AsyncStorage) {\n this.isDirty = false;\n await this._persistData();\n }\n }\n\n // Public method to clear all persisted data (use when recovering from storage full errors)\n async clearPersistedData(): Promise<void> {\n console.log('🧹 Clearing all persisted database data from AsyncStorage...');\n await this._cleanupOldChunks();\n console.log('✅ Cleared all persisted data');\n }\n\n put(key: any, value: any, optionsOrCallback?: any, callback?: (error?: Error) => void): void {\n // Handle both put(key, value, callback) and put(key, value, options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // put(key, value, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // put(key, value, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to put method');\n }\n\n this.db.put(key, value, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n get(key: any, optionsOrCallback?: any, callback?: (error?: Error, value?: any) => void): void {\n // Handle both get(key, callback) and get(key, options, callback) signatures\n let cb: (error?: Error, value?: any) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // get(key, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // get(key, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to get method');\n }\n\n this.db.get(key, cb);\n }\n\n del(key: any, optionsOrCallback?: any, callback?: (error?: Error) => void): void {\n // Handle both del(key, callback) and del(key, options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // del(key, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // del(key, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to del method');\n }\n\n this.db.del(key, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n clear(options: any, callback: (error?: Error) => void): void {\n // Handle clear operation for deleting ranges of keys\n // This is required by dop-engine-v3's clearNamespace function\n const { gte, lte, gt, lt } = options || {};\n \n if (!gte && !gt) {\n callback(new Error('clear() requires gte or gt option'));\n return;\n }\n\n // Use iterator to find all keys in the range and delete them\n const keysToDelete: any[] = [];\n const iterator = this.db.iterator({\n gte,\n lte,\n gt,\n lt,\n keys: true,\n values: false,\n });\n\n const processNext = () => {\n iterator.next((err: any, key: any) => {\n if (err) {\n iterator.end(() => {\n callback(err);\n });\n return;\n }\n\n if (key === undefined) {\n // No more keys - now delete all collected keys\n iterator.end(() => {\n if (keysToDelete.length === 0) {\n callback();\n return;\n }\n\n // Delete keys in batch\n const operations = keysToDelete.map(k => ({ type: 'del', key: k }));\n this.db.batch(operations, (batchErr: any) => {\n if (!batchErr && this.AsyncStorage) {\n this._schedulePersistence();\n }\n callback(batchErr);\n });\n });\n return;\n }\n\n keysToDelete.push(key);\n processNext();\n });\n };\n\n processNext();\n }\n\n batch(operationsOrCallback?: any, optionsOrCallback?: any, callback?: (error?: Error) => void): any {\n // Handle multiple batch signatures:\n // batch() - returns chained batch\n // batch(operations, callback)\n // batch(operations, options, callback)\n \n if (arguments.length === 0) {\n // batch() - return chained batch (not commonly used in LevelUp)\n return this.db.batch();\n }\n\n // Handle batch operations with callback\n const operations = operationsOrCallback;\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // batch(operations, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // batch(operations, options, callback) signature \n cb = callback;\n } else {\n throw new Error('No callback provided to batch method');\n }\n\n this.db.batch(operations, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n iterator(options?: any): any {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.db.iterator(options);\n }\n\n private _schedulePersistence(): void {\n this.isDirty = true;\n \n // Clear existing timeout\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n }\n \n // Schedule persistence with longer throttling during heavy writes (every 30 seconds)\n // This dramatically improves scan performance by reducing serialization overhead\n this.persistTimeout = setTimeout(() => {\n if (this.isDirty) {\n this.isDirty = false;\n void this._persistData().catch((error) => {\n console.error('⚠️ Scheduled persistence failed:', error?.message || error);\n // Don't log full stack trace to avoid cluttering console\n });\n }\n }, 30000); // Increased from 5s to 30s\n }\n\n private async _persistData(): Promise<void> {\n if (!this.AsyncStorage) return;\n\n const startTime = Date.now();\n let entryCount = 0;\n\n try {\n const data: Record<string, any> = {};\n const iterator = this.db.iterator();\n \n await new Promise<void>((resolve, reject) => {\n const processNext = () => {\n iterator.next((err: any, key: any, value: any) => {\n if (err) {\n iterator.end(() => reject(err));\n return;\n }\n \n if (key === undefined) {\n iterator.end(() => resolve());\n return;\n }\n \n entryCount += 1;\n \n // Preserve Buffer/Uint8Array types by converting to base64 with type marker\n if (Buffer.isBuffer(value)) {\n data[key.toString()] = {\n __type: 'Buffer',\n data: value.toString('base64'),\n };\n } else if (value instanceof Uint8Array) {\n data[key.toString()] = {\n __type: 'Uint8Array',\n data: Buffer.from(value).toString('base64'),\n };\n } else {\n data[key.toString()] = value;\n }\n processNext();\n });\n };\n processNext();\n });\n\n // Serialize data\n let jsonData: string;\n try {\n jsonData = JSON.stringify(data);\n } catch (stringifyError) {\n throw new Error(`Failed to stringify data: ${stringifyError instanceof Error ? stringifyError.message : String(stringifyError)}`);\n }\n \n const serializeTime = Date.now() - startTime;\n const dataSizeMB = jsonData.length / 1024 / 1024;\n \n // React Native AsyncStorage has a 6MB per-item limit and total quota limits\n // Use 500KB chunks to stay well within limits and avoid SQLITE_FULL errors\n const chunkSize = 512 * 1024; // 500KB chunks (conservative for Android)\n \n if (jsonData.length > chunkSize) {\n // Split large data into chunks\n const chunks: string[] = [];\n for (let i = 0; i < jsonData.length; i += chunkSize) {\n chunks.push(jsonData.slice(i, i + chunkSize));\n }\n \n console.log(`💾 Writing ${chunks.length} chunks (${dataSizeMB.toFixed(2)}MB)...`);\n \n // Check if data is too large (warn if over 50MB)\n if (dataSizeMB > 50) {\n console.warn(`⚠️ Database is very large (${dataSizeMB.toFixed(2)}MB). Consider clearing old data.`);\n }\n \n // Write chunks sequentially to avoid overwhelming AsyncStorage\n // Parallel writes can cause SQLITE_FULL errors\n for (let i = 0; i < chunks.length; i += 1) {\n try {\n await this.AsyncStorage.setItem(`${this.storageKey}_chunk_${i}`, chunks[i]);\n } catch (chunkError: any) {\n // If we hit storage quota, clean up partial writes and throw\n console.error(`❌ Failed to write chunk ${i}/${chunks.length}:`, chunkError);\n if (chunkError?.message?.includes('full') || chunkError?.code === 13) {\n console.error('💥 Storage quota exceeded! Cleaning up partial writes...');\n // Only clean up the chunks we just tried to write\n for (let j = 0; j <= i; j += 1) {\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunk_${j}`).catch(() => {});\n }\n throw new Error('AsyncStorage quota exceeded. Please clear app data or restart the app.');\n }\n throw chunkError;\n }\n }\n \n // Clean up any extra chunks from previous saves (if we had more chunks before)\n await this._cleanupExtraChunks(chunks.length);\n \n // Only update chunk count after all chunks are written successfully\n await this.AsyncStorage.setItem(`${this.storageKey}_chunks`, chunks.length.toString());\n \n // Remove direct storage if it exists (migrating from direct to chunked)\n await this.AsyncStorage.removeItem(this.storageKey).catch(() => {});\n \n const totalTime = Date.now() - startTime;\n console.log(`✅ Persisted ${entryCount} entries (${dataSizeMB.toFixed(2)}MB in ${chunks.length} chunks) in ${totalTime}ms (serialize: ${serializeTime}ms)`);\n } else {\n // Small data, store directly\n await this.AsyncStorage.setItem(this.storageKey, jsonData);\n \n // Clean up chunked storage if it exists (migrating from chunked to direct)\n await this._cleanupAllChunks();\n \n const totalTime = Date.now() - startTime;\n console.log(`✅ Persisted ${entryCount} entries (${(jsonData.length / 1024).toFixed(2)}KB) in ${totalTime}ms (serialize: ${serializeTime}ms)`);\n }\n } catch (error: any) {\n console.error('❌ Failed to persist data to AsyncStorage:', error);\n console.error('Error details:', {\n message: error?.message,\n code: error?.code,\n stack: error?.stack?.split('\\n')[0]\n });\n \n // If quota exceeded, clear everything to recover\n if (error?.message?.includes('quota') || error?.message?.includes('full')) {\n console.error('💥 Storage full! Clearing all AsyncStorage data for recovery...');\n await this._cleanupAllChunks();\n }\n \n // Don't mark as dirty - if persistence fails, we don't want to retry infinitely\n // The data is still in memory (memdown) so the app can continue working\n // this.isDirty = true;\n \n // Don't throw - this allows the app to continue even if persistence fails\n // throw error;\n }\n }\n\n private async _cleanupExtraChunks(keepChunkCount: number): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunks beyond the new count (cleanup old data)\n for (let i = keepChunkCount; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (!exists) {\n break; // No more chunks to clean\n }\n await this.AsyncStorage.removeItem(chunkKey);\n }\n } catch (cleanupError) {\n console.warn('⚠️ Error during extra chunk cleanup:', cleanupError);\n }\n }\n\n private async _cleanupAllChunks(): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunk metadata\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Remove all chunk entries (try up to 200 chunks)\n for (let i = 0; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (!exists) {\n break; // No more chunks to clean\n }\n await this.AsyncStorage.removeItem(chunkKey);\n }\n } catch (cleanupError) {\n console.warn('⚠️ Error during chunk cleanup:', cleanupError);\n }\n }\n\n // Keep old method for clearing persisted data (full cleanup)\n private async _cleanupOldChunks(): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunk metadata\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Remove old direct storage (if exists)\n await this.AsyncStorage.removeItem(this.storageKey);\n \n // Remove all chunk entries (try up to 200 chunks)\n for (let i = 0; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n await this.AsyncStorage.removeItem(chunkKey).catch(() => {});\n }\n } catch (cleanupError) {\n console.warn('⚠️ Error during full cleanup:', cleanupError);\n }\n }\n}\n\n/**\n * Initialize DOP Engine specifically for React Native environments.\n * Uses a custom LevelDB implementation that persists data to AsyncStorage.\n * This provides full database persistence while being compatible with React Native.\n * \n * @param walletSource - Name for your wallet implementation (max 16 chars, lowercase)\n * @param shouldDebug - Whether to forward Engine debug logs to Logger\n * @param artifactStore - Persistent store for downloading large artifact files\n * @param useNativeArtifacts - Whether to download native C++ artifacts (should be TRUE for mobile)\n * @param skipMerkletreeScans - Whether to skip merkletree syncs and private balance scans\n * @param verboseScanLogging - Enable verbose logging for scanning operations\n * @param databaseName - Name for the database (used as prefix in AsyncStorage)\n */\nexport const startDopEngineReactNative = async (\n walletSource: string,\n shouldDebug: boolean,\n artifactStore: ArtifactStore,\n useNativeArtifacts = true,\n skipMerkletreeScans = false,\n verboseScanLogging = false,\n databaseName = 'dop-wallet-db'\n): Promise<void> => {\n // Create React Native compatible database instance with AsyncStorage persistence\n const db = new ReactNativeLevelDB(databaseName);\n \n // Ensure database is opened before proceeding\n await new Promise<void>((resolve, reject) => {\n db.open((error?: Error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n\n // Initialize the DOP Engine with the React Native database\n return startDopEngine(\n walletSource,\n db as any, // Cast to any since TypeScript doesn't know about our custom implementation\n shouldDebug,\n artifactStore,\n useNativeArtifacts,\n skipMerkletreeScans,\n verboseScanLogging\n );\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dop-wallet-v6",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "DOP Wallet SDK, compatible with mobile, browser and nodejs environments.",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",