OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-wallet-lib / secure-storage.cjs

71 lines · javascript ref:
// lib/secure-storage.cjs - File-based Mnemonic Storage (Bare Runtime)
//
// NOTE: This is a simplified version for Bare runtime.
// Uses file-based storage instead of OS keychain.
// In production, consider using encrypted storage.

const fs = require('fs')
const path = require('path')
const os = require('os')

const STORAGE_DIR = path.join(os.homedir(), '.hyper-wallet')
const MNEMONIC_FILE = path.join(STORAGE_DIR, '.mnemonic')

/**
 * Ensure storage directory exists
 */
function ensureStorageDir() {
  if (!fs.existsSync(STORAGE_DIR)) {
    fs.mkdirSync(STORAGE_DIR, { recursive: true, mode: 0o700 })
  }
}

/**
 * Store mnemonic in file
 * @param {String} mnemonic - BIP39 mnemonic phrase
 */
async function storeMnemonic(mnemonic) {
  ensureStorageDir()
  fs.writeFileSync(MNEMONIC_FILE, mnemonic, { mode: 0o600 })
}

/**
 * Retrieve mnemonic from file
 * @returns {String|null} - Mnemonic or null if not found
 */
async function loadMnemonic() {
  try {
    if (!fs.existsSync(MNEMONIC_FILE)) {
      return null
    }
    return fs.readFileSync(MNEMONIC_FILE, 'utf8').trim()
  } catch (err) {
    return null
  }
}

/**
 * Delete mnemonic file
 */
async function deleteMnemonic() {
  if (fs.existsSync(MNEMONIC_FILE)) {
    fs.unlinkSync(MNEMONIC_FILE)
  }
}

/**
 * Check if wallet is initialized (mnemonic file exists)
 * @returns {Boolean}
 */
async function isInitialized() {
  const mnemonic = await loadMnemonic()
  return mnemonic !== null
}

module.exports = {
  storeMnemonic,
  loadMnemonic,
  deleteMnemonic,
  isInitialized
}